找回密码
 点一下
楼主: ESPER_PALE

自制Loader 1枚, Star Launcher 更新至0.41 附源码

[复制链接]
发表于 2010-3-8 15:03:53 | 显示全部楼层
引用第38楼ESPER_PALE于2010-03-08 14:00发表的 :


sc2启动时传参数用的共享内存里, 地图文件名不是unicode, 因为英文字符占单字节, 应该是utf-8


嗯,看过你的代码了,实现选队的方法的确很邪恶。
直接修改地图文件的确是最简单的方法,不过我会考虑选择代码注入这种比较“绿色”的方式。
回复

使用道具 举报

发表于 2010-3-8 17:09:01 | 显示全部楼层
这个用PlayerGetAlliance来改Script是吧,虽然是个办法,但还是像老外说的,不太friendly.
不管怎么说,还是要感谢下EP大大.
回复

使用道具 举报

发表于 2010-3-8 18:26:11 | 显示全部楼层
LZ 无比强大啊膜拜中,期望出多功能整合版,加强功能,谢谢
回复

使用道具 举报

发表于 2010-3-8 19:33:55 | 显示全部楼层
十分强大,特来膜拜~~~
回复

使用道具 举报

发表于 2010-3-8 21:28:17 | 显示全部楼层
研究了一下 PlayerGetAlliance 的第二个参数,从0到10分别设置一次(2除外),就能解决点盟友是红色指针、以及战斗结束后不判定胜利的问题。
如果设置了 e_allianceIdControl,虽然你可以控制盟友的部队了,但是 AI 之间就会争控制权。
所以除非只有我方或敌方只有一家 AI,否则不要设置 e_allianceIdControl。


