admin 发表于 2020-10-2 00:58:48

自动捡钱的源码

转载:https://tieba.baidu.com/p/6664705435


D2Vars.h:




//移动函数地址列表
#define MOVE_MAX_SIZE0x00000050




全局变量:
VAR(D2CharMoveTableStrc, MoveTbl)


D2Ptrs.h:




所用到的所有函数地址:




#define D2GAME_PickUpGold(pGame, pPlayer, pItem)D2GAME_PickUpGold_Stub(pGame, pPlayer, pItem)




ASMPTR(D2GAME, PickUpGold_I, 0xD6C80)




FUNCPTR(D2GAME, CharMove, BOOL, __fastcall, (Game* pGame, UnitAny* pPlayer, int, int), 0x79B90)




FUNCPTR(D2COMMON, GetRoomFromUnit, DRLGRoom*, __stdcall, (UnitAny * ptUnit), 0x2FE10)
FUNCPTR(D2COMMON, GetLevelNoFromRoom, BOOL, __stdcall, (DRLGRoom* pRoom), 0x3C000)
FUNCPTR(D2COMMON, IsTownByLevelNo, BOOL, __stdcall, (DWORD dwLevelNo), 0x3B230)
FUNCPTR(D2COMMON, GetUnitState, int, __stdcall, (UnitAny *pUnit, DWORD dwStateNo), 0x33CD0)
FUNCPTR(D2COMMON, GetUnitStat, long, __stdcall, (UnitAny* pUnit, DWORD dwStat, DWORD nLayer), 0x38B70)
FUNCPTR(D2COMMON, GetBeltGoldLimit, unsigned int, __stdcall, (UnitAny* pUnit), 0x31940)
FUNCPTR(D2COMMON, GetItemText, ItemTxt *, __stdcall, (DWORD dwItemNo), 0x719A0)
FUNCPTR(D2COMMON, GetDistance, int, __stdcall, (int pPlayerCoordsnX, int pPlayerCoordsnY, int pItemCoordsnX, int pItemCoordsnY), 0xD180)




FUNCPTR(D2CLIENT, PrintPartyString, void, __stdcall, (wchar_t *wMessage, int nColor), 0x7D610)


D2Structs.h:




typedef int(__fastcall *D2CharMove_t)(Game*, UnitAny*, int , int);




struct D2CharMoveTableStrc
{
D2CharMove_t GameFunc;
};




D2Stubs.h:




void __fastcall D2GAME_PickUpGold_Stub(Game* pGame, UnitAny* pPlayer, UnitAny* pItem);


D2Stubs.cpp:




__declspec (naked) void __fastcall D2GAME_PickUpGold_Stub(Game *pGame, UnitAny* pPlayer, UnitAny* pItem)
{
__asm
{
push esi
push
push ecx
mov esi,edx
call D2GAME_PickUpGold_I
pop esi
retn 0x04
}
}




PickUpGold.h:




BOOL __fastcall Move_Init();




BOOL __fastcall MovEax1(Game* pGame, UnitAny* pPlayer, int uknown1, int uknown2);




BOOL __fastcall CheckIfMove(Game* pGame, UnitAny* pPlayer, int uknown1, int uknown2);




void __fastcall GOLDPICKUP_PickupInRangeGold(Game* pGame, UnitAny* pPlayer);






PickUpGold.cpp:




#define REVERSE16( w ) ( ( (w & 0xFF00) >> 8 ) | ( (w & 0x00FF) << 8 ) )
#define REVERSE32( dw ) ( ( (dw & 0xFF000000) >> 24 ) | ( (dw & 0x00FF0000) >> 8 ) | ( (dw & 0x0000FF00) << 8 ) | ( (dw & 0x000000FF) << 24 ) )
#define CODE32( sz ) REVERSE32( ( ( const unsigned long )( sz ) ) )
#define CODE16( sz ) REVERSE16( ( ( const unsigned short)( sz ) ) )




LPCWSTR stringToLPCWSTR(std::string orig)
{
size_t origsize = orig.length() + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t *wcstring = (wchar_t *) malloc(sizeof(wchar_t) *(orig.length() - 1));
mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);
return wcstring;
}




