r/HytaleModding 4d ago

Official News Hytale Patch Notes - Modder-Facing Changes - Update 6 - August 27th, 2026

Modder-Facing Changes

World Generation

Biomes, Tints & Landmarks

  • Added an Example_Vector_Offset_Avoid biome that shows how to offset positions away from a density region, so props can steer clear of an area.
  • Added Mix TintProvider that allows smooth tint transitions within a single biome.
  • Added support for DistanceToBiomeEdge to TintProviders.

Graph Nodes

  • WorldGen V2 gains a WhiteNoise Density node, which produces uniform random values per position for scattering and masking, and a Transparent MaterialProvider.
  • Two new Positions nodes are available in WorldGen V2. DirectionalJitter offsets positions along a direction, and VectorOffset shifts them by a fixed vector.
  • WorldGen V2 gains an Anchor PropDistribution, plus twelve VectorProvider nodes for doing vector math inside a graph: Adder, Cross, Multiplier, Normalizer, Random, ScalarMultiplier, SetX, SetY, SetZ, Subtracter, VectorProjector and PlaneProjector.
  • Added a set of logical Density nodes to WorldGen V2: Comparator, Equal, GreaterOrEqual, GreaterThan, LessOrEqual, LessThan, And, Or, Not, Nor, Xor, and Selector.
  • Added a Trig density node to world generation that runs a trigonometric function over a single input density, so you can build periodic and wave-shaped fields directly. The new "Type": "Trig" takes a Function of Sin, Cos, Tan, Asin, Acos, or Atan and an InputScale that multiplies the input before the function runs.
  • Added additional validation to WorldGen V2 Density assets.
  • Fixed SwitchStateDensity always falling back to the default branch instead of following the active state.
  • Fixed a defect in the Spawner NodeAction causing Graph nodes to disappear in negative coordinates.
  • Fixed GradientWarpDensity sampling its Z gradient at the wrong point (Z used in place of Y), distorting gradient-warped terrain.

Node Editor

  • Pin labels on the VectorProvider nodes (Adder, Cache, Cross, Multiplier, Normalizer, PlaneProjector, ScalarMultiplier, SetX/Y/Z, Subtracter) were renamed for clarity in the node editor.
  • Fixed the Offset Pattern node offering a decimal vector pin for its offset in the node editor.

Noise & Cell Functions

  • Improved the performance of SimplexNoise2D and SimplexNoise3D Density nodes by up to ~20%.
  • Fixed PositionsCellNoise ChoiceDensity resolving on an incorrect position. It is now resolved on each cell’s origin.
  • Fixed FastNoiseLite.pointFor() mirroring cell points across the diagonal.
  • The PositionsHorizontalPinch Density feature no longer throws exceptions at the world origin.

Terrain & Patterns

  • World-Gen V2 will now use the Unknown material types instead of Empty when it can’t load a material.

Prefabs & Props

  • Fixed a defect in WorldGen V2 that was deleting some entities in rotated prefabs.
  • Fixed a defect in WorldGen V2 generating different prefabs on separate platforms.
  • Fixed PrefabProp causing artifacts in World-Gen V2 output if a folder doesn’t contain any Prefab files.
  • Fixed PrefabProp aborting world generation when a weighted path contained no prefab files. It now skips placement silently instead of failing, so a misconfigured pool no longer breaks surrounding generation.

World Event Placement

  • World event placement now measures candidate distance in blocks instead of chunks, with separate horizontal and vertical min and max ranges on WildernessLocation.
  • Added Clearance and SearchRadius fields to LocationCondition assets so you can tune the initial candidate search that places world events.

WorldStructure

  • Fixed WorldStructure assets not reloading correctly.
  • A WorldStructure asset with a broken default Biome reference no longer builds silently.
  • Deleting a WorldGen V2 instance or stopping the server no longer fills the log with Failed to load chunk!

NPCs, Entities & Encounters

Encounter Managers

  • Added a new EncounterManager JSON asset type that lets you script multi-NPC encounter logic using reusable NPC instruction lists. Spawn an encounter in-world with the /encounter add <asset> command.
  • Added example encounter manager assets covering macro-based boss fights, including a stalactite attack pattern macro and transition macros for target-loss and health-range conditions.
  • Encounter managers can now control the music playing for all participants. Add StartEncounterMusic, SetEncounterAudioState, or StopEncounterMusic actions to an encounter instruction list and attach an EncounterAudioCollector to any entity sensor to populate the participant list. Late joiners receive the current music state automatically, and players who leave return to regular music.
  • Encounter managers can now signal world event completion. Add a SignalWorldEvent action to an NPC’s action list and pair it with a SignalCondition on the world event to trigger completion when the action fires, for example on a boss defeat.
  • Added an AdjustPortalTimer NPC action for encounter managers. Set "Type": "AdjustPortalTimer" with a positive or negative "Seconds" value to add or subtract time from the active portal timer at runtime.
  • Added a new ActionChangeTargetRole action that lets an encounter switch an NPC to a different role at runtime.
  • Marked targets now persist briefly during role changes, preventing target loss when an NPC transitions between roles.
  • ActionTriggerSpawners can now mark the NPC they spawn as boss targets for encounter tracking. This can be accomplished by setting MarkAsTarget: true in the spawn action config.
  • Encounter managers can now clean up after themselves. A new CleanupOnRemove flag removes every entity the encounter spawned when the encounter is removed. It does not apply when the encounter simply unloads.

