|
|
发表于 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"]));
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|