Update 3 to Update 4 Changelog
This page covers all notable changes between Update 3 and Update 4. Changes are organized by category, from the most impactful breaking changes to internal improvements.
New Features and Systems
Section titled “New Features and Systems”Voice Chat System
Section titled “Voice Chat System”A proximity-based voice chat module enables spatial voice communication between players. → Networking Overview · Packet Types
VoiceModule(com.hypixel.hytale.server.core.modules.voice.VoiceModule): full JavaPlugin managing voice state, player muting, and voice routing with 4 dedicated executor threadsVoiceRouter: spatial routing that determines which listeners receive voice data based on distance (default 32 blocks) and world isolation, with speaker position quantized to 0.5 block resolution (max 12 speakers per listener)VoiceStreamHandler: Netty handler for dedicated voice QUIC streams with token bucket rate limitingVoiceModuleConfig: persisted config withvoiceEnabled,maxHearingDistance,fullVolumeDistance,deadPlayersCanHear,mutedPlayersVoicePlayerState: per-player state tracking with consecutive error counting/voicecommand with subcommands:enabled,maxdistance,fullvolumedistance,mute,unmute,muted,status- New
NetworkChannel.Voice(3)for dedicated voice QUIC channel - New
SoundCategory.Voice(4)enum value - New packets:
VoiceData(ID 450, ToServer, channel: Voice) — Opus-encoded audio from clientRelayedVoiceData(ID 451, ToClient, channel: Voice) — relayed audio with spatial info (speaker position, underwater state)VoiceConfig(ID 452, ToClient) — server sends codec config, sample rate, hearing distance
Stream IO System
Section titled “Stream IO System”A new auxiliary QUIC stream management system supports multiple stream types beyond the main game connection. → Networking Overview
StreamManager(com.hypixel.hytale.server.core.io.stream.StreamManager): singleton registry for auxiliary stream handlers with priority supportPendingStreamHandler: validates first packet isStreamOpen, checks rate limits and max auxiliary streams (4)- New packets:
StreamOpen(ID 460, ToServer) — client requests a stream of a givenStreamTypeStreamOpenResponse(ID 461, ToClient) — server accepts or rejects with reason
StreamTypeenum:Game(0),Voice(1)
Emote System
Section titled “Emote System”Players can play character emotes with server-side asset management. → Packet Types
EmoteAsset(com.hypixel.hytale.server.core.cosmetics.EmoteAsset): asset with CODEC, network serialization toProtocolEmote, and indexed lookupEmoteAssetPacketGenerator: generatesUpdateEmotespackets for init/update/remove- New
CosmeticType.EMOTES_INGAMEenum value - New packets:
PlayEmote(ID 167, ToServer) — client requests emote by IDUpdateEmotes(ID 86, ToClient, compressed) — server sends emote definitions
- New struct
ProtocolEmote:id,name,animation,icon,isLooping
Inventory Component System
Section titled “Inventory Component System”The monolithic Inventory class has been refactored into an ECS component-based architecture. → ECS Overview · Inventory docs
InventoryComponent(com.hypixel.hytale.server.core.inventory.InventoryComponent): abstract base class with inner static subclasses for each section:Hotbar,Storage,Armor,Utility,Backpack,Tool,Combined- Section ID constants:
HOTBAR_SECTION_ID,STORAGE_SECTION_ID,ARMOR_SECTION_ID,UTILITY_SECTION_ID,BACKPACK_SECTION_ID,TOOL_SECTION_ID - Combined container orderings:
HOTBAR_FIRST,HOTBAR_STORAGE_BACKPACK,STORAGE_FIRST,EVERYTHING - Static helpers:
getCombined()buildsCombinedItemContainerfrom multiple component types,getItemInHand()checks Tool then Hotbar InventoryChangeEventreplacesLivingEntityInventoryChangeEventInventorySystems: per-section change event systems (ArmorChangeEventSystem,BackpackChangeEventSystem, etc.) plus legacy stat change systemsFetchedItemContainer: lazy-loading wrapper for component-based containers
BlockState to Component Migration
Section titled “BlockState to Component Migration”The BlockState system has been completely removed and replaced by Component<ChunkStore> components registered in BlockModule. → Block Types · ECS Overview
ItemContainerBlockreplacesItemContainerBlockState/ItemContainerStatePrefabSpawnerBlockreplacesPrefabSpawnerStateBenchBlockreplacesBenchStateProcessingBenchBlockreplacesProcessingBenchStateTreasureChestBlockreplacesTreasureChestStateSpawnMarkerBlockreplacesSpawnMarkerBlockStateBlockEntityutility: staticsetBlockEntity()for block entity creation on chunksBlockReplaceEvent: dispatched when a block entity is being replacedItemContainerBlockSpatialSystem: KDTree-based spatial tracking for item container blocksItemContainerSystems: lifecycle systems for item container blocks (drop on remove, transfer on replace)BenchSystems: lifecycle and tick systems for bench block components (OnAddOrRemoved,ProcessingBenchLifecycle,ProcessingBenchTick)
WorldGen Modifier System
Section titled “WorldGen Modifier System”A new data-driven modding API allows mods to modify world generation configurations without replacing entire files. → World Generation Overview
WorldGenModifier(com.hypixel.hytale.builtin.worldgen.modifier.WorldGenModifier): data-driven asset withCODEC, priority (EventPriority), target, and operationsEventHandler: scoped thread-local handler dispatching matching modifiers by targetTarget: target configuration with root name and glob pattern rulesEventTypeenum:Biome_Covers,Biome_Environments,Biome_Fluids,Biome_Dynamic_Layers,Biome_Static_Layers,Biome_Prefabs,Biome_Tints,Cave_Types,Cave_Covers,Cave_Prefabs- Operations:
AddOp(adds content to target list) andRemoveOp(removes entries matching glob rules, supports"*"to clear all) - Content system:
FileReffor referencing content files by dot-separated path
Condition System Expansion
Section titled “Condition System Expansion”Entity conditions have been relocated from modules/entitystats/asset/condition/ to modules/entity/condition/ and expanded with new types. → Entity Effects
CheckPlayerGameModeCondition: checks if entity is a player in a specific GameModeHasEffectCondition: checks if entity has an active EntityEffect by IDInFluidCondition: checks if entity’s bounding box intersects fluid blocks (by fluid IDs or tags)IsPlayerCondition: checks if entity has Player componentPlayerConditionremoved, replaced byIsPlayerConditionandCheckPlayerGameModeCondition- Conditions now use
ComponentAccessor<EntityStore>instead ofStore<EntityStore> EntityEffectgainedapplyConditionsfield — conditions that must all be true for an effect to remain active
Revolve Builder Tool Operation
Section titled “Revolve Builder Tool Operation”A new builder tool operation (RevolveOperation) radially copies block selections around a center point. → Builtin Plugins
- Three sampling modes:
Neighbor(fills gaps),Reverse(rotated block selection),Disabled - Configurable copy count, full revolve mode, center point, entity duplication
- Constants:
REVOLVE_COPY_LIMIT=1000000,MAX_ENTITIES=1000
Brush Rotation Operations
Section titled “Brush Rotation Operations”Two new scripted brush operations for rotating brush shapes.
RotateOperation: rotates brush shape by axis, angle, and origin (OffsetCenter, ClickCenter, Player)ClearRotationOperation: resets brush rotation to identityBrushConfiggainedtransformandtransformOriginfields withsetTransform(),resetTransform(),getExecutionOrigin()
Prefab Editor Improvements
Section titled “Prefab Editor Improvements”PrefabEditBackCommand: new/editprefab backsubcommand for returning to the previous worldPrefabEditorLoadOptionsPage: UI page when a player has an existing edit session but is outside the edit world (options: load existing, cancel, create new)AssetPackSaveBrowser: new UI browser for selecting/creating target asset packs when saving prefabs- Save commands now support
--packargument for specifying target asset pack - Clipboard now includes entity data via
ClipboardEntityChangestruct
New Packets
Section titled “New Packets”PlaySoundEventLocalPlayer(ID 362, ToClient) — plays a sound event for the local player onlyAssetEditorModsDirectories(ID 356, ToClient) — sends available mod directories to asset editorPrefabSetAnchor(ID 426, ToServer) — sets prefab anchor position (replacesPrefabSetAnchorInteraction)BuilderToolResetClipboardRotation(ID 427, ToServer) — resets clipboard rotation
Crafting Enhancements
Section titled “Crafting Enhancements”CraftRecipeEvent.PreandCraftRecipeEvent.Postevents allow cancellation before and after recipe completion → Builtin PluginsBenchWindow.updateQueueSize()andCraftingManager.getRemainingQueueSize()for craft queue trackingProcessingBenchBlocknow supports batch completion and game-time-based catch-up processing on load
Other New Features
Section titled “Other New Features”SchemaGeneratorreplaces event-based schema generation (GenerateSchemaEventremoved) withregisterConfig(),registerAssetSchema(),generate()methodsCommandInteraction: interaction type that executes a server command as the owning playerBackupChunkLoader: loads chunks from backup ZIP files with fallback chain for world recoveryUpdateSetupCommand:/update setupcommand extracts launcher scripts from JAR resourcesDisabledFluidResource: resource component caching disabled fluid IDs from world config, with tag-based resolutionObjectiveInventoryChangeSystem: ECS event system replacing inlineLivingEntityInventoryChangeEventhandler for objectivesInventoryChangeAwareinterface for objective tasks that react to inventory changesWorldMapConfighierarchy:ServerWorldMapConfig(server-level) andWorldWorldMapConfig(per-world) for view radius configurationSwitchResponseCurve: binary response curve returninginitialStatebelow switch point,finalStateat/abovePortalSpawnConfig: configuration for portal spawn behavior (return portal, spawn provider override, return block override)PortalDevicegainedpendingWorldfield for async world loading state trackingConditionalBlockSound: pairs a SoundEvent with an AmbienceFX condition for ambient block soundsItemHudUI: defines HUD UI elements associated with items (path + type)EntityHolderEventType/EntityHolderEventSystem: new ECS event type dispatching events with bothHolderandStorecontextBiIntConsumer: functional interface accepting two int parametersRemovedPlayerFromWorldEvent: event withshouldBroadcastLeaveMessage()and settable leave messageCachedStatsComponent: simple component cachingcanBreatheboolean for entitiesPaletteSetProvider: thread-local provider for reusable hash sets in palette operationsBlockOperations: extracted utility methods forupdateBlockArea,updateBlockHeight,spawnBlockParticlesHttpResponseException: IOException subclass carrying HTTP status code and response body- Deterministic weather:
WeatherSystemnow usesFastRandomseeded from world seed + environmentweatherSeedKey+ date/time hash - Area-of-effect watering:
UseWateringCanInteractionsupportsRadiusXandRadiusZCODEC fields with player-facing-based iteration - Memory sounds:
MemoriesGameplayConfiggainedMemoriesRestoreSoundEventIdandMemoriesCatchSoundEventIdfields
Breaking Changes
Section titled “Breaking Changes”Disconnect Packet Split
Section titled “Disconnect Packet Split”The bidirectional Disconnect packet (ID 1) was split into two unidirectional packets. → Networking Overview · Packet Types
Disconnect(Both, ID 1) removedClientDisconnect(ToServer, ID 1): reason changed fromStringtoClientDisconnectReasonenum (PlayerLeave,PlayerAbort,UserLeave,Crash), fixed 2 bytesServerDisconnect(ToClient, ID 2): reason changed fromStringtoFormattedMessage(rich text)PingID shifted from 2 to 3,Pongfrom 3 to 4QuicApplicationErrorCodeenum replacesAPPLICATION_*int constants inProtocolUtilProtocolUtil.closeApplicationConnection()now takesQuicApplicationErrorCodeinstead ofint
Math Types Removed (JOML Migration)
Section titled “Math Types Removed (JOML Migration)”Five custom math types removed from com.hypixel.hytale.math, replaced by JOML equivalents. → Math Overview
| Removed Type | JOML Replacement |
|---|---|
Mat4f | org.joml.Matrix4f / Matrix4fc |
Vec2f | org.joml.Vector2f / Vector2fc |
Vec3f | org.joml.Vector3f / Vector3fc |
Vec4f | org.joml.Vector4f / Vector4fc |
Quatf | org.joml.Quaternionf / Quaternionfc |
Serialization logic moved to PacketIO methods: readVector2f, readVector3f, readVector4f, readQuaternionf, readMatrix4f and corresponding write methods (all little-endian). JOML *fc read-only interfaces used for immutable parameters.
Note: com.hypixel.hytale.math.vector.Vector3d, Vector3f, Vector3i, Vector2i etc. are NOT removed.
WorldGen Package Restructuring
Section titled “WorldGen Package Restructuring”Massive package reorganization across the entire world generation system (580 files, 171 new, 135 removed). All import paths have changed. → World Generation Overview
Package renames:
newsystem/promoted toengine/withNprefix dropped on all classes (e.g.,NStagedChunkGenerator→StagedChunkGenerator,NStage→Stage,NViewport→Viewport)framework/dissolved — math classes relocated tomath/, all cartas and shaders removedseed/→rng/(SeedBoxrelocated,SeedGeneratorreplaced byRngField)threadindexer/→workerindexer/datastructures/voxelspace/→voxelspace/fields/→noise/andnoise/pointprovider/propassignments/→assignments/chunkgenerator/→engine/chunkgenerator/
API renames:
VoxelSpace.getContent()→get(),setContent()→set(),isInsideSpace()→getBounds().contains()Pattern.readSpace()→getBounds_voxelGrid(),noPattern()→ConstantPattern.INSTANCE_FALSE,yesPattern()→ConstantPattern.INSTANCE_TRUEScanner.scan()returnsvoidinstead ofList<Vector3i>, new pipe-basedscan(Vector3i, Pipe.One<Vector3i>)PositionProvider.positionsIn()→generate(),noPositionProvider()→EmptyPositionProvider.INSTANCEProp.scan()/place()two-phase removed, replaced by singlegenerate(Context)returningbooleanProp.noProp()→EmptyProp.INSTANCE,Scanner.noScanner()→EmptyScannerPropField→PropRuntime,PropsSource.getPropFields()→getPropRuntimes()SpaceSize→Bounds3ithroughoutBiome.getBiomeName()removed from interface
Prop System Overhaul
Section titled “Prop System Overhaul”The scan/place two-phase pattern for props has been replaced by a single-pass generate() method. → World Generation Overview
Prop.Contextfields changed:ScanResult scanResult→Vector3i position,VoxelSpace<Material> materialSpacesplit intomaterialReadSpace+materialWriteSpace,EntityContainer entityBuffer→EntityFunnel entityWriteBuffer,distanceFromBiomeEdge→distanceToBiomeEdgeScanner.Contextfields:WorkerIndexer.Id workerId→List<Vector3i> validPositions_outPositionProvider.Context:Vector3d minInclusive+maxExclusive→Bounds3d bounds,Consumer<Vector3d> consumer→Pipe.One<Vector3d> pipe- New pipe system (
pipe/Pipe.java,pipe/Control.java) replaces rawConsumer<T>with halt-capable iteration
Inventory Architecture Change
Section titled “Inventory Architecture Change”→ Inventory docs · ECS Overview
Inventoryclass stripped of all internal container fields andNetworkSerializableimplementation- All code using
EntityUtils.getEntity() instanceof LivingEntity+getInventory()must migrate toInventoryComponent.getCombined(accessor, ref, ordering) LivingEntityInventoryChangeEventremoved, replaced byInventoryChangeEvent(ECS event)NPCEntity.setInventorySize()removed — inventory creation handled byNPCSystems.OnNPCAdded
BlockState System Removal
Section titled “BlockState System Removal”The entire block state hierarchy has been removed:
BlockState,BlockStateModule,BlockStateRegistration,BlockStateRegistryBreakValidatedBlockState,DestroyableBlockState,ItemContainerBlockState,ItemContainerStatePlacedByBlockState,SendableBlockState,TickableBlockStateBlockModule.getComponent()no longer auto-creates block states — returnsnullif no component exists- All block state registrations (
BlockStateRegistry.registerBlockState()) replaced byChunkStoreRegistry.registerComponent()
PacketHandler Disconnect Signature
Section titled “PacketHandler Disconnect Signature”PacketHandler.disconnect(String) changed to disconnect(Message) and disconnect(FormattedMessage). Uses ServerDisconnect packet instead of Disconnect. → Networking Overview
Ref.validate() Return Type
Section titled “Ref.validate() Return Type”Ref.validate(Store) now returns int (the entity index) instead of void. All ref.validate(this); ref.getIndex() pairs consolidated to ref.validate(this). → ECS Overview
ComponentAccessor New Abstract Methods
Section titled “ComponentAccessor New Abstract Methods”ComponentAccessor gained two new abstract methods: invoke(Holder, Event) and invoke(EntityHolderEventType, Holder, Event). Any custom implementation must add these methods.
SpatialResource Return Type
Section titled “SpatialResource Return Type”SpatialResource.getThreadLocalReferenceList() return type changed from ObjectList<Ref<ECS_TYPE>> to List<Ref<ECS_TYPE>>. Uses ReferenceArrayList instead of ObjectArrayList.
DebugUtils API Change
Section titled “DebugUtils API Change”Debug shape methods changed from boolean fade to int flags parameter. → Builtin Plugins
DebugUtils.addArrow(),addDisc(),addLine()last parameter:boolean fade→int flags- Use
DebugUtils.FLAG_FADEconstant instead oftrue DisplayDebugpacket:boolean fade→byte flags(bitfield usingDebugFlagsenum:Fade(0),NoWireframe(1),NoSolid(2))
Builder Tool Data Restructuring
Section titled “Builder Tool Data Restructuring”BuilderToolDataandBrushDataclasses removedItem.builderToolDatatype changed fromBuilderToolDatatoBuilderTooldirectlyBuilderTool.argschanged fromMap<String, ToolArg>toToolArg[](array), deserialized intoLinkedHashMapbyarg.getId()ToolArggainedidfieldItemBase.builderToolDatatype changed fromItemBuilderToolDatatoBuilderToolStateBuilderToolState.argschanged fromMap<String, BuilderToolArg>toBuilderToolArg[]BuilderToolState.brushDatafield removedBuilderToolArgUpdate.groupfield removed (BuilderToolArgGroupenum removed)- Brush parameters now read from tool args with
builtin_prefix (e.g.,builtin_Width,builtin_Height,builtin_Shape)
MapImage Palette Compression
Section titled “MapImage Palette Compression”MapImage data format changed from direct pixel data to palette-indexed compression. → Packet Types
int[] datareplaced byint[] palette,byte bitsPerIndex,byte[] packedIndices
StateData Changes
Section titled “StateData Changes”StateData.idfield andgetId()method removedStateData(String id)constructor removedDEFAULT_CODEC_BUILDERrenamed toCODEC_BUILDER,DEFAULT_CODECrenamed toCODECCodecMapCodecwrapper removed — now just aBuilderCodec
HytaleServerConfig Changes
Section titled “HytaleServerConfig Changes”shouldSkipModValidation()removed fromConstantsandHytaleServerConfigskipModValidationForVersionfield removed- Added
ServerWorldMapConfig worldMapConfigfield - Added
HostAddress fallbackServerfield (also addsfallbackServerfield toServerInfopacket) Options.SINGLEPLAYER_NO_VALIDATIONremoved- New options:
VERIFY_WORLDS,RECOVERY_MODE,MODS_DIRECTORIES,GENERATE_ASSET_SCHEMA,GENERATE_CONFIG_SCHEMA,IGNORE_BROKEN_MODS
Other Breaking Changes
Section titled “Other Breaking Changes”ChatMessagemax string length reduced from 4096000 to 255 (max packet size 16384006 → 1026) → Packet TypesSyncInteractionChains.Updatesarray max length reduced from 4096000 to 128AmbienceFXSoundPlay3D: newLocationNameRandom(2)value inserted,Noshifted from 2 to 3 (ordinal break)FileContextgeneric bound tightened from<T>to<T extends FileContext<?>>FileContextLoaderconstructor now requiresString nameparameterStringUtil.parseArgs()removed (was@Deprecated(forRemoval = true))TransformingClassLoader:"com.hypixel.protoplus."removed from parent-delegated packagesShutdownReasonmessages changed fromStringtoMessagetypeCursedItems.deleteAll(Player)overload removed — usedeleteAll(ItemContainer)insteadStashPlugin.stash()signature changed to takeBlockModule.BlockStateInfoparameterReplaceCommandrestructured from flag-based to subcommand-based (/replace from-to,/replace swap,/replace regex)BlockSpawnerEntry: legacyStateBSON_DOCUMENT codec field removedRotationTuple.rotate()renamed torotatedVector()NPC ActionToggleStateEvaluator: fieldenable→on, config key"Enabled"→"On", getterisEnable()→isOn()WeightedActionconstructor now takes@Nonnull Actionparameter directlyBuilderWeightedAction.build()return type changed from@Nonnullto@NullableMotionController.canActFailReason()added to interface- Steering method renames:
hasYaw()→hasYawOrDirection(),getYaw()→getYawOrDirection(),hasPitch()→hasPitchOrDirection(),getPitch()→getPitchOrDirection() EntityFilterViewSector: 0 view cone now means “see everything” instead of “see nothing”SpawnEffectinterface methods now takeBuilderSupportparameterRoleUtils.setItemInHand()now requiresRef<EntityStore>andComponentAccessor<EntityStore>parametersPasteToolUtil.switchToPasteTool()now requiresRef<EntityStore>andComponentAccessor<EntityStore>parameters
Modified APIs
Section titled “Modified APIs”Protocol Changes
Section titled “Protocol Changes”- Protocol version: CRC
-1356075132→1080406952, build number20→51, packet count268→280(+12), struct count339→343(+4), enum count137→142(+5) AmbienceFXSound: newmaxBodiesPerEmitterint field (fixed size 27 → 31 bytes) → Packet TypesBlockType: new nullableConditionalBlockSound[] conditionalSoundsfield (variable field count 24 → 25, all subsequent nullable bit positions shifted)FormattedMessage: new nullableFormattedMessageImage imagefield (variable field count 7 → 8)ItemBase:builderToolDatatype changed fromItemBuilderToolDatatoBuilderToolState; newsubCategorystring field; newItemHudUI[] hudUIfield (fixed size 147 → 148, variable field count 26 → 28)ItemCategory: new nullableSubCategoryDefinition[] subCategoriesfieldMovementStates: newfallingFarboolean field betweenfallingandclimbing(fixed size 22 → 23 bytes, cascading toMovementStatesUpdate,MountMovement,ClientMovement)ClientPlaceBlock: newquickReplaceboolean field (fixed size 20 → 21)ProjectileConfig: newlaunchWorldSoundEventIndexfield (fixed size 163 → 167)SoundEvent: newspatialBlendfloat field (fixed size 34 → 38)BuilderToolArg: new nullableidstring field (variable field count 4 → 5)BuilderToolOnUseInteraction: newundoGroupSizeint field (fixed size 57 → 61)BuilderToolSelectionToolReplyWithClipboard: new nullableClipboardEntityChange[]fieldBuilderToolSelectionTransform:Quatf rotation→Quaternionfc rotation(JOML)EditorBlocksChange: newClipboardEntityChange[]andskipPreviewRebuildboolean fieldsAssetEditorCreateAssetPack: newtargetDirectoryIndexint field (fixed size 5 → 9)ServerInfo: new nullableHostAddress fallbackServerfieldUpdatePlayerInventory: removedbuilderMaterialandsortTypefields (fixed size 2 → 1, variable field count 7 → 6)SortItemsAction: removedsortTypefield (packet now 0 bytes)MapMarker: removedcustomNamefield (variable field count 6 → 5)MapChunk:MAX_SIZEincreased from 16384023 to 20480037
New Protocol Structs
Section titled “New Protocol Structs”ConditionalBlockSound:soundEventIndex+ambienceFXIndex(8 bytes)FormattedMessageImage:filePath+width+heightItemHudUI:path+type(ItemHudUITypeenum:Hud(0),Legend(1))SubCategoryDefinition:id+name+description+orderClipboardEntityChange: position, blockId, model, itemId, orientations, scale (45 bytes)
New Protocol Enums
Section titled “New Protocol Enums”ClientDisconnectReason:PlayerLeave(0),PlayerAbort(1),UserLeave(2),Crash(3)QuicApplicationErrorCode:NoError(0),RateLimited(1),AuthFailed(2),InvalidVersion(3),Timeout(4),ClientOutdated(5),ServerOutdated(6)VoiceCodec:Opus(0)StreamType:Game(0),Voice(1)DebugFlags:Fade(0),NoWireframe(1),NoSolid(2)RotationFace:Up(0),Down(1),North(2),South(3),East(4),West(5),Camera(6)ItemHudUIType:Hud(0),Legend(1)
World Generation Changes
Section titled “World Generation Changes”- New pipe system (
Pipe.One<Input>,Pipe.Two<InputA, InputB>) withControl(stoppable iteration) replaces rawConsumer<T> - New RNG system:
Rng(static utility withgetRandomInt,mix,splitMixLong) andRngField(position-seeded RNG) replaceSeedGenerator EntityFunnelinterface replaces directEntityContainerusage in prop context, withRotationEntityFunnelfor rotation-aware placementPropDistributionabstract class withdistribute(Context)and 5 implementations:AssignedPropDistribution,ConstantPropDistribution,NoPropDistribution,PositionsPropDistribution,UnionPropDistribution- New prop types:
CuboidProp,DensitySelectorProp,LocatorProp,ManualProp,MaskProp,OrienterProp,PondFillerProp,PrefabProp,StaticRotatorProp - New scanner types:
DirectScanner(replacesOriginScanner),EmptyScanner,LinearScanner,QueueScanner,RadialScanner,RandomScanner - New position providers:
ClustersPositionProvider,EmptyPositionProvider,Jitter2dPositionProvider,Jitter3dPositionProvider,ScalerPositionProvider,SquareGrid2dPositionProvider,SquareGrid3dPositionProvider,TriangularGrid2dPositionProvider - New patterns:
ConstantPattern(singletonsINSTANCE_TRUE/INSTANCE_FALSE),RotatorPattern VoxelSpace: newsetAll(T)andgetBounds()methods;MaskVoxelSpacereplacesBooleanVoxelSpace; newRotationVoxelSpaceBounds3i/Bounds3d: newZEROconstant,contains()overloads,offset()/offsetOpposite(), rotation methods (applyRotationAroundVoxel,undoRotationAroundVoxel), bug fix inencompass()for exclusive upper boundMaterialCache.getMaterialRotated(Material, RotationTuple)for rotation-aware material lookupYSampledDensity: newisInterpolatedparameter with “Interpolate” CODEC field (defaulttrue)ChunkGenerator: chunk bounds validation withMIN_CHUNK_COORD/MAX_CHUNK_COORD, returnsNO_CHUNKfor out-of-boundsCaveType.ENTRY_POOLstaticListPool<CaveType>for pooling cave type entry listsCaveFileContextfor loading cave configuration files within zone contexts- Many v3 prop/scanner classes relocated to
deprecated/sub-packages
Builtin Package Changes
Section titled “Builtin Package Changes”CraftingManager: multiple method signatures changed to accept explicit coords/blockType/BenchBlock instead ofBenchStateCraftingPlugin.isValidCraftingMaterialForBenchparam changed fromBenchStatetoBenchFarmingUtil.giveDropsgainedHarvestingDropTypeparameterPrefabFarmingStageData.setStatenow takes additionalblockTypeandrotationparameters; bug fix:prefabRotation.getX(blockZ, blockX)→prefabRotation.getZ(blockX, blockZ)CoopBlock: added NPC role change detection in resident managementTintOperation: complete rewrite with blend modes, opacity, Gaussian smoothing, color picker (alt+primary); tint arg key changed from"TintColor"to"bTintColor", new"cOpacity"argPastePrefabOperation: simplified to useedit.setMaterial()instead of direct chunk manipulationEditOperation: new methodssetTint()with lerp blending,getTint(),removeEntity(),trackSpawnedEntity(),trackMovedEntity()Material(builder tools): now stores full block data withsupport,filler,holderfields; newfull()factory methodsScriptedBrushAsset: newgetEditorToolItemId()andrebuildBrushToItemCache()static methodsPrototypePlayerBuilderToolSettings: newprototypeItemIdandundoGroupSizefieldsAssetEditorPlugin.handleCreateAssetPacknow takestargetDirectoryIndexparameter, validates againstgetModsDirectories()PrefabEditSessionManager: major rework withisInEditWorld(),sendToEditWorld(),closeEditSession()methodsInstanceMigrateCommand: usesRemoveReason.UNLOADfor chunk migration, adds block component migrationRotation: newapplyRotationTo()/undoRotationTo()methods for Vector3i/f/d; newtoInverse()methodRotationTuple: new rotation math with matrix multiplication,flip(),composeOnAxis(),eulerToMatrix()BlockFlipType: newORTHOGONAL_INVERSEenum value with rewrittenflipYaw()logicBlockBoundingBoxes: rotation direction fix (swappedrotate90Z/rotate270Zfor Ninety/TwoSeventy)BlockType: gathering/bench interaction hint auto-setup removed;getDefaultStateKey()returns null ifdatais nullBlockSoundSet: usesMapUtil.combineUnmodifiable()for merging inherited sound eventsEnvironment: newweatherSeedKeyfield for shared weather forecastsFireFluidTicker: fire tick now runs on world thread; newResultingStatesupportItem:BuilderToolDatareplaced byBuilderTooldirectly; newsubCategoryandhudUIfieldsItemCategory: newSubCategoryDefinitioninner class withsubCategoriesarrayGameplayConfig: newCombatConfigandItemPhysicsConfigfieldsCraftingRecipe: addedValidators.nonEmptyArray()for recipe ingredients
Server Infrastructure Changes
Section titled “Server Infrastructure Changes”PluginManager: supports multiple mods directories viaOptions.MODS_DIRECTORIES; improved pack loading orderingHytaleServer: schema generation viaSchemaGenerator; shutdown guards (isShuttingDown()) on scheduled tasks;--generate-asset-schema/--generate-config-schemaoptionsUniverse: world verification system with--verify-worldsand--recovery-modeoptions;recoverChunksFromBackups()methodAssetRegistryLoader.loadAssets()now returns boolean (failed status); usesassetPack.isImmutable()andIGNORE_BROKEN_MODSoptionAssetModule: outdated packs warning lists specific pack namesIChunkStorageProvider: newgetRecoveryLoader()andbeginRecovery()methodsCommonAssetValidator: addedICON_EMOTEandANIMATION_EMOTEvalidators
NPC System Changes
Section titled “NPC System Changes”FeatureOverrideenum (On,Off,Default) for NPC feature togglesNPCDescriptorsCommand:/npc descriptorsgenerates descriptor filesEntityFilterEntityEffect: entity filter checking for active entity effectsSelfHasEffectConditionandTargetHasEffectCondition: decision-maker conditions for entity effectsVisHelper: centralized debug visualization helpers for NPC steering/avoidanceBuilderActionBase: gainedenabledfield (actions can be disabled via config)Steering: newdirectionHintfield withhasDirectionHint(),getDirectionHint(),setDirectionHint()GroupSteeringAccumulator: newnormalizeDistancesmode with random jitter for overlapping entitiesMotionControllerBase.DOT_PRODUCT_EPSILONchanged from0.001to0.1Role: new separation modes (SeparationModeenum),normalizeDistances,alwaysApplySeparation,useOrientationHint,avoidanceFallCheckBuilderRole: many new config fields for separation tuning, feature overrides, death/spawn particle config type changes (double→DoubleHolder,String→AssetHolder)BodyMotion: new default methodsgetDesiredTargetDistance()andgetDesiredTargetEntity()SensorEntityPrioritiserAttitude: O(n) linear search replaced with O(1)attitudeToPrioritylookup
Component System Changes
Section titled “Component System Changes”ArchetypeChunk: component array indexing changed fromcomponentType.getIndex()to archetype iteration indexHolder.addComponentInternal(): new method returning boolean instead of throwing on duplicateComponentType.validateRegistry()andequals()now use identity comparisonVector3d: newassign(Vector3i)method → Math OverviewChunkUtil: newMIN_CHUNK_COORD,MAX_CHUNK_COORD,isValidChunkIndex(),isValidChunkCoords()methodsBox.forEachBlockPosition: overflow protection for positions nearInteger.MAX_VALUESemver.validateBuild(): relaxed to allow dot-separated build identifiers
Collection Type Migration (Cross-cutting)
Section titled “Collection Type Migration (Cross-cutting)”Systematic migration across NPC, spawning, flock, and builtin systems:
| Old Type | New Type | Reason |
|---|---|---|
ObjectArrayList<Ref<>> | ReferenceArrayList<Ref<>> | Identity-based comparison |
ObjectList<Ref<>> | List<Ref<>> | Decouple from fastutil |
HashSet<Ref<>> | ReferenceOpenHashSet<Ref<>> | Identity-based hashing |
HashMap<Ref<>, V> | Reference2ObjectOpenHashMap<Ref<>, V> | Identity-based hashing |
Removed Features
Section titled “Removed Features”Removed Files — Protocol
Section titled “Removed Files — Protocol”Disconnect.java— replaced byClientDisconnectandServerDisconnectSortType.javaenum — sorting removed fromSortItemsActionandUpdatePlayerInventoryItemBuilderToolData.javastruct — replaced byBuilderToolStateused directly inItemBaseBuilderToolArgGroup.javaenum —groupfield removed fromBuilderToolArgUpdateBuilderToolBrushData.javastruct — brush data moved into general args array
Removed Files — BlockState System
Section titled “Removed Files — BlockState System”BlockState.java,BlockStateModule.java,BlockStateRegistration.java,BlockStateRegistry.javaBreakValidatedBlockState.java,DestroyableBlockState.javaItemContainerBlockState.java,ItemContainerState.javaPlacedByBlockState.java,SendableBlockState.java,TickableBlockState.javaItemContainerStateSpatialSystem.java— replaced byItemContainerBlockSpatialSystem
Removed Files — Inventory
Section titled “Removed Files — Inventory”LivingEntityInventoryChangeEvent.java— replaced byInventoryChangeEvent
Removed Files — Crafting
Section titled “Removed Files — Crafting”BenchState.java— replaced byBenchBlockcomponentProcessingBenchState.java— replaced byProcessingBenchBlockcomponent +BenchSystemsTreasureChestState.java— replaced byTreasureChestBlockcomponent
Removed Files — Server Core
Section titled “Removed Files — Server Core”GenerateSchemaEvent.java— replaced bySchemaGeneratorclassDestroyConditionInteraction.java— removed interaction typePrefabSpawnerState.java— replaced byPrefabSpawnerBlockBrushData.java,BuilderToolData.java— replaced by inline args inBuilderToolGitCommand.java,UpdateAssetsCommand.java,UpdatePrefabsCommand.java— git-based asset commands removed entirely
Removed Files — Math
Section titled “Removed Files — Math”Mat4f.java,Vec2f.java,Vec3f.java,Vec4f.java,Quatf.java— replaced by JOML types
Removed Files — Builtin
Section titled “Removed Files — Builtin”PrefabSetAnchorInteraction.java— replaced byPrefabSetAnchorpacket (ID 426) handled inBuilderToolsPacketHandlerOctTree.java— spatial data structure removedSpawnMarkerBlockState.java— replaced bySpawnMarkerBlockcomponent
Removed Files — Condition System
Section titled “Removed Files — Condition System”PlayerCondition.java— replaced byIsPlayerConditionandCheckPlayerGameModeCondition- All 14 condition classes relocated from
modules/entitystats/asset/condition/tomodules/entity/condition/
Removed Files — World Generation
Section titled “Removed Files — World Generation”framework/package (26 files): all math, cartas, interfaces, and shaders removed or relocatednewsystem/package (30 files): all promoted toengine/withNprefix droppeddatastructures/package:BiCoordinateCache(4 classes),CollectionFactory,TieredList,Compressor,BooleanVoxelSpace,VoxelConsumer,VoxelCoordinateremovedfields/package (8 files): all relocated tonoise/SeedGenerator.java— replaced byRngFieldSpaceSize.java— replaced byBounds3iContextDependency.java— context dependency system removedBackwardIntIterator.java,ForwardIntIterator.java,IntIterators.java— removedGapPattern.java+GapPatternAsset.java— replaced byRotatorPatternNoPropAsset.java— replaced byEmptyPropAssetOriginScanner.java+OriginScannerAsset.java— replaced byDirectScanner/DirectScannerAssetPropField.java— replaced byPropRuntime- Many prop/scanner classes moved to
deprecated/sub-packages
Performance and Internal Improvements
Section titled “Performance and Internal Improvements”WorldGen Allocation Reduction
Section titled “WorldGen Allocation Reduction”All density nodes, position providers, props, and scanners received optimization passes. Pre-allocated r-prefixed fields (e.g., rChildPosition, rChildContext, rControl) replace per-call allocations. Bounds3d/Bounds3i with .assign() methods replace new Vector3d allocations. The pipe system’s Control.stop field replaces collection size checks for early termination.
Palette Set Reuse
Section titled “Palette Set Reuse”PaletteSetProvider provides thread-local ByteOpenHashSet and ShortOpenHashSet instances, reducing allocation pressure in AbstractByteSectionPalette and AbstractShortSectionPalette.
ListPool for WorldGen
Section titled “ListPool for WorldGen”ListPool provides thread-safe object pooling for ObjectArrayList instances in worldgen hot paths (used by CaveType.ENTRY_POOL).
Identity-Based Collections
Section titled “Identity-Based Collections”Systematic migration from standard collections to identity-based fastutil collections for Ref<> types across NPC, spawning, flock, and builtin systems. This eliminates the overhead of equals()/hashCode() calls on entity references that use identity comparison.
BucketItemPool Array Optimization
Section titled “BucketItemPool Array Optimization”BucketItemPool replaced List<BucketItem<E>> pool with raw BucketItem<E>[] array with manual size tracking and System.arraycopy growth.
ArchetypeChunk Index Optimization
Section titled “ArchetypeChunk Index Optimization”Component array indexing changed from componentType.getIndex() to archetype-local iteration index, reducing indirection.
SensorEntityPrioritiser O(1) Lookup
Section titled “SensorEntityPrioritiser O(1) Lookup”SensorEntityPrioritiserAttitude replaced O(n) linear search through attitudeByPriority array with O(1) attitudeToPriority lookup array.
EventBus Shutdown Safety
Section titled “EventBus Shutdown Safety”EventBus.dispatchFor() now checks registry.isAlive() before dispatching, returning NO_OP if registry is dead.
IndexedStorageFile mmap Fallback
Section titled “IndexedStorageFile mmap Fallback”IndexedStorageFile now handles platforms without memory-mapped I/O by catching UnsupportedOperationException from fileChannel.map() and falling back to fileChannel.read/write.
Block Tick Batch Processing
Section titled “Block Tick Batch Processing”BlockTickPlugin preprocessing refactored to batch-collect ticking block type IDs via section.forEachValue() then batch-find and batch-set ticking via section.find() and section.setTicking(IntList, boolean).
ProcessingBench Batch Completion
Section titled “ProcessingBench Batch Completion”ProcessingBenchBlock now uses binary search for maximum completions that fit output capacity, with game-time-based catch-up processing on load (max 86400 seconds of elapsed time).
Command Internationalization
Section titled “Command Internationalization”Additional commands and disconnect messages migrated from hardcoded English strings to Message.translation() keys across AssetEditorPlugin, AuthenticationPacketHandler, HandshakeHandler, SetupPacketHandler, HytaleServer shutdown, CraftingWindow, and HubPortalInteraction.
Null Safety and Validation
Section titled “Null Safety and Validation”CraftingRecipe: addedValidators.nonEmptyArray()for recipe ingredients- Spawn count/reference mismatch detection with warning logs in
SpawnReferenceSystems - Null check for
spawnEntity()return values inFlockPluginandNPCAllCommand Box.forEachBlockPositionoverflow protection nearInteger.MAX_VALUEChunkUtilcoordinate validation methods
Path Visualization
Section titled “Path Visualization”NPC path visualization added to RoleSystems (waypoint spheres, connecting lines, NPC-to-path lines) with new debug flags: VisSeparationSummed, VisSeparationTargets, VisOrientation, VisSteeringPre, VisSteeringPost, VisTranslation, VisPath.
Build Metadata
Section titled “Build Metadata”- Implementation version:
2026.02.17-255364b8e→2026.03.20-db226053c - Branch changed from
releasetopre-release - Bundled JWKS updated (key ID:
2025-10-01) - New launcher scripts:
start.shandstart.batwith staged update support,jvm.optionsfile, and auto-restart on exit code 8