Commit Graph
4460 Commits
Author SHA1 Message Date
piexel ad88b00c2a Add a palette explorer for previewing biome palette layers
/iris studio palette (alias pal) opens the explorer on the biome you stand
in, listing each biome's palette layers instead of noise styles. The map
shows the blocks the layer places, the raw noise, or both, and a side panel
shows which noise values the layer produces, which value range each block
owns, and how its real share of the ground compares to its weight.

World generation and the preview now sample layers through the same
IrisBiome methods, so the preview matches what the world places.

Model used: Claude Opus 5.5
2026-10-18 20:12:00 +02:00
piexel 6f930d1370 Apply axialFracturing to a style's built-in fractures
axialFracturing on a style only changed how that style fractures its
parent, so setting it on a style like IRIS changed nothing. It now also
makes the style's own built-in fractures axial. A fracture the pack
adds keeps its own axialFracturing setting.

Model used: Claude Opus 5.5
2026-10-18 14:38:20 +02:00
piexel 855ab90be4 Stop fractured noise from drawing straight diagonal lines
Default fracturing pushed every sample by one value along the (1, -1)
diagonal, so heavily fractured styles such as FRACTAL_SMOKE and the
IRIS family formed straight 45 degree edges. It still takes a single
fracture sample, but the push direction now turns with that sample's
value. That costs a few multiplications per fracture level: 0% on
FRACTAL_SMOKE and FRACTAL_WATER, 4% on IRIS_DOUBLE.

axialFracturing read its second offset from the same noise with
swapped coordinates, which mirrors the warp across x = z. Each axis
now samples a far, uncorrelated part of the fracture noise instead.

Both change terrain for fractured styles, so existing worlds will show
seams at the border to newly generated chunks.

Model used: Claude Opus 5.5
2026-10-18 14:35:31 +02:00
piexel 8783fa09a5 Generate schemas for snippets nested in lists and maps
Snippet discovery only followed a field's raw type, so element types of
KList, KMap and arrays were never visited. Snippets that only appear in
collections, such as decorator, deposit and tree, got no schema and no
workspace mapping.

Model used: Claude Opus 5.5
2026-10-18 13:23:08 +02:00
piexel 87dc78934f Port the v4 noise explorer and Vision map, and fix blank windows on Wayland
Brings over v4's Noise Explorer and Vision viewers: a tiled, cancellable
renderer, viewport math, palettes, player and entity markers, and
click-to-teleport.

On Wayland desktops whose Xwayland window manager does not reparent
windows (niri, sway, Hyprland), Java's X11 toolkit waits for a reparent
that never comes, so it keeps its guessed window size and insets and
leaves most of the window white. Iris now sets
_JAVA_AWT_WM_NONREPARENTING natively before opening its first window
when the desktop needs it. GNOME and KDE are left alone because Java
already recognises their window managers.

All Iris windows, including the pregen view, now come from GuiHost, and
the studio commands report a headless server instead of failing.

Model used: Claude Opus 5.5
2026-10-15 14:42:28 +02:00
piexel d35fe93f7f Compile against Adventure 5.2.0, the version Paper 26.3 ships
Paper still provides Adventure at runtime. Every Adventure method Iris calls has the same signature in 4.17 and 5.2.0, so older servers keep working.

Model used: Claude Opus 5.5
2026-10-15 14:24:20 +02:00
piexel d6d6fd031c Size pregen backpressure from measured plates and post-GC heap
The heap gate and the engine service's keep-alive scaling read heap usage
right after the last collection instead of the moment's usage, which G1
lets climb near the maximum on a healthy heap. The plate budget now comes
from a measured 38 MB per plate on a 1088 block world instead of an
estimate that assumed 136 MB there, and is enforced as is rather than at
twice its value. Pregen evicts only the least recently used plates down to
the budget instead of every idle one, so it no longer reloads the plates
it is still generating around.

Model used: Claude Opus 5.5
2026-10-15 13:45:47 +02:00
piexel 7f34bb917f Hold pregen back when the mantle or the heap is full
Ported from Iris v4's mantle backpressure. Before each chunk the
pregenerator now:
- evicts idle tectonic plates and waits while more plates are loaded
  than the heap-scaled budget allows (pregen.maxResidentTectonicPlates)
- pauses between 92% and 82% heap, requesting a GC because a paused
  pregen allocates too little for the collector to run on its own; if
  the heap stays full, the JVM's diagnostic GC runs at most once a
  minute, which also works with -XX:+DisableExplicitGC
Both waits give up after pregen.mantleBackpressureTimeoutMs so a stuck
heap cannot hang the pregen. Unlike v4, a reclaim starts anywhere above
82% instead of only at 92%, since a pregen waiting at 89% otherwise
never triggers one.

Outside pregen, the engine service shortens the mantle keep-alive as
the heap fills and trims studio worlds once the heap is critical.

The mantle itself:
- concurrent requests for a plate that is still loading share one load
  instead of each holding an IO thread
