Ceremony Integration
Ceremony Integration
Section titled “Ceremony Integration”Journey 3.0 requires Ceremony 4.1.4+ as its foundation. Ceremony provides far more than just cross-server communication — it powers the region engine (used by zones), the cutscene engine, HUD management, display entities, sound sequencing, and more.
What Ceremony Provides
Section titled “What Ceremony Provides”Region Engine
Section titled “Region Engine”Journey zones are built on Ceremony’s region system. Ceremony handles spatial detection, enter/exit events, and containment checks. Journey adds its own layer (scripts, functions, task integration) on top.
Cutscene Engine
Section titled “Cutscene Engine”The Cutscene System is powered by Ceremony. Journey registers 10 custom Ceremony extensions for cutscene actions (camera control, entity management, dialogue, etc.).
HUD Manager
Section titled “HUD Manager”Ceremony’s HUD system replaces the old notification system. Journey uses it for:
- Global task boss bars
- Buff display overlays
- Zone entry/exit titles
- Quest progress notifications
Displays & Holograms
Section titled “Displays & Holograms”Ceremony provides floating text displays and hologram entities that Journey uses for:
- NPC name plates
- Quest objective markers
- Zone labels
- Floating popups and tooltips
Sound Sequencer
Section titled “Sound Sequencer”The sound sequencer handles timed audio playback in cutscenes and timelines.
Particle Composer
Section titled “Particle Composer”Ceremony’s particle system provides the per-player particle effects used in cutscenes, zone borders, and visual feedback.
Cross-Server Messaging
Section titled “Cross-Server Messaging”A message bus (NATS or Redis) for real-time communication between servers.
Data Storage
Section titled “Data Storage”Database backends and player data persistence across servers.
What Syncs
Section titled “What Syncs”- Global task progress, start, and stop commands
- Party invites, joins, leaves, and kicks
- Party task progress for cross-server parties
- Player data (when using DATABASE backend)
- Entity visibility state
Prerequisites
Section titled “Prerequisites”- Ceremony 4.1.4+ installed on all servers
- Journey installed on all servers
- A message broker: NATS or Redis (for cross-server features)
- Optionally: a shared database for persistent storage
Configuration
Section titled “Configuration”Ceremony uses HOCON format. The config file is at config/ceremony/config.conf.
Message Bus
Section titled “Message Bus”The message bus enables real-time communication between servers.
messageBus { type = "NATS"
# Unique server identifier serverId = "survival"
# NATS server address (only used when type = NATS) natsAddress = "nats://localhost:4222"
# Redis server address (only used when type = REDIS) redisAddress = "redis://localhost:6379"
# Redis password (leave empty if no authentication) redisPassword = ""}| Field | Description |
|---|---|
type | "NATS", "REDIS", or "NONE" (single-server mode) |
serverId | Unique name for this server (e.g., "survival", "creative", "lobby-1") |
natsAddress | NATS server URL (only when type = "NATS") |
redisAddress | Redis server URL (only when type = "REDIS") |
redisPassword | Redis auth password, empty if none |
NATS vs Redis:
- NATS — Lightweight, fast, easy setup. Best for pure messaging.
- Redis — More features (caching, persistence). Best if you already run Redis.
Database Storage
Section titled “Database Storage”Storage backend for persistent data.
storageType = "MONGO_DB"storageUrl = "mongodb://localhost:27017"storageUser = ""storagePassword = ""| Option | Description |
|---|---|
JSON | File-based JSON storage (single-server only) |
SQLITE | SQLite database (single-server) |
MARIA_DB | MariaDB/MySQL (multi-server) |
MONGO_DB | MongoDB (multi-server, recommended) |
SCYLLA_DB | ScyllaDB (high-performance, multi-server) |
For single-server setups, JSON or SQLITE works fine. For multi-server networks, use a shared database like MONGO_DB or MARIA_DB.
Player Data
Section titled “Player Data”Configure how player data is stored and synced.
playerData { backend = "CARDINAL_COMPONENTS" caching = true autoSave = true autoSaveInterval = 300 autoMigrate = true cleanupEnabled = false cleanupDays = 90 safetyEnabled = true optimisticLocking = true maxRetries = 3 saveTimeoutSeconds = 30 maxPendingSaves = 5}| Field | Description |
|---|---|
backend | "CARDINAL_COMPONENTS" (per-world, client-side) or "DATABASE" (shared across servers) |
caching | Enable in-memory caching for performance |
autoSave | Periodically save player data |
autoSaveInterval | Seconds between auto-saves (default: 300) |
autoMigrate | Migrate data between backends automatically on join |
safetyEnabled | Enable data safety features for DATABASE backend |
optimisticLocking | Prevent concurrent save conflicts |
For multi-server setups, use backend = "DATABASE" with a shared database.
Setting Up NATS
Section titled “Setting Up NATS”Step 1: Install NATS
Section titled “Step 1: Install NATS”Docker (recommended):
docker run -d --name nats -p 4222:4222 -p 8222:8222 nats:latest- Port
4222— Client connections - Port
8222— HTTP monitoring
Standalone binary:
- Download from https://nats.io/download/
- Run:
./nats-server
Step 2: Configure Ceremony
Section titled “Step 2: Configure Ceremony”Edit config/ceremony/config.conf on each Minecraft server:
messageBus { type = "NATS" serverId = "survival" natsAddress = "nats://192.168.1.100:4222"}Setting Up Redis
Section titled “Setting Up Redis”If you prefer Redis over NATS:
Step 1: Install Redis
Section titled “Step 1: Install Redis”Docker:
docker run -d --name redis -p 6379:6379 redis:latestWith password:
docker run -d --name redis -p 6379:6379 redis:latest --requirepass yourpasswordStep 2: Configure Ceremony
Section titled “Step 2: Configure Ceremony”messageBus { type = "REDIS" serverId = "survival" redisAddress = "redis://192.168.1.100:6379" redisPassword = "yourpassword"}Multi-Server Example
Section titled “Multi-Server Example”Network:
- Message broker:
192.168.1.100 - Database: MongoDB at
192.168.1.100:27017 - Three Minecraft servers: Survival, Creative, Skyblock
Survival (config/ceremony/config.conf):
messageBus { type = "NATS" serverId = "survival" natsAddress = "nats://192.168.1.100:4222"}
storageType = "MONGO_DB"storageUrl = "mongodb://192.168.1.100:27017"
playerData { backend = "DATABASE" caching = true autoSave = true safetyEnabled = true}Creative (config/ceremony/config.conf):
messageBus { type = "NATS" serverId = "creative" natsAddress = "nats://192.168.1.100:4222"}
storageType = "MONGO_DB"storageUrl = "mongodb://192.168.1.100:27017"
playerData { backend = "DATABASE" caching = true autoSave = true safetyEnabled = true}Skyblock (config/ceremony/config.conf):
messageBus { type = "NATS" serverId = "skyblock" natsAddress = "nats://192.168.1.100:4222"}
storageType = "MONGO_DB"storageUrl = "mongodb://192.168.1.100:27017"
playerData { backend = "DATABASE" caching = true autoSave = true safetyEnabled = true}Each server has a unique serverId. All share the same NATS address and MongoDB URL.
Verification
Section titled “Verification”Check your server console after starting for:
[Ceremony] Successfully connected to NATS server at nats://192.168.1.100:4222Or for Redis:
[Ceremony] Successfully connected to Redis at redis://192.168.1.100:6379If you see connection errors:
- Verify the broker is running (
docker psor your process manager) - Check that the port is accessible (firewall rules)
- Confirm the address in your config is correct
- Test connectivity:
telnet 192.168.1.100 4222(NATS) orredis-cli -h 192.168.1.100 ping(Redis)
How Cross-Server Sync Works
Section titled “How Cross-Server Sync Works”Global Tasks
Section titled “Global Tasks”When you run /globaltask start journey:example_task on Survival:
- Survival broadcasts the start command via the message bus
- All connected servers receive it and start the task locally
- Boss bars appear for all players on all servers
- Any player’s matching actions on any server contribute to shared progress
- Progress updates sync in real-time across all servers
Parties
Section titled “Parties”- Party data lives on the server where the party was created
- Invites are sent via the message bus to players on other servers
- Member changes (join/leave/kick) sync across servers
- Task progress from any member on any server is shared with all members
Failover
Section titled “Failover”If the message broker goes down:
- Global tasks and parties keep working locally on each server
- Cross-server sync pauses until the broker reconnects
- When the broker comes back, sync resumes automatically
Troubleshooting
Section titled “Troubleshooting”Global Tasks Not Syncing
Section titled “Global Tasks Not Syncing”- Verify the broker is running and reachable from all servers
- All servers must have the message bus configured with the same broker address
global_tasks_enabled: truein Journey’sconfig.json- Check server logs for connection messages
- No firewall blocking the broker port
Party Invites Not Working Cross-Server
Section titled “Party Invites Not Working Cross-Server”- Message bus is connected on both servers
party_enabled: truein Journey’sconfig.json- Target player is online on the other server
- Check server logs for connection errors
Connection Errors
Section titled “Connection Errors”“Failed to connect to NATS server”: Check that the NATS server is running and the address is correct.
“Failed to connect to Redis”: Check that Redis is running. If authentication is enabled, include the password in the config.
- Keep the message broker on the same network as your Minecraft servers for low latency
- Don’t expose broker ports to the internet — keep them internal
- For production, consider running the broker on a dedicated machine
- Monitor NATS health via HTTP at
http://your-nats-server:8222 - Redis can double as a cache for other plugins if you’re already running it
Related
Section titled “Related”- Global Tasks — Server-wide collaborative tasks
- Party System — Group task sharing
- Cutscene System — Ceremony-powered cutscenes
- Zone System — Ceremony region-backed zones
- Entity Visibility — Packet-level entity visibility
- Configuration — Journey config options