以 1+2 结盟,3+4 结盟为例:
  1. ...
  2. void SetAlliance(int player, int target){
  3.     PlayerGetAlliance(player,0,target);
  4.     PlayerGetAlliance(player,1,target);
  5.     PlayerGetAlliance(player,3,target);
  6.     PlayerGetAlliance(player,4,target);
  7.     PlayerGetAlliance(player,5,target);
  8.     PlayerGetAlliance(player,6,target);
  9.     PlayerGetAlliance(player,7,target);
  10.     PlayerGetAlliance(player,8,target);
  11.     PlayerGetAlliance(player,9,target);
  12.     PlayerGetAlliance(player,10,target);
  13. }
  14. bool gt_MeleeInitialization_Func (bool testConds, bool runActions) {
  15.     if (runActions) {
  16.         SetAlliance(1,2);
  17.         SetAlliance(2,1);
  18.         SetAlliance(3,4);
  19.         SetAlliance(4,3);
  20.         MeleeInitResources();
  21.         MeleeInitUnits();
  22.         MeleeInitAI();
  23.         MeleeInitOptions();
  24.     }
  25.     return true;
  26. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2010-3-8 21:33:33 | 显示全部楼层
你试试不设置10, 行不行?
因为这个type应该只到9, 无论从SC2.exe里的代码, 还是Game.galaxy的声明
const int c_allianceIdPassive = 0;
const int c_allianceIdVision = 1;
const int c_allianceIdControl = 2;
const int c_allianceIdSpend = 3;
const int c_allianceIdTrade = 4;
const int c_allianceIdSeekHelp = 5;
const int c_allianceIdGiveHelp = 6;
const int c_allianceIdChat = 7;
const int c_allianceIdDefeat = 8;
const int c_allianceIdPushable = 9;
回复

使用道具 举报

 楼主| 发表于 2010-3-8 21:56:45 | 显示全部楼层
明白了, 10才是关键, 怪不得我昨天没试出来
回复

使用道具 举报

发表于 2010-3-8 21:59:46 | 显示全部楼层

回 45楼(ESPER_PALE) 的帖子

.text:008FB56B C7 45 FC 0A 00 00 00                                            mov     [ebp+var_4], 0Ah
.text:008FB572 C7 45 EC 60 14 40 01                                            mov     [ebp+var_14], offset s_Count ; "Count"
.text:008FB579 89 5D F0                                                        mov     [ebp+var_10], ebx
.text:008FB57C C7 45 F4 2C 02 41 01                                            mov     [ebp+var_C], offset s_E_allianceidcount ; "e_allianceIdCount"
.text:008FB583 C7 45 F8 3D 02 41 01                                            mov     [ebp+var_8], (offset s_E_allianceidcount+11h)
.text:008FB58A E8 B1 F3 1F 00                                                  call    sub_AFA940

看来 e_allianceIdCount  =  10。测试结果是:少了10,指向队友就是红色指针。
回复

使用道具 举报

 楼主| 发表于 2010-3-8 22:04:06 | 显示全部楼层
恩, 昨天看了原始的PlayerGetAlliance代码, 里面判断了第二个参数<=9
但是10确实有效果
回复

使用道具 举报

发表于 2010-3-8 22:04:58 | 显示全部楼层
SC2.exe里第10个allianceId叫"allianceIdUnknown"。

blz这个命名法也挺神奇的。自己做的游戏自己Unkown。
回复

使用道具 举报

发表于 2010-3-8 22:15:14 | 显示全部楼层

回 49楼(麦德三世) 的帖子

e_allianceIdUnknown = -1

一般来说枚举都要有一个默认值/非法值,而 e_allianceId* 是从 0 (e_allianceIdPassive) 开始的,所以 -1 就是默认值了。
估计 e_allianceIdPassive=0 是为了方便索引和位移操作的时候不用 -1 了。
另外,脚本中的 Player 是从 1 开始算的,而到了程序中会自动 -1,有效值是 0-15。

AllianceData[AllianceId][PlayerIndex] |= (1 << TargetPlayerIndex);
回复

使用道具 举报

发表于 2010-3-8 22:21:37 | 显示全部楼层
说真的我真没想到PlayerGetAlliance是拿来做这个……
这个函数的命名方式明显和其他函数不一样嘛?按常理来说不是应该是set么。
回复

使用道具 举报

发表于 2010-3-8 22:28:40 | 显示全部楼层
话说回来,我还没试过这个函数。也还没看那Loader的源码。

难道说其实是在内存中修改这个函数,将Get变成set么?
回复

使用道具 举报

发表于 2010-3-8 22:31:30 | 显示全部楼层

回 51楼(麦德三世) 的帖子

因为 native 函数没有提供 PlayerSetAlliance,所以楼主就邪恶地把 Get 变成 Set 了 =_=
不过我觉得用利用完以后应该复原的:
SetAlliance(1,2);
SetAlliance(2,1);
SetAlliance(3,4);
SetAlliance(4,3);
PlayerGetAlliance(0,0,0);

最后加的这一行 player=0,用于把 PlayerGetAlliance 复原。
需要提前 VirtualProtect 使 0AAA5FA 这个地址可写。
当然硬编码的地址也需要重定位的。
  1. BYTE PlayerSetAllianceCode[] = {
  2.     0x55,                                            // 00401310      push    ebp
  3.     0x8B, 0xEC,                                        // 00401311      mov     ebp, esp
  4.     0x56,                                            // 00401313      push    esi
  5.     0x85, 0xC9,                                        // 00401314      test    ecx, ecx
  6.     0x75, 0x0B,                                        // 00401316      jnz     short 00401323
  7.     0xB8, 0xFA, 0xA5, 0xAA, 0x00,                    // 00401318      mov     eax, 0AAA5FA
  8.     0xC7, 0x00, 0x40, 0xE7, 0xD6, 0x00,                // 0040131D      mov     dword ptr [eax], 0D6E740
  9.     0xC1, 0xE2, 0x04,                                // 00401323      shl     edx, 4
  10.     0x03, 0xD1,                                        // 00401326      add     edx, ecx
  11.     0x33, 0xF6,                                        // 00401328      xor     esi, esi
  12.     0x46,                                            // 0040132A      inc     esi
  13.     0x8A, 0x4D, 0x08,                                // 0040132B      mov     cl, byte ptr [ebp+8]
  14.     0xD3, 0xE6,                                        // 0040132E      shl     esi, cl
  15.     0x8D, 0x04, 0x95, 0xA0, 0xE8, 0xA9, 0x01,        // 00401330      lea     eax, dword ptr [edx*4+1A9E8A0]
  16.     0x09, 0x30,                                        // 00401337      or      dword ptr [eax], esi
  17.     0x5E,                                            // 00401339      pop     esi
  18.     0x5D,                                            // 0040133A      pop     ebp
  19.     0xC2, 0x04, 0x00,                                // 0040133B      retn    4
  20. };
复制代码
回复

使用道具 举报

发表于 2010-3-8 23:05:47 | 显示全部楼层

回 53楼(et2010) 的帖子

回复et2010大大,解决战斗结束后不判定胜利的方法很简单
在MapScript.galaxy里面这样就可以了:
bool gt_MeleeInitialization_Func (bool testConds, bool runActions) {
    // Actions
    if (runActions) {
        MeleeInitResources();
        MeleeInitUnits();
        MeleeInitAI();
        //MeleeInitOptions();      这样就取消胜利提示了;
    }

    return true;
}
回复

使用道具 举报

发表于 2010-3-9 00:02:51 | 显示全部楼层
膜拜。。
回复

使用道具 举报

发表于 2010-3-9 01:06:59 | 显示全部楼层
请问作者,我从0.1试到0.41,一直很想用这个工具,但是选择地图后,点StartGame后都是这个提示,请问到底是哪里出问题了呢。

用lazylaunch系列,甚至星际大脚都能正常启动游戏。。。。

win7.32位系统,未装杀毒,防火墙。。。
swenti.jpg
回复

使用道具 举报

发表于 2010-3-9 02:59:28 | 显示全部楼层
StarCrack小组的人希望你能和他们合作。这贴9楼:
http://darkblizz.org/Forum2/sc2- ... r-v0-3-source-code/
刚才他们在IRC上也说来着。不过Blackcode又说想和他们合作的人很多,这周他只有欧洲时间晚上18:00以后又空。。。也就是中国半夜1:00。
StarCrack小组的人说是他们发现的选族和颜色。这个谁发现的,或者各自发现的,我就不管了。我就是来传话的。
回复

使用道具 举报

 楼主| 发表于 2010-3-9 09:43:54 | 显示全部楼层
引用第57楼洪恩er于2010-03-09 02:59发表的  :
StarCrack小组的人希望你能和他们合作。这贴9楼:
http://darkblizz.org/Forum2/sc2- ... r-v0-3-source-code/
刚才他们在IRC上也说来着。不过Blackcode又说想和他们合作的人很多,这周他只有欧洲时间晚上18:00以后又空。。。也就是中国半夜1:00。
StarCrack小组的人说是他们发现的选族和颜色。这个谁发现的,或者各自发现的,我就不管了。我就是来传话的。

完全没时间, 也不准备搞了, 现在的starlauncher能工作, 在et2010的帮助下也没有明显功能bug了, 我的任务已经完成了

反正是个临时的东西
回复

使用道具 举报

 楼主| 发表于 2010-3-9 09:50:33 | 显示全部楼层
引用第56楼starlauncher于2010-03-09 01:06发表的  :
请问作者,我从0.1试到0.41,一直很想用这个工具,但是选择地图后,点StartGame后都是这个提示,请问到底是哪里出问题了呢。

用lazylaunch系列,甚至星际大脚都能正常启动游戏。。。。

win7.32位系统,未装杀毒,防火墙。。。

没用过xp以上的系统, v0.1都这样吗? 实在很诡异-_-
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-9-28 23:21 , Processed in 0.064390 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表