@rpgjs/server 4.2.2 → 5.0.0-alpha.0

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 (219) hide show
  1. package/{lib → dist}/Gui/DialogGui.d.ts +1 -2
  2. package/{lib → dist}/Gui/Gui.d.ts +1 -2
  3. package/dist/Player/BattleManager.d.ts +22 -0
  4. package/dist/Player/ClassManager.d.ts +18 -0
  5. package/dist/Player/Event.d.ts +0 -0
  6. package/dist/Player/ItemManager.d.ts +17 -0
  7. package/dist/Player/MoveManager.d.ts +177 -0
  8. package/dist/Player/ParameterManager.d.ts +42 -0
  9. package/dist/Player/Player.d.ts +73 -0
  10. package/dist/Player/SkillManager.d.ts +23 -0
  11. package/dist/Player/StateManager.d.ts +39 -0
  12. package/{lib → dist}/RpgServer.d.ts +34 -17
  13. package/dist/RpgServerEngine.d.ts +5 -0
  14. package/dist/core/context.d.ts +2 -0
  15. package/dist/core/inject.d.ts +5 -0
  16. package/dist/core/setup.d.ts +6 -0
  17. package/dist/index.d.ts +9 -0
  18. package/dist/index.js +29673 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/module.d.ts +2 -0
  21. package/dist/rooms/lobby.d.ts +6 -0
  22. package/dist/rooms/map.d.ts +110 -0
  23. package/package.json +16 -38
  24. package/src/Gui/DialogGui.ts +3 -4
  25. package/src/Gui/Gui.ts +4 -6
  26. package/src/Player/BattleManager.ts +108 -99
  27. package/src/Player/ClassManager.ts +47 -46
  28. package/src/Player/ComponentManager.ts +26 -535
  29. package/src/Player/EffectManager.ts +44 -59
  30. package/src/Player/ElementManager.ts +70 -72
  31. package/src/Player/Event.ts +0 -0
  32. package/src/Player/GoldManager.ts +24 -6
  33. package/src/Player/GuiManager.ts +106 -97
  34. package/src/Player/ItemFixture.ts +22 -17
  35. package/src/Player/ItemManager.ts +234 -225
  36. package/src/Player/MoveManager.ts +1047 -457
  37. package/src/Player/ParameterManager.ts +59 -37
  38. package/src/Player/Player.ts +272 -1058
  39. package/src/Player/SkillManager.ts +146 -137
  40. package/src/Player/StateManager.ts +124 -98
  41. package/src/Player/VariableManager.ts +23 -3
  42. package/src/RpgServer.ts +38 -14
  43. package/src/RpgServerEngine.ts +7 -0
  44. package/src/core/context.ts +3 -0
  45. package/src/core/inject.ts +17 -0
  46. package/src/core/setup.ts +20 -0
  47. package/src/index.ts +9 -31
  48. package/src/module.ts +32 -0
  49. package/src/presets/index.ts +1 -3
  50. package/src/rooms/lobby.ts +24 -0
  51. package/src/rooms/map.ts +311 -0
  52. package/tsconfig.json +26 -23
  53. package/vite.config.ts +21 -0
  54. package/CHANGELOG.md +0 -163
  55. package/LICENSE +0 -19
  56. package/browser/manifest.json +0 -7
  57. package/browser/rpg.server.js +0 -22372
  58. package/browser/rpg.server.umd.cjs +0 -22403
  59. package/lib/Game/EventManager.d.ts +0 -54
  60. package/lib/Game/EventManager.js +0 -107
  61. package/lib/Game/EventManager.js.map +0 -1
  62. package/lib/Game/Map.d.ts +0 -191
  63. package/lib/Game/Map.js +0 -414
  64. package/lib/Game/Map.js.map +0 -1
  65. package/lib/Game/WorldMaps.d.ts +0 -17
  66. package/lib/Game/WorldMaps.js +0 -28
  67. package/lib/Game/WorldMaps.js.map +0 -1
  68. package/lib/Gui/DialogGui.js +0 -57
  69. package/lib/Gui/DialogGui.js.map +0 -1
  70. package/lib/Gui/Gui.js +0 -37
  71. package/lib/Gui/Gui.js.map +0 -1
  72. package/lib/Gui/MenuGui.js +0 -23
  73. package/lib/Gui/MenuGui.js.map +0 -1
  74. package/lib/Gui/NotificationGui.js +0 -8
  75. package/lib/Gui/NotificationGui.js.map +0 -1
  76. package/lib/Gui/ShopGui.js +0 -40
  77. package/lib/Gui/ShopGui.js.map +0 -1
  78. package/lib/Gui/index.js +0 -7
  79. package/lib/Gui/index.js.map +0 -1
  80. package/lib/Interfaces/Gui.d.ts +0 -4
  81. package/lib/Interfaces/Gui.js +0 -2
  82. package/lib/Interfaces/Gui.js.map +0 -1
  83. package/lib/Interfaces/StateStore.d.ts +0 -5
  84. package/lib/Interfaces/StateStore.js +0 -2
  85. package/lib/Interfaces/StateStore.js.map +0 -1
  86. package/lib/MatchMaker.d.ts +0 -24
  87. package/lib/MatchMaker.js +0 -42
  88. package/lib/MatchMaker.js.map +0 -1
  89. package/lib/Monitor/index.d.ts +0 -17
  90. package/lib/Monitor/index.js +0 -72
  91. package/lib/Monitor/index.js.map +0 -1
  92. package/lib/Player/BattleManager.d.ts +0 -36
  93. package/lib/Player/BattleManager.js +0 -101
  94. package/lib/Player/BattleManager.js.map +0 -1
  95. package/lib/Player/ClassManager.d.ts +0 -47
  96. package/lib/Player/ClassManager.js +0 -65
  97. package/lib/Player/ClassManager.js.map +0 -1
  98. package/lib/Player/ComponentManager.d.ts +0 -397
  99. package/lib/Player/ComponentManager.js +0 -505
  100. package/lib/Player/ComponentManager.js.map +0 -1
  101. package/lib/Player/EffectManager.d.ts +0 -46
  102. package/lib/Player/EffectManager.js +0 -75
  103. package/lib/Player/EffectManager.js.map +0 -1
  104. package/lib/Player/ElementManager.d.ts +0 -108
  105. package/lib/Player/ElementManager.js +0 -120
  106. package/lib/Player/ElementManager.js.map +0 -1
  107. package/lib/Player/GoldManager.d.ts +0 -17
  108. package/lib/Player/GoldManager.js +0 -27
  109. package/lib/Player/GoldManager.js.map +0 -1
  110. package/lib/Player/GuiManager.d.ts +0 -247
  111. package/lib/Player/GuiManager.js +0 -291
  112. package/lib/Player/GuiManager.js.map +0 -1
  113. package/lib/Player/ItemFixture.d.ts +0 -7
  114. package/lib/Player/ItemFixture.js +0 -19
  115. package/lib/Player/ItemFixture.js.map +0 -1
  116. package/lib/Player/ItemManager.d.ts +0 -331
  117. package/lib/Player/ItemManager.js +0 -475
  118. package/lib/Player/ItemManager.js.map +0 -1
  119. package/lib/Player/MoveManager.d.ts +0 -333
  120. package/lib/Player/MoveManager.js +0 -450
  121. package/lib/Player/MoveManager.js.map +0 -1
  122. package/lib/Player/ParameterManager.d.ts +0 -316
  123. package/lib/Player/ParameterManager.js +0 -408
  124. package/lib/Player/ParameterManager.js.map +0 -1
  125. package/lib/Player/Player.d.ts +0 -828
  126. package/lib/Player/Player.js +0 -927
  127. package/lib/Player/Player.js.map +0 -1
  128. package/lib/Player/SkillManager.d.ts +0 -163
  129. package/lib/Player/SkillManager.js +0 -223
  130. package/lib/Player/SkillManager.js.map +0 -1
  131. package/lib/Player/StateManager.d.ts +0 -185
  132. package/lib/Player/StateManager.js +0 -228
  133. package/lib/Player/StateManager.js.map +0 -1
  134. package/lib/Player/VariableManager.d.ts +0 -46
  135. package/lib/Player/VariableManager.js +0 -52
  136. package/lib/Player/VariableManager.js.map +0 -1
  137. package/lib/Query.d.ts +0 -127
  138. package/lib/Query.js +0 -159
  139. package/lib/Query.js.map +0 -1
  140. package/lib/RpgServer.js +0 -2
  141. package/lib/RpgServer.js.map +0 -1
  142. package/lib/Scenes/Map.d.ts +0 -136
  143. package/lib/Scenes/Map.js +0 -273
  144. package/lib/Scenes/Map.js.map +0 -1
  145. package/lib/decorators/event.d.ts +0 -43
  146. package/lib/decorators/event.js +0 -13
  147. package/lib/decorators/event.js.map +0 -1
  148. package/lib/decorators/map.d.ts +0 -178
  149. package/lib/decorators/map.js +0 -43
  150. package/lib/decorators/map.js.map +0 -1
  151. package/lib/entry-point.d.ts +0 -34
  152. package/lib/entry-point.js +0 -70
  153. package/lib/entry-point.js.map +0 -1
  154. package/lib/express/api.d.ts +0 -3
  155. package/lib/express/api.js +0 -105
  156. package/lib/express/api.js.map +0 -1
  157. package/lib/express/errors/NotAuthorized.d.ts +0 -4
  158. package/lib/express/errors/NotAuthorized.js +0 -7
  159. package/lib/express/errors/NotAuthorized.js.map +0 -1
  160. package/lib/express/errors/NotFound.d.ts +0 -4
  161. package/lib/express/errors/NotFound.js +0 -7
  162. package/lib/express/errors/NotFound.js.map +0 -1
  163. package/lib/express/server.d.ts +0 -16
  164. package/lib/express/server.js +0 -65
  165. package/lib/express/server.js.map +0 -1
  166. package/lib/index.d.ts +0 -20
  167. package/lib/index.js +0 -19
  168. package/lib/index.js.map +0 -1
  169. package/lib/inject.d.ts +0 -22
  170. package/lib/inject.js +0 -29
  171. package/lib/inject.js.map +0 -1
  172. package/lib/logs/index.js +0 -6
  173. package/lib/logs/index.js.map +0 -1
  174. package/lib/logs/item.js +0 -34
  175. package/lib/logs/item.js.map +0 -1
  176. package/lib/logs/log.js +0 -7
  177. package/lib/logs/log.js.map +0 -1
  178. package/lib/logs/skill.js +0 -19
  179. package/lib/logs/skill.js.map +0 -1
  180. package/lib/logs/state.js +0 -13
  181. package/lib/logs/state.js.map +0 -1
  182. package/lib/models/Item.d.ts +0 -10
  183. package/lib/models/Item.js +0 -2
  184. package/lib/models/Item.js.map +0 -1
  185. package/lib/presets/index.js +0 -65
  186. package/lib/presets/index.js.map +0 -1
  187. package/lib/server.d.ts +0 -137
  188. package/lib/server.js +0 -443
  189. package/lib/server.js.map +0 -1
  190. package/rpg.toml +0 -14
  191. package/src/Game/EventManager.ts +0 -125
  192. package/src/Game/Map.ts +0 -495
  193. package/src/Game/WorldMaps.ts +0 -45
  194. package/src/Interfaces/Gui.ts +0 -4
  195. package/src/Interfaces/StateStore.ts +0 -5
  196. package/src/MatchMaker.ts +0 -65
  197. package/src/Monitor/index.ts +0 -78
  198. package/src/Query.ts +0 -172
  199. package/src/Scenes/Map.ts +0 -310
  200. package/src/decorators/event.ts +0 -58
  201. package/src/decorators/map.ts +0 -226
  202. package/src/entry-point.ts +0 -111
  203. package/src/express/api.ts +0 -118
  204. package/src/express/errors/NotAuthorized.ts +0 -6
  205. package/src/express/errors/NotFound.ts +0 -6
  206. package/src/express/server.ts +0 -87
  207. package/src/inject.ts +0 -33
  208. package/src/models/Item.ts +0 -11
  209. package/src/server.ts +0 -459
  210. /package/{lib → dist}/Gui/MenuGui.d.ts +0 -0
  211. /package/{lib → dist}/Gui/NotificationGui.d.ts +0 -0
  212. /package/{lib → dist}/Gui/ShopGui.d.ts +0 -0
  213. /package/{lib → dist}/Gui/index.d.ts +0 -0
  214. /package/{lib → dist}/logs/index.d.ts +0 -0
  215. /package/{lib → dist}/logs/item.d.ts +0 -0
  216. /package/{lib → dist}/logs/log.d.ts +0 -0
  217. /package/{lib → dist}/logs/skill.d.ts +0 -0
  218. /package/{lib → dist}/logs/state.d.ts +0 -0
  219. /package/{lib → dist}/presets/index.d.ts +0 -0
