leevccc 发表于 2025-1-16 00:10:38

北斗插件修改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]
查看完整版本: 北斗插件修改StringPool汉化和新增自定义的字符串组