Packet and Event Flow
This page explains the conceptual flow rather than listing every packet type. It is useful when a setup is partly working: for example, the client connects but no proximity audio plays, or the addon connects but bind never completes.
VoiceCraft has two related planes:
- voice plane:
player clients send and receive realtime voice data through
VoiceCraft.Server - Minecraft state plane:
Bedrock addons or Java-side plugins send entity, position, world, bind, property, and effect updates through
McHttp,McWss, orMcTcp
Both planes must be healthy for proximity voice to feel correct.
High-level flow
VoiceCraft.Serverstarts and loadsServerProperties.json.- Optional NAT port mappings are opened for endpoints with
AutoOpenPort = true. - A player opens
VoiceCraft.Clientand connects to the server UDP endpoint. - A Minecraft transport consumer authenticates with its configured token.
- The Minecraft side creates, discovers, or updates entities.
- Position, world ID, visibility, mute/deafen, bitmask, and property updates flow into the server world model.
- Event subscriptions decide which event categories are forwarded.
- The server sends state needed by connected clients.
- Clients render the resulting voice behavior locally.
Client login and Minecraft transport login are separate events. One can succeed while the other is still broken.
1.7 event model
VoiceCraft 1.7.0 wraps low-level events through event request packets:
VcEventRequestPacketMcApiEventRequestPacket
The wrapped event carries an EventType, such as:
OnEntityCreatedOnEntityDestroyedOnEntityPositionUpdatedOnEntityRotationUpdatedOnEntityPropertyUpdatedOnEntityAudioReceivedOnEntityAudioDataReceived
This keeps event delivery separate from ordinary request/response packets and allows integrations to subscribe to the events they need.
Entity properties
Entity properties are named values attached to an entity. They are used for custom metadata and effect overrides.
Property packets include:
VcSetPropertyRequestPacketVcOnEntityPropertyUpdatedPacketMcApiSetEntityPropertyRequestPacketMcApiOnEntityPropertyUpdatedPacket
Supported value types are null, booleans, integer widths, float, and double.
The older cave/muffle factor packet path was removed. Debug new custom effect behavior by checking property updates first, then effect processing.
Bind flow
Bind flow links a Minecraft player or entity to a VoiceCraft-side client identity.
Typical Bedrock flow:
- The addon connects to
McHttporMcWss. - The player runs or receives the in-game bind command.
- The addon sends bind-related data to VoiceCraft.
- VoiceCraft associates the voice client with the in-game entity.
- Position, world, bitmask, and property updates start affecting what the client hears.
Typical Java/Geyser flow:
- The Java-side bridge connects to
McTcp. - The plugin tracks Java-side player lifecycle and position.
- The player uses the configured voice bind command.
- The bridge sends bind/update data to VoiceCraft.
If bind fails, first check token match and transport reachability, then check whether the player has an active VoiceCraft client session.
Debug by layer
| Symptom | Layer to check first | Typical cause |
|---|---|---|
| Client cannot connect | Voice plane | Wrong server host, UDP port closed, server not running |
| Addon/plugin cannot connect | Minecraft state plane | Wrong transport token, wrong binding, blocked TCP/HTTP/WebSocket path |
| Client connects but hears no proximity | Entity/position state | Bind missing, PositioningType mismatch, no position updates |
| Effect overrides do nothing | Property/event state | Integration still sends old cave/muffle packets, missing event subscription, wrong property key/type |
| Audio exists but range/effects feel wrong | Effects/state sync | Wrong effect bitmask, stale entity metadata, mismatched client settings |
Why this matters
When debugging, it helps to know whether your issue is:
- authentication
- transport reachability
- entity creation
- bind association
- metadata, properties, and position sync
- audio capture/playback
Most real failures happen because one layer is broken while the others still look healthy.