MoeHero
MoeHero copied to clipboard
老图中使用lua调用cj部分关键函数魔兽程序崩溃
@sumneko 我把 MoeHero 项目的一部分代码加入了一张slk优化过的老图中
- scripts/main.lua
local function main()
require 'war3.id'
require 'war3.api'
require 'util.log'
-- 当导入这个模块里面导入的 'ac.timer' 模块 85行调用cj的计时器函数发生了崩溃
require 'ac.init'
require 'util.error'
-- 我自定义的触发
require 'test.main'
end
- scripts/test/main.lua
local CJ = require 'jass.common'
local message = require 'jass.message'
local trig = CJ.CreateTrigger()
local g = require 'jass.globals'
CJ.TriggerRegisterPlayerEvent(trig,CJ.Player(0),g.EVENT_PLAYER_END_CINEMATIC)
-- ESC 调用时崩溃
CJ.TriggerAddCondition( trig,
CJ.Condition(
function()
print("test")
return true
end
)
)
CJ.TriggerAddAction(trig,function()
local x, y = message.mouse()
print(x, y)
end
)
一开始我以为是那行代码引起的问题,当我把require 'ac.init'
注释后,此时可以进游戏了,但当我调用自己编写的触发函数时发现一样会崩溃,确定了问题出在当我调用 'jass.common' 模块中 计时器和触发事件动作就会发生崩溃。
这个崩溃问题只在一张老图中出现,图本身是加密过的,我是通过注入部分文件实现lua功能,但是我在ydwe中新创建的地图注入同样的代码并不会发生程序崩溃。
- jass.globals 全局函数全部能读取说明接口是没问题的
- Player(n) 之类的函数也能用
以下三个函数都会崩溃
TimerStart
TriggerRegisterPlayerEvent
TriggerAddAction
好像出现问题的地方都是因为使用了匿名函数
,能力有限不知道具体原因是什么。
2020.6.19
经过多次排查最后发现问题是发生在 war3map.j 文件中的主入口 mian 函数里面的
- war3map.j
mian
xxx
call Cheat("exec-lua:lua.base")
call InitGlobals()
// 问题出在这里 初始化游戏触发
call InitCustomTriggers()
xxx
最后定位到崩溃的地方,是在初始化触发中的一个很普通的触发函数体内,里面的一句call TriggerRegisterPlayerEvent
引发的报错,但这句代码本身没有问题。我测试过即便是我重新定义的触发器也会报错。
会不会是触发数量过多导致下标溢出?初始化触发的数量大概140+ 左右。
最后同问这个问题,如何在魔兽中进行lua单步调试 #23
你解决了吗~
https://github.com/actboy168/YDWE/issues/197
你解决了吗~
还没