chore(release): 0.2.5
[risinglegends.git] / src / events / equipping-items / server.ts
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";
9
10 class EquipmentInSlotError extends Error {
11   code: number;
12   constructor() {
13     super('You already have something in that slot');
14     this.code = 23505;
15   }
16 }
17
18
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,
25         maxAp: item.maxAp
26       };
27     }
28   });
29
30   socket.emit('calc:ap', {ap});
31 }
32
33 export const equipItem: SocketEvent = {
34   eventName: 'equip',
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;
39
40     try {
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';
48           })) {
49             throw new EquipmentInSlotError();
50           }
51           else {
52             desiredSlot = data.slot;
53           }
54         }
55       }
56
57       if(data.slot === 'TWO_HANDED') {
58         if(equippedItems.some(v => {
59           return v.equipment_slot === 'LEFT_HAND' || v.equipment_slot === 'RIGHT_HAND';
60         })) {
61           throw new EquipmentInSlotError();
62         }
63       }
64
65
66       await equip(api.player.id, inventoryItem, desiredSlot);
67       api.socket.emit('alert', {
68         type: 'success', 
69         text: `You equipped your ${inventoryItem.name}`
70       });
71     }
72     catch(e) {
73       if(e.code.toString() === '23505') {
74         api.socket.emit('alert', {
75           type: 'error',
76           text: 'You already have an item equipped in that slot'
77         });
78       }
79       else {
80         logger.log(e);
81       }
82     }
83
84     const inventory = await getInventory(api.player.id);
85     const items = await getPlayersItems(api.player.id);
86     api.socket.emit('inventory', {
87       inventory,
88       items
89     });
90     calcAp(inventory, api.socket);
91
92   }
93 }
94
95 export const unequipItem: SocketEvent = {
96   eventName: 'unequip',
97   handler: async (api, data: {id: string}) => {
98     await unequip(api.player.id, data.id);
99
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', {
104       inventory,
105       items
106     });
107   }
108 }