追逐自己的梦想----------辅助制作第十八课:拖拽技能到快捷栏

本文详细介绍了如何通过汇编代码实现游戏内拖拽技能到快捷栏的功能。涉及到的关键操作包括设置内存地址、移动数据以及调用相关函数。代码中包含了TSkillObj结构体和TSkillList类的定义,用于处理技能对象和列表。
007AFFC1 - A1 0CA4F500 - mov eax,[Client.exe+B5A40C]
007AFFC6 - 83 C4 10 - add esp,10
007AFFC9 - C7 80 28020000 00000000 - mov [eax+00000228],00000000 <<
007AFFD3 - E9 7799FFFF - jmp Client.exe+3A994F
007AFFD8 - 8B 85 B0D0FFFF  - mov eax,[ebp-00002F50]

EAX=09EA7B28
EBX=1AA895F4
ECX=00000432
EDX=0000007D
ESI=00000001
EDI=1AA89168
ESP=001874E4
EBP=0018A46C
EIP=007AFFD3

通过转到上面的地址

然后转到上层就得到 call

007B3803   /74 0E           JE SHORT Client.007B3813
007B3805   |40              INC EAX
007B3806   |83C1 04         ADD ECX,4
007B3809   |83F8 24         CMP EAX,24
007B380C  ^|7C F2           JL SHORT Client.007B3800
007B380E   |E9 D9000000     JMP Client.007B38EC
007B3813   \83F8 FF         CMP EAX,-1
007B3816    0F84 D0000000   JE Client.007B38EC
007B381C    50              PUSH EAX
007B381D    6A 01           PUSH 1
007B381F    6A 00           PUSH 0
007B3821    8BCF            MOV ECX,EDI
007B3823    E8 C85FFFFF     CALL Client.007A97F0
007B3828    E9 BF000000     JMP Client.007B38EC
007B382D    8B8F 08160000   MOV ECX,DWORD PTR DS:[EDI+1608]
007B3833    8B97 D01B0000   MOV EDX,DWORD PTR DS:[EDI+1BD0]
007B3839    53              PUSH EBX                                 ; 01
007B383A    51              PUSH ECX                                 ; 0x0D
007B383B    52              PUSH EDX                                 ; 0x04  可能是拖拽call
007B383C    8BCF            MOV ECX,EDI
007B383E    E8 AD5FFFFF     CALL Client.007A97F0
007B3843    E9 A4000000     JMP Client.007B38EC


EDI 的值
0078FCBA    3B3D 58851B03   CMP EDI,DWORD PTR DS:[31B8558]
0078FCC0    75 11           JNZ SHORT Client.0078FCD3



007B30E7    83B8 8C020000 0>CMP DWORD PTR DS:[EAX+28C],0
007B30EE    0F84 F8070000   JE Client.007B38EC
007B30F4    8B88 8C020000   MOV ECX,DWORD PTR DS:[EAX+28C]
007B30FA    53              PUSH EBX
007B30FB    E8 D0ACF0FF     CALL Client.006BDDD0
007B3100    E9 E7070000     JMP Client.007B38EC
007B3105    8B849F 10040000 MOV EAX,DWORD PTR DS:[EDI+EBX*4+410]
007B310C    8B0D 0CA4F500   MOV ECX,DWORD PTR DS:[F5A40C] //让ECX写入数据时候用到的值
007B3112    8981 28020000   MOV DWORD PTR DS:[ECX+228],EAX
007B3118    8B15 0CA4F500   MOV EDX,DWORD PTR DS:[F5A40C]
007B311E    C682 30020000 0>MOV BYTE PTR DS:[EDX+230],1
007B3125    A1 0CA4F500     MOV EAX,DWORD PTR DS:[F5A40C]
007B312A    8B88 28020000   MOV ECX,DWORD PTR DS:[EAX+228]
007B3130    66:8B97 0816000>MOV DX,WORD PTR DS:[EDI+1608]
007B3137    66:8991 F201000>MOV WORD PTR DS:[ECX+1F2],DX
007B313E    8B35 0CA4F500   MOV ESI,DWORD PTR DS:[F5A40C]
007B3144    8B8E 28020000   MOV ECX,DWORD PTR DS:[ESI+228]
007B314A    8B41 50         MOV EAX,DWORD PTR DS:[ECX+50]
007B314D    8B51 4C         MOV EDX,DWORD PTR DS:[ECX+4C]





