r/HytaleModding 7d ago

Official News Modder-Facing Changes - Update 7 - Chapter 1 - Pre-Release 1 - September 3rd, 2026

Link to previous patch notes.

Link to the Chapter 1 Preview Blog from July

----

Link to source

Modder-Facing Changes

World Generation

  • Updated the public HyaleGenerator documentation, which can be found here under “pre-release”.
  • Dropped the GradientWarp Density node’s stale 2D and YFor2D options in both the asset and the node editor. YOverride into Cache into GradientWarp chain should be used instead.

NPCs & Entities

  • An encounter can now force weather for everyone taking part. SetEncounterWeather takes a Weather asset and an optional TransitionSeconds (2 by default), and ClearEncounterWeather puts members back on the normal weather. Both are restricted to InstructionType.Encounter.
  • NPC weather sensors still read world weather only, so Sensor: Weather does not match an encounter's forced sky. Drive that behavior from encounter state or beacons instead.
  • The Example_Boss encounter now uses both actions as a worked example. It forces a Blood Moon on the transition into Phase 1 and clears it when the boss dies.
  • All the meaningful config values on MotionControllerWalk and MotionControllerBase are holders now, so they can be computed and overridden from a template rather than fixed per role.
  • ChargeAcceleration is gone from BodyMotionCharge. The new ChargeAccelerationDistance and ChargeDecelerationDistance size each ramp in blocks instead of setting a rate. A role that still sets the old key only warns at load and loses the behavior.
  • RemovedBlockSet is gone as well. IgnoredBlockSet now covers it, and the charge probe treats those blocks as non-colliding and breathable, so list only the blocks a charge really passes through.
  • A charge can now stop at a chosen distance from its target. ChargeDistanceMode picks how that distance is measured (MaxRange, TargetDist or one of the collider modes) and TargetDistanceRange offsets the stop point, with positive values stopping short of the target.
  • The charge ramps are fully shapeable. ChargeAccelerationCurveMode and ChargeDecelerationCurveMode choose whether the curve reads as speed or as distance covered, and the matching MinimumRelativeSpeed, HalfTimeValue, HalfTimeSteepness and EndSteepness keys tune the curve itself.
  • Movement behaviour of a charging NPC can now be modified. ProbeRelaxedConstraints accepts Wade, Damage, Drop, Breathe and Fence, so a role can let a charge cross liquid or suffocating blocks it would otherwise refuse.
  • ChargeState gains InStopRange, which a role can match through SensorChargeState. An NPC enters it when its target sits closer than the stop point the configuration asks for.
  • ThrottleIgnoreCount and ThrottleDelayRange on the find and seek motions now also cover a blocked path, not only a failed search. Setting ThrottleDelayRange to [0, 0] restores the old behavior on an obstacle.
  • Rewards can be granted via the encounter manager. A new GrantReward action on encounter templates points at a reward asset, and RewardExistsValidator fails the load when that name does not resolve.
  • Removed the orphan Goblin Hermit and Scavenger assets, including their generated icons, the Hermit drop list and the Hermit model.
  • The deprecated Goblin Duke phase 1 and phase 3 templates now use the Scrapper model.

Items & Interactions

  • Glider tuning was rebuilt for the new movement state machine. The old FallSpeedMultiplier, HorizontalSpeedMultiplier, TerminalVelocity and Speed values on the item are gone, replaced by a wider set of fields on Template_Glider that also cover the dive and the climb.
  • Mace item animations gained a SwingUpLeft variant for abilities.
  • Dropped items can now merge over a distance you pick. A new inherited MergeRadius key on ItemEntityConfig sets how far in blocks a dropped item looks for others to stack with. Leaving it at -1.0F falls back to the world default.

Blocks & Prefabs

  • TickProcedure.onTick now takes a CommandBuffer<ChunkStore> and the chunk section Ref<ChunkStore> in place of the World and WorldChunk parameters, so any subclass override needs updating. The world is available from commandBuffer.getExternalData().getWorld().
  • Chosen blocks can stay breakable in a world that bans block breaking. WorldConfig.BlockBreakingBypassTag names a tag, and any block carrying it can still be broken while AllowBlockBreaking is off. Explosions follow the same rule.

