Game-Server/game-server/src/sockets/handlers/inventoryHandler.js
2026-03-29 00:16:10 -03:00

105 lines
3.0 KiB
JavaScript

const { Player, Inventory } = require("../../models");
const sessionManager = require("../../game/SessionManager");
module.exports = (io, socket) => {
const userId = socket.user?.id;
if (!userId) return;
socket.on("player:get_inventory", async () => {
try {
const userItems = await Inventory.findAll({
where: { playerId: userId },
attributes: ["itemId", "quantity"],
});
socket.emit("player:inventory_data", userItems);
} catch (err) {
console.error("Inventory Fetch Error:", err.message);
socket.emit("error", { message: "Failed to load inventory" });
}
});
socket.on("player:get_equipment", async () => {
try {
const player = await Player.findByPk(userId);
if (!player) return;
const slots = [
"Weapon",
"Armor",
"Helmet",
"Boots",
"Hands",
"Pants",
"Engine",
"Accessory",
];
const equipment = {};
slots.forEach((slot) => {
const itemId = player[`equipped${slot}`];
equipment[slot.toLowerCase()] = itemId || null;
});
socket.emit("player:equipment_data", equipment);
} catch (err) {
console.error("Equipment Fetch Error:", err.message);
}
});
socket.on("player:equip_item", async ({ itemId, slot }) => {
try {
const hasItem = await Inventory.findOne({
where: { playerId: userId, itemId: itemId },
});
if (!hasItem) {
return socket.emit("error", { message: "You don't own this item" });
}
const DatapackLoader = require("../../game/DatapackLoader");
const itemInfo = DatapackLoader.getItem(itemId);
if (!itemInfo) return;
if (slot === "weapon" && itemInfo.type !== "weapon")
return socket.emit("error", { message: "Not a weapon" });
if (
["helmet", "armor", "boots", "pants", "hands"].includes(slot) &&
itemInfo.type !== "armour"
) {
return socket.emit("error", { message: "Not armor" });
}
const slotField = `equipped${slot.charAt(0).toUpperCase() + slot.slice(1)}`;
await Player.update({ [slotField]: itemId }, { where: { id: userId } });
sessionManager.updateEquipment(socket.id, slot, itemId);
socket.emit("player:item_equipped", { slot, itemId: itemId });
socket.broadcast.emit("player:visible_changed", {
playerId: userId,
slot,
texturePath: itemInfo.texture,
});
} catch (err) {
console.error("Equip Error:", err.message);
socket.emit("error", { message: "Equip failed" });
}
});
socket.on("player:unequip_item", async ({ slot }) => {
try {
const slotField = `equipped${slot.charAt(0).toUpperCase() + slot.slice(1)}`;
await Player.update({ [slotField]: null }, { where: { id: userId } });
sessionManager.updateEquipment(socket.id, slot, null);
socket.emit("player:item_unequipped", { slot });
} catch (err) {
console.error("Unequip Error:", err.message);
}
});
};