Skip to content

События и RPC

Varion разделяет четыре канала:

  • varion.on(...) - встроенные server/client lifecycle и локальные client events;
  • varion.onClient(...) - произвольные события client -> server;
  • varion.onServer(...) - произвольные события server -> client;
  • varion.onRpc(...) / varion.callServer(...) - client -> server request/response.

Встроенные server events

Это текущий фактический контракт Node-host. Имена и регистр значимы.

EventАргументы
resourceStart() для запускаемого ресурса
resourceStop() перед остановкой ресурса
anyResourceStart(resourceName)
anyResourceStop(resourceName)
anyResourceError(resourceName) для всех загруженных ресурсов-наблюдателей
resourceError(error, file, line, stackTrace) до очистки упавшего ресурса
serverStarted() после завершения initial start всех configured resources
playerConnect(player, name) после аутентификации транспорта
playerReady(player) после загрузки client resource manifest
playerDisconnect(player, reason) до удаления Player proxy
playerSpawn(player) после постановки подтверждённого spawn-пакета в отправку
playerHeal(player, oldHealth, newHealth, oldArmour, newArmour) после авторитетного увеличения
playerDimensionChange(player, oldDimension, newDimension) при фактической смене dimension
playerWeaponChange(player, oldWeapon, newWeapon) из проверенного client sync-пакета
playerAnimationChange(player, oldAnimDict, newAnimDict, oldAnimName, newAnimName) по hash-полям animation sync-node
netOwnerChange(entity, ownerOrNull, oldOwnerOrNull) при миграции владельца entity
syncedMetaChange(entity, key, value, oldValue) при изменении entity metadata для всех клиентов
streamSyncedMetaChange(baseObject, key, value, oldValue) при изменении streaming-scoped metadata
globalMetaChange(key, value, oldValue) для локальной server metadata
globalSyncedMetaChange(key, value, oldValue) для глобальной metadata, реплицируемой клиентам
metaChange(target, key, value, oldValue) при изменении локальной Player/Entity metadata
baseObjectCreate(baseObject) после авторитетного создания Player/Entity
baseObjectRemove(baseObject) перед инвалидированием Player/Entity proxy
removeEntity(entity) перед удалением network entity
vehicleDestroy(vehicle) перед удалением Vehicle
vehicleSiren(vehicle, state) при авторитетной смене siren-state от net owner
weaponDamage(source, target, weaponHash, damage, offset, bodyPart)
playerDamage(victim, attacker, healthDamage, armourDamage, weaponHash)
playerDeath(player, killerOrNull, weaponHash)
playerEnterVehicle(player, vehicleId, seat)
playerLeaveVehicle(player, vehicleId, seat)
playerChangeVehicleSeat(player, vehicleId, oldSeat, newSeat)
playerEnteredVehicle(player, vehicle, seat); driver seat = 1
playerLeftVehicle(player, vehicle, seat); driver seat = 1
playerChangedVehicleSeat(player, vehicle, oldSeat, newSeat)
playerEnterColshape(player, colshapeId)
playerLeaveColshape(player, colshapeId)
entityEnterColshape(colshape, entity); порядок аргументов — colshape первым; server proximity отслеживает Player entities
entityLeaveColshape(colshape, entity); порядок аргументов — colshape первым; server proximity отслеживает Player entities
playerEnterCheckpoint(player, checkpointId)
playerLeaveCheckpoint(player, checkpointId)

weaponDamage выполняется синхронно перед изменением authoritative health:

js
varion.on('weaponDamage', (source, target, weaponHash, damage) => {
  if (weaponHash === varion.hash('WEAPON_RPG')) return false; // отменить
  if (weaponHash === varion.hash('WEAPON_STUNGUN')) return 1; // заменить damage
  return undefined; // принять исходный damage
});

Возвращаемое значение: false отменяет hit, число заменяет damage, undefined принимает исходное значение. Promise здесь запрещён, остальные handlers могут быть async.

Спавн принадлежит gameplay-ресурсу:

js
varion.on('playerReady', (player) => {
  player.spawn({ x: 215.76, y: -810.12, z: 30.73 }, 157, 0x705E61F2);
});

