1 import {SocketEvent} from "../../server/socket-event.server";
2 import { Socket } from 'socket.io';
3 import {EquipmentSlot} from '../../shared/inventory';
4 import {getEquippedItems, getInventory, getInventoryItem} from '../../server/inventory';
5 import { equip, unequip } from '../../server/equipment';
6 import { logger } from '../../server/lib/logger';
7 import {EquippedItemDetails} from '../../shared/equipped';
8 import { getPlayersItems } from "../../server/items";
10 class EquipmentInSlotError extends Error {
13 super('You already have something in that slot');
19 function calcAp(inventoryItem: EquippedItemDetails[], socket: Socket) {
20 const ap: Record<any | EquipmentSlot, {currentAp: number, maxAp: number}> = {};
21 inventoryItem.forEach(item => {
22 if(item.is_equipped && item.type === 'ARMOUR') {
23 ap[item.equipment_slot] = {
24 currentAp: item.currentAp,
30 socket.emit('calc:ap', {ap});
33 export const equipItem: SocketEvent = {
35 handler: async (api, data: {id: string, slot: EquipmentSlot}) => {
36 const inventoryItem = await getInventoryItem(api.player.id, data.id);
37 const equippedItems = await getEquippedItems(api.player.id);
38 let desiredSlot: EquipmentSlot = inventoryItem.equipment_slot;
41 // handes the situation where you're trying to equip an item
42 // that can be equipped to any hand
43 if(inventoryItem.equipment_slot === 'ANY_HAND') {
44 if(data.slot === 'LEFT_HAND' || data.slot === 'RIGHT_HAND') {
45 // get the players current equipment in that slot!
46 if(equippedItems.some(v => {
47 return v.equipment_slot === data.slot || v.equipment_slot === 'TWO_HANDED';
49 throw new EquipmentInSlotError();
52 desiredSlot = data.slot;
57 if(data.slot === 'TWO_HANDED') {
58 if(equippedItems.some(v => {
59 return v.equipment_slot === 'LEFT_HAND' || v.equipment_slot === 'RIGHT_HAND';
61 throw new EquipmentInSlotError();
66 await equip(api.player.id, inventoryItem, desiredSlot);
67 api.socket.emit('alert', {
69 text: `You equipped your ${inventoryItem.name}`
73 if(e.code.toString() === '23505') {
74 api.socket.emit('alert', {
76 text: 'You already have an item equipped in that slot'
84 const inventory = await getInventory(api.player.id);
85 const items = await getPlayersItems(api.player.id);
86 api.socket.emit('inventory', {
90 calcAp(inventory, api.socket);
95 export const unequipItem: SocketEvent = {
97 handler: async (api, data: {id: string}) => {
98 await unequip(api.player.id, data.id);
100 const inventory = await getInventory(api.player.id);
101 calcAp(inventory, api.socket);
102 const items = await getPlayersItems(api.player.id);
103 api.socket.emit('inventory', {