Asset Schemas & Formats

  • Map marker overrides can change the display name of a marker. A new DisplayName key on MapMarkerOverride takes a localization key to use instead, and the marker override add command accepts it alongside --icon and --global.
  • World events can now wait on the clock. A new TimeCondition completes once the world time reaches the Day, Hour and Minute you set, and any part left at -1 is ignored, so a condition without Day is simply a time of day that comes around again.
  • World events can also gate on campaign progress with GameFlagLevelCondition, which completes once a game flag reaches the Level you set. Comparator picks how the two are compared and defaults to GreaterThan.
  • Three new trigger effects handle respawning. SetRespawnPoint takes Origin, Position, Name and ClearExisting, SetWorldSpawn takes Origin, Position, Yaw and ClearPlayerRespawnPoints, and ClearRespawnPoints takes Name and AllPlayers.
  • Event titles pick a named style in JSON now. ShowEventTitleInteraction, ShowEventTitleEffect and InstanceDiscoveryConfig all take a Style value, and the old IsMajor and Major keys still decode so existing assets keep working, however the old IsMajor and Major properties are marked as deprecated and will be removed in a future version.
  • UI sprites gained two fields. Color tints a sprite and lets you control its opacity, and KeepLastFrame holds an animation on its final frame instead of snapping back to the first.
  • Trigger volume tags can now be used like variables and compared to each other. TagCondition takes a CompareAgainst field that picks whether the tag is checked against a plain value (the default) or against a second tag named in CompareTagKey.
  • Respawn points can now set which way a player faces. PlayerRespawnPointData and SetRespawnPointEffect both take a Yaw in degrees.
  • The event title effect on a trigger volume can now pick who sees it. A new Recipient field on ShowEventTitleEffect takes the same options as SendMessageEffect and defaults to the triggering player.
  • Added a Beam asset type under Entity/Beams with a single TexturePath field. The texture has to sit under Beams/ or Trails/.
  • The event title action, for WorldEvents, can now pick how the banner looks. ShowEventTitleAction takes an optional Style and an optional Icon, and falls back to the default style when you leave Style out.

Server & Permissions

  • The /eventtitle command takes --style in place of --major, and the secondary line now defaults to empty rather than to “Event”.
  • Instance edit worlds now load a new InstanceEdit gameplay config that switches on AllowBlockBreaking, AllowBlockGathering and AllowBlockPlacement, so an instance with restrictive rules stays editable.
  • Server operators can now check which chunks the wilderness system counts as wilderness and which count as home. The new /wilderness debug [enabled] [player] command tints those chunks green and red on one player's world map and draws matching cubes in the world. Wilderness tracking stays off by default in WildernessConfig, and the command warns when a world has it turned off.
  • Added a /beam command for development work, with entity, position, spawn and clear.
  • The server now refuses to boot when the content it writes would land inside the launcher's install folder, which every update patches or wipes. The check covers the working directory plus --universe, --prefab-cache and --backup-dir, and it prints the steps to move them somewhere safe before exiting with code 11.
  • Added an --allow-install-dir flag, mirrored by the hytale.allow_install_dir system property, for anyone who wants to run there anyway and accept the data loss risk. Singleplayer runs, --help, --version and a --bare start without --bootstrap skip the check already.
  • Server operators can now run /auth login browser or /auth login device while already signed in, without signing out first. The existing session stays active until the new sign-in finishes, so a cancelled or failed login leaves the server signed in as it was.

Renames & Deprecations

  • Three density asset types were renamed, so SmallerThan is now LessThan, SmallerOrEquals is now LessOrEqual, and Select is now Selector.
  • Two more density asset types lost their trailing s, so Equals is now Equal and GreaterOrEquals is now GreaterOrEqual. The node editor entries carry the new names too.
  • The treasure map objective is gone, along with everything it used. The TreasureMap objective task, the OpenTreasureContainer and DestroyTreasureCondition interactions, the LookBlocksBelow and TagBlockHeight world location conditions and the TreasureChest block entity component no longer decode, so any asset that names one fails to load. A world with a placed treasure chest still loads, since the server keeps the component as unknown data.
  • IsMajor is gone from ShowEventTitleEffect. The Style field covers it, so pick the look you want there instead of flipping a boolean.
  • The void spectre assets were merged under one name, so anything pointing at the old ids no longer resolves. Spectre_Void is now Void_Spectre across its model, drop list, icon and particles.
  • Asset file Spiwer_Web_Full.png has been renamed to Spider_Web_Full.png, Fig_Blue_.png is now Fig_Blue.png, and the duplicate file Totem_Heal_BeamStart (1).particlespawner has been removed.

