Update 2 to Update 3 Changelog
This page covers all notable changes between Update 2 and Update 3. Changes are organized by category, from the most impactful breaking changes to internal improvements.
New Features and Systems
Section titled “New Features and Systems”Random Tick System
Section titled “Random Tick System”A new builtin plugin (RandomTickPlugin) adds Minecraft-style random block ticking. Blocks can now have a RandomTickProcedure that fires at configurable intervals per chunk section. → Block Ticking docs · Builtin Plugins
RandomTickresource: configurableblocksPerSectionPerTickStable(default 1) andblocksPerSectionPerTickUnstable(default 3)RandomTickSystem: chunk ticking system using deterministic hashing for stable ticks and randomization for unstable ticks- Two built-in procedures:
ChangeIntoBlockProcedure— changes a block into a target block typeSpreadToProcedure— spreads blocks to neighbors (e.g., grass spreading to dirt), with configurable directions, Y range, required light level, and revert behavior
User-Created Map Markers
Section titled “User-Created Map Markers”Players can now create and manage their own map markers on the world map. → Builtin Plugins docs
UserMapMarkerdata class with name, description, position, icon, sharing, and creator trackingUserMapMarkersStorefor persistent per-player per-world marker storageUserMarkerValidatorenforces config limits (max markers, name length, etc.)UserMapMarkerConfigdefines limits:maxPersonalMarkers,maxSharedMarkers,maxNameLength,maxDescriptionLength, view distancesPlayersMapMarkerConfigconfigures player marker icons with height delta- New marker providers:
PersonalMarkersProvider,SharedMarkersProvider,OtherPlayersMarkerProvider - New packet
CreateUserMarker(ToServerPacket, ID 246) for creating markers from the client → Packet Types docs
Anchor Action System
Section titled “Anchor Action System”A new module system for handling anchor-triggered actions from JSON configuration. → Instances docs
AnchorActionModule— module managing anchor action registration and dispatchAnchorActionHandler— handles actions from JSON config- New packet
UpdateAnchorUI(ToClientPacket, ID 235) for updating anchor UI visibility and content → Packet Types docs
Multiplayer Sleep Notifications
Section titled “Multiplayer Sleep Notifications”A new SleepNotificationSystem sends notifications to awake players when others are trying to sleep. → Builtin Plugins docs
- Small server mode (4 or fewer players): notifies by name
- Big server mode: uses a sleepers ratio threshold (default 50%)
- Configurable notification cooldown
Sleep Sounds
Section titled “Sleep Sounds”The sleep system now supports configurable sound events for sleep/wake transitions via SleepSoundsConfig.
Return to Hub Button
Section titled “Return to Hub Button”New ReturnToHubButtonSystem and ReturnToHubButtonUI show/hide a “Return to Hub” button when players enter or leave creative hub child worlds.
Layer Command
Section titled “Layer Command”New /layer <direction> <layers> builder tools command for placing layers of blocks in a direction. Supports cardinal directions and camera-relative directions.
Teleporter Improvements
Section titled “Teleporter Improvements”- New
UsedTeleportercomponent tracks teleporter usage with destination info and clear-out distances ClearUsedTeleporterSystemremoves the component when the player moves away from the destination (cooldown reduced from 250ms to 100ms)TurnOffTeleportersSystemupdates portal block visual states when teleporter destinations change
UI Gallery Command
Section titled “UI Gallery Command”New /uigallery debug command opens an interactive UI component gallery for development purposes.
RocksDB Chunk Storage
Section titled “RocksDB Chunk Storage”A new RocksDbChunkStorageProvider adds RocksDB as a chunk storage backend with LZ4/ZSTD compression, bloom filter support, and a dedicated /world rocksdb compact admin command. → World Overview docs
FileIO Abstraction Layer
Section titled “FileIO Abstraction Layer”A new virtual file system (procedurallib.file package) with multi-root support enables asset overlay for mods overriding base assets. → Asset Development Overview
FileIO— static utility interface with thread-localFileIOSystemprovidersFileIOSystem— interface defining a file system with multiple root pathsAssetLoader<T>— generic interface for typed asset loadingAssetPath— immutable path wrapper with cross-filesystem equalityJsonResourceLoader— typed JSON file loader using the new system
Fire Fluid Ticker
Section titled “Fire Fluid Ticker”New FireFluidTicker implements fire spread and burn mechanics with configurable FlammabilityConfig (spread chance, burn chance).
Breaking Changes
Section titled “Breaking Changes”Packet Direction System
Section titled “Packet Direction System”All 240+ packet classes now implement ToServerPacket, ToClientPacket, or both, in addition to Packet. The Packet interface gained a getChannel() method. → Networking Overview · Packet Handlers
ToClientPacket extends Packet— server-to-client packetsToServerPacket extends Packet— client-to-server packetsPacketRegistryrestructured from a singleBY_IDmap toTO_SERVER_BY_IDandTO_CLIENT_BY_IDgetById()split intogetToServerPacketById()andgetToClientPacketById()CachedPacketnow only acceptsToClientPacket(generic bound changed)IPacketReceiver.sendPacket()acceptsToClientPacketinstead ofPacketPacketGeneratorreturn types changed fromPackettoToClientPacket- All references to
com.hypixel.hytale.protocol.Packetin the builtin package changed toToClientPacket
Network Channel System
Section titled “Network Channel System”A new NetworkChannel enum routes packets across separate channels: → Networking Overview · Client Sync docs
| Channel | ID | Usage |
|---|---|---|
Default | 0 | Most packets |
Chunks | 1 | Chunk, block, and fluid data |
WorldMap | 2 | World map packets |
PacketEncodervalidates packet channel matches stream channel; throwsIllegalArgumentExceptionon mismatchPacketDecoderchecksSTREAM_CHANNEL_KEYbefore decoding, skipping mismatched packetsPacketHandlersupports multiple QUIC streams per connection viachannels[]array
ComponentUpdate Polymorphic Refactor
Section titled “ComponentUpdate Polymorphic Refactor”ComponentUpdate was rewritten from a monolithic struct (fixed 159-byte block with 20+ nullable fields) into an abstract base class with 26 concrete subclasses dispatched by type ID: → Client Sync docs
| ID | Subclass |
|---|---|
| 0 | NameplateUpdate |
| 1 | UIComponentsUpdate |
| 2 | CombatTextUpdate |
| 3 | ModelUpdate |
| 4 | PlayerSkinUpdate |
| 5 | ItemUpdate |
| 6 | BlockUpdate |
| 7 | EquipmentUpdate |
| 8 | EntityStatsUpdate |
| 9 | TransformUpdate |
| 10 | MovementStatesUpdate |
| 11 | EntityEffectsUpdate |
| 12 | InteractionsUpdate |
| 13 | DynamicLightUpdate |
| 14 | InteractableUpdate |
| 15 | IntangibleUpdate |
| 16 | InvulnerableUpdate |
| 17 | RespondToHitUpdate |
| 18 | HitboxCollisionUpdate |
| 19 | RepulsionUpdate |
| 20 | PredictionUpdate |
| 21 | AudioUpdate |
| 22 | MountedUpdate |
| 23 | NewSpawnUpdate |
| 24 | ActiveAnimationsUpdate |
| 25 | PropUpdate |
serialize()now returnsint(bytes written) instead ofvoid- New
serializeWithTypeId()andcomputeSizeWithTypeId()methods EntityUpdatebuffer size changed from fixed 159 to variable 1 per update- Standalone
EquipmentandNameplatestructs removed; replaced byEquipmentUpdateandNameplateUpdatesubclasses NameplateUpdate.textchanged from@Nullableto@Nonnullwith default""
Constructor Injection for Component Types
Section titled “Constructor Injection for Component Types”A major architectural change across the entire builtin package. Systems previously stored component types as private static final fields initialized via static method calls. In Update 3, these are passed via constructor parameters instead. All static QUERY fields are replaced with instance fields. This affects virtually every EntityTickingSystem, RefSystem, and DelayedSystem subclass. → ECS Overview
Biome Renames
Section titled “Biome Renames”BiomeTyperenamed toBiomeSimpleBiomeTyperenamed toSimpleBiomeBiomeMap/SimpleBiomeMapreplaced byWorldStructure+Registry<Biome>
Ref Identity Equality
Section titled “Ref Identity Equality”Ref no longer implements equals() and hashCode(). Refs now use object identity comparison. The validate(Store) overload was added for store-correctness checking. → ECS Overview
Codec API Migration
Section titled “Codec API Migration”Codec builder pattern changed from codec.addField("name", getter, setter) to codec.append("name").add(getter, setter). This affects virtually all config and asset type classes. → Serialization Overview
BuilderCodec Decode Restructuring
Section titled “BuilderCodec Decode Restructuring”- Version decoding now happens before field decoding across all decode paths (BsonDocument, JSON, BSON reader)
decodeJson0changed frompublictoprivate
Version Type Simplification
Section titled “Version Type Simplification”Server version handling simplified from Semver/SemverRange objects to plain String: → Plugin Manifest docs · Plugin Lifecycle docs
PluginManifest.getServerVersion()returnsStringinstead ofSemverRangeManifestUtil.getVersion()returnsStringinstead ofSemver- Plugin version validation changed from semver range comparison to string equality
Chunk Storage System Refactoring
Section titled “Chunk Storage System Refactoring”IChunkStorageProvideris now generic (IChunkStorageProvider<Data>)- Added lifecycle methods:
initialize(),close(),migrateFrom() ChunkStoregained migration support with progress reporting- All existing storage providers updated for the generic pattern
HytaleServerConfig Refactoring
Section titled “HytaleServerConfig Refactoring”Inner configuration classes extracted to standalone files: → Server Configuration docs
ModConfig— mod/plugin settingsRateLimitConfig— rate limiting settingsUpdateConfig— auto-update settings withAutoApplyModeenum (DISABLED, PROMPT, AUTOMATIC) → Update System docsBackupConfig— backup settings
MarkerProvider API Change
Section titled “MarkerProvider API Change”MarkerProvider interface changed from returning List<MapMarker> to void provide(World, Player, MarkersCollector). All provider implementations updated. → Builtin Plugins docs
MapMarkerTracker Replaced by MarkersCollector
Section titled “MapMarkerTracker Replaced by MarkersCollector”Map marker providers now use MarkersCollector (with MapMarkerBuilder) instead of MapMarkerTracker for creating and filtering map markers. MapMarkerTracker.trySendMarker() renamed to sendMapMarker(). → Builtin Plugins docs
Instances Async Exit
Section titled “Instances Async Exit”InstancesPlugin.exitInstance() return type changed from void to CompletableFuture<Void>. → Instances docs
Modified APIs
Section titled “Modified APIs”Protocol Changes
Section titled “Protocol Changes”- Protocol version: CRC
1789265863to-1356075132, build number2to20, struct count314to339, enum count136to137 BenchRequirement.id:@Nullable Stringto@Nonnull String = ""BlockPlacementSettings: newallowBreakReplaceboolean field (fixed size 16 to 17 bytes) → Block Types docsBlockType: fixed block size 163 to 164 due to cascading effect ofBlockPlacementSettingsCombatTextUpdate.text:@Nullableto@Nonnullwith default""DisplayDebug: newopacityfloat fieldEntityStatType: newhideFromTooltipboolean field → Entity Effects docsFluid: newparticles(nullableModelParticle[]) anddrawType(FluidDrawTypeenum:None,Liquid) fieldsModel: newsittingOffsetandsleepingOffsetfloat fields → Block Types docsObjective: title and description changed fromStringtoFormattedMessageObjectiveTask: description changed fromStringtoFormattedMessageWorldLoadProgress.status:StringtoFormattedMessageMapMarker:idandmarkerImagechanged to@Nonnull;namechanged toFormattedMessage; newcustomNamestring and polymorphicMapMarkerComponent[]arrayUpdateWorldMapSettings: four new boolean fields for map permissions (allowShowOnMapToggle,allowCompassTrackingToggle,allowCreatingMapMarkers,allowRemovingOtherPlayersMarkers) → Packet Types docsBuilderToolSelectionTransform: transformation matrix replaced withQuatf rotation+BlockPosition translationOffsetAssetPackManifest: newserverVersionnullable string fieldPickupLocation: newBackpack(2)enum valueDebugShape: newSector(5)andDisc(6)enum valuesComponentUpdateType: newProp(25)enum valueFluidDrawType: new enum (None,Liquid)
World Generation Changes
Section titled “World Generation Changes”Indexerreplaced byRegistry<T>with bidirectional lookup,getAllValues(), andforEach()BaseHeightReference/BiDouble2DoubleFunctionpattern replaced byDecimalConstantsFrameworkAssetWorldStructureAsset.buildBiomeMap()replaced bybuild()returningWorldStructureBasicWorldStructureAssetnow supportsFrameworkAsset[]and spawn positionsMaterialAssetgainedOrthogonalRotationAssetfor solid block rotationVectorProvider.process()changed from returningVector3dto output-parameter pattern (void process(Context, Vector3d))CacheDensityandMultiCacheDensityconstructors removedthreadCountparameterPattern.Contextgained no-arg constructor andassign()methodReferenceBundlechanged internal storage fromMap<String, Reference>toMap<String, Object>with type trackingChunkRequest.GeneratorProfilegainedworldCounterparameter andclone()methodHandle/HandleProvidergained seed override supportHytaleGeneratoraddedDEFAULT_SPAWN_POSITION = (0, 140, 0)andgetSpawnPositions()methodWorkerIndexerparameter type changed toWorkerIndexer.Idacross all generator assets
Builtin Package Changes
Section titled “Builtin Package Changes”FarmingUtil.harvest()now returnsbooleaninstead ofvoidCoopBlock.getCoopAcceptsNPCGroup(int)renamed togetCoopAcceptsNPC(String)(integer group index to string name key)HarvestCropInteractiongainedRequireNotBrokenconfig fieldNPCMemoryconstructor removedisMemoriesNameOverriddenparameter andprocessConfig()methodObjectiveTaskchangedList<MapMarker>toList<ObjectiveTaskMarker>and removedgetInfoMessage()MapMarkerreplaced byObjectiveTaskMarkerdomain class (converts viatoProto())PlayerSleep.MorningWakeUpfield changed fromInstantto@Nullable InstantWorldSlumber.incProgressSecondsrenamed toincrementProgressSecondsBuilderToolsPluginreplacedMatrix4dtransforms withQuaterniondrotation +Vector3itranslationBuilderToolsPacketHandlermethod names changed to descriptive names (e.g.,handleBuilderToolSetTransformationModeState)BrushConfigdefault shape changed toSphereAssetEditorPluginadded event registry support for asset pack eventsAssetEditorPlugin.Messagesconstants renamed (e.g.,USAGE_DENIED_MESSAGEtoUSAGE_DENIED)MountPlugin: several method signatures changed to acceptRefinstead ofPlayerRefStairConnectedBlockRuleSet.getConnection()gainedupsideDownparameter → Connected Blocks docsModelSystems.UpdateCrouchingBoundingBoxrenamed toUpdateMovementStateBoundingBox- NPC instruction builder: “step” terminology changed to “instruction” throughout
KillObjectiveTasksimplified damage source handling usingDamage.EntitySourcepattern match
Server Infrastructure Changes
Section titled “Server Infrastructure Changes”Universe.java: newworldsPath/worldsDeletedPathfields; multi-channel QUIC stream setup;AtomicBooleanguard for backups;validateWorldPath()methodWorld.java:deleteWorldFromDisk()uses atomic staging toworlds-deleted/; third-party plugin crash identificationPluginManager:FAILEDstate added withfailureCausetracking;MOD_ERRORshutdown reason; version validation changed to string equality → Plugin Lifecycle docsPluginClassLoaderconstructor gainedidentifierparameterTickingThreadcan now attribute crashes to specific plugins viaPluginIdentifier→ Plugin Lifecycle docs
Component System Changes
Section titled “Component System Changes”Archetype.of()now validates against null ComponentTypesHolderremoved@Nullableannotations from fields/methodsEventRegistry.preconditionMessagenow@NullableRegistrygainedshutdownAndCleanup(boolean)method for LIFO cleanup → Registries docs
Math and Utility Additions
Section titled “Math and Utility Additions”Vector3d: new staticdistance()anddistanceSquared()methods (no object allocation) → Math OverviewBox: newZEROconstant → Math OverviewChunkUtil: newSIZE_BLOCKS_MASK = 32767constantMessageUtil: newdate(),time(),select()formatter methods for i18nFileUtil: newwriteStringAtomic()andatomicMove()methodsSoundUtil: newplayItemSoundEvent()methodLoggerUtil: newnsToMsDecimal(long)utility
Removed Features
Section titled “Removed Features”Removed Files — Protocol
Section titled “Removed Files — Protocol”Equipment.java— replaced byEquipmentUpdate(ComponentUpdate subclass) → Client Sync docsNameplate.java— replaced byNameplateUpdate(ComponentUpdate subclass) → Client Sync docsAssetEditorEnableAssetPackpacket (ID 318) — removed entirely → Packet Types docsStatusauth packet (ID 10) — removed entirely → Packet Types docsAssetEditorRebuildCaches— deregistered as a packet, converted to plain utility class → Packet Types docs
Removed Files — World Generation
Section titled “Removed Files — World Generation”SpherePositionProviderAsset/SpherePositionProvider— replaced byBoundPositionProviderAsset/BoundPositionProvider(axis-aligned bounds)BaseHeightContentFieldAsset— replaced byDecimalConstantsFrameworkAssetContentFieldAsset— replaced byFrameworkAssetBiomeType/SimpleBiomeType— renamed toBiome/SimpleBiomeBiomeMap/SimpleBiomeMap— replaced byWorldStructureIndexer— replaced byRegistry<T>AllStoneMaterialProvider/GrassTopMaterialProvider— replaced by data-driven MaterialProviderAsset configurationCeilingPattern— replaced bySurfacePatternwithFacing.DparameterBaseHeightReference/Reference— ReferenceBundle now storesObjectvalues directly
Removed Files — Server
Section titled “Removed Files — Server”gameplay/SleepConfig.java— moved togameplay/sleep/SleepConfig.javawith expanded fieldsPortalSpawn.java— functionality merged elsewhereMarkerBlockState.java— replaced by UserMapMarker systemPerWorldDataMarkerProvider— split intoPersonalMarkersProviderandSharedMarkersProviderPlayerIconMarkerProvider— replaced byOtherPlayersMarkerProvider
Performance and Internal Improvements
Section titled “Performance and Internal Improvements”Density Node Allocation Reduction
Section titled “Density Node Allocation Reduction”All density nodes in the world generator received an optimization pass. Instead of allocating new Vector3d and Density.Context objects per process() call, they now pre-allocate these as private final fields with r prefix (e.g., rChildPosition, rChildContext) and reuse them via .assign() methods. This significantly reduces GC pressure during world generation.
ReusableList
Section titled “ReusableList”New ReusableList class replaces new ArrayList<>() allocations in hot-path density nodes (PositionsPinchDensity, PositionsTwistDensity, PositionsHorizontalPinchDensity).
YSampledDensity
Section titled “YSampledDensity”New density node that samples input density at configurable Y intervals and interpolates between samples, reducing redundant density calculations.
VectorProvider Output-Parameter Pattern
Section titled “VectorProvider Output-Parameter Pattern”VectorProvider.process() changed from returning a new Vector3d to writing into a pre-allocated output vector, reducing allocations across all vector provider implementations.
CODEC Field Immutability
Section titled “CODEC Field Immutability”Many BuilderCodec fields changed from public static to public static final, adding immutability guarantees.
Null Safety
Section titled “Null Safety”Hundreds of methods across the codebase received @Nonnull annotations, improving null-safety contracts and IDE support.
Static Method Conversions
Section titled “Static Method Conversions”Many instance methods that did not use instance state were changed to static (e.g., in CreativeHubPlugin, CraftingPlugin, DeployablesPlugin).
Path Traversal Security
Section titled “Path Traversal Security”PathUtil gained trusted root validation, safe path resolution, and filename validation. All file access paths in PrefabStore, ServerFileBrowser, DiskDataStore, DiskPlayerStorageProvider, DiskResourceStorageProvider, and JsonLoader now validate paths against trusted roots. → Registries docs
Atomic File Writes
Section titled “Atomic File Writes”BsonUtil and other file writers now use FileUtil.writeStringAtomic() (write to temp, then rename) for crash-safe persistence.
Command Internationalization
Section titled “Command Internationalization”Multiple command files migrated from hardcoded English strings to translation keys using Message.translation().
Debug Visualization
Section titled “Debug Visualization”NPC sensor visualization with disc and sector debug shapes. Flock member debug connections. Leash position and target arrow rendering for roles.
Build Metadata
Section titled “Build Metadata”- Implementation version:
2026.01.24-6e2d4fc36to2026.02.17-255364b8e - New dependencies: JOML 1.10.8 (math library), RocksDB 10.4.2 (embedded key-value store) → Setup docs