引擎的使用
目前游戏数据解析引擎实现了部分游戏内数据的读取和修改在完成初始化后可以十分便捷的访问这些数据,下面将讲解目前已经解析的游戏数据和引擎的使用方式,相关代码均可在可选脚本的数据窗口脚本中找到。
引擎初始化
在初始化玩家、世界、任务时相当简单,可直接通过new()方法将引擎载入变量中
local Data_Player = engine.Player:new()
在初始化怪物和实体时则需要将对应实体的地址传递给new(entityPtr)函数,通常这些实体地址可通过模组内置功能获取,无需手动查找。
local monsterList = GetAllMonster()
for monster, monsterData in pairs(monsterList) do
local Data_Monster = engine.Monster:new(monster)
end
获取和修改引擎内数据
初始化后引擎将以table的方式存放在变量当中,可直接访问table中的数据,这些数据在同时也会响应赋值操作直接对游戏内数据进行修改,但要注意的是,并非所有数据都支持修改,目前引擎仅提供了可修改的数据绑定,其他数据修改将不会产生效果
获取玩家生命值
local health = Data_Player.Characteristic.health.health_current
修改玩家生命值
Data_Player.Characteristic.health.health_current = 100
直接通过引擎修改玩家武器id将不会生效,玩家的武器id是受保护的数据
Data_Player.Weapon.id = 214 --无法生效
值得注意的是,某些结构类数据在通过引擎进行修改时,单独修改结构中某一个值是无法使数据发生变动的,但是可以通过修改整个结构使数据发生变动
修改玩家的坐标
Data_Player.Position.position = {x = 100, y = 20, z = 100}
如果单独修改玩家坐标中的某个值将不会生效
Data_Player.Position.position.x = 100 --无法生效
引擎目前可访问的数据
由于引擎数据较多,建议直接查看Lua\modules下的引擎源码,源码中的第一个table中包含了该项的所有可访问数据,可直接通过引擎修改的内容可查看该项中new()方法的创建监听下方内容,new方法通常在源码的最下方。
预设功能
引擎还预设了一些便于操作的功能,相关项目的功能可查看对应项源码中头部注释里写的方法,目前主引擎只提供了keypad用于判断按键是否被按下。
if engine.keypad({'ctrl','a'}) then
...
end
这里推荐和计时器功能一起使用添加按键判断延迟,相关使用方法可参考示例文件的on_time函数中使用方法。
模组的预设功能
模组内置了一些不方便通过内存读写进行操作的功能,其中大部分通常不会被用到,如果想了解详细的使用方法,可以查看LuaEngine的源码lua_register.h和所有hook_*.h中对方法的相关绑定,这里只对一些常用功能进行说明。
CheckKey(int vk)
用于检测按键是否被按下,需传入按键vk码,返回布尔值
CheckKeyIsPressed(int vk)
用于检测按键是否处于按下状态,需传入按键vk码,返回布尔值
XCheckKey XCheckKeyIsPressed
与CheckKey和CheckKeyIsPressed同理
AddChronoscope(float time, string name)
创建计时器,需传入结束用时和计时器名称
CheckChronoscope(string name)
检测计时器是否到期,需传入计时器名称,返回布尔值,如果计时器到期将自动删除计时器
CheckPresenceChronoscope(string name)
检测计时器是否被创建,需传入计时器名称,返回布尔值
DelChronoscope(string name)
删除计时器
Message(string msg)
向游戏内发生消息
SendChatMessage(string msg)
向游戏内聊天消息发生消息
Console_Info(string msg) Console_Error(string msg)
向控制台发生消息,有info和error两个等级
GetAddress(hex base, {hex offset, ...})
获取内存地址,需传入基址,偏移量,返回获取到的地址,使用较为复杂,这里以获取时间区域地址为例GetAddress(0x145073ED0,{ 0x50, 0x7D20 })
GetAddressData(hex addr,string type)
获取内存地址数据,需传入地址,数据类型,返回对应类型的数据值,这里可使用的数据类型有int,float,bool,byte,string,地址通常会加上最后的一个偏移,这里以获取当前时间为例GetAddressData(GetAddress(0x145073ED0,{ 0x50, 0x7D20 }) + 0xC24, 'float')
SetAddressData(hex addr,string type,value)
设置内存地址数据,和获取类似,最后加上数值,要注意的是设置数据不包含string类型
LoadTexture(string file)
加载图片资源到纹理中,需传入图片地址,纹理名称,返回纹理地址,纹理加载后会一直存放在纹理列表中,且多脚本之间通用,在创建纹理时建议命名加上脚本名以作区分,纹理加载函数通常只需调用一次,不建议重复加载相同纹理,使用纹理可参考下方示例
local texture, w, h = LoadTexture('Lua/img/test.jpg')
ImGui.SetNextWindowSize(w, h)
ImGui.Begin("image")
ImGui.Image(texture, w, h)
ImGui.End()
ImGui.Image函数被绑定了三个方法,可按需使用
ImGui.Image(texture, w, h)
ImGui.Image(texture, w, h, alpha)
ImGui.Image(texture, w, h, uv0_x, uv0_y, uv1_x, uv1_y, R, G, B, A)
GetAllMonster()
获取全部怪物内存地址,使用方法如下
local monsterList = GetAllMonster()
for monster, monsterData in pairs(monsterList) do
print(monster..' id:'..monsterData.Id..' subid:'..monsterData.SubId)
end
GetAllAnimals()
获取全部环境生物内存地址,使用方法和GetAllMonster一样
CreateProjectiles(int id, float stratX, float startY, float startZ, float endX, float endY, float endZ, hex entity, hex shlplist)
发射投射物,需要投射物id,起始点坐标和结束点坐标,投射物列表地址
投射物列表地址并不好找,这里给出两个
GetAddress(0x145073ED0,{ 0x50, 0x76B0, 0x1D90 })
GetAddress(0x145073ED0,{ 0x50, 0x56E8})
Load_AudioFile(string name, string file)
加载音频文件,需要命名和文件地址,音频仅支持wav格式
Play_Audio(string name)
播放指定的音频,需要先加载后才能播放
AudioList()
列出已加载的音频列表
Invulnerable(bool state)
使玩家无法被命中
GetHitCount()
获取玩家被命中的次数
ResetHitCount()
重置玩家被命中的次数
AddFrameSpeed(hex addr, float speed)
增加实体的动作帧速率,需要传入实体地址和增加的速度,速度可设置为负数降低动作帧速率,设置为0则还原速率
GetShlp()
获取投射物列表,返回table,包含From投射物来源指针和Id投射物id
RefreshEquip()
更新玩家装备缓存数据
GameVersion()
获取游戏版本号
GetFileMD5(string filePath)
获取文件MD5值
addTask(function task)
执行多线程任务
SearchPattern(table hexlIST)
搜索内存地址,传入特征码{0x00, 0x00}返回搜索到的地址,失败返回false
自定义插件的编写和使用
Lua支持加载由c编写的dll文件,可以通过此方法更灵活的使用LuaEngine
插件使用
在lua脚本中可以使用一下指令加载一个dll文件
local libcamera = package.loadlib(".\\Lua\\plugins\\camera.dll", "luaopen_camera")
dll文件的名称在生成后请不要修改,否则lua将无法正常加载,参数"luaopen_camera"中camera为插件名,同时也是文件名
插件加载后可以直接调用
libcamera()命令调用dll中的程序,命令中camera同样为文件名,请保持一致
插件编写
插件编写较为复杂,需要安装Visual Studio和c++17开发环境
完成安装后下载LuaEngine项目源码后打开LuaEngine\plugins\camera\camera.sln方案
此为游戏内视角的示例插件,在camera的dllmain.cpp中编写你需要的功能
luaopen_camera为导出函数,lua将调用这个函数执行插件中的内容,函数名luaopen_camera中的camera请保持和插件名一致
示例文件使用lua的函数注册方式注册了两个函数,在lua执行libcamera()命令调用dll程序后着两个函数将全局加载到lua中,示例文件使用了sol2但未使用sol2的加载方式,听说使用sol2可能会导致加载后注册失败,请自行斟酌使用
常见问题
开启游戏后程序立马崩溃
可能是由于模组之间产生冲突或加载的脚本文件存在错误导致的,可尝试移除其他模组和脚本文件后启动游戏,如果游戏不再崩溃,请检查其他模组兼容性并确认脚本文件编写是否正确。
首次读图过程中游戏崩溃
可能是由于脚本文件错误导致的,可尝试移除脚本文件后再次进入游戏,如果任然崩溃,请按照上一条进行模组兼容性排查,如果仍无法进入游戏,请检查c:/windows/fonts/simhei.ttf此文件是否存在,如果不存在,请下载安装字体后再次尝试进入游戏。
游戏正常运行过程中出现崩溃情况
有可能是脚本错误导致,可尝试复现崩溃的情况,移除脚本文件后再次复现,如果未出现崩溃,请联系脚本作者反馈bug,如果您是脚本作者无法处理此bug,可尝试联系我解决(不一定回)。
游戏正常运行过程中前置弹出命令窗口并提示红字错误,部分脚本功能无法使用
对应的脚本文件出现错误,请联系脚本作者解决。
游戏启动后不显示UI或显示有延迟
可能是由于d3d钩子未能初始化导致的,如果已经正常显示UI,通常不会有什么问题,如果长时间仍未显示且游戏明显变卡,建议重启steam或重启电脑后再试。
有解决不了的问题可以加群736747654问
更新日志
v1.2.8 - 2024.10.15
修复过场动画崩溃问题
添加内存搜索功能SearchPattern
优化引擎文件
v1.2.7 - 2024.10.12
移除音频相关功能
优化崩溃记录功能
v1.2.6 - 2024.10.11
优化兼容性
添加崩溃记录功能
v1.2.5 - 2024.10.7
限制武器切换仅在单人游戏时生效
适配新版本更新
v1.2.4 - 2024.06.11
1.2.3版本存在问题,已在1.2.4修复
适配新版本更新
v1.2.2 - 2024.03.17
添加聊天消息函数SendChatMessage
优化message和console参数类型检测
v1.2.1 - 2024.03.15
添加协程函数addTask
v1.2.0 - 2024.01.19
新增组件接口,允许开发自定义组件
添加音频组件LuaEngineAudio
修复UI组件LuaEngineUI重载问题
添加UI组件图像加载功能
修复引擎错误
移除网络相关模块
v1.1.5 - 2024.01.10
LuaEngine不再支持Imgui功能,相关功能转移至LuaEngineUI中。
移除对DX11的支持
更新imgui版本
修复引擎错误
v1.1.4 - 2023.12.30
修复引擎错误
修复错误的lua错误处理
修复DX12模式下可能的错误
更新引擎新增对LuaEngine环境的校验
更新网络模块,详见模组预设功能
修改engine_player.Weapon.hit玩家武器命中的怪物实体数据获取,由于部分人获取时地址出现错误,目前没有更好的地址替换,暂时禁用该项获取,如需使用,请尝试使用GetAddress(0x145011760,{ 0x50, 0xC0, 0x98, 0x18, 0x70, 0xC8, 0xD0, 0x5D0, 0x20, 0x2C8 })
v1.1.3 - 2023.12.22
修复引擎错误
添加调试系统
通过向graphics_option.ini中添加
[LuaEngine]
ImgUI=On
MemoryLog=Off
可以控制是否启用图形系统和内存读写日志输出
v1.1.2 - 2023.12.1
修复引擎错误
兼容部分补丁,如果无法使用请换回v1.1.1版本
v1.1.1 - 2023.11.26
添加装备幻化相关数据
添加更新装备缓存数据功能
v1.1.0 - 2023.11.24
修复手柄数据获取
修复任务数据获取
修复按键数据获取错误
修复引擎的一些错误
增加lua脚本对中文变量名的支持
增加lua脚本对lfs库的支持
增加对DX12的支持
增加引擎buff和item
优化脚本错误提示
优化引擎加载方式,现在引擎会自动加载Lua/modules/下的全部lua脚本
原示例文件移动到可选脚本中(数据窗口),不再默认加载,如需使用请手动安装
添加LuaScript兼容脚本,兼容脚本不默认加载,如需使用请手动安装(可选脚本中的LuaScript)
v1.0.10 - 2023.10.18
适配新版本(任务尚未适配完成)
v1.0.9 - 2023.2.5
重做投射物系统,添加投射物数据获取功能
修复bug
引擎添加玩家角度信息
v1.0.8 - 2023.1.20
优化引擎按键处理功能
修复重置脚本时未执行初始化的问题
v1.0.7 - 2023.1.19
修复引擎按键判断时传入数字时无法生效的bug
修复切换场景导致游戏崩溃问题
v1.0.6 - 2023.1.18
添加日志功能
修复引擎中武器数据可能存在的闪退问题
v1.0.5 - 2023.1.17
初步添加shlp数据获取功能
修复引擎bug
修复内存读取功能bug
v1.0.4 - 2023.1.14
优化读取内存时的安全性
修复设置动作速度时地址错误导致的全局修改
v1.0.3 - 2023.1.13
添加受击的相关操作
添加动作帧速率的相关操作
补全image的更多调用方法
v1.0.2 - 2023.1.11
添加音频文件加载和播放功能
v1.0.1 - 2023.1.10
修复返回游戏主菜单和全屏游戏切换游戏窗口导致的游戏崩溃问题