找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 182|回复: 0

[教程] 北斗插件修改StringPool汉化和新增自定义的字符串组

[复制链接]

33

主题

12

回帖

99

积分

管理员

积分
99
发表于 2025-1-16 00:10:38 | 显示全部楼层 |阅读模式
本贴主要讲讲如何修改或新增北斗插件中StringPool的汉化

冒险岛的客户端里存在这么一个方法StringPool:使用 id 获取字符串。在客户端里直接搜索是无法搜到这部分字符串的。

好在有大佬提供了一个专门的工具 STREDIT.exe 可以把客户端里的 StringPool 导出来。这里原版的 StringPool 我已经导出在下面可以下载。

导出文件的格式是 id;"字符串"

那么插件是如何对这部分内容进行汉化的呢?

先看代码

  1. _StringPool__GetString_t _StringPool__GetString_Hook = [](void* pThis, void* edx, ZXString<char>* result, unsigned int nIdx, char formal) ->  ZXString<char>*
  2. {
  3.         auto ret = _StringPool__GetString(pThis, edx, result, nIdx, formal);
  4.         if (nIdx == 1163)
  5.         {
  6.                 *ret = "BeiDou";
  7.         }
  8.         switch (nIdx)
  9.         {
  10.                 case 1307:        //1307_UI_LOGINIMG_COMMON_FRAME = 51Bh
  11.                         if (EzorsiaV2WzIncluded && !ownLoginFrame) {
  12.                                 switch (Client::m_nGameWidth)
  13.                                 {
  14.                                         case 1280:        //ty teto for the suggestion to use ZXString<char>::Assign and showing me available resources
  15.                                                 *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1280"); break;
  16.                                         case 1366:
  17.                                                 *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1366"); break;
  18.                                         case 1600:
  19.                                                 *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1600"); break;
  20.                                         case 1920:
  21.                                                 *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1920"); break;
  22.                                         case 1024:
  23.                                                 *ret = ("UI/MapleEzorsiaV2wzfiles.img/Common/frame1024"); break;
  24.                                 }
  25.                                 break;
  26.                         }
  27.                 case 1301:        //1301_UI_CASHSHOPIMG_BASE_BACKGRND  = 515h
  28.                         if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd"); } break;
  29.                 case 1302:        //1302_UI_CASHSHOPIMG_BASE_BACKGRND1 = 516h
  30.                         if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd1"); } break;
  31.                 case 5361:        //5361_UI_CASHSHOPIMG_BASE_BACKGRND2  = 14F1h                        
  32.                         if (EzorsiaV2WzIncluded && !ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd2"); } break;
  33.                 //case 1302:        //BACKGRND??????
  34.                 //        if (EzorsiaV2WzIncluded && ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd1"); } break;
  35.                 //case 5361:        //SP_1937_UI_UIWINDOWIMG_STAT_BACKGRND2  = 791h        
  36.                 //        if (EzorsiaV2WzIncluded && ownCashShopFrame) { *ret = ("UI/MapleEzorsiaV2wzfiles.img/Base/backgrnd2"); } break;
  37.                 default:
  38.                         if (Client::SwitchChinese)
  39.                         {
  40.                                 for (const auto& pair : newKeyValuePairs) {
  41.                                         if (nIdx == pair.key) {
  42.                                                 *ret = pair.value.c_str();
  43.                                                 break;
  44.                                         }
  45.                                 }
  46.                         }
  47.                         break;
  48.         }
  49.         return ret;
  50. };
复制代码

原理很简单 1 拦截调用 SP 的方法,先调用一遍原函数,获取构造后的结构体,然后根据 id 修改结构体内的字符串返回,就完成了替换。

因此如果你想对汉化结果进行修改或者新增汉化的话,只需要

打开北斗插件的 ReplacementFuncs.h 文件,搜索
  1. KeyValuePair newKeyValuePairs[] = {
复制代码
里面有很多已经汉化的内容,并且 id 都是按顺序排好的,如果你要修改汉化结果的话,只需要查找到对应的 id,把后面的内容修改掉就可以了。如果 id 不存在的话就自己添加一组键值对进去即可。

注意:

因为要调用一遍原方法,所以如果你要添加的 id 本身就不存在于 StringPool (id>5657 GMSv083的上限)原方法就会报错。

所以如果你要新增自定义的 id 的话,你需要修改这里面的代码逻辑

在代码 auto ret 前面插入下面这段代码即可,当然里面的自定义部分你要自行修改


  1.         if (nIdx > 5657)
  2.         {
  3.             auto ret = _StringPool__GetString(pThis, edx, result, 1, formal);

  4.             if (nIdx == 8888)
  5.             {
  6.                 *ret = "返回8888";
  7.             }
  8.             return ret;
  9.         }
复制代码

STREDIT 下载:https://mega.nz/file/2SAmDQwJ#q9 ... TaYUG9V_HUVwBnwlhtU

GMSv83 StringPool 下载:https://mega.nz/file/PeBhVDaI#79 ... T2F-xbeYboSR0DvIbaM


我尽可能地不设置回复可见,希望让跟帖更有质量,有问题欢迎跟帖提问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|蘑菇物语

GMT+8, 2025-4-19 16:15 , Processed in 0.047672 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表