gamelet-cli 0.7.12 → 0.7.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.
- package/assets/package.json.twig +3 -3
- package/assets/tsconfig.json.twig +1 -1
- package/build/package.json +67 -67
- package/build/src/gamelet/download.js +773 -737
- package/build/src/gamelet/merges.js +181 -179
- package/build/src/gamelet/prepare.js +276 -277
- package/build/src/gamelet/upload.js +280 -279
- package/build/src/index.js +86 -86
- package/build/src/server/Constant.js +9 -9
- package/build/src/server/entities/Client.js +78 -78
- package/build/src/server/entities/ClientOwner.js +67 -67
- package/build/src/server/entities/ClientProject.js +84 -84
- package/build/src/server/entities/Gameroom.js +89 -89
- package/build/src/server/entities/GameroomBase.js +276 -276
- package/build/src/server/entities/Gamezone.js +73 -73
- package/build/src/server/entities/ListFilter.js +193 -193
- package/build/src/server/entities/Monitor.js +94 -94
- package/build/src/server/entities/Player.js +140 -140
- package/build/src/server/managers/ApiManager.js +75 -75
- package/build/src/server/managers/ClientManager.js +64 -64
- package/build/src/server/managers/Database.js +627 -627
- package/build/src/server/managers/GameroomManager.js +392 -392
- package/build/src/server/managers/ManagerBase.js +17 -17
- package/build/src/server/managers/MonitorManager.js +73 -73
- package/build/src/server/managers/PlayerManager.js +108 -108
- package/build/src/server/managers/SocketManager.js +60 -60
- package/build/src/server/managers/UserManager.js +58 -58
- package/build/src/server/messages/Message.js +143 -143
- package/build/src/server/server.js +112 -113
- package/build/src/server/services/ServiceBase.js +25 -25
- package/build/src/server/services/clientService.js +23 -23
- package/build/src/server/services/gameroomService.js +121 -121
- package/build/src/server/services/gltserver.service.js +23 -23
- package/build/src/server/services/playerService.js +32 -32
- package/build/src/server/startServer.js +32 -33
- package/build/src/server/types/BadgeStatus.js +25 -25
- package/build/src/server/types/OrderType.js +38 -38
- package/build/src/server/types/SubmitType.js +24 -24
- package/build/src/server/types/TimeRange.js +26 -26
- package/build/src/server/utils/ArrayUtil.js +126 -126
- package/build/src/server/utils/IntUtil.js +9 -9
- package/build/src/server/utils/ObjectUtil.js +191 -191
- package/build/src/server/utils/StringUtil.js +37 -37
- package/build/src/utils/cli.js +53 -53
- package/build/src/utils/file.js +350 -337
- package/build/src/utils/init.js +57 -42
- package/build/src/utils/log.js +18 -17
- package/build/src/utils/net.js +43 -39
- package/package.json +2 -2
|
@@ -1,276 +1,276 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GameroomBase = void 0;
|
|
4
|
-
const Message_1 = require("../messages/Message");
|
|
5
|
-
const ArrayUtil_1 = require("./../utils/ArrayUtil");
|
|
6
|
-
const events_1 = require("events");
|
|
7
|
-
const MonitorManager_1 = require("../managers/MonitorManager");
|
|
8
|
-
class GameroomBase extends events_1.EventEmitter {
|
|
9
|
-
constructor(roomType, code, server, client, stateJson) {
|
|
10
|
-
super();
|
|
11
|
-
this.roomType = roomType;
|
|
12
|
-
this.code = code;
|
|
13
|
-
this.server = server;
|
|
14
|
-
this.client = client;
|
|
15
|
-
this.stateJson = stateJson;
|
|
16
|
-
this.players = [];
|
|
17
|
-
// private states for each player, playerCode: object
|
|
18
|
-
this.playerStates = {};
|
|
19
|
-
this.createTime = Math.floor(Date.now() / 1000);
|
|
20
|
-
this.stateJson = this.stateJson || {};
|
|
21
|
-
}
|
|
22
|
-
setFpsDirty() {
|
|
23
|
-
this.ping = null;
|
|
24
|
-
}
|
|
25
|
-
getPing() {
|
|
26
|
-
if (!this.ping) {
|
|
27
|
-
if (this.players.length) {
|
|
28
|
-
let min = 9999;
|
|
29
|
-
let max = 0;
|
|
30
|
-
let total = 0;
|
|
31
|
-
for (let p of this.players) {
|
|
32
|
-
min = Math.min(min, p.networkDelay);
|
|
33
|
-
max = Math.max(max, p.networkDelay);
|
|
34
|
-
total += p.networkDelay;
|
|
35
|
-
}
|
|
36
|
-
this.ping = {
|
|
37
|
-
min: min,
|
|
38
|
-
max: max,
|
|
39
|
-
avg: Math.round(total / this.players.length),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
this.ping = {
|
|
44
|
-
min: 0,
|
|
45
|
-
max: 0,
|
|
46
|
-
avg: 0,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return this.ping;
|
|
51
|
-
}
|
|
52
|
-
get monitorChannel() {
|
|
53
|
-
return this.code;
|
|
54
|
-
}
|
|
55
|
-
dispose() {
|
|
56
|
-
this.listPlayers().forEach(player => this.removePlayer(player));
|
|
57
|
-
this.emit(GameroomBase.EVENT.DISPOSED);
|
|
58
|
-
MonitorManager_1.monitorManager.log(this.client.project.code, this.monitorChannel, this.roomType + ' disposed', this.code);
|
|
59
|
-
}
|
|
60
|
-
setPlayerSynced(player, value, updateBrainer) {
|
|
61
|
-
let promise;
|
|
62
|
-
if (this.setPlayerState(player, 'synced', value, false)) {
|
|
63
|
-
if (updateBrainer) {
|
|
64
|
-
promise = this.updateBrainer(true);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return (promise || Promise.resolve()).then(() => {
|
|
68
|
-
this.emit(GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, player, value, this.brainer.code);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
isPlayerSynced(player) {
|
|
72
|
-
return !!this.getPlayerState(player, 'synced');
|
|
73
|
-
}
|
|
74
|
-
setPlayerState(player, key, value, emitEvent = true) {
|
|
75
|
-
if (this.players.includes(player)) {
|
|
76
|
-
let states = this.playerStates[player.code];
|
|
77
|
-
if (!states) {
|
|
78
|
-
this.playerStates[player.code] = states = {};
|
|
79
|
-
}
|
|
80
|
-
if (this._setPlayerState(states, key, value)) {
|
|
81
|
-
emitEvent && this.emit(GameroomBase.EVENT.PLAYER_STATE_CHANGED, player, key, value);
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
_setPlayerState(states, key, value) {
|
|
91
|
-
if (states[key] !== value) {
|
|
92
|
-
if (value === undefined || value === null) {
|
|
93
|
-
value = null;
|
|
94
|
-
delete states[key];
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
states[key] = value;
|
|
98
|
-
}
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
setPlayerStates(player, newStates) {
|
|
104
|
-
if (this.players.includes(player)) {
|
|
105
|
-
let result = false;
|
|
106
|
-
if (newStates) {
|
|
107
|
-
let states = this.playerStates[player.code];
|
|
108
|
-
if (!states) {
|
|
109
|
-
this.playerStates[player.code] = states = {};
|
|
110
|
-
}
|
|
111
|
-
for (let key in newStates) {
|
|
112
|
-
if (this._setPlayerState(states, key, newStates[key])) {
|
|
113
|
-
result = true;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else if (this.playerStates[player.code]) {
|
|
118
|
-
result = true;
|
|
119
|
-
this.deletePlayerState(player);
|
|
120
|
-
}
|
|
121
|
-
if (result) {
|
|
122
|
-
this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, newStates);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
|
|
127
|
-
}
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
getPlayer(code) {
|
|
131
|
-
return this.players.find(p => p.code == code);
|
|
132
|
-
}
|
|
133
|
-
includesPlayer(player) {
|
|
134
|
-
return this.players.includes(player);
|
|
135
|
-
}
|
|
136
|
-
getPlayerState(player, key) {
|
|
137
|
-
let state = this.playerStates[player.code];
|
|
138
|
-
return state && state[key];
|
|
139
|
-
}
|
|
140
|
-
getPlayerStates(player) {
|
|
141
|
-
return this.playerStates[player.code];
|
|
142
|
-
}
|
|
143
|
-
deletePlayerState(player) {
|
|
144
|
-
if (this.playerStates[player.code]) {
|
|
145
|
-
delete this.playerStates[player.code];
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
listPlayers() {
|
|
153
|
-
return this.players.slice();
|
|
154
|
-
}
|
|
155
|
-
getPlayersStates() {
|
|
156
|
-
return this.playerStates;
|
|
157
|
-
}
|
|
158
|
-
get playersCount() {
|
|
159
|
-
return this.players.length;
|
|
160
|
-
}
|
|
161
|
-
get socketChannel() {
|
|
162
|
-
return this.code;
|
|
163
|
-
}
|
|
164
|
-
addPlayer(player) {
|
|
165
|
-
if (ArrayUtil_1.ArrayUtil.addUniqueElement(this.players, player)) {
|
|
166
|
-
this.setFpsDirty();
|
|
167
|
-
if (!this.brainer) {
|
|
168
|
-
this.updateBrainer(false);
|
|
169
|
-
}
|
|
170
|
-
player.socket.join(this.socketChannel);
|
|
171
|
-
this.emit(GameroomBase.EVENT.PLAYER_ADDED, player);
|
|
172
|
-
this.emit(GameroomBase.EVENT.STATUS_CHANGED);
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
removePlayer(player) {
|
|
178
|
-
if (ArrayUtil_1.ArrayUtil.removeElement(this.players, player)) {
|
|
179
|
-
this.setFpsDirty();
|
|
180
|
-
player.socket.leave(this.socketChannel);
|
|
181
|
-
if (this.deletePlayerState(player)) {
|
|
182
|
-
this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, null);
|
|
183
|
-
}
|
|
184
|
-
if (player == this.brainer) {
|
|
185
|
-
// must do this before we send playerLeft event
|
|
186
|
-
this.updateBrainer(false);
|
|
187
|
-
}
|
|
188
|
-
this.emit(GameroomBase.EVENT.STATUS_CHANGED);
|
|
189
|
-
this.emit(GameroomBase.EVENT.PLAYER_REMOVED, player);
|
|
190
|
-
return true;
|
|
191
|
-
}
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
setBrainerByPlayer(playerCode, needPreset) {
|
|
195
|
-
let brainer = this.players.find(p => p.code == playerCode);
|
|
196
|
-
if (!brainer) {
|
|
197
|
-
throw new Error('The player is not in room.');
|
|
198
|
-
}
|
|
199
|
-
return this._setBrainer(brainer, needPreset);
|
|
200
|
-
}
|
|
201
|
-
updateBrainer(needPreset) {
|
|
202
|
-
return this._setBrainer(this.chooseBrainer(), needPreset);
|
|
203
|
-
}
|
|
204
|
-
_setBrainer(brainer, needPreset) {
|
|
205
|
-
if (brainer != this.brainer) {
|
|
206
|
-
if (needPreset) {
|
|
207
|
-
return brainer.send(Message_1.Message.forRoomBrainerSet(this.code))
|
|
208
|
-
.then(() => {
|
|
209
|
-
this.brainer = brainer;
|
|
210
|
-
this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
|
|
211
|
-
return this.brainer;
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
this.brainer = brainer;
|
|
216
|
-
this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return Promise.resolve(this.brainer);
|
|
220
|
-
}
|
|
221
|
-
chooseBrainer() {
|
|
222
|
-
if (this.players.length) {
|
|
223
|
-
let idleStart = Date.now() - 10000;
|
|
224
|
-
let brainer = this.players[0];
|
|
225
|
-
let bestDelay = this.calcNetworkDelayValue(brainer, idleStart);
|
|
226
|
-
for (let i = this.players.length - 1; i > 0; --i) {
|
|
227
|
-
let player = this.players[i];
|
|
228
|
-
if (this.isPlayerSynced(player)) {
|
|
229
|
-
let delay = this.calcNetworkDelayValue(player, idleStart);
|
|
230
|
-
if (player.cheats) {
|
|
231
|
-
delay += 500;
|
|
232
|
-
}
|
|
233
|
-
if (delay < bestDelay) {
|
|
234
|
-
brainer = player;
|
|
235
|
-
bestDelay = delay;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
return brainer;
|
|
240
|
-
}
|
|
241
|
-
return null;
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* network delay + idle factor
|
|
245
|
-
*/
|
|
246
|
-
calcNetworkDelayValue(player, idleStart) {
|
|
247
|
-
let value = player.networkDelay;
|
|
248
|
-
if (idleStart > player.lastMsgTime) {
|
|
249
|
-
value += (idleStart - player.lastMsgTime) / 100;
|
|
250
|
-
}
|
|
251
|
-
return value;
|
|
252
|
-
}
|
|
253
|
-
getBrainer() {
|
|
254
|
-
return this.brainer;
|
|
255
|
-
}
|
|
256
|
-
broadcast(msg) {
|
|
257
|
-
MonitorManager_1.monitorManager.logOutgoing(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params]);
|
|
258
|
-
msg.send(this.server.to(this.socketChannel));
|
|
259
|
-
}
|
|
260
|
-
broadcastByPlayer(msg, sender) {
|
|
261
|
-
MonitorManager_1.monitorManager.logIncoming(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params], sender);
|
|
262
|
-
msg.send(this.server.to(this.socketChannel));
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
exports.GameroomBase = GameroomBase;
|
|
266
|
-
GameroomBase.EVENT = {
|
|
267
|
-
DISPOSED: 'disposed',
|
|
268
|
-
PLAYER_ADDED: 'playerAdded',
|
|
269
|
-
PLAYER_REMOVED: 'playerRemoved',
|
|
270
|
-
BRAINER_CHANGED: 'brainerChanged',
|
|
271
|
-
STATUS_CHANGED: 'statusChanged',
|
|
272
|
-
PLAYER_STATE_CHANGED: 'playerStateChanged',
|
|
273
|
-
PLAYER_STATES_CHANGED: 'playerStatesChanged',
|
|
274
|
-
PLAYER_SYNCED_CHANGED: 'playerSyncedChanged',
|
|
275
|
-
};
|
|
276
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJvb21CYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9HYW1lcm9vbUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQThDO0FBQzlDLG9EQUFpRDtBQUVqRCxtQ0FBc0M7QUFDdEMsK0RBQTREO0FBRTVELE1BQWEsWUFBYSxTQUFRLHFCQUFZO0lBd0IxQyxZQUFtQixRQUFnQixFQUN4QixJQUFZLEVBQ1gsTUFBMEIsRUFDM0IsTUFBYyxFQUNkLFNBQWtDO1FBRXpDLEtBQUssRUFBRSxDQUFDO1FBTk8sYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1gsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQXlCO1FBYm5DLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFJakMscURBQXFEO1FBQzNDLGlCQUFZLEdBQThDLEVBQUUsQ0FBQztRQUVoRSxlQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFTdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7Z0JBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZCxLQUFLLElBQUksQ0FBQyxJ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
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GameroomBase = void 0;
|
|
4
|
+
const Message_1 = require("../messages/Message");
|
|
5
|
+
const ArrayUtil_1 = require("./../utils/ArrayUtil");
|
|
6
|
+
const events_1 = require("events");
|
|
7
|
+
const MonitorManager_1 = require("../managers/MonitorManager");
|
|
8
|
+
class GameroomBase extends events_1.EventEmitter {
|
|
9
|
+
constructor(roomType, code, server, client, stateJson) {
|
|
10
|
+
super();
|
|
11
|
+
this.roomType = roomType;
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.server = server;
|
|
14
|
+
this.client = client;
|
|
15
|
+
this.stateJson = stateJson;
|
|
16
|
+
this.players = [];
|
|
17
|
+
// private states for each player, playerCode: object
|
|
18
|
+
this.playerStates = {};
|
|
19
|
+
this.createTime = Math.floor(Date.now() / 1000);
|
|
20
|
+
this.stateJson = this.stateJson || {};
|
|
21
|
+
}
|
|
22
|
+
setFpsDirty() {
|
|
23
|
+
this.ping = null;
|
|
24
|
+
}
|
|
25
|
+
getPing() {
|
|
26
|
+
if (!this.ping) {
|
|
27
|
+
if (this.players.length) {
|
|
28
|
+
let min = 9999;
|
|
29
|
+
let max = 0;
|
|
30
|
+
let total = 0;
|
|
31
|
+
for (let p of this.players) {
|
|
32
|
+
min = Math.min(min, p.networkDelay);
|
|
33
|
+
max = Math.max(max, p.networkDelay);
|
|
34
|
+
total += p.networkDelay;
|
|
35
|
+
}
|
|
36
|
+
this.ping = {
|
|
37
|
+
min: min,
|
|
38
|
+
max: max,
|
|
39
|
+
avg: Math.round(total / this.players.length),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.ping = {
|
|
44
|
+
min: 0,
|
|
45
|
+
max: 0,
|
|
46
|
+
avg: 0,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return this.ping;
|
|
51
|
+
}
|
|
52
|
+
get monitorChannel() {
|
|
53
|
+
return this.code;
|
|
54
|
+
}
|
|
55
|
+
dispose() {
|
|
56
|
+
this.listPlayers().forEach(player => this.removePlayer(player));
|
|
57
|
+
this.emit(GameroomBase.EVENT.DISPOSED);
|
|
58
|
+
MonitorManager_1.monitorManager.log(this.client.project.code, this.monitorChannel, this.roomType + ' disposed', this.code);
|
|
59
|
+
}
|
|
60
|
+
setPlayerSynced(player, value, updateBrainer) {
|
|
61
|
+
let promise;
|
|
62
|
+
if (this.setPlayerState(player, 'synced', value, false)) {
|
|
63
|
+
if (updateBrainer) {
|
|
64
|
+
promise = this.updateBrainer(true);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return (promise || Promise.resolve()).then(() => {
|
|
68
|
+
this.emit(GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, player, value, this.brainer.code);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
isPlayerSynced(player) {
|
|
72
|
+
return !!this.getPlayerState(player, 'synced');
|
|
73
|
+
}
|
|
74
|
+
setPlayerState(player, key, value, emitEvent = true) {
|
|
75
|
+
if (this.players.includes(player)) {
|
|
76
|
+
let states = this.playerStates[player.code];
|
|
77
|
+
if (!states) {
|
|
78
|
+
this.playerStates[player.code] = states = {};
|
|
79
|
+
}
|
|
80
|
+
if (this._setPlayerState(states, key, value)) {
|
|
81
|
+
emitEvent && this.emit(GameroomBase.EVENT.PLAYER_STATE_CHANGED, player, key, value);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
_setPlayerState(states, key, value) {
|
|
91
|
+
if (states[key] !== value) {
|
|
92
|
+
if (value === undefined || value === null) {
|
|
93
|
+
value = null;
|
|
94
|
+
delete states[key];
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
states[key] = value;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
setPlayerStates(player, newStates) {
|
|
104
|
+
if (this.players.includes(player)) {
|
|
105
|
+
let result = false;
|
|
106
|
+
if (newStates) {
|
|
107
|
+
let states = this.playerStates[player.code];
|
|
108
|
+
if (!states) {
|
|
109
|
+
this.playerStates[player.code] = states = {};
|
|
110
|
+
}
|
|
111
|
+
for (let key in newStates) {
|
|
112
|
+
if (this._setPlayerState(states, key, newStates[key])) {
|
|
113
|
+
result = true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (this.playerStates[player.code]) {
|
|
118
|
+
result = true;
|
|
119
|
+
this.deletePlayerState(player);
|
|
120
|
+
}
|
|
121
|
+
if (result) {
|
|
122
|
+
this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, newStates);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
getPlayer(code) {
|
|
131
|
+
return this.players.find(p => p.code == code);
|
|
132
|
+
}
|
|
133
|
+
includesPlayer(player) {
|
|
134
|
+
return this.players.includes(player);
|
|
135
|
+
}
|
|
136
|
+
getPlayerState(player, key) {
|
|
137
|
+
let state = this.playerStates[player.code];
|
|
138
|
+
return state && state[key];
|
|
139
|
+
}
|
|
140
|
+
getPlayerStates(player) {
|
|
141
|
+
return this.playerStates[player.code];
|
|
142
|
+
}
|
|
143
|
+
deletePlayerState(player) {
|
|
144
|
+
if (this.playerStates[player.code]) {
|
|
145
|
+
delete this.playerStates[player.code];
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
listPlayers() {
|
|
153
|
+
return this.players.slice();
|
|
154
|
+
}
|
|
155
|
+
getPlayersStates() {
|
|
156
|
+
return this.playerStates;
|
|
157
|
+
}
|
|
158
|
+
get playersCount() {
|
|
159
|
+
return this.players.length;
|
|
160
|
+
}
|
|
161
|
+
get socketChannel() {
|
|
162
|
+
return this.code;
|
|
163
|
+
}
|
|
164
|
+
addPlayer(player) {
|
|
165
|
+
if (ArrayUtil_1.ArrayUtil.addUniqueElement(this.players, player)) {
|
|
166
|
+
this.setFpsDirty();
|
|
167
|
+
if (!this.brainer) {
|
|
168
|
+
this.updateBrainer(false);
|
|
169
|
+
}
|
|
170
|
+
player.socket.join(this.socketChannel);
|
|
171
|
+
this.emit(GameroomBase.EVENT.PLAYER_ADDED, player);
|
|
172
|
+
this.emit(GameroomBase.EVENT.STATUS_CHANGED);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
removePlayer(player) {
|
|
178
|
+
if (ArrayUtil_1.ArrayUtil.removeElement(this.players, player)) {
|
|
179
|
+
this.setFpsDirty();
|
|
180
|
+
player.socket.leave(this.socketChannel);
|
|
181
|
+
if (this.deletePlayerState(player)) {
|
|
182
|
+
this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, null);
|
|
183
|
+
}
|
|
184
|
+
if (player == this.brainer) {
|
|
185
|
+
// must do this before we send playerLeft event
|
|
186
|
+
this.updateBrainer(false);
|
|
187
|
+
}
|
|
188
|
+
this.emit(GameroomBase.EVENT.STATUS_CHANGED);
|
|
189
|
+
this.emit(GameroomBase.EVENT.PLAYER_REMOVED, player);
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
setBrainerByPlayer(playerCode, needPreset) {
|
|
195
|
+
let brainer = this.players.find(p => p.code == playerCode);
|
|
196
|
+
if (!brainer) {
|
|
197
|
+
throw new Error('The player is not in room.');
|
|
198
|
+
}
|
|
199
|
+
return this._setBrainer(brainer, needPreset);
|
|
200
|
+
}
|
|
201
|
+
updateBrainer(needPreset) {
|
|
202
|
+
return this._setBrainer(this.chooseBrainer(), needPreset);
|
|
203
|
+
}
|
|
204
|
+
_setBrainer(brainer, needPreset) {
|
|
205
|
+
if (brainer != this.brainer) {
|
|
206
|
+
if (needPreset) {
|
|
207
|
+
return brainer.send(Message_1.Message.forRoomBrainerSet(this.code))
|
|
208
|
+
.then(() => {
|
|
209
|
+
this.brainer = brainer;
|
|
210
|
+
this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
|
|
211
|
+
return this.brainer;
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
this.brainer = brainer;
|
|
216
|
+
this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return Promise.resolve(this.brainer);
|
|
220
|
+
}
|
|
221
|
+
chooseBrainer() {
|
|
222
|
+
if (this.players.length) {
|
|
223
|
+
let idleStart = Date.now() - 10000;
|
|
224
|
+
let brainer = this.players[0];
|
|
225
|
+
let bestDelay = this.calcNetworkDelayValue(brainer, idleStart);
|
|
226
|
+
for (let i = this.players.length - 1; i > 0; --i) {
|
|
227
|
+
let player = this.players[i];
|
|
228
|
+
if (this.isPlayerSynced(player)) {
|
|
229
|
+
let delay = this.calcNetworkDelayValue(player, idleStart);
|
|
230
|
+
if (player.cheats) {
|
|
231
|
+
delay += 500;
|
|
232
|
+
}
|
|
233
|
+
if (delay < bestDelay) {
|
|
234
|
+
brainer = player;
|
|
235
|
+
bestDelay = delay;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return brainer;
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* network delay + idle factor
|
|
245
|
+
*/
|
|
246
|
+
calcNetworkDelayValue(player, idleStart) {
|
|
247
|
+
let value = player.networkDelay;
|
|
248
|
+
if (idleStart > player.lastMsgTime) {
|
|
249
|
+
value += (idleStart - player.lastMsgTime) / 100;
|
|
250
|
+
}
|
|
251
|
+
return value;
|
|
252
|
+
}
|
|
253
|
+
getBrainer() {
|
|
254
|
+
return this.brainer;
|
|
255
|
+
}
|
|
256
|
+
broadcast(msg) {
|
|
257
|
+
MonitorManager_1.monitorManager.logOutgoing(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params]);
|
|
258
|
+
msg.send(this.server.to(this.socketChannel));
|
|
259
|
+
}
|
|
260
|
+
broadcastByPlayer(msg, sender) {
|
|
261
|
+
MonitorManager_1.monitorManager.logIncoming(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params], sender);
|
|
262
|
+
msg.send(this.server.to(this.socketChannel));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
exports.GameroomBase = GameroomBase;
|
|
266
|
+
GameroomBase.EVENT = {
|
|
267
|
+
DISPOSED: 'disposed',
|
|
268
|
+
PLAYER_ADDED: 'playerAdded',
|
|
269
|
+
PLAYER_REMOVED: 'playerRemoved',
|
|
270
|
+
BRAINER_CHANGED: 'brainerChanged',
|
|
271
|
+
STATUS_CHANGED: 'statusChanged',
|
|
272
|
+
PLAYER_STATE_CHANGED: 'playerStateChanged',
|
|
273
|
+
PLAYER_STATES_CHANGED: 'playerStatesChanged',
|
|
274
|
+
PLAYER_SYNCED_CHANGED: 'playerSyncedChanged',
|
|
275
|
+
};
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJvb21CYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9HYW1lcm9vbUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQThDO0FBQzlDLG9EQUFpRDtBQUVqRCxtQ0FBc0M7QUFDdEMsK0RBQTREO0FBRTVELE1BQWEsWUFBYSxTQUFRLHFCQUFZO0lBd0IxQyxZQUFtQixRQUFnQixFQUN4QixJQUFZLEVBQ1gsTUFBMEIsRUFDM0IsTUFBYyxFQUNkLFNBQWtDO1FBRXpDLEtBQUssRUFBRSxDQUFDO1FBTk8sYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1gsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQXlCO1FBYm5DLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFJakMscURBQXFEO1FBQzNDLGlCQUFZLEdBQThDLEVBQUUsQ0FBQztRQUVoRSxlQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFTdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO2dCQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDWixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxJ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
|