讓副本內的NPC銷毀副本並且操作副本變量會造成MAP_SERVER崩潰
VanillaIRV opened this issue · 3 comments
VanillaIRV commented
缺陷描述
讓副本內的NPC銷毀副本並且操作副本變量會造成MAP_SERVER崩潰
重现步骤
第一個NPC建立副本,第二個NPC觸發程序崩潰
06guild_08,42,51,3 script CrashMaker 666,{
instance_create("Endless Tower",IM_CHAR);
instance_enter("Endless Tower",50,355,getcharid(0),instance_id(IM_CHAR));
end;
}
1@tower,50,355,3 script CrashMaker#2 666,{
instance_destroy instance_id(IM_CHAR);
dispbottom "我崩潰"+'cccc;
end;
}
程序编译模式 (请完善以下信息):
- 操作系统: Windows 10 x64
- 编译工具: Visual Studio 2019
- 代码版本: 自編譯1.1.4
- 封包版本: 20210107
- 工作模式: 复兴后
CairoLee commented
感谢您的反馈,我将跟进此问题
CairoLee commented
处理结论
已经在 #387 中修正,计划合并到 v1.1.5 中
问题原因
使用 instance_destroy 之后 CrashMaker#2 已经被销毁,但是后面还使用了 'cccc 读取副本变量,因此触发了一处空指针崩溃
修正方案
已经进行了空指针判断,程序不会崩溃了~
但是会提示无法获取 'cccc 的变量值(这是符合预期的)
最佳实践
- 不要在副本中自己尝试调用 instance_destroy 销毁自己所在的副本
- 如果非要这么做,请不要在 instance_destroy 之后还调用此副本的资源(比如副本变量就是这个副本的一种资源,包括所有 instance_ 开头的指令,都可能需要访问这些资源)
- 如果上面例子中的 'cccc 保存的内容非常重要,可以在 instance_destroy 之前用一个用 @ 开头的局部变量保存他,然后在 instance_destroy 之后使用这个局部变量来获取内容
CairoLee commented
此问题已解决,如果还有与其相关的其他情况,可以重新打开此问题