北斗插件修改StringPool汉化和新增自定义的字符串组
本贴主要讲讲如何修改或新增北斗插件中StringPool的汉化冒险岛的客户端里存在这么一个方法StringPool:使用 id 获取字符串。在客户端里直接搜索是无法搜到这部分字符串的。
好在有大佬提供了一个专门的工具 STREDIT.exe 可以把客户端里的 StringPool 导出来。这里原版的 StringPool 我已经导出在下面可以下载。
导出文件的格式是 id;"字符串"
那么插件是如何对这部分内容进行汉化的呢?
先看代码
_StringPool__GetString_t _StringPool__GetString_Hook = [](void* pThis, void* edx, ZXString<char>* result, unsigned int nIdx, char formal) ->ZXString<char>*
{
auto ret = _StringPool__GetString(pThis, edx, result, nIdx, formal);
if (nIdx == 1163)
{
*ret = "BeiDou";
}
switch (nIdx)
{
case 1307: //1307_UI_LOGINIMG_COMMON_FRAME = 51Bh
if (EzorsiaV2WzIncluded && !ownLoginFrame) {
switch (Client::m_nGameWidth)
{
case 1280: //ty teto for the suggestion to use ZXString<char>::Assign and showing me available resources
*ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1280"); break;
case 1366:
*ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1366"); break;
case 1600:
*ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1600"); break;
case 1920:
*ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1920"); break;
case 1024:
*ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1024"); break;
}
break;
}
case 1301: //1301_UI_CASHSHOPIMG_BASE_BACKGRND= 515h
if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd"); } break;
case 1302: //1302_UI_CASHSHOPIMG_BASE_BACKGRND1 = 516h
if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd1"); } break;
case 5361: //5361_UI_CASHSHOPIMG_BASE_BACKGRND2= 14F1h
if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd2"); } break;
//case 1302: //BACKGRND??????
// if (EzorsiaV2WzIncluded && ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd1"); } break;
//case 5361: //SP_1937_UI_UIWINDOWIMG_STAT_BACKGRND2= 791h
// if (EzorsiaV2WzIncluded && ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd2"); } break;
default:
if (Client::SwitchChinese)
{
for (const auto& pair : newKeyValuePairs) {
if (nIdx == pair.key) {
*ret = pair.value.c_str();
break;
}
}
}
break;
}
return ret;
};
原理很简单 1 拦截调用 SP 的方法,先调用一遍原函数,获取构造后的结构体,然后根据 id 修改结构体内的字符串返回,就完成了替换。
因此如果你想对汉化结果进行修改或者新增汉化的话,只需要
打开北斗插件的 ReplacementFuncs.h 文件,搜索
KeyValuePair newKeyValuePairs[] = {里面有很多已经汉化的内容,并且 id 都是按顺序排好的,如果你要修改汉化结果的话,只需要查找到对应的 id,把后面的内容修改掉就可以了。如果 id 不存在的话就自己添加一组键值对进去即可。
注意:
因为要调用一遍原方法,所以如果你要添加的 id 本身就不存在于 StringPool (id>5657 GMSv083的上限)原方法就会报错。
所以如果你要新增自定义的 id 的话,你需要修改这里面的代码逻辑
在代码 auto ret 前面插入下面这段代码即可,当然里面的自定义部分你要自行修改
if (nIdx > 5657)
{
auto ret = _StringPool__GetString(pThis, edx, result, 1, formal);
if (nIdx == 8888)
{
*ret = "返回8888";
}
return ret;
}
STREDIT 下载:https://mega.nz/file/2SAmDQwJ#q9 ... TaYUG9V_HUVwBnwlhtU
GMSv83 StringPool 下载:https://mega.nz/file/PeBhVDaI#79 ... T2F-xbeYboSR0DvIbaM
页:
[1]