File Details
GlymeraFloatingIslands-5.0.0.jar
- R
- Apr 17, 2026
- 32.56 KB
- 61
- Early Access
File Name
GlymeraFloatingIslands-5.0.0.jar
Supported Versions
- Early Access
GlymeraFloatingIslands - Changelog
v5.0.0 (2026-04-17)
Bug Fixes
- Restart bug fixed: After a server restart, newly-to-be-generated chunks stopped being rendered as islands. Chunks that were already generated (saved on disk) stayed fine, but walking into unexplored territory produced flat normal terrain instead of floating islands. Root cause:
worldConfig.getWorldGenProvider().getGenerator()is a factory and returns a brand new ChunkGenerator instance on every call. The v4 approach ("fetch the generator once atAddWorldEvent, patch it via reflection, put it back") therefore modified short-lived objects that Hytale immediately discarded. - Teleport crash fixed: Teleporting into a freshly-created island world could occasionally fail with
RejectedExecutionException[ChunkThreadPoolExecutor Terminated]and disconnect the player. Root cause:applyIslandBiomewas being invoked twice (once from theAddWorldEventlistener, once from thecreateAndLoadWorld.thenAcceptcallback). The secondchunkStore.setGenerator()call shut down the ThreadPool of the previous generator while it was still generating chunks.
Changes
- Idempotent on-demand generator patching: New method
ensurePatched(world, def)replaces the old "patch once" flow.ensurePatchedis called from four entry points -AddWorldEvent, the scheduler,createAndLoadWorld.thenAccept, and new in v5 theChunkPreLoadProcessEvent- and decides for itself whether patching is required:- Reads the generator currently in use by the ChunkStore (the one actually generating chunks)
- Skips in O(1) via
System.identityHashCode()lookup if the generator has already been patched - Otherwise patches in place via reflection (no
setGenerator(), no ThreadPool gets killed) chunkStore.setGenerator()is now only called when the ChunkStore has no generator yet (fresh world)
- Integration in the chunk post-processor: The
ChunkPreLoadProcessEventhandler callsensurePatchedbefore its block-clear pass. If Hytale swaps in a fresh generator between the AddWorldEvent patch and actual chunk generation (the v4 failure mode), this new generator is intercepted and patched here, before a single chunk is generated incorrectly. - Diagnostic logging: All plugin log lines are prefixed
[FI-v5]and can be filtered from server logs withgrep FI-v5. Exceptions are now logged with full stack trace instead of being swallowed.
Technical Details
patchGenerator(worldGen, def, worldName)now does only the pure reflection work, without touching the ChunkStore. ThesetGenerator()call is isolated insideensurePatchedand happens exactly once per world lifetime.- New
Set<Integer> patchedGeneratorHashesholds the identity hashes of all generator instances that have already been patched. switchingAtomicBoolean is still used to serialize concurrent reflection runs (several chunk events firing at once).
No Functional Changes
- All commands (
/fi create|tp|back|list|delete|biomes|reload) behave identically. - Config format is unchanged. v4 config files load without migration.
- Preset list (
native,grasslands,desert,snow,volcanic,crystal) is unchanged. - Island shape (3D Simplex noise, density / vertical taper, spawn platform at origin) is identical to v4.
Compatibility
- Existing v4 worlds: work without any further action. On first world-load after the plugin upgrade,
ensurePatchednotices the generator is not yet patched and patches it. - Running server: the plugin can be swapped in-place by just replacing the JAR in the
mods/folder and restarting the server. No world regeneration required.
v4.0.0 (2026-04-16)
Bug Fixes
- Player-edit loss fixed: In v3.0.0 the
ChunkPreLoadProcessEventhandler cleared blocks outsideheightMin..heightMaxon every chunk load - including chunks loaded from disk. As a result any player-built structure placed outside the island Y-range disappeared on the next chunk reload (server restart, player leaving and re-entering the world, etc.). Fix:if (!event.isNewlyGenerated()) return;at the top of the handler. The clear logic now only runs on freshly generated chunks.
No Functional Changes
- All other behaviour identical to v3.0.0.
v3.0.0 (2026-04-16)
- Switched to a custom
IHeightThresholdInterpreter(Island3DInterpreter) with direct 3D Simplex noise evaluation - No more carving or post-fill logic - Hytale now generates the islands natively through the biome pipeline
heightmapInterpreter,heightmapNoise,layerContainer,waterContainerare replaced per biome via reflectioncoverContainer(grass/flowers/trees),environmentContainer(NPCs/animals) andprefabContainer(structures) are preserved natively - islands get correct vegetation and structures out of the box- Spawn-platform guarantee: 5x5x3 solid blocks at world origin so Hytale's UniquePrefab placement (Spawn, Temple) does not fail
/fi biomescommand for preset overview- Cave deactivation:
Zone.caveGenerator.caveTypesis emptied so stalactites don't dangle in the empty air under islands - Native prefab Y-range bounding via
BoundedHeightCondition(wraps theheightConditionof eachPrefabPatternGenerator)
v2.0.0 (2026-04-15)
- Removed the custom zone system, switched to per-biome reflection
- Asymmetric vertical taper (fades more aggressively at the bottom so no rock debris dangles)
- Fast path:
getContext()stores 3 Y-samples per column; if all below cutoff, column is treated as empty and the 3D-noise loop is skipped - Per-world offset seed (
worldName.hashCode()), so different worlds with identical parameters look different
v1.0.0 (2026-04-15)
- Initial release: floating-island worlds via
/fi create <name> <biome> - 6 biome presets:
native,grasslands,desert,snow,volcanic,crystal - 3D-Simplex-noise based island shape (
islandSize,density,heightMin,heightMaxconfigurable) - Persistent worlds via JSON config at
plugins/GlymeraFloatingIslands/config.json /fi create|tp|back|list|delete|biomes|reloadcommands- No asset pack, JAR under 30 KB