KaBroadcast Group Events
KaProxy's broadcast module provides KaBroadcast backends with group announcements, unified join/quit messages, and cross-server death messages.
Responsibility Boundary#
- KaProxy determines real entry to and exit from the proxy network, validates the protocol, and forwards structured content.
- KaProxy does not store join, quit, announcement, or death templates.
- Each KaBroadcast backend renders the final message from its own configuration, allowing different languages and styles per backend.
- Every backend participating in group messages should install and enable KaBroadcast.
Configuration#
modules:
broadcast:
enabled: true
announcements-enabled: true
connection-messages-enabled: true
death-messages-enabled: true
servers:
- all
all or * forwards to every backend. When a list is configured, only the listed backends receive the events.
Join, Quit and Server Switches#
KaProxy tracks each online player's current backend:
- The first backend connection emits one
player_joinevent. - Switching between backends sends a
switch_requestto the destination backend to obtain its rendered result, then forwardsplayer_switch; neither a join nor a quit event is emitted. - A real proxy disconnect emits one
player_quitevent.
Switch detection uses platform events (Velocity ServerPostConnectEvent.getPreviousServer()), and the backend's modules.connection.switch-message-enabled decides whether it is displayed.
The KaBroadcast backend suppresses Bukkit's native join and quit messages and displays the proxy event using its local template.
Targeted Announcements#
A backend can request that an announcement be sent to a single player via broadcast/publish_targeted. KaProxy resolves the target player by name and sends broadcast/announcement_targeted only to that player's backend, which renders and delivers it to the target with the Bukkit API.
Death Messages#
The KaBroadcast backend reads Bukkit's final death text, suppresses the local native death message, and sends a death event. KaProxy adds the source backend and forwards it as player_death; each backend renders it with its own death template.
Every public event includes a UUID eventId. The proxy and backends keep short-lived deduplication state so one event is not displayed repeatedly.
Protocol Actions#
Backend to proxy:
broadcast/publish: announcement witheventId, sender, and message.broadcast/publish_targeted: targeted announcement witheventId, target player name, sender, and message.broadcast/death: death event witheventId, player UUID, player name, plain-text fallback, and component JSON.broadcast/switch_publish: the switch result rendered by the destination backend.
Proxy to backend:
broadcast/announcementbroadcast/announcement_targeted: targeted announcement, sent only to the target player's backend.broadcast/player_joinbroadcast/player_switchbroadcast/player_quitbroadcast/player_death: carries both the plain-text fallback and component JSON; old backends without component JSON are converted to a plain text component by the proxy.broadcast/switch_request: asks the destination backend for its rendered switch result.