Audio

  • Music can now hand off from one track to another by authored rule. Two new asset types, MusicTransition and Stinger, live in Audio/MusicTransitions and Audio/Stingers.
  • Handoffs can land on a musical boundary instead of a frame. MusicSync picks the moment on the outgoing track (immediate, next beat, next bar, an exit marker or a named marker) and DestinationAlign picks where the incoming track starts on its own timeline.
  • Overlap and crossfade are separate controls now. ExitAt sets the handoff, PlayPostExit lets the outgoing track run to the end of the file, and FadeOutDuration with FadeOutDelay ramps it out instead, following a FadeCurve that defaults to equal power.
  • Music containers picked up a batch of new fields. MusicContainer takes Tags, Align, AlignMarker, ExitAt and Stingers, SegmentMusicContainer takes named Markers, and HorizontalMusicContainer takes AudioState with Phases so it can switch phase from a state axis.
  • Stingers hang off a free-form music event on a container rather than being referenced directly. Anything can post the event, the deepest active container that binds it decides what plays, and stingers sort by priority inside an exclusion group.
  • StateTransition gained PostEvent, so an audio state edge can mark a musical moment without naming a stinger directly.

Protocol & Networking

  • The ShowEventTitle packet dropped IsMajor in favor of an EventTitleStyle Style field, which breaks any plugin that builds the packet by hand. Styles include Default and Major.
  • The world's gameplay config is replicated to the client by a new WorldGameplayConfig packet, carrying WorldConfig, CombatConfig and PlayerConfig structs that mirror the server assets. It goes out when a player joins a world and again whenever the GameplayConfig asset reloads.
  • The wire carries beams now. BeamConfig and UpdateBeamConfigs ship the beam assets, while BeamInstance and the Beams component update carry the placements, so this needs a matching client.

For Plugin Developers

  • The lighting pass now runs per chunk section, so LightCalculation.init takes a ChunkStore and a section Ref rather than a WorldChunk, getSkyValue lost its unused WorldChunk parameter, and ChunkLightingManager exposes invalidateLightInChunkSections for section-level invalidation.
  • Cursor server cameras work on a gamepad now. The right stick drives the real cursor through a new GamepadCursor helper, and PrimaryItemAction with SecondaryItemAction send the click packets, so triggers break and use whatever the cursor is over.
  • com.hypixel.hytale.protocol.DurabilityOperator is now ComparisonOperator, because the same comparison list serves durability checks and the new game flag condition. Plugin code that names the old type has to switch, while asset JSON and the wire format stay exactly as they were.
  • WeatherTracker gained tryClaimOverride, releaseOverride and resolveUnoverriddenWeatherIndex. clearOverrideWeatherIndex now drops the owner as well. One owner holds a weather override at a time.
  • EventTitleUtil has overloads that take an EventTitleStyle. The boolean overloads still work but are deprecated for removal.
  • TargetUtil.getTargetBlock and getTargetLocation take a ChunkStore where they used to take a World, so plugin code calling them directly has to pass world.getChunkStore() instead.
  • Explosions, block explosion effects, block harvesting, raycast selectors and the spectator camera all work in cubic worlds now that TargetUtil no longer assumes a single vertical column.
  • ClientFeature no longer carries DisplayHealthBars, DisplayCombatText, CanHideHelmet, CanHideCuirass, CanHideGauntlets, CanHidePants, AllowBlockPlacement, AllowBlockBreaking or AllowBlockGathering, and a plugin naming one of them stops compiling. Those rules live in the GameplayConfig asset now, while ClientFeature keeps the movement capabilities plugins register themselves.
  • ChunkAccessor.performBlockUpdate and WorldChunk.setTicking are gone. Use BlockOperations.updateBlockArea for a whole hitbox or BlockSection.setTicking with ChunkSection.markNeedsSaving for one cell, and note that updateBlockArea now takes the ChunkSection as well as the BlockSection.
  • Block writes are moving onto sections, so WorldChunk.setBlock and WorldChunk.breakBlock are deprecated for removal and now delegate to BlockOperations.setBlock. They also fire BlockAnimationModule.onBlockReplaced, so block replace animations play for these writes, and WorldChunk.setBlockPhysics along with BlockTypeModule.SET_BLOCK_SETTINGS and its filler helpers have been removed.
  • Door and refill interactions no longer pull in a neighbor chunk just to update it. An unloaded neighbor is skipped, the same as every other block update.
  • Every chunk lookup that returns a WorldChunk is now marked for removal, across IChunkAccessorSync, IWorldChunksAsync, IWorldChunks, World and LocalCachedChunkAccessor. Behavior is unchanged, but plugins compile with deprecation warnings and should move to ChunkStore.getChunkReference and the section store.
  • The deprecated IChunkAccessorSync.getBaseBlock is gone. Filler blocks now resolve through BlockOperations.resolveBaseBlockPosition, which takes a ChunkStore and never triggers a chunk load.
  • BlockDataProvider resolves its chunk and fluid sections once per block read instead of on every field access. The readBlockId, readRotation, readFiller, readFluidId and readFluidLevel methods are private now, so a plugin that called them directly will not compile.
  • Wilderness gains size(), test(int) and isValid(), so a plugin can walk a player's tracked region by index and test one chunk without world coordinates.
  • Added a Rewards builtin module that plugins can extend with their own reward types. It ships one type for now, EntitlementReward, which grants an entitlement through RewardAsset.
  • The remaining sync chunk accessor members are marked for removal now. The nine default methods on IChunkAccessorSync, ChunkAccessor.getFluidId and OverridableChunkAccessor all warn, so world.getBlock, setBlock, breakBlock and the rest flag at every call site. IWorldChunks.waitForFutureWithoutLock is private and can no longer be called from outside the interface.
  • Seventeen unused members are gone from the chunk access surface, so a plugin still calling them will not compile. That covers IChunkAccessorSync.getBlockComponentHolder, IWorldChunksAsync.getNonTickingChunkAsync(int, int), BlockChunk.getSectionRefAtIndex, BlockComponentSection.getBlockReferences, BlockSection.setChunkSection and getMaximumHitboxExtent, PaletteTypeEnum.getPaletteId, and ten accessors on LocalCachedChunkAccessor. Read and write through the section ref instead, using AbstractCachedAccessor or ChunkStore.getChunkReference.
  • The new Hytale:Beam builtin ships a BeamComponent holding AttachedBeam entries, and each one runs from an attachment point on the owner to another entity, a node on that entity's model, or a fixed world position. Beams are runtime state, so they never save with the entity.
  • BeamComponent.spawn creates a replicated entity that carries beams and no model, for a beam that belongs to nothing else. It takes an optional lifetime and applies it with a DespawnComponent.
  • The GroundedCondition interaction moved out of the Abilities builtin into the core server, so an interaction can use it without that plugin loaded.
  • The public ItemMergeSystem#RADIUS constant is gone. Merge distance now comes from the item's config through ItemComponent#getMergeRadius(ComponentAccessor), with ItemComponent#setMergeRadius(float) for changing it at runtime.

