vimp-engine 0.21.0 → 0.22.1
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/package.json +1 -1
- package/src/client/components/model/Chat.js +2 -1
- package/src/client/components/view/Chat.js +8 -0
- package/src/client/style.css +6 -4
- package/src/host/HostGame.js +1 -1
- package/src/host/meta/core/RoundManager.js +14 -1
- package/src/host/meta/modules/chat/Chat.js +9 -3
- package/src/host/meta/player/Participant.js +6 -0
- package/src/host/meta/player/ParticipantManager.js +16 -0
package/package.json
CHANGED
|
@@ -51,7 +51,8 @@ export default class ChatModel {
|
|
|
51
51
|
|
|
52
52
|
// обновляет чат-лист. Данные могут быть 2-х видов:
|
|
53
53
|
// - в виде строки '<группа шаблонов>:<номер шаблона>:<параметры>'
|
|
54
|
-
// - в виде массива [<текст сообщения>,<имя автора>,<тип для
|
|
54
|
+
// - в виде массива [<текст сообщения>,<имя автора>,<тип для класса>,
|
|
55
|
+
// <цвет ника>?]
|
|
55
56
|
updateChat(arr) {
|
|
56
57
|
// если данные - строка
|
|
57
58
|
if (typeof arr === 'string') {
|
|
@@ -52,12 +52,20 @@ export default class ChatView {
|
|
|
52
52
|
const text = message[0];
|
|
53
53
|
const name = message[1] || 'System';
|
|
54
54
|
const type = typeof message[2] === 'number' ? message[2] : '';
|
|
55
|
+
// цвет ника от игры (необязательный четвёртый элемент). CSS красит
|
|
56
|
+
// `:before` через var(--chat-name-color, <цвет команды>), поэтому без
|
|
57
|
+
// этого свойства строка выглядит ровно как раньше
|
|
58
|
+
const color = typeof message[3] === 'string' ? message[3] : '';
|
|
55
59
|
|
|
56
60
|
line.id = `line_${id}`;
|
|
57
61
|
line.className = `line${type}`;
|
|
58
62
|
line.setAttribute('data-name', `${name}: `);
|
|
59
63
|
line.textContent = text;
|
|
60
64
|
|
|
65
|
+
if (color) {
|
|
66
|
+
line.style.setProperty('--chat-name-color', color);
|
|
67
|
+
}
|
|
68
|
+
|
|
61
69
|
this._chat.appendChild(line);
|
|
62
70
|
}
|
|
63
71
|
|
package/src/client/style.css
CHANGED
|
@@ -396,20 +396,22 @@ body.hide-cursor {
|
|
|
396
396
|
font-weight: bold;
|
|
397
397
|
}
|
|
398
398
|
|
|
399
|
+
/* --chat-name-color — цвет ника, который игра задала на конкретную строку
|
|
400
|
+
(ParticipantManager.setChatColor). Его нет — остаётся цвет команды */
|
|
399
401
|
#chat-box .line:before {
|
|
400
|
-
color: #f00;
|
|
402
|
+
color: var(--chat-name-color, #f00);
|
|
401
403
|
}
|
|
402
404
|
|
|
403
405
|
#chat-box .line1:before {
|
|
404
|
-
color: #f56;
|
|
406
|
+
color: var(--chat-name-color, #f56);
|
|
405
407
|
}
|
|
406
408
|
|
|
407
409
|
#chat-box .line2:before {
|
|
408
|
-
color: #7ed;
|
|
410
|
+
color: var(--chat-name-color, #7ed);
|
|
409
411
|
}
|
|
410
412
|
|
|
411
413
|
#chat-box .line3:before {
|
|
412
|
-
color: #fe5;
|
|
414
|
+
color: var(--chat-name-color, #fe5);
|
|
413
415
|
}
|
|
414
416
|
|
|
415
417
|
#cmd {
|
package/src/host/HostGame.js
CHANGED
|
@@ -1042,7 +1042,7 @@ export default class HostGame {
|
|
|
1042
1042
|
if (message.charAt(0) === '/') {
|
|
1043
1043
|
this._commandProcessor.parseCommand(gameId, message);
|
|
1044
1044
|
} else {
|
|
1045
|
-
this._chat.push(message, user.name, user.teamId);
|
|
1045
|
+
this._chat.push(message, user.name, user.teamId, user.chatColor);
|
|
1046
1046
|
}
|
|
1047
1047
|
}
|
|
1048
1048
|
}
|
|
@@ -218,9 +218,22 @@ class RoundManager {
|
|
|
218
218
|
// `_startRound` раздавал бы точки респауна карты каталога, то есть исходного
|
|
219
219
|
// размера, и расставлял всех по геометрии, которой в ядре уже нет
|
|
220
220
|
// (`@vimp-games/snakes`, `src/host/ArenaScaler.js`).
|
|
221
|
+
//
|
|
222
|
+
// Подменяются ОБЕ копии, и это не удобство, а исправление: `sendMap`
|
|
223
|
+
// отдаёт подключающемуся `_currentMapData`, то есть карту каталога — и
|
|
224
|
+
// клиент рисовал геометрию, которой в ядре уже нет, пока игра сама не
|
|
225
|
+
// пришлёт ему MAP_DATA. Между этими двумя кадрами он видит чужую границу.
|
|
226
|
+
//
|
|
227
|
+
// `mapData` приходит в КЛИЕНТСКОМ виде (несмасштабированные координаты плюс
|
|
228
|
+
// `scale`) — это тот же объект, который игра рассылает через `sendMap`, —
|
|
229
|
+
// поэтому масштабирование делается здесь, ровно как в `_prepareMapData`.
|
|
230
|
+
// Отдать `_scaledMapData` клиенту напрямую нельзя: клиент масштабирует сам
|
|
231
|
+
// (`client/main.js`, applyMapData), и при `scale !== 1` карта была бы
|
|
232
|
+
// умножена дважды.
|
|
221
233
|
overrideMapData(mapData) {
|
|
222
234
|
if (mapData) {
|
|
223
|
-
this.
|
|
235
|
+
this._currentMapData = mapData;
|
|
236
|
+
this._scaledMapData = scaleMapData(mapData);
|
|
224
237
|
}
|
|
225
238
|
}
|
|
226
239
|
|
|
@@ -26,9 +26,15 @@ class Chat {
|
|
|
26
26
|
delete this._userList[gameId];
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
// добавляет
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
// добавляет сообщение. color ('#rrggbb') — цвет ника, который игра задала
|
|
30
|
+
// через ParticipantManager.setChatColor; без него четвёртого элемента в
|
|
31
|
+
// массиве нет вовсе, и провод игры, которая цвет не задаёт, не меняется
|
|
32
|
+
push(message, name, teamId, color) {
|
|
33
|
+
if (typeof color === 'string') {
|
|
34
|
+
this._list.push([message, name, teamId, color]);
|
|
35
|
+
} else {
|
|
36
|
+
this._list.push([message, name, teamId]);
|
|
37
|
+
}
|
|
32
38
|
}
|
|
33
39
|
|
|
34
40
|
// добавляет системное сообщение для всех
|
|
@@ -7,6 +7,12 @@ class Participant {
|
|
|
7
7
|
this.team = team;
|
|
8
8
|
this.teamId = teamId;
|
|
9
9
|
this.status = 'spectator'; // 'spectator' | 'active' | 'dead'
|
|
10
|
+
|
|
11
|
+
// цвет ника в чате ('#rrggbb') или null — тогда ник красит класс команды.
|
|
12
|
+
// Ставит его игра (ParticipantManager.setChatColor): движок не знает, чем
|
|
13
|
+
// игра различает игроков визуально, а команда для этого годится не всегда
|
|
14
|
+
// — в игре на одну команду все ники одного цвета
|
|
15
|
+
this.chatColor = null;
|
|
10
16
|
// индекс точки респауна, занятой этим участником, или null. Раздаёт и
|
|
11
17
|
// освобождает его RoundManager: размер команды для этого не годится —
|
|
12
18
|
// он меняется на входах и выходах, а между попаданием в команду и
|
|
@@ -149,6 +149,22 @@ class ParticipantManager {
|
|
|
149
149
|
this._participants.delete(gameId);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
// задаёт цвет ника в чате: '#rgb'/'#rrggbb' или null (цвет команды).
|
|
153
|
+
// Единственный вход для игры — HostGame отдаёт это значение в chat.push,
|
|
154
|
+
// а клиентская view кладёт его инлайновой переменной на строку
|
|
155
|
+
setChatColor(gameId, color) {
|
|
156
|
+
const participant = this._participants.get(gameId);
|
|
157
|
+
|
|
158
|
+
if (!participant) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
participant.chatColor =
|
|
163
|
+
typeof color === 'string' && /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.test(color)
|
|
164
|
+
? color
|
|
165
|
+
: null;
|
|
166
|
+
}
|
|
167
|
+
|
|
152
168
|
get(gameId) {
|
|
153
169
|
return this._participants.get(gameId);
|
|
154
170
|
}
|