求大神帮我如何破解lua加密脚本游戏脚本

Lua游戏逆向及破解方法介绍-腾讯游戏学院当前位置:
LUA脚本运行太慢怎么破?
LUA脚本运行太慢怎么破?
来源:网络整理&&&&&时间: 12:11:02&&&&&关键词:lua,怎么破
关于网友提出的“LUA脚本运行太慢怎么破?”问题疑问,本网通过在网上对“LUA脚本运行太慢怎么破?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:LUA脚本运行太慢怎么破?
由于用c/c++调用lua,所以
我单机运行单线程,四个AI轮流跑,一点问题也没有
打60手需要0.6到0.8秒
去掉我自己的流程控制,打一手一般0.01秒,有时候会快一些
但是弄服务器的老师傅说,几十个AI一起启动之后,会很卡。
我lua用的递归,变量占内存比较大
以上介绍了“LUA脚本运行太慢怎么破?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1532777.html
上一篇: 下一篇:运行: 2121天
Lua游戏脚本热更新机制
能够在服务器运行期间更新程序逻辑代码以实现修正程序Bug、修改游戏数据的目的。游戏框架代码的热更新暂不考虑。例如:
某个业务处理函数逻辑有Bug,服务器运营期间发现,在不停机情况下及时更新代码修复。
技能数值表策划填写出现手误错误,导致玩家战斗异常,在不停机情况下及时更新内存中的数值表。
更新代码时要保护非代码数据,尽量不用重新载入存盘数据。例如:
登陆用户列表保存在内存中,用户登录模块出现bug需要跟新代码,此段代码更新后,用户列表依然有效,在线用户不受影响。
lua的module机制?
require 会阻止你重新加载相同的模块。当需要更新系统的时候,卸载掉自己编写的模块。方法是:把 package.loaded 里对应模块名下设置为 nil (这样可以保证下次 require 重新加载一次)并把全局表中的对应的模块表置 nil 。
同时把数据记录在专用的全局表下,并用 local 去引用它。初始化这些数据的时候,首先应该检查他们是否被初始化过了。这样来保证数据不被更新过程重置。
Module B中 local shortFunc = ModuleA.longFunc 在更新ModuleA后更新不到,需在之前加上local shortFunc = nil。比较麻烦
此方法用到了module,在Lua5.2中已经弃用module机制,Lua建议用户自己实现更简单的方法。
loadfile机制?
通过loadfile来模拟module机制,可以灵活的根据业务需求加入更多的热更新需求。
loadfile的使用基础?
————————-
–代码动态加载模块 v0.1
–基于Lua 5.2版本的loadfile
————————
—-模块管理表,类似于package.loaded
local Modules = {}
–通过loadfile将新代码载入到newModule
function Load(pathname, modulename)
local newModule = {}
–_ENV被设置为空表,载入文件的访问空间被限制在模块内部
local func, err = loadfile(pathname, “bt”, newModule)
if not func then
print(“ERROR: ” .. err)
Modules[moduleName] = newModule
测试模块 Game.lua
———————————
—- 模拟一个游戏定时活动玩法逻辑
—- 活动中获奖用户记录下来,活动结束后发奖
—- 此代码有逻辑错误
———————————–
— 活动中获奖用户列表
rewardedUser = {}
— 活动开始结束时间设置
local starttime = {hour = 10, min = 0, sec = 0}
local endtime = {hour = 12, min = 0, sec = 0}
— 记录活动中中奖用户
function RecordReward(charId)
rewardedUser[char] = true — 报错,char = nil
–更新后的正确代码
— rewardedUser[charId] = true
测试驱动模块 Main.lua
require(“Modules.lua”)
GAME = Load(“Game.lua”)
GAME.RecordReward(1001) –报错
— 更新错误以后重新加载
GAME = Load(“Game.lua”)
GAME.RecordReward(1001) — rewardedUser = { [1001] = true}
local data =GAME.rewardedUser
local func = GAME.RecordReward
–local 导致当前GAME.RecordReward、GAME.rewardedUser引用被当作upvalue绑定在 closure 里
GAME = Load(“Game.lua”)
— GAME.rewardedUser = {} 被重新载入的代码所取代, { [1001] = true}数据丢失,导致用户无法领奖,业务逻辑发生异常。
GAME.RecordReward(1002) — rewardedUser = { [1002] = true}
— data引用的是保存在upvalue中的旧引用,值为{ [1001] = true} ,与当前GAME.RecordReward不同步了,出现逻辑异常
— 仍然报错,因为其引用的是保存在upvalue中的旧引用,而不是更新后的GAME.RecordReward
loadfile的使用进阶?
通过上面的代码实验,我们发现以下几个问题
上面的Game.lua 不能访问_G空间
需要持久化的内容没有得到保存
upvalue导致热更新失效
同时我们也可以看到,通过loadfile加载的代码,是以table形式引用的,这就为我们解决上述问题打开了思路。
————————-
–代码动态加载模块 v0.1
–基于Lua 5.2版本的loadfile
————————
–模块管理表,类似于package.loaded
local Modules = {}
— string pathname 加载模块文件名,含路径
— string name 模块名,一般和pathname一直即可
— boolean reload 是否强制更新重载
— table module 模块,如果加载失败返回nil
— string err 如果module为nil,返回错误信息
function Load(pathname, moduleName, reload)
moduleName = moduleName or pathname
local oldModule = Modules[moduleName]
if not oldModule then — 第一次加载模块,全新加载
local newModule = {}
–通过metatable机制允许模块环境访问_G
setmetatable(newModule, {__index = _G})
local func, err = loadfile(pathname, “bt”, newModule)
if not func then
print(“ERROR: ” .. err)
return nil, err
Modules[moduleName] = newModule
return newModule
else — 重复加载,不需要更新时直接返回缓存
if not reload then
return oldModule
–先缓存更新前模块内的table数据
local oldCache = {}
for k, v in pairs(oldModule) do
if type(v) == “table” then
oldCache[k] = v
oldModule[k] = nil
–原模块直接作为新的环境使用
local newModule = oldModule
–原模块被完全更新
local func, err = loadfile(pathname, “bt”, newModule)
if not func then
print(“ERROR: ” .. err)
return nil, err
–恢复table数据,既保持原有数据,也保持了其他模块的既有引用
–因为此引用机制只能作用于table,函数upvalue依然得不到更新
for k, v in pairs(oldCache) do
–将metatable换成新的即可实现函数段更新
local mt = getmetatable(newModule[k])
if mt then setmetatable(v, mt) end
–对于已存在的table,数据段保持不变
newModule[k] = v
return newModule
此方法可实现模块内非local table的数据保持和外部对其引用的保持。同时不需要业务模块对此进行特殊处理
模块内local table数据不能保持,建议用来保存固定数据,例如数值表,活动时间等。
其他模块通过 local func = MODULE.Func 的形式引用模块函数无法得到更新,建议不用此形式。或者在每个引用之前加上 local func = nil,强制脚本每次执行时去更新引用。
再次基础上还可扩展模块的初始化和unload方法,实现特殊逻辑需求
也许你还会对下面的内容感兴趣:您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
游戏简单任务脚本示例lua.doc 15页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
游戏简单任务脚本示例lua
你可能关注的文档:
··········
··········
游戏任务策划案
一 任务简要说明:
老道炼药,需要一个天使之心,在天使加百列身上有半颗,在路西法身上有半颗。老道交给你一个玉符,告诉你在法坛上使用可以帮你打开通往两处的通道。并告诉你两处的坐标A、B。(不在法坛上使用玉符无效) A坐标通往加百列,B通道通往路西法。 你站在法坛上,使用玉符进入光明前殿(或者黑暗大殿,进入先后次序不论)。 进入光明前殿遇到加百列,加百列异常高傲,称你为异教徒,你回敬他是长着鸡翅膀的不男不女的鸟人,对骂之后开始战斗。 加百列战斗策略:自身20%的几率使用光明护盾,持续5秒,每次光明护盾消失后都有20%的几率再次使用。 当自身血量低于最大血量有10%的几率使用治愈术。 当自身血量低于最大血量10%有10%的几率使用复活术,血量回满,复活术最多可使用三次。 当自身血量低于最大血量1%,且三次复活术不满则100%使用复活术。 当对方血量是当前自身血量的2倍,有10%的几率使用大预言术,大预言术50%几率为时间凝固,对方不可操作,时间5秒,50%的几率为时间逆流,对方所有属性减半,时间5秒 加百列死亡后100%获得半颗光明天使之心,获得天使之心后,你自动返回法坛前,法坛前坐标为C。
进入黑暗神殿,路西法只说了声战斗吧,即开始战斗。 路西法战斗策略:当自身血量分别为最大血量的90%,70%,?50%,?30%,?10%时开始召唤生物,第一批为三个石像鬼,第二批为三个黑暗巫师,第三批为四个大恶魔,第四批为四个骨龙,第五批为五个深渊魔王。 当每死一只召唤生物,有10%的几率分别使用虚弱,中毒,恐惧,失明,四个魔法中的一个。 若召唤生物没有全部死亡,而路西法血量少于5%的时候处于无敌状态,物理和魔法攻击免疫。 杀死路西法100%获得半颗黑暗天使之心,获得后自动返回法坛前台。
你将两个半颗天使之心带到老道处,老道要你用狗血去融合了这两个半颗天使之心,使之变成一颗完整的天使之心。 你去找了半盆黑狗血,将两颗天使之心扔进去,一道光闪过,盆里出现课天使之心,你拿完整的天使之心又去交给老道,老道很满意,给了你一枚人参果,你临走好奇问老道要天使之心炼什么药,老道告诉你,没啥用,就是看鸟人脸上道貌岸然,一肚子男盗女娼的样子不爽,正好最近有点闲,拿天使之心不过是想炼一份给自己养的牛除牛虱的药而已。你不仅为老道的恶搞而汗颜。
特别说明: 1、该任务中任何死亡都做正常死亡处理,死亡后需要重新从法坛进入目的地 2、当每拿到半颗天使之心,则该地图不可再次进入,输入坐标无效 3、当两个半颗天使之心都已获得,则玉符自动消失 4、两个场景地图不保存信息,即玩家在两个场景地图中的任一个下线后,再次上线则回到法坛前 5、该任务不可重复,每个用户只能完成一次 6、该任务接受后需要在任务日志中记录,用户可以随时查询,任务完成后清除任务日志 7、用户获得的奖励需要做log,方便查询
要求: 1、写出任务基本流程,并附流程图 2、按照任务编写一份伪脚本 其他说明: 1、所有所需的关键词、变量、以及函数由答题者自行定义,并对所定义的词、变量、函数等作出解释说明 2、编写格式可以按自己的方式编写,但需作出必要的说明 3、在战斗脚本部分编写,可任一选择一个战斗进行编写,也可以全部编写
二 加百列战斗脚本流程图
AI决策流程图:
三 脚本相关
正在加载中,请稍后...

我要回帖

更多关于 lua脚本 的文章

 

随机推荐