Files
core-minigames/docs/volumes.md
T
HeruEdhel ca11bbd4c0 Add new minigame volume templates and corresponding tests
- Introduced various minigame volume templates including map vote pad, NPC spawn, objective progress, player activation spawn, race, score zone, solo arena, team arena, team assignment pad, timed heal pack, and waiting area.
- Each template includes specific configurations for positions, shapes, effects, and tags relevant to their functionality.
- Implemented unit tests for minigame volume template export and spawn functionalities to ensure correct behavior and tag rewriting.
- Added tests for minigame map discovery service to validate player respawn logic based on team assignments.
- Enhanced minigame queue service tests to cover player join midgame scenarios.
- Created a data store test for saving and loading player defaults in the minigame template builder.
2026-06-21 13:04:16 -07:00

6.7 KiB

Volumes

Minigame areas now use Hytale's built-in trigger volumes. The mod no longer defines custom volume types such as MinigameAreaVolume, JoinQueueVolume, or ScoreVolume.

This is intentional: the area, shape, enter/exit behavior, tags, and trigger-effect asset wiring belong to Hytale's trigger-volume system. core-minigames adds minigame-specific conditions and effects that can be attached to those trigger volumes.

Defining Minigame Maps

  1. Create a normal Hytale trigger volume in the editor.
  2. Shape it around the arena or interaction area.
  3. Tag it with MinigameId=<MinigameId> and MapId=<MapId>.
  4. Add VariantId=<VariantId> when the same map can randomly use overlapping alternate zones.
  5. Add MapRole=MainArena to the primary arena volume for each map or variant.
  6. Attach trigger effects and conditions for the relevant minigame.
  7. Use the MinigameId dropdown to select the MinigameDefinition asset.

There is no required root MinigameAreaVolume type. If validation needs an arena boundary later, it should inspect Hytale trigger-volume metadata instead of requiring a custom minigame volume class.

Map candidates are discovered from trigger-volume tags. See Trigger Volume Tags for the full tag reference.

Overlapping volumes are valid. Runtime routing uses the selected MinigameId, MapId, and VariantId, so the same Hytale build can host multiple arena definitions.

Common Patterns

Template Spawning

Use /triggervolume minigametemplate to place a starter set of normal Hytale trigger volumes at your current position:

/triggervolume minigametemplate core_lifecycle --MinigameId=MyGame --MapId=Arena01

Use /triggervolume minigametemplates for the builder UI version. It remembers the builder's MinigameId, MapId, and optional VariantId, then lists every loaded template as a one-click spawn action.

Use /triggervolume templategroup <pack> <groupName> <templateId> <name> to turn a configured trigger-volume group in the current world into a reusable template asset. The exporter stores member positions relative to the group origin and rewrites minigame/map/variant tags to Template.

Templates are assets in Server/MinigameVolumeTemplates/ and can be edited in the asset editor. Template volume ids should use Template_{VolumePurpose}. When spawned, Template is replaced with MinigameId_MapId plus optional VariantId, and tags with MinigameId=Template, MapId=Template, and VariantId=Template are replaced with the provided command values.

Built-in templates:

  • core_lifecycle
  • solo_arena
  • team_arena
  • race
  • capture_point
  • item_spawn
  • npc_spawn
  • waiting_area
  • join_late_spectator
  • timed_heal_pack
  • checkpoint
  • deathzone
  • map_vote_pad
  • score_zone
  • objective_progress
  • team_assignment_pad
  • player_activation_spawn

Start Zone

Use a normal trigger volume at an entrance, sign, NPC, or lobby pad.

Attach:

  • Effect: JoinMinigameQueue
  • Field: MinigameId = <your minigame>

For exits or cancel pads:

  • Effect: LeaveMinigameQueue
  • Field: MinigameId = <your minigame>

For voting buttons or pads:

  • Effect: VoteForMap
  • Field: MapId = <map id>, or leave blank to use the volume's MapId tag.

To start the queued match:

  • Effect: StartQueuedMinigame
  • Field: MinigameId = <your minigame>

Optionally guard it with:

  • Condition: MinigamePhase
  • Field: Phase = WAITING_FOR_PLAYERS

Score Zone

Use a normal trigger volume around the scoring area.

Attach:

  • Condition: PlayerInMinigame
  • Effect: ModifyScore
  • Fields: Operation = ADD, Amount = <points>

If the score is team-based, use ModifyScore with TargetType=TEAM.

Phase Gate

Use Hytale's normal volume behavior for the area and guard attached effects with:

  • Condition: MinigamePhase
  • Field: Phase = ACTIVE

Player And Team Spawns

Use normal trigger volumes as spawn markers. The volume position is the teleport destination.

Tag shared all-player spawn volumes with:

  • MinigameId=<your minigame>
  • MapId=<map id>
  • optional VariantId=<variant id>
  • SpawnRole=PlayerSpawn

Tag each team-specific spawn volume with:

  • MinigameId=<your minigame>
  • MapId=<map id>
  • optional VariantId=<variant id>
  • SpawnRole=TeamSpawn
  • TeamId=<team id>

RespawnPlayer resolves destinations in this order:

  1. The effect's explicit DestinationId.
  2. The player's stored checkpoint from SetSpawnPoint.
  3. A random matching team spawn volume for the player's TeamId.
  4. A random shared PlayerSpawn volume with no TeamId.

This means checkpoint-based games can still override spawns per player, team arena games can rely on tagged team spawn volumes, and solo/FFA games can rely on a pool of shared PlayerSpawn volumes.

Player deaths during a minigame automatically use the same destination order. RespawnPlayer.DestinationId accepts coordinate strings, such as 100,64,200 or world_name,100,64,200; SetSpawnPoint uses separate X, Y, and Z fields. Spawn fallback is resolved from tagged spawn volumes.

Counters

Use a trigger volume to increment a named runtime counter:

  • Effect: ModifyCounter
  • Fields: CounterId = <name>, Operation = ADD, Amount = 1

Then use the Counter condition to branch once a threshold is reached.

Kill Scoring

Use a trigger volume covering the arena or scoring zone and attach:

  • Effect: AwardKillScore
  • Fields: TargetIds = ["Player"] or NPC role ids such as ["fox"], Points = <points>, AwardTarget = PLAYER

The death system checks this volume when an entity dies inside it. It routes by the volume's MinigameId, MapId, and optional VariantId tags, so overlapping arenas can have different kill scoring rules.

Pickup Spawners

Use a small trigger volume at the pickup location and attach:

  • Effect: SpawnItem
  • Fields: ItemId = <item id>, Amount = <stack size>, RespawnDelaySeconds = <seconds>

The item spawns at the volume position plus optional OffsetX, OffsetY, and OffsetZ. Attach the effect to a TICK trigger when the pickup should automatically respawn after being collected or despawning. If the same volume has multiple item spawners, set a different SpawnKey for each one.

Block Fill Effects

Attach PlaceBlocks when a trigger should place or replace a cuboid of blocks:

  • Effect: PlaceBlocks
  • Fields: BlockId = <block id>, X1/Y1/Z1 = <first world corner>, X2/Y2/Z2 = <second world corner>

The region is inclusive and uses absolute world block coordinates. MaxBlocks defaults to 32768.

Reusable Effect Assets

For repeated logic, define a Hytale trigger effect asset and attach it to multiple trigger volumes. The minigame trigger condition/effect entries are normal codec types, so they can be reused the same way Hytale's built-in trigger-volume effects are reused.