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';
9 class EquipmentInSlotError extends Error {
12 super('You already have something in that slot');
18 function calcAp(inventoryItem: EquippedItemDetails[], socket: Socket) {
19 const ap: Record<any | EquipmentSlot, {currentAp: number, maxAp: number}> = {};
20 inventoryItem.forEach(item => {
21 if(item.is_equipped && item.type === 'ARMOUR') {
22 ap[item.equipment_slot] = {
23 currentAp: item.currentAp,
29 socket.emit('calc:ap', {ap});
32 export const equipItem: SocketEvent = {
34 handler: async (api, data: {id: string, slot: EquipmentSlot}) => {
35 const inventoryItem = await getInventoryItem(api.player.id, data.id);
36 const equippedItems = await getEquippedItems(api.player.id);
37 let desiredSlot: EquipmentSlot = inventoryItem.equipment_slot;
40 // handes the situation where you're trying to equip an item
41 // that can be equipped to any hand
42 if(inventoryItem.equipment_slot === 'ANY_HAND') {
43 if(data.slot === 'LEFT_HAND' || data.slot === 'RIGHT_HAND') {
44 // get the players current equipment in that slot!
45 if(equippedItems.some(v => {
46 return v.equipment_slot === data.slot || v.equipment_slot === 'TWO_HANDED';
48 throw new EquipmentInSlotError();
51 desiredSlot = data.slot;
56 if(data.slot === 'TWO_HANDED') {
57 if(equippedItems.some(v => {
58 return v.equipment_slot === 'LEFT_HAND' || v.equipment_slot === 'RIGHT_HAND';
60 throw new EquipmentInSlotError();
65 await equip(api.player.id, inventoryItem, desiredSlot);
66 api.socket.emit('alert', {
68 text: `You equipped your ${inventoryItem.name}`
72 if(e.code.toString() === '23505') {
73 api.socket.emit('alert', {
75 text: 'You already have an item equipped in that slot'
83 const inventory = await getInventory(api.player.id);
84 calcAp(inventory, api.socket);
85 api.socket.emit('inventory', {
92 export const unequipItem: SocketEvent = {
94 handler: async (api, data: {id: string}) => {
95 await unequip(api.player.id, data.id);
97 const inventory = await getInventory(api.player.id);
98 calcAp(inventory, api.socket);
99 api.socket.emit('inventory', {