一、问题现象

热心群友反馈:《肥羊的圣诞礼物》在更新1.50后,当地图开始刷怪时直接闪退无法游戏

二、问题跟踪

使用JASS崩溃追踪工具对问题进行定位,得到以下信息:

魔兽地图《肥羊的圣诞礼物》崩溃问题排查.jpg

解读:
当弹出这个告警窗口时,就说明问题是由触发引起的闪退。问题函数是Exp_Plus,问题点在ConvertedPlayer。

三、war3map.j定位

function Exp_Plus takes nothing returns nothing
    local integer n = GetPlayerId(GetEnumPlayer())
    set ExpGo[n] = ExpGo[n] + 1
    call DzAPI_Map_StoreInteger(ConvertedPlayer(n), "jifen", ExpGo[n])
endfunction

DzAPI_Map_StoreInteger这条动作是KK平台的服务器整数存档,ConvertedPlayer是转换玩家ID为玩家,最小值1,最大值是16.

而n是作者定义的局部整数变量,通过GetPlayerId(玩家ID-1),最小值是0,最大值是15.

所以两者冲突了!

四、解决办法

ConvertedPlayer(n)改成ConvertedPlayer(n + 1)即可,完整如下:

function Exp_Plus takes nothing returns nothing
    local integer n = GetPlayerId(GetEnumPlayer())
    set ExpGo[n] = ExpGo[n] + 1
    call DzAPI_Map_StoreInteger(ConvertedPlayer(n + 1), "jifen", ExpGo[n])
endfunction

五、测试效果

积分存档恢复正常!
魔兽地图《肥羊的圣诞礼物》崩溃问题排查2.jpg

六、总结

魔兽地图崩溃主要有三种情况
1、触发错误,即没有遵守jass语法。我们今天就是遇到这种情况。
2、误删jass标点。常见于对war3map.j汉化或直接修改的情形。
3、排泄不当造成内存崩溃。案例《肥羊的新年之旅》