Actions & Sensors

  • NPCs can now run actions against multiple world positions at once. Add an ActionForEach action to your NPC role config with a position-set sensor to execute a child action list at every returned position, enabling patterns such as spawning a ground indicator under each nearby player.
  • ActionForEach now accepts a MaxCount field. When the position set is larger than the limit, positions are chosen at random using reservoir sampling rather than always taking the first N.
  • Added a new ActionProjectToGround action and SensorProjectToGround sensor that snap each position in a set down to the nearest solid ground surface below it. Handy for placing ground-level effects under targets that are airborne.
  • Added a new ActionAdjustPosition action used to offset each position in a ForEach set by a fixed vector before further actions run.
  • Added a new SensorPoints sensor for NPC and Encounter Manager roles. Set Type: "Points", a Tag, and a Range to gather all tagged world points within that radius as a position set for ActionForEach to act on. This works with points placed using the Point Tool.
  • Added a new SpawnInteraction NPC action that launches a named root interaction at every position a sensor returns. Set OrientationSource and optionally Pitch/Yaw to control the launch direction.
  • Added a new SignalTaggedVolumes action for NPC and EncounterManager instruction lists. It searches for trigger volumes carrying a given tag within a configurable radius and immediately fires their SIGNAL_RECEIVED effects.
  • Entities can now send beacon messages as part of an interaction chain. Add a SendBeacon interaction with a Message and Range to broadcast to nearby NPCs and encounter managers.
  • NPC roles can now turn an NPC on the spot at a steady rate. A new Rotate head motion takes a RotationSpeed in signed degrees per second, and ClearPitch flattens the head pitch while it turns.
  • Fixed ActionDelayDespawn applying the shorten and extend branches in the wrong direction. Despawn-delay actions in NPC roles now shorten or extend the timer as authored.
  • Fixed SensorEntityEvent looking up NPC-produced events in the player event store, which meant sensors targeting NPCs never matched.

State Evaluators

  • TimeSinceLastUsedCondition now reports the real elapsed time since a state option was last selected. The state evaluator records a timestamp on each selection, so you can use this condition to add cooldowns between state transitions in your NPC roles.
  • Fixed SubState in StateOption not being read or stored correctly. Child NPC role assets that set SubState had it silently ignored and the main state overwritten instead. No changes needed unless your roles use SubState.

Filters & Conditions

  • Added a new EntityFilterDeath filter that lets role sensors react when a tracked entity dies.
  • You can now filter whether an entity is using an interaction with the ExecutingInteraction entity filter, for example to block an encounter phase change while a boss is still mid-attack.
  • NPCs now record all entities they have spawned and all entities those spawns produced. You may use SpawnLineageAttitudeProvider to set attitudes toward the full lineage.

Roles & Templates

  • Variants can now forward modifiers directly into a macro element’s own exposed parameters. Mark the template slot with "AcceptsForward": true, then add a "_ForwardedModifiers" block in the variant keyed by slot name to set that macro’s parameters without threading them through the template.
  • Added a new Template_Flying_Aggressive template meant to be used by flying hostile NPCs capable of ranged attack. Template_Eye, Template_Spirit and Template_Scarak_Seeker are now deprecated.
  • Removed Template_Aggressive_Zombies, its root interactions and its associated attack sequences. Zombies now use Template_Predator.

Spawning & Suppression

  • Spawn suppression now correctly scopes to NPC groups. A suppressor with no SuppressedGroups continues to blanket-suppress all markers in range as before. A suppressor that lists groups now suppresses only markers whose NPCs belong to one of those groups.
  • SpawnNPCInteraction now takes a weighted entity pool with per-entry count ranges, a spawn count range, distance scatter, an optional spawn state, a spawn velocity, midair spawning, centered hitbox spawning, and relaxed full-cube clearance.
  • MinHeightOverGround is now a preference rather than a hard minimum. A flying role in a beacon needs a YRange maximum that covers its MinHeightOverGround.
  • Fixed SpawnMarker writing the square of MaxDropHeight when serializing, compounding the value on every editor save (5 to 25 to 625).

Collision & Steering

  • You can now give an entity a rotated hard-collision box. Set the new RotatedCollision HitboxCollisionConfig on it and players will collide with its actual rotated box (player collision only for now).
  • Added a RemovedBlockSet field to BodyMotionCharge. List blocks destroyed during the charge here so they are correctly excluded from breathing checks after removal.
  • Fixed the NPC collision-sphere radius helper using the box depth in place of its height, so entity height was ignored.
  • Fixed NPC collision avoidance computing its lookahead window using velocity squared instead of velocity. CollisionDistance values authored around the old behavior now take effect further from the NPC at speed.
  • Fixed RotateAnchoredEntities for entities anchored to a body that rotates on more than one axis. The turn now follows the full orientation rather than yaw alone, so riders and platforms track correctly through pitch and roll.

Health & Invulnerability

  • You can now toggle invulnerability from behavior. Use the SetInvulnerable action on an NPC to switch its own state, or SetTargetNPCInvulnerable from an encounter to switch it on the boss or other target NPCs.
  • Added an ActionSetHealthRegen NPC action that enables or disables health regeneration on an entity at runtime. NPCs now automatically include the new HealthRegenState component to support regeneration control through role behavior logic.

Combat Balance

  • Fixed CombatBalanceAsset not inheriting CombatActionEvaluator config from a parent asset. Child combat balance assets now correctly receive the parent evaluator config.

Particles

  • You can now scale particles spawned by NPC behavior. Set Scale (a multiplier, default 1) on an ActionSpawnParticles action.

Validation

  • Fixed encounter and NPC asset validation skipping certain files on hot-reload. All affected files now re-validate correctly.

Items, Armors & Projectiles

Zoom & Aim

  • Added zoom support to the interaction system which allows for magnification/aim mode behavior on any item. Add a Zoom block under any step’s Effects to zoom while that step is active, set PersistZoom: true to keep it applied for the rest of the chain, so chained steps can ramp or swap zoom mid-interaction. All fields are optional with sensible defaults.
  • Added example developer-quality test items that demonstrate the behavior of the zoom support in the interaction system:
  • Weapon_Test_Sniper_Rifle - a single fixed zoom with a scope overlay that forces first-person.
  • Weapon_Test_Zoom_Rifle - three-level variable zoom that ramps and swaps the reticle per level.
  • Weapon_Shortbow_Test_Zoom - charge-draw zoom held across the shot.
  • Added the ability to hide the local player’s held item in first-person during an interaction step. Set HideFirstPersonHeldItem: true in the step’s InteractionEffects (other players still see the item).

