GlymeraFloatingIslands

Floating sky-islands worlds for Hytale. 6 biome presets with native Hytale vegetation, structures and mobs. Configurable island size and density.

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 at AddWorldEvent, 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: applyIslandBiome was being invoked twice (once from the AddWorldEvent listener, once from the createAndLoadWorld.thenAccept callback). The second chunkStore.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. ensurePatched is called from four entry points - AddWorldEvent, the scheduler, createAndLoadWorld.thenAccept, and new in v5 the ChunkPreLoadProcessEvent - 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 ChunkPreLoadProcessEvent handler calls ensurePatched before 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 with grep 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. The setGenerator() call is isolated inside ensurePatched and happens exactly once per world lifetime.
  • New Set<Integer> patchedGeneratorHashes holds the identity hashes of all generator instances that have already been patched.
  • switching AtomicBoolean 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, ensurePatched notices 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 ChunkPreLoadProcessEvent handler cleared blocks outside heightMin..heightMax on 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, waterContainer are replaced per biome via reflection
  • coverContainer (grass/flowers/trees), environmentContainer (NPCs/animals) and prefabContainer (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 biomes command for preset overview
  • Cave deactivation: Zone.caveGenerator.caveTypes is emptied so stalactites don't dangle in the empty air under islands
  • Native prefab Y-range bounding via BoundedHeightCondition (wraps the heightCondition of each PrefabPatternGenerator)

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, heightMax configurable)
  • Persistent worlds via JSON config at plugins/GlymeraFloatingIslands/config.json
  • /fi create|tp|back|list|delete|biomes|reload commands
  • No asset pack, JAR under 30 KB