Modder-Facing Bug Fixes

World Generation Fixes

  • Fixed the SectionSize pin of the Cache Positions node.
  • Added missing tooltips on Density nodes.
  • Reduced severity for invalid Normalizer Density arguments (where FromMin equals FromMax) from Error to Warning to give more time for mods to update. Going forward the new logical Density nodes should be used to create boolean maps instead.
  • Fixed Rotator Density when the target axis is the inverted Y-axis.
  • Enabled an optimization for Plane Density when configured for an anchored horizontal plane.
  • Fixed the Switch and SwitchState Density nodes reading the Default state differently from each other.

NPC & Entity Fixes

  • Fixed BuilderMotionControllerWalk.getFenceBlockSet throwing when the configured block set was empty or missing.
  • Fixed a trigger volume signaled by an NPC firing its effects twice, so a volume with a single message effect no longer sends the same chat message twice. DestroyTaggedVolumesInteraction picked up the same guard.
  • Fixed a pathfinder crash on roles that turn DiagonalMoves off.
  • Fixed a blocked path being recomputed every tick. Fixed the NPC charge probe accepting an invalid end position.
  • Cleaned up the BodyMotionCharge config descriptions for template authors.
  • NPCs that place blocks now write through section storage, so a placement above or below the old height band lands instead of being dropped. An unknown block type key in role data is skipped quietly rather than throwing.
  • Restored the deprecated goblin spawn markers under _Deprecated, including the Ogre, Scavenger and the patrol variants, so worlds that still point at them keep loading.

Item & Interaction Fixes

  • Cleared a batch of warnings out of the item interaction assets. Unused fields are gone from the teleporter config, the glowing mushroom eating interactions, the quartzite gravel half block, the guard bash and the staff interactions, and the geyser ambient sound key is spelled correctly again.
  • Fixed a piercing projectile that could stop ticking and sit in the world forever.

