/* 文件名:一键入库.nut 路径:MyProject/一键入库.nut 创建日期:2025-03-25 14:42 文件用途:一键入库 */ //获取金库 function User::GetCharacCargo() { return Sq_CallFunc(S_Ptr("0x008151A94"), "pointer", ["pointer"], this.C_Object); } //检查金库是否有指定ID道具 function CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId) { return Sq_CallFunc(S_Ptr("0x0850BC14"), "int", ["pointer", "int"], Cargo_C_Object, ItemId); } //检查物上限品堆叠 function Check_Item_Stack(ItemId, ItemCount) { return Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], ItemId, ItemCount); } //将物品存入仓库 function CharacCargo_Insert_Item(Cargo_C_Object, Item_C_Object) { return Sq_CallFunc(S_Ptr("0x0850B400"), "int", ["pointer", "pointer"], Cargo_C_Object, Item_C_Object); } Gm_InputFunc_Handle.AAWW <- function(SUser, CmdString) { //获取金库 local Cargo_C_Object = SUser.GetCharacCargo(); //获取背包 local InvenObj = SUser.GetInven(); // 物品槽范围: 57-152 (材料、消耗品栏) local INVENTORY_SLOT_START = 57; local INVENTORY_SLOT_END = 152; local anyItemInserted = false; // 标志变量,用于跟踪是否有物品被成功插入 for (local slot = INVENTORY_SLOT_START; slot <= INVENTORY_SLOT_END; slot++) { local ItemObject = InvenObj.GetSlot(1, slot); local ItemId = ItemObject.GetIndex(); local ItemName = PvfItem.GetNameById(ItemId); // 如果物品ID无效,跳过当前循环 if (ItemId <= 0) continue; local CheckFlag = CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId); // 如果仓库中没有该物品,跳过 if (CheckFlag == -1) continue; local Cargo_M_Object = NativePointer(Cargo_C_Object); // 获取仓库中对应物品的指针和数量 local CargoItemPointer = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag).readPointer(); local CargoItem = Item(CargoItemPointer); local CargoItemId = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag + 2).readU32(); //仓库中的数量 local CargoItemCount = CargoItem.GetAdd_Info() ? CargoItem.GetAdd_Info() : 1; //背包中的数量 local InventoryItemCount = ItemObject.GetAdd_Info(); //检查物品堆叠是否超过上限 local CanStack = Check_Item_Stack(ItemId, InventoryItemCount + CargoItemCount); if (CanStack == 0) { SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "超过堆叠上限,无法放入", 8); continue; } // 将物品存入仓库 local InsertResult = CharacCargo_Insert_Item(Cargo_C_Object, ItemObject.C_Object); if (InsertResult >= 0) { SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + InventoryItemCount, 8); InvenObj.DeleteItemCount(ItemId, InventoryItemCount); SUser.SendUpdateItemList(1, 0, slot); } } //更新仓库 SUser.SendItemSpace(2); }; function saveItemToInven(SUser) { // 获取角色背包 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); print(typeof cargoItemObj) // 获取角色仓库物品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); }