PandasWS / Pandas

熊猫模拟器 - 基于 rAthena 构建的中文仙境传说模拟器(欢迎加入QQ交流群:928171346)
https://pandas.ws
GNU General Public License v3.0
154 stars 79 forks source link

修正 prompt 选择取消后使用 close 系列指令会导致报错的问题 #678

Closed CairoLee closed 1 year ago

CairoLee commented 1 year ago

感谢 "差记性的小北" 反馈此问题

测试脚本

prontera,153,155,4  script  testttttt   123,{
    mes "很高兴为你服务!";
    .@s = prompt("投注","兑奖","说明");
    if(.@s == 3){
        mes "3";
    }else if(.@s == 1){
        mes "1";
    }else if(.@s == 2){
        mes "2";
    }else{
        mes "其他";
    }
    close;
}

重现方法

与测试 npc 对话,出来的菜单中直接点【取消】

预期表现

各项功能一切正常

实际情况

地图服务器跳出来一个调试信息:

[调试]: npc_scriptcont: testttttt (sd->npc_id=110026153) is not 'Unknown NPC' (id=0).

分析一下

同样的脚本使用 select 菜单则不存在问题,因为当 select 被取消后脚本将中断。 但 prompt 菜单被取消后脚本依然会继续执行,执行到 close 脚本指令的时候,会暗示客户端: 关闭聊天窗口需要给我发一个 clif_parse_NpcCloseClicked 封包 但此时发现送来的封包中 npc_id 是 0(客户端内部可能把 npc_id 清理掉了)

补丁方案

为了避免对后续流程造成不可预期的其他影响,在菜单被取消的时候我们记录一下 npc_id;随后在出现 prompt 取消的这种情况时,将优先使用备份的 npc_id 来进行后续流程