@rpgjs/server 4.0.0-beta.9 → 4.0.0-rc.2

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 (65) hide show
  1. package/lib/Game/Map.d.ts +10 -1
  2. package/lib/Game/Map.js +36 -2
  3. package/lib/Game/Map.js.map +1 -1
  4. package/lib/Gui/MenuGui.js +2 -2
  5. package/lib/Gui/MenuGui.js.map +1 -1
  6. package/lib/Player/BattleManager.d.ts +5 -5
  7. package/lib/Player/BattleManager.js +8 -7
  8. package/lib/Player/BattleManager.js.map +1 -1
  9. package/lib/Player/ClassManager.d.ts +11 -4
  10. package/lib/Player/ClassManager.js +7 -3
  11. package/lib/Player/ClassManager.js.map +1 -1
  12. package/lib/Player/EffectManager.d.ts +2 -2
  13. package/lib/Player/EffectManager.js +6 -6
  14. package/lib/Player/EffectManager.js.map +1 -1
  15. package/lib/Player/ElementManager.d.ts +4 -1
  16. package/lib/Player/ElementManager.js.map +1 -1
  17. package/lib/Player/ItemManager.d.ts +21 -0
  18. package/lib/Player/ItemManager.js +22 -1
  19. package/lib/Player/ItemManager.js.map +1 -1
  20. package/lib/Player/MoveManager.js +27 -14
  21. package/lib/Player/MoveManager.js.map +1 -1
  22. package/lib/Player/ParameterManager.d.ts +2 -1
  23. package/lib/Player/ParameterManager.js +15 -4
  24. package/lib/Player/ParameterManager.js.map +1 -1
  25. package/lib/Player/Player.d.ts +13 -5
  26. package/lib/Player/Player.js +41 -4
  27. package/lib/Player/Player.js.map +1 -1
  28. package/lib/Player/SkillManager.d.ts +13 -8
  29. package/lib/Player/SkillManager.js +14 -7
  30. package/lib/Player/SkillManager.js.map +1 -1
  31. package/lib/Player/StateManager.d.ts +11 -6
  32. package/lib/Player/StateManager.js +21 -6
  33. package/lib/Player/StateManager.js.map +1 -1
  34. package/lib/RpgServer.d.ts +42 -2
  35. package/lib/Scenes/Map.d.ts +2 -0
  36. package/lib/Scenes/Map.js +3 -0
  37. package/lib/Scenes/Map.js.map +1 -1
  38. package/lib/express/server.js +5 -1
  39. package/lib/express/server.js.map +1 -1
  40. package/lib/index.d.ts +1 -0
  41. package/lib/index.js +1 -0
  42. package/lib/index.js.map +1 -1
  43. package/lib/models/Item.d.ts +1 -1
  44. package/lib/server.d.ts +2 -5
  45. package/lib/server.js +8 -7
  46. package/lib/server.js.map +1 -1
  47. package/package.json +8 -7
  48. package/src/Game/Map.ts +37 -4
  49. package/src/Gui/MenuGui.ts +3 -3
  50. package/src/Player/BattleManager.ts +10 -9
  51. package/src/Player/ClassManager.ts +13 -7
  52. package/src/Player/EffectManager.ts +6 -5
  53. package/src/Player/ElementManager.ts +4 -1
  54. package/src/Player/ItemManager.ts +47 -26
  55. package/src/Player/MoveManager.ts +35 -15
  56. package/src/Player/ParameterManager.ts +18 -7
  57. package/src/Player/Player.ts +44 -5
  58. package/src/Player/SkillManager.ts +23 -14
  59. package/src/Player/StateManager.ts +30 -11
  60. package/src/RpgServer.ts +42 -2
  61. package/src/Scenes/Map.ts +3 -0
  62. package/src/express/server.ts +9 -3
  63. package/src/index.ts +8 -7
  64. package/src/models/Item.ts +1 -1
  65. package/src/server.ts +10 -7
@@ -5,9 +5,12 @@ import { StateLog } from '../logs/state'
5
5
 