最后根据上面的分析写出以下的拖拽技能到物品栏的call
mov edi,[31B85B0]
mov eax,[edi+4+00000410]
mov ecx,[0F5A40C]
mov [ecx+00000228],eax

mov edi,[31B8558]
MOV ECX,DWORD PTR DS:[EDI+1608]
MOV EDX,DWORD PTR DS:[EDI+1BD0]
push 0
push ecx
push edx
mov ecx, edi
call 0x007a97f0

<pre name="code" class="cpp">typedef struct TSkillObj{
	DWORD ndBaseObj;//返回对象基址
	DWORD ndType; //分类  1B技能书分类  1C 才是使用技能分类
	DWORD ndIndexForSkill; //技能列表里面的下表分类
	char* szpName;
	DWORD ndIndexForAll; //+0c 所有对象ID
	BOOL IsUseable;//+1f6 

}_TSkillObj;


#define Skill_ListSize 32
typedef struct TSkillList
{
	TSkillObj t_list[Skill_ListSize];
	TSkillList* GetData();
	void DbgPrintMsg();
	BOOL DropSkillToF1F10(char*szpSkillName, DWORD ndIndexF1F10);//根据技能名字拖放技能至快捷栏
}_TSkillList;

BOOL TSkillList::DropSkillToF1F10(char*szpSkillName, DWORD ndIndexF1F10)//根据技能名字拖放技能至快捷栏
{
	DWORD ndBase = NULL;
	GetData();
	__try{
		for (int i = 0; i < 32; i++){
			if (t_list[i].ndType == NULL){
				continue;
			}

			if (strcmp(szpSkillName, t_list[i].szpName) == 0){
				ndBase = t_list[i].ndBaseObj;
				__asm{
					//mov edi, [31B85B0]
					//mov eax, [edi + 4 + 00000410]
					//mov ecx, [0F5A40C]
					//mov[ecx + 00000228], eax
					mov ecx, Base_SelGoodSkill
					mov ecx, [ecx]
					mov eax , ndBase
					mov [ecx + 0x228],eax
				}
			}
		}

		if (ndBase == NULL){
			return FALSE;
		}

		__asm{
			mov edi, Base_DrapSkillArg
			mov edi, [edi]
			MOV ECX, DWORD PTR DS : [EDI + 0x1608]
			MOV EDX, DWORD PTR DS : [EDI + 0x1BD0]
			mov eax , ndIndexF1F10
			push eax
			push ecx
			push edx
			mov ecx, edi
			mov eax ,Base_DrapSkillCall
			call eax
		}



		//mov edi, [31B8558]
		//MOV ECX, DWORD PTR DS : [EDI + 1608]
		//MOV EDX, DWORD PTR DS : [EDI + 1BD0]
		//push 0
		//push ecx
		//push edx
		//mov ecx, edi
		//call 0x007a97f0

	}
	__except (1){
		DbgPrintf_Mine("BOOL TSkillList::DropSkillToF1F10(char*szpSkillName, DWORD ndIndexF1F10)出现异常");
		return FALSE;
	}

	return TRUE;
}