- plate retries stop once the mantle is closed or the thread is
  interrupted, instead of recursing forever
- trim(0, 0) evicts plates idle for 500 ms instead of 4 s

Model used: Claude Opus 5.5
2026-10-15 00:26:33 +02:00
piexel 18e0834db8 Stop a failed pregen instead of leaving it running
An exception on the pregen thread ended the thread without shutting the
job down, so it kept reporting 0 chunks per second forever and blocked
starting another pregen. A failure is now logged and the job is closed.

Model used: Claude Opus 5.5
2026-10-15 00:26:26 +02:00
piexel 6a85cb53a9 Create mantle chunk flag locks only when a flag needs one
Every mantle chunk allocated a coroutine mutex for all 256 possible flag
ordinals up front, about 66 KB of locks per chunk, although only a few
flags are ever raised under a lock. During a pregen those locks took
well over a gigabyte of heap and ran 3 GB servers out of memory. Each
lock is now created when its flag is first raised.

Model used: Claude Opus 5.5
2026-10-15 00:26:21 +02:00
piexel 8a0fd9b9fc Support Minecraft 26.3
26.3 changed the chunk generator, biome source and structure placement
APIs, so it gets its own v26_3_R1 binding, compiled against the 26.3
dev bundle. v26_1_R1 keeps covering 26.1.2 and 26.2.

Binding changes against v26_1_R1:
- noise, surface and carvers run through a single buildTerrain stage
- the biome source hands out itself as the BiomeResolver
- structures are generated with a climate sampler, and starts are
  looked up per chunk instead of per section
- structure set salt and frequency come from the spreading placement
- biome colors are read from Vector3f attributes

Data pack format 121 with DataFixerV2603:
- biome mob spawns and creature spawn probability move into the
  natural_mob_spawns and creature_world_gen_spawn_probability attributes
  (26.3 silently ignores the old fields)
- the bed rule's "explodes" becomes "destroy_on_use", and straw beds get
  the same rule, matching vanilla

Model used: Claude Opus 5.5
2026-10-12 17:35:33 +02:00
piexel 2fc4c2faf9 Skip other versions' NMS bindings when preloading classes on disable
Older servers such as Paper 1.20.1 cannot read the Java 25 classes of
the 26.x binding and logged a conversion error for each of them on
shutdown. Bindings for other versions are never used, so they are not
loaded at all.

Model used: Claude Opus 5.5
2026-10-11 17:05:27 +02:00
piexel 475f72a300 Clean up leftover studio worlds in either world layout
Studio worlds live in the "iris" world folder, which on 26.x is inside
the level's dimensions folder rather than in the world container.

Model used: Claude Opus 5.5
2026-10-11 16:48:12 +02:00
piexel bc7a530486 Fix object block replacements on Paper 26.1.2
Paper 26.1.2 caches block data that names every state without the parsed
states BlockData#merge needs, so replacing blocks inside objects threw
on every placement. Such block data replaces the base completely, so
B.merge returns it directly.

Model used: Claude Opus 5.5
2026-10-11 16:48:12 +02:00
piexel b12b1ee304 Set up studio workspaces with Gradle 9.5.1
Gradle 8.14 cannot run on Java 25, which 26.x servers use. 9.5.1 runs on
both Java 21 and 25.

Model used: Claude Opus 5.5
2026-10-11 16:48:12 +02:00
piexel 196de7d858 Keep the Iris data pack loadable after upgrading to 26.1
26.1 requires has_ender_dragon_fight in dimension types and reads data
packs before any plugin runs, so a pack written on 1.21 stopped the
server from starting. 1.21 ignores the field, so it is now always
written.

Model used: Claude Opus 5.5
2026-10-11 16:48:12 +02:00
piexel 8a18b6ff8b Support Minecraft 26.1.2 and 26.2
Adds the v26_1_R1 binding, which covers both versions. 26.x servers are
not obfuscated and need Java 25, so the build moves to Gradle 9.5.1 and
paperweight-userdev 2.0.0-beta.21, and the binding compiles against the
26.1.2 dev bundle with a Java 25 toolchain while everything else stays on
Java 21.

On 26.x every world is a dimension inside the main level, so the binding
provides DimensionWorldStorage:
- world folders resolve to <level>/dimensions/<namespace>/<key>
- data packs go to the level's datapacks folder
- Iris data in a pre-26.1 world folder is moved into the dimension
  before Paper imports the world and deletes the old folder
- "main=true" swaps the world in as the level's overworld instead of
  changing level-name

Also:
- INMS compares 1.x and 26.x versions in release order
- data pack formats 101 (26.1.2) and 107 (26.2), declared with
  min_format/max_format from format 82 on
- dimension types get the fields 26.1 added
- the Java safeguard accepts Java 25

Model used: Claude Opus 5.5
2026-10-11 16:48:05 +02:00
piexel e1514503f6 Resolve world folders through a WorldStorage seam
Minecraft 26.1 moved every world into its level's dimensions folder, so
Iris can no longer assume <world container>/<world name>. World folders,
data pack folders and moving Iris data out of an old layout now go
through WorldStorage, which the NMS binding provides. Every binding so
far uses LegacyWorldStorage, so behaviour is unchanged.