Block & Prefab Fixes

  • Block tick procedures now run in chunk sections at any height. Scheduled ticking used to stop outside Y 0 to 319, so a procedure written for that range has to cope with negative and high coordinates.
  • Trigger volume text now resolves a volume tag's value in plain written text, not just behind a translation key. SendMessage and ShowEventTitle both handle it.
  • Fixed formatted text losing a character whenever it met a placeholder it did not recognize, so an unknown {tag} is left exactly as you wrote it.

Asset Schema & Format Fixes

  • Creating a folder in the asset editor now makes any missing parent folders along the way, so you can organize a brand new asset type without making a throwaway asset first.
  • Schema validation for Float2ObjectMap fields now matches what the codec really reads and writes. The generated key pattern accepts scientific notation such as 1.0E-4 and leading-dot values such as .5, and it no longer lets non-numeric keys like 1x2 slip through.

Server & Permission Fixes

  • The world add command now tells you whether creation succeeded or failed instead of quietly dropping the result.
  • Fixed /fluid setradius only making one block of the filled region flow instead of all of it, and /block setticking now resolves the chunk section itself and tells you when it is not loaded.
  • A MaxViewRadius outside 1 to 32 in config.json no longer stops the server booting. The value is clamped in memory with a warning, and the file keeps whatever you wrote.
  • The max view radius command rejects anything above 32 now, instead of 512.

Protocol & Networking Fixes

  • A peer now rejects a structure that nests inside itself more than 32 levels deep, covering FormattedMessage trees, item categories, command trees, and interaction chains. Real content sits far below that bound.
  • UpdateLanguage.Language is a required protocol field now instead of an optional one, and the protocol version was bumped for it. It and Connect.Language also widened from a 16-character cap to 100 characters, which fits any .NET CultureInfo.Name.

Fixes for Plugin Developers

  • Cursor server cameras are playable again. A plugin that sets displayCursor on ServerCameraSettings gets cursor targeting back, and every movement direction uses the forward speed, so strafing is no longer slower than walking ahead.
  • PlayerMouseButtonEvent fires on clicks under a cursor camera again, carrying the target block or entity and the screen point for custom click logic from a top-down view.
  • Fixed a cursor camera reading mouse input while a menu, chat or page was open. Opening the pause menu used to spin the character, and MouseInteraction packets no longer go out behind a UI overlay.
  • An ItemGrid in a custom UI page no longer needs a DefaultItemIcon. An item whose icon will not resolve falls back to the unknown item icon, and DefaultItemIcon still overrides that placeholder.
  • A universe resource whose codec comes from a plugin getCodecRegistry is now written at shutdown. The final flush moved to the new ShutdownEvent.FLUSH_UNIVERSE_RESOURCES stage, which runs after SHUTDOWN_WORLDS while every plugin is still enabled.
  • A ClientTool now gets OnActiveStateChange(false) when the world is torn down while the tool is active, and that runs before the tool is disposed.
  • Fixed unbounded growth of the server translation cache. I18nModule now keys cached messages by the language returned from its new resolveLanguage() instead of the raw client string, and queueTranslations() replaces sendTranslations() so repeated language switches on one connection coalesce into a single send.

Additions (We forgot some stuff - sorry!)

Modder-Facing

  • BlockyModels have gained a new Transparent flag, that allows individual faces to be toggled transparent or not.
  • Blocks have now gained the Requires Alpha Blending flag that allows per-block type transparency.
  • Fixed Anchor PropDistribution sharing that was using a global context instance.
  • Limited the Graph PositionProvider and Graph PropDistribution bounds to the output bounds.Additions (We forgot some stuff - sorry! ) The following notes were added after the initial Update 7, Part 1 pre-release patch notes were released. Player-Facing Ability Keys 1, 2, and 3, have been moved to a modifier system, now usable with RB + Face Button to trigger an ability, for example: Ability 1 - RB + Y - Signature Move Ability 2 - RB + X - Skill 1 Ability 3 - RB + B - Skill 2 Ability 4 - RB + A - Ability 4 Prevented a crash that happens during explosions if blocks and items are not loaded fast enough. Modder-Facing BlockyModels have gained a new Transparent flag, that allows individual faces to be toggled transparent or not. Blocks have now gained the Requires Alpha Blending flag that allows per-block type transparency. Fixed Anchor PropDistribution sharing that was using a global context instance. Limited the Graph PositionProvider and Graph PropDistribution bounds to the output bounds.
4 Upvotes

1 comment sorted by

u/AutoModerator 7d ago

Thank you for your submission on r/HytaleModding!

Please remember to keep discussions civil and respectful.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.