PandasWS/Pandas

讓副本內的NPC銷毀副本並且操作副本變量會造成MAP_SERVER崩潰

VanillaIRV opened this issue · 3 comments

缺陷描述

讓副本內的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
  • 工作模式: 复兴后

感谢您的反馈,我将跟进此问题

处理结论

已经在 #387 中修正,计划合并到 v1.1.5 中

问题原因

使用 instance_destroy 之后 CrashMaker#2 已经被销毁,但是后面还使用了 'cccc 读取副本变量,因此触发了一处空指针崩溃

修正方案

已经进行了空指针判断,程序不会崩溃了~
但是会提示无法获取 'cccc 的变量值(这是符合预期的)

最佳实践

  • 不要在副本中自己尝试调用 instance_destroy 销毁自己所在的副本
  • 如果非要这么做,请不要在 instance_destroy 之后还调用此副本的资源(比如副本变量就是这个副本的一种资源,包括所有 instance_ 开头的指令,都可能需要访问这些资源)
  • 如果上面例子中的 'cccc 保存的内容非常重要,可以在 instance_destroy 之前用一个用 @ 开头的局部变量保存他,然后在 instance_destroy 之后使用这个局部变量来获取内容

此问题已解决,如果还有与其相关的其他情况,可以重新打开此问题