DP-S-Script/MyProject/一键入库.nut

178 lines
7.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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