上篇教程我们讲解了如何编写一个简单的脚本,在编写过程中我们已经接触了LuaEngine的一些内置功能,接下来我们将分几部分详细讲解LuaEngine的内置功能。请注意,本篇教程编写时的版本为1.1.5,如果后续LuaEngine更新发生功能变动,请根据更新日志中的修改方法进行代码迁移。
调用函数
首先是LuaEngine在运行是会调用脚本中的函数说明
- on_init init函数会在脚本首次被游戏加载时被调用。
- on_time time函数会在游戏过程中每次时间发生变动时被调用,通常逻辑代码均写在这里
- on_monster_create MonsterCreate函数会在有怪物被生成时被调用
- on_monster_destroy MonsterDestroy函数会在有怪物被销毁时被调用,这里要注意,怪物死亡后并不会被立即销毁
- on_switch_scenes SwitchScenes函数会在切换地图时被调用
- on_imgui() imgui函数会在每次图形进行数据交换时被调用,请注意只有安装了LuaEngineUI的情况下才会被调用
跨脚本变量读取和保存
LuaEngine的不同脚本直接采用独立虚拟机的方式运行,代码环境相互隔离,如果需要在两个脚本之间传输数据,可以通过LuaEngine的变量缓存功能进行。
首先是存入变量的功能,存入变量的功能使用方法一致,不同的只有存入的变量类型
- setGlobalVariable_int(string name, number value)
- setGlobalVariable_float(string name, number value)
- setGlobalVariable_string(string name, number value)
这里以存入整数的变量为例setGlobalVariable_int('varint', 1),这里的第一个参数为存入的变量名,第二个参数为变量值,同名的变量在重复存入时会被直接覆盖。要注意各各脚本之间的存入变量如果使用同一个变量名会相互覆盖,开发时建议加入一些独有的特征。
读取变量的功能与写入类似,只需要提供变量名即可,如果读取时变量并未被存入,那么将返回该类型的默认值(int和float是0,string是'')示例:loacl varint = GlobalVariable_int('varint')
- GlobalVariable_int(string name)
- GlobalVariable_float(string name)
- GlobalVariable_string(string name)
最后是销毁变量的功能,使用此功能可以手动清理不再使用的缓存变量,回收内存,很少使用。
- DestroyGlobalVariable(string name)
计时器
LuaEngine内置了一个计时器系统,该系统根据游戏内时间变动进行时间计算,该功能移植自LuaScript,系统较为陈旧但仍然很好用,如果有能力也可以使用Lua直接实现计时器功能,会更加自由。
- AddChronoscope(float time, string name)
- CheckChronoscope(string name)
- CheckPresenceChronoscope(string name)
- DelChronoscope(string name)
AddChronoscope可以添加一个新的计时器,AddChronoscope(1,'newChronoscope')第一个参数是计时器的结束时间,第二个参数是计时器名。
创建计时器后可以使用CheckChronoscope功能检查计时器是否到期,这里要注意的是,在使用CheckChronoscope检查计时器之前,即使计时器到期了也不会被消除,当CheckChronoscope检查计时器到期后会同时删除掉计时器,CheckChronoscope('newChronoscope')参数只有一个计时器名,未到期时返回false,到期后返回true。
CheckPresenceChronoscope功能可以检测计时器是否被创建,CheckPresenceChronoscope('newChronoscope')参数同样是计时器名,如果计时器存在则返回true,如果计时器不存在则返回false,注意计时器即使到期,只要未被删除就仍然存在。
DelChronoscope功能可以手动删除计时器DelChronoscope('newChronoscope')参数同样是计时器名。
按键检测
LuaEngine内置了一个按键检测系统,该系统同样是移植自LuaScript,在Engine引擎中对该功能进行了封装,此处仅作了解即可,通常使用引擎功能进行按键检测。
- CheckKey(int vk)
- CheckKeyIsPressed(int vk)
- XCheckKey(int vk)
- XCheckKeyIsPressed(int vk)
CheckKey是检测按键是否按下,使用了内置计时器进行了内置cd检查,并不好用,CheckKeyIsPressed是检测按键是否被按下,相比CheckKey更加灵敏,X开头的是Xbox按键的检测。按键检测的所有功能均返回布尔值,键盘传入的参数是Virtual-Key值,xbox参数请参考https://docs.alcedogroup.com/shu-ju-biao-1/xbox-shou-bing-an-jian-dui-ying-id-biao
消息系统
LuaEngine拥有两个消息发送渠道,可以向游戏内发送消息也可以向前置的命令窗口发送消息,其中Console_Info功能在Engine引擎中封装给了print函数,并加入了对table结构的输出功能,建议使用print代替Console_Info使用,如果需要输出更纯粹或单纯为了性能考虑,仍可使用Console_Info功能。
- Message(string msg)
- Console_Info(string msg)
- Console_Error(string msg)
Message功能可以向游戏内发送消息,该消息使用了游戏内置的消息队列,新发送的消息会排在队尾。Message('消息')该功能建议只发送少量信息,并且注意要手动换行,超过3行后内容将超出消息格。
Console_Info和Console_Error均可向前置的命令窗口发送不同等级的消息,注意默认安装的前置消息等级的设置不会显示Console_Info的信息。
内存操作
在上一篇教程中相信大家已经使用过内存操作的功能了,这个功能是LuaEngine的核心。
- GetAddress(hex base, {hex offset, ...})
- GetAddressData(hex addr,string type)
- SetAddressData(hex addr,string type,value)
GetAddress功能可以获取一个地址的指针数据,第一个参数为基址,第二个参数为指针偏移。GetAddressData功能可以获取指定地址的数据,第一个参数为地址,第二个参数为数据类型。SetAddressData与GetAddressData类似,功能是写入内存数据,第三个参数为写入的数值。
内存操作的详细用法在上一篇教程中已经详细讲解过,通常参考ce的数据进行编写即可。
获取各种实体数据
LuaEngine内置了一些功能用于获取游戏中怪物、环境生物、投射物的实体数据。
- GetAllMonster()
- GetAllAnimals()
- GetShlp()
怪物数据获取GetAllMonster功能可以获取当前所有怪物的列表,数据包含了怪物实体地址、怪物Id、怪物亚种Id,通常和Engine引擎一起使用,GetAllMonster功能的示例代码如下
local monsterList = GetAllMonster()
for monster, monsterData in pairs(monsterList) do
print(monster..' id:'..monsterData.Id..' subid:'..monsterData.SubId)
end
环境生物数据获取GetAllAnimals功能与怪物数据获取功能的用法完全一致此处不多赘述。
投射物(shlp)数据获取代码GetShlp功能与怪物数据获取代码功能类似,返回数据只包含地址和Id
投射物(shlp)生成
投射物生成功能比较复杂,并不建议新手使用,后续教程会单独讲解该功能,此处仅作基础说明
- CreateProjectiles(int id, float stratX, float startY, float startZ, float endX, float endY, float endZ, hex entity, hex shlplist)
投射物生成功能CreateProjectiles的参数依次是
- 投射物id
- 投射物起始坐标X
- 投射物起始坐标Y
- 投射物起始坐标Z
- 投射物结束坐标X
- 投射物结束坐标Y
- 投射物结束坐标Z
- 投射物来源
- 投射物列表地址
下面是两个关于玩家的投射物列表地址
玩家投射物
GetAddress(0x145073ED0,{ 0x50, 0x76B0, 0x1D90 })
玩家手弩投射物
GetAddress(0x145073ED0,{ 0x50, 0x56E8})
相机操作
相机操作功能可以控制视角相机的坐标,要注意这里修改坐标为相机绑定的坐标,而非相机实体本身的坐标,修改坐标后视角将随着坐标变更而变更,但是并不会将目标周围的声音收录进来。
- GetCameraData()
- SetCameraData(bool lock, number x, number y, number z)
GetCameraData功能可以获取当前相机状态,返回相机坐标x,y,z和一个布尔值lock,当lock为true时相机将会移动到SetCameraData设置的坐标
SetCameraData功能可以设置当前相机的状态,lock可以设置是否接管相机坐标控制,后三个参数为设置的相机坐标。
动作和特效
LueEngine中内置了强制派生和强制动作的功能,可以强行执行派生和动作,动作帧速率控制功能可以控制动作帧执行速率,还有一个特效生成功能可以添加简单的特效。
- RunFsmAction(number type, number id)
- RunLmtAction(number id)
这两个函数分别是强制派生fsm和强制执行东西lmt的功能,fsm的由一组type和id组成的,动作lmt则只有id即可,后面的教程中会详细讲解这两个函数的用法和对应id的找法。
- AddFrameSpeed(hex addr, float speed)
- GetAddFrameSpeed(hex addr)
AddFrameSpeed可以为指定的实体追加动作帧的速率,速率可以是负数,第一个参数是实体的地址,第二个参数是追加的速率值。GetAddFrameSpeed可以查看对指定实体追加的速率值是多少。
- AddEffect(number group, number record)
AddEffect功能可以为玩家添加特效,第一个参数是特效组id,第二个参数是特效组内的记录值。
更换装备
LuaEngine内置了对武器和装备实时更换的功能
- ChangeWeapons(number type, number id, bool complete)
- RefreshEquip()
其中ChangeWeapons的功能可以立即切换玩家的武器,第一个参数是武器类别,第二个参数是武器id,第三个参数是完全更换武器,这里要注意第三个参数虽然是布尔值,但是不论值是什么,都会完全更换武器,如果只需要部分更换则不需要添加第三个参数,通常来说非完全更换武器已经足够使用。
RefreshEquip功能则是刷新装备数据,此功能会将内存中缓存的装备数据临时刷新到玩家实体上,此功能目前仍有不少问题,这里只给出该功能,不做详细教学。
其他功能
LuaEngine还内置了以下功能,由于并非常用功能,这里不做详细介绍。
- Load_AudioFile(string name, string file)
- Play_Audio(string name)
- AudioList()
- GameVersion()
- GetHttpData(string url)
- DownloadFile(string url, string file)
- GetFileMD5(string file)
- LinkWSServer(string ws)
- SendWSMessage(string msg)
- GetWSMessage()
- GetWSLinkState()
- Invulnerable()
- GetHitCount()
- ResetHitCount()