@rpgjs/server 3.3.2 → 4.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/LICENSE +19 -0
  2. package/lib/Game/Map.d.ts +58 -5
  3. package/lib/Game/Map.js +185 -80
  4. package/lib/Game/Map.js.map +1 -1
  5. package/lib/Game/WorldMaps.d.ts +3 -2
  6. package/lib/Game/WorldMaps.js +6 -11
  7. package/lib/Game/WorldMaps.js.map +1 -1
  8. package/lib/Gui/DialogGui.d.ts +1 -1
  9. package/lib/Gui/DialogGui.js +12 -13
  10. package/lib/Gui/DialogGui.js.map +1 -1
  11. package/lib/Gui/Gui.js +2 -6
  12. package/lib/Gui/Gui.js.map +1 -1
  13. package/lib/Gui/MenuGui.js +4 -8
  14. package/lib/Gui/MenuGui.js.map +1 -1
  15. package/lib/Gui/NotificationGui.js +4 -8
  16. package/lib/Gui/NotificationGui.js.map +1 -1
  17. package/lib/Gui/ShopGui.js +4 -8
  18. package/lib/Gui/ShopGui.js.map +1 -1
  19. package/lib/Gui/index.js +6 -13
  20. package/lib/Gui/index.js.map +1 -1
  21. package/lib/Interfaces/Gui.js +1 -2
  22. package/lib/Interfaces/StateStore.js +1 -2
  23. package/lib/MatchMaker.js +28 -46
  24. package/lib/MatchMaker.js.map +1 -1
  25. package/lib/Monitor/index.js +3 -5
  26. package/lib/Monitor/index.js.map +1 -1
  27. package/lib/Player/BattleManager.js +17 -16
  28. package/lib/Player/BattleManager.js.map +1 -1
  29. package/lib/Player/ClassManager.js +6 -10
  30. package/lib/Player/ClassManager.js.map +1 -1
  31. package/lib/Player/ComponentManager.d.ts +4 -4
  32. package/lib/Player/ComponentManager.js +37 -24
  33. package/lib/Player/ComponentManager.js.map +1 -1
  34. package/lib/Player/EffectManager.js +8 -12
  35. package/lib/Player/EffectManager.js.map +1 -1
  36. package/lib/Player/ElementManager.js +5 -9
  37. package/lib/Player/ElementManager.js.map +1 -1
  38. package/lib/Player/GoldManager.js +1 -5
  39. package/lib/Player/GoldManager.js.map +1 -1
  40. package/lib/Player/GuiManager.js +17 -15
  41. package/lib/Player/GuiManager.js.map +1 -1
  42. package/lib/Player/ItemFixture.js +1 -5
  43. package/lib/Player/ItemFixture.js.map +1 -1
  44. package/lib/Player/ItemManager.d.ts +3 -3
  45. package/lib/Player/ItemManager.js +29 -31
  46. package/lib/Player/ItemManager.js.map +1 -1
  47. package/lib/Player/MoveManager.d.ts +7 -6
  48. package/lib/Player/MoveManager.js +67 -74
  49. package/lib/Player/MoveManager.js.map +1 -1
  50. package/lib/Player/ParameterManager.js +10 -14
  51. package/lib/Player/ParameterManager.js.map +1 -1
  52. package/lib/Player/Player.d.ts +7 -1
  53. package/lib/Player/Player.js +193 -191
  54. package/lib/Player/Player.js.map +1 -1
  55. package/lib/Player/SkillManager.js +18 -22
  56. package/lib/Player/SkillManager.js.map +1 -1
  57. package/lib/Player/StateManager.js +9 -13
  58. package/lib/Player/StateManager.js.map +1 -1
  59. package/lib/Player/VariableManager.js +1 -5
  60. package/lib/Player/VariableManager.js.map +1 -1
  61. package/lib/Query.d.ts +2 -1
  62. package/lib/Query.js +19 -15
  63. package/lib/Query.js.map +1 -1
  64. package/lib/RpgServer.d.ts +11 -3
  65. package/lib/RpgServer.js +1 -2
  66. package/lib/Scenes/Map.d.ts +27 -4
  67. package/lib/Scenes/Map.js +117 -122
  68. package/lib/Scenes/Map.js.map +1 -1
  69. package/lib/decorators/event.js +4 -7
  70. package/lib/decorators/event.js.map +1 -1
  71. package/lib/decorators/map.d.ts +1 -1
  72. package/lib/decorators/map.js +5 -9
  73. package/lib/decorators/map.js.map +1 -1
  74. package/lib/entry-point.js +59 -65
  75. package/lib/entry-point.js.map +1 -1
  76. package/lib/express/api.d.ts +3 -0
  77. package/lib/express/api.js +105 -0
  78. package/lib/express/api.js.map +1 -0
  79. package/lib/express/errors/NotAuthorized.d.ts +4 -0
  80. package/lib/express/errors/NotAuthorized.js +7 -0
  81. package/lib/express/errors/NotAuthorized.js.map +1 -0
  82. package/lib/express/errors/NotFound.d.ts +4 -0
  83. package/lib/express/errors/NotFound.js +7 -0
  84. package/lib/express/errors/NotFound.js.map +1 -0
  85. package/lib/express/server.js +20 -5
  86. package/lib/express/server.js.map +1 -1
  87. package/lib/index.js +15 -68
  88. package/lib/index.js.map +1 -1
  89. package/lib/logs/index.js +5 -11
  90. package/lib/logs/index.js.map +1 -1
  91. package/lib/logs/item.js +11 -15
  92. package/lib/logs/item.js.map +1 -1
  93. package/lib/logs/log.js +1 -5
  94. package/lib/logs/log.js.map +1 -1
  95. package/lib/logs/skill.js +6 -10
  96. package/lib/logs/skill.js.map +1 -1
  97. package/lib/logs/state.js +5 -9
  98. package/lib/logs/state.js.map +1 -1
  99. package/lib/models/Item.js +1 -2
  100. package/lib/presets/index.js +28 -36
  101. package/lib/presets/index.js.map +1 -1
  102. package/lib/server.d.ts +23 -2
  103. package/lib/server.js +227 -134
  104. package/lib/server.js.map +1 -1
  105. package/package.json +24 -16
  106. package/src/Game/Map.ts +513 -0
  107. package/src/Game/WorldMaps.ts +45 -0
  108. package/src/Gui/DialogGui.ts +67 -0
  109. package/src/Gui/Gui.ts +45 -0
  110. package/src/Gui/MenuGui.ts +26 -0
  111. package/src/Gui/NotificationGui.ts +10 -0
  112. package/src/Gui/ShopGui.ts +43 -0
  113. package/src/Gui/index.ts +13 -0
  114. package/src/Interfaces/Gui.ts +4 -0
  115. package/src/Interfaces/StateStore.ts +5 -0
  116. package/src/MatchMaker.ts +63 -0
  117. package/src/Monitor/index.ts +78 -0
  118. package/src/Player/BattleManager.ts +123 -0
  119. package/src/Player/ClassManager.ts +72 -0
  120. package/src/Player/ComponentManager.ts +538 -0
  121. package/src/Player/EffectManager.ts +94 -0
  122. package/src/Player/ElementManager.ts +142 -0
  123. package/src/Player/GoldManager.ts +26 -0
  124. package/src/Player/GuiManager.ts +308 -0
  125. package/src/Player/ItemFixture.ts +24 -0
  126. package/src/Player/ItemManager.ts +474 -0
  127. package/src/Player/MoveManager.ts +635 -0
  128. package/src/Player/ParameterManager.ts +468 -0
  129. package/src/Player/Player.ts +931 -0
  130. package/src/Player/SkillManager.ts +229 -0
  131. package/src/Player/StateManager.ts +230 -0
  132. package/src/Player/VariableManager.ts +55 -0
  133. package/src/Query.ts +172 -0
  134. package/src/RpgServer.ts +429 -0
  135. package/src/Scenes/Map.ts +302 -0
  136. package/src/decorators/event.ts +57 -0
  137. package/src/decorators/map.ts +223 -0
  138. package/src/entry-point.ts +102 -0
  139. package/src/express/api.ts +118 -0
  140. package/src/express/errors/NotAuthorized.ts +6 -0
  141. package/src/express/errors/NotFound.ts +6 -0
  142. package/src/express/server.ts +93 -0
  143. package/src/index.ts +28 -0
  144. package/src/logs/index.ts +11 -0
  145. package/src/logs/item.ts +31 -0
  146. package/src/logs/log.ts +3 -0
  147. package/src/logs/skill.ts +16 -0
  148. package/src/logs/state.ts +13 -0
  149. package/src/models/Item.ts +11 -0
  150. package/src/presets/index.ts +71 -0
  151. package/src/server.ts +394 -0
  152. package/tsconfig.json +27 -0
