本帖最后由 mhtkjkj 于 2012-3-2 16:45 编辑
大地图重载现象的Lua代码分析 by mhtkjkj b38的自动存档禁用补丁点击这里进入
http://bbs.3dmgame.com/thread-2890351-1-2.html
大地图重置是tome4游戏代码里设置的,据我推测是为了惩罚sl玩家的,sl会影响官网上玩家的游戏数据公正性。 但是,我这类sl狂人不甘心啊.. 于是就弄了个自动存档禁用补丁。仅仅就改了几处代码。 但造成了存档校验数据的不同步,被游戏程序检测出来,直接报应在大地图重置上…抱歉了,各位难兄难弟们。
但是根本原因并非“由于game.teag中的坐标和zone-wilderness.teaz中坐标不匹配”,而是 原游戏代码对存档数据进行了校验,校验数据不符,就直接重置大地图。(不只是大地图,所有场景都是如此)
重置过程如下(非代码狂直接跳到结论): 切换场景时,会对 X:\t-engine4-windows-1.0.0beta37\game\engines\te4-0.9.37\engine\Zone.lua 中的 function _M:getLevel(game, lev, old_lev, no_close) 函数进行调用 执行到 level = savefile_pipe:doLoad(game.save_name, "level", nil, self.short_name, lev) 语句时,如果level不存在(没有通过校验),则目标场景直接重置,重置代码如下:
Newlevel就是害人的大地图重置
跟踪了一下,校验代码在 X:\t-engine4-windows-1.0.0beta37\game\engines\te4-0.9.37\engine\SavefilePipe.lua文件 的function _M:doLoad(savename, type, class, ...)函数中,如下:
其中的 return nil 就是校验失败,
简单说,当存盘的版本不相符就校验失败,level赋值为0,大地图重置 使用了老版自动存档禁用补丁或者游戏黑屏结束游戏可能会造成校验失败,造成大地图重置 我们在这里把代码改成 return ret,就万事大吉了
结论:
已经发生大地图重置的朋友,如果没有进过其他场景,没有存过盘,就还有救(不满足这两个条件,就没救...);
方法是:
1、用记事本打开
X:\t-engine4-windows-1.0.0beta37\game\engines\te4-0.9.37\engine\SavefilePipe.lua
2、ctr-f查找字串 return nil
修改为 return ret
3、保存
4、进入游戏读档并切换场景,看看大地图回来了吗
5、直接用下面附件替换也可
修正之后的自动存档禁用补丁, 第一步:下载SavefilePipe.lua,放置在X:\t-engine4-windows-1.0.0beta37\game\engines\te4-0.9.37\engine\目录下,替换SavefilePipe.lua(一直在用上一版的同学,只需下载这个文件即可) 用英文版的同学把它压缩到:\t-engine4-windows-1.0.0beta37\game\engines的te4-0.9.37.teae里的engine\目录下....
第二步:把一下对应版本附件存入形如X:\t-engine4-windows-1.0.0beta37\game\addons目录下
只适用于b37版本,游戏其他内容未作修改
英文版b37下载:
tome-autosavefix37.teaa
(32.54 KB, 下载次数: 107)
汉化版1.2下载
|