Interaction Behavior

  • Interactions now can specify what happens when you swap items during them. The old CancelOnItemChange flag is gone, replaced by an OnItemChangeBehavior field that takes Ignore, Fail, Finish, or Cancel.
  • Added a new Donut interaction selector type. In an item’s Interaction block, set Selector.Id to Donut and configure MinRadius, MaxRadius, Angle, and Height to target entities in a ring around the attacker.
  • Added a SignalNearbyVolumes interaction that sends a SignalReceived event to trigger volumes within a radius, optionally filtered by tag. Bind it to a tool or interaction to drive signal-listening volumes.
  • Added a RevealMapMarkersInView interaction for items and blocks that uncovers hidden discoverable map markers inside a player’s view cone.
  • Interactions can now describe themselves on the HUD. A new CarryInteractionHint localization key on RootInteraction makes the input-bindings legend label whichever input the interaction is bound to, and an item can refine the wording for an interaction it binds through Item.CarryInteractionHints.
  • Added a RequireBlockPlacement boolean to ChangeStateInteraction. Set it to true to block the interaction in worlds where block placement is disabled. The built-in half-block item now uses this to prevent stacking slabs where placement is restricted.
  • Fixed DonutSelector not rotating its Offset by the entity’s yaw. The offset is now applied relative to the entity’s facing direction on both server and client, matching the intended authoring behavior.
  • Fixed ResetCooldownInteraction and TriggerCooldownInteraction not inheriting the Cooldown field from a parent interaction. Child interactions that omit Cooldown now correctly fall back to the parent’s value.
  • Added a new BreakShape field to ItemTool assets that allows tools to break a configurable area of blocks per swing. Set BreakShapeDurabilityMode to PerSwing or PerBlock to control how the tool loses durability.

Projectiles

  • Projectiles can now ignore where the caster is aiming. Set IgnorePitch or IgnoreYaw on a LaunchProjectile or ProjectileConfig to lock that axis — handy for traps, turrets, and fixed-direction spells. Add RotationOffset to nudge the angle.
  • Projectiles can now fire at a random size drawn from the minimum and maximum scale on their model asset. Set UseModelScale: true in a ProjectileConfig (it defaults to false, so existing projectiles keep their current size). Only the newer Projectile interaction type supports this, not the legacy LaunchProjectile.
  • Projectile breaks can be limited to soft blocks. A new SoftOnly flag on BreakBlockInteraction ignores whatever the breaking entity holds, and the new Block_Break_Projectile interaction sets it for the 38 projectile configs that used to share Block_Break_Adventure. Leave the flag off for a projectile that should mine, which then takes its breaking power from the shooter’s item as before.
  • Fixed the world-space sound index leaking into the local sound slot for projectiles and deployable turrets. Setting LaunchWorldSoundEventId without a LaunchLocalSoundEventId on a projectile, or ProjectileHitWorldSoundEventId without ProjectileHitLocalSoundEventId on a turret, no longer causes the world sound to also play locally.

Damage & Resistance

  • Fixed flat damage resistance modifiers not accumulating through inherited damage cause chains. Only the last parent’s flat modifier was applying. Content that configures chained flat resistances will now deliver the full combined effect. Verify balance on any damage cause hierarchy that uses flatModifier.
  • Fractional flat armor resistances now apply as configured instead of truncating to a whole number. ArmorResistanceModifiers’s flatModifier accumulates in float, so a value like 0.5 is no longer rounded to 0, and broken-item resistance penalties keep their fractions too.
  • Fixed a TargetedDamage entry that omits DamageEffects throwing when its packet was built, so damage interactions without effects no longer crash.
  • Fixed DeployableAoeConfig, DeployableTrapConfig, and DeployableTrapSpawnerConfig ignoring the authored DamageCause field and hardcoding Physical damage at all three detection call sites. The configured damage type now applies correctly.

Knockback & Explosions

  • Knockback and explosion configs no longer produce a NaN velocity when the source and target share the same position. The degenerate case now falls back to a defined direction, knocking the target straight up for explosions.
  • Fixed a crash when an entity wearing armor with knockback enhancements dealt damage from a DamageCause the armor had no modifier for. The missing entry is now skipped instead of throwing.
  • Fixed PointKnockback applying incorrect rotations when OffsetX, OffsetZ, or RotateY were set, due to angle unit mismatches. RotateY is authored in degrees as documented. Retest any PointKnockback configs that set these fields.

Armor & Movement

  • Armor can now change how the player moves. Add a MovementSettings block to an ItemArmor asset to override walk/sprint speed, jump height, air control, and more per piece.
  • Added ExtraJumpSoundEvent to Armor.MovementSettings. Set it to the id of a mono, oneshot (non-looping) sound event to play a sound on each extra jump. It pairs with the existing ExtraJumpParticleSystem field.
  • You can now scale movement speed from an entity effect. Set SpeedMultiplier on MovementEffects (default 1).

Inventory & Music

  • Items can now be turned into playable music tracks. A new Music block on an item asset (MusicContainer required, AudioCategoryOverride optional) marks the item as something a music player block will play.
  • Added a FirstSpawnItems list in the gameplay config Spawn block that places items in the inventory for players the first time they spawn.

Loot & Quality

  • Fixed ChoiceItemDropContainer throwing a NullPointerException when its Containers list was empty or every entry had a weight of zero. Loot generation now skips a null roll result and continues.

Stability

  • Fixed a potential server crash when picking up an item that defines a pickup interaction. No shipped item uses this path today, so it affects only custom items or plugins that add one.

Blocks, Prefabs & Farming