6
6
  const {
7
7
  isInstanceOf,
8
- applyMixins
8
+ applyMixins,
9
+ isString
9
10
  } = Utils
10
11
 
12
+ type StateClass = { new(...args: any[]) }
13
+
11
14
  export class StateManager {
12
15
 
13
16
  states: any[] = []
@@ -119,12 +122,18 @@ export class StateManager {
119
122
  *
120
123
  * @title Get State
121
124
  * @method player.getState(stateClass)
122
- * @param {StateClass} stateClass
125
+ * @param {StateClass | string} stateClass or state id
123
126
  * @returns {instance of StateClass | null}
124
127
  * @memberof StateManager
125
128
  */
126
- getState(stateClass) {
127
- return this.states.find(({ state }) => state instanceof stateClass)
129
+ getState(stateClass: StateClass | string) {
130
+ if (isString(stateClass)) stateClass = this.databaseById(stateClass)
131
+ return this.states.find((state) => {
132
+ if (isString(stateClass)) {
133
+ return state.id == stateClass
134
+ }
135
+ return isInstanceOf(state, stateClass)
136
+ })
128
137
  }
129
138
 
130
139
  /**
@@ -142,7 +151,7 @@ export class StateManager {
142
151
  *
143
152
  * @title Add State
144
153
  * @method player.addState(stateClass,chance=1)
145
- * @param {StateClass} stateClass
154
+ * @param {StateClass | string} stateClass state class or state id
146
155
  * @param {number} [chance] 1 by default
147
156
  * @throws {StateLog} addFailed
148
157
  * If the chance to add the state has failed (defined with the `chance` param)
@@ -156,14 +165,17 @@ export class StateManager {
156
165
  * @memberof StateManager
157
166
  * @todo
158
167
  */
159
- addState(stateClass, chance = 1): object | null {
168
+ addState(stateClass: StateClass | string, chance = 1): object | null {
160
169
  const state = this.getState(stateClass)
170
+ if (isString(stateClass)) {
171
+ stateClass = this.databaseById(stateClass)
172
+ }
161
173
  if (!state) {
162
174
  if (Math.random() > chance) {
163
175
  throw StateLog.addFailed(stateClass)
164
176
  }
165
177
  //const efficiency = this.findStateEfficiency(stateClass)
166
- const instance = new stateClass()
178
+ const instance = new (stateClass as StateClass)()
167
179
  this.states.push(instance)
168
180
  this.applyStates(<any>this, instance)
169
181
  return instance
@@ -186,7 +198,7 @@ export class StateManager {
186
198
  *
187
199
  * @title Remove State
188
200
  * @method player.removeState(stateClass,chance=1)
189
- * @param {StateClass} stateClass
201
+ * @param {StateClass|string} stateClass class state or state id
190
202
  * @param {number} [chance] 1 by default
191
203
  * @throws {StateLog} removeFailed
192
204
  * If the chance to remove the state has failed (defined with the `chance` param)
@@ -207,8 +219,13 @@ export class StateManager {
207
219
  * @returns {instance of StateClass}
208
220
  * @memberof StateManager
209
221
  */
210
- removeState(stateClass, chance = 1) {
211
- const index = this.states.findIndex(state => state instanceof stateClass)
222
+ removeState(stateClass: StateClass | string, chance = 1) {
223
+ const index = this.states.findIndex((state) => {
224
+ if (isString(stateClass)) {
225
+ return state.id == stateClass
226
+ }
227
+ return isInstanceOf(state, stateClass)
228
+ })
212
229
  if (index != -1) {
213
230
  if (Math.random() > chance) {
214
231
  throw StateLog.removeFailed(stateClass)
@@ -227,4 +244,6 @@ export class StateManager {
227
244
 
228
245
  applyMixins(StateManager, [ItemFixture])
229
246
 
230
- export interface StateManager extends ItemFixture { }
247
+ export interface StateManager extends ItemFixture {
248
+ databaseById(stateClass: any),
249
+ }
package/src/RpgServer.ts CHANGED
@@ -136,7 +136,6 @@ export interface RpgPlayerHooks {
136
136
  * When the player increases one level
137
137
  *
138
138
  * @prop { (player: RpgPlayer, nbLevel: number) => any } [onLevelUp]
139
- * @stability 1
140
139
  * @memberof RpgPlayerHooks
141
140
  */
142
141
  onLevelUp?: (player: RpgPlayer, nbLevel: number) => any
@@ -145,7 +144,6 @@ export interface RpgPlayerHooks {
145
144
  * When the player's HP drops to 0
146
145
  *
147
146
  * @prop { (player: RpgPlayer) => any } [onDead]
148
- * @stability 1
149
147
  * @memberof RpgPlayerHooks
150
148
  */
151
149
  onDead?: (player: RpgPlayer) => any,
@@ -196,6 +194,48 @@ export interface RpgPlayerHooks {
196
194
  }
197
195
 
198
196
  export interface RpgServer {
197
+ /**
198
+ * Add hooks to the player or engine. All modules can listen to the hook
199
+ *
200
+ * @prop { { player: string[], engine: string[] } } [hooks]
201
+ * @memberof RpgServer
202
+ * @since 4.0.0
203
+ * @stability 1
204
+ * @example
205
+ *
206
+ * ```ts
207
+ * import { RpgServer, RpgModule } from '@rpgjs/server'
208
+ *
209
+ * @RpgModule<RpgServer>({
210
+ * hooks: {
211
+ * player: ['onAuth']
212
+ * }
213
+ * })
214
+ * class RpgServerEngine { }
215
+ * ```
216
+ *
217
+ * Emit the hook:
218
+ *
219
+ * ```ts
220
+ * server.module.emit('server.player.onAuth', player)
221
+ * ```
222
+ *
223
+ * And listen to the hook:
224
+ *
225
+ * ```ts
226
+ * import { RpgPlayerHooks, RpgPlayer } from '@rpgjs/server'
227
+ *
228
+ * const player: RpgPlayerHooks = {
229
+ * onAuth(player: RpgPlayer) {
230
+ * console.log('player is authenticated')
231
+ * }
232
+ * }
233
+ * ```
234
+ */
235
+ hooks?: {
236
+ player?: string[],
237
+ engine?: string[]
238
+ }
199
239
 
200
240
  /**
201
241
  * Adding sub-modules
package/src/Scenes/Map.ts CHANGED
@@ -48,6 +48,8 @@ export class SceneMap {
48
48
 
49
49
  /**
50
50
  * Returns an array of RpgClassMap objects that represent maps with static properties.
51
+ *
52
+ * @method sceneMap.getMaps()
51
53
  * @returns {RpgClassMap<RpgMap>[]} Array of RpgClassMap objects.
52
54
  * @since 4.0.0
53
55
  * @example
@@ -293,6 +295,7 @@ export class SceneMap {
293
295
  player = World.getUser(player.id) as RpgPlayer
294
296
 
295
297
  if (player) {
298
+ mapInstance.loadCommonEvents(this.server.inputOptions.events, player)
296
299
  player.createDynamicEvent(<any>mapInstance._events, false)
297
300
  await player.execMethod('onJoinMap', <any>[mapInstance])
298
301
  }
@@ -1,6 +1,7 @@
1
1
  import http from 'http'
2
2
  import path from 'path'
3
3
  import express from 'express'
4
+ import cors from 'cors'
4
5
  import { Server } from 'socket.io'
5
6
  import entryPoint from '../entry-point'
6
7
  import PrettyError from 'pretty-error'
@@ -37,7 +38,7 @@ export function expressServer(modules: ModuleType[], options: ExpressServerOptio
37
38
 
38
39
  // @ts-ignore
39
40
  const isBuilt = !!envs.VITE_BUILT
40
-
41
+
41
42
  // @ts-ignore
42
43
  const hasStatic = process.env.STATIC_DIRECTORY_ENABLED
43
44
  const staticDirectory = isBuilt ? '' : 'dist'
@@ -50,13 +51,17 @@ export function expressServer(modules: ModuleType[], options: ExpressServerOptio
50
51
  limit: '50mb'
51
52
  }))
52
53
  }
53
-
54
+
55
+ app.use(cors())
56
+
54
57
  if (staticEnabled) {
55
58
  app.use('/', express.static(path.join(dirname, '..', staticDirectory, 'client')))
56
59
  }
57
60
 
61
+ let rpgGame: RpgServerEngine
62
+
58
63
  async function start() {
59
- const rpgGame = await entryPoint(modules, { io, ...options })
64
+ rpgGame = await entryPoint(modules, { io, ...options })
60
65
  rpgGame.app = app
61
66
  rpgGame.start()
62
67
  app.use('/api', api(rpgGame))
@@ -89,6 +94,7 @@ export function expressServer(modules: ModuleType[], options: ExpressServerOptio
89
94
  Query.getPlayers().forEach(player => {
90
95
  player.gameReload()
91
96
  })
97
+ rpgGame.stop()
92
98
  });
93
99
  }
94
100
  })
package/src/index.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { default as entryPoint } from './entry-point'
2
- export {
3
- Direction,
4
- Input,
5
- Control,
6
- RpgPlugin,
7
- HookServer,
8
- HookClient,
2
+ export {
3
+ Direction,
4
+ Input,
5
+ Control,
6
+ RpgPlugin,
7
+ HookServer,
8
+ HookClient,
9
9
  RpgModule,
10
10
  RpgShape,
11
11
  ShapePositioning,
@@ -26,3 +26,4 @@ export { SceneMap as RpgSceneMap, RpgClassMap } from './Scenes/Map'
26
26
  export { RpgMatchMaker } from './MatchMaker'
27
27
  export { IStoreState } from './Interfaces/StateStore'
28
28
  export { Components } from './Player/ComponentManager'
29
+ export { Gui } from './Gui/Gui'
@@ -2,7 +2,7 @@ import { ItemOptions } from '@rpgjs/database'
2
2
  import { RpgPlayer } from '../Player/Player';
3
3
 
4
4
  export interface ItemModel extends ItemOptions {
5
- id: string
5
+ id?: string
6
6
  equipped?: boolean
7
7
  onUseFailed?: (player: RpgPlayer) => {}
8
8
  onUse?: (player: RpgPlayer) => {}
package/src/server.ts CHANGED
@@ -336,6 +336,10 @@ export class RpgServerEngine {
336
336
  return this.getScene<SceneMap>(SceneMap.id)
337
337
  }
338
338
 
339
+ get module() {
340
+ return RpgPlugin
341
+ }
342
+
339
343
  sendToPlayer(currentPlayer, eventName, data) {
340
344
  currentPlayer._socket.emit(eventName, data)
341
345
  }
@@ -360,7 +364,7 @@ export class RpgServerEngine {
360
364
  })
361
365
 
362
366
  socket.on('disconnect', () => {
363
- this.onPlayerDisconnected(socket.id, playerId)
367
+ this.onPlayerDisconnected(playerId)
364
368
  })
365
369
 
366
370
  this.world.setUser(player, socket)
@@ -383,14 +387,13 @@ export class RpgServerEngine {
383
387
  }
384
388
  }
385
389
 
386
- /**
387
- *
388
- * @param {string} socketId - The socketId of the player that disconnected
389
- * @param {string} playerId - The playerId of the player that disconnected
390
- */
391
- private onPlayerDisconnected(socketId, playerId: string) {
390
+ private onPlayerDisconnected(playerId: string) {
392
391
  const player: RpgPlayer = World.getUser(playerId) as RpgPlayer
393
392
  player.execMethod('onDisconnected')
394
393
  this.world.disconnectUser(playerId)
395
394
  }
395
+
396
+ stop() {
397
+ this.scheduler.stop()
398
+ }
396
399
  }