本次我们对存放仓库进行c++代码的实现,我们将这几个函数都封装在宝宝列表结构体中,具体代码如下:
#define nSizePackBack 36
typedef struct TBACKPACK_LIST
{
TBACK_PACK_OBJ mtGoodList[nSizePackBack];
TBACKPACK_LIST* GetData();
int UseGoodsForIndex(DWORD Index);
int GetGoodsIndexForName(char* szpGoodsName);
BOOL UseGoodsForName(char* szpGoodsName);
void DbgPrint();
DWORD SelGoods(DWORD ndIndex); //选中背包中的某一格中的物品
BOOL MoveGoodsToDepot(DWORD ndIndex = 1);//移动选中物品到仓库中的某一格
BOOL MoveGoodsToDepot(char* szpName);//移动选中物品到仓库中的某一格
}_TBACKPACK_LIST;
BOOL TBACKPACK_LIST::MoveGoodsToDepot(DWORD ndIndex)//移动选中物品到仓库中的某一格
{
DWORD ndObj = NULL;
__try{
ndObj = SelGoods(ndIndex);
if (ndObj != NULL){
__asm{
mov edi, Base_DepotList
mov edi, [edi]
MOV ECX, DWORD PTR DS : [EDI + 0x1608]
MOV EDX, DWORD PTR DS : [EDI + 0x1BD0]
mov eax , ndIndex
push eax
push ecx
push edx
mov ecx, edi
mov eax, Base_MoveGoodsToDepotsCall
CALL eax
}
}
}
__except (1){
DbgPrintf_Mine("BOOL TBACKPACK_LIST::MoveGoodsToDepot(DWORD ndIndex)出现异常");
return FALSE;
}
return TRUE;
}
BOOL TBACKPACK_LIST::MoveGoodsToDepot(char* szpName)//移动选中物品到仓库中的某一格
{
GetData();
DWORD ndNum = NULL;
for (int i = 0; i < nSizePackBack; i++){
if (mtGoodList[i].ndGoodNum == 0){
continue;
}
if (strcmp(szpName, mtGoodList[i].szpGoodName) == 0){
MoveGoodsToDepot(i);
}
}
return TRUE;
}
DWORD TBACKPACK_LIST::SelGoods(DWORD ndIndex) //选中背包中的某一格中的物品
{
DWORD ndObj = NULL;
__try{
__asm{
mov ebx, ndIndex
mov edi, Base_BackPacketList
mov edi, [edi]
MOV EAX, DWORD PTR DS : [EDI + 0x410 + ebx * 4]
mov ebx, Base_SelGoodSkill
MOV ECX, DWORD PTR DS : [ebx] //存仓库用到的ecx
MOV DWORD PTR DS : [ECX + 0x228], EAX
MOV EDX, DWORD PTR DS : [ebx]
MOV BYTE PTR DS : [EDX + 0x230], 1
MOV EAX, DWORD PTR DS : [ebx]
MOV ECX, DWORD PTR DS : [EAX + 0x228]
MOV DX, WORD PTR DS : [EDI + 0x1608]
MOV WORD PTR DS : [ECX + 0x1F2], DX
MOV ESI, DWORD PTR DS : [ebx]
MOV ECX, DWORD PTR DS : [ESI + 0x228]
MOV EAX, DWORD PTR DS : [ECX + 0x50]
MOV EDX, DWORD PTR DS : [ECX + 0x4C]
}
}
__except (1){
DbgPrintf_Mine("BOOL TBACKPACK_LIST::SelGoods(DWORD ndIndex) 出现异常");
return FALSE;
}
return TRUE;
}
其中有一些需要注意的地方:
1.
mov edi, Base_BackPacketList
mov edi, [edi]
</pre><pre name="code" class="cpp">这样的地址 需要分成2步来传,如果一次来传,其中的基址无法解析
</pre><pre name="code" class="cpp">2.
就是需要判断背包中物品是否存在,必须那个地方不存在物品,而进行strcmp比较也会出现异常
</pre><pre name="code" class="cpp">只要注意到这些地方,就可以消去部分bug了,具体还是需要自己在实际代码中测试才能解决具体的问题