Code that already holds a loaded World uses World#getWorldFolder, which
is correct for both layouts.

Model used: Claude Opus 5.5
2026-10-11 15:58:50 +02:00
piexel f1c1869e43 Require Paper and drop Spigot support
Core now compiles against paper-api instead of spigot-api. PaperLib is
replaced by Paper's native async chunk and teleport API, and the Spigot
fallbacks (Medieval pregen method, sync chunk loading) are removed.

Adventure is no longer bundled and relocated: Paper ships it and every
CommandSender is an Audience, so the BukkitAudiences wrapper and ShadeFix
go away.

Iris now refuses to enable on servers without the Paper API, with a clear
message instead of failing later at runtime.

Model used: Claude Opus 5.5
2026-10-11 15:06:37 +02:00
Julian Krings 31615dc052 improve craftengine data provider for normal blocks 2026-07-06 15:56:29 +02:00
Julian Krings 4ddfd9549f store custom blocks in mantle directly until chunk gen 2026-07-06 15:43:11 +02:00
Julian Krings ed67dd6058 fix not resolving block id properly for craftengine 2026-07-04 14:43:51 +02:00
Julian Krings ee7f54429a fix not finding matching provider in processUpdate phase 2026-07-04 14:43:07 +02:00
Julian Krings 1e0628f768 fix runServer tasks 2026-07-04 14:41:55 +02:00
Julian Krings 72faf76269 update to craftengine 26.5 2026-06-16 12:12:14 +02:00
Aidan Aeternum 28c4941941 v+ 3.9.2-1.20.1-1.21.11 2026-06-12 21:10:21 -04:00
Aidan Aeternum d452f10fd9 Merge pull request #1241 from VolmitSoftware/dev
3.9.2
2026-06-12 21:09:46 -04:00
Julian Krings e7d89cadd8 fix compile 2026-04-12 11:58:33 +02:00
Julian Krings cddd6b16d6 add CraftEngine data provider (#1227) 2026-04-12 11:55:36 +02:00
Julian Krings b2ac4e7f93 fix invalid json for ultrawarm dimensions on 1.21.11 2026-04-12 11:55:36 +02:00
Julian Krings c2bb32459f fix ambient particles breaking datapack generation on 1.21.11 2026-04-12 11:55:35 +02:00
Brian Neumann-Fopiano 41888e33f6 Fixing fallbacks for macos Folk
Compiles fine, just stricter defaults
2026-02-11 00:01:23 -05:00
Aidan Aeternum 25fa2553e5 v+ 3.9.1-1.20.1-1.21.11 2026-02-02 03:28:49 -05:00
Aidan Aeternum 86f78baecf Merge pull request #1236 from VolmitSoftware/dev
3.9.1
2026-02-02 03:28:30 -05:00
Julian Krings c31158578f fix datapack generation on 1.21.11 2026-01-29 16:40:33 +01:00
Aidan Aeternum 4e86d7d634 v+ 3.9.0-1.20.1-1.21.11 2026-01-27 20:09:25 -05:00
Aidan Aeternum 62fe29cf34 Merge pull request #1235 from VolmitSoftware/dev
3.9.0
2026-01-27 20:08:36 -05:00
Julian Krings a3bcea4f3e increase memory assumption per region 2026-01-26 21:37:29 +01:00
Julian Krings 7befce1084 initial 1.21.11 support 2026-01-23 11:46:15 +01:00
Aidan Aeternum 351a1aa495 v+ 3.8.2-1.20.1-1.21.10 2026-01-15 02:50:30 -05:00
Aidan Aeternum d2cb8a9032 Merge pull request #1234 from VolmitSoftware/dev
3.8.2
2026-01-15 02:50:03 -05:00
Julian Krings 509715087c fix typo 2026-01-13 15:11:21 +01:00
Julian Krings 12527ecdd8 improve cachedChunks lookup in the mantle writer 2026-01-05 14:58:58 +01:00
Julian Krings 01a2999e03 decrease locking for mantle generation 2026-01-05 14:58:09 +01:00
Julian Krings dbafe84fa5 make context dereference method fail-safe 2026-01-02 14:12:44 +01:00
Julian Krings 40b020fc5d improve matter generator once again 2026-01-02 14:10:35 +01:00
Julian Krings d15f7d62d1 cleanup async world ticker 2026-01-02 14:10:35 +01:00
Julian Krings f9c062c794 improve mantle cleanup to prevent thread starvation 2026-01-02 14:10:34 +01:00
Aidan Aeternum 6a89b8bd06 v+ 3.8.1-1.20.1-1.21.10 2026-01-02 06:17:00 -05:00
Aidan Aeternum 194fcb2ea7 Merge pull request #1232 from VolmitSoftware/dev
3.8.1
2026-01-02 06:16:28 -05:00