@@ -1,125 +0,0 @@
1
- import { PlayerType } from "@rpgjs/types"
2
- import { RpgEvent, RpgPlayer } from "../Player/Player"
3
- import { RpgMap } from "./Map"
4
-
5
- export type EventsList = {
6
- [playerId: string]: RpgEvent
7
- }
8
-
9
- export enum EventMode {
10
- Shared = 'shared',
11
- Scenario = 'scenario'
12
- }
13
-
14
- /**
15
- * ⚠️ Please note that the event system can be on the player or on the card.
16
- * On player, it's Scenario mode
17
- * On-map: Shared mode
18
- * So this here is either RpgMap or RpgPlayer
19
- * You can check the mode with the mode cleanup on the retrieved event
20
- */
21
- export class EventManager {
22
- /**
23
- * @title event list
24
- * @prop { { [eventId: string]: RpgEvent } } [events]
25
- * @memberof Map
26
- * */
27
- public events: EventsList
28
-
29
- /**
30
- * Get Event in current map
31
- * @title Get Event
32
- * @since 3.0.0-beta.7
33
- * @method map.getEvent(eventId)
34
- * @param {string} eventId Event Id
35
- * @returns {RpgEvent | undefined}
36
- * @memberof Map
37
- */
38
- getEvent<T extends RpgEvent>(eventId: string): T | undefined {
39
- return this.events[eventId] as T
40
- }
41
-
42
- getEventByName<T extends RpgEvent>(eventName: string): T | undefined {
43
- const events = Object.keys(this.events)
44
- const key = events.find(key => this.events[key].name == eventName)
45
- if (!key) return
46
- return this.events[key] as T
47
- }
48
-
49
- /**
50
- * Removes an event from the map. Returns false if the event is not found
51
- *
52
- * Deletion of an event forced to be performed at the end of several aynschronous notions
53
- *
54
- * @title Remove Event
55
- * @since 3.0.0-beta.4
56
- * @method map.removeEvent(eventId)
57
- * @param {string} eventId Event Name
58
- * @returns {boolean}
59
- * @memberof Map
60
- */
61
- removeEvent(eventId: string): boolean {
62
- if (!this.events[eventId]) return false
63
- const mode = this.events[eventId].mode
64
- let currentState
65
- // Restores previous state
66
- if (mode == EventMode.Scenario) {
67
- currentState = this.getCurrentMap()?.$currentState().users?.[this.id]?.events?.[eventId] ?? {}
68
- }
69
- else {
70
- currentState = this.$currentState().events?.[eventId] ?? {}
71
- }
72
- this.removeObject(this.events[eventId], mode)
73
- delete this.events[eventId]
74
- // Change the state of the packet that will be sent to the client, adding the deleted flag to indicate to the client that the event has been deleted.
75
- if (mode == EventMode.Scenario) {
76
- this.getCurrentMap()?.$setCurrentState(`users.${this.id}.events.${eventId}`, {
77
- ...currentState,
78
- deleted: true
79
- })
80
- }
81
- else {
82
- this.$setCurrentState(`events.${eventId}`, {
83
- ...currentState,
84
- deleted: true
85
- })
86
- }
87
- return true
88
- }
89
-
90
- // @internal
91
- removeObject(object: RpgPlayer | RpgEvent, mode: EventMode = EventMode.Shared) {
92
- const map = this.getCurrentMap()
93
- if (!map) return
94
- map.getShapes().forEach(shape => shape.out(object))
95
- const events: RpgPlayer[] = Object.values(map.game.world.getObjectsOfGroup(map.id, object))
96
- for (let event of events) {
97
- object.getShapes().forEach(shape => shape.out(event))
98
- event.getShapes().forEach(shape => shape.out(object))
99
- }
100
- object._destroy$.next()
101
- object._destroy$.complete()
102
- // force RXJS, close subject. TODO: avoid this
103
- if (object.type != PlayerType.Player) object._destroy$['_closed'] = true
104
- map.grid.clearObjectInCells(object.id)
105
- for (let playerId in map.players) {
106
- if (object.id == playerId) continue
107
- const otherPlayer = map.players[playerId]
108
- if (otherPlayer.followingId == object.id) {
109
- otherPlayer.cameraFollow(otherPlayer)
110
- }
111
- }
112
- // last player before removed of this map
113
- if (map.nbPlayers === 1 && object.type === PlayerType.Player) {
114
- // clear cache for this map
115
- map.remove(true)
116
- }
117
- }
118
- }
119
-
120
- export interface EventManager {
121
- getCurrentMap(): RpgMap | null
122
- id: string
123
- $setCurrentState: (path: string, value: any) => void;
124
- $currentState(): any
125
- }
package/src/Game/Map.ts DELETED
@@ -1,495 +0,0 @@
1
- import { RpgCommonMap, Utils, RpgShape, RpgCommonGame, AbstractObject } from '@rpgjs/common'
2
- import { TiledParserFile, TiledParser, TiledTileset } from '@rpgjs/tiled'
3
- import { EventOptions } from '../decorators/event'
4
- import { RpgPlayer, RpgEvent, RpgClassEvent } from '../Player/Player'
5
- import { Move } from '../Player/MoveManager'
6
- import { RpgServerEngine } from '../server'
7
- import { Observable } from 'rxjs'
8
- import path from 'path'
9
- import { HitBox, MovingHitbox, PlayerType, Position } from '@rpgjs/types'
10
- import { World } from 'simple-room'
11
- import { EventManager, EventMode } from './EventManager'
12
-
13
- export type EventPosOption = {
14
- x: number,
15
- y: number,
16
- z?: number,
17
- event: EventOptions
18
- }
19
- export type EventOption = EventPosOption | EventOptions
20
-
21
- export type PlayersList = {
22
- [eventId: string]: RpgEvent
23
- }
24
-
25
- export type EventsList = {
26
- [playerId: string]: RpgPlayer
27
- }
28
-
29
- class AutoEvent extends RpgEvent {
30
- static mode: EventMode
31
- static hitbox: any = {}
32
-
33
- onInit() {
34
- const { graphic, direction, speed, frequency, move } = this.properties
35
- if (graphic) {
36
- this.setGraphic(graphic)
37
- }
38
- if (direction) {
39
- this.changeDirection(direction)
40
- }
41
- if (speed) {
42
- this.speed = speed
43
- }
44
- if (frequency) {
45
- this.frequency = frequency
46
- }
47
- if (move == 'random') {
48
- this.infiniteMoveRoute([Move.tileRandom()])
49
- }
50
- }
51
-
52
- async onAction(player: RpgPlayer) {
53
- const { text } = this.properties
54
- if (text) {
55
- await player.showText(text, {
56
- talkWith: this
57
- })
58
- }
59
- }
60
- }
61
-
62
- export class RpgMap extends RpgCommonMap {
63
-
64
- public _events: EventOption[]
65
- public file: any
66
-
67
- constructor(private _server: RpgServerEngine) {
68
- super()
69
- this.events = {}
70
- }
71
-
72
- // alias of users property in simple-room package
73
- /**
74
- * @title Players list
75
- * @prop { { [playerId: string]: RpgPlayer } } [players]
76
- * @readonly
77
- * @memberof Map
78
- */
79
- get players(): PlayersList {
80
- return this['users']
81
- }
82
-
83
- /**
84
- * @title Number of players
85
- * @prop {number} [nbPlayers]
86
- * @readonly
87
- * @memberof Map
88
- */
89
- get nbPlayers(): number {
90
- return Object.keys(this.players).length
91
- }
92
-
93
- $additionalEmitProperties(player: RpgPlayer) {
94
- const lastFramePositions: {
95
- frame: number
96
- position: unknown
97
- } | undefined = player['_lastFramePositions']
98
- let pos
99
- let lastFrame
100
- if (lastFramePositions) {
101
- pos = lastFramePositions.position
102
- lastFrame = lastFramePositions.frame
103
- }
104
- const data = { frame: lastFrame, pos }
105
- return data
106
- }
107
-
108
- async load() {
109
- if (RpgCommonMap.buffer.has(this.id)) {
110
- return
111
- }
112
- const data = await this.parseTmx(this.file)
113
- super.load(data)
114
- this.getAllObjects().forEach(this.createShape.bind(this))
115
- this.loadProperties((data as any).properties)
116
- this._server.workers?.call('loadMap', {
117
- id: this.id,
118
- data
119
- })
120
- RpgCommonMap.buffer.set(this.id, this)
121
- this.loadCommonEvents(this._server.inputOptions.events)
122
- this.createDynamicEvent(this._events as EventPosOption[])
123
- if (this.onLoad) this.onLoad()
124
- }
125
-
126
- /**
127
- * Update the map with new data. Data can be a string (TMX content) or an object (parsed TMX content)
128
- * New Map data will be sent to all players on the map
129
- *
130
- * @title Update map
131
- * @method map.update(data)
132
- * @since 4.0.0
133
- * @returns {Promise<void>}
134
- * @param {object | string} data
135
- * @memberof Map
136
- */
137
- async update(data: object | string): Promise<void> {
138
- let objectData
139
- // Data is XML (TMX content)
140
- if (typeof data == 'string') {
141
- objectData = await this.parseTmx(data, this.file)
142
- }
143
- else {
144
- objectData = data
145
- }
146
- super.load(objectData)
147
- RpgCommonMap.buffer.set(this.id, this)
148
- this.clearShapes()
149
- this.getAllObjects().forEach(this.createShape.bind(this))
150
- for (let playerId in this.players) {
151
- const player = this.players[playerId]
152
- player.emitSceneMap()
153
- }
154
- }
155
-
156
- /**
157
- * Update tileset with new data. Data can be a string (TSX content) or an object (TiledTileset)
158
- * Cache will be removed for this tileset
159
- * New tileset data will be sent to all players on the map
160
- * Warning: tileset is not updated for all maps, only for the current map
161
- *
162
- * @title Update tileset
163
- * @method map.updateTileset(data)
164
- * @since 4.0.0
165
- * @returns {<void>}
166
- * @param {TiledTileset | string} data
167
- * @memberof Map
168
- */
169
- updateTileset(data: TiledTileset | string) {
170
- let objectData: TiledTileset
171
- // Data is XML (TMX content)
172
- if (typeof data == 'string') {
173
- const parser = new TiledParser(data, this.file)
174
- objectData = parser.parseTileset()
175
- }
176
- else {
177
- objectData = data
178
- }
179
- this.removeCacheTileset(objectData.name)
180
- this.update({
181
- ...this.data,
182
- tilesets: this.data.tilesets.map((tileset: any) => {
183
- if (tileset.name == objectData.name) {
184
- objectData.firstgid = tileset.firstgid
185
- return objectData
186
- }
187
- return tileset
188
- })
189
- })
190
- }
191
-
192
- /**
193
- * Remove the map from the server. If there are still players on the map, an error will be thrown
194
- * Not delete the map file, only in memory
195
- *
196
- * @title Remove map
197
- * @method map.remove()
198
- * @since 4.0.0
199
- * @returns {void}
200
- * @throws {Error} If there are still players on the map
201
- * @memberof Map
202
- * */
203
- remove(ignorePlayers = false): never | void {
204
- const players = Object.values(this.players)
205
- if (players.length > 0 && !ignorePlayers) {
206
- throw new Error(`Cannot remove map ${this.id} because there are still players on it`)
207
- }
208
- for (let eventId in this.events) {
209
- this.removeEvent(eventId)
210
- }
211
- RpgCommonMap.buffer.delete(this.id)
212
- World.removeRoom(this.id)
213
- }
214
-
215
- private async parseTmx(file: string, relativePath: string = '') {
216
- // @ts-ignore
217
- const hasAssetsPath = !!this._server.envs.VITE_BUILT
218
- const parser = new TiledParserFile(
219
- file,
220
- {
221
- basePath: process.env.NODE_ENV == 'test' ? '.' : '',
222
- staticDir: hasAssetsPath ? path.join(this._server.inputOptions.basePath, this._server.assetsPath) : '',
223
- relativePath
224
- }
225
- )
226
- const data = await parser.parseFilePromise({
227
- getOnlyBasename: hasAssetsPath
228
- })
229
-
230
- return data
231
- }
232
-
233
- private loadProperties(properties: {
234
- [key: string]: any
235
- }) {
236
- for (let key in properties) {
237
- this[key] = properties[key]
238
- }
239
- }
240
-
241
- get game(): RpgCommonGame {
242
- return this._server.gameEngine
243
- }
244
-
245
- // Hook: called by simple-room package
246
- onLeave(player: RpgPlayer) {
247
- this.removeObject(player)
248
- }
249
-
250
- /**
251
- * Loads common events onto the game map.
252
- *
253
- * @private
254
- * @param {RpgClassEvent<RpgEvent>[]} commonEvents - An array of common events to load.
255
- * @param {RpgPlayer} [player] - The player instance on which to create the dynamic events. If not provided, the function will use the current instance.
256
- * @returns {void}
257
- */
258
- // @internal
259
- loadCommonEvents(commonEvents: RpgClassEvent<RpgEvent>[], player?: RpgPlayer) {
260
- let events: EventPosOption[] = []
261
- this.getShapes().forEach(shape => {
262
- const findEvent = commonEvents.find(event => event._name == shape.name)
263
- if (!findEvent) return
264
- const { x, y, } = shape.hitbox
265
- events.push({
266
- x,
267
- y,
268
- event: findEvent
269
- })
270
- });
271
- if (player) {
272
- player.createDynamicEvent(events, false)
273
- }
274
- else {
275
- this.createDynamicEvent(events)
276
- }
277
-
278
- }
279
-
280
- // TODO
281
- autoLoadEvent() {
282
- this.getShapes().forEach(shape => {
283
- const { properties } = shape
284
- const { x, y, pos, w, h } = shape.hitbox
285
- if (shape.isEvent() && !this.events[shape.name]) {
286
- const mode = properties.mode || EventMode.Shared
287
- AutoEvent.prototype['_name'] = shape.name
288
- AutoEvent.mode = mode
289
- AutoEvent.hitbox = {
290
- width: 32,
291
- height: 16
292
- }
293
- const event = this.createEvent({
294
- x,
295
- y,
296
- event: AutoEvent
297
- }, mode, shape)
298
- if (event) this.events[shape.name] = event
299
- }
300
- })
301
- }
302
-
303
- /**
304
- * Edit a tile on the map. All players on the map will see the modified tile
305
- *
306
- *
307
- * @title Change Tile in map
308
- * @since 3.0.0-beta.4
309
- * @method map.setTile(x,y,layer,tileInfo)
310
- * @param {number} x Position X
311
- * @param {number} y Position Y
312
- * @param {string | ((layer: any) => boolean)} layer Name of the layer where you want to put a tile. OYou can also put a function that will act as a filter. The first parameter is the layer and you return a boolean to indicate if you modify the tile of this layer or not
313
- * @param {object} tileInfo Object with the following properties:
314
- * - {number} gid: The tile number in tileset (from 1)
315
- * - {object} properties Property of the tile. You own object. To set a collision, set the `collision:true` property
316
- * @example
317
- * ```ts
318
- * map.setTile(15, 18, 'mylayer', { gid: 2 })
319
- * ```
320
- * @returns {void}
321
- * @memberof Map
322
- */
323
- setTile(x: number, y: number, layerFilter: string | ((layer: any) => boolean), tileInfo: {
324
- gid: number,
325
- properties?: object
326
- }): any {
327
- const tiles = super.setTile(x, y, layerFilter, tileInfo)
328
- const players: RpgPlayer[] = Object.values(this['users'])
329
- for (let player of players) {
330
- player.emit('changeTile', tiles)
331
- }
332
- return tiles
333
- }
334
-
335
- getEventShape(eventName: string): RpgShape | undefined {
336
- return this.getShapes().find(shape => shape.name == eventName)
337
- }
338
-
339
- /**
340
- * Dynamically create an event in Shared mode
341
- *
342
- * ```ts
343
- * @EventData({
344
- * name: 'EV-1'
345
- * })
346
- * class MyEvent extends RpgEvent {
347
- * onAction() {
348
- * console.log('ok')
349
- * }
350
- * }
351
- *
352
- * map.createDynamicEvent({
353
- * x: 100,
354
- * y: 100,
355
- * event: MyEvent
356
- * })
357
- * ```
358
- *
359
- * You can also put an array of objects to create several events at once
360
- *
361
- * @title Create Dynamic Event
362
- * @since 3.0.0-beta.4
363
- * @method map.createDynamicEvent(eventObj|eventObj[])
364
- * @param { { x: number, y: number, z?: number, event: eventClass } } eventsList
365
- * @returns { { [eventId: string]: RpgEvent } }
366
- * @memberof Map
367
- */
368
- createDynamicEvent(eventsList: EventPosOption | EventPosOption[]): {
369
- [eventId: string]: RpgEvent
370
- } {
371
- if (!eventsList) return {}
372
- if (!Utils.isArray(eventsList)) {
373
- eventsList = [eventsList as EventPosOption]
374
- }
375
- const events = this.createEvents(eventsList as EventPosOption[], EventMode.Shared)
376
- let ret = {}
377
- for (let key in events) {
378
- this.events[key] = events[key] as any
379
- this.events[key].updateInVirtualGrid()
380
- this.events[key].execMethod('onInit')
381
- // force to get Proxy object to sync with client
382
- ret = { ...ret, [key]: this.events[key] }
383
- }
384
- return ret
385
- }
386
-
387
- createEvent(obj: EventPosOption, mode: EventMode, shape?: RpgShape): RpgEvent | null {
388
- let event: any, position: Position | undefined
389
-
390
- // We retrieve the information of the event ([Event] or [{event: Event, x: number, y: number}])
391
- if (obj.x === undefined) {
392
- event = obj
393
- }
394
- else {
395
- event = obj.event
396
- position = { x: obj.x, y: obj.y, z: obj.z ?? 0 }
397
- }
398
-
399
- // The event is ignored if the mode is different.
400
- if (event.mode != mode) {
401
- return null
402
- }
403
-
404
- // Create an instance of RpgEvent and assign its options
405
- const ev = this.game.addEvent<RpgEvent>(event)
406
- const _shape = shape || this.getEventShape(ev.name)
407
- ev.map = this.id
408
- ev.width = event.width || this.tileWidth
409
- ev.height = event.height || this.tileHeight
410
- if (_shape && _shape.properties) ev.properties = _shape.properties
411
- if (event.hitbox) ev.setHitbox(event.hitbox.width, event.hitbox.height)
412
- ev.teleport(position || ev.name)
413
- return ev
414
- }
415
-
416
- createEvents(eventsList: EventOption[], mode: EventMode): EventsList {
417
- const events = {}
418
-
419
- if (!eventsList) return events
420
-
421
- for (let obj of eventsList) {
422
- const ev = this.createEvent(obj as EventPosOption, mode)
423
- if (ev) {
424
- events[ev.id] = ev
425
- }
426
- }
427
-
428
- return events
429
- }
430
-
431
- /**
432
- * Allows to create a temporary hitbox on the map that can have a movement
433
- For example, you can use it to explode a bomb and find all the affected players, or during a sword strike, you can create a moving hitbox and find the affected players again
434
- * @title Create a temporary and moving hitbox
435
- * @since 3.2.0
436
- * @method map.createMovingHitbox(hitboxes,options)
437
- * @param {Array<{ width: number, height: number, x: number, y: number }>} hitboxes Create several hitboxes that will give an effect of movement
438
- * @param {object} [options]
439
- * @param {speed} [options.speed=1] speed of movement (in frames)
440
- * @returns {Observable<AbstractObject>} You find the methods of position and movement of an event
441
- * @memberof Map
442
- * @example
443
- *
444
- * ```ts
445
- * // Two hitboxes that will be done very quickly
446
- * map.createMovingHitbox(
447
- * [
448
- * { x: 0, y: 0, width: 100, height: 100 },
449
- * { x: 20, y: 0, width: 100, height: 100 }
450
- * ]
451
- * ).subscribe({
452
- * next(hitbox) {
453
- * console.log(hitbox.otherPlayersCollision)
454
- * },
455
- * complete() {
456
- * console.log('finish')
457
- * }
458
- * })
459
- * ```
460
- */
461
- createMovingHitbox(
462
- hitboxes: Pick<HitBox, 'width' | 'height' | 'x' | 'y'>[],
463
- options: MovingHitbox = {}): Observable<AbstractObject> {
464
- return this._createMovingHitbox<RpgCommonGame>(
465
- this.game,
466
- this._server.tick as any,
467
- this.id,
468
- hitboxes,
469
- options) as any
470
- }
471
-
472
- setSync(schema: any) {
473
- return this.$setSchema(schema)
474
- }
475
-
476
- // Reflects itself. Just for compatibility with the EventManager class
477
- getCurrentMap() {
478
- return this
479
- }
480
- }
481
-
482
- export interface RpgMap extends EventManager {
483
- sounds: string[]
484
- $schema: any
485
- $setSchema: (schema: any) => void
486
- $patchSchema: (schema: any) => void
487
- $snapshotUser: (userId: string) => any
488
- onLoad()
489
- $setCurrentState: (path: string, value: any) => void;
490
- id: string
491
- }
492
-
493
- Utils.applyMixins(RpgMap, [
494
- EventManager
495
- ])
@@ -1,45 +0,0 @@
1
- import { RpgCommonWorldMaps, Utils } from '@rpgjs/common'
2
- import { TiledWorld, TiledMap, TiledWorldMap } from '@rpgjs/tiled'
3
- import { RpgClassMap, SceneMap } from '../Scenes/Map'
4
- import { RpgMap } from './Map'
5
-
6
- export type RpgTiledWorldMap = {
7
- id?: string
8
- fileName: string | TiledMap
9
- } & TiledWorldMap
10
-
11
- export type RpgTiledWorld = {
12
- maps: RpgTiledWorldMap[]
13
- } & TiledWorld
14
-
15
- export interface WorldMap extends RpgTiledWorld {
16
- id?: string,
17
- basePath?: string
18
- }
19
-
20
- export class RpgWorldMaps extends RpgCommonWorldMaps {
21
- load(world: WorldMap, sceneMap: SceneMap) {
22
- for (let worldMap of world.maps) {
23
- const { fileName } = worldMap
24
- let id, map: RpgClassMap<RpgMap>
25
- if (worldMap.id) {
26
- id = worldMap.id
27
- }
28
- else if (Utils.isString(fileName)) {
29
- id = Utils.extractId(fileName)
30
- }
31
- const create = () => sceneMap.createDynamicMap({
32
- id,
33
- file: world.basePath ? `${world.basePath}/${fileName}` : fileName
34
- })
35
- if (!id) {
36
- map = create()
37
- }
38
- else {
39
- map = sceneMap.getMapBydId(id) ?? create()
40
- }
41
- this.addMap(worldMap, map)
42
- }
43
- return this
44
- }
45
- }
@@ -1,4 +0,0 @@
1
- export interface IGui {
2
- open(...any): Promise<any>
3
- close?()
4
- }
@@ -1,5 +0,0 @@
1
- export interface IStoreState {
2
- connect(): Promise<any>
3
- get(key: string): Promise<string | null>
4
- set(key: string, val: string): Promise<any>
5
- }