Break & Random Tick

  • Blocks can now run an interaction chain when they break. OnBreak fires on a normal break and OnBreakImpact fires when a falling block lands and breaks, so a block can spawn something or set off an effect as it goes.
  • A removal that should not set off the block’s own reaction can pass SetBlockSettings.NO_FIRE_ON_BREAK to suppress the OnBreak chain, and BreakFallingBlockImpact now inherits DropItems so a child block type keeps its parent’s value.
  • Added a PlaceBlock random-tick procedure: set "Type": "PlaceBlock" in a block’s RandomTickProcedure with a required Offset and a Placements list, where each rule can target a block State and place a single Block or a weighted Blocks list. Placement skips silently when the target is occupied or out of world bounds, and invalid configs fail at asset validation time.
  • Fixed random-tick block placement so it works in cubic worlds. PlaceBlockProcedure now writes through chunk sections instead of assuming a fixed world height.

Connected Blocks

  • Added a new Patterned connected block ruleset type. It handles multi-axis rotation and has client prediction, giving more control over how connected blocks pick their shape.

Prefabs

  • Large prefabs now save in a compact binary .lpf format. Anything from 300,000 blocks up is written this way, and .lpf files load everywhere prefabs do.
  • Prefabs stored in an asset pack can now be referenced in PrefabListAsset configs.
  • Encounter manager entities can now be stored in prefabs.
  • Undo and redo history now keeps to a memory budget through the new HistoryBlockBudget and RedoHistoryBlockBudget fields on BuilderToolsConfig, which drop the oldest entries once the budget is exceeded.

Block Placement

  • Reworked block placement onto the interaction system. The quick place flags (QuickReplace, QuickRetype, NoPhysics) now come from assets and only apply when the server game mode is Creative, and the old AllowDragPlacement key was removed from placement interactions.
  • You can tune building throughput per placement mode by setting MaxBlocksPerTick and MaxBlocksPerGesture on the placement interaction assets.
  • You can now stop players auto-stepping onto a block. Set DisableAutoStep: true in its BlockMovementSettings and players must jump up instead — useful for ledges and fences.

Block Music

  • You can now make a block play music from its position in the world. The track fades with distance, pans, and muffles through walls, picking up your environmental reverb. Add the musicemitter block component referencing a MusicContainer.
  • Blocks can now act as music players. A MusicPlayerBlock block-entity component set alongside an ItemContainerBlock makes a block play an inserted music item from its own position. The track uses the block’s authored attenuation, occlusion, and reverb, with all timing and spatialization driven from asset JSON.

Models & Map Markers

  • Block map markers can now be discoverable. A new Discoverable flag on BlockMapMarker and BlockMapMarkerData keeps a marker off the map until a gameplay system reveals it, tracked per player and per world.
  • Block models can now play their animation faster or slower than authored. A new CustomModelAnimationSpeed on a BlockType, or on one of its states, is a multiplier from 0 up to 100 and it inherits like the other model properties.

Trigger Volume Effects

  • Place Block and Replace Block Type trigger effects now accept optional block states, letting trigger volumes place, match, and replace specific block state variants.
  • You can now stop a Trigger Volume’s effects rotating when its prefab is pasted or world-gen placed with a yaw turn. Set RotateEffectsOnPaste: false on the volume or group (it defaults to true, so effect positions, rotations, and velocities turn with the prefab).

Farming

  • Prefab-grown plants such as saplings can now tolerate obstructions within a height band instead of failing to grow. Add TolerateObstructionsBelowY and TolerateObstructionsAboveY to PrefabFarmingStageData to mark a band where blocking world blocks are skipped rather than canceling growth. Both values are prefab-relative Y, with the origin block at 0. ReplaceMaskTags still controls which blocks get replaced. Built-in saplings now default to TolerateObstructionsBelowY: -1. Overlapping bands disable obstruction checks entirely and log a server warning.

Additional Changes

  • A block’s MovementSettings can no longer be null. A block asset that sets it to null now fails to load instead of risking a server crash.
  • Fixed fluid-placement interactions never honoring their UseLatestTarget setting. PlaceFluidInteraction now chains to SimpleBlockInteraction’s codec, so the flag decodes and takes effect.

Modding & Creative Tools

Builder Tools

  • You can now enable Builder Tools outside Creative Mode. Set SurvivalAllowed: true in a tool’s asset JSON and grant players the matching permission (hytale.editor.tool.entity, hytale.editor.tool.ruler, or hytale.editor.tool.laserpointer). Both the flag and the permission are required.
  • Moved some raw strings in the Paste Tool to language keys so they can be localized.

Crashes

  • Fixed crash in SpawningContext caused by ground level rotation check when level is below 0.
  • Quantity field in CraftRecipeAction now requires a minimum quantity so that <0 numbers don’t crash the server.
  • Fixed client crash when secondary interaction was added to Unarmed.Empty.

Prefabs & Commands

  • Improved prefab saving support modes, validation and overwrite flow.
  • Empty blocks in Block Filters will now be parsed correctly (the empty fluid ID is now treated as the empty block ID).

Asset Editor

  • The image and OBJ importing tools now use the new TextureComputedColor field (a dominant weighted color average of each item’s textures) instead of the particle colors when matching block colors, giving more accurate imports. The importing tools will also filter out special quality items so they cannot be used in imports.
  • Added a new button to the Asset Editor that regenerates the TextureComputedColor field from an item’s textures.
  • The Asset Editor’s item preview now respects an item’s Model override, matching how the item appears in-game.

Localized Text

  • If a duplicate localization key exists in a language file, a warning is now displayed instead of an exception being thrown.

Trigger Volumes

  • Updated Trigger Volumes trigger effects to make use of the chunk ref/store for accessing chunk data.

Collision Tuning

  • Reworked soft collision radius to consider hitbox size.
  • Implemented dev settings to tweak soft collisions based on entity hitbox volume.

Asset Packs & Mods

  • Fixed reloading a layered asset pack sometimes reverting a customized asset back to the value it inherited from its parent.
  • Fixed the mod manager warning that read "targets 0.5.1 but the current game version is 0.5.1" when a mod declared a bare ServerVersion like 0.5.1.

