178 lines
7.3 KiB
Plaintext
178 lines
7.3 KiB
Plaintext
/*
|
||
文件名:一键入库.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);
|
||
} |