Message является единой точкой входа для отправки запросов клиентам. Базовый класс содержит название сообщения, которое является идентичным io-event'у, а так же DTO (Data transfer object) - тело сообщения.
Изменение тела сообщения должно происходить через вспомогательные методы, которые могут принимать в качестве аргументов классы сервера, конвертируя их в пригодный для передачи вид и прикладывая их к DTO (напр. withDamage)
Все сообщения хранятся в папке server/messages
, и должны быть сгруппированы
по сущностям либо по логическим структурам (напр. messages/player.js
содержит все сообщения, относящиеся
к сущности Player
)
Отправка сообщения:
let PlayerMessages = require('../messages/player');
...
(new PlayerMessages.Connected()) // Создаем сообщение
.withPlayer(playerEntity) // Добавляем информацию об игроке
.withVector(playerEntity.position) // Передаем позицию
.send(); // Не указываем сокет - броадкастим
Структура сообщения:
{
Player: {
id: 1
},
Vector: {
x: 0,
y: 0
}
}
Можно расширять методы сообщения или добавлять свои, например:
class DamagedMessage extends Message {
constructor() {
super('playerDamaged');
}
/*
* Переопределяем этот метод, чтобы добавить в DTO
* информацию о здоровье игрока
*/
withPlayer(player) {
super.withPlayer(player);
// Включить информацию о здоровье
super.DTO.Player.health = player.health;
return this;
}
},
Таким образом:
{
Player: {
id: 1,
health: 100
},
// ...
}
With - свойство тела сообщения, которое содержит базовую информацию о сущности, участвующую в сообщении.
Поля:
id
- идентификатор сущностиentityClass
- класс сущностиdimensions
- размеры
Player - свойство тела сообщения, содержащее информацию об игроке, участвующем в сообщении.
Поля:
id
- идентификатор игрока
Vector - свойство тела сообщения, содержащее вектор, участвующий в сообщении (напр. позиция).
Структура:
{
x: 5,
y: 0
}
Содержит информацию о повреждениях, и сущности, которая их порождает.
Структура:
{
Damage: 50,
Damager: {
id: 10,
entityClass: 'effectspell'
}
}
Содержит информацию о заклинании, которое скастовал игрок.
Структура:
{
Speed: 10,
Direction: {
x: 1,
y: 1
}
}
Effect - свойство тела сообщения, содержащее информацию об эффекте, накладываемом на сущность.
Поля:
effectClass
- класс эффектаduration
- длительность эффекта