@@ -0,0 +1,142 @@
1
+ import { Utils } from '@rpgjs/common'
2
+ import { RpgPlayer } from './Player';
3
+ import { ItemModel } from '../models/Item';
4
+ import { ItemFixture } from './ItemFixture';
5
+
6
+ const {
7
+ arrayUniq,
8
+ applyMixins
9
+ } = Utils
10
+
11
+ export class ElementManager extends ItemFixture {
12
+ _elementsEfficiency: { rate: number, element: any }[]
13
+
14
+ /**
15
+ * Recovers the player's elements defense on inventory. This list is generated from the `elementsDefense` property defined on the weapons or armors equipped.
16
+ * If several items have the same element, only the highest rate will be taken into account.
17
+ *
18
+ * ```ts
19
+ * import { Armor } from '@rpgjs/server'
20
+ *
21
+ * enum Elements {
22
+ * Fire = 'fire'
23
+ * }
24
+ *
25
+ * @Armor({
26
+ * name: 'Shield',
27
+ * elementsDefense: [{ rate: 1, element: Elements.Fire }]
28
+ * })
29
+ * class Shield {}
30
+ *
31
+ * @Armor({
32
+ * name: 'FireShield',
33
+ * elementsDefense: [{ rate: 0.5, element: Elements.Fire }]
34
+ * })
35
+ * class FireShield {}
36
+ *
37
+ * player.addItem(Shield)
38
+ * player.addItem(FireShield)
39
+ * player.equip(Shield)
40
+ * player.equip(FireShield)
41
+ *
42
+ * console.log(player.elementsDefense) // [{ rate: 1, element: 'fire' }]
43
+ * ```
44
+ * @title Get Elements Defense
45
+ * @prop {Array<{ rate: number, element: Element}>} player.elementsDefense
46
+ * @readonly
47
+ * @memberof ElementManager
48
+ * */
49
+ get elementsDefense(): { rate: number, element: any }[] {
50
+ return this.getFeature('elementsDefense', 'element')
51
+ }
52
+
53
+ /**
54
+ * Set or retrieves all the elements where the player is vulnerable or not.
55
+ *
56
+ * ```ts
57
+ * import { Class } from '@rpgjs/server'
58
+ *
59
+ * enum Elements {
60
+ * Fire = 'fire',
61
+ * Ice = 'ice'
62
+ * }
63
+ *
64
+ * @Class({
65
+ * name: 'Fighter',
66
+ * elementsEfficiency: [{ rate: 1, element: Elements.Fire }]
67
+ * })
68
+ * class Hero {}
69
+ *
70
+ * player.setClass(Hero)
71
+ *
72
+ * console.log(player.elementsEfficiency) // [{ rate: 1, element: 'fire' }]
73
+ *
74
+ * player.elementsEfficiency = [{ rate: 2, element: Elements.Ice }]
75
+ *
76
+ * console.log(player.elementsEfficiency) // [{ rate: 1, element: 'fire' }, { rate: 2, element: 'ice' }]
77
+ * ```
78
+ * @title Set/Get Elements Efficiency
79
+ * @prop {Array<{ rate: number, element: Element}>} player.elementsEfficiency
80
+ * @memberof ElementManager
81
+ * */
82
+ get elementsEfficiency(): { rate: number, element: any }[] {
83
+ if (this._class) {
84
+ return <any>[...this._elementsEfficiency, ...this._class.elementsEfficiency]
85
+ }
86
+ return this._elementsEfficiency
87
+ }
88
+
89
+ set elementsEfficiency(val) {
90
+ this._elementsEfficiency = val
91
+ }
92
+
93
+ /**
94
+ * Retrieves a array of elements assigned to the player and the elements of the weapons / armor equipped
95
+ *
96
+ * ```ts
97
+ * console.log(player.elements)
98
+ * ```
99
+ * @title Get Elements
100
+ * @prop {Array<Element>} player.elements
101
+ * @readonly
102
+ * @memberof ElementManager
103
+ * */
104
+ get elements() {
105
+ let elements: any = []
106
+ for (let item of this.equipments) {
107
+ if (item.elements) {
108
+ elements = [...elements, ...item.elements]
109
+ }
110
+ }
111
+ return arrayUniq(elements)
112
+ }
113
+
114
+ coefficientElements(otherPlayer: RpgPlayer): number {
115
+ const atkPlayerElements: any = otherPlayer.elements
116
+ const playerElements: any = this.elementsEfficiency
117
+ let coefficient = 1
118
+
119
+ for (let atkElement of atkPlayerElements) {
120
+ const elementPlayer = playerElements.find(el => el.element == atkElement.element)
121
+ const elementPlayerDef = this.elementsDefense.find(el => el.element == atkElement.element)
122
+ if (!elementPlayer) continue
123
+ const fn = this.getFormulas('coefficientElements')
124
+ if (!fn) {
125
+ return coefficient
126
+ }
127
+ coefficient += fn(atkElement, elementPlayer, elementPlayerDef || { rate: 0 })
128
+ }
129
+ return coefficient
130
+ }
131
+ }
132
+
133
+ export interface ElementManager{
134
+ equipments: ItemModel[]
135
+ getFormulas: (name: string) => any,
136
+ _class: any
137
+ }
138
+
139
+
140
+ applyMixins(ElementManager, [ItemFixture])
141
+
142
+ export interface ElementManager extends ItemFixture { }
@@ -0,0 +1,26 @@
1
+ export class GoldManager {
2
+ private _gold: number = 0
3
+
4
+ /**
5
+ * You can change the game money
6
+ *
7
+ * ```ts
8
+ * player.gold += 100
9
+ * ```
10
+ *
11
+ * @title Change Gold
12
+ * @prop {number} player.gold
13
+ * @default 0
14
+ * @memberof GoldManager
15
+ * */
16
+ set gold(val: number) {
17
+ if (val < 0) {
18
+ val = 0
19
+ }
20
+ this._gold = val
21
+ }
22
+
23
+ get gold(): number {
24
+ return this._gold
25
+ }
26
+ }
@@ -0,0 +1,308 @@
1
+ import { Utils } from '@rpgjs/common'
2
+ import { RpgPlayer } from './Player'
3
+ import { Gui, DialogGui, MenuGui, ShopGui, NotificationGui } from '../Gui'
4
+ import { DialogOptions, Choice } from '../Gui/DialogGui'
5
+
6
+ export class GuiManager {
7
+
8
+ _gui: { [id: string]: Gui }
9
+
10
+ /**
11
+ * Show a text. This is a graphical interface already built. Opens the GUI named `rpg-dialog`
12
+ *
13
+ * ```ts
14
+ * player.showText('Hello World')
15
+ * ```
16
+ *
17
+ * The method returns a promise. It is resolved when the dialog box is closed.
18
+ *
19
+ * ```ts
20
+ * await player.showText('Hello World')
21
+ * // dialog box is closed, then ...
22
+ * ```
23
+ *
24
+ * **Option: position**
25
+ *
26
+ * You can define how the dialog box is displayed:
27
+ * - top
28
+ * - middle
29
+ * - bottom
30
+ *
31
+ * (bottom by default)
32
+ *
33
+ * ```ts
34
+ * player.showText('Hello World', {
35
+ * position: 'top'
36
+ * })
37
+ * ```
38
+ *
39
+ * **Option: fullWidth**
40
+ *
41
+ * `boolean` (true by default)
42
+ *
43
+ * Indicate that the dialog box will take the full width of the screen.
44
+ *
45
+ * ```ts
46
+ * player.showText('Hello World', {
47
+ * fullWidth: true
48
+ * })
49
+ * ```
50
+ *
51
+ * **Option: autoClose**
52
+ *
53
+ * `boolean` (false by default)
54
+ *
55
+ * If false, the user will have to press Enter to close the dialog box.
56
+ *
57
+ * ```ts
58
+ * player.showText('Hello World', {
59
+ * autoClose: true
60
+ * })
61
+ * ```
62
+ *
63
+ * **Option: typewriterEffect**
64
+ *
65
+ * `boolean` (true by default)
66
+ *
67
+ * Performs a typewriter effect
68
+ *
69
+ * ```ts
70
+ * player.showText('Hello World', {
71
+ * typewriterEffect: false
72
+ * })
73
+ * ```
74
+ *
75
+ * **Option: talkWith**
76
+ *
77
+ * `RpgPlayer` (nothing by default)
78
+ *
79
+ * If you specify the event or another player, the other player will stop his or her movement and look in the player's direction.
80
+ *
81
+ * ```ts
82
+ * // Code in an event
83
+ * player.showText('Hello World', {
84
+ * talkWith: this
85
+ * })
86
+ * ```
87
+ *
88
+ * @title Show Text
89
+ * @method player.showText(text,options)
90
+ * @param {string} text
91
+ * @param {object} [options] the different options, see usage below
92
+ * @returns {Promise}
93
+ * @memberof GuiManager
94
+ */
95
+ showText(msg: string, options: DialogOptions = {}): Promise<any> {
96
+ const gui = new DialogGui(<any>this)
97
+ this._gui[gui.id] = gui
98
+ return gui.openDialog(msg, options)
99
+ }
100
+
101
+ /**
102
+ * Shows a dialog box with a choice. Opens the GUI named `rpg-dialog`
103
+ *
104
+ * ```ts
105
+ * const choice = await player.showChoices('What color do you prefer?', [
106
+ * { text: 'Black', value: 'black' },
107
+ * { text: 'Rather the blue', value: 'blue' },
108
+ * { text: 'I don\'t have a preference!', value: 'none' }
109
+ * ])
110
+ *
111
+ * // If the player selects the first
112
+ * console.log(choice) // { text: 'Black', value: 'black' }
113
+ * ```
114
+ *
115
+ * @title Show Choices
116
+ * @method player.showChoices(text,choices)
117
+ * @param {string} text
118
+ * @param {Array<{ text: string, value: any }>} choices
119
+ * @param {object} [options] Same options as the openDialog method
120
+ * @returns {Promise<Choice | null>}
121
+ * @memberof GuiManager
122
+ */
123
+ showChoices(msg: string, choices: Choice[], options?: DialogOptions): Promise<Choice | null> {
124
+ return this
125
+ .showText(msg, {
126
+ choices,
127
+ ...options
128
+ })
129
+ .then((indexSelected: number) => {
130
+ if (!choices[indexSelected]) return null
131
+ return choices[indexSelected]
132
+ })
133
+ }
134
+
135
+ /**
136
+ * Displays a notification . Opens the GUI named `rpg-notification`
137
+ *
138
+ * @title Displays a notification
139
+ * @method player.showNotification()
140
+ * @param {string} message - The message to display in the notification
141
+ * @param {object} options - An object containing options for the notification
142
+ * @param {number} options.time - The time to display the notification for (in ms). Default: 2000ms
143
+ * @param {string} options.icon - The icon to display in the notification. Put the identifier of the spritesheet (defined on the client side)
144
+ * @param {string} options.sound - The sound to play when the notification is shown. Set the sound ID (defined on the client side)
145
+ * @returns {void}
146
+ * @memberof GuiManager
147
+ */
148
+ showNotification(message: string, options: { time?: number, icon?: string, sound?: string } = {}): Promise<any> {
149
+ const gui = new NotificationGui(<any>this)
150
+ this._gui[gui.id] = gui
151
+ const data = {
152
+ message,
153
+ ...options
154
+ }
155
+ return gui.open(data)
156
+ }
157
+
158
+ /**
159
+ * Calls main menu. Opens the GUI named `rpg-main-menu`
160
+ *
161
+ * @title Call Main Menu
162
+ * @method player.callMainMenu()
163
+ * @returns {void}
164
+ * @memberof GuiManager
165
+ */
166
+ callMainMenu() {
167
+ const gui = new MenuGui(<any>this)
168
+ this._gui[gui.id] = gui
169
+ return gui.open()
170
+ }
171
+
172
+ /**
173
+ * Calls shop menu. Opens the GUI named `rpg-shop`
174
+ *
175
+ * @title Call Shop Menu
176
+ * @method player.callShop()
177
+ * @returns {void}
178
+ * @memberof GuiManager
179
+ */
180
+ callShop(items: any[]) {
181
+ const gui = new ShopGui(<any>this)
182
+ this._gui[gui.id] = gui
183
+ return gui.open(items)
184
+ }
185
+
186
+ /**
187
+ * Call a custom Gui
188
+
189
+ * ```ts
190
+ * // Calls a client-side component, created with VueJS, named "inn".
191
+ * const gui = player.gui('inn')
192
+ *
193
+ * // You can wait for actions on the menu. It only works if the menu is open.
194
+ * gui.on('accept', () => {
195
+ * player.allRecovery()
196
+ * })
197
+ *
198
+ * // The GUI is opened by passing recoverable data on the client side.
199
+ * gui.open({ hello: 'world' })
200
+ * ```
201
+ *
202
+ * When opening the GUI, one can give options
203
+ *
204
+ * ```ts
205
+ * await gui.open({ hello: 'world' }, {
206
+ * waitingAction: true,
207
+ * blockPlayerInput: true
208
+ * })
209
+ * // After the GUI is closed
210
+ * ```
211
+ *
212
+ * - `blockPlayerInput`: while the GUI is open, the player can not move on the map
213
+ * - `waitingAction`: We explicitly wait until the GUI is closed for the promise to be resolved.
214
+ *
215
+ * @title Call custom GUI
216
+ * @method player.gui(guiId)
217
+ * @param {string} guiId
218
+ * @returns {Gui}
219
+ * @memberof GuiManager
220
+ */
221
+ gui(guiId: string) {
222
+ const gui = new Gui(guiId, <any>this)
223
+ this._gui[guiId] = gui
224
+ return gui
225
+ }
226
+
227
+ /**
228
+ * Closes the GUI and removes it from memory
229
+ *
230
+ * @title Close custom GUI
231
+ * @method player.removeGui(guiId,data)
232
+ * @param {string} guiId
233
+ * @param {object} [data] Passing data if you close the GUI
234
+ * @returns {Gui}
235
+ * @memberof GuiManager
236
+ */
237
+ removeGui(guiId: string, data?: any) {
238
+ if (this._gui[guiId]) {
239
+ this._gui[guiId].close(data)
240
+ delete this._gui[guiId]
241
+ }
242
+ }
243
+
244
+ private _attachedGui(players: RpgPlayer[] | RpgPlayer, display: boolean) {
245
+ if (!Utils.isArray(players)) {
246
+ players = [players] as RpgPlayer[]
247
+ }
248
+ this.emit('gui.tooltip', {
249
+ players: (players as RpgPlayer[]).map(player => player.id),
250
+ display
251
+ })
252
+ }
253
+
254
+ /**
255
+ * Display the GUI attached to the players
256
+ *
257
+ * If you don't specify the players as parameters, it will display the GUI of the instance
258
+ * But you can specify which GUIs to display by specifying the players as the first parameter
259
+ *
260
+ * @title View to GUI attached
261
+ * @method player.showAttachedGui(players?)
262
+ * @param {RpgPlayer[] | RpgPlayer} [players] The GUIs attached to the players to display
263
+ * @since 3.0.0-beta.5
264
+ * @example
265
+ * ```ts
266
+ * player.showAttachedGui()
267
+ * ```
268
+ * ```ts
269
+ * player.showAttachedGui(aPlayer)
270
+ * ```
271
+ * ```ts
272
+ * player.showAttachedGui([player1, player2])
273
+ * ```
274
+ * @memberof GuiManager
275
+ * */
276
+ showAttachedGui(players?: RpgPlayer[] | RpgPlayer) {
277
+ const _players = players || this
278
+ this._attachedGui(_players as RpgPlayer[], true)
279
+ }
280
+
281
+ /**
282
+ * Hide the GUI attached to the players
283
+ *
284
+ * @title Hide to GUI attached
285
+ * @method player.hideAttachedGui(players?)
286
+ * @param {RpgPlayer[] | RpgPlayer} [players] The GUIs attached to the players to hide
287
+ * @since 3.0.0-beta.5
288
+ * @example
289
+ * ```ts
290
+ * player.hideAttachedGui()
291
+ * ```
292
+ * ```ts
293
+ * player.hideAttachedGui(aPlayer)
294
+ * ```
295
+ * ```ts
296
+ * player.hideAttachedGui([player1, player2])
297
+ * ```
298
+ * @memberof GuiManager
299
+ * */
300
+ hideAttachedGui(players?: RpgPlayer[] | RpgPlayer) {
301
+ const _players = players || this
302
+ this._attachedGui(_players as RpgPlayer[], false)
303
+ }
304
+ }
305
+
306
+ export interface GuiManager {
307
+ emit: any
308
+ }
@@ -0,0 +1,24 @@
1
+ import { ItemModel } from "../models/Item"
2
+
3
+ export class ItemFixture {
4
+ protected getFeature(name, prop): any {
5
+ const array = {}
6
+ for (let item of this.equipments) {
7
+ if (item[name]) {
8
+ for (let feature of item[name]) {
9
+ const { rate } = feature
10
+ const instance = feature[prop]
11
+ const cache = array[instance.id]
12
+ if (cache && cache.rate >= rate) continue
13
+ array[instance.id] = feature
14
+ }
15
+ }
16
+ }
17
+ return Object.values(array)
18
+ }
19
+ }
20
+
21
+
22
+ export interface ItemFixture{
23
+ equipments: ItemModel[]
24
+ }