This commit is contained in:
lenheart
2025-04-05 22:03:40 +08:00
parent 4d65103501
commit eeb773e723
53 changed files with 2348 additions and 505 deletions

View File

@@ -474,71 +474,6 @@ function splitItemList(item_list, maxSlots) {
return result;
}
//角色类 发送邮件函数 (标题, 正文, 金币, 道具列表[[3037,100],[3038,100]])
function User::ReqDBSendMultiMail(title, text, gold, item_list) {
local Cid = this.GetCID();
// 获取分割后的道具列表
local subLists;
local maxSlots = 10;
local length = item_list.len();
if (length <= maxSlots) {
subLists = [item_list];
} else {
subLists = [];
for (local i = 0; i< length; i += maxSlots) {
local end = i + maxSlots;
if (end > length) {
end = length;
}
subLists.append(item_list.slice(i, end));
}
}
if (subLists) {
// 为每个子列表发送邮件
for (local i = 0; i< subLists.len(); ++i) {
local subList = subLists[i];
// 添加道具附件
local vector = Memory.alloc(100);
Sq_CallFunc(S_Ptr("0x81349D6"), "pointer", ["pointer"], vector.C_Object);
Sq_CallFunc(S_Ptr("0x817A342"), "pointer", ["pointer"], vector.C_Object);
//将所有要发送的道具写入Vector
for (local j = 0; j< subList.len(); ++j) {
//道具ID 分配4字节内存
local item_id = Memory.alloc(4);
//道具数量 分配4字节内存
local item_cnt = Memory.alloc(4);
//写入道具ID和数量
item_id.writeInt(subList[j][0]);
item_cnt.writeInt(subList[j][1]);
local pair = Memory.alloc(100);
Sq_CallFunc(S_Ptr("0x81B8D41"), "pointer", ["pointer", "pointer", "pointer"], pair.C_Object, item_id.C_Object, item_cnt.C_Object);
Sq_CallFunc(S_Ptr("0x80DD606"), "pointer", ["pointer", "pointer"], vector.C_Object, pair.C_Object);
}
// 邮件支持10个道具附件格子
local addition_slots = Memory.alloc(1000);
for (local j = 0; j< 10; ++j) {
Sq_CallFunc(S_Ptr("0x80CB854"), "pointer", ["pointer"], addition_slots.add(j * 61).C_Object);
}
Sq_CallFunc(S_Ptr("0x8556A14"), "int", ["pointer", "pointer", "int"], vector.C_Object, addition_slots.C_Object, 10);
local title_ptr = Memory.allocUtf8String(title); // 邮件标题
local text_ptr = Memory.allocUtf8String(text); // 邮件正文
local text_len = text.len(); // 邮件正文长度
// 发邮件给角色
Sq_CallFunc(S_Ptr("0x8556B68"), "int", ["pointer", "pointer", "int", "int", "int", "pointer", "int", "int", "int", "int"], title_ptr.C_Object, addition_slots.C_Object, subList.len(), gold, Cid, text_ptr.C_Object, text_len, 0, 99, 1);
}
}
}
function WongWork_CQuestClear_isClearedQuest(QuestInfo, QuestID) {
@@ -640,38 +575,6 @@ function User::MainTaskCompleted() {
}
function User::DropItem(ItemId, Xpos, Ypos) {
local PartyObj = GetParty();
if (!PartyObj) return;
//更改掉落物的坐标
NativePointer("0x085A7599").writeShort(Xpos);
NativePointer("0x085A759F").writeShort(Ypos);
//申请一块内存用于存放包地址
local PackBuffer = Memory.alloc(8);
PackBuffer.writeInt(947330670);
local StrBuffer = "" + PackBuffer.C_Object;
local AddressStr = StrBuffer.slice(StrBuffer.find("0x") + 2, -1);
local HexCode = Haker.AsmGenerateMcd(
"mov ebx," + AddressStr,
"mov [ebx], eax",
"mov ebx , 0",
"mov eax, 0x85A775B",
"jmp eax");
Haker.InsertCode("0x85A773C", HexCode);
//调用逻辑 包才会生成
Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, this.C_Object, ItemId);
local Pack = Packet(PackBuffer.readPointer());
Send(Pack);
//销毁包
Sq_CallFunc(S_Ptr("0x858DE80"), "void", ["pointer"], Pack.C_Object);
//还原逻辑
Sq_WriteByteArr(S_Ptr("0x85A773C"), [0x89, 0x44, 0x24, 0x04, 0x8B, 0x45, 0x08]);
NativePointer("0x085A7599").writeShort(300);
NativePointer("0x085A759F").writeShort(240);
}
Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
@@ -687,196 +590,196 @@ Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
};
Timer.SetTimeOut(function() {
// Haker.LoadHook("0x0834F776", ["pointer", "int", "int"],
// function(args) {
// print(args[0]);
// print(args[1]);
// return null;
// },
// function(args) {
// print(args[2]);
// return null;
// });
Haker.LoadHook("0x0830BC78", ["pointer", "pointer", "pointer", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
getroottable().LashKillMonsterId <- NativePointer(args[2]).add(3 * 4).readInt();
return null;
});
Haker.LoadHook("0x085A27E8", ["pointer", "pointer", "short", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
//杀死怪物了 要判断是否掉落
//获取队伍
local PartyObj = Party(args[0]);
//获取战斗对象
local BattleFieldObj = PartyObj.GetBattleField();
//怪物等级
local MonsterLevel = NativePointer(args[4]).add(2605).readInt();
print("怪物等级: " + MonsterLevel);
//怪物ID
local MonsterId = getroottable().LashKillMonsterId;
print("怪物ID: " + MonsterId);
//坐标
local Xpos = NativePointer(args[4]).add(2596).readShort();
local Ypos = NativePointer(args[4]).add(2598).readShort();
print("坐标: " + Xpos + "," + Ypos);
local DgnObj = BattleFieldObj.GetDgn();
//副本名称
local DgnName = DgnObj.GetName();
print("副本名称: " + DgnName);
//副本ID
local DgnId = DgnObj.GetId();
print("副本ID: " + DgnId);
//副本等级
local DgnLevel = DgnObj.GetMinLevel();
print("副本等级: " + DgnLevel);
//深渊标识
local HellDiff = BattleFieldObj.GetHellDifficulty();
print("深渊标识: " + HellDiff);
for (local i = 0; i< 4; i++) {
local SUser = PartyObj.GetUser(i);
if (SUser) {
SUser.DropItem(MathClass.Rand(3033, 3042), Xpos, Ypos);
// print("玩家名称: " + SUser.GetCharacName());
}
}
return null;
});
//修改独立掉落原逻辑为不掉落
local HexCode = Haker.AsmGenerateMcd(
"mov eax, 0x830CD5D",
"jmp eax");
Haker.InsertCode("0x830CCE2", HexCode);
// local HexCode = Haker.AsmGenerateMcd(
// "mov eax,0x666",
// "mov ebx,0x86B1B98",
// "jmp ebx");
// Haker.InsertCode("0x86B1B93", HexCode);
// local RandNum = Sq_CallFunc(S_Ptr("0x086B1B87"), "int", ["int"], -6);
// print("返回的随机值: " + RandNum);
//公有方法 获取本机IP
// local MyIp = Http.GetMyIp();
// print(MyIp);
//私有方法 发送Get请求
// local SO = Http("www.baidu.com");
// local BaiduBody = SO.Get("/");
// print(BaiduBody);
//私有方法 发送带参数的Post请求
// local SO = Http("192.168.200.189","1311");
// local Res = SO.Post("/",{username = "lenheart", password = "123456"});
// // 创建一个Http Server
// local HS = HttpServer("0.0.0.0","41817");
// HS.Listen(function (SocketObject,Msg)
// {
// // print("收到请求内容: " + Msg);
// //回复字符串
// //SocketObject.Write("hello world");
// //回复Json 直接Write Table就是Json
// SocketObject.Write({
// user = "lenheart",
// msg = "hello world",
// time = clock()
// });
// });
//初始化PVF 可传路径 可不传
// Script();
//读取装备List 读取完的内容在这个Buffer里
// local Buffer = ScriptData.GetFileData("equipment/equipment.lst", function(DataTable, Data) {
// while (!Data.Eof()) {
// local Key = Data.Get();
// //注册装备列表 路径写入 数据未读取
// DataTable.rawset(Key, {
// Path = Data.Get(),
// Data = null
// });
// }
// print("加载装备List完成, 共" + DataTable.len() + "个");
// });
// 读取某一件装备的数据
// local Buffer = ScriptData.GetFileData("equipment/character/swordman/weapon/hsword/lgcy_agitto_nitras.equ", function(DataTable, Data) {
// while (!Data.Eof()) {
// local Buf = Data.Get();
// print(Buf);
// }
// });
// Script();
// local Tim = clock();
// local Buffer = ScriptData.GetFileData("etc/independent_drop.etc", function(DataTable, Data) {
// while (!Data.Eof()) {
// local Buf = Data.Get();
// }
// });
// print("耗时: " + (clock() - Tim));
// Haker.InsertCode("0x86B1B93", [0xB8, 0x06, 0x00, 0x00, 0x00, 0xBB, 0x98, 0x1B, 0x6B, 0x08, 0xFF, 0xE3]);
// local RandNum = Sq_CallFunc(S_Ptr("0x086B1B87"), "int", ["int"], -6);
// print("返回的随机值: " + RandNum);
}, 1);
ClientSocketPackFuncMap.rawset(21091001, function (SUser, Jso)
{
ClientSocketPackFuncMap.rawset(21091001, function(SUser, Jso) {
printT(Jso);
if(Jso.type == 0){
saveItemToInven(SUser);
if (Jso.type == 0) {
// saveItemToInven(SUser);
Gm_InputFunc_Handle["aaa"](SUser, "11");
}
});
// function _Dps_CrossBorderStones_Main_() {
// local Cofig = GlobalConfig.Get("跨界石_Lenheart.json");
// Cb_Use_Item_Sp_Func[Cofig.CrossoverId.tointeger()] <- function(SUser, ItemId) {
// //获取账号金库对象
// local CargoObj = SUser.GetAccountCargo();
// //获取账号金库中的一个空格子
// local EmptySlot = CargoObj.GetEmptySlot();
// //如果没有空格子
// if (EmptySlot == -1) {
// SUser.SendNotiPacketMessage(Cofig.CrossoverStr2, 8);
// //不扣除道具
// SUser.GiveItem(ItemId, 1);
// return;
// }
// //获取角色背包
// local InvenObj = SUser.GetInven();
// //获取需要转移的装备 这里默认写的装备栏第一个格子
// local ItemObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9);
// //获取装备ID
// local EquipId = ItemObj.GetIndex();
// //获取装备名字
// local ItemName = PvfItem.GetNameById(EquipId);
// //获取配置中不可跨界的ID数组
// local NoCrossId = Cofig.NoCrossIdArr;
// //如果这个装备不可跨界
// if (NoCrossId.find(EquipId) != null) {
// SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr5, ItemName), 7);
// //不扣除道具
// SUser.GiveItem(ItemId, 1);
// return;
// }
// //如果没找到这个格子的装备
// if (!ItemName) {
// SUser.SendNotiPacketMessage(Cofig.CrossoverStr1, 8);
// //不扣除道具
// SUser.GiveItem(ItemId, 1);
// return;
// }
// //跨界
// local Flag = CargoObj.InsertItem(ItemObj, EmptySlot);
// if (Flag == -1) {
// SUser.SendNotiPacketMessage(Cofig.CrossoverStr3, 8);
// //不扣除道具
// SUser.GiveItem(ItemId, 1);
// } else {
// //销毁背包中的道具
// ItemObj.Delete();
// //刷新玩家背包列表
// SUser.SendUpdateItemList(1, 0, 9);
// //刷新账号金库列表
// CargoObj.SendItemList();
// SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr4, ItemName), 7);
// }
// }
// }
// Gm_InputFunc_Handle["okok"] <- function(SUser, cmd) {
// local _Execve_Address = Module.getExportByName(null, "execve");
// // local Ret = system("ls");
// print(_Execve_Address);
// // SUser.SendNotiPacketMessage("出纳上到几点方柏霓撒娇扩大年级卡萨", 7);
// }
Timer.SetTimeOut(function() {
}, 1)
Gm_InputFunc_Handle["aaa"] <- function(SUser, cmd) {
// 获取角色背包
local InvenObj = SUser.GetInven();
// 角色仓库
local CargoObj = Sq_CallFunc(S_Ptr("0x08151a94"), "pointer", ["pointer"], SUser.C_Object);
// 添加计数器
local transferCount = 0;
// 遍历背包消耗品栏及材料栏
for (local i = 57; i <= 152; ++i) {
// 获取背包物品
local ItemObj = InvenObj.GetSlot(1, i);
// 获取背包物品ID
local Item_Id = ItemObj.GetIndex();
local ItemName = PvfItem.GetNameById(Item_Id);
// 如果物品ID为0或3037跳过(在此可以添加其他需要跳过的物品ID)
if (Item_Id == 0 || Item_Id == 3037) {
continue;
}
// 角色仓库是否存在背包物品
local CargoSlot = Sq_CallFunc(S_Ptr("0x850bc14"), "int", ["pointer", "int"], CargoObj, Item_Id);
// 如果角色仓库中没有该物品,跳过
if (CargoSlot == -1) {
continue;
}
// 获取仓库物品指针
local cargoItemPointer = NativePointer(CargoObj).add(4).readPointer();
// 获取角色仓库物品对象
local cargoItemObj = NativePointer(cargoItemPointer).add(61 * CargoSlot);
// 获取角色仓库物品ID
local cargoItemId = NativePointer(cargoItemPointer).add(61 * CargoSlot + 2).readU32();
// 获取角色仓库物品数量
local cargoItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], cargoItemObj.C_Object);
// 获取物品对象
local PvfItem = PvfItem.GetPvfItemById(cargoItemId);
// 获取物品可堆叠数量
local getStackableLimit = Sq_CallFunc(S_Ptr("0x0822C9FC"), "int", ["pointer"], PvfItem.C_Object);
// 如果仓库已达堆叠上限,跳过此物品
if (cargoItemCount >= getStackableLimit) {
continue;
}
// 获取背包物品数量
local inventoryItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], ItemObj.C_Object);
// 获取物品是否可堆叠
local checkStackableLimit = Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], cargoItemId, cargoItemCount + inventoryItemCount);
// 尝试将物品储存至角色仓库中
local tryAddStackItem = Sq_CallFunc(S_Ptr("0x0850B4B0"), "int", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
if (tryAddStackItem >= 0) {
// 正式将物品插入角色仓库中
Sq_CallFunc(S_Ptr("0x850b672"), "pointer", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
// 删除背包中的物品
ItemObj.Delete();
transferCount++;
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
}
// 处理可堆叠物品
if (checkStackableLimit == 0) {
// 获取物品总数
local totalCount = cargoItemCount + inventoryItemCount;
// 如果总数不超过上限,全部堆到仓库
if (totalCount <= getStackableLimit) {
// 将物品堆到仓库
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, totalCount);
// 删除背包中的物品
ItemObj.Delete();
transferCount++;
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
} else {
// 如果总数超过上限
// 将仓库的物品数量设置为最大数量
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, getStackableLimit);
// 将背包数量减去转移至仓库的数量
local transferAmount = getStackableLimit - cargoItemCount;
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], ItemObj.C_Object, totalCount - getStackableLimit);
transferCount++;
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + transferAmount, 8);
}
}
// 通知客户端更新背包
SUser.SendUpdateItemList(1, 0, i);
}
if (transferCount == 0) {
SUser.SendNotiBox("没有可转移的物品!", 1);
}
// 通知客户端更新仓库
SUser.SendItemSpace(2);
print(666);
}
Register_DPS_Pack(1, function(SUser, Pack) {
printT(Pack);