1、仔细翻了下d2hackmap的代码,发现怪物是否死亡其实是有标志位的:
BYTE __fastcall MissileBlobCol(UnitAny *pMissile){
if ( tAutomapMissiles.isOn && !(pMissile->dwFlags1&0x00010000)) {//非死亡的
...
注释上写得很清楚,非死亡的,UnitAny结构中dwFlags1的偏移是0xC4
那么改下IsNpcLive中关于NPC的判断
else if(NpcType==1)
{
//type==1,npc,怪0x14]+0x2c就是名字ansi
return !(*(ULONG *)(Addr+0xC4) & 0x00010000);//死了就非0,没死就0,取反对应函数名
}
2、关于当前玩家的地址,游戏都会有个当前玩家,结构上和其它玩家是一致的,但为了便于操作,会有个基址专门存放当前玩家的地址。
直接用NPC遍历找到所有NPC和玩家的地址,然后用CE找当前玩家的地址,看保存在哪个基址中就OK了。
3、关于发包,发包函数也在d2hackmap中找吧(感觉d2hackmap是个大宝库啊):
void __fastcall AutoBackToTown(BYTE *aPacket)
{
if( aPacket[0]==0x60 && aPacket[1] == 0x00 ) //00限定只能走通向城里的传送门
{
if ( fBackToTown && tNoBackToTown.isOn == 0 ){
fBackToTown = FALSE;
BYTE castMove[9] = {0x13};
*(DWORD*)&castMove[1] = 2;
*(DWORD*)&castMove[5] = *(DWORD*)&aPacket[3]; // portal ID
D2SendPacket(sizeof(castMove), 0, castMove);
}
if( nTownportalAlertNums!= (DWORD)-1 ){
DWORD srollcount = CalSrollOfTownportal();
if ( srollcount<= nTownportalAlertNums ){
wchar_t temp[512];
wsprintfW(temp, L"<Hackmap>: Warning !! Only %d Townportals Left ", srollcount);
D2ShowGameMessage(temp, 8);
}
}
}
}
自动回城的处理中有D2SendPacket,发包的包头是0x13,直接在d2hackmap模块中搜索常量0x13,把汇编和源代码对比下就很容易找到发包函数了。