116 lines
5.3 KiB
Plaintext
116 lines
5.3 KiB
Plaintext
/*
|
||
文件名:一键入库.nut
|
||
路径:MyProject/一键入库.nut
|
||
创建日期:2025-03-25 14:42
|
||
文件用途:一键入库
|
||
*/
|
||
|
||
function _Dps_OneClickStorage_Logic_() {
|
||
local Config = GlobalConfig.Get("一键存入个人金库_Lenheart.json");
|
||
//在游戏中输入//一键入库即可调用
|
||
Gm_InputFunc_Handle[Config["一键存仓命令"]] <- 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);
|
||
}
|
||
}
|
||
//启动函数 自定义的需要写在ifo中
|
||
function _Dps_OneClickStorage_Main_() {
|
||
_Dps_OneClickStorage_Logic_();
|
||
}
|
||
|
||
function _Dps_OneClickStorage_Main_Reload(OldConfig) {
|
||
Gm_InputFunc_Handle.rawdelete(OldConfig["一键存仓命令"]);
|
||
_Dps_OneClickStorage_Logic_();
|
||
} |