[ { "id":1, "msg":"帝帝帝大王正指挥瓦多迪建造'苹果能量塔',突然发现核心能源——星光苹果被偷。", "nextid":2 }, { "id": 2, "name": "DDD", "avatar": "Avatars/DDD", "msg": "(暴跳如雷)我的超级苹果!没有它能量塔就是废铁!等等…这粉色绒毛!(捡起沙滩上的绒毛)卡比——!!", "nextid":3 }, { "id":3, "msg": "(星之卡比从礁石后探头,抱着发光的苹果啃得正欢)", "nextid":4 }, { "id": 4, "name": "Kriby", "avatar": "Avatars/Kriby", "msg": " Poyo?(无辜眨眼,苹果汁滴在沙子上泛起星光)", "opts": [ { "msg": "主动归还苹果,但要求交换条件", "toId": 8 }, { "msg": "转身逃跑引发追逐战", "toId": 5 } ] }, { "id": 5, "name": "DDD", "avatar": "Avatars/DDD", "msg": " 可恶的粉球,给我站住不许跑!!!", "nextid":6 }, { "id": 6, "name": "Kriby", "avatar": "Avatars/Kriby", "msg": "Poyo!Poyo!", "nextid":7 }, { "id": 7, "msg": "就这样两人一直追逐下去........但是最终还是选择和解", "nextid":8 }, { "id": 8, "name": "Kriby", "avatar": "Avatars/Kriby", "msg": " Poyo-poyo!(指向远方迷雾海域)", "nextid":9 }, { "id": 9, "name": "DDD", "avatar": "Avatars/DDD", "msg": " 什么?你说海妖偷走了其他苹果?(狐疑)哼!本大王才不会被骗…(突然巨浪袭来)", "nextid":10 }, { "id": 10, "msg": " 巨型海妖现身,触手卷走苹果能量塔的核心部件,两人被困在腐朽的船舱,海水不断渗入。", "nextid":11 }, { "id": 11, "name": "DDD", "avatar": "Avatars/DDD", "msg": " 锤子卡在木梁里)可恶!粉球球,现在我们是一根绳上的蚂蚱了!", "nextid":12 }, { "id": 12, "name": "Kriby", "avatar": "Avatars/Kriby", "msg": "(变身潜水卡比,照亮黑暗)Poyo! ", "nextid":13 }, { "id": 13, "msg": " 逃生途中发现古代石板,记载着苹果能量的秘密。", "nextid":14 }, { "id": 14, "name": "MetaKnight‌", "avatar": "Avatars/MetaKnight‌", "msg": "(突然从天而降)停下!那石板会唤醒古代灾厄!(剑指帝帝帝)你又在谋划什么? ", "nextid":15 }, { "id": 15, "name": "DDD", "avatar": "Avatars/DDD", "msg": "( 本大王需要苹果救妹妹蒂芙!她的石化病…(罕见露出脆弱) ", "nextid":16 }, { "id":16, "name":"Kriby", "msg":"Poyo?(那我现在应该怎么做呢?)", "opts": [ { "msg":"卡比调和冲突,提议三方合作", "nextid":17 }, { "msg":"卡比独自吞下石板引发能量暴走", "nextid":22 } ] }, { "id":17, "msg":"三人抵达星云神殿,发现苹果能量可治愈石化病,但会毁灭梦幻岛生态。", "nextid":18 }, { "id":18, "name":"DDD", "avatar":"Avatars/DDD", "msg":"(颤抖握锤)蒂芙还是岛屿…靠你了(为卡比提供能量)", "nextid":19 }, { "id":19, "name":"MetaKnight‌", "avatar":"Avatars/MetaKnight‌", "msg":"(收剑入鞘)或许是时候该发力了(为卡比提供能量)", "nextid":20 }, { "id":20, "name":"Kriby", "avatar":"Avatars/Kriby", "msg":"(跳到祭坛中央,全身发光)POYO——!", "nextid":21 }, { "id":21, "msg":"能量不断被吸入卡比体内,在短暂光芒之后,卡比稳定下来后让帝帝帝将苹果带回,蒂芙苏醒,帝帝帝含泪道谢" }, { "id":22, "msg":"卡比吸收过量能量裂变成暗黑卡比,引发新危机" } ]我为你提供了json,不许更改,我现在需要你在unity中使用这个json来制作一部纯文字游戏
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值