Перейти к основному содержимому
🎉 GP CONF 2026: Конференция о рынке WEB-игр 👾 23 сентября | Подробнее

Сообщения

Сообщения описывают одноразовые действия, которые не нужно хранить и интерполировать как состояние.

Список методов

Действия:

События:

Используйте сообщения для таких событий, как:

  • выстрел игрока;
  • взрыв или визуальный эффект;
  • эмоция;
  • запуск или перезапуск раунда;
  • взаимодействие с объектом карты.

Используйте состояние игрока или глобальное состояние, если значение должно сохраняться в последующих снимках.

Получение сообщений

Зарегистрируйте один обработчик и распределяйте сообщения по eventName:

function onMultiplayerMessage({
eventName,
senderId,
data,
timestamp,
}) {
if (eventName === 'shoot') {
createBullet({
ownerId: senderId,
x: data.x,
y: data.y,
direction: data.direction,
});
}

if (eventName === 'emote') {
showEmote(senderId, data.name);
}
}

gp.multiplayer.onMessage(onMultiplayerMessage);

Обработчик получает:

ПолеОписание
eventNameТип сообщения, заданный игрой
senderIdID игрока, отправившего сообщение
dataПроизвольные JSON-совместимые данные
timestampВремя создания сообщения

Отправка другим игрокам

Если цель не указана, сообщение отправляется всем остальным игрокам:

gp.multiplayer.sendMessage('shoot', {
x: player.x,
y: player.y,
direction: player.direction,
});

Значение 'all' можно передать явно:

gp.multiplayer.sendMessage(
'roundStarted',
{ round: 2 },
'all',
);

Чтобы отправить сообщение одному игроку, передайте его playerId:

gp.multiplayer.sendMessage(
'privateEmote',
{ name: 'wave' },
targetPlayerId,
);

Локальная обработка через Echo

По умолчанию отправитель не получает собственное сообщение. Используйте echo: true, чтобы немедленно вызвать тот же локальный обработчик:

gp.multiplayer.sendMessage(
'explosion',
{
x: 320,
y: 180,
radius: 80,
},
{
target: 'all',
echo: true,
},
);

Отправитель получает событие локально, не ожидая сетевого обмена. Остальные игроки получают его через мультиплеер обычным способом.

Это удобно, когда все клиенты, включая отправителя, должны выполнить один и тот же обработчик.

Выбор модели авторитетности

Сообщения передают событие, но не проверяют игровые правила. Определите, какой клиент имеет право создавать или подтверждать событие.

Для авторитетных действий пиры могут отправлять запрос, а хост — рассылать подтверждённый результат:

function onMultiplayerMessage({ eventName, senderId, data }) {
if (eventName === 'requestOpenChest' && gp.multiplayer.isHost) {
if (canOpenChest(senderId, data.chestId)) {
openChestInGlobalState(data.chestId);

gp.multiplayer.sendMessage('chestOpened', {
chestId: data.chestId,
playerId: senderId,
});
}
}
}

gp.multiplayer.sendMessage('requestOpenChest', {
chestId: 'chest-7',
});

Постоянный результат должен находиться в globalState; сообщения представляют запрос и уведомление.

Отписка

Передайте ту же ссылку на функцию, которая использовалась при подписке:

gp.multiplayer.offMessage(onMultiplayerMessage);

Оставайтесь на связи

С другими документами раздела вы можете ознакомиться здесь. Для начала работы с GamePush ознакомьтесь с нашими туториалами.

Сообщество GamePush в Telegram: @gs_community.

Для ваших обращений e-mail: official@gamepush.com

Желаем вам успехов!