欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id

50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id

2024/12/27 17:19:47 来源:https://blog.csdn.net/qq_36301061/article/details/144646083  浏览:    关键词:50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:49.第二阶段x86游戏实战2-鼠标点击call深追二叉树

上一个内容中把鼠标点击怪物需要的东西都找齐了,比如鼠标点击怪物时调用的call、call需要的参数来源都找齐了,然后再找寻路,之前是通过内存的方式去找的寻路(通过数据包找的寻路,这里19.第二阶段x86游戏实战2-寻找寻路call_游戏寻路call)它有一个问题,它只能本地寻路,本地寻路什么意思?就是说只能在当前地图进行寻路,没法跨地图寻路,使用lua的寻路它是可以跨地图寻路的(这里的lua寻路不是之前我们写的lua寻路,是游戏中的lua寻路,之前自己写的lua寻路本质还是用的19节里的东西),然后跨地图的寻路如果想通过内存实现就很复杂

然后开始分析跨地图寻路

首先把hooklua的工具注入到游戏中,就是下图的工具

然后不操作游戏,然后点击HOOK_LUA按钮,然后点击添加过滤文本按钮,这样过滤一下,防止不相关的lua脚本阻碍分析

然后在游戏中打开世界地图(准备进行跨地图寻路)

然后点击HOOK_LUA按钮,点击完了之后,来到游戏中进行跨地图寻路(这里最好操作的快点)

然后跨地图寻路完成之后,就会有lua脚本了,如下图,有了lua代码之后点击UNHOOK_LUA按钮,点击了之后它就不会再拦截lua代码了,然后跨地图寻路,入参应该是x坐标,y坐标,地图id这样的,但是通过观察hook到lua脚本并没有发现这种东西,所以现在就用到了之前下载的游戏中的lua源码了(在44.第二阶段x86游戏实战2-C++HOOK提取游戏lua这里搞的)

然后就需要一个有文件内容搜索的工具,这里使用 LuaStudio,它的官网 http://www.luastudio.net/,直接点击Download下载就可以了

安装完LuaStudio之后,点击下图红框

然后如下图说明

然后复制下图红框里的东西,这个英文是GoToDirectly,中文意思是直接前往,这个名字就很符合寻路,所以先搜索它,然后这里有个是SceneMap是文件名

然后点击查找

它找到了两个文件,先看SceneMap,Scene是场景的意思,合起来就是场景地图,因为名字符合所以先看它

然后如下图红框是lua的源码,然后开始分析

然后看下图中的内容

function SceneMap_GotoDirectly()local coordinatex,coordinatey,curSceneID  -- 声明了三个本地变量-- 这个意思是 SceneMap_Board:GetMouseScenePos()  有两个返回值-- 分别给到了 coordinatex, coordinatey 变量里-- 通过 coordinatex, coordinatey 它俩的名字可以看出它们是x坐标和y坐标-- 所以 SceneMap_Board:GetMouseScenePos() 是用来获取坐标的coordinatex, coordinatey = SceneMap_Board:GetMouseScenePos() -- 通过 GetSceneID 名字可以看出它是用来得到地图id(场景id)的curSceneID = GetSceneID()-- 然后通过 g_CurSelectSceneID 这个单词可以看出它应该是-- 当前选中的地图id,然后if的判断就是当前选中id不等于-1-- 并且不等于当前地图 GetSceneID() 现在可以看出它是用来获取当前所在的地图idif	g_CurSelectSceneID ~= -1 and g_CurSelectSceneID ~= curSceneID then-- 然后这个if判断是 首先 g_SameSceneId 应该是地图数据相关-- g_SameSceneId[ g_CurSelectSceneID ] 是不是空的,如果不是空的就满足条件-- 然后判断 g_SameSceneId[ g_CurSelectSceneID ]  == curSceneID 也就是-- 选中的地图id和当前所在地图id是不是一样的,如果是一样的就执行 -- AutoRunToTarget(coordinatex, coordinatey) 函数,通过上方分析的-- AutoRunToTarget(coordinatex, coordinatey)意思应该是当前地图移动的函数了-- 然后 AutoRunToTargetEx(coordinatex,coordinatey,tonumber(g_CurSelectSceneID)) 是跨地图移动-- AutoRunToTargetEx的参数是x坐标y坐标和地图idif g_SameSceneId[ g_CurSelectSceneID ] and g_SameSceneId[ g_CurSelectSceneID ]  == curSceneID thenAutoRunToTarget(coordinatex, coordinatey)elseAutoRunToTargetEx(coordinatex,coordinatey,tonumber(g_CurSelectSceneID))endelseAutoRunToTarget(coordinatex, coordinatey)endend

然后就找到了跨地图移动的lua函数,然后之前搜索出了两个文件,然后再看看另一个文件的lua代码,如下图

然后分析它的代码,它的代码很简单,也没有跨地图寻路


img

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com