|  | 
 
 发表于 2025-10-4 17:23:59
|
显示全部楼层 
| //修复卡镇魂 var setCharacInfoDetail = new NativeFunction(ptr(0x0864AC1A), "int", ["pointer", "int", "int", "pointer"], { abi: "sysv" });
 function fix_SaveTown() {
 Interceptor.replace(setCharacInfoDetail, new NativeCallback(function (pUser, a2, a3, pCHARAC_DATA) {
 // 1. 缓存原始的城镇编号 (a4+34)
 var curArea = Memory.readU8(pCHARAC_DATA.add(34));
 console.log("curArea", curArea)//城镇编号
 console.log("a2", a2)//第几个位置
 console.log("a3", a3)//CID
 console.log("pCHARAC_DATA", pCHARAC_DATA)//一个基址
 // 2. 调用原函数
 var result = setCharacInfoDetail(pUser, a2, a3, pCHARAC_DATA);
 // 获取角色信息数组的地址 (this + 497384)
 var vectorAddr = pUser.add(497384);
 // 获取vector中的begin指针 (首个元素地址)
 var begin = Memory.readPointer(vectorAddr);
 // 手动计算元素大小(经验值,重要!)根据数据结构大小调整为4788(按IDA分析)
 var CHARAC_INFO_SIZE = 5329; // 需根据版本验证,这里是关键偏移
 // 计算第a2个角色的地址 = begin + a2 * 元素大小
 var charInfoPtr = begin.add(a2 * CHARAC_INFO_SIZE);
 console.log("charInfoPtr:", charInfoPtr)
 // 修改城镇编号 (charInfoPtr + 34)
 // 3. 如果是镇魂 (13) 或时间门 (12),强制修改为修南 (11)
 if (curArea === 12 || curArea === 13) {
 Memory.writeU8(charInfoPtr.add(34), 11); // 强制设成11
 } if (curArea === 14) {
 Memory.writeU8(charInfoPtr.add(34), 14); // 强制设成14
 }
 return result;
 }, "int", ["pointer", "int", "int", "pointer"]));
 }
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?立即注册 
  |