dp-s_doc/Start/Example/16.md

3.8 KiB
Raw Blame History

仓库材料一键入库 (贡献者: 倾泪寒)

首先我们先在dp_s文件夹中建立一个项目文件夹 MyProject 方便管理

Alt text

然后我们建立一个新文件 仓库材料一键入库.nut 用于编写我们的代码

然后我们在仓库材料一键入库.nut中写入以下代码

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

最后我们回到dp_s文件夹中打开Main.nut 加载我们刚才编写的逻辑 如果你已经开启过数据库连接池则不需要初始化数据库连接池的代码

sq_RunScript("MyProject/仓库材料一键入库.nut");

至此一个简单的仓库材料一键入库的逻辑就写完了