Datapack export

- /iris datapack export compiles one pack dimension into a worldgen datapack for Minecraft 26.3 and later
- Bukkit and mod loaders take the same version, mode, namespace, output, format, objects and replace arguments
- The default overworld mode replaces the Overworld of a new world with the default world type
- Preset and dimension modes write a selectable world preset or a separate dimension
- The export runs in the background and publishes the zip or folder atomically
- Pack compiler stages turn noise, terrain, caves, subterrain, biomes, surface, decoration, objects and structures into a version-neutral IR
- Capability lowering fits every field to 26.3 density function ranges
- Disjoint min and max nodes fold to the input that always wins
- The 26.3 writer emits density functions, noise settings, biomes, features, structures, presets and dimensions
- Every export carries the Iris logo as its pack.png
- Unused objects, templates and features are pruned from the output
- The pruner keeps pack.png without reading references from its bytes
- Imported pack datapacks are bundled into the export
- Every approximation reports an export limit diagnostic
- Generation cost is counted against a node budget and reported as a warning
- Cave biomes over the wall palette limit use the closest kept palette
- Jigsaw exports share the template encoder, block states, destinations and publisher with the worldgen export
- DataVersion carries the pack format minor and world data version
- Both platforms expose vanilla data from the server classpath
- GoldenHashEngine and the export probes share one chunk spiral scan
- Headless 26.3 probes measure export cost and compare column and chunk likeness against Iris
- Real-codec tests decode the exported resources with the 26.3 registries
- Paper registry tests run in isolated registry scopes
- Command help and messages cover the export in every language file
This commit is contained in:
Brian Neumann-Fopiano committed 2026-10-30 22:59:04 -04:00
1 parent b00e28e42e
commit 1ed1044474
385 files changed
+48102 -535

No files matched your search

+57
View File
@@ -821,6 +821,13 @@ project(':adapters:bukkit:nms:v26_3_R1') {
}
sourceSets.test.compileClasspath += sourceSets.offline.output
sourceSets.test.runtimeClasspath += sourceSets.offline.output
tasks.named('test').configure {
String exportProbePack = providers.gradleProperty('iris.exportProbePack').orNull
if (exportProbePack != null) {
systemProperty('iris.exportProbePack', exportProbePack)
maxHeapSize = '6g'
}
}
TaskProvider<Jar> offlineJar = tasks.register('offlineJar', Jar) {
dependsOn(offlineClasses)
@@ -848,6 +855,30 @@ project(':adapters:bukkit:nms:v26_3_R1') {
}
}
tasks.register('datapackCostProbe', JavaExec) {
group = 'verification'
description = 'Exports an Iris dimension as a 26.3 worldgen datapack and measures its load, chunk and density function cost against vanilla.'
dependsOn(offlineClasses)
mainClass = 'art.arcane.iris.probe.DatapackCostProbe'
classpath = sourceSets.offline.runtimeClasspath
maxHeapSize = providers.gradleProperty('probeHeap').getOrElse('24G')
jvmArgs('--add-modules', 'jdk.incubator.vector', '-Djava.awt.headless=true')
doFirst {
String dimension = providers.gradleProperty('probeDimension').getOrElse('overworld')
String output = providers.gradleProperty('probeOutput')
.getOrElse(layout.buildDirectory.file("reports/datapack-cost/${dimension}.json").get().asFile.absolutePath)
args([rootProject.file(providers.gradleProperty('probePack').get()).absolutePath, dimension,
providers.gradleProperty('probeSeed').getOrElse('1337'),
providers.gradleProperty('probeChunkSide').getOrElse('6'),
providers.gradleProperty('probeRounds').getOrElse('4'),
providers.gradleProperty('probeWarmupSide').getOrElse('6'),
providers.gradleProperty('probeCalls').getOrElse('256'),
providers.gradleProperty('probeCallSeconds').getOrElse('60'),
rootProject.file(output).absolutePath,
layout.buildDirectory.dir('tmp/datapack-cost').get().asFile.absolutePath])
}
}
tasks.register('regionMantleInspection', JavaExec) {
group = 'verification'
dependsOn(testClasses)
@@ -877,6 +908,32 @@ project(':adapters:bukkit:nms:v26_3_R1') {
}
}
tasks.register('datapackFidelityProbe', JavaExec) {
group = 'verification'
description = 'Exports an Iris dimension as a 26.3 worldgen datapack and compares both generators on the same seed.'
dependsOn(offlineClasses)
mainClass = 'art.arcane.iris.probe.DatapackFidelityProbe'
classpath = sourceSets.offline.runtimeClasspath
maxHeapSize = '8G'
jvmArgs('--add-modules', 'jdk.incubator.vector', '-Djava.awt.headless=true')
doFirst {
String dimension = providers.gradleProperty('probeDimension').get()
String seed = providers.gradleProperty('probeSeed').get()
String mode = providers.gradleProperty('probeMode').getOrElse('full')
boolean biomes = mode == 'biomes'
String output = providers.gradleProperty('probeOutput')
.getOrElse(layout.buildDirectory.file("reports/datapack-fidelity/${dimension}-${seed}${biomes ? '-biomes' : ''}.json").get().asFile.absolutePath)
args([rootProject.file(providers.gradleProperty('probePack').get()).absolutePath, dimension, seed,
biomes ? providers.gradleProperty('probeRadiusChunks').getOrElse('0') : providers.gradleProperty('probeRadiusChunks').get(),
biomes ? providers.gradleProperty('probeStride').getOrElse('1') : providers.gradleProperty('probeStride').get(),
rootProject.file(output).absolutePath,
providers.gradleProperty('probeSurveyBlocks').getOrElse('65536'),
providers.gradleProperty('probeSurveyStride').getOrElse('256'),
providers.gradleProperty('probeSurveySeeds').getOrElse(biomes ? '7' : '1'),
mode])
}
}
}