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); } }); };