События и 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:
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-ресурсу:
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 |
|---|---|
| Connection | connection:state, connection:complete, connectionComplete, connection:queue, disconnect |
| Resources | resourceStart, resourceStop, anyResourceStart, anyResourceStop, anyResourceError, everyTick |
| Spawn/combat | playerSpawn, spawn:success, spawned, playerDeath, incomingDamage, playerWeaponChange, playerWeaponShoot |
| Entities | entityStreamIn, entityStreamOut, worldObjectStreamIn, worldObjectStreamOut, gameEntityCreate, gameEntityDestroy, baseObjectCreate, baseObjectRemove, netOwnerChange |
| Virtual/position | virtualEntityStreamIn, virtualEntityStreamOut, virtualEntityPositionChange, worldObjectPositionChange |
| Player state | playerDimensionChange, playerInteriorChange, playerAnimationChange |
| Vehicle | enteredVehicle, leftVehicle, changedVehicleSeat |
| Areas | playerEnterColShape, playerExitColShape, entityEnterColshape, entityLeaveColshape, playerEnterCheckpoint, playerExitCheckpoint |
| Metadata | metaChange, syncedMetaChange, streamSyncedMetaChange, localMetaChange, globalMetaChange, globalSyncedMetaChange, localDimension |
| Input/window | keydown, keyup, gamepadConnected, gamepadDisconnected, gamepadButtonDown, gamepadButtonUp, windowFocusChange, windowResolutionChange |
| Voice | playerStartTalking, playerStopTalking, voice:playerStartTalking, voice:playerStopTalking, voice:channelChange, voice:channelCreate, voice:channelDestroy, voice:pushToTalk |
| Assets | stream:ready, stream:updated, stream:mounted |
| World visuals | blipCreate, blipDestroy, markerCreate, markerDestroy, checkpointCreate, checkpointDestroy, colshapeCreate, colshapeDestroy, textLabelCreate, textLabelDestroy |
| Services | locale:change, discord:ready, discord:activityUpdate, discord:activityCleared, rml:show, rml:hide, webViewDestroyed, headshotBase64 |
Точные callback signatures находятся в VarionClientEventMap пакета @varion/client. Например:
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. Не смешивайте эти имена.
Произвольные события
// 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
// 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 на неподтверждённые имена — ориентируйтесь только на список выше.