This commit is contained in:
parent
56155fba33
commit
d5494c5453
@ -15,23 +15,49 @@ class InventoryManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async equipItem(playerId, itemId, slot) {
|
async equipItem(playerId, itemId, slot) {
|
||||||
const hasItem = await Inventory.findOne({ where: { playerId, itemId } });
|
const itemInInventory = await Inventory.findOne({
|
||||||
if (!hasItem) throw new Error("ITEM_NOT_FOUND");
|
where: { playerId, itemId },
|
||||||
|
});
|
||||||
|
if (!itemInInventory || itemInInventory.quantity <= 0) {
|
||||||
|
throw new Error("ITEM_NOT_FOUND_OR_OUT_OF_STOCK");
|
||||||
|
}
|
||||||
|
|
||||||
const itemInfo = DatapackLoader.getItem(itemId);
|
const itemInfo = DatapackLoader.getItem(itemId);
|
||||||
if (!itemInfo) throw new Error("INVALID_ITEM_DATA");
|
if (!itemInfo) throw new Error("INVALID_ITEM_DATA");
|
||||||
|
|
||||||
const allowedSlot = itemInfo.meta?.equipmentSlot;
|
|
||||||
if (allowedSlot !== slot) {
|
|
||||||
throw new Error("INVALID_SLOT_FOR_ITEM");
|
|
||||||
}
|
|
||||||
|
|
||||||
const player = await Player.findByPk(playerId);
|
const player = await Player.findByPk(playerId);
|
||||||
if (!player) throw new Error("PLAYER_NOT_FOUND");
|
if (!player) throw new Error("PLAYER_NOT_FOUND");
|
||||||
|
|
||||||
const currentEquip = player.equipment;
|
const currentEquip = { ...player.equipment };
|
||||||
currentEquip[slot] = itemId;
|
const allowedSlots = Array.isArray(itemInfo.meta?.equipmentSlot)
|
||||||
|
? itemInfo.meta.equipmentSlot
|
||||||
|
: [itemInfo.meta?.equipmentSlot];
|
||||||
|
|
||||||
|
let targetSlot = Array.isArray(slot)
|
||||||
|
? slot.find((s) => !currentEquip[s] && allowedSlots.includes(s)) ||
|
||||||
|
slot[0]
|
||||||
|
: slot;
|
||||||
|
|
||||||
|
if (!allowedSlots.includes(targetSlot)) {
|
||||||
|
throw new Error("INVALID_SLOT_FOR_ITEM");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentEquip[targetSlot]) {
|
||||||
|
const oldItemId = currentEquip[targetSlot];
|
||||||
|
const [invItem, created] = await Inventory.findOrCreate({
|
||||||
|
where: { playerId, itemId: oldItemId },
|
||||||
|
defaults: { quantity: 0 },
|
||||||
|
});
|
||||||
|
await invItem.increment("quantity", { by: 1 });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemInInventory.quantity > 1) {
|
||||||
|
await itemInInventory.decrement("quantity", { by: 1 });
|
||||||
|
} else {
|
||||||
|
await itemInInventory.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
currentEquip[targetSlot] = itemId;
|
||||||
player.equipment = currentEquip;
|
player.equipment = currentEquip;
|
||||||
player.changed("equipment", true);
|
player.changed("equipment", true);
|
||||||
await player.save();
|
await player.save();
|
||||||
@ -41,15 +67,23 @@ class InventoryManager {
|
|||||||
|
|
||||||
async unequipItem(playerId, slot) {
|
async unequipItem(playerId, slot) {
|
||||||
const player = await Player.findByPk(playerId);
|
const player = await Player.findByPk(playerId);
|
||||||
if (!player) throw new Error("PLAYER_NOT_FOUND");
|
if (!player || !player.equipment[slot]) return false;
|
||||||
|
|
||||||
|
const currentEquip = { ...player.equipment };
|
||||||
|
const itemId = currentEquip[slot];
|
||||||
|
|
||||||
const currentEquip = player.equipment;
|
|
||||||
if (currentEquip[slot]) {
|
|
||||||
delete currentEquip[slot];
|
delete currentEquip[slot];
|
||||||
|
|
||||||
|
const [itemInInventory, created] = await Inventory.findOrCreate({
|
||||||
|
where: { playerId, itemId },
|
||||||
|
defaults: { quantity: 0 },
|
||||||
|
});
|
||||||
|
|
||||||
|
await itemInInventory.increment("quantity", { by: 1 });
|
||||||
|
|
||||||
player.equipment = currentEquip;
|
player.equipment = currentEquip;
|
||||||
player.changed("equipment", true);
|
player.changed("equipment", true);
|
||||||
await player.save();
|
await player.save();
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user