感谢xueguangfly的指导!
肥羊镇的二创作者从EX27.5开始重写了save/load触发,直接导致了中文ID可以存档,但是没办法读档的问题。
本羊之前有幸因为《黑暗之路ORPG》认识了大佬xueguangfly。当时他找到我说,《黑暗之路ORPG》是一张经典的魔兽ORPG地图,想优化一下《黑暗之路ORPG》,让它能够支持中文ID存读档,并开启“禁止单机游戏”防止作弊。
万万没想到《肥羊镇最后的30分钟》也有不支持中文ID的这一天。
一、核心思路
把玩家ID转换为哈希值,再把哈希值转换为字符串。
二、精简步骤
第1步:找到save/load的触发。
第2步:尝试在save/load触发里找到对GetPlayerName的处理。
第3步:如果在save/load触发里找不到,那么就得去触发外找。
三、具体案例
首先来看肥羊镇的save触发的动作。
我们在游戏里输入-save存档时,会看到屏幕出现存档成功的提示文本。(对应下面代码前2行)
而你的积分代码就是存在“魔兽根目录/30min Saves/你的游戏ID/-load 积分.txt”中。(对应下面代码第3行)
call DisplayTimedTextToPlayer(pl,0.,0.,30.,"|cFF07EDE6您获得的积分:|cFFFFDC00 "+I2S(udg_PlayerExp[i]))
call DisplayTimedTextToPlayer(pl,0.,0.,30.,"|cFF07EDE6您的积分代码:|cFFFFDC00 -load "+fc)
call DisplayTimedTextToPlayer(pl,0.,0.,30.,"|cFF07EDE6积分代码保存在文件夹中|cFFFFDC00''30min Saves''|r, |cFF07EDE你可以在游戏目录中找到这个文件夹。|r")
if GetLocalPlayer()==pl then
call Preload(fc)
call PreloadGenEnd("30min Saves\\"+Pname[i]+"\\Exp{"+I2S(udg_PlayerExp[i])+"}\\-load "+fc+".txt")
call PreloadGenClear()
endif
set pl=null
endfunction
不难发现,Pname[i]指的就是触发玩家的ID。
但是我们在save触发里并没有发现,Pname[i]和GetPlayerName有关联。
直到我们在gg_trg_IMET触发里发现了以下触发动作:
function Trig_IMET_Actions takes nothing returns nothing
call PreloadGenClear()
set Pname[1]=GetPlayerName(Player(0))
set Pname[2]=GetPlayerName(Player(1))
set Pname[3]=GetPlayerName(Player(2))
set Pname[4]=GetPlayerName(Player(3))
set Pname[5]=GetPlayerName(Player(4))
set Pname[6]=GetPlayerName(Player(5))
set Pname[7]=GetPlayerName(Player(6))
set Pname[8]=GetPlayerName(Player(7))
endfunction
二创作者在地图初始化时,使用字符串变量组Pname储存了默认的8个玩家的ID。因此,我们需要需要略加修改的就是这里,具体如下:
set Pname[1]=I2S(StringHash(GetPlayerName(Player(0))))
set Pname[2]=I2S(StringHash(GetPlayerName(Player(1))))
set Pname[3]=I2S(StringHash(GetPlayerName(Player(2))))
set Pname[4]=I2S(StringHash(GetPlayerName(Player(3))))
set Pname[5]=I2S(StringHash(GetPlayerName(Player(4))))
set Pname[6]=I2S(StringHash(GetPlayerName(Player(5))))
set Pname[7]=I2S(StringHash(GetPlayerName(Player(6))))
set Pname[8]=I2S(StringHash(GetPlayerName(Player(7))))
经过测试,这个方法时可行的。缺点就是储存积分代码的文件夹不再以玩家ID命名,而是以玩家ID的哈希值命名。虽然我能在存储路径使用GetPlayerName来修正,但是我不喜欢乱码的文件夹名字。
之前有想過用其他加密方法來代替但是能當作標識的加密對象只有ID StringHash以外又讀不到ASCII以外的字元很麻煩,暫時沒什麼好方法
这个只是解决中文ID读档的问题。如果你是save/load的问题,可以去参考下韩国ORPG那套触发。
我的錯對沒錯原生是StringHash,這方法由於不穩定讀黨有機會失敗我的地圖就有這問題新版肥羊也有這問題,可能要想一下其他加密方法來代替
是StringHashBJ()吧