setMeta хранится только на сервере. setSyncedMeta реплицируется всем клиентам, а setStreamSyncedMeta только клиентам, которые сейчас стримят entity. Установка, замена и удаление вызывают соответствующее событие с точными новым и старым значениями. Исторические методы setGlobalMeta являются alias глобальной synced metadata.

Встроенные client events

Подписка выполняется через varion.on(name, callback). Основная проверенная поверхность:

КатегорияEvents
Connectionconnection:state, connection:complete, connectionComplete, connection:queue, disconnect
ResourcesresourceStart, resourceStop, anyResourceStart, anyResourceStop, anyResourceError, everyTick
Spawn/combatplayerSpawn, spawn:success, spawned, playerDeath, incomingDamage, playerWeaponChange, playerWeaponShoot
EntitiesentityStreamIn, entityStreamOut, worldObjectStreamIn, worldObjectStreamOut, gameEntityCreate, gameEntityDestroy, baseObjectCreate, baseObjectRemove, netOwnerChange
Virtual/positionvirtualEntityStreamIn, virtualEntityStreamOut, virtualEntityPositionChange, worldObjectPositionChange
Player stateplayerDimensionChange, playerInteriorChange, playerAnimationChange
VehicleenteredVehicle, leftVehicle, changedVehicleSeat
AreasplayerEnterColShape, playerExitColShape, entityEnterColshape, entityLeaveColshape, playerEnterCheckpoint, playerExitCheckpoint
MetadatametaChange, syncedMetaChange, streamSyncedMetaChange, localMetaChange, globalMetaChange, globalSyncedMetaChange, localDimension
Input/windowkeydown, keyup, gamepadConnected, gamepadDisconnected, gamepadButtonDown, gamepadButtonUp, windowFocusChange, windowResolutionChange
VoiceplayerStartTalking, playerStopTalking, voice:playerStartTalking, voice:playerStopTalking, voice:channelChange, voice:channelCreate, voice:channelDestroy, voice:pushToTalk
Assetsstream:ready, stream:updated, stream:mounted
World visualsblipCreate, blipDestroy, markerCreate, markerDestroy, checkpointCreate, checkpointDestroy, colshapeCreate, colshapeDestroy, textLabelCreate, textLabelDestroy
Serviceslocale:change, discord:ready, discord:activityUpdate, discord:activityCleared, rml:show, rml:hide, webViewDestroyed, headshotBase64

Точные callback signatures находятся в VarionClientEventMap пакета @varion/client. Например:

js
varion.on('connection:state', (phase, message) => {});
varion.on('playerDeath', (player, killer, weaponHash) => {});
varion.on('enteredVehicle', (vehicle, seat) => {});
varion.on('netOwnerChange', (entity, owner, previousOwner) => {});
varion.on('voice:pushToTalk', (active) => {});

На server side используется Colshape со строчной s и Enter/Leave. На client side исторический контракт использует ColShape и Enter/Exit. Не смешивайте эти имена.

Произвольные события

js
// client/main.js
varion.emitServer('inventory:use', 12);

// server/main.js: первым аргументом всегда приходит Player
varion.onClient('inventory:use', (player, itemId) => {
  player.emit('inventory:used', itemId);
});

// client/main.js
varion.onServer('inventory:used', (itemId) => {});

Для частых некритичных сообщений клиент предоставляет varion.emitServerUnreliable(...) и varion.onServerUnreliable(...).

RPC

js
// server/main.js
varion.onRpc('inventory:get', async (player) => ({ owner: player.id, slots: 40 }));

// client/main.js
const inventory = await varion.callServer('inventory:get');

Исключение или rejected Promise возвращается клиенту как RPC error. Handler удаляется автоматически при stop/restart владеющего ресурса.

Граница текущего MVP

Полный набор событий пока не финализирован. Server events вроде explosion, startProjectile, generic entityEnterColshape, consoleCommand, vehicleDamage и playerEnteringVehicle ещё не входят в публичный контракт. Не регистрируйте gameplay на неподтверждённые имена — ориентируйтесь только на список выше.

Varion Multiplayer Platform