170 lines
7.1 KiB
Plaintext
170 lines
7.1 KiB
Plaintext
function api_copy_mapinfo_items_between_lists(list_dest, list_src) {
|
|
local it = Memory.alloc(4);
|
|
local end = Memory.alloc(4);
|
|
local next = Memory.alloc(4);
|
|
Sq_CallFunc(S_Ptr("0x08152B88"), "int", ["pointer", "pointer"], it.C_Object, list_src.C_Object);
|
|
Sq_CallFunc(S_Ptr("0x08152BBE"), "int", ["pointer", "pointer"], end.C_Object, list_src.C_Object);
|
|
|
|
while (Sq_CallFunc(S_Ptr("0x08311E70"), "bool", ["pointer", "pointer"], it.C_Object, end.C_Object)) {
|
|
local map_item = Sq_CallFunc(S_Ptr("0x08311EBC"), "pointer", ["pointer"], it.C_Object);
|
|
Sq_CallFunc(S_Ptr("0x08152B52"), "pointer", ["pointer", "pointer"], list_dest.C_Object, map_item);
|
|
Sq_CallFunc(S_Ptr("0x08311E84"), "pointer", ["pointer", "pointer"], next.C_Object, it.C_Object);
|
|
}
|
|
}
|
|
|
|
|
|
function validate_pickup_permission(user, drop_id) {
|
|
if (!user || !drop_id) {
|
|
return 1;
|
|
}
|
|
|
|
local SUser = User(user);
|
|
local SParty = SUser.GetParty();
|
|
local SBattleField = SParty.GetBattleField();
|
|
local fit = Memory.alloc(4);
|
|
|
|
local currentMapInfo = Sq_CallFunc(S_Ptr("0x0822CBCC"), "pointer", ["pointer"], SBattleField.C_Object);
|
|
local drop_id_ptr = Memory.alloc(4);
|
|
drop_id_ptr.writeInt(drop_id);
|
|
|
|
Sq_CallFunc(S_Ptr("0x08152532"), "pointer", ["pointer", "pointer", "pointer"], fit.C_Object, NativePointer(currentMapInfo).add(36).C_Object, drop_id_ptr.C_Object);
|
|
|
|
local find_map_item = NativePointer(Sq_CallFunc(S_Ptr("0x081529B4"), "pointer", ["pointer"], fit.C_Object)).add(4);
|
|
if (!find_map_item.C_Object) {
|
|
return 1;
|
|
}
|
|
|
|
local find_map_item_index = find_map_item.readU8();
|
|
if (!find_map_item_index)
|
|
return 0;
|
|
|
|
local find_map_item_partyIndex = find_map_item.add(8).readU32();
|
|
|
|
if (find_map_item_partyIndex< 1 || find_map_item_partyIndex > 4)
|
|
return 0;
|
|
|
|
local cur_partyIndex = -1;
|
|
SParty.ForeachMember(function(PSUser, Index) {
|
|
if (PSUser.GetCID() == SUser.GetCID()) {
|
|
cur_partyIndex = Index + 1;
|
|
}
|
|
});
|
|
|
|
if (cur_partyIndex == find_map_item_partyIndex)
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
|
|
function _Dps_IndependentDrop_Main_() {
|
|
Cb_Battle_Field_MakeDropItems_Enter_Func._DPS_IndepentDrop <- function(args) {
|
|
local SParty = Party(NativePointer(args[0]).readPointer());
|
|
local map_monster_param = NativePointer(Haker.CpuContext.ebp).add(0x10).readPointer();
|
|
local monster_uid = NativePointer(NativePointer(Haker.CpuContext.ebp).add(0x18).readPointer()).readU16();
|
|
|
|
SParty.ForeachMember(function(SUser, Index) {
|
|
local user_item_list = Memory.alloc(8);
|
|
Sq_CallFunc(S_Ptr("0x08152A2C"), "pointer", ["pointer"], user_item_list.C_Object);
|
|
|
|
Sq_CallFunc(S_Ptr("0x0830ADF6"), "void", ["pointer", "pointer", "pointer", "pointer", "int", "int", "int", "int", "int", "pointer", "float", "int"], args[0], user_item_list.C_Object, args[2], args[3], Index + 1, 1, args[6], args[7], args[8], args[9], args[10], args[11]);
|
|
|
|
api_copy_mapinfo_items_between_lists(NativePointer(args[1]), user_item_list);
|
|
|
|
local Pack = Packet();
|
|
Sq_CallFunc(S_Ptr("0x0830B8CC"), "pointer", ["pointer", "pointer", "pointer", "int", "int", "pointer", "pointer"], args[0], Pack.C_Object, user_item_list.C_Object, monster_uid, Index + 1, args[3], map_monster_param);
|
|
SUser.Send(Pack);
|
|
Pack.Delete();
|
|
|
|
Sq_CallFunc(S_Ptr("0x08151F6E"), "pointer", ["pointer"], user_item_list.C_Object);
|
|
});
|
|
|
|
//跳过原逻辑
|
|
Sq_WriteByteArr(S_Ptr("0x830ADFC"), Haker.AsmGenerateMcd(
|
|
"pop ebx",
|
|
"pop esi",
|
|
"pop edi",
|
|
"pop ebp",
|
|
"ret"));
|
|
return null;
|
|
};
|
|
Cb_Battle_Field_MakeDropItems_Leave_Func._DPS_IndepentDrop <- function(args) {
|
|
//还原
|
|
Sq_WriteByteArr(S_Ptr("0x830ADFC"), [0x81, 0xec, 0x7c, 0x01, 0x00, 0x00, 0x8B, 0x55, 0x18]);
|
|
return null;
|
|
}
|
|
|
|
|
|
//跳过原本的怪物死亡掉落包构造
|
|
CBattle_Field_MakeNotiPacketDieMonster_DPS_IndepentDrop_JmpFlag <- false;
|
|
Cb_CBattle_Field_MakeNotiPacketDieMonster_Enter_Func._DPS_IndepentDrop <- function(args) {
|
|
if (Haker.NextReturnAddress == "0x830ce08") {
|
|
local v109 = NativePointer(NativePointer(Haker.CpuContext.ebp).sub(0x90).readPointer());
|
|
local v106 = NativePointer(Haker.CpuContext.ebp).sub(0x96)
|
|
if (v109.add(44).readU32() == 100 && v106.readU8() != 1 && NativePointer(args[0]).add(109 * 4).readU32() != 1) {
|
|
//跳过原逻辑
|
|
Sq_WriteByteArr(S_Ptr("0x830B8D3"), Haker.AsmGenerateMcd(
|
|
"add esp , 64",
|
|
"pop ebx",
|
|
"pop ebp",
|
|
"ret"));
|
|
CBattle_Field_MakeNotiPacketDieMonster_DPS_IndepentDrop_JmpFlag = true;
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
Cb_CBattle_Field_MakeNotiPacketDieMonster_Leave_Func._DPS_IndepentDrop <- function(args) {
|
|
if (CBattle_Field_MakeNotiPacketDieMonster_DPS_IndepentDrop_JmpFlag) {
|
|
CBattle_Field_MakeNotiPacketDieMonster_DPS_IndepentDrop_JmpFlag = false;
|
|
Sq_WriteByteArr(S_Ptr("0x830B8D3"), [0x8B, 0x45, 0x18, 0x66, 0x89, 0x45, 0xB4, 0x8B, 0x45, 0x0C]);
|
|
return 1;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
//跳过原本的怪物死亡掉落包队伍发包
|
|
CParty_send_to_party_DPS_IndepentDrop_JmpFlag <- false;
|
|
Cb_CParty_send_to_party_Enter_Func._DPS_IndepentDrop <- function(args) {
|
|
if (Haker.NextReturnAddress == "0x85a39db" && Sq_CallFunc(S_Ptr("0x0848F438"), "int", ["pointer"], args[1]) == 0) {
|
|
//跳过原逻辑
|
|
Sq_WriteByteArr(S_Ptr("0x859D154"), Haker.AsmGenerateMcd(
|
|
"add esp , 28",
|
|
"pop ebp",
|
|
"ret"));
|
|
CParty_send_to_party_DPS_IndepentDrop_JmpFlag = true;
|
|
}
|
|
return null;
|
|
};
|
|
Cb_CParty_send_to_party_Leave_Func._DPS_IndepentDrop <- function(args) {
|
|
if (CParty_send_to_party_DPS_IndepentDrop_JmpFlag) {
|
|
Sq_WriteByteArr(S_Ptr("0x859D154"), [0xC7, 0x45, 0xF4, 0x00, 0x00, 0x00, 0x00]);
|
|
return 0;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
//DisPatcher_GetItem::check_error 校验用户是否非法捡取物品
|
|
Cb_GetItem_Check_Error_Leave_Func._DPS_IndepentDrop <- function(args) {
|
|
local user = NativePointer(Haker.CpuContext.ebp).add(0xc).readPointer();
|
|
local msg_base = NativePointer(Haker.CpuContext.ebp).add(0x10).readPointer();
|
|
local drop_id = NativePointer(msg_base).add(13).readU16();
|
|
local res = validate_pickup_permission(user, drop_id);
|
|
return res;
|
|
};
|
|
|
|
//跳过物品掷点
|
|
Cb_CItem_check_item_routing_Leave_Func._DPS_IndepentDrop <- function(args) {
|
|
return false;
|
|
};
|
|
|
|
//取消队友分金币
|
|
Cb_CParty_get_live_count_enter_map_Leave_Func._DPS_IndepentDrop <- function(args) {
|
|
return 1;
|
|
};
|
|
|
|
//SS免确认
|
|
Cb_CItem_IsRoutingItem_Leave_Func._DPS_IndepentDrop <- function(args) {
|
|
return 0;
|
|
}
|
|
Sq_WriteByteArr(S_Ptr("0x085A56D0"), [9]);
|
|
Sq_WriteByteArr(S_Ptr("0x085A41D1"), [0xB8, 0x00, 0x00, 0x00, 0x00, 0x90]);
|
|
} |