Events System
HELIX has a built-in event system that lets different parts of your code communicate without tight coupling. Events work across client and server, so a server-side script can fire an event that a client catches (and vice versa).
In Blueprints, you use UE5's native Event Dispatchers and Custom Events — the standard Unreal approach. In Lua, HELIX provides a custom event API (global functions like RegisterServerEvent, TriggerClientEvent, etc.) that wraps native C++/Blueprint functionality into a simple scripting interface. JavaScript event support via HelixJS is currently in development.
Registering Events
- Blueprint
- Lua
- JavaScript
C++ equivalent (for reference)
// 1. Add an Event Dispatcher in the My Blueprint panel
// 2. Call the dispatcher to broadcast
// 3. Other Blueprints Bind to the dispatcher to receive
-- Register a server-side event handler
RegisterServerEvent("PlayerScored", function(controller, playerId, points)
-- controller is the triggering player (passed automatically)
print("Player " .. playerId .. " scored " .. points .. " points!")
end)
-- Register a client-side event handler
RegisterClientEvent("UpdateScoreUI", function(playerId, points)
print("UI update: " .. playerId .. " now has " .. points)
end)
The HelixJS event API (Helix.on, Helix.emit) is currently in development. JavaScript event support will be available in a future update. For now, use Lua or Blueprints for event-driven communication.
Triggering Events
- Blueprint
- Lua
- JavaScript
For cross-network events, use the scripting layer (Lua/JS).
C++ equivalent (for reference)
// Call your Event Dispatcher to notify all bound listeners.
-- Client → Server: trigger a server event from the client
TriggerServerEvent("PlayerScored", "player_42", 100)
-- Server → Specific Client: send to one player
TriggerClientEvent(controller, "UpdateScoreUI", "player_42", 100)
-- Server → All Clients: broadcast to everyone
BroadcastEvent("UpdateScoreUI", "player_42", 100)
JavaScript event triggering via HelixJS is in development.
Built-in Game Events
HELIX fires these events automatically. Subscribe to them to react to core game moments:
| Event | Context | Description |
|---|---|---|
HEvent:PlayerReady | Server | A player has loaded and is ready |
HEvent:PlayerUnloaded | Server | A player disconnects |
HEvent:CharacterSpawned | Server | A character has been spawned |
The built-in event names and signatures may evolve during the Closed Alpha. Check the reference documentation for the latest list.
Custom Events
Define your own events for game-specific logic. Pick a name and go:
- Blueprint
- Lua
- JavaScript
C++ equivalent (for reference)
// 1. Add an Event Dispatcher "OnZombieWaveStarted"
// 2. Call it with WaveNumber and ZombieCount parameters
// 3. Other Blueprints bind to it to react
-- Start a zombie wave and tell all clients about it
function M:StartWave(waveNumber)
local count = waveNumber * 10
self:SpawnZombies(count)
BroadcastEvent("ZombieWaveStarted", waveNumber, count)
end
JavaScript custom events via HelixJS are in development.
Cross-Package Events
Events are great for cross-package communication. Use local events to communicate between packages on the same side (client-to-client or server-to-server):
-- Package A (server): notify other server packages
TriggerLocalServerEvent("InventoryUpdated", playerId, inventoryData)
-- Package B (server): listen for cross-package events
RegisterServerEvent("InventoryUpdated", function(controller, playerId, data)
-- Update your systems
end)
Lua Event API Summary
These are global functions available in Lua scripts. They wrap HELIX's native C++ event system into a simple scripting interface.
| Function | Direction | Description |
|---|---|---|
RegisterServerEvent(name, cb) | Server | Register a server event handler |
RegisterClientEvent(name, cb) | Client | Register a client event handler |
TriggerServerEvent(name, ...) | Client → Server | Trigger a server event from the client |
TriggerClientEvent(ctrl, name, ...) | Server → Client | Send event to a specific client |
TriggerLocalServerEvent(name, ...) | Server → Server | Cross-package server event |
TriggerLocalClientEvent(name, ...) | Client → Client | Cross-package client event |
BroadcastEvent(name, ...) | Server → All Clients | Send event to all connected clients |
When triggering a server event from a client, the triggering player's controller is automatically passed as the first argument to the server handler (similar to FiveM's source). You don't need to send it manually.
The event system serializes arguments automatically across the network. Stick to primitive types (strings, numbers, booleans) and simple tables/objects for the smoothest experience.