105 lines
3.0 KiB
JavaScript
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);
|
|
}
|
|
});
|
|
};
|