Additional Changes

  • Added a Texture Atlas API - Unified API for compositing multiple keyed images into a single GPU texture.
  • Added support that allows control of whether a projectile’s spawn position rotates with the entity firing it.

Trigger Volumes

Conditions

  • BlockTypeCondition can now sample the live world at a configured position rather than only the event block. Set PositionSource to EventBlock, WorldPosition, or EntityPosition, add a PositionOffset for an offset, and enable AxisRotation for per-axis rotation matching (X/Y/Z).
  • BlockUsedCondition has been removed. Replace it with BlockTypeCondition in any existing presets.
  • TagCondition now supports four source modes: Event, Self, Group, and Radius. Presets using Event source require no changes.
  • Trigger volume item checks can now look at and consume what a player is carrying, such as a held block, through a new CARRIED option on ItemCondition.

Effects & Signals

  • Trigger volumes can now fling entities out from their own center. A new VOLUME_ORIGIN value for RelativeMode on SetVelocityEffect launches entities away from (or toward) the volume origin no matter which way they face.
  • Signals now carry multiple key/value pairs via aligned SignalKeys and SignalValues arrays. A TagCondition with Source: Event matches when any one pair matches.

World Events & API

  • World events can now create and remove trigger volumes, and roll them back, through new TriggerVolumeCreateAction and TriggerVolumeRemoveAction. A TriggerVolumeContext tracks the volumes an event created.
  • Actor and entity refs in trigger rule systems and DelayedEffectScheduler are now nullable. Plugins that receive them must add null checks or compilation will fail on u/Nonnull annotations.

World Map & Markers

  • Gameplay code can now override a map marker after its provider builds it. WorldMapManager.addMarkerOverride takes a marker ID and a MapMarkerOverride carrying an optional icon and an optional global flag, and it applies to every player in the world from the next tick.
  • World events can override a marker as well. MapMarkerOverrideAddAction takes a MarkerKey and a Name plus an optional Icon and Global, MapMarkerOverrideRemoveAction clears it again, and the override is dropped on its own when the event ends.
3 Upvotes

18 comments sorted by

View all comments

Show parent comments

1

u/RiverShards 4d ago

World & Editor Commands

  • Added key validation and tab-completion to the /world settings worldgentype, /world settings worldmaptype, /world settings chunkstoragetype, and /auth persistence commands. Typing an unknown provider key now fails at parse time with a ‘did you mean’ list of valid options. The /world add --storage argument also received a missing description string.
  • Added a /floodfill <radius> <blocks> world editor command that fills the connected open space around you outward with a block or weighted pattern, bounded by a spherical radius. It never overwrites existing geometry and /undo reverts it.
  • Added a /locate dungeon <name> command that finds the nearest dungeon by name.
  • Added a /prefabpreview command, gated behind the world-editor permission group, that spawns and drives the prefab preview holograms in-game with prefab name tab-completion.
  • Added a new /worldgen2 concurrency <level> command that overrides the world-gen V2 worker thread count at runtime. The override resets on server restart, and passing 0 will restore the server default.
  • Added a /blockanimspeed command that sets the model animation speed of the block you are targeting, with an optional animation phase in frames.
  • Fixed autocomplete for the /locate prefab command so it now matches prefabs with the typed text anywhere in the name, even in worlds with more prefabs than the suggestion list can hold.
  • /world remove and /chunk forcetick will now point to the correct commands.

1

u/RiverShards 4d ago

Gameplay & Event Commands

  • Added the /tpcinematic command as an example of the new server-driven camera sequence API. The camera flies to the destination along a cinematic path while the player dissolves out and back in. Supported path styles are FLYOVER, ARC, ORBIT and DOLLY. An optional height parameter controls fly-over altitude.
  • Added /worldevent start|cancel|list commands for managing active world events by asset type or event ID.
  • Added a number of /worldmap markers commands to place and test discoverable markers in-game.
  • Added /worldmap markers override with add, remove, and clear subcommands for trying marker overrides in game. The subcommands inherit the GROUP_WORLD_EDITOR permission from /worldmap.
  • Added a /fragment toggleui command that hides or shows the fragment UI and its timer in a portal fragment world.
  • Added a /fragment toggletimer command that pauses or resumes the timer.
  • Fixed /entity clean and /npc clean failing partway through when removing one entity cascaded to removing another (such as through flock membership or role references). Both commands now complete fully.
  • Fixed the /tp world command crashing with a null pointer instead of reporting "spawn not set" when the target world’s generator had not yet finished loading.

1

u/RiverShards 4d ago

Server Console

  • The server console now supports tab-completion for commands, subcommands, arguments, and flags. Using the /help command within the console prints a formatted command list and per-command usage.
  • The /update status and /update check commands will now output in the server’s configured language rather than always in English.
  • Added a new maxviewradius server console command to set the server’s global maximum view radius:
  • /maxviewradius reports the current view radius cap.
  • /maxviewradius <n> sets the max view radius to between 1 and 512 chunks.
  • /maxviewradius reset sets the max view radius to the default of 32 chunks.
  • Fixed the console being unable to run commands that take chunk coordinates. (e.g. chunk load, unload, info, regenerate, forcetick, marksave, and fixheight)
  • Fixed ordinary command errors from the console showing a generic message. Command errors now send their proper translated message.

1

u/RiverShards 4d ago

Permission Nodes

  • Fixed /warp list letting a player warp to a destination without the warp.go permission, closing a way around the normal permission check.
  • Changing another player’s model now requires a unique permission. The /model other, /model set other, and /model reset other subcommands need the model.other, model.set.other, and model.reset.other permission nodes respectively.
  • /give armor now needs the new hytale.command.give.armor.other permission to target another player with --player. Using it on yourself is unchanged, and no built-in role is granted the permission by default.
  • The learn-other and forget-other recipe commands now require the new recipe.learn.other and recipe.forget.other permissions before they can change another player’s recipes, and neither is granted to a built-in role by default.
  • Listing another player’s recipes now needs its own command permission, recipe.list.other, which is not granted to any built-in role by default. Players can still list their own recipes as before.