BOOL __fastcall Move_Init()
{
std::copy(D2GAME_MoveTable, D2GAME_MoveTable + 19, MoveTbl);




MoveTbl.GameFunc = &CheckIfMove;
MoveTbl.GameFunc = &CheckIfMove;
MoveTbl.GameFunc = &CheckIfMove;
MoveTbl.GameFunc = &CheckIfMove;




MoveTbl.GameFunc = &MovEax1;
MoveTbl.GameFunc = &MovEax1;
MoveTbl.GameFunc = &MovEax1;
MoveTbl.GameFunc = &MovEax1;
MoveTbl.GameFunc = &MovEax1;
MoveTbl.GameFunc = &MovEax1;




return TRUE;
}




BOOL __fastcall CheckIfMove(Game* pGame, UnitAny* pPlayer, int uknown1, int uknown2)
{




if (!pGame || !pPlayer)
return FALSE;




BOOL AlreadyMove = D2GAME_CharMove(pGame, pPlayer, uknown1, uknown2);
BOOL Move = AlreadyMove;




if (!AlreadyMove)
Move = FALSE;




GOLDPICKUP_PickupInRangeGold(pGame, pPlayer);




return Move;




}




BOOL __fastcall MovEax1(Game* pGame, UnitAny* pPlayer, int uknown1, int uknown2)
{
return TRUE;
}




void __fastcall GOLDPICKUP_PickupInRangeGold(Game* pGame, UnitAny* pPlayer)
{




if (!pGame || !pPlayer || pPlayer->dwType != UNIT_PLAYER)
return;




DRLGRoom* pRoom = D2COMMON_GetRoomFromUnit(pPlayer);
if (!pRoom) return;




int alvl = D2COMMON_GetLevelNoFromRoom(pRoom);
BOOL isTown = D2COMMON_IsTownByLevelNo(alvl);
if (isTown)
return;




if (pPlayer->CurrentAnim == PLAYER_MODE_DEATH)
return;




if (D2COMMON_GetUnitState(pPlayer, STATE_UNINTERRUPTABLE))
return;




for (UnitAny* pUnit = pRoom->pUnitFirst; pUnit; pUnit = pUnit->pListNext)
{
int INVENTORY_GOLD = D2COMMON_GetUnitStat(pPlayer, STATS_GOLD, NULL);
int QUANTITY_GOLD = D2COMMON_GetUnitStat(pUnit, STATS_GOLD, NULL);
int GOLD_LIMIT = D2COMMON_GetBeltGoldLimit(pPlayer);




if (pUnit->dwType != UNIT_ITEM)
continue;




ItemTxt* pItemRecord = D2COMMON_GetItemText(pUnit->dwTxtFileNo);
if (!pItemRecord) continue;




if (pItemRecord->dwCode != CODE32('gld '))
continue;




DRLGCoord pItemCoords = {};
DRLGCoord pPlayerCoords = {};




if (D2COMMON_GetDistance(pPlayerCoords.nX, pPlayerCoords.nY, pItemCoords.nX, pItemCoords.nY) > 12)
continue;




if ((INVENTORY_GOLD + QUANTITY_GOLD) <= GOLD_LIMIT)
{
D2GAME_PickUpGold(pGame, pPlayer, pUnit);


wchar_t sMsg;
wsprintfW(sMsg, stringToLPCWSTR("PickUp %dGold"), D2COMMON_GetUnitStat(pPlayer, STATS_GOLD, 0) - INVENTORY_GOLD);
D2CLIENT_PrintPartyString(sMsg, GREEN);




}




if ((INVENTORY_GOLD + QUANTITY_GOLD) > GOLD_LIMIT)
{
wchar_t sMsg;
wsprintfW(sMsg, stringToLPCWSTR("Gold Limit!"));
D2CLIENT_PrintPartyString(sMsg, GREEN);
}
}
}






D2Patch.h:




Patch内容:




//金币Patch位置:D2Game
{D2DLL_D2GAME, 0x79A28, (DWORD)MoveTbl, FALSE, 0x00},
{D2DLL_D2GAME, 0x79A43, (DWORD)MoveTbl, FALSE, 0x00},


页: [1]
查看完整版本: 自动捡钱的源码