actboy168 / MoeHero

我的英雄不可能那么萌
GNU General Public License v3.0
80 stars 38 forks source link

老图中使用lua调用cj部分关键函数魔兽程序崩溃 #25

Closed Sdator closed 1 year ago

Sdator commented 4 years ago

@sumneko 我把 MoeHero 项目的一部分代码加入了一张slk优化过的老图中

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' 模块中 计时器和触发事件动作就会发生崩溃。 

![1](https://user-images.githubusercontent.com/17621623/84989595-8131c000-b176-11ea-8eaa-d131da677932.png)

>这个崩溃问题只在一张老图中出现,图本身是加密过的,我是通过注入部分文件实现lua功能,但是我在ydwe中新创建的地图注入同样的代码并不会发生程序崩溃。

+ jass.globals 全局函数全部能读取说明接口是没问题的
+ Player(n)  之类的函数也能用

以下三个函数都会崩溃

    TimerStart
    TriggerRegisterPlayerEvent
    TriggerAddAction

好像出现问题的地方都是因为使用了`匿名函数`,能力有限不知道具体原因是什么。

## 2020.6.19

经过多次排查最后发现问题是发生在 war3map.j 文件中的主入口 mian 函数里面的
+ war3map.j
```c
mian
   xxx
   call Cheat("exec-lua:lua.base")
   call InitGlobals()
   // 问题出在这里 初始化游戏触发
   call InitCustomTriggers()
   xxx

最后定位到崩溃的地方,是在初始化触发中的一个很普通的触发函数体内,里面的一句call TriggerRegisterPlayerEvent引发的报错,但这句代码本身没有问题。我测试过即便是我重新定义的触发器也会报错。 会不会是触发数量过多导致下标溢出?初始化触发的数量大概140+ 左右。

Silent-zzz commented 4 years ago

你解决了吗~

w4454962 commented 4 years ago

https://github.com/actboy168/YDWE/issues/197

Sdator commented 4 years ago

你解决了吗~

还没

Sdator commented 4 years ago

actboy168/YDWE#197

看来你和我碰到差不多的问题,你使用什么方法解决的? 我尝试过使用全局变量 code 调用也一样会报错,不单单是闭包问题。

SimpleY commented 1 month ago

@Sdator 我这边也碰上这个问题,你那边现在解决了吗?