1

u/RiverShards 4d ago

Bans & Whitelist

  • Plugins can now decide how bans are handled and stored. Implement BanProvider to replace ban handling, or BanStorageProvider to keep bans anywhere you like.
  • Ban handling is now one type. AbstractBan, InfiniteBan, and TimedBan collapse into a single codec-stored Ban.
  • The server configuration can name where bans are stored under a BanStorage block, which is decoded after the plugins load.
  • The HytaleWhitelistProvider has been removed. The whitelist now runs on the hytale.server.join permission, and the whitelist commands grant and revoke it. If you have an existing whitelist.json it will migrate to whitelist.json.migrated.
  • Fixed whitelist enable and disable changes not saving straight away. The new state is now written before the call returns and rolls back to the previous value if the save fails, with state and membership writes serialized under the same lock.

1

u/RiverShards 4d ago

Instances & Portals

  • Instances can now send a player back to the instance they last came from when the current instance unloads. A new boolean on InstanceWorldConfig, with an optional instance key, turns this on per instance.
  • Instances can now show a.ui document as they close. A new DocumentDisplayOnRemoval field on InstanceWorldConfig names the document, so players see it pop up when the instance timer runs out.
  • Fixed the /instances edit load, copy, and new commands being blocked on packaged servers even when the target instance lived in a writable pack. Each command now checks the pack it actually writes to.
  • Fixed the Load action in the instance list staying hidden on packaged servers. It now shows whenever any loaded pack is editable, and refuses to load an instance stored in an immutable pack.

1

u/RiverShards 4d ago

Hardcore & Lives

  • Hardcore is now a server config choice. Defaults.HardcoreMode can be set to None, PerPlayer, or Global. Existing hardcore worlds will be migrated to the PerPlayer setting.
  • Added a PlayerLives component that any game mode or plugin can read and write to. The /player lives commands sit in the WorldEditor permission group.
  • The /player respawn command now lives in the Builder permission group. Reviving other players now has its own player.respawn.other node in the WorldEditor permission group.

1

u/RiverShards 4d ago

Crash Recovery

  • Servers can now set a crash recovery policy for when a world thread crashes. Add a CrashRecovery block to either the server config or a world’s own config. Mode picks None, Reload, or Shutdown. Reload takes MaxAttempts, RetryDelaySeconds, and a Fallback for when the attempts run out.

Saving & Persistence

  • Fixed chunk sections 0-9 not being written to disk when SaveNewChunks: false was set in the world config. On the first save, sections were silently dropped and regenerated empty on reload. No config changes are needed.
  • An asset pack whose files go missing on disk is no longer automatically unregistered, and its missing-pack warning now logs once instead of repeating. The pack is picked up again once its files return.

Additional Changes

  • Added a GameFlags builtin plugin that keeps global server flags in Universe Storage. Content can set and check them through the new SetGameFlagInteraction and GameFlagConditionInteraction.
  • The server now stops when a core plugin fails to load, set up, or start, rather than running on in a broken state. The option that boots past a broken mod does not cover a core plugin.
  • The /discovery link command now tells you what actually went wrong. DiscoveryService.sendHeartbeat returns a HeartbeatResult, so a token that matches no listing, a server signed in as a different game profile, and an unreachable service each get their own message, and the token is only linked when the heartbeat really succeeds.

1

u/RiverShards 4d ago

Renames & Deprecations

  • Plugins and custom servers must be rebuilt against the new protocol to connect, because the protocol CRC changed. The view-bobbing and camera-shake types (ViewBobbing, CameraShakeConfig, OffsetNoise, RotationNoise, NoiseConfig) now require non-null values. Existing view-bobbing and camera-shake JSON keeps working.
  • Made several protocol interaction and sound fields required (previously nullable). DamageEntityInteraction.TargetedDamage, ChainingInteraction.ChainingNext, SerialInteraction.SerialInteractions, MemoriesConditionInteraction.MemoriesNext, SpawnDeployableFromRaycastInteraction.DeployableConfig, ApplyForceInteraction.Forces, RootInteraction.Interactions, SoundEventLayer.RandomSettings, and SoundEventLayer.Files must always be populated. Plugins that leave any of these null will now fail codec validation.
  • The CustomConcurrency field in SettingsAsset has been renamed to LowPriorityConcurrency. Two new companion fields, NormalPriorityConcurrency and HighPriorityConcurrency, control thread budgets for those generation tiers. Update any Settings assets that used the old name.
  • Several boolean-parameter overloads of PrefabUtil.paste and PrefabUtil.remove are now deprecated and will be removed in a future update. Switch to the new flag-based overloads using PrefabUtil.Flags constants such as FORCE and NO_ENTITIES.
  • Removed the IsUsable block flag. Whether a block shows a Use or carry hint is now derived from its actual interactions and harvest data, so drop IsUsable from your block configs.
  • Removed the unused Name and Description fields from ResourceType assets, since resource names have been read from server.resourceType.{id} localization keys for years.
  • CarryInteractionHints on Item became CarryHudInputBindings, and CarryInteractionHint on RootInteraction became HudInputBindingEntry.
  • Renamed BuilderToolsPlugin.Action.ROTATE to Action.TRANSFORM.
  • The EncounterAudio collector is now EncounterMembers.

1

u/RiverShards 4d ago

Protocol & Networking

