@rpgjs/server 4.0.0-beta.11 → 4.0.0-beta.13

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.
@@ -1,5 +1,5 @@
1
1
  import { RpgCommonPlayer, Utils, RpgPlugin, RpgCommonGame, RpgCommonMap, Direction } from '@rpgjs/common'
2
- import { Room } from 'simple-room'
2
+ import { Room, WorldClass } from 'simple-room'
3
3
  import { RpgMap, EventPosOption } from '../Game/Map'
4
4
  import { Query } from '../Query'
5
5
  import merge from 'lodash.merge'
@@ -80,10 +80,11 @@ const playerSchemas = {
80
80
  hp: Number,
81
81
  sp: Number,
82
82
  gold: Number,
83
- level: Number,
83
+ level: {
84
+ $effects: ['$this.expForNextlevel']
85
+ },
84
86
  exp: Number,
85
87
  name: String,
86
- expForNextlevel: Number,
87
88
  items: [{ nb: Number, item: itemSchemas }],
88
89
  _class: { name: String, description: String, id: String },
89
90
  equipments: [itemSchemas],
@@ -182,6 +183,10 @@ export class RpgPlayer extends RpgCommonPlayer {
182
183
  return super.otherPlayersCollision as RpgPlayer[]
183
184
  }
184
185
 
186
+ get world(): WorldClass | undefined {
187
+ return this.server?.world
188
+ }
189
+
185
190
  // As soon as a teleport has been made, the value is changed to force the client to change the positions on the map without making a move.
186
191
  teleported: number = 0
187
192
 
@@ -784,12 +789,23 @@ export class RpgPlayer extends RpgCommonPlayer {
784
789
  if (this._socket) this._socket.removeAllListeners(key)
785
790
  }
786
791
 
792
+ disconnect() {
793
+ if (this._socket) this._socket.disconnect()
794
+ }
795
+
787
796
  emitToMap(key: string, value: any) {
788
797
  Query.getPlayersOfMap(this.map).forEach(player => player.emit(key, value))
789
798
  }
790
799
 
791
- async execMethod(methodName: string, methodData = []) {
792
- const ret = await RpgPlugin.emit(`Server.${methodName}`, [this, ...methodData], true)
800
+ async execMethod(methodName: string, methodData = [], target?: any) {
801
+ let ret
802
+ if (target && target[methodName]) {
803
+ ret = target[methodName](...methodData)
804
+ if (isPromise(ret)) await ret
805
+ }
806
+ else {
807
+ ret = await RpgPlugin.emit(`Server.${methodName}`, [this, ...methodData], true)
808
+ }
793
809
  this.syncChanges()
794
810
  return ret
795
811
  }
@@ -799,6 +815,21 @@ export class RpgPlayer extends RpgCommonPlayer {
799
815
  this.emit('Player.' + name, val)
800
816
  }
801
817
 
818
+ // @internal
819
+ /**
820
+ * Allows you to manually update a status in the rooms that will then be sent to the customer.
821
+ * @param path
822
+ * @example
823
+ * ```ts
824
+ * player.changeRoomState('hp')
825
+ * ```
826
+ */
827
+ changeRoomState(path: string) {
828
+ this.world?.forEachUserRooms(this.id, (room) => {
829
+ (room as any).$setCurrentState(`users.${this.id}.${path}`)
830
+ })
831
+ }
832
+
802
833
  private _eventChanges() {
803
834
  if (!this._getMap(this.map)) return
804
835
  const {
@@ -928,4 +959,11 @@ export class RpgEvent extends RpgPlayer {
928
959
  }
929
960
  return ret
930
961
  }
962
+
963
+ changeRoomState(path: string) {
964
+ const room = this.getCurrentMap()
965
+ if (room) {
966
+ (room as any).$setCurrentState(`events.${this.id}.${path}`)
967
+ }
968
+ }
931
969
  }
@@ -17,15 +17,20 @@ const {
17
17
  applyMixins
18
18
  } = Utils
19
19
 
20
+ type SkillClass = { new(...args: any[]) }
21
+
20
22
  export class SkillManager {
21
23
 
22
24
  skills: any[]
23
25
 
24
- private _getSkillIndex(skillClass) {
26
+ private _getSkillIndex(skillClass: SkillClass | string) {
25
27
  return this.skills.findIndex(skill => {
26
28
  if (isString(skill)) {
27
29
  return skill.id == skillClass
28
30
  }
31
+ if (isString(skillClass)) {
32
+ return skillClass == skill.id || skill
33
+ }
29
34
  return isInstanceOf(skill, skillClass)
30
35
  })
31
36
  }
@@ -40,11 +45,11 @@ export class SkillManager {
40
45
  *
41
46
  * @title Get Skill
42
47
  * @method player.getSkill(skillClass)
43
- * @param {SkillClass} skillClass
48
+ * @param {SkillClass | string} skillClass or data id
44
49
  * @returns {instance of SkillClass | null}
45
50
  * @memberof SkillManager
46
51
  */
47
- getSkill(skillClass) {
52
+ getSkill(skillClass: SkillClass | string) {
48
53
  const index = this._getSkillIndex(skillClass)
49
54
  return this.skills[index]
50
55
  }
@@ -62,12 +67,13 @@ export class SkillManager {
62
67
  *
63
68
  * @title Learn Skill
64
69
  * @method player.learnSkill(skillClass)
65
- * @param {SkillClass} skillClass
70
+ * @param {SkillClass | string} skillClass or data id
66
71
  * @returns {instance of SkillClass}
67
72
  * @memberof SkillManager
68
73
  */
69
- learnSkill(skillClass) {
70
- const instance = new skillClass()
74
+ learnSkill(skillClass: SkillClass | string) {
75
+ if (isString(skillClass)) skillClass = this.databaseById(skillClass)
76
+ const instance = new (skillClass as SkillClass)()
71
77
  if (!instance.coefficient) instance.coefficient = {
72
78
  [INT]: 1
73
79
  }
@@ -94,7 +100,7 @@ export class SkillManager {
94
100
  *
95
101
  * @title Forget Skill
96
102
  * @method player.learnSkill(skillClass)
97
- * @param {SkillClass} skillClass
103
+ * @param {SkillClass | string} skillClass or data id
98
104
  * @throws {SkillLog} notLearned
99
105
  * If trying to forget a skill not learned
100
106
  * ```
@@ -106,7 +112,8 @@ export class SkillManager {
106
112
  * @returns {instance of SkillClass}
107
113
  * @memberof SkillManager
108
114
  */
109
- forgetSkill(skillClass) {
115
+ forgetSkill(skillClass: SkillClass | string) {
116
+ if (isString(skillClass)) skillClass = this.databaseById(skillClass)
110
117
  const index = this._getSkillIndex(skillClass)
111
118
  if (index == -1) {
112
119
  throw SkillLog.notLearned(skillClass)
@@ -151,7 +158,7 @@ export class SkillManager {
151
158
  *
152
159
  * @title Use Skill
153
160
  * @method player.useSkill(skillClass,otherPlayer)
154
- * @param {SkillClass} skillClass
161
+ * @param {SkillClass | string} skillClass or data id
155
162
  * @param {Array<RpgPlayer> | RpgPlayer} [otherPlayer]
156
163
  * @throws {SkillLog} restriction
157
164
  * If the player has the `Effect.CAN_NOT_SKILL` effect
@@ -192,7 +199,7 @@ export class SkillManager {
192
199
  * @memberof SkillManager
193
200
  * @todo
194
201
  */
195
- useSkill(skillClass, otherPlayer?: RpgPlayer | RpgPlayer[]) {
202
+ useSkill(skillClass: SkillClass | string, otherPlayer?: RpgPlayer | RpgPlayer[]) {
196
203
  const skill = this.getSkill(skillClass)
197
204
  if (this.hasEffect(Effect.CAN_NOT_SKILL)) {
198
205
  throw SkillLog.restriction(skillClass)
@@ -226,4 +233,6 @@ export class SkillManager {
226
233
 
227
234
  applyMixins(SkillManager, [ParameterManager, StateManager, EffectManager])
228
235
 
229
- export interface SkillManager extends ParameterManager, StateManager, EffectManager { }
236
+ export interface SkillManager extends ParameterManager, StateManager, EffectManager {
237
+ databaseById(skillClass: any),
238
+ }
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,
package/src/Scenes/Map.ts CHANGED
@@ -293,6 +293,7 @@ export class SceneMap {
293
293
  player = World.getUser(player.id) as RpgPlayer
294
294
 
295
295
  if (player) {
296
+ mapInstance.loadCommonEvents(this.server.inputOptions.events, player)
296
297
  player.createDynamicEvent(<any>mapInstance._events, false)
297
298
  await player.execMethod('onJoinMap', <any>[mapInstance])
298
299
  }
@@ -37,7 +37,7 @@ export function expressServer(modules: ModuleType[], options: ExpressServerOptio
37
37
 
38
38
  // @ts-ignore
39
39
  const isBuilt = !!envs.VITE_BUILT
40
-
40
+
41
41
  // @ts-ignore
42
42
  const hasStatic = process.env.STATIC_DIRECTORY_ENABLED
43
43
  const staticDirectory = isBuilt ? '' : 'dist'
@@ -50,13 +50,15 @@ export function expressServer(modules: ModuleType[], options: ExpressServerOptio
50
50
  limit: '50mb'
51
51
  }))
52
52
  }
53
-
53
+
54
54
  if (staticEnabled) {
55
55
  app.use('/', express.static(path.join(dirname, '..', staticDirectory, 'client')))
56
56
  }
57
57
 
58
+ let rpgGame: RpgServerEngine
59
+
58
60
  async function start() {
59
- const rpgGame = await entryPoint(modules, { io, ...options })
61
+ rpgGame = await entryPoint(modules, { io, ...options })
60
62
  rpgGame.app = app
61
63
  rpgGame.start()
62
64
  app.use('/api', api(rpgGame))
@@ -89,6 +91,7 @@ export function expressServer(modules: ModuleType[], options: ExpressServerOptio
89
91
  Query.getPlayers().forEach(player => {
90
92
  player.gameReload()
91
93
  })
94
+ rpgGame.stop()
92
95
  });
93
96
  }
94
97
  })
package/src/server.ts CHANGED
@@ -7,6 +7,7 @@ import { Utils, RpgPlugin, Scheduler, HookServer, RpgCommonGame, DefaultInput }
7
7
  import { Observable } from 'rxjs';
8
8
  import { Tick } from '@rpgjs/types';
9
9
  import { Actor, Armor, Class, DatabaseTypes, Item, Skill, State, Weapon } from '@rpgjs/database';
10
+ import { RpgMap } from './Game/Map';
10
11
 
11
12
  export class RpgServerEngine {
12
13
 
@@ -360,7 +361,7 @@ export class RpgServerEngine {
360
361
  })
361
362
 
362
363
  socket.on('disconnect', () => {
363
- this.onPlayerDisconnected(socket.id, playerId)
364
+ this.onPlayerDisconnected(playerId)
364
365
  })
365
366
 
366
367
  this.world.setUser(player, socket)
@@ -383,14 +384,13 @@ export class RpgServerEngine {
383
384
  }
384
385
  }
385
386
 
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) {
387
+ private onPlayerDisconnected(playerId: string) {
392
388
  const player: RpgPlayer = World.getUser(playerId) as RpgPlayer
393
389
  player.execMethod('onDisconnected')
394
390
  this.world.disconnectUser(playerId)
395
391
  }
392
+
393
+ stop() {
394
+ this.scheduler.stop()
395
+ }
396
396
  }