@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.
- package/{lib → dist}/Gui/DialogGui.d.ts +1 -2
- package/{lib → dist}/Gui/Gui.d.ts +1 -2
- package/dist/Player/BattleManager.d.ts +22 -0
- package/dist/Player/ClassManager.d.ts +18 -0
- package/dist/Player/Event.d.ts +0 -0
- package/dist/Player/ItemManager.d.ts +17 -0
- package/dist/Player/MoveManager.d.ts +177 -0
- package/dist/Player/ParameterManager.d.ts +42 -0
- package/dist/Player/Player.d.ts +73 -0
- package/dist/Player/SkillManager.d.ts +23 -0
- package/dist/Player/StateManager.d.ts +39 -0
- package/{lib → dist}/RpgServer.d.ts +34 -17
- package/dist/RpgServerEngine.d.ts +5 -0
- package/dist/core/context.d.ts +2 -0
- package/dist/core/inject.d.ts +5 -0
- package/dist/core/setup.d.ts +6 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +29673 -0
- package/dist/index.js.map +1 -0
- package/dist/module.d.ts +2 -0
- package/dist/rooms/lobby.d.ts +6 -0
- package/dist/rooms/map.d.ts +110 -0
- package/package.json +16 -38
- package/src/Gui/DialogGui.ts +3 -4
- package/src/Gui/Gui.ts +4 -6
- package/src/Player/BattleManager.ts +108 -99
- package/src/Player/ClassManager.ts +47 -46
- package/src/Player/ComponentManager.ts +26 -535
- package/src/Player/EffectManager.ts +44 -59
- package/src/Player/ElementManager.ts +70 -72
- package/src/Player/Event.ts +0 -0
- package/src/Player/GoldManager.ts +24 -6
- package/src/Player/GuiManager.ts +106 -97
- package/src/Player/ItemFixture.ts +22 -17
- package/src/Player/ItemManager.ts +234 -225
- package/src/Player/MoveManager.ts +1047 -457
- package/src/Player/ParameterManager.ts +59 -37
- package/src/Player/Player.ts +272 -1058
- package/src/Player/SkillManager.ts +146 -137
- package/src/Player/StateManager.ts +124 -98
- package/src/Player/VariableManager.ts +23 -3
- package/src/RpgServer.ts +38 -14
- package/src/RpgServerEngine.ts +7 -0
- package/src/core/context.ts +3 -0
- package/src/core/inject.ts +17 -0
- package/src/core/setup.ts +20 -0
- package/src/index.ts +9 -31
- package/src/module.ts +32 -0
- package/src/presets/index.ts +1 -3
- package/src/rooms/lobby.ts +24 -0
- package/src/rooms/map.ts +311 -0
- package/tsconfig.json +26 -23
- package/vite.config.ts +21 -0
- package/CHANGELOG.md +0 -163
- package/LICENSE +0 -19
- package/browser/manifest.json +0 -7
- package/browser/rpg.server.js +0 -22372
- package/browser/rpg.server.umd.cjs +0 -22403
- package/lib/Game/EventManager.d.ts +0 -54
- package/lib/Game/EventManager.js +0 -107
- package/lib/Game/EventManager.js.map +0 -1
- package/lib/Game/Map.d.ts +0 -191
- package/lib/Game/Map.js +0 -414
- package/lib/Game/Map.js.map +0 -1
- package/lib/Game/WorldMaps.d.ts +0 -17
- package/lib/Game/WorldMaps.js +0 -28
- package/lib/Game/WorldMaps.js.map +0 -1
- package/lib/Gui/DialogGui.js +0 -57
- package/lib/Gui/DialogGui.js.map +0 -1
- package/lib/Gui/Gui.js +0 -37
- package/lib/Gui/Gui.js.map +0 -1
- package/lib/Gui/MenuGui.js +0 -23
- package/lib/Gui/MenuGui.js.map +0 -1
- package/lib/Gui/NotificationGui.js +0 -8
- package/lib/Gui/NotificationGui.js.map +0 -1
- package/lib/Gui/ShopGui.js +0 -40
- package/lib/Gui/ShopGui.js.map +0 -1
- package/lib/Gui/index.js +0 -7
- package/lib/Gui/index.js.map +0 -1
- package/lib/Interfaces/Gui.d.ts +0 -4
- package/lib/Interfaces/Gui.js +0 -2
- package/lib/Interfaces/Gui.js.map +0 -1
- package/lib/Interfaces/StateStore.d.ts +0 -5
- package/lib/Interfaces/StateStore.js +0 -2
- package/lib/Interfaces/StateStore.js.map +0 -1
- package/lib/MatchMaker.d.ts +0 -24
- package/lib/MatchMaker.js +0 -42
- package/lib/MatchMaker.js.map +0 -1
- package/lib/Monitor/index.d.ts +0 -17
- package/lib/Monitor/index.js +0 -72
- package/lib/Monitor/index.js.map +0 -1
- package/lib/Player/BattleManager.d.ts +0 -36
- package/lib/Player/BattleManager.js +0 -101
- package/lib/Player/BattleManager.js.map +0 -1
- package/lib/Player/ClassManager.d.ts +0 -47
- package/lib/Player/ClassManager.js +0 -65
- package/lib/Player/ClassManager.js.map +0 -1
- package/lib/Player/ComponentManager.d.ts +0 -397
- package/lib/Player/ComponentManager.js +0 -505
- package/lib/Player/ComponentManager.js.map +0 -1
- package/lib/Player/EffectManager.d.ts +0 -46
- package/lib/Player/EffectManager.js +0 -75
- package/lib/Player/EffectManager.js.map +0 -1
- package/lib/Player/ElementManager.d.ts +0 -108
- package/lib/Player/ElementManager.js +0 -120
- package/lib/Player/ElementManager.js.map +0 -1
- package/lib/Player/GoldManager.d.ts +0 -17
- package/lib/Player/GoldManager.js +0 -27
- package/lib/Player/GoldManager.js.map +0 -1
- package/lib/Player/GuiManager.d.ts +0 -247
- package/lib/Player/GuiManager.js +0 -291
- package/lib/Player/GuiManager.js.map +0 -1
- package/lib/Player/ItemFixture.d.ts +0 -7
- package/lib/Player/ItemFixture.js +0 -19
- package/lib/Player/ItemFixture.js.map +0 -1
- package/lib/Player/ItemManager.d.ts +0 -331
- package/lib/Player/ItemManager.js +0 -475
- package/lib/Player/ItemManager.js.map +0 -1
- package/lib/Player/MoveManager.d.ts +0 -333
- package/lib/Player/MoveManager.js +0 -450
- package/lib/Player/MoveManager.js.map +0 -1
- package/lib/Player/ParameterManager.d.ts +0 -316
- package/lib/Player/ParameterManager.js +0 -408
- package/lib/Player/ParameterManager.js.map +0 -1
- package/lib/Player/Player.d.ts +0 -828
- package/lib/Player/Player.js +0 -927
- package/lib/Player/Player.js.map +0 -1
- package/lib/Player/SkillManager.d.ts +0 -163
- package/lib/Player/SkillManager.js +0 -223
- package/lib/Player/SkillManager.js.map +0 -1
- package/lib/Player/StateManager.d.ts +0 -185
- package/lib/Player/StateManager.js +0 -228
- package/lib/Player/StateManager.js.map +0 -1
- package/lib/Player/VariableManager.d.ts +0 -46
- package/lib/Player/VariableManager.js +0 -52
- package/lib/Player/VariableManager.js.map +0 -1
- package/lib/Query.d.ts +0 -127
- package/lib/Query.js +0 -159
- package/lib/Query.js.map +0 -1
- package/lib/RpgServer.js +0 -2
- package/lib/RpgServer.js.map +0 -1
- package/lib/Scenes/Map.d.ts +0 -136
- package/lib/Scenes/Map.js +0 -273
- package/lib/Scenes/Map.js.map +0 -1
- package/lib/decorators/event.d.ts +0 -43
- package/lib/decorators/event.js +0 -13
- package/lib/decorators/event.js.map +0 -1
- package/lib/decorators/map.d.ts +0 -178
- package/lib/decorators/map.js +0 -43
- package/lib/decorators/map.js.map +0 -1
- package/lib/entry-point.d.ts +0 -34
- package/lib/entry-point.js +0 -70
- package/lib/entry-point.js.map +0 -1
- package/lib/express/api.d.ts +0 -3
- package/lib/express/api.js +0 -105
- package/lib/express/api.js.map +0 -1
- package/lib/express/errors/NotAuthorized.d.ts +0 -4
- package/lib/express/errors/NotAuthorized.js +0 -7
- package/lib/express/errors/NotAuthorized.js.map +0 -1
- package/lib/express/errors/NotFound.d.ts +0 -4
- package/lib/express/errors/NotFound.js +0 -7
- package/lib/express/errors/NotFound.js.map +0 -1
- package/lib/express/server.d.ts +0 -16
- package/lib/express/server.js +0 -65
- package/lib/express/server.js.map +0 -1
- package/lib/index.d.ts +0 -20
- package/lib/index.js +0 -19
- package/lib/index.js.map +0 -1
- package/lib/inject.d.ts +0 -22
- package/lib/inject.js +0 -29
- package/lib/inject.js.map +0 -1
- package/lib/logs/index.js +0 -6
- package/lib/logs/index.js.map +0 -1
- package/lib/logs/item.js +0 -34
- package/lib/logs/item.js.map +0 -1
- package/lib/logs/log.js +0 -7
- package/lib/logs/log.js.map +0 -1
- package/lib/logs/skill.js +0 -19
- package/lib/logs/skill.js.map +0 -1
- package/lib/logs/state.js +0 -13
- package/lib/logs/state.js.map +0 -1
- package/lib/models/Item.d.ts +0 -10
- package/lib/models/Item.js +0 -2
- package/lib/models/Item.js.map +0 -1
- package/lib/presets/index.js +0 -65
- package/lib/presets/index.js.map +0 -1
- package/lib/server.d.ts +0 -137
- package/lib/server.js +0 -443
- package/lib/server.js.map +0 -1
- package/rpg.toml +0 -14
- package/src/Game/EventManager.ts +0 -125
- package/src/Game/Map.ts +0 -495
- package/src/Game/WorldMaps.ts +0 -45
- package/src/Interfaces/Gui.ts +0 -4
- package/src/Interfaces/StateStore.ts +0 -5
- package/src/MatchMaker.ts +0 -65
- package/src/Monitor/index.ts +0 -78
- package/src/Query.ts +0 -172
- package/src/Scenes/Map.ts +0 -310
- package/src/decorators/event.ts +0 -58
- package/src/decorators/map.ts +0 -226
- package/src/entry-point.ts +0 -111
- package/src/express/api.ts +0 -118
- package/src/express/errors/NotAuthorized.ts +0 -6
- package/src/express/errors/NotFound.ts +0 -6
- package/src/express/server.ts +0 -87
- package/src/inject.ts +0 -33
- package/src/models/Item.ts +0 -11
- package/src/server.ts +0 -459
- /package/{lib → dist}/Gui/MenuGui.d.ts +0 -0
- /package/{lib → dist}/Gui/NotificationGui.d.ts +0 -0
- /package/{lib → dist}/Gui/ShopGui.d.ts +0 -0
- /package/{lib → dist}/Gui/index.d.ts +0 -0
- /package/{lib → dist}/logs/index.d.ts +0 -0
- /package/{lib → dist}/logs/item.d.ts +0 -0
- /package/{lib → dist}/logs/log.d.ts +0 -0
- /package/{lib → dist}/logs/skill.d.ts +0 -0
- /package/{lib → dist}/logs/state.d.ts +0 -0
- /package/{lib → dist}/presets/index.d.ts +0 -0
package/src/Game/EventManager.ts
DELETED
|
@@ -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
|
-
])
|
package/src/Game/WorldMaps.ts
DELETED
|
@@ -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
|
-
}
|
package/src/Interfaces/Gui.ts
DELETED