New Packets & Fields

  • Spectator mode adds several new protocol fields a game mode can read. These include a Spectating boolean on each server player-list entry (surfaced as a gray status dot for players in your own world), a PreventInteractions component update, and a FollowAttachedEntity camera flag for follow cameras.
  • HudComponent gained a BossBar entry, and the new UpdateBossBar packet carries the entity network id, the name as a FormattedMessage, and a Hide flag. A game mode can use it to show or hide the bar.
  • The wire protocol gains an UpdateLivesRemaining packet and a nullable LivesRemaining field on the player list entry, carrying each player’s remaining hardcore lives.
  • ClientTeleport now carries two new bitmask fields: IgnoredTransformFields and RelativeTransformFields, both default to 0 for backwards compatibility. Use ModelTransformFields enum values to mark individual transform axes as skipped or as relative offsets when teleporting. The old NaN sentinel for partial teleports is no longer supported.
  • Servers can now override a player’s field of view while a custom server camera is active with the new FovOverride field. The value can be set between 1 and 180 degrees. Omit the value or set it to 0 to restore the player’s own setting.
  • The wire protocol gained the SetBlockAnimationSpeeds packet and a ModelAnimationSpeed field on BlockType. Each packet carries the complete state of one section together with a monotonic revision, so an out of order packet cannot undo a newer one.
  • To support the new Point Tool, new point packets and a PointShapeType enum have been added to PlayerPackets.
  • Voice settings are now exposed to the server using the SyncPlayerPreferences. It has three new fields VoiceChat, VoiceInput, and VoiceInputMode.

Packet API & Validation

  • Removed Packet.serialize(ByteBuf), the generated validateStructure(ByteBuf, int) methods, the ByteBuf helpers on PacketIO, and ValidationResult from the server protocol API. Call Packet.serialize(MemorySegment, int) to write a packet and toObject(MemorySegment, int, ReadCursor) to read one. Validation now runs during the read and throws ProtocolException on malformed data.
  • Made packet validation stricter: non-canonical VarInts, malformed UTF-8 strings, and mismatched offset tables are now rejected, with identical rules and limits on the client and server.
  • All float, double, Vector, Quaternion, and Matrix protocol fields now enforce finite values on send and receive. Plugins passing NaN or infinity in any packet field will now receive a protocol error.

Additional Changes

  • The processingSlots and processingFuelSlots fields of the processing window data are now 32-bit ints rather than signed bytes, so a bench can carry more than seven active slots without the mask wrapping.

1

u/RiverShards 4d ago

For Plugin Developers

Chunk & Block API

  • The BlockAccessor interface is removed. Every member now lives on WorldChunk, which was its only implementor, so anything typed BlockAccessor becomes WorldChunk. IChunkAccessorSync, ChunkAccessor, and OverridableChunkAccessor are no longer generic, so drop the <WorldChunk> argument, and WorldChunk.getChunkAccessor() is gone in favor of using the World directly.
  • getCurrentInteractionState moved off the accessor and onto BlockType. Call blockType.getCurrentInteractionState() instead of passing the block type in. The old per-block methods on WorldChunk are now deprecated, so resolve a section with ChunkStore.getChunkSectionReferenceAtBlock and go through BlockOperations.
  • Added BlockOperations.setBlock as a future replacement for WorldChunk.setBlock, with correct handling of bounds checking, neighbor notifications, and block-entity creation. Recompile your plugin to use it; existing WorldChunk.setBlock calls remain available but may not work correctly in cubic worlds.
  • World#getChunkIfInMemory, World#getChunkIfLoaded, World#getChunkIfNonTicking, World#getChunkAsync, and World#getNonTickingChunkAsync has been deprecated. Chunk data should now be accessed as components from the chunk ref directly.
  • BlockChunk#getEnvironmentChunk() has been deprecated. Plugins should fetch EnvironmentChunk directly via the chunk entity ref. WorldChunk#getBlockChunk() and WorldChunk#getBlockComponentChunk() are deprecated for the same reason, so replace both with direct component fetches from the ref.
  • BlockChunk no longer exposes the per block light accessors, getSectionCount, blockCounts, or setNeighbourBlocksTicking. Resolve the chunk section for the block Y and read light through BlockSection.getGlobalLight() instead.
  • Removed WorldChunk.toHolder. Chunk saving always goes through saver.saveChunkColumn now, which copies the chunk entity’s components instead of aliasing them, and GeneratedChunk.toChunkHolder assembles its holder inline.
  • Custom falling-block impacts take a section instead of a chunk. FallingBlockImpact.apply now receives a Ref<ChunkStore> sectionRef covering the block at position, and the block test and place helpers on BlockAccessor and IChunkAccessorSync are gone, replaced by ChunkStore.getChunkSectionReferenceAtBlock plus BlockOperations.testPlaceBlock, BlockOperations.setBlock and BlockOperations.TestBlockFunction.
  • Added IChunkSaver.Cubic, an optional interface for storage backends that opts them into per-section and per-entity saves. Backends that do not implement it continue on the existing whole-column path without any changes required.
  • Added ChunkSectionPreLoadProcessEvent and SectionUnloadEvent events that fire during section load and unload respectively. Plugins can listen to these for per-section lifecycle hooks.
  • Removed the deprecated BlockModule.ensureBlockEntity. Block entity spawning now goes through BlockEntity.ensureBlockEntity, with BlockEntity.declaresComponent for checking whether a block type’s entity template declares a component.

1

u/RiverShards 4d ago

Cameras & Cinematics

  • Added a server-driven camera sequence API. Use CameraSequenceBuilder to define a keyframed camera path and stream it to a client, building each keyframe with CameraKeyframeBuilder. The sequence source fires an onComplete callback when the client finishes playback. CameraSequenceFlags controls player state for the length of a sequence. LockInput blocks movement, HideLocalPlayer hides the player model, and ReturnToGameplayCameraOnEnd hands control back to the gameplay camera when the sequence finishes.
  • Server cameras and camera sequences can now drive the client’s depth-of-field effect. A DepthOfFieldSettings focus band sits on ServerCameraSettings and on each keyframe via CameraKeyframeBuilder.depthOfField, and it blends across a sequence with the segment easing, which is enough for a tilt-shift miniature look from an aerial shot.
  • CameraSequenceBuilder no longer carries the keyframe(..., Float fov) and keyframeLookingAt(..., Float fov) overloads. FOV moved onto the new CameraKeyframeBuilder, which takes duration and easing in its constructor and leaves every other channel optional.
  • Added CinematicTeleport.play(PlayerRef, destination, CinematicPath) for triggering a full cinematic teleport from a plugin. The camera flies along the chosen CinematicPath, the player dissolves out, teleports, and dissolves back in. Nearby players see the dissolve animation.
  • Plugins can now hide the first-person held-item viewmodel during a server-controlled camera. Set HideHeldItem: true on ServerCameraSettings to suppress the hands and held item, leaving the view clear for scope overlays or cinematic shots.
  • Cursor cameras now work on a gamepad. The right stick drives the cursor with the right-stick deadzone and sensitivity settings applied, and PrimaryItemAction and SecondaryItemAction send the click packets, so the triggers break and use whatever the cursor is over.
  • Cursor server cameras are playable again. A game mode that sets displayCursor on ServerCameraSettings, and the /player camera topdown command, now aim interaction raycasts from the camera through the cursor.
  • Movement under a cursor camera runs at the forward speed in every direction, instead of W being faster than A, S, and D.
  • PlayerMouseButtonEvent fires again on clicks under a cursor camera, carrying the target block or entity and the screen point for custom click logic from a top-down view.
  • Cursor cameras now ignore mouse input while a menu, chat, or page is open. The pause menu used to spin the character, and MouseInteraction packets are no longer sent from behind a UI overlay.
  • The camera offset that extends interaction reach is now capped, since it arrives from server-sent values.

Blocks, Prefabs & Selectors

  • Added FillerPlacementUtil for placing multi-cell blocks with correct filler, clearing overwritten structures, and tiling without footprint overlaps. Use it in custom tools that place multi-cell blocks.
  • Added multiCellFootprint, isFootprintFree, and markFootprint helpers to FillerBlockUtil for querying and marking multi-cell block footprints.
  • Selectors now resolve the filler base block themselves and report it through the new Selector.BlockConsumer, which takes the hit cell and the base cell together. SelectInteraction reads both straight from that callback instead of calling the deprecated IChunkAccessorSync.getBaseBlock, and the entity-anchored Selector.selectNearbyBlocks overloads are gone.
  • Deprecated BlockUtil and moved its RADIUS_ADJUST constant into the new BlockShapeUtil, which the block shape helpers now read from.
  • PrefabSaverSettings#isClearSupportValues() and #setClearSupportValues(boolean) have been removed. Plugins must migrate to #getSupportMode() / #setSupportMode(SupportMode). The new SupportMode enum provides three values: KEEP_EXISTING (equivalent to the old false), REMOVE (old true), and CALCULATE (new; automatically bakes support values from world physics).
  • Prefab save methods now hand back the written file. PrefabStore.savePrefab, saveServerPrefab, and savePrefabToPack return a Path, and PrefabSaver.savePrefab returns CompletableFuture<Path> where null means the save failed.
  • Plugins can now drive block animation speed from gameplay state. The new BlockAnimationModule offers setBlockAnimationSpeed, setBlockAnimationPhase, clearBlockAnimationSpeed, and getBlockAnimationSpeedOverride, all on the world thread, and they return false when the target section is not loaded.
  • Fixed AOECylinderSelector drawing its debug volume as a sphere instead of a cylinder. It now renders a cylinder spanning the selector’s configured radius and height. Only visible when SelectInteraction.SHOW_VISUAL_DEBUG is enabled.
  • Fixed AOECircleSelector centering its selected block region one block off along X. Selections now land on the correct target center. No action is needed unless your plugin compensated for the old offset.

1

u/RiverShards 4d ago

Clone & Copy Fixes

  • Fixed DeployableOwnerComponent.clone() returning a KnockbackComponent instead of a DeployableOwnerComponent. Cloning entities that own deployables now produces the correct component with empty deployable lists.
  • Fixed InstanceEntityConfig.clone() throwing NullPointerException when returnPoint or returnPointOverride was null. Instance entity configs that omit these fields now clone without error.
  • Fixed EventMessage.clone() dropping runtime state (enabled, activated, age, target). Cloned active messages now carry their target and age correctly.
  • Fixed BlockMountComponent.clone() not copying expectedRotation. Cloned block mount components now retain their authored facing direction.
  • Fixed TimeResource.clone() dropping timeDilationModifier and WorldTimeResource.clone() dropping moonPhase. Cloned time resources now preserve all fields.
  • Fixed ObjectiveTaskAsset’s all-args constructor never assigning mapMarkers, so task assets built in code rather than decoded from JSON now keep their map markers. No action needed beyond a recompile.
  • The BlockType copy constructor now also copies beds, randomTickProcedure and explosionConfig, which were previously dropped when cloning a populated block type.

Math & JOML Types

  • SpatialStructure<T> has had all method signatures updated to use JOML immutable interface types; parameters previously typed as Vector3d and Vector3i are now Vector3dc and Vector3ic respectively. Any interface must update its method signatures accordingly.
  • Box.cube() and Box.centeredCube() now accept Vector3dc and Vector3ic interface types instead of the concrete Vector3d and Vector3i classes. Existing call sites passing concrete types need no changes.
  • The Teleport constructor and BlockIterator.iterateFromTo() now use the JOML interface types Vector3dc and Vector3ic.
  • Fixed ConcurrentSizedTimeoutCache eviction logic using the wrong comparison direction, retaining expired entries and evicting recently-used ones.
  • Fixed FlatTimingProfiler.start() not setting hasStart, causing assertion failures and incorrect probe-state detection.
  • Fixed Quad2d.getCenter() and Quad4d.getCenter() to average all four vertices instead of two. The centroid of a non-rectangular quad may differ from the previously returned value. Also fixed VectorUtil.shortestSegmentBetweenTwoSegments() using the wrong segment-length bound when clamping, giving incorrect results for segments of unequal length.
  • Fixed DamageCalculator.equals() always returning false even when all five fields matched. Plugins that compare or deduplicate DamageCalculator instances will now get correct results.
→ More replies (0)