diff --git a/.gitignore b/.gitignore
index eaf77ed40..203047ef2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,4 +10,4 @@ libs/
collection/
-src/main/java/com/volmit/iris/util/uniques/
+/core/src/main/java/com/volmit/iris/util/uniques/
diff --git a/build.gradle b/build.gradle
index a6b2efe67..3f1a11541 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,3 +1,5 @@
+import java.util.function.Consumer
+
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2021 Arcane Arts (Volmit Software)
@@ -19,18 +21,12 @@
plugins {
id 'java'
id 'java-library'
- id "io.freefair.lombok" version "6.3.0"
id "com.github.johnrengelman.shadow" version "7.1.2"
id "de.undercouch.download" version "5.0.1"
}
-version '2.7.3-1.20.1'
-def nmsVersion = '1.20.1' //[NMS]
-def apiVersion = '1.20'
+version '3.0.0-1.19.2-1.20.2'
def specialSourceVersion = '1.11.0' //[NMS]
-def spigotJarVersion = '1.20.1-R0.1-SNAPSHOT' //[NMS]
-def name = getRootProject().getName() // Defined in settings.gradle
-def main = 'com.volmit.iris.Iris'
// ADD YOURSELF AS A NEW LINE IF YOU WANT YOUR OWN BUILD TASK GENERATED
// ======================== WINDOWS =============================
@@ -40,125 +36,230 @@ registerCustomOutputTask('ArcaneArts', 'C://Users/arcane/Documents/development/s
registerCustomOutputTask('Coco', 'D://mcsm/plugins')
registerCustomOutputTask('Strange', 'D://Servers/1.17 Test Server/plugins')
registerCustomOutputTask('Vatuu', 'D://Minecraft/Servers/1.19.4/plugins')
+registerCustomOutputTask('CrazyDev22', 'C://Users/Julian/Desktop/server/plugins')
+registerCustomOutputTask('Pixel', 'C://Users/repix/Iris Dimension Engine/1.20.1 - Iris Coding/plugins')
// ========================== UNIX ==============================
registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/development/server/plugins')
-registerCustomOutputTaskUnix('PsychoLT', '/Users/brianfopiano/Desktop/REMOTES/RemoteMinecraft/plugins')
+registerCustomOutputTaskUnix('PsychoLT', '/Volumes/PRO-G40/Minecraft/MinecraftDevelopment/Server/plugins')
// ==============================================================
-/**
- * Gradle is weird sometimes, we need to delete the plugin yml from the build folder to actually filter properly.
- */
-file(jar.archiveFile.get().getAsFile().getParentFile().getParentFile().getParentFile().getAbsolutePath() + '/build/resources/main/plugin.yml').delete()
+def NMS_BINDINGS = Map.of(
+// "v1_20_R3", "1.20.4-R0.1-SNAPSHOT",
+ "v1_20_R2", "1.20.2-R0.1-SNAPSHOT",
+ "v1_20_R1", "1.20.1-R0.1-SNAPSHOT",
+ "v1_19_R3", "1.19.4-R0.1-SNAPSHOT",
+ "v1_19_R2", "1.19.3-R0.1-SNAPSHOT",
+ "v1_19_R1", "1.19.2-R0.1-SNAPSHOT"
+)
+NMS_BINDINGS.each {
+ def key = it.key
+ def value = it.value
+ def nms = value.split("-")[0];
+ project(":nms:${key}") {
+ apply plugin: 'java-library'
+ apply plugin: 'de.undercouch.download'
-/**
- * Expand properties into plugin yml
- */
-processResources {
- filesMatching('**/plugin.yml') {
- expand(
- 'name': name.toString(),
- 'version': version.toString(),
- 'main': main.toString(),
- 'apiversion': apiVersion.toString()
- )
- }
-}
+ dependencies {
+ implementation project(":core")
+ compileOnly "org.spigotmc:spigot-api:${value}"
+ compileOnly "org.bukkit:craftbukkit:${value}:remapped-mojang" //[NMS]
+ }
+ def buildToolsJar = new File(rootProject.buildDir, "tools/BuildTools.jar")
+ def specialSourceJar = new File(rootProject.buildDir, "tools/SpecialSource.jar")
-/**
- * Unified repo
- */
-repositories {
- mavenLocal {
- content {
- includeGroup("org.bukkit")
- includeGroup("org.spigotmc")
+ def buildToolsFolder = new File(buildDir, "buildtools")
+ def specialSourceFolder = new File(buildDir, "specialsource")
+ def buildToolsHint = new File(buildDir, "buildtools/craftbukkit-" + nms + ".jar")
+
+ def outputJar = new File(buildDir, "libs/${key}.jar")
+ def ssiJar = new File(buildDir, "specialsource/${key}.jar")
+ def ssobfJar = new File(buildDir, "specialsource/${key}-rmo.jar")
+ def ssJar = new File(buildDir, "specialsource/${key}-rma.jar")
+
+ def homePath = System.properties['user.home']
+ def m2 = new File(homePath + "/.m2/repository")
+ def m2s = m2.getAbsolutePath();
+
+ // ======================== Building Mapped Jars =============================
+
+ ext {
+ executeBuildTools = new Runnable() {
+ @Override
+ void run() {
+ //Download
+ if (!buildToolsJar.exists()) {
+ download.run {
+ src 'https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar'
+ dest buildToolsJar
+ }
+ }
+
+ //Execute
+ if (!buildToolsHint.exists()) {
+ buildToolsFolder.mkdirs()
+ project.javaexec {
+ classpath = files(buildToolsJar)
+ workingDir = buildToolsFolder
+ args = [
+ "--rev",
+ nms,
+ "--compile",
+ "craftbukkit",
+ "--remap"
+ ]
+ }
+ }
+ }
+ }
+ }
+ tasks.register("executeBuildTools") {
+ doLast {
+ property("executeBuildTools").run();
+ }
}
- }
- mavenCentral()
- maven { url "https://arcanearts.jfrog.io/artifactory/archives" }
- maven { url "https://mvn.lumine.io/repository/maven-public/" }
- maven { url "https://jitpack.io"}
-
- maven { url "https://s01.oss.sonatype.org/content/repositories/snapshots" }
- maven { url "https://mvn.lumine.io/repository/maven/" }
- maven { url "https://repo.triumphteam.dev/snapshots" }
- maven { url "https://repo.mineinabyss.com/releases" }
- maven { url = 'https://hub.jeff-media.com/nexus/repository/jeff-media-public/' }
-}
-/**
- * We need parameter meta for the decree command system
- */
-compileJava {
- options.compilerArgs << '-parameters'
+ tasks.build.doLast {
+ //Download
+ if (!specialSourceJar.exists()) {
+ download.run {
+ src 'https://repo.maven.apache.org/maven2/net/md-5/SpecialSource/' + specialSourceVersion + '/SpecialSource-'+specialSourceVersion+'-shaded.jar'
+ dest specialSourceJar
+ }
+ }
+ specialSourceFolder.mkdirs();
+
+ //Copy
+ copy {
+ from outputJar
+ into specialSourceFolder
+ }
+
+ //obfuscate
+ javaexec {
+ workingDir = specialSourceFolder
+ classpath = files(specialSourceJar,
+ new File(m2s + "/org/spigotmc/spigot/" + value + "/spigot-" + value + "-remapped-mojang.jar"))
+ mainClass = "net.md_5.specialsource.SpecialSource"
+ args = [
+ "--live",
+ "-i",
+ ssiJar.getName(),
+ "-o",
+ ssobfJar.getName(),
+ "-m",
+ m2s + "/org/spigotmc/minecraft-server/" + value + "/minecraft-server-" + value + "-maps-mojang.txt",
+ "--reverse",
+ ]
+ }
+
+ //remap
+ javaexec {
+ workingDir = specialSourceFolder
+ classpath = files(specialSourceJar,
+ new File(m2s + "/org/spigotmc/spigot/" + value + "/spigot-" + value + "-remapped-obf.jar"))
+ mainClass = "net.md_5.specialsource.SpecialSource"
+ args = [
+ "--live",
+ "-i",
+ ssobfJar.getName(),
+ "-o",
+ ssJar.getName(),
+ "-m",
+ m2s + "/org/spigotmc/minecraft-server/" + value + "/minecraft-server-" + value + "-maps-spigot.csrg"
+ ]
+ }
+ //copy
+ copy {
+ from ssJar
+ into outputJar.getParentFile()
+ rename {
+ outputJar.getName()
+ }
+ }
+ }
+ }
}
-/**
- * Configure Iris for shading
- */
shadowJar {
+ NMS_BINDINGS.each {dependsOn(":nms:${it.key}:build")}
+
//minimize()
append("plugin.yml")
relocate 'com.dfsek.paralithic', 'com.volmit.iris.util.paralithic'
relocate 'io.papermc.lib', 'com.volmit.iris.util.paper'
relocate 'net.kyori', 'com.volmit.iris.util.kyori'
- dependencies {
- include(dependency('io.papermc:paperlib'))
- include(dependency('com.dfsek:Paralithic'))
- include(dependency('net.kyori:'))
+ archiveFileName.set("Iris-${project.version}.jar")
+}
+
+dependencies {
+ implementation project(':core')
+ NMS_BINDINGS.each {
+ implementation project(":nms:${it.key}")
}
}
-configurations.all {
+configurations.configureEach {
resolutionStrategy.cacheChangingModulesFor 60, 'minutes'
resolutionStrategy.cacheDynamicVersionsFor 60, 'minutes'
}
-/**
- * Dependencies.
- *
- * Provided or classpath dependencies are not shaded and are available on the runtime classpath
- *
- * Shaded dependencies are not available at runtime, nor are they available on mvn central so they
- * need to be shaded into the jar (increasing binary size)
- *
- * Dynamically loaded dependencies are defined in the plugin.yml (updating these must be updated in the
- * plugin.yml also, otherwise they wont be available). These do not increase binary size). Only declare
- * these dependencies if they are available on mvn central.
- */
-dependencies {
- // Provided or Classpath
- compileOnly 'org.projectlombok:lombok:1.18.24'
- annotationProcessor 'org.projectlombok:lombok:1.18.24'
- implementation 'org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT'
- implementation 'org.bukkit:craftbukkit:1.20.1-R0.1-SNAPSHOT:remapped-mojang' //[NMS]
-
- // Third Party Integrations
- implementation 'com.github.oraxen:oraxen:1.158.0'
- implementation 'com.github.LoneDev6:api-itemsadder:3.4.1-r4'
- implementation 'me.clip:placeholderapi:2.11.3'
- //implementation files('libs/CustomItems.jar')
-
- // Shaded
- implementation 'com.dfsek:Paralithic:0.4.0'
- implementation 'io.papermc:paperlib:1.0.5'
- implementation "net.kyori:adventure-text-minimessage:4.13.1"
- implementation 'net.kyori:adventure-platform-bukkit:4.3.0'
- implementation 'net.kyori:adventure-api:4.13.1'
- implementation 'io.lumine:Mythic-Dist:5.2.1'
-
- // Dynamically Loaded
- implementation 'io.timeandspace:smoothie-map:2.0.2'
- implementation 'it.unimi.dsi:fastutil:8.5.8'
- implementation 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2'
- implementation 'org.zeroturnaround:zt-zip:1.14'
- implementation 'com.google.code.gson:gson:2.9.0'
- implementation 'org.ow2.asm:asm:9.2'
- implementation 'com.google.guava:guava:31.1-jre'
- implementation 'bsf:bsf:2.4.0'
- implementation 'rhino:js:1.7R2'
- implementation 'com.github.ben-manes.caffeine:caffeine:3.0.6'
- implementation 'org.apache.commons:commons-lang3:3.12.0'
+allprojects {
+ apply plugin: 'java'
+
+ repositories {
+ mavenLocal {
+ content {
+ includeGroup("org.bukkit")
+ includeGroup("org.spigotmc")
+ }
+ }
+ mavenCentral()
+ maven { url "https://repo.papermc.io/repository/maven-public/"}
+ maven { url "https://repo.codemc.org/repository/maven-public" }
+ maven { url "https://mvn.lumine.io/repository/maven-public/" }
+ maven { url "https://jitpack.io"}
+
+ maven { url "https://s01.oss.sonatype.org/content/repositories/snapshots" }
+ maven { url "https://mvn.lumine.io/repository/maven/" }
+ maven { url "https://repo.triumphteam.dev/snapshots" }
+ maven { url "https://repo.mineinabyss.com/releases" }
+ maven { url 'https://hub.jeff-media.com/nexus/repository/jeff-media-public/' }
+ }
+
+ dependencies {
+ // Provided or Classpath
+ compileOnly 'org.projectlombok:lombok:1.18.24'
+ annotationProcessor 'org.projectlombok:lombok:1.18.24'
+
+ // Shaded
+ implementation 'com.dfsek:Paralithic:0.4.0'
+ implementation 'io.papermc:paperlib:1.0.5'
+ implementation "net.kyori:adventure-text-minimessage:4.13.1"
+ implementation 'net.kyori:adventure-platform-bukkit:4.3.0'
+ implementation 'net.kyori:adventure-api:4.13.1'
+ compileOnly 'io.lumine:Mythic-Dist:5.2.1'
+
+ // Dynamically Loaded
+ compileOnly 'io.timeandspace:smoothie-map:2.0.2'
+ compileOnly 'it.unimi.dsi:fastutil:8.5.8'
+ compileOnly 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2'
+ compileOnly 'org.zeroturnaround:zt-zip:1.14'
+ compileOnly 'com.google.code.gson:gson:2.9.0'
+ compileOnly 'org.ow2.asm:asm:9.2'
+ compileOnly 'com.google.guava:guava:31.1-jre'
+ compileOnly 'bsf:bsf:2.4.0'
+ compileOnly 'rhino:js:1.7R2'
+ compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6'
+ compileOnly 'org.apache.commons:commons-lang3:3.12.0'
+ }
+
+ /**
+ * We need parameter meta for the decree command system
+ */
+ compileJava {
+ options.compilerArgs << '-parameters'
+ options.encoding = "UTF-8"
+ }
}
if (JavaVersion.current().toString() != "17") {
@@ -179,123 +280,34 @@ if (JavaVersion.current().toString() != "17") {
System.exit(69);
}
-def buildToolsJar = new File(buildDir, "buildtools/BuildTools.jar");
-def specialSourceJar = new File(buildDir, "specialsource/SpecialSource.jar");
-def buildToolsFolder = new File(buildDir, "buildtools");
-def specialSourceFolder = new File(buildDir, "specialsource");
-def buildToolsHint = new File(buildDir, "buildtools/craftbukkit-" + nmsVersion + ".jar");
-def outputShadeJar = new File(buildDir, "libs/Iris-" + version + "-all.jar");
-def ssiJar = new File(buildDir, "specialsource/Iris-" + version + "-all.jar");
-def ssobfJar = new File(buildDir, "specialsource/Iris-" + version + "-rmo.jar");
-def ssJar = new File(buildDir, "specialsource/Iris-" + version + "-rma.jar");
-def homePath = System.properties['user.home']
-def m2 = new File(homePath + "/.m2/repository")
-def m2s = m2.getAbsolutePath();
-
-// ======================== Building Mapped Jars =============================
-task downloadBuildtools(type: Download) {
- group "remapping"
- src 'https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar'
- dest buildToolsJar
- onlyIf {
- !buildToolsJar.exists()
- }
+task iris(type: Copy) {
+ group "iris"
+ from new File(buildDir, "libs/Iris-${version}.jar")
+ into buildDir
+ dependsOn(build)
}
-task downloadSpecialSource(type: Download) {
- group "remapping"
- src 'https://repo.maven.apache.org/maven2/net/md-5/SpecialSource/' + specialSourceVersion + '/SpecialSource-'+specialSourceVersion+'-shaded.jar'
- dest specialSourceJar
- onlyIf {
- !specialSourceJar.exists()
+task setup() {
+ group "iris"
+ dependsOn(clean)
+ NMS_BINDINGS.each {
+ dependsOn(":nms:${it.key}:clean");
}
-}
-task executeBuildTools(dependsOn: downloadBuildtools, type: JavaExec)
-{
- group "remapping"
- classpath = files(buildToolsJar)
- workingDir = buildToolsFolder
- args = [
- "--rev",
- nmsVersion,
- "--compile",
- "craftbukkit",
- "--remap"
- ]
- onlyIf {
- !buildToolsHint.exists()
+ doLast {
+ NMS_BINDINGS.each {
+ project(":nms:${it.key}").property("executeBuildTools").run();
+ }
}
}
-task copyBuildToSpecialSource(type: Copy)
-{
- group "remapping"
- from outputShadeJar
- into specialSourceFolder
- dependsOn(downloadSpecialSource, shadowJar)
-}
-
-task specialSourceRemapObfuscate(type: JavaExec)
-{
- group "remapping"
- dependsOn(copyBuildToSpecialSource, downloadSpecialSource, shadowJar)
- workingDir = specialSourceFolder
- classpath = files(specialSourceJar,
- new File(m2s + "/org/spigotmc/spigot/" + spigotJarVersion + "/spigot-" + spigotJarVersion + "-remapped-mojang.jar"))
- mainClass = "net.md_5.specialsource.SpecialSource"
- args = [
- "--live",
- "-i",
- ssiJar.getName(),
- "-o",
- ssobfJar.getName(),
- "-m",
- m2s + "/org/spigotmc/minecraft-server/" + spigotJarVersion + "/minecraft-server-" + spigotJarVersion + "-maps-mojang.txt",
- "--reverse",
- ]
-}
-
-task specialSourceRemap(type: JavaExec)
-{
- group "remapping"
- dependsOn(specialSourceRemapObfuscate)
- workingDir = specialSourceFolder
- classpath = files(specialSourceJar,
- new File(m2s + "/org/spigotmc/spigot/" + spigotJarVersion + "/spigot-" + spigotJarVersion + "-remapped-obf.jar"))
- mainClass = "net.md_5.specialsource.SpecialSource"
- args = [
- "--live",
- "-i",
- ssobfJar.getName(),
- "-o",
- ssJar.getName(),
- "-m",
- m2s + "/org/spigotmc/minecraft-server/" + spigotJarVersion + "/minecraft-server-" + spigotJarVersion + "-maps-spigot.csrg"
- ]
-}
-
-tasks.compileJava.dependsOn(executeBuildTools)
-
-compileJava {
- options.encoding = "UTF-8"
-}
-
-task setup()
-{
- group("iris")
- dependsOn(clean, executeBuildTools)
-}
-
-task iris(type: Copy)
-{
- group "iris"
- from ssJar
- into buildDir
- rename { String fileName ->
- fileName.replace('Iris-' + version + '-rma.jar', "Iris-" + version + ".jar")
+NMS_BINDINGS.keySet().forEach {
+ def nms = it
+ tasks.register("setup-${nms}") {
+ group "iris"
+ dependsOn(":nms:${nms}:clean")
+ dependsOn(":nms:${nms}:executeBuildTools")
}
- dependsOn(specialSourceRemap)
}
def registerCustomOutputTask(name, path) {
@@ -331,3 +343,5 @@ def registerCustomOutputTaskUnix(name, path) {
}
}
}
+
+tasks.build.dependsOn(shadowJar)
\ No newline at end of file
diff --git a/core/build.gradle b/core/build.gradle
new file mode 100644
index 000000000..76d773096
--- /dev/null
+++ b/core/build.gradle
@@ -0,0 +1,85 @@
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2021 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+plugins {
+ id 'java'
+ id 'java-library'
+ id "io.freefair.lombok" version "6.3.0"
+}
+
+def apiVersion = '1.19'
+def main = 'com.volmit.iris.Iris'
+
+/**
+ * We need parameter meta for the decree command system
+ */
+compileJava {
+ options.compilerArgs << '-parameters'
+ options.encoding = "UTF-8"
+}
+
+/**
+ * Dependencies.
+ *
+ * Provided or classpath dependencies are not shaded and are available on the runtime classpath
+ *
+ * Shaded dependencies are not available at runtime, nor are they available on mvn central so they
+ * need to be shaded into the jar (increasing binary size)
+ *
+ * Dynamically loaded dependencies are defined in the plugin.yml (updating these must be updated in the
+ * plugin.yml also, otherwise they wont be available). These do not increase binary size). Only declare
+ * these dependencies if they are available on mvn central.
+ */
+dependencies {
+ // Provided or Classpath
+ compileOnly 'org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT'
+ compileOnly 'org.apache.logging.log4j:log4j-api:2.19.0'
+ compileOnly 'org.apache.logging.log4j:log4j-core:2.19.0'
+ compileOnly 'commons-io:commons-io:2.13.0'
+ compileOnly 'commons-lang:commons-lang:2.6'
+ compileOnly 'com.github.oshi:oshi-core:5.8.5'
+ compileOnly 'org.lz4:lz4-java:1.8.0'
+
+ // Third Party Integrations
+ compileOnly 'com.ticxo.playeranimator:PlayerAnimator:R1.2.7'
+ compileOnly 'com.github.oraxen:oraxen:1.158.0'
+ compileOnly 'com.github.LoneDev6:api-itemsadder:3.4.1-r4'
+ compileOnly 'com.github.PlaceholderAPI:placeholderapi:2.11.3'
+ compileOnly 'com.github.Ssomar-Developement:SCore:4.23.10.8'
+ //implementation files('libs/CustomItems.jar')
+}
+
+
+/**
+ * Gradle is weird sometimes, we need to delete the plugin yml from the build folder to actually filter properly.
+ */
+file(jar.archiveFile.get().getAsFile().getParentFile().getParentFile().getParentFile().getAbsolutePath() + '/build/resources/main/plugin.yml').delete()
+
+/**
+ * Expand properties into plugin yml
+ */
+processResources {
+ filesMatching('**/plugin.yml') {
+ expand(
+ 'name': rootProject.name.toString(),
+ 'version': rootProject.version.toString(),
+ 'main': main.toString(),
+ 'apiversion': apiVersion.toString()
+ )
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java
similarity index 76%
rename from src/main/java/com/volmit/iris/Iris.java
rename to core/src/main/java/com/volmit/iris/Iris.java
index 513dfc1ba..a39306991 100644
--- a/src/main/java/com/volmit/iris/Iris.java
+++ b/core/src/main/java/com/volmit/iris/Iris.java
@@ -28,7 +28,7 @@
import com.volmit.iris.core.link.MythicMobsLink;
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.nms.INMS;
-import com.volmit.iris.core.nms.v20.NMSBinding1_20_1;
+import com.volmit.iris.core.nms.v1X.NMSBinding1X;
import com.volmit.iris.core.pregenerator.LazyPregenerator;
import com.volmit.iris.core.service.StudioSVC;
import com.volmit.iris.core.tools.IrisToolbelt;
@@ -38,6 +38,8 @@
import com.volmit.iris.engine.object.IrisWorld;
import com.volmit.iris.engine.platform.BukkitChunkGenerator;
import com.volmit.iris.engine.platform.DummyChunkGenerator;
+import com.volmit.iris.core.safeguard.IrisSafeguard;
+import com.volmit.iris.core.safeguard.UtilsSFG;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.exceptions.IrisException;
@@ -50,6 +52,7 @@
import com.volmit.iris.util.io.JarScanner;
import com.volmit.iris.util.math.M;
import com.volmit.iris.util.math.RNG;
+import com.volmit.iris.util.misc.getHardware;
import com.volmit.iris.util.parallel.MultiBurst;
import com.volmit.iris.util.plugin.IrisService;
import com.volmit.iris.util.plugin.Metrics;
@@ -60,6 +63,7 @@
import com.volmit.iris.util.scheduling.Queue;
import com.volmit.iris.util.scheduling.ShurikenQueue;
import io.papermc.lib.PaperLib;
+import lombok.Getter;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.serializer.ComponentSerializer;
import org.bukkit.Bukkit;
@@ -85,13 +89,21 @@
import java.io.*;
import java.lang.annotation.Annotation;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
import java.net.URL;
import java.util.Date;
import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static com.volmit.iris.core.safeguard.IrisSafeguard.*;
+import static com.volmit.iris.core.safeguard.ServerBootSFG.passedserversoftware;
+import static com.volmit.iris.util.misc.getHardware.getCPUModel;
@SuppressWarnings("CanBeFinal")
public class Iris extends VolmitPlugin implements Listener {
- public static final String OVERWORLD_TAG = "3005";
+ public static final String OVERWORLD_TAG = "3800";
private static final Queue syncJobs = new ShurikenQueue<>();
@@ -308,6 +320,9 @@ public static void success(String string) {
public static void info(String format, Object... args) {
msg(C.WHITE + String.format(format, args));
}
+ public static void safeguard(String format, Object... args) {
+ msg(C.RESET + String.format(format, args));
+ }
@SuppressWarnings("deprecation")
public static void later(NastyRunnable object) {
@@ -336,7 +351,7 @@ public static void clearQueues() {
}
}
- private static int getJavaVersion() {
+ public static int getJavaVersion() {
String version = System.getProperty("java.version");
if (version.startsWith("1.")) {
version = version.substring(2, 3);
@@ -428,7 +443,6 @@ public static void addPanic(String s, String v) {
private static void fixShading() {
ShadeFix.fix(ComponentSerializer.class);
}
-
private void enable() {
instance = this;
services = new KMap<>();
@@ -436,6 +450,7 @@ private void enable() {
INMS.get();
IO.delete(new File("iris"));
setupAudience();
+ IrisSafeguard.IrisSafeguardSystem();
sender = new VolmitSender(Bukkit.getConsoleSender());
sender.setTag(getTag());
instance = this;
@@ -455,6 +470,8 @@ private void enable() {
J.s(this::setupPapi);
J.a(ServerConfigurator::configure, 20);
splash();
+ UtilsSFG.splash();
+
autoStartStudio();
checkForBukkitWorlds();
IrisToolbelt.retainMantleDataForSlice(String.class.getCanonicalName());
@@ -573,19 +590,26 @@ public void stop() {
@Override
public String getTag(String subTag) {
+ if (unstablemode) {
+ return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.RED + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": ";
+ }
+ if (warningmode) {
+ return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.GOLD + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": ";
+ }
return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.IRIS + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": ";
+
}
private boolean setupChecks() {
boolean passed = true;
Iris.info("Version Information: " + instance.getServer().getVersion() + " | " + instance.getServer().getBukkitVersion());
- if (!instance.getServer().getBukkitVersion().contains(NMSBinding1_20_1.NMS_VERSION)) {
+ if (INMS.get() instanceof NMSBinding1X) {
passed = false;
Iris.warn("============================================");
Iris.warn("=");
Iris.warn("=");
Iris.warn("=");
- Iris.warn("Iris is not compatible with this version of Minecraft.\nPlease use " + NMSBinding1_20_1.NMS_VERSION + " or use an older version of Iris.");
+ Iris.warn("Iris is not compatible with this version of Minecraft.");
Iris.warn("=");
Iris.warn("=");
Iris.warn("=");
@@ -703,7 +727,7 @@ public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
File ff = new File(w.worldFolder(), "iris/pack");
if (!ff.exists() || ff.listFiles().length == 0) {
ff.mkdirs();
- service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), ff.getParentFile());
+ service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), w.worldFolder());
}
return new BukkitChunkGenerator(w, false, ff, dim.getLoadKey());
@@ -714,12 +738,17 @@ public void splash() {
return;
}
- // @NoArgsConstructor
String padd = Form.repeat(" ", 8);
String padd2 = Form.repeat(" ", 4);
- String[] info = {"", "", "", "", "", padd2 + C.IRIS + " Iris", padd2 + C.GRAY + " by " + "Volmit Software", padd2 + C.GRAY + " v" + C.IRIS + getDescription().getVersion(),
- };
- String[] splash = {
+ String[] info = {"", "", "", "", "", padd2 + C.IRIS + " Iris", padd2 + C.GRAY + " by " + "Volmit Software", padd2 + C.GRAY + " v" + C.IRIS + getDescription().getVersion()};
+ if (unstablemode) {
+ info = new String[]{"", "", "", "", "", padd2 + C.RED + " Iris", padd2 + C.GRAY + " by " + C.DARK_RED + "Volmit Software", padd2 + C.GRAY + " v" + C.RED + getDescription().getVersion()};
+ }
+ if (warningmode) {
+ info = new String[]{"", "", "", "", "", padd2 + C.GOLD + " Iris", padd2 + C.GRAY + " by " + C.GOLD + "Volmit Software", padd2 + C.GRAY + " v" + C.GOLD + getDescription().getVersion()};
+ }
+
+ String[] splashstable = {
padd + C.GRAY + " @@@@@@@@@@@@@@" + C.DARK_GRAY + "@@@",
padd + C.GRAY + " @@&&&&&&&&&" + C.DARK_GRAY + "&&&&&&" + C.IRIS + " .(((()))). ",
padd + C.GRAY + "@@@&&&&&&&&" + C.DARK_GRAY + "&&&&&" + C.IRIS + " .((((((())))))). ",
@@ -732,8 +761,86 @@ public void splash() {
padd + C.GRAY + "" + C.IRIS + " '(((())))' " + C.DARK_GRAY + "&&&&&&&&" + C.GRAY + "&&&&&&&@@",
padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@"
};
- //@done
- Iris.info("Server type & version: " + Bukkit.getVersion());
+
+ String[] splashunstable = {
+ padd + C.GRAY + " @@@@@@@@@@@@@@" + C.DARK_GRAY + "@@@",
+ padd + C.GRAY + " @@&&&&&&&&&" + C.DARK_GRAY + "&&&&&&" + C.RED + " .(((()))). ",
+ padd + C.GRAY + "@@@&&&&&&&&" + C.DARK_GRAY + "&&&&&" + C.RED + " .((((((())))))). ",
+ padd + C.GRAY + "@@@&&&&&" + C.DARK_GRAY + "&&&&&&&" + C.RED + " ((((((((())))))))) " + C.GRAY + " @",
+ padd + C.GRAY + "@@@&&&&" + C.DARK_GRAY + "@@@@@&" + C.RED + " ((((((((-))))))))) " + C.GRAY + " @@",
+ padd + C.GRAY + "@@@&&" + C.RED + " ((((((({ })))))))) " + C.GRAY + " &&@@@",
+ padd + C.GRAY + "@@" + C.RED + " ((((((((-))))))))) " + C.DARK_GRAY + "&@@@@@" + C.GRAY + "&&&&@@@",
+ padd + C.GRAY + "@" + C.RED + " ((((((((())))))))) " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&@@@",
+ padd + C.GRAY + "" + C.RED + " '((((((()))))))' " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&&@@@",
+ padd + C.GRAY + "" + C.RED + " '(((())))' " + C.DARK_GRAY + "&&&&&&&&" + C.GRAY + "&&&&&&&@@",
+ padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@"
+ };
+ String[] splashwarning = {
+ padd + C.GRAY + " @@@@@@@@@@@@@@" + C.DARK_GRAY + "@@@",
+ padd + C.GRAY + " @@&&&&&&&&&" + C.DARK_GRAY + "&&&&&&" + C.GOLD + " .(((()))). ",
+ padd + C.GRAY + "@@@&&&&&&&&" + C.DARK_GRAY + "&&&&&" + C.GOLD + " .((((((())))))). ",
+ padd + C.GRAY + "@@@&&&&&" + C.DARK_GRAY + "&&&&&&&" + C.GOLD + " ((((((((())))))))) " + C.GRAY + " @",
+ padd + C.GRAY + "@@@&&&&" + C.DARK_GRAY + "@@@@@&" + C.GOLD + " ((((((((-))))))))) " + C.GRAY + " @@",
+ padd + C.GRAY + "@@@&&" + C.GOLD + " ((((((({ })))))))) " + C.GRAY + " &&@@@",
+ padd + C.GRAY + "@@" + C.GOLD + " ((((((((-))))))))) " + C.DARK_GRAY + "&@@@@@" + C.GRAY + "&&&&@@@",
+ padd + C.GRAY + "@" + C.GOLD + " ((((((((())))))))) " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&@@@",
+ padd + C.GRAY + "" + C.GOLD + " '((((((()))))))' " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&&@@@",
+ padd + C.GRAY + "" + C.GOLD + " '(((())))' " + C.DARK_GRAY + "&&&&&&&&" + C.GRAY + "&&&&&&&@@",
+ padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@"
+ };
+ String[] splash;
+ File freeSpace = new File(Bukkit.getWorldContainer() + ".");
+ if (unstablemode) {
+ splash = splashunstable;
+ } else if (warningmode) {
+ splash = splashwarning;
+ } else {
+ splash = splashstable;
+ }
+ OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
+ String osArch = osBean.getArch();
+ String osName = osBean.getName();
+
+ if (!passedserversoftware) {
+ Iris.info("Server type & version: " + C.RED + Bukkit.getVersion());
+ } else { Iris.info("Server type & version: " + Bukkit.getVersion()); }
+ if (!instance.getServer().getVersion().contains("Purpur")) {
+ if (instance.getServer().getVersion().contains("Spigot") && instance.getServer().getVersion().contains("Bukkit")) {
+ Iris.info(C.RED + " Iris requires paper or above to function properly..");
+ } else {
+ Iris.info(C.YELLOW + "Purpur is recommended to use with iris.");
+ }
+ }
+ Iris.info("Server OS: " + osName + " (" + osArch + ")");
+
+ try {
+ if (warningmode){
+ Iris.info("Server Cpu: " + C.GOLD + getCPUModel());
+ } else {
+ if(unstablemode){
+ Iris.info("Server Cpu: " + C.DARK_RED + getCPUModel());
+ } else {
+ if (getCPUModel().contains("Intel")) {
+ Iris.info("Server Cpu: " + C.BLUE + getCPUModel());
+ }
+ if (getCPUModel().contains("Ryzen")) {
+ Iris.info("Server Cpu: " + C.RED + getCPUModel());
+ }
+ if (!getCPUModel().contains("Ryzen") && !getCPUModel().contains("Intel")) {
+ Iris.info("Server Cpu: " + C.GRAY + getCPUModel());
+ }
+ }
+ }
+ } catch (Exception e){
+ Iris.info("Server Cpu: " + C.DARK_RED + "Failed");
+ }
+
+ Iris.info("Process Threads: " + Runtime.getRuntime().availableProcessors());
+ Iris.info("Process Memory: " + getHardware.getProcessMemory() + " MB");
+ Iris.info("Free DiskSpace: " + Form.ofSize(freeSpace.getFreeSpace(), 1024));
+ if (getHardware.getProcessMemory() < 5999) {
+ Iris.warn("6GB+ Ram is recommended");
+ }
Iris.info("Bukkit version: " + Bukkit.getBukkitVersion());
Iris.info("Java version: " + getJavaVersion());
Iris.info("Custom Biomes: " + INMS.get().countCustomBiomes());
@@ -768,4 +875,33 @@ private void printPack(File pack) {
}
Iris.info(" " + dimName + " v" + version);
}
+
+ public int getIrisVersion() {
+ String input = Iris.instance.getDescription().getVersion();
+ int hyphenIndex = input.indexOf('-');
+ if (hyphenIndex != -1) {
+ String result = input.substring(0, hyphenIndex);
+ result = result.replaceAll("\\.", "");
+ return Integer.parseInt(result);
+ }
+ return -1;
+ }
+
+ public int getMCVersion() {
+ try {
+ String version = Bukkit.getVersion();
+ Matcher matcher = Pattern.compile("\\(MC: ([\\d.]+)\\)").matcher(version);
+ if (matcher.find()) {
+ version = matcher.group(1).replaceAll("\\.", "");
+ long versionNumber = Long.parseLong(version);
+ if (versionNumber > Integer.MAX_VALUE) {
+ return -1;
+ }
+ return (int) versionNumber;
+ }
+ return -1;
+ } catch (Exception e) {
+ return -1;
+ }
+ }
}
diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/core/src/main/java/com/volmit/iris/core/IrisSettings.java
similarity index 97%
rename from src/main/java/com/volmit/iris/core/IrisSettings.java
rename to core/src/main/java/com/volmit/iris/core/IrisSettings.java
index 3d2a381d6..30a7b089d 100644
--- a/src/main/java/com/volmit/iris/core/IrisSettings.java
+++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java
@@ -145,6 +145,8 @@ public static class IrisSettingsPerformance {
@Data
public static class IrisSettingsGeneral {
+ public boolean ignoreBootMode = false;
+ public boolean useIntegratedChunkHandler = false;
public boolean commandSounds = true;
public boolean debug = false;
public boolean disableNMS = false;
@@ -182,6 +184,7 @@ public static class IrisSettingsGenerator {
public static class IrisSettingsStudio {
public boolean studio = true;
public boolean openVSCode = true;
+ public boolean displayTrueHeight = false;
public boolean disableTimeAndWeather = true;
public boolean autoStartDefaultStudio = false;
}
diff --git a/src/main/java/com/volmit/iris/core/ServerConfigurator.java b/core/src/main/java/com/volmit/iris/core/ServerConfigurator.java
similarity index 98%
rename from src/main/java/com/volmit/iris/core/ServerConfigurator.java
rename to core/src/main/java/com/volmit/iris/core/ServerConfigurator.java
index 58a05d43c..98a5fc7be 100644
--- a/src/main/java/com/volmit/iris/core/ServerConfigurator.java
+++ b/core/src/main/java/com/volmit/iris/core/ServerConfigurator.java
@@ -61,13 +61,12 @@ private static void increaseKeepAliveSpigot() throws IOException, InvalidConfigu
long tt = f.getLong("settings.timeout-time");
if (tt < TimeUnit.MINUTES.toSeconds(5)) {
- Iris.warn("Updating spigot.yml timeout-time: " + tt + " -> " + TimeUnit.MINUTES.toSeconds(5) + " (5 minutes)");
+ Iris.warn("Updating spigot.yml timeout-time: " + tt + " -> " + TimeUnit.MINUTES.toSeconds(20) + " (5 minutes)");
Iris.warn("You can disable this change (autoconfigureServer) in Iris settings, then change back the value.");
f.set("settings.timeout-time", TimeUnit.MINUTES.toSeconds(5));
f.save(spigotConfig);
}
}
-
private static void increasePaperWatchdog() throws IOException, InvalidConfigurationException {
File spigotConfig = new File("config/paper-global.yml");
FileConfiguration f = new YamlConfiguration();
@@ -75,7 +74,7 @@ private static void increasePaperWatchdog() throws IOException, InvalidConfigura
long tt = f.getLong("watchdog.early-warning-delay");
if (tt < TimeUnit.MINUTES.toMillis(3)) {
- Iris.warn("Updating paper.yml watchdog early-warning-delay: " + tt + " -> " + TimeUnit.MINUTES.toMillis(3) + " (3 minutes)");
+ Iris.warn("Updating paper.yml watchdog early-warning-delay: " + tt + " -> " + TimeUnit.MINUTES.toMillis(15) + " (3 minutes)");
Iris.warn("You can disable this change (autoconfigureServer) in Iris settings, then change back the value.");
f.set("watchdog.early-warning-delay", TimeUnit.MINUTES.toMillis(3));
f.save(spigotConfig);
diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeepSearch.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeepSearch.java
new file mode 100644
index 000000000..96c91305f
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeepSearch.java
@@ -0,0 +1,134 @@
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2022 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.volmit.iris.core.commands;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.pregenerator.DeepSearchPregenerator;
+import com.volmit.iris.core.pregenerator.PregenTask;
+import com.volmit.iris.core.pregenerator.TurboPregenerator;
+import com.volmit.iris.core.tools.IrisToolbelt;
+import com.volmit.iris.util.data.Dimension;
+import com.volmit.iris.util.decree.DecreeExecutor;
+import com.volmit.iris.util.decree.annotations.Decree;
+import com.volmit.iris.util.decree.annotations.Param;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.math.Position2;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.util.Vector;
+
+import java.io.File;
+import java.io.IOException;
+
+@Decree(name = "DeepSearch", aliases = "search", description = "Pregenerate your Iris worlds!")
+public class CommandDeepSearch implements DecreeExecutor {
+ public String worldName;
+ @Decree(description = "DeepSearch a world")
+ public void start(
+ @Param(description = "The radius of the pregen in blocks", aliases = "size")
+ int radius,
+ @Param(description = "The world to pregen", contextual = true)
+ World world,
+ @Param(aliases = "middle", description = "The center location of the pregen. Use \"me\" for your current location", defaultValue = "0,0")
+ Vector center
+ ) {
+
+ worldName = world.getName();
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File TurboFile = new File(worldDirectory, "DeepSearch.json");
+ if (TurboFile.exists()) {
+ if (DeepSearchPregenerator.getInstance() != null) {
+ sender().sendMessage(C.BLUE + "DeepSearch is already in progress");
+ Iris.info(C.YELLOW + "DeepSearch is already in progress");
+ return;
+ } else {
+ try {
+ TurboFile.delete();
+ } catch (Exception e){
+ Iris.error("Failed to delete the old instance file of DeepSearch!");
+ return;
+ }
+ }
+ }
+
+ try {
+ if (sender().isPlayer() && access() == null) {
+ sender().sendMessage(C.RED + "The engine access for this world is null!");
+ sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example.");
+ }
+
+ DeepSearchPregenerator.DeepSearchJob DeepSearchJob = DeepSearchPregenerator.DeepSearchJob.builder()
+ .world(worldName)
+ .radiusBlocks(radius)
+ .position(0)
+ .build();
+
+ File SearchGenFile = new File(worldDirectory, "DeepSearch.json");
+ DeepSearchPregenerator pregenerator = new DeepSearchPregenerator(DeepSearchJob, SearchGenFile);
+ pregenerator.start();
+
+ String msg = C.GREEN + "DeepSearch started in " + C.GOLD + worldName + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ();
+ sender().sendMessage(msg);
+ Iris.info(msg);
+ } catch (Throwable e) {
+ sender().sendMessage(C.RED + "Epic fail. See console.");
+ Iris.reportError(e);
+ e.printStackTrace();
+ }
+ }
+
+ @Decree(description = "Stop the active DeepSearch task", aliases = "x")
+ public void stop(@Param(aliases = "world", description = "The world to pause") World world) throws IOException {
+ DeepSearchPregenerator DeepSearchInstance = DeepSearchPregenerator.getInstance();
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File turboFile = new File(worldDirectory, "DeepSearch.json");
+
+ if (DeepSearchInstance != null) {
+ DeepSearchInstance.shutdownInstance(world);
+ sender().sendMessage(C.LIGHT_PURPLE + "Closed Turbogen instance for " + world.getName());
+ } else if (turboFile.exists() && turboFile.delete()) {
+ sender().sendMessage(C.LIGHT_PURPLE + "Closed Turbogen instance for " + world.getName());
+ } else if (turboFile.exists()) {
+ Iris.error("Failed to delete the old instance file of Turbo Pregen!");
+ } else {
+ sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop");
+ }
+ }
+
+ @Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"})
+ public void pause(
+ @Param(aliases = "world", description = "The world to pause")
+ World world
+ ) {
+ if (TurboPregenerator.getInstance() != null) {
+ TurboPregenerator.setPausedTurbo(world);
+ sender().sendMessage(C.GREEN + "Paused/unpaused Turbo Pregen, now: " + (TurboPregenerator.isPausedTurbo(world) ? "Paused" : "Running") + ".");
+ } else {
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File TurboFile = new File(worldDirectory, "DeepSearch.json");
+ if (TurboFile.exists()){
+ TurboPregenerator.loadTurboGenerator(world.getName());
+ sender().sendMessage(C.YELLOW + "Started DeepSearch back up!");
+ } else {
+ sender().sendMessage(C.YELLOW + "No active DeepSearch tasks to pause/unpause.");
+ }
+
+ }
+ }
+}
diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java
new file mode 100644
index 000000000..90b80572a
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java
@@ -0,0 +1,168 @@
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2022 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.volmit.iris.core.commands;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.loader.IrisData;
+import com.volmit.iris.core.service.IrisEngineSVC;
+import com.volmit.iris.core.tools.IrisToolbelt;
+import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.util.decree.DecreeExecutor;
+import com.volmit.iris.util.decree.DecreeOrigin;
+import com.volmit.iris.util.decree.annotations.Decree;
+import com.volmit.iris.util.decree.annotations.Param;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.format.Form;
+import com.volmit.iris.util.io.IO;
+import com.volmit.iris.util.mantle.TectonicPlate;
+import com.volmit.iris.util.plugin.VolmitSender;
+import net.jpountz.lz4.LZ4BlockInputStream;
+import net.jpountz.lz4.LZ4BlockOutputStream;
+import net.jpountz.lz4.LZ4FrameInputStream;
+import net.jpountz.lz4.LZ4FrameOutputStream;
+import org.apache.commons.lang.RandomStringUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+
+import java.io.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+@Decree(name = "Developer", origin = DecreeOrigin.BOTH, description = "Iris World Manager", aliases = {"dev"})
+public class CommandDeveloper implements DecreeExecutor {
+
+ @Decree(description = "Get Loaded TectonicPlates Count", origin = DecreeOrigin.BOTH, sync = true)
+ public void EngineStatus(
+ @Param(description = "World")
+ World world
+ ) {
+ if (!IrisToolbelt.isIrisWorld(world)) {
+ sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList()));
+ return;
+ }
+
+ Engine engine = IrisToolbelt.access(world).getEngine();
+ if(engine != null) {
+ long lastUseSize = engine.getMantle().getLastUseMapMemoryUsage();
+
+ Iris.info("-------------------------");
+ Iris.info(C.DARK_PURPLE + "Engine Status");
+ Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + IrisEngineSVC.getTectonicLimit());
+ Iris.info(C.DARK_PURPLE + "Tectonic Loaded Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount());
+ Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getNotClearedLoadedRegions());
+ Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + engine.getMantle().getToUnload());
+ Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration((long) engine.getMantle().getTectonicDuration()));
+ Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize()));
+ Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize));
+ Iris.info("-------------------------");
+ } else {
+ Iris.info(C.RED + "Engine is null!");
+ }
+ }
+ @Decree(description = "Test", origin = DecreeOrigin.BOTH)
+ public void test() {
+ Iris.info("Test Developer CMD Executed");
+ }
+
+ @Decree(description = "Test the compression algorithms")
+ public void compression(
+ @Param(description = "base IrisWorld") World world,
+ @Param(description = "raw TectonicPlate File") String path,
+ @Param(description = "Algorithm to Test") String algorithm,
+ @Param(description = "Amount of Tests") int amount) {
+ if (!IrisToolbelt.isIrisWorld(world)) {
+ sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList()));
+ return;
+ }
+
+ File file = new File(path);
+ if (!file.exists()) return;
+
+ Engine engine = IrisToolbelt.access(world).getEngine();
+ if(engine != null) {
+ int height = engine.getTarget().getHeight();
+ ExecutorService service = Executors.newFixedThreadPool(1);
+ VolmitSender sender = sender();
+ service.submit(() -> {
+ try {
+ DataInputStream raw = new DataInputStream(new FileInputStream(file));
+ TectonicPlate plate = new TectonicPlate(height, raw);
+ raw.close();
+
+ double d1 = 0;
+ double d2 = 0;
+ long size = 0;
+ File folder = new File("tmp");
+ folder.mkdirs();
+ for (int i = 0; i < amount; i++) {
+ File tmp = new File(folder, RandomStringUtils.randomAlphanumeric(10) + "." + algorithm + ".bin");
+ DataOutputStream dos = createOutput(tmp, algorithm);
+ long start = System.currentTimeMillis();
+ plate.write(dos);
+ dos.close();
+ d1 += System.currentTimeMillis() - start;
+ if (size == 0)
+ size = tmp.length();
+ start = System.currentTimeMillis();
+ DataInputStream din = createInput(tmp, algorithm);
+ new TectonicPlate(height, din);
+ din.close();
+ d2 += System.currentTimeMillis() - start;
+ tmp.delete();
+ }
+ IO.delete(folder);
+ sender.sendMessage(algorithm + " is " + Form.fileSize(size) + " big after compression");
+ sender.sendMessage(algorithm + " Took " + d2/amount + "ms to read");
+ sender.sendMessage(algorithm + " Took " + d1/amount + "ms to write");
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ });
+ service.shutdown();
+ } else {
+ Iris.info(C.RED + "Engine is null!");
+ }
+ }
+
+ private DataInputStream createInput(File file, String algorithm) throws Throwable {
+ FileInputStream in = new FileInputStream(file);
+
+ return new DataInputStream(switch (algorithm) {
+ case "gzip" -> new GZIPInputStream(in);
+ case "lz4f" -> new LZ4FrameInputStream(in);
+ case "lz4b" -> new LZ4BlockInputStream(in);
+ default -> throw new IllegalStateException("Unexpected value: " + algorithm);
+ });
+ }
+
+ private DataOutputStream createOutput(File file, String algorithm) throws Throwable {
+ FileOutputStream out = new FileOutputStream(file);
+
+ return new DataOutputStream(switch (algorithm) {
+ case "gzip" -> new GZIPOutputStream(out);
+ case "lz4f" -> new LZ4FrameOutputStream(out);
+ case "lz4b" -> new LZ4BlockOutputStream(out);
+ default -> throw new IllegalStateException("Unexpected value: " + algorithm);
+ });
+ }
+}
+
+
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandEdit.java b/core/src/main/java/com/volmit/iris/core/commands/CommandEdit.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/commands/CommandEdit.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandEdit.java
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandFind.java b/core/src/main/java/com/volmit/iris/core/commands/CommandFind.java
similarity index 75%
rename from src/main/java/com/volmit/iris/core/commands/CommandFind.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandFind.java
index a85728803..d0bd97c68 100644
--- a/src/main/java/com/volmit/iris/core/commands/CommandFind.java
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandFind.java
@@ -34,7 +34,9 @@ public class CommandFind implements DecreeExecutor {
@Decree(description = "Find a biome")
public void biome(
@Param(description = "The biome to look for")
- IrisBiome biome
+ IrisBiome biome,
+ @Param(description = "Should you be teleported", defaultValue = "true")
+ boolean teleport
) {
Engine e = engine();
@@ -43,13 +45,15 @@ public void biome(
return;
}
- e.gotoBiome(biome, player());
+ e.gotoBiome(biome, player(), teleport);
}
@Decree(description = "Find a region")
public void region(
@Param(description = "The region to look for")
- IrisRegion region
+ IrisRegion region,
+ @Param(description = "Should you be teleported", defaultValue = "true")
+ boolean teleport
) {
Engine e = engine();
@@ -58,13 +62,15 @@ public void region(
return;
}
- e.gotoRegion(region, player());
+ e.gotoRegion(region, player(), teleport);
}
@Decree(description = "Find a structure")
public void structure(
@Param(description = "The structure to look for")
- IrisJigsawStructure structure
+ IrisJigsawStructure structure,
+ @Param(description = "Should you be teleported", defaultValue = "true")
+ boolean teleport
) {
Engine e = engine();
@@ -73,13 +79,15 @@ public void structure(
return;
}
- e.gotoJigsaw(structure, player());
+ e.gotoJigsaw(structure, player(), teleport);
}
@Decree(description = "Find a point of interest.")
public void poi(
@Param(description = "The type of PoI to look for.")
- String type
+ String type,
+ @Param(description = "Should you be teleported", defaultValue = "true")
+ boolean teleport
) {
Engine e = engine();
if (e == null) {
@@ -87,13 +95,15 @@ public void poi(
return;
}
- e.gotoPOI(type, player());
+ e.gotoPOI(type, player(), teleport);
}
@Decree(description = "Find an object")
public void object(
@Param(description = "The object to look for", customHandler = ObjectHandler.class)
- String object
+ String object,
+ @Param(description = "Should you be teleported", defaultValue = "true")
+ boolean teleport
) {
Engine e = engine();
@@ -102,6 +112,6 @@ public void object(
return;
}
- e.gotoObject(object, player());
+ e.gotoObject(object, player(), teleport);
}
}
diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java
new file mode 100644
index 000000000..2470d0efa
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java
@@ -0,0 +1,600 @@
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2022 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.volmit.iris.core.commands;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
+import com.volmit.iris.core.loader.IrisData;
+import com.volmit.iris.core.service.StudioSVC;
+import com.volmit.iris.core.tools.IrisBenchmarking;
+import com.volmit.iris.core.tools.IrisToolbelt;
+import com.volmit.iris.engine.object.IrisDimension;
+import com.volmit.iris.core.safeguard.UtilsSFG;
+import com.volmit.iris.engine.object.IrisWorld;
+import com.volmit.iris.engine.platform.BukkitChunkGenerator;
+import com.volmit.iris.engine.platform.DummyChunkGenerator;
+import com.volmit.iris.util.decree.DecreeExecutor;
+import com.volmit.iris.util.decree.DecreeOrigin;
+import com.volmit.iris.util.decree.annotations.Decree;
+import com.volmit.iris.util.decree.annotations.Param;
+import com.volmit.iris.util.decree.specialhandlers.NullablePlayerHandler;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.plugin.VolmitSender;
+import com.volmit.iris.util.scheduling.J;
+import lombok.Getter;
+import org.bukkit.Bukkit;
+import org.bukkit.Difficulty;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import static com.volmit.iris.Iris.service;
+import static com.volmit.iris.core.service.EditSVC.deletingWorld;
+import static com.volmit.iris.core.tools.IrisBenchmarking.inProgress;
+import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode;
+import static com.volmit.iris.core.safeguard.ServerBootSFG.incompatibilities;
+
+@Decree(name = "iris", aliases = {"ir", "irs"}, description = "Basic Command")
+public class CommandIris implements DecreeExecutor {
+ private CommandStudio studio;
+ private CommandPregen pregen;
+ private CommandLazyPregen lazyPregen;
+ private CommandSettings settings;
+ private CommandObject object;
+ private CommandJigsaw jigsaw;
+ private CommandWhat what;
+ private CommandEdit edit;
+ private CommandFind find;
+ private CommandDeveloper developer;
+ private CommandTurboPregen turboPregen;
+
+ public static @Getter String BenchDimension;
+ public static boolean worldCreation = false;
+ String WorldToLoad;
+ String WorldEngine;
+ String worldNameToCheck = "YourWorldName";
+ VolmitSender sender = Iris.getSender();
+
+ @Decree(description = "Create a new world", aliases = {"+", "c"})
+ public void create(
+ @Param(aliases = "world-name", description = "The name of the world to create")
+ String name,
+ @Param(aliases = "dimension", description = "The dimension type to create the world with", defaultValue = "default")
+ IrisDimension type,
+ @Param(description = "The seed to generate the world with", defaultValue = "1337")
+ long seed
+ ) {
+ if(sender() instanceof Player) {
+ if (incompatibilities.get("Multiverse-Core")) {
+ sender().sendMessage(C.RED + "Your server has an incompatibility that may corrupt all worlds on the server if not handled properly.");
+ sender().sendMessage(C.RED + "it is strongly advised for you to take action. see log for full detail");
+ sender().sendMessage(C.RED + "----------------------------------------------------------------");
+ sender().sendMessage(C.RED + "Command ran: /iris create");
+ sender().sendMessage(C.RED + UtilsSFG.MSGIncompatibleWarnings());
+ sender().sendMessage(C.RED + "----------------------------------------------------------------");
+ }
+ if (unstablemode && !incompatibilities.get("Multiverse-Core")) {
+ sender().sendMessage(C.RED + "Your server is experiencing an incompatibility with the Iris plugin.");
+ sender().sendMessage(C.RED + "Please rectify this problem to avoid further complications.");
+ sender().sendMessage(C.RED + "----------------------------------------------------------------");
+ sender().sendMessage(C.RED + "Command ran: /iris create");
+ sender().sendMessage(C.RED + UtilsSFG.MSGIncompatibleWarnings());
+ sender().sendMessage(C.RED + "----------------------------------------------------------------");
+ }
+ }
+ if (name.equals("iris")) {
+ sender().sendMessage(C.RED + "You cannot use the world name \"iris\" for creating worlds as Iris uses this directory for studio worlds.");
+ sender().sendMessage(C.RED + "May we suggest the name \"IrisWorld\" instead?");
+ return;
+ }
+ if (name.equals("Benchmark")) {
+ sender().sendMessage(C.RED + "You cannot use the world name \"Benchmark\" for creating worlds as Iris uses this directory for Benchmarking Packs.");
+ sender().sendMessage(C.RED + "May we suggest the name \"IrisWorld\" instead?");
+ return;
+ }
+
+ if (new File(Bukkit.getWorldContainer(), name).exists()) {
+ sender().sendMessage(C.RED + "That folder already exists!");
+ return;
+ }
+
+ try {
+ worldCreation = true;
+ IrisToolbelt.createWorld()
+ .dimension(type.getLoadKey())
+ .name(name)
+ .seed(seed)
+ .sender(sender())
+ .studio(false)
+ .create();
+ } catch (Throwable e) {
+ sender().sendMessage(C.RED + "Exception raised during creation. See the console for more details.");
+ Iris.error("Exception raised during world creation: " + e.getMessage());
+ Iris.reportError(e);
+ worldCreation = false;
+ return;
+ }
+ worldCreation = false;
+ sender().sendMessage(C.GREEN + "Successfully created your world!");
+ }
+
+ @Decree(description = "Teleport to another world", aliases = {"tp"}, sync = true)
+ public void teleport(
+ @Param(description = "World to teleport to")
+ World world,
+ @Param(description = "Player to teleport", defaultValue = "---", customHandler = NullablePlayerHandler.class)
+ Player player
+ ) {
+ if (player == null && sender().isPlayer())
+ player = sender().player();
+
+ final Player target = player;
+ if (target == null) {
+ sender().sendMessage(C.RED + "The specified player does not exist.");
+ return;
+ }
+
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ target.teleport(world.getSpawnLocation());
+ new VolmitSender(target).sendMessage(C.GREEN + "You have been teleported to " + world.getName() + ".");
+ }
+ }.runTask(Iris.instance);
+ }
+
+ @Decree(description = "Print version information")
+ public void version() {
+ sender().sendMessage(C.GREEN + "Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software");
+ }
+
+ //todo Move to React
+ @Decree(description = "Benchmark your server", origin = DecreeOrigin.CONSOLE)
+ public void serverbenchmark() throws InterruptedException {
+ if(!inProgress) {
+ IrisBenchmarking.runBenchmark();
+ } else {
+ Iris.info(C.RED + "Benchmark already is in progress.");
+ }
+ }
+
+ /*
+ /todo Fix PREGEN
+ @Decree(description = "Benchmark a pack", origin = DecreeOrigin.CONSOLE)
+ public void packbenchmark(
+ @Param(description = "Dimension to benchmark")
+ IrisDimension type
+ ) throws InterruptedException {
+
+ BenchDimension = type.getLoadKey();
+
+ IrisPackBenchmarking.runBenchmark();
+ } */
+
+ /* /todo Different approach this feels useless atm
+ @Decree(description = "Check for instabilities", origin = DecreeOrigin.CONSOLE)
+ public void fixunstable() throws InterruptedException {
+ if (unstablemode){
+ sender().sendMessage(C.RED + "Incompatibilities are posted in console..");
+
+ Iris.info(C.RED + "Your server is experiencing an incompatibility with the Iris plugin.");
+ Iris.info(C.RED + "Please rectify this problem to avoid further complications.");
+ Iris.info(C.RED + "----------------------------------------------------------------");
+ Iris.info(C.RED + "Command ran: /iris fixunstable");
+ UtilsSFG.printIncompatibleWarnings();
+ Iris.info(C.RED + "----------------------------------------------------------------");
+ } else {
+ Iris.info(C.BLUE + "Iris is running stable..");
+ sender().sendMessage("Iris is running stable..");
+ }
+ } */
+
+ @Decree(description = "Print world height information", origin = DecreeOrigin.PLAYER)
+ public void height() {
+ sender().sendMessage(C.GREEN + "" + sender().player().getWorld().getMinHeight() + " to " + sender().player().getWorld().getMaxHeight());
+ sender().sendMessage(C.GREEN + "Total Height: " + (sender().player().getWorld().getMaxHeight() - sender().player().getWorld().getMinHeight()));
+ }
+
+ @Decree(description = "QOL command to open a overworld studio world.", sync = true)
+ public void so() {
+ sender().sendMessage(C.GREEN + "Opening studio for the \"Overworld\" pack (seed: 1337)");
+ Iris.service(StudioSVC.class).open(sender(), 1337, "overworld");
+ }
+
+ @Decree(description = "Remove an Iris world", aliases = {"del", "rm", "delete"}, sync = true)
+ public void remove(
+ @Param(description = "The world to remove")
+ World world,
+ @Param(description = "Whether to also remove the folder (if set to false, just does not load the world)", defaultValue = "true")
+ boolean delete
+ ) {
+ if (!IrisToolbelt.isIrisWorld(world)) {
+ sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList()));
+ return;
+ }
+ sender().sendMessage(C.GREEN + "Removing world: " + world.getName());
+ try {
+ if (IrisToolbelt.removeWorld(world)) {
+ sender().sendMessage(C.GREEN + "Successfully removed " + world.getName() + " from bukkit.yml");
+ } else {
+ sender().sendMessage(C.YELLOW + "Looks like the world was already removed from bukkit.yml");
+ }
+ } catch (IOException e) {
+ sender().sendMessage(C.RED + "Failed to save bukkit.yml because of " + e.getMessage());
+ e.printStackTrace();
+ }
+ IrisToolbelt.evacuate(world, "Deleting world");
+ deletingWorld = true;
+ Bukkit.unloadWorld(world, false);
+ int retries = 12;
+ if (delete) {
+ if (deleteDirectory(world.getWorldFolder())) {
+ sender().sendMessage(C.GREEN + "Successfully removed world folder");
+ } else {
+ while(true){
+ if (deleteDirectory(world.getWorldFolder())){
+ sender().sendMessage(C.GREEN + "Successfully removed world folder");
+ break;
+ }
+ retries--;
+ if (retries == 0){
+ sender().sendMessage(C.RED + "Failed to remove world folder");
+ break;
+ }
+ J.sleep(3000);
+ }
+ }
+ }
+ deletingWorld = false;
+ }
+
+ public static boolean deleteDirectory(File dir) {
+ if (dir.isDirectory()) {
+ File[] children = dir.listFiles();
+ for (int i = 0; i < children.length; i++) {
+ boolean success = deleteDirectory(children[i]);
+ if (!success) {
+ return false;
+ }
+ }
+ }
+ return dir.delete();
+ }
+
+ @Decree(description = "Set aura spins")
+ public void aura(
+ @Param(description = "The h color value", defaultValue = "-20")
+ int h,
+ @Param(description = "The s color value", defaultValue = "7")
+ int s,
+ @Param(description = "The b color value", defaultValue = "8")
+ int b
+ ) {
+ IrisSettings.get().getGeneral().setSpinh(h);
+ IrisSettings.get().getGeneral().setSpins(s);
+ IrisSettings.get().getGeneral().setSpinb(b);
+ IrisSettings.get().forceSave();
+ sender().sendMessage("Aura Spins updated to " + h + " " + s + " " + b);
+ }
+
+ @Decree(description = "Bitwise calculations")
+ public void bitwise(
+ @Param(description = "The first value to run calculations on")
+ int value1,
+ @Param(description = "The operator: | & ^ ≺≺ ≻≻ %")
+ String operator,
+ @Param(description = "The second value to run calculations on")
+ int value2
+ ) {
+ Integer v = null;
+ switch (operator) {
+ case "|" -> v = value1 | value2;
+ case "&" -> v = value1 & value2;
+ case "^" -> v = value1 ^ value2;
+ case "%" -> v = value1 % value2;
+ case ">>" -> v = value1 >> value2;
+ case "<<" -> v = value1 << value2;
+ }
+ if (v == null) {
+ sender().sendMessage(C.RED + "The operator you entered: (" + operator + ") is invalid!");
+ return;
+ }
+ sender().sendMessage(C.GREEN + "" + value1 + " " + C.GREEN + operator.replaceAll("<", "≺").replaceAll(">", "≻").replaceAll("%", "%") + " " + C.GREEN + value2 + C.GREEN + " returns " + C.GREEN + v);
+ }
+
+ @Decree(description = "Toggle debug")
+ public void debug(
+ @Param(name = "on", description = "Whether or not debug should be on", defaultValue = "other")
+ Boolean on
+ ) {
+ boolean to = on == null ? !IrisSettings.get().getGeneral().isDebug() : on;
+ IrisSettings.get().getGeneral().setDebug(to);
+ IrisSettings.get().forceSave();
+ sender().sendMessage(C.GREEN + "Set debug to: " + to);
+ }
+
+ @Decree(description = "Download a project.", aliases = "dl")
+ public void download(
+ @Param(name = "pack", description = "The pack to download", defaultValue = "overworld", aliases = "project")
+ String pack,
+ @Param(name = "branch", description = "The branch to download from", defaultValue = "main")
+ String branch,
+ @Param(name = "trim", description = "Whether or not to download a trimmed version (do not enable when editing)", defaultValue = "false")
+ boolean trim,
+ @Param(name = "overwrite", description = "Whether or not to overwrite the pack with the downloaded one", aliases = "force", defaultValue = "false")
+ boolean overwrite
+ ) {
+ sender().sendMessage(C.GREEN + "Downloading pack: " + pack + "/" + branch + (trim ? " trimmed" : "") + (overwrite ? " overwriting" : ""));
+ if (pack.equals("overworld")) {
+ String url = "https://github.com/IrisDimensions/overworld/releases/download/" + Iris.OVERWORLD_TAG + "/overworld.zip";
+ Iris.service(StudioSVC.class).downloadRelease(sender(), url, trim, overwrite);
+ } else {
+ Iris.service(StudioSVC.class).downloadSearch(sender(), "IrisDimensions/" + pack + "/" + branch, trim, overwrite);
+ }
+ }
+
+ @Decree(description = "Get metrics for your world", aliases = "measure", origin = DecreeOrigin.PLAYER)
+ public void metrics() {
+ if (!IrisToolbelt.isIrisWorld(world())) {
+ sender().sendMessage(C.RED + "You must be in an Iris world");
+ return;
+ }
+ sender().sendMessage(C.GREEN + "Sending metrics...");
+ engine().printMetrics(sender());
+ }
+
+ @Decree(description = "Reload configuration file (this is also done automatically)")
+ public void reload() {
+ IrisSettings.invalidate();
+ IrisSettings.get();
+ sender().sendMessage(C.GREEN + "Hotloaded settings");
+ }
+
+ @Decree(description = "Update the pack of a world (UNSAFE!)", name = "^world", aliases = "update-world")
+ public void updateWorld(
+ @Param(description = "The world to update", contextual = true)
+ World world,
+ @Param(description = "The pack to install into the world", contextual = true, aliases = "dimension")
+ IrisDimension pack,
+ @Param(description = "Make sure to make a backup & read the warnings first!", defaultValue = "false", aliases = "c")
+ boolean confirm,
+ @Param(description = "Should Iris download the pack again for you", defaultValue = "false", name = "fresh-download", aliases = {"fresh", "new"})
+ boolean freshDownload
+ ) {
+ if (!confirm) {
+ sender().sendMessage(new String[]{
+ C.RED + "You should always make a backup before using this",
+ C.YELLOW + "Issues caused by this can be, but are not limited to:",
+ C.YELLOW + " - Broken chunks (cut-offs) between old and new chunks (before & after the update)",
+ C.YELLOW + " - Regenerated chunks that do not fit in with the old chunks",
+ C.YELLOW + " - Structures not spawning again when regenerating",
+ C.YELLOW + " - Caves not lining up",
+ C.YELLOW + " - Terrain layers not lining up",
+ C.RED + "Now that you are aware of the risks, and have made a back-up:",
+ C.RED + "/iris ^world " + world.getName() + " " + pack.getLoadKey() + " confirm=true"
+ });
+ return;
+ }
+
+ File folder = world.getWorldFolder();
+ folder.mkdirs();
+
+ if (freshDownload) {
+ Iris.service(StudioSVC.class).downloadSearch(sender(), pack.getLoadKey(), false, true);
+ }
+
+ Iris.service(StudioSVC.class).installIntoWorld(sender(), pack.getLoadKey(), folder);
+ }
+
+ @Decree(description = "Unload an Iris World", origin = DecreeOrigin.PLAYER, sync = true)
+ public void unloadWorld(
+ @Param(description = "The world to unload")
+ World world
+ ) {
+ if (!IrisToolbelt.isIrisWorld(world)) {
+ sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList()));
+ return;
+ }
+ sender().sendMessage(C.GREEN + "Unloading world: " + world.getName());
+ try {
+ IrisToolbelt.evacuate(world);
+ Bukkit.unloadWorld(world, false);
+ sender().sendMessage(C.GREEN + "World unloaded successfully.");
+ } catch (Exception e) {
+ sender().sendMessage(C.RED + "Failed to unload the world: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ @Decree(description = "Load an Iris World", origin = DecreeOrigin.PLAYER, sync = true, aliases = {"import"})
+ public void loadWorld(
+ @Param(description = "The name of the world to load")
+ String world
+ ) {
+ World worldloaded = Bukkit.getWorld(world);
+ worldNameToCheck = world;
+ boolean worldExists = doesWorldExist(worldNameToCheck);
+ WorldEngine = world;
+
+ if (!worldExists) {
+ sender().sendMessage(C.YELLOW + world + " Doesnt exist on the server.");
+ return;
+ }
+ WorldToLoad = world;
+ File BUKKIT_YML = new File("bukkit.yml");
+ String pathtodim = world + "\\iris\\pack\\dimensions\\";
+ File directory = new File(Bukkit.getWorldContainer(), pathtodim);
+
+ String dimension = null;
+ if (directory.exists() && directory.isDirectory()) {
+ File[] files = directory.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ if (file.isFile()) {
+ String fileName = file.getName();
+ if (fileName.endsWith(".json")) {
+ dimension = fileName.substring(0, fileName.length() - 5);
+ sender().sendMessage(C.BLUE + "Generator: " + dimension);
+ }
+ }
+ }
+ }
+ } else {
+ sender().sendMessage(C.GOLD + world + " is not an iris world.");
+ return;
+ }
+ sender().sendMessage(C.GREEN + "Loading world: " + world);
+
+ YamlConfiguration yml = YamlConfiguration.loadConfiguration(BUKKIT_YML);
+ String gen = "Iris:" + dimension;
+ ConfigurationSection section = yml.contains("worlds") ? yml.getConfigurationSection("worlds") : yml.createSection("worlds");
+ if (!section.contains(world)) {
+ section.createSection(world).set("generator", gen);
+ try {
+ yml.save(BUKKIT_YML);
+ Iris.info("Registered \"" + world + "\" in bukkit.yml");
+ } catch (IOException e) {
+ Iris.error("Failed to update bukkit.yml!");
+ e.printStackTrace();
+ }
+ }
+ checkForBukkitWorlds();
+ sender().sendMessage(C.GREEN + world + " loaded successfully.");
+ }
+ @Decree(description = "Evacuate an iris world", origin = DecreeOrigin.PLAYER, sync = true)
+ public void evacuate(
+ @Param(description = "Evacuate the world")
+ World world
+ ) {
+ if (!IrisToolbelt.isIrisWorld(world)) {
+ sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList()));
+ return;
+ }
+ sender().sendMessage(C.GREEN + "Evacuating world" + world.getName());
+ IrisToolbelt.evacuate(world);
+ }
+
+ boolean doesWorldExist(String worldName) {
+ File worldContainer = Bukkit.getWorldContainer();
+ File worldDirectory = new File(worldContainer, worldName);
+ return worldDirectory.exists() && worldDirectory.isDirectory();
+ }
+ private void checkForBukkitWorlds() {
+ FileConfiguration fc = new YamlConfiguration();
+ try {
+ fc.load(new File("bukkit.yml"));
+ ConfigurationSection section = fc.getConfigurationSection("worlds");
+ if (section == null) {
+ return;
+ }
+
+ List worldsToLoad = Collections.singletonList(WorldToLoad);
+
+ for (String s : section.getKeys(false)) {
+ if (!worldsToLoad.contains(s)) {
+ continue;
+ }
+ ConfigurationSection entry = section.getConfigurationSection(s);
+ if (!entry.contains("generator", true)) {
+ continue;
+ }
+ String generator = entry.getString("generator");
+ if (generator.startsWith("Iris:")) {
+ generator = generator.split("\\Q:\\E")[1];
+ } else if (generator.equalsIgnoreCase("Iris")) {
+ generator = IrisSettings.get().getGenerator().getDefaultWorldType();
+ } else {
+ continue;
+ }
+ Iris.info("2 World: %s | Generator: %s", s, generator);
+ if (Bukkit.getWorlds().stream().anyMatch(w -> w.getName().equals(s))) {
+ continue;
+ }
+ Iris.info(C.LIGHT_PURPLE + "Preparing Spawn for " + s + "' using Iris:" + generator + "...");
+ new WorldCreator(s)
+ .generator(getDefaultWorldGenerator(s, generator))
+ .environment(IrisData.loadAnyDimension(generator).getEnvironment())
+ .createWorld();
+ Iris.info(C.LIGHT_PURPLE + "Loaded " + s + "!");
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
+ Iris.debug("Default World Generator Called for " + worldName + " using ID: " + id);
+ if (worldName.equals("test")) {
+ try {
+ throw new RuntimeException();
+ } catch (Throwable e) {
+ Iris.info(e.getStackTrace()[1].getClassName());
+ if (e.getStackTrace()[1].getClassName().contains("com.onarandombox.MultiverseCore")) {
+ Iris.debug("MVC Test detected, Quick! Send them the dummy!");
+ return new DummyChunkGenerator();
+ }
+ }
+ }
+ IrisDimension dim;
+ if (id == null || id.isEmpty()) {
+ dim = IrisData.loadAnyDimension(IrisSettings.get().getGenerator().getDefaultWorldType());
+ } else {
+ dim = IrisData.loadAnyDimension(id);
+ }
+ Iris.debug("Generator ID: " + id + " requested by bukkit/plugin");
+
+ if (dim == null) {
+ Iris.warn("Unable to find dimension type " + id + " Looking for online packs...");
+
+ service(StudioSVC.class).downloadSearch(new VolmitSender(Bukkit.getConsoleSender()), id, true);
+ dim = IrisData.loadAnyDimension(id);
+
+ if (dim == null) {
+ throw new RuntimeException("Can't find dimension " + id + "!");
+ } else {
+ Iris.info("Resolved missing dimension, proceeding with generation.");
+ }
+ }
+ Iris.debug("Assuming IrisDimension: " + dim.getName());
+ IrisWorld w = IrisWorld.builder()
+ .name(worldName)
+ .seed(1337)
+ .environment(dim.getEnvironment())
+ .worldFolder(new File(Bukkit.getWorldContainer(), worldName))
+ .minHeight(dim.getMinHeight())
+ .maxHeight(dim.getMaxHeight())
+ .build();
+ Iris.debug("Generator Config: " + w.toString());
+ File ff = new File(w.worldFolder(), "iris/pack");
+ if (!ff.exists() || ff.listFiles().length == 0) {
+ ff.mkdirs();
+ service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), ff.getParentFile());
+ }
+ return new BukkitChunkGenerator(w, false, ff, dim.getLoadKey());
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java b/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java
diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java
new file mode 100644
index 000000000..a3d4c622c
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java
@@ -0,0 +1,121 @@
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2022 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.volmit.iris.core.commands;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
+import com.volmit.iris.core.gui.PregeneratorJob;
+import com.volmit.iris.core.pregenerator.LazyPregenerator;
+import com.volmit.iris.core.pregenerator.PregenTask;
+import com.volmit.iris.core.tools.IrisToolbelt;
+import com.volmit.iris.util.decree.DecreeExecutor;
+import com.volmit.iris.util.decree.annotations.Decree;
+import com.volmit.iris.util.decree.annotations.Param;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.math.Position2;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.util.Vector;
+
+import java.io.File;
+import java.io.IOException;
+
+@Decree(name = "lazypregen", aliases = "lazy", description = "Pregenerate your Iris worlds!")
+public class CommandLazyPregen implements DecreeExecutor {
+ public String worldName;
+ @Decree(description = "Pregenerate a world")
+ public void start(
+ @Param(description = "The radius of the pregen in blocks", aliases = "size")
+ int radius,
+ @Param(description = "The world to pregen", contextual = true)
+ World world,
+ @Param(aliases = "middle", description = "The center location of the pregen. Use \"me\" for your current location", defaultValue = "0,0")
+ Vector center,
+ @Param(aliases = "maxcpm", description = "Limit the chunks per minute the pregen will generate", defaultValue = "999999999")
+ int cpm,
+ @Param(aliases = "silent", description = "Silent generation", defaultValue = "false")
+ boolean silent
+ ) {
+
+ worldName = world.getName();
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File lazyFile = new File(worldDirectory, "lazygen.json");
+ if (lazyFile.exists()) {
+ sender().sendMessage(C.BLUE + "Lazy pregen is already in progress");
+ Iris.info(C.YELLOW + "Lazy pregen is already in progress");
+ return;
+ }
+
+ try {
+ if (sender().isPlayer() && access() == null) {
+ sender().sendMessage(C.RED + "The engine access for this world is null!");
+ sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example.");
+ }
+
+ LazyPregenerator.LazyPregenJob pregenJob = LazyPregenerator.LazyPregenJob.builder()
+ .world(worldName)
+ .healingPosition(0)
+ .healing(false)
+ .chunksPerMinute(cpm)
+ .radiusBlocks(radius)
+ .position(0)
+ .silent(silent)
+ .build();
+
+ File lazyGenFile = new File(worldDirectory, "lazygen.json");
+ LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, lazyGenFile);
+ pregenerator.start();
+
+ String msg = C.GREEN + "LazyPregen started in " + C.GOLD + worldName + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ();
+ sender().sendMessage(msg);
+ Iris.info(msg);
+ } catch (Throwable e) {
+ sender().sendMessage(C.RED + "Epic fail. See console.");
+ Iris.reportError(e);
+ e.printStackTrace();
+ }
+ }
+
+ @Decree(description = "Stop the active pregeneration task", aliases = "x")
+ public void stop(
+ @Param(aliases = "world", description = "The world to pause")
+ World world
+ ) throws IOException {
+ if (LazyPregenerator.getInstance() != null) {
+ LazyPregenerator.getInstance().shutdownInstance(world);
+ sender().sendMessage(C.LIGHT_PURPLE + "Closed lazygen instance for " + world.getName());
+ } else {
+ sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop");
+ }
+ }
+
+ @Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"})
+ public void pause(
+ @Param(aliases = "world", description = "The world to pause")
+ World world
+ ) {
+ if (LazyPregenerator.getInstance() != null) {
+ LazyPregenerator.getInstance().setPausedLazy(world);
+ sender().sendMessage(C.GREEN + "Paused/unpaused Lazy Pregen, now: " + (LazyPregenerator.getInstance().isPausedLazy(world) ? "Paused" : "Running") + ".");
+ } else {
+ sender().sendMessage(C.YELLOW + "No active Lazy Pregen tasks to pause/unpause.");
+
+ }
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandObject.java b/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java
similarity index 99%
rename from src/main/java/com/volmit/iris/core/commands/CommandObject.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandObject.java
index a0c646a66..ea7f07f7a 100644
--- a/src/main/java/com/volmit/iris/core/commands/CommandObject.java
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java
@@ -341,7 +341,7 @@ public void paste(
}
}
} else {
- sender().sendMessage("Placed " + object);
+ sender().sendMessage(C.IRIS + "Placed " + object);
}
}
@@ -413,7 +413,7 @@ public void undo(
ObjectSVC service = Iris.service(ObjectSVC.class);
int actualReverts = Math.min(service.getUndos().size(), amount);
service.revertChanges(actualReverts);
- sender().sendMessage("Reverted " + actualReverts + " pastes!");
+ sender().sendMessage(C.BLUE + "Reverted " + actualReverts + C.BLUE +" pastes!");
}
@Decree(description = "Gets an object wand and grabs the current WorldEdit selection.", aliases = "we", origin = DecreeOrigin.PLAYER, studio = true)
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java
similarity index 92%
rename from src/main/java/com/volmit/iris/core/commands/CommandPregen.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java
index a221c7e09..73f93091d 100644
--- a/src/main/java/com/volmit/iris/core/commands/CommandPregen.java
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java
@@ -19,7 +19,9 @@
package com.volmit.iris.core.commands;
import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.gui.PregeneratorJob;
+import com.volmit.iris.core.pregenerator.LazyPregenerator;
import com.volmit.iris.core.pregenerator.PregenTask;
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.util.decree.DecreeExecutor;
@@ -27,9 +29,12 @@
import com.volmit.iris.util.decree.annotations.Param;
import com.volmit.iris.util.format.C;
import com.volmit.iris.util.math.Position2;
+import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.util.Vector;
+import java.io.File;
+
@Decree(name = "pregen", aliases = "pregenerate", description = "Pregenerate your Iris worlds!")
public class CommandPregen implements DecreeExecutor {
@Decree(description = "Pregenerate a world")
@@ -40,7 +45,7 @@ public void start(
World world,
@Param(aliases = "middle", description = "The center location of the pregen. Use \"me\" for your current location", defaultValue = "0,0")
Vector center
- ) {
+ ) {
try {
if (sender().isPlayer() && access() == null) {
sender().sendMessage(C.RED + "The engine access for this world is null!");
@@ -50,7 +55,7 @@ public void start(
int w = (radius >> 9 + 1) * 2;
IrisToolbelt.pregenerate(PregenTask
.builder()
- .center(new Position2(center))
+ .center(new Position2(center.getBlockX() >> 9, center.getBlockZ() >> 9))
.width(w)
.height(w)
.build(), world);
@@ -67,7 +72,7 @@ public void start(
@Decree(description = "Stop the active pregeneration task", aliases = "x")
public void stop() {
if (PregeneratorJob.shutdownInstance()) {
- sender().sendMessage(C.GREEN + "Stopped pregeneration task");
+ Iris.info( C.BLUE + "Finishing up mca region...");
} else {
sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop");
}
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandSettings.java b/core/src/main/java/com/volmit/iris/core/commands/CommandSettings.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/commands/CommandSettings.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandSettings.java
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandStudio.java b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java
similarity index 88%
rename from src/main/java/com/volmit/iris/core/commands/CommandStudio.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java
index b080dee01..621915632 100644
--- a/src/main/java/com/volmit/iris/core/commands/CommandStudio.java
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java
@@ -29,9 +29,11 @@
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.object.*;
+import com.volmit.iris.engine.platform.PlatformChunkGenerator;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.collection.KSet;
+import com.volmit.iris.util.decree.DecreeContext;
import com.volmit.iris.util.decree.DecreeExecutor;
import com.volmit.iris.util.decree.DecreeOrigin;
import com.volmit.iris.util.decree.annotations.Decree;
@@ -45,11 +47,17 @@
import com.volmit.iris.util.json.JSONArray;
import com.volmit.iris.util.json.JSONObject;
import com.volmit.iris.util.math.M;
+import com.volmit.iris.util.math.Position2;
import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.math.Spiraler;
import com.volmit.iris.util.noise.CNG;
+import com.volmit.iris.util.parallel.BurstExecutor;
+import com.volmit.iris.util.parallel.MultiBurst;
+import com.volmit.iris.util.plugin.VolmitSender;
+import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.O;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
+import com.volmit.iris.util.scheduling.jobs.QueueJob;
import io.papermc.lib.PaperLib;
import org.bukkit.*;
import org.bukkit.event.inventory.InventoryType;
@@ -67,12 +75,16 @@
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.Objects;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
@Decree(name = "studio", aliases = {"std", "s"}, description = "Studio Commands", studio = true)
public class CommandStudio implements DecreeExecutor {
private CommandFind find;
private CommandEdit edit;
+ private CommandDeepSearch deepSearch;
public static String hrf(Duration duration) {
return duration.toString().substring(2).replaceAll("(\\d[HMS])(?!$)", "$1 ").toLowerCase();
@@ -143,6 +155,77 @@ public void version(
sender().sendMessage(C.GREEN + "The \"" + dimension.getName() + "\" pack has version: " + dimension.getVersion());
}
+ @Decree(name = "regen", description = "Regenerate nearby chunks.", aliases = "rg", sync = true, origin = DecreeOrigin.PLAYER)
+ public void regen(
+ @Param(name = "radius", description = "The radius of nearby cunks", defaultValue = "5")
+ int radius
+ ) {
+ if (IrisToolbelt.isIrisWorld(player().getWorld())) {
+ VolmitSender sender = sender();
+ J.a(() -> {
+ DecreeContext.touch(sender);
+ PlatformChunkGenerator plat = IrisToolbelt.access(player().getWorld());
+ Engine engine = plat.getEngine();
+ try {
+ Chunk cx = player().getLocation().getChunk();
+ KList js = new KList<>();
+ BurstExecutor b = MultiBurst.burst.burst();
+ b.setMulticore(false);
+ int rad = engine.getMantle().getRealRadius();
+ for (int i = -(radius + rad); i <= radius + rad; i++) {
+ for (int j = -(radius + rad); j <= radius + rad; j++) {
+ engine.getMantle().getMantle().deleteChunk(i + cx.getX(), j + cx.getZ());
+ }
+ }
+
+ for (int i = -radius; i <= radius; i++) {
+ for (int j = -radius; j <= radius; j++) {
+ int finalJ = j;
+ int finalI = i;
+ b.queue(() -> plat.injectChunkReplacement(player().getWorld(), finalI + cx.getX(), finalJ + cx.getZ(), (f) -> {
+ synchronized (js) {
+ js.add(f);
+ }
+ }));
+ }
+ }
+
+ b.complete();
+ sender().sendMessage(C.GREEN + "Regenerating " + Form.f(js.size()) + " Sections");
+ QueueJob r = new QueueJob<>() {
+ final KList> futures = new KList<>();
+
+ @Override
+ public void execute(Runnable runnable) {
+ futures.add(J.sfut(runnable));
+
+ if (futures.size() > 64) {
+ while (futures.isNotEmpty()) {
+ try {
+ futures.remove(0).get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Regenerating";
+ }
+ };
+ r.queue(js);
+ r.execute(sender());
+ } catch (Throwable e) {
+ sender().sendMessage("Unable to parse view-distance");
+ }
+ });
+ } else {
+ sender().sendMessage(C.RED + "You must be in an Iris World to use regen!");
+ }
+ }
+
@Decree(description = "Convert objects in the \"convert\" folder")
public void convert() {
Iris.service(ConversionSVC.class).check(sender());
@@ -281,6 +364,7 @@ public void profile(
@Param(description = "The dimension to profile", contextual = true, defaultValue = "default")
IrisDimension dimension
) {
+ // Todo: Make this more accurate
File pack = dimension.getLoadFile().getParentFile().getParentFile();
File report = Iris.instance.getDataFile("profile.txt");
IrisProject project = new IrisProject(pack);
diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandTurboPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandTurboPregen.java
new file mode 100644
index 000000000..2e85de859
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/commands/CommandTurboPregen.java
@@ -0,0 +1,131 @@
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2022 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.volmit.iris.core.commands;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.pregenerator.LazyPregenerator;
+import com.volmit.iris.core.pregenerator.TurboPregenerator;
+import com.volmit.iris.core.pregenerator.TurboPregenerator;
+import com.volmit.iris.util.decree.DecreeExecutor;
+import com.volmit.iris.util.decree.annotations.Decree;
+import com.volmit.iris.util.decree.annotations.Param;
+import com.volmit.iris.util.format.C;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.util.Vector;
+
+import java.io.File;
+import java.io.IOException;
+
+@Decree(name = "turbopregen", aliases = "turbo", description = "Pregenerate your Iris worlds!")
+public class CommandTurboPregen implements DecreeExecutor {
+ public String worldName;
+ @Decree(description = "Pregenerate a world")
+ public void start(
+ @Param(description = "The radius of the pregen in blocks", aliases = "size")
+ int radius,
+ @Param(description = "The world to pregen", contextual = true)
+ World world,
+ @Param(aliases = "middle", description = "The center location of the pregen. Use \"me\" for your current location", defaultValue = "0,0")
+ Vector center
+ ) {
+
+ worldName = world.getName();
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File TurboFile = new File(worldDirectory, "Turbogen.json");
+ if (TurboFile.exists()) {
+ if (TurboPregenerator.getInstance() != null) {
+ sender().sendMessage(C.BLUE + "Turbo pregen is already in progress");
+ Iris.info(C.YELLOW + "Turbo pregen is already in progress");
+ return;
+ } else {
+ try {
+ TurboFile.delete();
+ } catch (Exception e){
+ Iris.error("Failed to delete the old instance file of Turbo Pregen!");
+ return;
+ }
+ }
+ }
+
+ try {
+ if (sender().isPlayer() && access() == null) {
+ sender().sendMessage(C.RED + "The engine access for this world is null!");
+ sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example.");
+ }
+
+ TurboPregenerator.TurboPregenJob pregenJob = TurboPregenerator.TurboPregenJob.builder()
+ .world(worldName)
+ .radiusBlocks(radius)
+ .position(0)
+ .build();
+
+ File TurboGenFile = new File(worldDirectory, "turbogen.json");
+ TurboPregenerator pregenerator = new TurboPregenerator(pregenJob, TurboGenFile);
+ pregenerator.start();
+
+ String msg = C.GREEN + "TurboPregen started in " + C.GOLD + worldName + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ();
+ sender().sendMessage(msg);
+ Iris.info(msg);
+ } catch (Throwable e) {
+ sender().sendMessage(C.RED + "Epic fail. See console.");
+ Iris.reportError(e);
+ e.printStackTrace();
+ }
+ }
+
+ @Decree(description = "Stop the active pregeneration task", aliases = "x")
+ public void stop(@Param(aliases = "world", description = "The world to pause") World world) throws IOException {
+ TurboPregenerator turboPregenInstance = TurboPregenerator.getInstance();
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File turboFile = new File(worldDirectory, "turbogen.json");
+
+ if (turboPregenInstance != null) {
+ turboPregenInstance.shutdownInstance(world);
+ sender().sendMessage(C.LIGHT_PURPLE + "Closed Turbogen instance for " + world.getName());
+ } else if (turboFile.exists() && turboFile.delete()) {
+ sender().sendMessage(C.LIGHT_PURPLE + "Closed Turbogen instance for " + world.getName());
+ } else if (turboFile.exists()) {
+ Iris.error("Failed to delete the old instance file of Turbo Pregen!");
+ } else {
+ sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop");
+ }
+ }
+
+ @Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"})
+ public void pause(
+ @Param(aliases = "world", description = "The world to pause")
+ World world
+ ) {
+ if (TurboPregenerator.getInstance() != null) {
+ TurboPregenerator.setPausedTurbo(world);
+ sender().sendMessage(C.GREEN + "Paused/unpaused Turbo Pregen, now: " + (TurboPregenerator.isPausedTurbo(world) ? "Paused" : "Running") + ".");
+ } else {
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File TurboFile = new File(worldDirectory, "turbogen.json");
+ if (TurboFile.exists()){
+ TurboPregenerator.loadTurboGenerator(world.getName());
+ sender().sendMessage(C.YELLOW + "Started Turbo Pregen back up!");
+ } else {
+ sender().sendMessage(C.YELLOW + "No active Turbo Pregen tasks to pause/unpause.");
+ }
+
+ }
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/commands/CommandWhat.java b/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/commands/CommandWhat.java
rename to core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java
diff --git a/src/main/java/com/volmit/iris/core/edit/BlockEditor.java b/core/src/main/java/com/volmit/iris/core/edit/BlockEditor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/edit/BlockEditor.java
rename to core/src/main/java/com/volmit/iris/core/edit/BlockEditor.java
diff --git a/src/main/java/com/volmit/iris/core/edit/BlockSignal.java b/core/src/main/java/com/volmit/iris/core/edit/BlockSignal.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/edit/BlockSignal.java
rename to core/src/main/java/com/volmit/iris/core/edit/BlockSignal.java
diff --git a/src/main/java/com/volmit/iris/core/edit/BukkitBlockEditor.java b/core/src/main/java/com/volmit/iris/core/edit/BukkitBlockEditor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/edit/BukkitBlockEditor.java
rename to core/src/main/java/com/volmit/iris/core/edit/BukkitBlockEditor.java
diff --git a/src/main/java/com/volmit/iris/core/edit/DustRevealer.java b/core/src/main/java/com/volmit/iris/core/edit/DustRevealer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/edit/DustRevealer.java
rename to core/src/main/java/com/volmit/iris/core/edit/DustRevealer.java
diff --git a/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java b/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/edit/JigsawEditor.java
rename to core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java
diff --git a/src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java b/core/src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java
rename to core/src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java
diff --git a/src/main/java/com/volmit/iris/core/events/IrisEngineHotloadEvent.java b/core/src/main/java/com/volmit/iris/core/events/IrisEngineHotloadEvent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/events/IrisEngineHotloadEvent.java
rename to core/src/main/java/com/volmit/iris/core/events/IrisEngineHotloadEvent.java
diff --git a/src/main/java/com/volmit/iris/core/gui/NoiseExplorerGUI.java b/core/src/main/java/com/volmit/iris/core/gui/NoiseExplorerGUI.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/gui/NoiseExplorerGUI.java
rename to core/src/main/java/com/volmit/iris/core/gui/NoiseExplorerGUI.java
diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/core/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java
rename to core/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java
diff --git a/src/main/java/com/volmit/iris/core/gui/VisionGUI.java b/core/src/main/java/com/volmit/iris/core/gui/VisionGUI.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/gui/VisionGUI.java
rename to core/src/main/java/com/volmit/iris/core/gui/VisionGUI.java
diff --git a/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java b/core/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java
rename to core/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java
diff --git a/src/main/java/com/volmit/iris/core/gui/components/RenderType.java b/core/src/main/java/com/volmit/iris/core/gui/components/RenderType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/gui/components/RenderType.java
rename to core/src/main/java/com/volmit/iris/core/gui/components/RenderType.java
diff --git a/src/main/java/com/volmit/iris/core/gui/components/Renderer.java b/core/src/main/java/com/volmit/iris/core/gui/components/Renderer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/gui/components/Renderer.java
rename to core/src/main/java/com/volmit/iris/core/gui/components/Renderer.java
diff --git a/src/main/java/com/volmit/iris/core/gui/components/TileRender.java b/core/src/main/java/com/volmit/iris/core/gui/components/TileRender.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/gui/components/TileRender.java
rename to core/src/main/java/com/volmit/iris/core/gui/components/TileRender.java
diff --git a/src/main/java/com/volmit/iris/core/link/CustomItemsDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/CustomItemsDataProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/link/CustomItemsDataProvider.java
rename to core/src/main/java/com/volmit/iris/core/link/CustomItemsDataProvider.java
diff --git a/core/src/main/java/com/volmit/iris/core/link/ExecutableItemsDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/ExecutableItemsDataProvider.java
new file mode 100644
index 000000000..8112a4595
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/link/ExecutableItemsDataProvider.java
@@ -0,0 +1,58 @@
+package com.volmit.iris.core.link;
+
+import com.ssomar.score.api.executableitems.ExecutableItemsAPI;
+import com.volmit.iris.Iris;
+import com.volmit.iris.util.collection.KList;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.MissingResourceException;
+import java.util.Optional;
+
+public class ExecutableItemsDataProvider extends ExternalDataProvider {
+ public ExecutableItemsDataProvider() {
+ super("ExecutableItems");
+ }
+
+ @Override
+ public void init() {
+ Iris.info("Setting up ExecutableItems Link...");
+ }
+
+ @Override
+ public BlockData getBlockData(Identifier blockId) throws MissingResourceException {
+ throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key());
+ }
+
+ @Override
+ public ItemStack getItemStack(Identifier itemId) throws MissingResourceException {
+ return ExecutableItemsAPI.getExecutableItemsManager().getExecutableItem(itemId.key())
+ .map(item -> item.buildItem(1, Optional.empty()))
+ .orElseThrow(() -> new MissingResourceException("Failed to find ItemData!", itemId.namespace(), itemId.key()));
+ }
+
+ @Override
+ public Identifier[] getBlockTypes() {
+ return new Identifier[0];
+ }
+
+ @Override
+ public Identifier[] getItemTypes() {
+ KList names = new KList<>();
+ for (String name : ExecutableItemsAPI.getExecutableItemsManager().getExecutableItemIdsList()) {
+ try {
+ Identifier key = new Identifier("executable_items", name);
+ if (getItemStack(key) != null)
+ names.add(key);
+ } catch (MissingResourceException ignored) {
+ }
+ }
+
+ return names.toArray(new Identifier[0]);
+ }
+
+ @Override
+ public boolean isValidProvider(Identifier key, boolean isItem) {
+ return key.namespace().equalsIgnoreCase("executable_items") && isItem;
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java
rename to core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java
diff --git a/src/main/java/com/volmit/iris/core/link/Identifier.java b/core/src/main/java/com/volmit/iris/core/link/Identifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/link/Identifier.java
rename to core/src/main/java/com/volmit/iris/core/link/Identifier.java
diff --git a/src/main/java/com/volmit/iris/core/link/IrisPapiExpansion.java b/core/src/main/java/com/volmit/iris/core/link/IrisPapiExpansion.java
similarity index 99%
rename from src/main/java/com/volmit/iris/core/link/IrisPapiExpansion.java
rename to core/src/main/java/com/volmit/iris/core/link/IrisPapiExpansion.java
index 33dbb6ce6..666573f14 100644
--- a/src/main/java/com/volmit/iris/core/link/IrisPapiExpansion.java
+++ b/core/src/main/java/com/volmit/iris/core/link/IrisPapiExpansion.java
@@ -46,7 +46,7 @@ public class IrisPapiExpansion extends PlaceholderExpansion {
@Override
public boolean persist() {
- return false;
+ return true;
}
@Override
diff --git a/src/main/java/com/volmit/iris/core/link/ItemAdderDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/ItemAdderDataProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/link/ItemAdderDataProvider.java
rename to core/src/main/java/com/volmit/iris/core/link/ItemAdderDataProvider.java
diff --git a/src/main/java/com/volmit/iris/core/link/MultiverseCoreLink.java b/core/src/main/java/com/volmit/iris/core/link/MultiverseCoreLink.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/link/MultiverseCoreLink.java
rename to core/src/main/java/com/volmit/iris/core/link/MultiverseCoreLink.java
diff --git a/src/main/java/com/volmit/iris/core/link/MythicMobsLink.java b/core/src/main/java/com/volmit/iris/core/link/MythicMobsLink.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/link/MythicMobsLink.java
rename to core/src/main/java/com/volmit/iris/core/link/MythicMobsLink.java
diff --git a/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java
rename to core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java
diff --git a/src/main/java/com/volmit/iris/core/link/WorldEditLink.java b/core/src/main/java/com/volmit/iris/core/link/WorldEditLink.java
similarity index 86%
rename from src/main/java/com/volmit/iris/core/link/WorldEditLink.java
rename to core/src/main/java/com/volmit/iris/core/link/WorldEditLink.java
index 365797e38..168b8c066 100644
--- a/src/main/java/com/volmit/iris/core/link/WorldEditLink.java
+++ b/core/src/main/java/com/volmit/iris/core/link/WorldEditLink.java
@@ -1,11 +1,17 @@
package com.volmit.iris.core.link;
import com.volmit.iris.util.data.Cuboid;
+import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
public class WorldEditLink {
+ private static Boolean enabled = null;
+
public static Cuboid getSelection(Player p) {
+ if (!hasWorldEdit())
+ return null;
+
try {
Object instance = Class.forName("com.sk89q.worldedit.WorldEdit").getDeclaredMethod("getInstance").invoke(null);
Object sessionManager = instance.getClass().getDeclaredMethod("getSessionManager").invoke(instance);
@@ -28,4 +34,10 @@ public static Cuboid getSelection(Player p) {
}
return null;
}
+
+ public static boolean hasWorldEdit() {
+ if (enabled == null)
+ enabled = Bukkit.getPluginManager().isPluginEnabled("WorldEdit");
+ return enabled;
+ }
}
diff --git a/src/main/java/com/volmit/iris/core/loader/ImageResourceLoader.java b/core/src/main/java/com/volmit/iris/core/loader/ImageResourceLoader.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/loader/ImageResourceLoader.java
rename to core/src/main/java/com/volmit/iris/core/loader/ImageResourceLoader.java
diff --git a/src/main/java/com/volmit/iris/core/loader/IrisData.java b/core/src/main/java/com/volmit/iris/core/loader/IrisData.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/loader/IrisData.java
rename to core/src/main/java/com/volmit/iris/core/loader/IrisData.java
diff --git a/src/main/java/com/volmit/iris/core/loader/IrisRegistrant.java b/core/src/main/java/com/volmit/iris/core/loader/IrisRegistrant.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/loader/IrisRegistrant.java
rename to core/src/main/java/com/volmit/iris/core/loader/IrisRegistrant.java
diff --git a/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java b/core/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java
rename to core/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java
diff --git a/src/main/java/com/volmit/iris/core/loader/ObjectResourceLoader.java b/core/src/main/java/com/volmit/iris/core/loader/ObjectResourceLoader.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/loader/ObjectResourceLoader.java
rename to core/src/main/java/com/volmit/iris/core/loader/ObjectResourceLoader.java
diff --git a/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java b/core/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java
similarity index 99%
rename from src/main/java/com/volmit/iris/core/loader/ResourceLoader.java
rename to core/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java
index 8b4900972..dd0a1b068 100644
--- a/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java
+++ b/core/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java
@@ -40,6 +40,8 @@
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import java.io.*;
import java.util.Locale;
@@ -52,6 +54,8 @@
import java.util.zip.GZIPOutputStream;
@Data
+@EqualsAndHashCode(exclude = "manager")
+@ToString(exclude = "manager")
public class ResourceLoader implements MeteredCache {
public static final AtomicDouble tlt = new AtomicDouble(0);
private static final int CACHE_SIZE = 100000;
diff --git a/src/main/java/com/volmit/iris/core/loader/ScriptResourceLoader.java b/core/src/main/java/com/volmit/iris/core/loader/ScriptResourceLoader.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/loader/ScriptResourceLoader.java
rename to core/src/main/java/com/volmit/iris/core/loader/ScriptResourceLoader.java
diff --git a/src/main/java/com/volmit/iris/core/nms/BiomeBaseInjector.java b/core/src/main/java/com/volmit/iris/core/nms/BiomeBaseInjector.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/nms/BiomeBaseInjector.java
rename to core/src/main/java/com/volmit/iris/core/nms/BiomeBaseInjector.java
diff --git a/src/main/java/com/volmit/iris/core/nms/INMS.java b/core/src/main/java/com/volmit/iris/core/nms/INMS.java
similarity index 77%
rename from src/main/java/com/volmit/iris/core/nms/INMS.java
rename to core/src/main/java/com/volmit/iris/core/nms/INMS.java
index 2274aa23b..dcb5e8dce 100644
--- a/src/main/java/com/volmit/iris/core/nms/INMS.java
+++ b/core/src/main/java/com/volmit/iris/core/nms/INMS.java
@@ -1,77 +1,74 @@
-/*
- * Iris is a World Generator for Minecraft Bukkit Servers
- * Copyright (c) 2022 Arcane Arts (Volmit Software)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package com.volmit.iris.core.nms;
-
-import com.volmit.iris.Iris;
-import com.volmit.iris.core.IrisSettings;
-import com.volmit.iris.core.nms.v20.NMSBinding1_20_1;
-import com.volmit.iris.core.nms.v1X.NMSBinding1X;
-import com.volmit.iris.util.collection.KMap;
-import org.bukkit.Bukkit;
-
-public class INMS {
- //@builder
- private static final KMap> bindings = new KMap>()
- .qput("v1_20_R1", NMSBinding1_20_1.class);
- //@done
- private static final INMSBinding binding = bind();
-
- public static INMSBinding get() {
- return binding;
- }
-
- public static String getNMSTag() {
- if (IrisSettings.get().getGeneral().isDisableNMS()) {
- return "BUKKIT";
- }
-
- try {
- return Bukkit.getServer().getClass().getCanonicalName().split("\\Q.\\E")[3];
- } catch (Throwable e) {
- Iris.reportError(e);
- Iris.error("Failed to determine server nms version!");
- e.printStackTrace();
- }
-
- return "BUKKIT";
- }
-
- private static INMSBinding bind() {
- String code = getNMSTag();
- Iris.info("Locating NMS Binding for " + code);
-
- if (bindings.containsKey(code)) {
- try {
- INMSBinding b = bindings.get(code).getConstructor().newInstance();
- Iris.info("Craftbukkit " + code + " <-> " + b.getClass().getSimpleName() + " Successfully Bound");
-
- return b;
- } catch (Throwable e) {
- Iris.reportError(e);
- e.printStackTrace();
- }
- }
-
- Iris.info("Craftbukkit " + code + " <-> " + NMSBinding1X.class.getSimpleName() + " Successfully Bound");
- Iris.warn("Note: Some features of Iris may not work the same since you are on an unsupported version of Minecraft.");
- Iris.warn("Note: If this is a new version, expect an update soon.");
-
- return new NMSBinding1X();
- }
-}
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2022 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.volmit.iris.core.nms;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
+import com.volmit.iris.core.nms.v1X.NMSBinding1X;
+import org.bukkit.Bukkit;
+
+public class INMS {
+ //@done
+ private static final INMSBinding binding = bind();
+
+ public static INMSBinding get() {
+ return binding;
+ }
+
+ public static String getNMSTag() {
+ if (IrisSettings.get().getGeneral().isDisableNMS()) {
+ return "BUKKIT";
+ }
+
+ try {
+ return Bukkit.getServer().getClass().getCanonicalName().split("\\Q.\\E")[3];
+ } catch (Throwable e) {
+ Iris.reportError(e);
+ Iris.error("Failed to determine server nms version!");
+ e.printStackTrace();
+ }
+
+ return "BUKKIT";
+ }
+
+ private static INMSBinding bind() {
+ String code = getNMSTag();
+ Iris.info("Locating NMS Binding for " + code);
+
+ try {
+ Class> clazz = Class.forName("com.volmit.iris.core.nms."+code+".NMSBinding");
+ try {
+ Object b = clazz.getConstructor().newInstance();
+ if (b instanceof INMSBinding binding) {
+ Iris.info("Craftbukkit " + code + " <-> " + b.getClass().getSimpleName() + " Successfully Bound");
+ return binding;
+ }
+ } catch (Throwable e) {
+ Iris.reportError(e);
+ e.printStackTrace();
+ }
+ } catch (ClassNotFoundException|NoClassDefFoundError classNotFoundException) {}
+
+ Iris.info("Craftbukkit " + code + " <-> " + NMSBinding1X.class.getSimpleName() + " Successfully Bound");
+ Iris.warn("Note: Some features of Iris may not work the same since you are on an unsupported version of Minecraft.");
+ Iris.warn("Note: If this is a new version, expect an update soon.");
+
+ return new NMSBinding1X();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java
similarity index 82%
rename from src/main/java/com/volmit/iris/core/nms/INMSBinding.java
rename to core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java
index 0f8f0e44a..270a04504 100644
--- a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java
+++ b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java
@@ -18,6 +18,9 @@
package com.volmit.iris.core.nms;
+import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.util.collection.KList;
+import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess;
@@ -27,8 +30,10 @@
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.block.Biome;
+import org.bukkit.entity.Dolphin;
import org.bukkit.entity.Entity;
import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.inventory.ItemStack;
public interface INMSBinding {
boolean hasTile(Location l);
@@ -67,6 +72,8 @@ public interface INMSBinding {
Object getBiomeBase(Object registry, Biome biome);
+ KList getBiomes();
+
boolean isBukkit();
int getBiomeId(Biome biome);
@@ -90,4 +97,10 @@ default boolean supportsDataPacks() {
MCAPaletteAccess createPalette();
void injectBiomesFromMantle(Chunk e, Mantle mantle);
+
+ ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException;
+
+ void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos);
+
+ void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException;
}
diff --git a/core/src/main/java/com/volmit/iris/core/nms/container/BlockPos.java b/core/src/main/java/com/volmit/iris/core/nms/container/BlockPos.java
new file mode 100644
index 000000000..80a496be7
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/nms/container/BlockPos.java
@@ -0,0 +1,14 @@
+package com.volmit.iris.core.nms.container;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BlockPos {
+ private int x;
+ private int y;
+ private int z;
+}
diff --git a/core/src/main/java/com/volmit/iris/core/nms/container/Pair.java b/core/src/main/java/com/volmit/iris/core/nms/container/Pair.java
new file mode 100644
index 000000000..140bf0200
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/nms/container/Pair.java
@@ -0,0 +1,13 @@
+package com.volmit.iris.core.nms.container;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Pair {
+ private A a;
+ private B b;
+}
diff --git a/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java
similarity index 85%
rename from src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java
rename to core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java
index c874b5db5..04c95b4ed 100644
--- a/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java
+++ b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java
@@ -20,6 +20,10 @@
import com.volmit.iris.Iris;
import com.volmit.iris.core.nms.INMSBinding;
+import com.volmit.iris.core.nms.container.BlockPos;
+import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.util.collection.KList;
+import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess;
@@ -28,8 +32,10 @@
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Biome;
+import org.bukkit.entity.Dolphin;
import org.bukkit.entity.Entity;
import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.inventory.ItemStack;
public class NMSBinding1X implements INMSBinding {
private static final boolean supportsCustomHeight = testCustomHeight();
@@ -64,6 +70,21 @@ public void injectBiomesFromMantle(Chunk e, Mantle mantle) {
}
+ @Override
+ public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException {
+ return itemStack;
+ }
+
+ @Override
+ public void setTreasurePos(Dolphin dolphin, BlockPos pos) {
+
+ }
+
+ @Override
+ public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException {
+
+ }
+
@Override
public void deserializeTile(CompoundTag s, Location newPosition) {
@@ -143,6 +164,11 @@ public Object getBiomeBase(Object registry, Biome biome) {
return null;
}
+ @Override
+ public KList getBiomes() {
+ return new KList<>(Biome.values()).qdel(Biome.CUSTOM);
+ }
+
@Override
public boolean isBukkit() {
return true;
diff --git a/src/main/java/com/volmit/iris/core/pack/IrisPack.java b/core/src/main/java/com/volmit/iris/core/pack/IrisPack.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pack/IrisPack.java
rename to core/src/main/java/com/volmit/iris/core/pack/IrisPack.java
diff --git a/src/main/java/com/volmit/iris/core/pack/IrisPackRepository.java b/core/src/main/java/com/volmit/iris/core/pack/IrisPackRepository.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pack/IrisPackRepository.java
rename to core/src/main/java/com/volmit/iris/core/pack/IrisPackRepository.java
diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java
new file mode 100644
index 000000000..308ff3b41
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java
@@ -0,0 +1,297 @@
+package com.volmit.iris.core.pregenerator;
+
+import com.google.gson.Gson;
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.tools.IrisToolbelt;
+import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.format.Form;
+import com.volmit.iris.util.io.IO;
+import com.volmit.iris.util.mantle.MantleFlag;
+import com.volmit.iris.util.math.M;
+import com.volmit.iris.util.math.Position2;
+import com.volmit.iris.util.math.RollingSequence;
+import com.volmit.iris.util.math.Spiraler;
+import com.volmit.iris.util.scheduling.ChronoLatch;
+import com.volmit.iris.util.scheduling.J;
+import com.volmit.iris.util.scheduling.PrecisionStopwatch;
+import io.papermc.lib.PaperLib;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.world.WorldUnloadEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class DeepSearchPregenerator extends Thread implements Listener {
+ @Getter
+ private static DeepSearchPregenerator instance;
+ private final DeepSearchJob job;
+ private final File destination;
+ private final int maxPosition;
+ private World world;
+ private final ChronoLatch latch;
+ private static AtomicInteger foundChunks;
+ private final AtomicInteger foundLast;
+ private final AtomicInteger foundTotalChunks;
+ private final AtomicLong startTime;
+ private final RollingSequence chunksPerSecond;
+ private final RollingSequence chunksPerMinute;
+ private final AtomicInteger chunkCachePos;
+ private final AtomicInteger chunkCacheSize;
+ private final AtomicInteger foundCacheLast;
+ private final AtomicInteger foundCache;
+ private LinkedHashMap chunkCache;
+ private final ReentrantLock cacheLock = new ReentrantLock();
+
+ private static final Map jobs = new HashMap<>();
+
+ public DeepSearchPregenerator(DeepSearchJob job, File destination) {
+ this.job = job;
+ this.chunkCacheSize = new AtomicInteger(); // todo
+ this.chunkCachePos = new AtomicInteger(1000);
+ this.foundCacheLast = new AtomicInteger();
+ this.foundCache = new AtomicInteger();
+ this.destination = destination;
+ this.chunkCache = new LinkedHashMap();
+ this.maxPosition = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {
+ }).count();
+ this.world = Bukkit.getWorld(job.getWorld());
+ this.latch = new ChronoLatch(3000);
+ this.startTime = new AtomicLong(M.ms());
+ this.chunksPerSecond = new RollingSequence(10);
+ this.chunksPerMinute = new RollingSequence(10);
+ foundChunks = new AtomicInteger(0);
+ this.foundLast = new AtomicInteger(0);
+ this.foundTotalChunks = new AtomicInteger((int) Math.ceil(Math.pow((2.0 * job.getRadiusBlocks()) / 16, 2)));
+ jobs.put(job.getWorld(), job);
+ DeepSearchPregenerator.instance = this;
+ }
+
+ @EventHandler
+ public void on(WorldUnloadEvent e) {
+ if (e.getWorld().equals(world)) {
+ interrupt();
+ }
+ }
+
+ public void run() {
+ while (!interrupted()) {
+ tick();
+ }
+ try {
+ saveNow();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void tick() {
+ DeepSearchJob job = jobs.get(world.getName());
+ // chunkCache(); //todo finish this
+ if (latch.flip() && !job.paused) {
+ if (cacheLock.isLocked()) {
+
+ Iris.info("DeepFinder: Caching: " + chunkCachePos.get() + " Of " + chunkCacheSize.get());
+ }
+ long eta = computeETA();
+ save();
+ int secondGenerated = foundChunks.get() - foundLast.get();
+ foundLast.set(foundChunks.get());
+ secondGenerated = secondGenerated / 3;
+ chunksPerSecond.put(secondGenerated);
+ chunksPerMinute.put(secondGenerated * 60);
+ Iris.info("deepFinder: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(foundChunks.get()) + " of " + Form.f(foundTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2));
+
+ }
+
+ if (foundChunks.get() >= foundTotalChunks.get()) {
+ Iris.info("Completed DeepSearch!");
+ interrupt();
+ } else {
+ int pos = job.getPosition() + 1;
+ job.setPosition(pos);
+ if (!job.paused) {
+ tickSearch(getChunk(pos));
+ }
+ }
+ }
+
+ private long computeETA() {
+ return (long) ((foundTotalChunks.get() - foundChunks.get()) / chunksPerSecond.getAverage()) * 1000;
+ // todo broken
+ }
+
+ private void chunkCache() {
+ if (chunkCache.isEmpty()) {
+ cacheLock.lock();
+ PrecisionStopwatch p = PrecisionStopwatch.start();
+ executorService.submit(() -> {
+ for (; chunkCacheSize.get() > chunkCachePos.get(); chunkCacheSize.getAndAdd(-1)) {
+ chunkCache.put(chunkCachePos.get(), getChunk(chunkCachePos.get()));
+ chunkCachePos.getAndAdd(1);
+ }
+ Iris.info("Total Time: " + p.getMinutes());
+ });
+ }
+ if (cacheLock.isLocked()) {
+ cacheLock.unlock();
+ }
+ }
+
+ private final ExecutorService executorService = Executors.newSingleThreadExecutor();
+
+ private void tickSearch(Position2 chunk) {
+ executorService.submit(() -> {
+ CountDownLatch latch = new CountDownLatch(1);
+ try {
+ findInChunk(world, chunk.getX(), chunk.getZ());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ Iris.verbose("Generated Async " + chunk);
+ latch.countDown();
+
+ try {
+ latch.await();
+ } catch (InterruptedException ignored) {}
+ foundChunks.addAndGet(1);
+ });
+ }
+
+ private void findInChunk(World world, int x, int z) throws IOException {
+ int xx = x * 16;
+ int zz = z * 16;
+ Engine engine = IrisToolbelt.access(world).getEngine();
+ for (int i = 0; i < 16; i++) {
+ for (int j = 0; j < 16; j++) {
+ int height = engine.getHeight(xx + i, zz + j);
+ if (height > 300) {
+ File found = new File("plugins" + "iris" + "found.txt");
+ FileWriter writer = new FileWriter(found);
+ if (!found.exists()) {
+ found.createNewFile();
+ }
+ Iris.info("Found at! " + x + ", " + z);
+ writer.write("Found at: X: " + xx + " Z: " + zz + ", ");
+ }
+ }
+ }
+ }
+
+ public Position2 getChunk(int position) {
+ int p = -1;
+ AtomicInteger xx = new AtomicInteger();
+ AtomicInteger zz = new AtomicInteger();
+ Spiraler s = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {
+ xx.set(x);
+ zz.set(z);
+ });
+
+ while (s.hasNext() && p++ < position) {
+ s.next();
+ }
+
+ return new Position2(xx.get(), zz.get());
+ }
+
+ public void save() {
+ J.a(() -> {
+ try {
+ saveNow();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ public static void setPausedDeep(World world) {
+ DeepSearchJob job = jobs.get(world.getName());
+ if (isPausedDeep(world)){
+ job.paused = false;
+ } else {
+ job.paused = true;
+ }
+
+ if ( job.paused) {
+ Iris.info(C.BLUE + "DeepSearch: " + C.IRIS + world.getName() + C.BLUE + " Paused");
+ } else {
+ Iris.info(C.BLUE + "DeepSearch: " + C.IRIS + world.getName() + C.BLUE + " Resumed");
+ }
+ }
+
+ public static boolean isPausedDeep(World world) {
+ DeepSearchJob job = jobs.get(world.getName());
+ return job != null && job.isPaused();
+ }
+
+ public void shutdownInstance(World world) throws IOException {
+ Iris.info("DeepSearch: " + C.IRIS + world.getName() + C.BLUE + " Shutting down..");
+ DeepSearchJob job = jobs.get(world.getName());
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File deepFile = new File(worldDirectory, "DeepSearch.json");
+
+ if (job == null) {
+ Iris.error("No DeepSearch job found for world: " + world.getName());
+ return;
+ }
+
+ try {
+ if (!job.isPaused()) {
+ job.setPaused(true);
+ }
+ save();
+ jobs.remove(world.getName());
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ while (deepFile.exists()){
+ deepFile.delete();
+ J.sleep(1000);
+ }
+ Iris.info("DeepSearch: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed.");
+ }
+ }.runTaskLater(Iris.instance, 20L);
+ } catch (Exception e) {
+ Iris.error("Failed to shutdown DeepSearch for " + world.getName());
+ e.printStackTrace();
+ } finally {
+ saveNow();
+ interrupt();
+ }
+ }
+
+
+ public void saveNow() throws IOException {
+ IO.writeAll(this.destination, new Gson().toJson(job));
+ }
+
+ @Data
+ @Builder
+ public static class DeepSearchJob {
+ private String world;
+ @Builder.Default
+ private int radiusBlocks = 5000;
+ @Builder.Default
+ private int position = 0;
+ @Builder.Default
+ boolean paused = false;
+ }
+}
+
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java
similarity index 83%
rename from src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java
index 59c6ed7ed..11128d04a 100644
--- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java
+++ b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java
@@ -19,7 +19,9 @@
package com.volmit.iris.core.pregenerator;
import com.volmit.iris.Iris;
+import com.volmit.iris.core.tools.IrisPackBenchmarking;
import com.volmit.iris.util.collection.KSet;
+import com.volmit.iris.util.format.C;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.math.M;
@@ -28,12 +30,16 @@
import com.volmit.iris.util.scheduling.ChronoLatch;
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.Looper;
+import lombok.Getter;
+import lombok.Setter;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
+import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark;
+
public class IrisPregenerator {
private final PregenTask task;
private final PregeneratorMethod generator;
@@ -44,10 +50,10 @@ public class IrisPregenerator {
private final RollingSequence chunksPerSecond;
private final RollingSequence chunksPerMinute;
private final RollingSequence regionsPerMinute;
- private final AtomicInteger generated;
+ private static AtomicInteger generated;
private final AtomicInteger generatedLast;
private final AtomicInteger generatedLastMinute;
- private final AtomicInteger totalChunks;
+ private static AtomicInteger totalChunks;
private final AtomicLong startTime;
private final ChronoLatch minuteLatch;
private final AtomicReference currentGeneratorMethod;
@@ -56,6 +62,8 @@ public class IrisPregenerator {
private final KSet net;
private final ChronoLatch cl;
private final ChronoLatch saveLatch = new ChronoLatch(30000);
+ static long long_generatedChunks = 0;
+ static long long_totalChunks = 0;
public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) {
this.listener = listenify(listener);
@@ -92,6 +100,8 @@ protected long loop() {
chunksPerMinute.put(minuteGenerated);
regionsPerMinute.put((double) minuteGenerated / 1024D);
}
+ long_generatedChunks = generated.get();
+ long_totalChunks = totalChunks.get();
listener.onTick(chunksPerSecond.getAverage(), chunksPerMinute.getAverage(),
regionsPerMinute.getAverage(),
@@ -102,19 +112,34 @@ protected long loop() {
if (cl.flip()) {
double percentage = ((double) generated.get() / (double) totalChunks.get()) * 100;
- Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2), percentage);
+ if(benchmark) {
+ Iris.info(C.GREEN +"Benchmark: " + C.WHITE + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2), percentage);
+ } else {
+ Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2), percentage);
+ }
}
-
return 1000;
}
};
}
private long computeETA() {
- return (long) ((totalChunks.get() - generated.get()) *
- ((double) (M.ms() - startTime.get()) / (double) generated.get()));
+ return (long) (totalChunks.get() > 1024 ? // Generated chunks exceed 1/8th of total?
+ // If yes, use smooth function (which gets more accurate over time since its less sensitive to outliers)
+ ((totalChunks.get() - generated.get()) * ((double) (M.ms() - startTime.get()) / (double) generated.get())) :
+ // If no, use quick function (which is less accurate over time but responds better to the initial delay)
+ ((totalChunks.get() - generated.get()) / chunksPerSecond.getAverage()) * 1000 //
+ );
+ }
+
+ public static long getLongGeneratedChunks() {
+ return long_generatedChunks;
+ }
+ public static long getLongTotalChunks() {
+ return long_totalChunks;
}
+
public void close() {
shutdown.set(true);
}
@@ -142,7 +167,7 @@ private void shutdown() {
generator.close();
ticker.interrupt();
listener.onClose();
- getMantle().trim(0);
+ getMantle().trim(0, 0);
}
private void visitRegion(int x, int z, boolean regions) {
diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java
new file mode 100644
index 000000000..20e3ace96
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java
@@ -0,0 +1,286 @@
+package com.volmit.iris.core.pregenerator;
+
+import com.google.gson.Gson;
+import com.volmit.iris.Iris;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.format.Form;
+import com.volmit.iris.util.io.IO;
+import com.volmit.iris.util.math.M;
+import com.volmit.iris.util.math.Position2;
+import com.volmit.iris.util.math.RollingSequence;
+import com.volmit.iris.util.math.Spiraler;
+import com.volmit.iris.util.scheduling.ChronoLatch;
+import com.volmit.iris.util.scheduling.J;
+import io.papermc.lib.PaperLib;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.world.WorldUnloadEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class LazyPregenerator extends Thread implements Listener {
+ @Getter
+ private static LazyPregenerator instance;
+ private final LazyPregenJob job;
+ private final File destination;
+ private final int maxPosition;
+ private World world;
+ private final long rate;
+ private final ChronoLatch latch;
+ private static AtomicInteger lazyGeneratedChunks;
+ private final AtomicInteger generatedLast;
+ private final AtomicInteger lazyTotalChunks;
+ private final AtomicLong startTime;
+ private final RollingSequence chunksPerSecond;
+ private final RollingSequence chunksPerMinute;
+
+ private static final Map jobs = new HashMap<>();
+
+ public LazyPregenerator(LazyPregenJob job, File destination) {
+ this.job = job;
+ this.destination = destination;
+ this.maxPosition = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {
+ }).count();
+ this.world = Bukkit.getWorld(job.getWorld());
+ this.rate = Math.round((1D / (job.getChunksPerMinute() / 60D)) * 1000D);
+ this.latch = new ChronoLatch(15000);
+ this.startTime = new AtomicLong(M.ms());
+ this.chunksPerSecond = new RollingSequence(10);
+ this.chunksPerMinute = new RollingSequence(10);
+ lazyGeneratedChunks = new AtomicInteger(0);
+ this.generatedLast = new AtomicInteger(0);
+ this.lazyTotalChunks = new AtomicInteger((int) Math.ceil(Math.pow((2.0 * job.getRadiusBlocks()) / 16, 2)));
+ jobs.put(job.getWorld(), job);
+ LazyPregenerator.instance = this;
+ }
+
+ public LazyPregenerator(File file) throws IOException {
+ this(new Gson().fromJson(IO.readAll(file), LazyPregenJob.class), file);
+ }
+
+ public static void loadLazyGenerators() {
+ for (World i : Bukkit.getWorlds()) {
+ File lazygen = new File(i.getWorldFolder(), "lazygen.json");
+ if (lazygen.exists()) {
+ try {
+ LazyPregenerator p = new LazyPregenerator(lazygen);
+ p.start();
+ Iris.info("Started Lazy Pregenerator: " + p.job);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void on(WorldUnloadEvent e) {
+ if (e.getWorld().equals(world)) {
+ interrupt();
+ }
+ }
+
+ public void run() {
+ while (!interrupted()) {
+ J.sleep(rate);
+ tick();
+ }
+
+ try {
+ saveNow();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void tick() {
+ LazyPregenJob job = jobs.get(world.getName());
+ if (latch.flip() && !job.paused) {
+ long eta = computeETA();
+ save();
+ int secondGenerated = lazyGeneratedChunks.get() - generatedLast.get();
+ generatedLast.set(lazyGeneratedChunks.get());
+ secondGenerated = secondGenerated / 15;
+ chunksPerSecond.put(secondGenerated);
+ chunksPerMinute.put(secondGenerated * 60);
+ if (!job.isSilent()) {
+ Iris.info("LazyGen: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(lazyGeneratedChunks.get()) + " of " + Form.f(lazyTotalChunks.get()) + " " + Form.f((int) chunksPerMinute.getAverage()) + "/m ETA: " + Form.duration((double) eta, 2));
+ }
+ }
+
+ if (lazyGeneratedChunks.get() >= lazyTotalChunks.get()) {
+ if (job.isHealing()) {
+ int pos = (job.getHealingPosition() + 1) % maxPosition;
+ job.setHealingPosition(pos);
+ tickRegenerate(getChunk(pos));
+ } else {
+ Iris.info("Completed Lazy Gen!");
+ interrupt();
+ }
+ } else {
+ int pos = job.getPosition() + 1;
+ job.setPosition(pos);
+ if (!job.paused) {
+ tickGenerate(getChunk(pos));
+ }
+ }
+ }
+
+ private long computeETA() {
+ return (long) ((lazyTotalChunks.get() - lazyGeneratedChunks.get()) / chunksPerMinute.getAverage()) * 1000;
+ // todo broken
+ }
+
+ private final ExecutorService executorService = Executors.newSingleThreadExecutor();
+
+ private void tickGenerate(Position2 chunk) {
+ executorService.submit(() -> {
+ CountDownLatch latch = new CountDownLatch(1);
+ if (PaperLib.isPaper()) {
+ PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true)
+ .thenAccept((i) -> {
+ Iris.verbose("Generated Async " + chunk);
+ latch.countDown();
+ });
+ } else {
+ J.s(() -> {
+ world.getChunkAt(chunk.getX(), chunk.getZ());
+ Iris.verbose("Generated " + chunk);
+ latch.countDown();
+ });
+ }
+ try {
+ latch.await();
+ } catch (InterruptedException ignored) {}
+ lazyGeneratedChunks.addAndGet(1);
+ });
+ }
+
+ private void tickRegenerate(Position2 chunk) {
+ J.s(() -> world.regenerateChunk(chunk.getX(), chunk.getZ()));
+ Iris.verbose("Regenerated " + chunk);
+ }
+
+ public Position2 getChunk(int position) {
+ int p = -1;
+ AtomicInteger xx = new AtomicInteger();
+ AtomicInteger zz = new AtomicInteger();
+ Spiraler s = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {
+ xx.set(x);
+ zz.set(z);
+ });
+
+ while (s.hasNext() && p++ < position) {
+ s.next();
+ }
+
+ return new Position2(xx.get(), zz.get());
+ }
+
+ public void save() {
+ J.a(() -> {
+ try {
+ saveNow();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ public static void setPausedLazy(World world) {
+ LazyPregenJob job = jobs.get(world.getName());
+ if (isPausedLazy(world)){
+ job.paused = false;
+ } else {
+ job.paused = true;
+ }
+
+ if ( job.paused) {
+ Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world.getName() + C.BLUE + " Paused");
+ } else {
+ Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world.getName() + C.BLUE + " Resumed");
+ }
+ }
+
+ public static boolean isPausedLazy(World world) {
+ LazyPregenJob job = jobs.get(world.getName());
+ return job != null && job.isPaused();
+ }
+
+ public void shutdownInstance(World world) throws IOException {
+ Iris.info("LazyGen: " + C.IRIS + world.getName() + C.BLUE + " Shutting down..");
+ LazyPregenJob job = jobs.get(world.getName());
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File lazyFile = new File(worldDirectory, "lazygen.json");
+
+ if (job == null) {
+ Iris.error("No Lazygen job found for world: " + world.getName());
+ return;
+ }
+
+ try {
+ if (!job.isPaused()) {
+ job.setPaused(true);
+ }
+ save();
+ jobs.remove(world.getName());
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ while (lazyFile.exists()){
+ lazyFile.delete();
+ J.sleep(1000);
+ }
+ Iris.info("LazyGen: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed.");
+ }
+ }.runTaskLater(Iris.instance, 20L);
+ } catch (Exception e) {
+ Iris.error("Failed to shutdown Lazygen for " + world.getName());
+ e.printStackTrace();
+ } finally {
+ saveNow();
+ interrupt();
+ }
+ }
+
+
+ public void saveNow() throws IOException {
+ IO.writeAll(this.destination, new Gson().toJson(job));
+ }
+
+ @Data
+ @Builder
+ public static class LazyPregenJob {
+ private String world;
+ @Builder.Default
+ private int healingPosition = 0;
+ @Builder.Default
+ private boolean healing = false;
+ @Builder.Default
+ private int chunksPerMinute = 32;
+ @Builder.Default
+ private int radiusBlocks = 5000;
+ @Builder.Default
+ private int position = 0;
+ @Builder.Default
+ boolean silent = false;
+ @Builder.Default
+ boolean paused = false;
+ }
+}
+
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java b/core/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java b/core/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java b/core/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java
diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/TurboPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/TurboPregenerator.java
new file mode 100644
index 000000000..92b76293a
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/pregenerator/TurboPregenerator.java
@@ -0,0 +1,276 @@
+package com.volmit.iris.core.pregenerator;
+
+import com.google.gson.Gson;
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
+import com.volmit.iris.util.collection.KList;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.format.Form;
+import com.volmit.iris.util.io.IO;
+import com.volmit.iris.util.math.M;
+import com.volmit.iris.util.math.Position2;
+import com.volmit.iris.util.math.RollingSequence;
+import com.volmit.iris.util.math.Spiraler;
+import com.volmit.iris.util.scheduling.ChronoLatch;
+import com.volmit.iris.util.scheduling.J;
+import io.papermc.lib.PaperLib;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.world.WorldUnloadEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class TurboPregenerator extends Thread implements Listener {
+ @Getter
+ private static TurboPregenerator instance;
+ private final TurboPregenJob job;
+ private final File destination;
+ private final int maxPosition;
+ private World world;
+ private final ChronoLatch latch;
+ private static AtomicInteger turboGeneratedChunks;
+ private final AtomicInteger generatedLast;
+ private final AtomicInteger turboTotalChunks;
+ private final AtomicLong startTime;
+ private final RollingSequence chunksPerSecond;
+ private final RollingSequence chunksPerMinute;
+ private KList queue = new KList<>();
+ private AtomicInteger maxWaiting;
+ private static final Map jobs = new HashMap<>();
+
+ public TurboPregenerator(TurboPregenJob job, File destination) {
+ this.job = job;
+ queue = new KList<>(512);
+ this.maxWaiting = new AtomicInteger(128);
+ this.destination = destination;
+ this.maxPosition = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {
+ }).count();
+ this.world = Bukkit.getWorld(job.getWorld());
+ this.latch = new ChronoLatch(3000);
+ this.startTime = new AtomicLong(M.ms());
+ this.chunksPerSecond = new RollingSequence(10);
+ this.chunksPerMinute = new RollingSequence(10);
+ turboGeneratedChunks = new AtomicInteger(0);
+ this.generatedLast = new AtomicInteger(0);
+ this.turboTotalChunks = new AtomicInteger((int) Math.ceil(Math.pow((2.0 * job.getRadiusBlocks()) / 16, 2)));
+ jobs.put(job.getWorld(), job);
+ TurboPregenerator.instance = this;
+ }
+ public TurboPregenerator(File file) throws IOException {
+ this(new Gson().fromJson(IO.readAll(file), TurboPregenerator.TurboPregenJob.class), file);
+ }
+
+ public static void loadTurboGenerator(String i) {
+ World x = Bukkit.getWorld(i);
+ File turbogen = new File(x.getWorldFolder(), "turbogen.json");
+ if (turbogen.exists()) {
+ try {
+ TurboPregenerator p = new TurboPregenerator(turbogen);
+ p.start();
+ Iris.info("Started Turbo Pregenerator: " + p.job);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void on(WorldUnloadEvent e) {
+ if (e.getWorld().equals(world)) {
+ interrupt();
+ }
+ }
+
+ public void run() {
+ while (!interrupted()) {
+ tick();
+ }
+
+ try {
+ saveNow();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void tick() {
+ TurboPregenJob job = jobs.get(world.getName());
+ if (latch.flip() && !job.paused) {
+ long eta = computeETA();
+ save();
+ int secondGenerated = turboGeneratedChunks.get() - generatedLast.get();
+ generatedLast.set(turboGeneratedChunks.get());
+ secondGenerated = secondGenerated / 3;
+ chunksPerSecond.put(secondGenerated);
+ chunksPerMinute.put(secondGenerated * 60);
+ Iris.info("TurboGen: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(turboGeneratedChunks.get()) + " of " + Form.f(turboTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2));
+
+ }
+ if (turboGeneratedChunks.get() >= turboTotalChunks.get()) {
+ Iris.info("Completed Turbo Gen!");
+ interrupt();
+ } else {
+ int pos = job.getPosition() + 1;
+ job.setPosition(pos);
+ if (!job.paused) {
+ if (queue.size() < maxWaiting.get()) {
+ Position2 chunk = getChunk(pos);
+ queue.add(chunk);
+ }
+ waitForChunksPartial();
+ }
+ }
+ }
+
+ private void waitForChunksPartial() {
+ while (!queue.isEmpty() && maxWaiting.get() > queue.size()) {
+ try {
+ for (Position2 c : new KList<>(queue)) {
+ tickGenerate(c);
+ queue.remove(c);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private long computeETA() {
+ return (long) ((turboTotalChunks.get() - turboGeneratedChunks.get()) / chunksPerMinute.getAverage()) * 1000;
+ // todo broken
+ }
+
+ private final ExecutorService executorService = Executors.newFixedThreadPool(10);
+ private void tickGenerate(Position2 chunk) {
+ executorService.submit(() -> {
+ CountDownLatch latch = new CountDownLatch(1);
+ PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true)
+ .thenAccept((i) -> {
+ Iris.verbose("Generated Async " + chunk);
+ latch.countDown();
+ });
+ try {
+ latch.await();
+ } catch (InterruptedException ignored) {
+ }
+ turboGeneratedChunks.addAndGet(1);
+ });
+ }
+
+ public Position2 getChunk(int position) {
+ int p = -1;
+ AtomicInteger xx = new AtomicInteger();
+ AtomicInteger zz = new AtomicInteger();
+ Spiraler s = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {
+ xx.set(x);
+ zz.set(z);
+ });
+
+ while (s.hasNext() && p++ < position) {
+ s.next();
+ }
+
+ return new Position2(xx.get(), zz.get());
+ }
+
+ public void save() {
+ J.a(() -> {
+ try {
+ saveNow();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ public static void setPausedTurbo(World world) {
+ TurboPregenJob job = jobs.get(world.getName());
+ if (isPausedTurbo(world)) {
+ job.paused = false;
+ } else {
+ job.paused = true;
+ }
+
+ if (job.paused) {
+ Iris.info(C.BLUE + "TurboGen: " + C.IRIS + world.getName() + C.BLUE + " Paused");
+ } else {
+ Iris.info(C.BLUE + "TurboGen: " + C.IRIS + world.getName() + C.BLUE + " Resumed");
+ }
+ }
+
+ public static boolean isPausedTurbo(World world) {
+ TurboPregenJob job = jobs.get(world.getName());
+ return job != null && job.isPaused();
+ }
+
+ public void shutdownInstance(World world) throws IOException {
+ Iris.info("turboGen: " + C.IRIS + world.getName() + C.BLUE + " Shutting down..");
+ TurboPregenJob job = jobs.get(world.getName());
+ File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName());
+ File turboFile = new File(worldDirectory, "turbogen.json");
+
+ if (job == null) {
+ Iris.error("No turbogen job found for world: " + world.getName());
+ return;
+ }
+
+ try {
+ if (!job.isPaused()) {
+ job.setPaused(true);
+ }
+ save();
+ jobs.remove(world.getName());
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ while (turboFile.exists()) {
+ turboFile.delete();
+ J.sleep(1000);
+ }
+ Iris.info("turboGen: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed.");
+ }
+ }.runTaskLater(Iris.instance, 20L);
+ } catch (Exception e) {
+ Iris.error("Failed to shutdown turbogen for " + world.getName());
+ e.printStackTrace();
+ } finally {
+ saveNow();
+ interrupt();
+ }
+ }
+
+
+ public void saveNow() throws IOException {
+ IO.writeAll(this.destination, new Gson().toJson(job));
+ }
+
+ @Data
+ @Builder
+ public static class TurboPregenJob {
+ private String world;
+ @Builder.Default
+ private int radiusBlocks = 5000;
+ @Builder.Default
+ private int position = 0;
+ @Builder.Default
+ boolean paused = false;
+ }
+}
+
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java b/core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java b/core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java b/core/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/core/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java
diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/core/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java
rename to core/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java
diff --git a/src/main/java/com/volmit/iris/core/project/IrisProject.java b/core/src/main/java/com/volmit/iris/core/project/IrisProject.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/project/IrisProject.java
rename to core/src/main/java/com/volmit/iris/core/project/IrisProject.java
diff --git a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/project/SchemaBuilder.java
rename to core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java
diff --git a/src/main/java/com/volmit/iris/core/report/Report.java b/core/src/main/java/com/volmit/iris/core/report/Report.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/report/Report.java
rename to core/src/main/java/com/volmit/iris/core/report/Report.java
diff --git a/src/main/java/com/volmit/iris/core/report/ReportType.java b/core/src/main/java/com/volmit/iris/core/report/ReportType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/report/ReportType.java
rename to core/src/main/java/com/volmit/iris/core/report/ReportType.java
diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java
new file mode 100644
index 000000000..4fb25371a
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java
@@ -0,0 +1,15 @@
+package com.volmit.iris.core.safeguard;
+
+import com.volmit.iris.Iris;
+
+public class IrisSafeguard {
+ public static boolean unstablemode = false;
+ public static boolean warningmode = false;
+ public static boolean stablemode = false;
+
+ public static void IrisSafeguardSystem() {
+ Iris.info("Enabled Iris SafeGuard");
+ ServerBootSFG.BootCheck();
+ }
+}
+
diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java
new file mode 100644
index 000000000..babfcfac8
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java
@@ -0,0 +1,81 @@
+package com.volmit.iris.core.safeguard;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
+import com.volmit.iris.util.format.C;
+
+public class ModesSFG {
+ public static void selectMode() {
+ if (IrisSafeguard.unstablemode) {
+ Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode");
+ unstable();
+ }
+ if (IrisSafeguard.warningmode) {
+ Iris.safeguard(C.GOLD + "Iris is running in Warning Mode");
+ warning();
+ }
+ if (IrisSafeguard.stablemode) {
+ stable();
+ }
+ }
+
+ public static void stable() {
+ Iris.safeguard(C.BLUE + "Iris is running Stable");
+ }
+
+ public static void unstable() {
+
+ UtilsSFG.printIncompatibleWarnings();
+
+ if (IrisSafeguard.unstablemode) {
+ Iris.info("");
+ Iris.info(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--");
+ Iris.info(C.RED + "Iris is running in unstable mode which may cause the following issues:");
+ Iris.info(C.DARK_RED + "Server Issues");
+ Iris.info(C.RED + "- Server won't boot");
+ Iris.info(C.RED + "- Data Loss");
+ Iris.info(C.RED + "- Unexpected behavior.");
+ Iris.info(C.RED + "- And More...");
+ Iris.info(C.DARK_RED + "World Issues");
+ Iris.info(C.RED + "- Worlds can't load due to corruption.");
+ Iris.info(C.RED + "- Worlds may slowly corrupt until they can't load.");
+ Iris.info(C.RED + "- World data loss.");
+ Iris.info(C.RED + "- And More...");
+ Iris.info(C.DARK_RED + "ATTENTION: " + C.RED + "While running Iris in unstable mode, you won't be eligible for support.");
+ Iris.info(C.DARK_RED + "CAUSE: " + C.RED + UtilsSFG.MSGIncompatibleWarnings());
+
+ if (IrisSettings.get().getGeneral().ignoreBootMode) {
+ Iris.info(C.DARK_RED + "Boot Unstable is set to true, continuing with the startup process.");
+ } else {
+ Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreBootMode to true if you wish to proceed.");
+ while (true) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ // no
+ }
+ }
+ }
+ Iris.info("");
+ }
+ }
+
+ public static void warning() {
+
+ UtilsSFG.printIncompatibleWarnings();
+
+ if (IrisSafeguard.warningmode) {
+ Iris.info("");
+ Iris.info(C.DARK_GRAY + "--==<" + C.GOLD + " IMPORTANT " + C.DARK_GRAY + ">==--");
+ Iris.info(C.GOLD + "Iris is running in warning mode which may cause the following issues:");
+ Iris.info(C.YELLOW + "- Data Loss");
+ Iris.info(C.YELLOW + "- Errors");
+ Iris.info(C.YELLOW + "- Broken worlds");
+ Iris.info(C.YELLOW + "- Unexpected behavior.");
+ Iris.info(C.YELLOW + "- And perhaps further complications.");
+ Iris.info(C.GOLD + "ATTENTION: " + C.YELLOW + "While running Iris in unstable mode, you won't be eligible for support.");
+ Iris.info(C.GOLD + "CAUSE: " + C.YELLOW + UtilsSFG.MSGIncompatibleWarnings());
+ Iris.info("");
+ }
+ }
+}
diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java
new file mode 100644
index 000000000..90aab8cf5
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java
@@ -0,0 +1,8 @@
+package com.volmit.iris.core.safeguard;
+
+public class PerformanceSFG {
+ public static void calculatePerformance() {
+
+
+ }
+}
diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java
new file mode 100644
index 000000000..46dda64d7
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java
@@ -0,0 +1,176 @@
+package com.volmit.iris.core.safeguard;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.nms.INMS;
+import com.volmit.iris.core.nms.v1X.NMSBinding1X;
+import org.apache.logging.log4j.core.util.ExecutorServices;
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.Plugin;
+
+import javax.print.attribute.standard.Severity;
+import java.io.File;
+import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import static com.volmit.iris.Iris.getJavaVersion;
+import static com.volmit.iris.Iris.instance;
+import static com.volmit.iris.core.safeguard.IrisSafeguard.*;
+
+public class ServerBootSFG {
+ public static final Map incompatibilities = new HashMap<>();
+ public static boolean isJDK17 = true;
+ public static boolean hasEnoughDiskSpace = true;
+ public static boolean isJRE = false;
+ public static boolean hasPrivileges = true;
+ public static boolean unsuportedversion = false;
+ protected static boolean safeguardPassed;
+ public static boolean passedserversoftware = true;
+ protected static int count;
+ protected static byte severityLow;
+ protected static byte severityMedium;
+ protected static byte severityHigh;
+ public static String allIncompatibilities;
+
+ public static void BootCheck() {
+ Iris.info("Checking for possible conflicts..");
+ org.bukkit.plugin.PluginManager pluginManager = Bukkit.getPluginManager();
+ Plugin[] plugins = pluginManager.getPlugins();
+
+ incompatibilities.clear();
+ incompatibilities.put("Multiverse-Core", false);
+ incompatibilities.put("dynmap", false);
+ incompatibilities.put("TerraformGenerator", false);
+ incompatibilities.put("Stratos", false);
+
+ String pluginName;
+ for (Plugin plugin : plugins) {
+ pluginName = plugin.getName();
+ Boolean flag = incompatibilities.get(pluginName);
+ if (flag != null && !flag) {
+ severityHigh++;
+ incompatibilities.put(pluginName, true);
+ }
+ }
+
+ StringJoiner joiner = new StringJoiner(", ");
+ for (Map.Entry entry : incompatibilities.entrySet()) {
+ if (entry.getValue()) {
+ joiner.add(entry.getKey());
+ }
+ }
+ if (
+ !instance.getServer().getVersion().contains("Purpur") &&
+ !instance.getServer().getVersion().contains("Paper") &&
+ !instance.getServer().getVersion().contains("Spigot") &&
+ !instance.getServer().getVersion().contains("Pufferfish") &&
+ !instance.getServer().getVersion().contains("Bukkit")) {
+ passedserversoftware = false;
+ joiner.add("Server Software");
+ severityHigh++;
+ }
+
+ if (INMS.get() instanceof NMSBinding1X) {
+ unsuportedversion = true;
+ joiner.add("Unsupported Minecraft Version");
+ severityHigh++;
+ }
+
+ if (getJavaVersion() != 17) {
+ isJDK17 = false;
+ joiner.add("Unsupported Java version");
+ severityMedium++;
+ }
+
+ if (!isJDK()) {
+ isJRE = true;
+ joiner.add("Unsupported JDK");
+ severityMedium++;
+ }
+
+ if (!hasPrivileges()){
+ hasPrivileges = true;
+ joiner.add("Insufficient Privileges");
+ severityMedium++;
+ }
+
+ if (!enoughDiskSpace()){
+ hasEnoughDiskSpace = false;
+ joiner.add("Insufficient Disk Space");
+ severityMedium++;
+ }
+
+ allIncompatibilities = joiner.toString();
+
+ safeguardPassed = (severityHigh == 0 && severityMedium == 0 && severityLow == 0);
+ count = severityHigh + severityMedium + severityLow;
+ if (safeguardPassed) {
+ stablemode = true;
+ Iris.safeguard("Stable mode has been activated.");
+ }
+ if (!safeguardPassed) {
+ if (severityMedium >= 1 && severityHigh == 0) {
+ warningmode = true;
+ Iris.safeguard("Warning mode has been activated.");
+ }
+ if (severityHigh >= 1) {
+ unstablemode = true;
+ Iris.safeguard("Unstable mode has been activated.");
+ }
+ }
+ }
+
+ public static boolean isJDK() {
+ String path = System.getProperty("sun.boot.library.path");
+ if (path != null) {
+ String javacPath = "";
+ if (path.endsWith(File.separator + "bin")) {
+ javacPath = path;
+ } else {
+ int libIndex = path.lastIndexOf(File.separator + "lib");
+ if (libIndex > 0) {
+ javacPath = path.substring(0, libIndex) + File.separator + "bin";
+ }
+ }
+ if (checkJavac(javacPath))
+ return true;
+ }
+ path = System.getProperty("java.home");
+ return path != null && checkJavac(path + File.separator + "bin");
+ }
+
+ public static boolean hasPrivileges() {
+ Path pv = Paths.get(Bukkit.getWorldContainer() + "iristest.json");
+ try (FileChannel fc = FileChannel.open(pv, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE, StandardOpenOption.READ, StandardOpenOption.WRITE)) {
+ if (Files.isReadable(pv) && Files.isWritable(pv)) {
+ return true;
+ }
+ } catch (Exception e) {
+ return false;
+ }
+ return false;
+ }
+
+ public static boolean enoughDiskSpace() {
+ File freeSpace = new File(Bukkit.getWorldContainer() + ".");
+ double gigabytes = freeSpace.getFreeSpace() / (1024.0 * 1024.0 * 1024.0);
+ if (gigabytes > 3){
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private static boolean checkJavac(String path) {
+ return !path.isEmpty() && (new File(path, "javac").exists() || new File(path, "javac.exe").exists());
+ }
+
+}
diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java
new file mode 100644
index 000000000..c9155c7b3
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java
@@ -0,0 +1,68 @@
+package com.volmit.iris.core.safeguard;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.util.format.C;
+
+public class UtilsSFG {
+ public static void splash() {
+ ModesSFG.selectMode();
+ }
+
+ public static void printIncompatibleWarnings() {
+ // String SupportedIrisVersion = getDescription().getVersion(); //todo Automatic version
+
+ if (ServerBootSFG.safeguardPassed) {
+ Iris.safeguard(C.BLUE + "0 Conflicts found");
+ } else {
+ if (IrisSafeguard.unstablemode) {
+ Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found");
+ }
+ if (IrisSafeguard.warningmode) {
+ Iris.safeguard(C.YELLOW + "" + ServerBootSFG.count + " Conflicts found");
+ }
+
+ if (ServerBootSFG.incompatibilities.get("Multiverse-Core")) {
+ Iris.safeguard(C.RED + "Multiverse");
+ Iris.safeguard(C.RED + "- The plugin Multiverse is not compatible with the server.");
+ Iris.safeguard(C.RED + "- If you want to have a world manager, consider using PhantomWorlds or MyWorlds instead.");
+ }
+ if (ServerBootSFG.incompatibilities.get("dynmap")) {
+ Iris.safeguard(C.RED + "Dynmap");
+ Iris.safeguard(C.RED + "- The plugin Dynmap is not compatible with the server.");
+ Iris.safeguard(C.RED + "- If you want to have a map plugin like Dynmap, consider Bluemap.");
+ }
+ if (ServerBootSFG.incompatibilities.get("TerraformGenerator") || ServerBootSFG.incompatibilities.get("Stratos")) {
+ Iris.safeguard(C.YELLOW + "Terraform Generator / Stratos");
+ Iris.safeguard(C.YELLOW + "- Iris is not compatible with other worldgen plugins.");
+ }
+ if (ServerBootSFG.unsuportedversion) {
+ Iris.safeguard(C.RED + "Server Version");
+ Iris.safeguard(C.RED + "- Iris only supports 1.19.2 > 1.20.2");
+ }
+ if (!ServerBootSFG.passedserversoftware) {
+ Iris.safeguard(C.YELLOW + "Unsupported Server Software");
+ Iris.safeguard(C.YELLOW + "- Please consider using Paper or Purpur instead.");
+ }
+ if (!ServerBootSFG.hasPrivileges) {
+ Iris.safeguard(C.YELLOW + "Insufficient Privileges");
+ Iris.safeguard(C.YELLOW + "- The server has insufficient Privileges to run iris. Please contact support.");
+ }
+ if (!ServerBootSFG.hasEnoughDiskSpace) {
+ Iris.safeguard(C.YELLOW + "Insufficient Disk Space");
+ Iris.safeguard(C.YELLOW + "- The server has insufficient Free DiskSpace to run iris required 3GB+.");
+ }
+ if (!ServerBootSFG.isJDK17) {
+ Iris.safeguard(C.YELLOW + "Unsupported java version");
+ Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JDK " + Iris.getJavaVersion());
+ }
+ if (ServerBootSFG.isJRE) {
+ Iris.safeguard(C.YELLOW + "Unsupported Server JDK");
+ Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JRE " + Iris.getJavaVersion());
+ }
+ }
+ }
+
+ public static String MSGIncompatibleWarnings() {
+ return ServerBootSFG.allIncompatibilities;
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/service/BoardSVC.java b/core/src/main/java/com/volmit/iris/core/service/BoardSVC.java
similarity index 92%
rename from src/main/java/com/volmit/iris/core/service/BoardSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/BoardSVC.java
index 4fa115cdd..d8456b0a5 100644
--- a/src/main/java/com/volmit/iris/core/service/BoardSVC.java
+++ b/core/src/main/java/com/volmit/iris/core/service/BoardSVC.java
@@ -19,6 +19,7 @@
package com.volmit.iris.core.service;
import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.framework.Engine;
@@ -131,7 +132,11 @@ public void update() {
lines.add("&7&m ");
lines.add(C.AQUA + "Region" + C.GRAY + ": " + engine.getRegion(x, z).getName());
lines.add(C.AQUA + "Biome" + C.GRAY + ": " + engine.getBiomeOrMantle(x, y, z).getName());
- lines.add(C.AQUA + "Height" + C.GRAY + ": " + Math.round(engine.getHeight(x, z) + player.getWorld().getMinHeight()));
+ if (!IrisSettings.get().getStudio().displayTrueHeight) {
+ lines.add(C.AQUA + "Height" + C.GRAY + ": " + Math.round(engine.getHeight(x, z) + player.getWorld().getMinHeight()));
+ } else {
+ lines.add(C.AQUA + "Height" + C.GRAY + ": " + Math.round(engine.getHeight(x, z)));
+ }
lines.add(C.AQUA + "Slope" + C.GRAY + ": " + Form.f(engine.getComplex().getSlopeStream().get(x, z), 2));
lines.add(C.AQUA + "BUD/s" + C.GRAY + ": " + Form.f(engine.getBlockUpdatesPerSecond()));
lines.add("&7&m ");
diff --git a/core/src/main/java/com/volmit/iris/core/service/ChunkHandlerSVC.java b/core/src/main/java/com/volmit/iris/core/service/ChunkHandlerSVC.java
new file mode 100644
index 000000000..91531b049
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/service/ChunkHandlerSVC.java
@@ -0,0 +1,163 @@
+package com.volmit.iris.core.service;
+
+import com.volmit.iris.core.tools.IrisToolbelt;
+import org.bukkit.Bukkit;
+import org.bukkit.Chunk;
+import org.bukkit.World;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.world.ChunkLoadEvent;
+import org.bukkit.event.world.ChunkUnloadEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.event.world.WorldUnloadEvent;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.bukkit.scheduler.BukkitTask;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+public class ChunkHandlerSVC implements Listener {
+ // Does nothing for now
+ private final JavaPlugin plugin;
+ private static BukkitTask task;
+ private final Map worlds = new ConcurrentHashMap<>();
+
+ private static final Map> playersInChunk = new ConcurrentHashMap<>();
+
+ public ChunkHandlerSVC(JavaPlugin plugin) {
+ this.plugin = plugin;
+ Bukkit.getPluginManager().registerEvents(this, plugin);
+
+ for (World world : Bukkit.getWorlds()) {
+ if (IrisToolbelt.isIrisWorld(world)) {
+ worlds.put(world, new ChunkUnloader(plugin, world));
+ }
+ }
+
+ startTask();
+ }
+
+ private void startTask() {
+ if (task == null) {
+ task = new BukkitRunnable() {
+ @Override
+ public void run() {
+ worlds.values().forEach(ChunkUnloader::update);
+ }
+ }.runTaskTimerAsynchronously(plugin, 0L, 1L);
+ }
+ }
+
+ @EventHandler
+ public void onPlayerMove(PlayerMoveEvent event) {
+ Player player = event.getPlayer();
+ Chunk previousChunk = event.getFrom().getChunk();
+ Chunk currentChunk = event.getTo().getChunk();
+
+ if (!previousChunk.equals(currentChunk)) {
+ playersInChunk.computeIfAbsent(previousChunk, k -> ConcurrentHashMap.newKeySet()).remove(player);
+ playersInChunk.computeIfAbsent(currentChunk, k -> ConcurrentHashMap.newKeySet()).add(player);
+ }
+ }
+
+ public static void exit() {
+ if (task != null) {
+ task.cancel();
+ }
+ }
+
+ @EventHandler
+ public void onWorldLoad(WorldLoadEvent event) {
+ World world = event.getWorld();
+ if (IrisToolbelt.isIrisWorld(world)) {
+ worlds.put(world, new ChunkUnloader(plugin, world));
+ }
+ }
+
+ @EventHandler
+ public void onWorldUnload(WorldUnloadEvent event) {
+ worlds.remove(event.getWorld());
+ }
+
+ @EventHandler
+ public void onChunkLoad(ChunkLoadEvent event) {
+ World world = event.getWorld();
+ if (worlds.containsKey(world)) {
+ worlds.get(world).onChunkLoad(event.getChunk());
+ }
+ }
+
+ @EventHandler
+ public void onChunkUnload(ChunkUnloadEvent event) {
+ World world = event.getWorld();
+ if (worlds.containsKey(world)) {
+ worlds.get(world).onChunkUnload(event.getChunk());
+ }
+ }
+
+ private static class ChunkUnloader {
+ private final JavaPlugin plugin;
+ private final World world;
+ private final Map chunks = new ConcurrentHashMap<>();
+
+ private ChunkUnloader(JavaPlugin plugin, World world) {
+ this.plugin = plugin;
+ this.world = world;
+ }
+
+ public void onChunkLoad(Chunk chunk) {
+ // System.out.printf("%s > Loaded Chunk [x=%s, z=%s]%n", world.getName(), chunk.getX(), chunk.getZ());
+ chunks.put(chunk, System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(3));
+ }
+
+ public void onChunkUnload(Chunk chunk) {
+ chunks.remove(chunk);
+ playersInChunk.remove(chunk);
+ }
+
+ public void update() {
+ try {
+ long currentTime = System.currentTimeMillis();
+ Set chunkSet = new HashSet<>(chunks.keySet());
+ for (Chunk chunk : chunkSet) {
+ if (!chunk.isLoaded()) {
+ continue;
+ }
+
+ if (isChunkNearby(chunk)) {
+ chunks.put(chunk, currentTime + TimeUnit.MINUTES.toMillis(3));
+ } else if (chunks.get(chunk) <= currentTime) {
+ unloadChunk(chunk);
+ }
+ }
+ } catch (Exception e) {
+ // Log the error message
+ System.out.println("Error in update method: " + e.getMessage());
+ }
+ }
+
+
+ private boolean isChunkNearby(Chunk chunk) {
+ Set players = playersInChunk.get(chunk);
+ if (players == null) {
+ players = ConcurrentHashMap.newKeySet();
+ playersInChunk.put(chunk, players);
+ }
+ return !players.isEmpty();
+ }
+
+ private void unloadChunk(Chunk chunk) {
+ try {
+ // System.out.printf("%s > Unloading Chunk [x=%s, z=%s]%n", world.getName(), chunk.getX(), chunk.getZ());
+ Bukkit.getScheduler().runTask(plugin, () -> chunk.unload(true));
+ } catch (Exception e) {
+ System.out.println("Error unloading chunk: " + e.getMessage());
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/service/CommandSVC.java b/core/src/main/java/com/volmit/iris/core/service/CommandSVC.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/service/CommandSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/CommandSVC.java
diff --git a/src/main/java/com/volmit/iris/core/service/ConversionSVC.java b/core/src/main/java/com/volmit/iris/core/service/ConversionSVC.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/service/ConversionSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/ConversionSVC.java
diff --git a/src/main/java/com/volmit/iris/core/service/DolphinSVC.java b/core/src/main/java/com/volmit/iris/core/service/DolphinSVC.java
similarity index 91%
rename from src/main/java/com/volmit/iris/core/service/DolphinSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/DolphinSVC.java
index a076b01a7..0f4aa53dc 100644
--- a/src/main/java/com/volmit/iris/core/service/DolphinSVC.java
+++ b/core/src/main/java/com/volmit/iris/core/service/DolphinSVC.java
@@ -18,6 +18,8 @@
package com.volmit.iris.core.service;
+import com.volmit.iris.core.nms.INMS;
+import com.volmit.iris.core.nms.container.BlockPos;
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.util.documentation.ChunkCoordinates;
@@ -25,11 +27,9 @@
import com.volmit.iris.util.math.Spiraler;
import com.volmit.iris.util.matter.MatterStructurePOI;
import com.volmit.iris.util.plugin.IrisService;
-import net.minecraft.core.BlockPos;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.SoundCategory;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftDolphin;
import org.bukkit.entity.Dolphin;
import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
@@ -62,10 +62,8 @@ public void on(PlayerInteractEntityEvent event) {
searchNearestTreasure(e, event.getPlayer().getLocation().getBlockX() >> 4, event.getPlayer().getLocation().getBlockZ() >> 4, e.getMantle().getRadius() - 1, StructureType.BURIED_TREASURE, (x, y, z, p) -> {
event.setCancelled(true);
Dolphin d = (Dolphin) event.getRightClicked();
- CraftDolphin cd = (CraftDolphin) d;
+ INMS.get().setTreasurePos(d, new BlockPos(x, y, z));
d.getWorld().playSound(d, Sound.ENTITY_DOLPHIN_EAT, SoundCategory.NEUTRAL, 1, 1);
- cd.getHandle().setTreasurePos(new BlockPos(x, y, z));
- cd.getHandle().setGotFish(true);
});
}
diff --git a/src/main/java/com/volmit/iris/core/service/EditSVC.java b/core/src/main/java/com/volmit/iris/core/service/EditSVC.java
similarity index 96%
rename from src/main/java/com/volmit/iris/core/service/EditSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/EditSVC.java
index 834b1712a..dc944f1f2 100644
--- a/src/main/java/com/volmit/iris/core/service/EditSVC.java
+++ b/core/src/main/java/com/volmit/iris/core/service/EditSVC.java
@@ -33,6 +33,7 @@
public class EditSVC implements IrisService {
private KMap editors;
+ public static boolean deletingWorld = false;
@Override
public void onEnable() {
@@ -71,11 +72,12 @@ public Biome getBiome(World world, int x, int z) {
@EventHandler
public void on(WorldUnloadEvent e) {
- if (editors.containsKey(e.getWorld())) {
+ if (editors.containsKey(e.getWorld()) && !deletingWorld) {
editors.remove(e.getWorld()).close();
}
}
+
public void update() {
for (World i : editors.k()) {
if (M.ms() - editors.get(i).last() > 1000) {
diff --git a/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java
similarity index 91%
rename from src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java
index 04606f179..de6d2ac81 100644
--- a/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java
+++ b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java
@@ -19,10 +19,7 @@
package com.volmit.iris.core.service;
import com.volmit.iris.Iris;
-import com.volmit.iris.core.link.ExternalDataProvider;
-import com.volmit.iris.core.link.Identifier;
-import com.volmit.iris.core.link.ItemAdderDataProvider;
-import com.volmit.iris.core.link.OraxenDataProvider;
+import com.volmit.iris.core.link.*;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.plugin.IrisService;
import lombok.Data;
@@ -53,6 +50,10 @@ public void onEnable() {
if (Bukkit.getPluginManager().getPlugin("ItemAdder") != null) {
Iris.info("ItemAdder found, loading ItemAdderDataProvider...");
}
+ providers.add(new ExecutableItemsDataProvider());
+ if (Bukkit.getPluginManager().getPlugin("ExecutableItems") != null) {
+ Iris.info("ExecutableItems found, loading ExecutableItemsDataProvider...");
+ }
for (ExternalDataProvider p : providers) {
if (p.isReady()) {
diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java
new file mode 100644
index 000000000..6f3f79535
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java
@@ -0,0 +1,161 @@
+package com.volmit.iris.core.service;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.tools.IrisToolbelt;
+import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.engine.platform.PlatformChunkGenerator;
+import com.volmit.iris.util.collection.KMap;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.format.Form;
+import com.volmit.iris.util.misc.getHardware;
+import com.volmit.iris.util.plugin.IrisService;
+import com.volmit.iris.util.scheduling.Looper;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.function.Supplier;
+
+public class IrisEngineSVC implements IrisService {
+ private static final AtomicInteger tectonicLimit = new AtomicInteger(30);
+ private final ReentrantLock lastUseLock = new ReentrantLock();
+ private final KMap lastUse = new KMap<>();
+ private Looper cacheTicker;
+ private Looper trimTicker;
+ private Looper unloadTicker;
+ public List corruptedIrisWorlds = new ArrayList<>();
+
+ @Override
+ public void onEnable() {
+ tectonicLimit.set(2);
+ long t = getHardware.getProcessMemory();
+ while (t > 200) {
+ tectonicLimit.getAndAdd(1);
+ t = t - 200;
+ }
+ this.setup();
+ cacheTicker.start();
+ trimTicker.start();
+ unloadTicker.start();
+ }
+
+ public static int getTectonicLimit() {
+ return tectonicLimit.get();
+ }
+
+ private void setup() {
+ cacheTicker = new Looper() {
+ @Override
+ protected long loop() {
+ long now = System.currentTimeMillis();
+ lastUseLock.lock();
+ try {
+ for (World key : new ArrayList<>(lastUse.keySet())) {
+ Long last = lastUse.get(key);
+ if (last == null)
+ continue;
+ if (now - last > 60000) { // 1 minute
+ lastUse.remove(key);
+ }
+ }
+ } finally {
+ lastUseLock.unlock();
+ }
+ return 1000;
+ }
+ };
+ trimTicker = new Looper() {
+ private final Supplier supplier = createSupplier();
+ @Override
+ protected long loop() {
+ long start = System.currentTimeMillis();
+ try {
+ Engine engine = supplier.get();
+ if (engine != null) {
+ engine.getMantle().trim(tectonicLimit.get() / lastUse.size());
+ }
+ } catch (Throwable e) {
+ Iris.reportError(e);
+ // return -1;
+ }
+
+ int size = lastUse.size();
+ long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start);
+ if (time <= 0)
+ return 0;
+ return time;
+ }
+ };
+
+ unloadTicker = new Looper() {
+ private final Supplier supplier = createSupplier();
+
+ @Override
+ protected long loop() {
+ long start = System.currentTimeMillis();
+ try {
+ Engine engine = supplier.get();
+ if (engine != null) {
+ long unloadStart = System.currentTimeMillis();
+ int count = engine.getMantle().unloadTectonicPlate(tectonicLimit.get() / lastUse.size());
+ if (count > 0) {
+ Iris.debug(C.GOLD + "Unloaded " + C.YELLOW + count + " TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2));
+ }
+ }
+ } catch (Throwable e) {
+ Iris.reportError(e);
+ return -1;
+ }
+
+ int size = lastUse.size();
+ long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start);
+ if (time <= 0)
+ return 0;
+ return time;
+ }
+ };
+ }
+
+ private Supplier createSupplier() {
+ AtomicInteger i = new AtomicInteger();
+ return () -> {
+ List worlds = Bukkit.getWorlds();
+ if (i.get() >= worlds.size()) {
+ i.set(0);
+ }
+ try {
+ for (int j = 0; j < worlds.size(); j++) {
+ World world = worlds.get(i.getAndIncrement());
+ PlatformChunkGenerator generator = IrisToolbelt.access(world);
+ if (i.get() >= worlds.size()) {
+ i.set(0);
+ }
+
+ if (generator != null) {
+ Engine engine = generator.getEngine();
+ if (engine != null) {
+ lastUseLock.lock();
+ lastUse.put(world, System.currentTimeMillis());
+ lastUseLock.unlock();
+ return engine;
+ }
+ }
+ }
+ } catch (Throwable e) {
+ Iris.reportError(e);
+ }
+ return null;
+ };
+ }
+
+ @Override
+ public void onDisable() {
+ cacheTicker.interrupt();
+ trimTicker.interrupt();
+ unloadTicker.interrupt();
+ lastUse.clear();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/core/service/LogFilterSVC.java b/core/src/main/java/com/volmit/iris/core/service/LogFilterSVC.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/service/LogFilterSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/LogFilterSVC.java
diff --git a/src/main/java/com/volmit/iris/core/service/ObjectSVC.java b/core/src/main/java/com/volmit/iris/core/service/ObjectSVC.java
similarity index 79%
rename from src/main/java/com/volmit/iris/core/service/ObjectSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/ObjectSVC.java
index cda1d5a42..5fadf8b4a 100644
--- a/src/main/java/com/volmit/iris/core/service/ObjectSVC.java
+++ b/core/src/main/java/com/volmit/iris/core/service/ObjectSVC.java
@@ -18,9 +18,11 @@
package com.volmit.iris.core.service;
+import com.volmit.iris.Iris;
import com.volmit.iris.util.plugin.IrisService;
import com.volmit.iris.util.scheduling.J;
import lombok.Getter;
+import org.bukkit.Bukkit;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
@@ -68,19 +70,22 @@ private void loopChange(int amount) {
* @param blocks The blocks to remove
*/
private void revert(Map blocks) {
- int amount = 0;
Iterator> it = blocks.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry entry = it.next();
- BlockData data = entry.getValue();
- entry.getKey().setBlockData(data, false);
- it.remove();
+ Bukkit.getScheduler().runTask(Iris.instance, () -> {
+ int amount = 0;
+ while (it.hasNext()) {
+ Map.Entry entry = it.next();
+ BlockData data = entry.getValue();
+ entry.getKey().setBlockData(data, false);
- amount++;
+ it.remove();
- if (amount > 200) {
- J.s(() -> revert(blocks), 1);
+ amount++;
+
+ if (amount > 200) {
+ J.s(() -> revert(blocks), 1);
+ }
}
- }
+ });
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/core/service/PreservationSVC.java b/core/src/main/java/com/volmit/iris/core/service/PreservationSVC.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/service/PreservationSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/PreservationSVC.java
diff --git a/src/main/java/com/volmit/iris/core/service/StudioSVC.java b/core/src/main/java/com/volmit/iris/core/service/StudioSVC.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/service/StudioSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/StudioSVC.java
diff --git a/src/main/java/com/volmit/iris/core/service/TreeSVC.java b/core/src/main/java/com/volmit/iris/core/service/TreeSVC.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/service/TreeSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/TreeSVC.java
diff --git a/src/main/java/com/volmit/iris/core/service/VillageSVC.java b/core/src/main/java/com/volmit/iris/core/service/VillageSVC.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/service/VillageSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/VillageSVC.java
diff --git a/src/main/java/com/volmit/iris/core/service/WandSVC.java b/core/src/main/java/com/volmit/iris/core/service/WandSVC.java
similarity index 97%
rename from src/main/java/com/volmit/iris/core/service/WandSVC.java
rename to core/src/main/java/com/volmit/iris/core/service/WandSVC.java
index 7f564c8af..27fc4c87a 100644
--- a/src/main/java/com/volmit/iris/core/service/WandSVC.java
+++ b/core/src/main/java/com/volmit/iris/core/service/WandSVC.java
@@ -54,6 +54,7 @@
public class WandSVC implements IrisService {
private static ItemStack dust;
+ private static ItemStack wand;
public static void pasteSchematic(IrisObject s, Location at) {
s.place(at);
@@ -226,17 +227,19 @@ public static Location[] getCuboid(Player p) {
return getCuboidFromItem(p.getInventory().getItemInMainHand());
}
- Cuboid c = WorldEditLink.getSelection(p);
+ if (IrisSettings.get().getWorld().worldEditWandCUI) {
+ Cuboid c = WorldEditLink.getSelection(p);
- if (c != null) {
- return new Location[]{c.getLowerNE(), c.getUpperSW()};
+ if (c != null) {
+ return new Location[]{c.getLowerNE(), c.getUpperSW()};
+ }
}
return null;
}
public static boolean isHoldingWand(Player p) {
- return isHoldingIrisWand(p) || WorldEditLink.getSelection(p) != null;
+ return isHoldingIrisWand(p) || (IrisSettings.get().getWorld().worldEditWandCUI && WorldEditLink.getSelection(p) != null);
}
public static boolean isHoldingIrisWand(Player p) {
@@ -251,7 +254,6 @@ public static boolean isHoldingIrisWand(Player p) {
* @return True if it is
*/
public static boolean isWand(ItemStack is) {
- ItemStack wand = createWand();
if (is.getItemMeta() == null) return false;
return is.getType().equals(wand.getType()) &&
is.getItemMeta().getDisplayName().equals(wand.getItemMeta().getDisplayName()) &&
@@ -261,7 +263,7 @@ public static boolean isWand(ItemStack is) {
@Override
public void onEnable() {
- ItemStack wand = createWand();
+ wand = createWand();
dust = createDust();
J.ar(() -> {
diff --git a/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java b/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java
new file mode 100644
index 000000000..845edf054
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java
@@ -0,0 +1,31 @@
+package com.volmit.iris.core.service;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.util.plugin.IrisService;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import static java.lang.System.getLogger;
+
+public class WorldLoadSFG implements IrisService {
+ private JavaPlugin plugin;
+ @EventHandler
+ public void onWorldLoad(WorldLoadEvent event) {
+ World world = event.getWorld();
+
+ }
+
+ @Override
+ public void onEnable() {
+ this.plugin = Iris.instance;
+ plugin.getServer().getPluginManager().registerEvents(this, plugin);
+ }
+
+ @Override
+ public void onDisable() {
+
+ }
+}
diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisBenchmarking.java b/core/src/main/java/com/volmit/iris/core/tools/IrisBenchmarking.java
new file mode 100644
index 000000000..300a4467f
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/tools/IrisBenchmarking.java
@@ -0,0 +1,626 @@
+package com.volmit.iris.core.tools;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.util.format.C;
+import oshi.SystemInfo;
+import oshi.hardware.CentralProcessor;
+import oshi.hardware.GlobalMemory;
+import oshi.hardware.HWDiskStore;
+import oshi.software.os.OperatingSystem;
+
+import java.io.*;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryUsage;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.IntStream;
+import java.util.zip.Deflater;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import static com.google.common.math.LongMath.isPrime;
+import static com.volmit.iris.util.misc.getHardware.getCPUModel;
+import static com.volmit.iris.util.misc.getHardware.getDiskModel;
+public class IrisBenchmarking {
+ static String ServerOS;
+ static String filePath = "benchmark.dat";
+ static double avgWriteSpeedMBps;
+ static double avgReadSpeedMBps;
+ static double highestWriteSpeedMBps;
+ static double highestReadSpeedMBps;
+ static double lowestWriteSpeedMBps;
+ static double lowestReadSpeedMBps;
+ static double calculateIntegerMath;
+ static double calculateFloatingPoint;
+ static double calculatePrimeNumbers;
+ static double calculateStringSorting;
+ static double calculateDataEncryption;
+ static double calculateDataCompression;
+ static String currentRunning = "None";
+ static int BenchmarksCompleted = 0;
+ static int BenchmarksTotal = 7;
+ static int totalTasks = 10;
+ static int currentTasks = 0;
+ static double WindowsCPUCompression;
+ static double WindowsCPUEncryption;
+ static double WindowsCPUCSHA1;
+ static double elapsedTimeNs;
+ static boolean Winsat = false;
+ static boolean WindowsDiskSpeed = false;
+ public static boolean inProgress = false;
+ static double startTime;
+ // Good enough for now. . .
+
+ public static void runBenchmark() throws InterruptedException {
+ inProgress = true;
+ getServerOS();
+ deleteTestFile(filePath);
+ AtomicReference doneCalculateDiskSpeed = new AtomicReference<>((double) 0);
+ startBenchmarkTimer();
+ Iris.info("Benchmark Started!");
+ Iris.warn("Although it may seem momentarily paused, it's actively processing.");
+ BenchmarksCompleted = 0;
+
+ CompletableFuture future = CompletableFuture.runAsync(() -> {
+ currentRunning = "calculateDiskSpeed";
+ progressBar();
+ if (ServerOS.contains("Windows") && isRunningAsAdmin()) {
+ WindowsDiskSpeed = true;
+ WindowsDiskSpeedTest();
+ } else {
+ warningFallback();
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ doneCalculateDiskSpeed.set(roundToTwoDecimalPlaces(calculateDiskSpeed()));
+ BenchmarksCompleted++;
+ }
+
+
+ }).thenRun(() -> {
+ currentRunning = "WindowsCpuSpeedTest";
+ progressBar();
+ if (ServerOS.contains("Windows") && isRunningAsAdmin()) {
+ Winsat = true;
+ WindowsCpuSpeedTest();
+ } else {
+ Iris.info("Skipping:" + C.BLUE + " Windows System Assessment Tool Benchmarks");
+ if (!ServerOS.contains("Windows")) {
+ Iris.info("Required Software:" + C.BLUE + " Windows");
+ BenchmarksTotal = 6;
+ }
+ if (!isRunningAsAdmin()) {
+ Iris.info(C.RED + "ERROR: " + C.DARK_RED + "Elevated privileges missing");
+ BenchmarksTotal = 6;
+ }
+ }
+
+ }).thenRun(() -> {
+ currentRunning = "calculateIntegerMath";
+ progressBar();
+ calculateIntegerMath = roundToTwoDecimalPlaces(calculateIntegerMath());
+ BenchmarksCompleted++;
+ }).thenRun(() -> {
+ currentRunning = "calculateFloatingPoint";
+ progressBar();
+ calculateFloatingPoint = roundToTwoDecimalPlaces(calculateFloatingPoint());
+ BenchmarksCompleted++;
+ }).thenRun(() -> {
+ currentRunning = "calculateStringSorting";
+ progressBar();
+ calculateStringSorting = roundToTwoDecimalPlaces(calculateStringSorting());
+ BenchmarksCompleted++;
+ }).thenRun(() -> {
+ currentRunning = "calculatePrimeNumbers";
+ progressBar();
+ calculatePrimeNumbers = roundToTwoDecimalPlaces(calculatePrimeNumbers());
+ BenchmarksCompleted++;
+ }).thenRun(() -> {
+ currentRunning = "calculateDataEncryption";
+ progressBar();
+ calculateDataEncryption = roundToTwoDecimalPlaces(calculateDataEncryption());
+ BenchmarksCompleted++;
+ }).thenRun(() -> {
+ currentRunning = "calculateDataCompression";
+ progressBar();
+ calculateDataCompression = roundToTwoDecimalPlaces(calculateDataCompression());
+ BenchmarksCompleted++;
+ }).thenRun(() -> {
+ elapsedTimeNs = stopBenchmarkTimer();
+ results();
+ inProgress = false;
+ });
+
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void progressBar() {
+ Iris.info("-----------------------------------------------------");
+ Iris.info("Currently Running: " + C.BLUE + currentRunning);
+ // Iris.info("Tasks: " + "Current Tasks: " + C.BLUE + currentTasks + C.WHITE + " / " + "Total Tasks: " + C.BLUE + totalTasks);
+ Iris.info("Benchmarks Completed: " + C.BLUE + BenchmarksCompleted + C.WHITE + " / " + "Total: " + C.BLUE + BenchmarksTotal);
+ Iris.info("-----------------------------------------------------");
+ }
+
+ public static void results() {
+
+ SystemInfo systemInfo = new SystemInfo();
+ GlobalMemory globalMemory = systemInfo.getHardware().getMemory();
+ long totalMemoryMB = globalMemory.getTotal() / (1024 * 1024);
+ long availableMemoryMB = globalMemory.getAvailable() / (1024 * 1024);
+ long totalPageSize = globalMemory.getPageSize() / (1024 * 1024);
+ long usedMemoryMB = totalMemoryMB - availableMemoryMB;
+ MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
+
+ Iris.info("OS: " + ServerOS);
+ if (!isRunningAsAdmin() || !ServerOS.contains("Windows")) {
+ Iris.info(C.GOLD + "For the full results use Windows + Admin Rights..");
+ }
+ Iris.info("CPU Model: " + getCPUModel());
+ Iris.info("CPU Score: " + "WIP");
+ Iris.info("- Integer Math: " + calculateIntegerMath + " MOps/Sec");
+ Iris.info("- Floating Point Math: " + calculateFloatingPoint + " MOps/Sec");
+ Iris.info("- Find Prime Numbers: " + calculatePrimeNumbers + " Primes/Sec");
+ Iris.info("- Random String Sorting: " + calculateStringSorting + " Thousand Strings/Sec");
+ Iris.info("- Data Encryption: " + formatDouble(calculateDataEncryption) + " MBytes/Sec");
+ Iris.info("- Data Compression: " + formatDouble(calculateDataCompression) + " MBytes/Sec");
+
+ if (WindowsDiskSpeed) {
+ Iris.info("Disk Model: " + getDiskModel());
+ Iris.info(C.BLUE + "- Running with Windows System Assessment Tool");
+ Iris.info("- Sequential 64.0 Write: " + C.BLUE + formatDouble(avgWriteSpeedMBps) + " Mbps");
+ Iris.info("- Sequential 64.0 Read: " + C.BLUE + formatDouble(avgReadSpeedMBps) + " Mbps");
+ } else {
+ Iris.info("Disk Model: " + getDiskModel());
+ Iris.info(C.GREEN + "- Running in Native Mode");
+ Iris.info("- Average Write Speed: " + C.GREEN + formatDouble(avgWriteSpeedMBps) + " Mbps");
+ Iris.info("- Average Read Speed: " + C.GREEN + formatDouble(avgReadSpeedMBps) + " Mbps");
+ Iris.info("- Highest Write Speed: " + formatDouble(highestWriteSpeedMBps) + " Mbps");
+ Iris.info("- Highest Read Speed: " + formatDouble(highestReadSpeedMBps) + " Mbps");
+ Iris.info("- Lowest Write Speed: " + formatDouble(lowestWriteSpeedMBps) + " Mbps");
+ Iris.info("- Lowest Read Speed: " + formatDouble(lowestReadSpeedMBps) + " Mbps");
+ }
+ Iris.info("Ram Usage: ");
+ Iris.info("- Total Ram: " + totalMemoryMB + " MB");
+ Iris.info("- Used Ram: " + usedMemoryMB + " MB");
+ Iris.info("- Total Process Ram: " + C.BLUE + getMaxMemoryUsage() + " MB");
+ Iris.info("- Total Paging Size: " + totalPageSize + " MB");
+ if (Winsat) {
+ Iris.info(C.BLUE + "Windows System Assessment Tool: ");
+ Iris.info("- CPU LZW Compression:" + C.BLUE + formatDouble(WindowsCPUCompression) + " MB/s");
+ Iris.info("- CPU AES256 Encryption: " + C.BLUE + formatDouble(WindowsCPUEncryption) + " MB/s");
+ Iris.info("- CPU SHA1 Hash: " + C.BLUE + formatDouble(WindowsCPUCSHA1) + " MB/s");
+ Iris.info("Duration: " + roundToTwoDecimalPlaces(elapsedTimeNs) + " Seconds");
+ }
+
+ }
+
+ public static long getMaxMemoryUsage() {
+ MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
+ MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
+ MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();
+ long maxHeapMemory = heapMemoryUsage.getMax();
+ long maxNonHeapMemory = nonHeapMemoryUsage.getMax();
+ long maxMemoryUsageMB = (maxHeapMemory + maxNonHeapMemory) / (1024 * 1024);
+ return maxMemoryUsageMB;
+ }
+
+ public static void getServerOS() {
+ SystemInfo systemInfo = new SystemInfo();
+ OperatingSystem os = systemInfo.getOperatingSystem();
+ ServerOS = os.toString();
+ }
+
+ public static boolean isRunningAsAdmin() {
+ if (ServerOS.contains("Windows")) {
+ try {
+ Process process = Runtime.getRuntime().exec("winsat disk");
+ process.waitFor();
+ return process.exitValue() == 0;
+ } catch (IOException | InterruptedException e) {
+ // Hmm
+ }
+ }
+ return false;
+ }
+
+ public static void warningFallback() {
+ Iris.info(C.RED + "Using the " + C.DARK_RED + "FALLBACK" + C.RED + " method due to compatibility issues. ");
+ Iris.info(C.RED + "Please note that this may result in less accurate results.");
+ }
+
+ private static String formatDouble(double value) {
+ return String.format("%.2f", value);
+ }
+
+ private static void startBenchmarkTimer() {
+ startTime = System.nanoTime();
+ }
+
+ private static double stopBenchmarkTimer() {
+ long endTime = System.nanoTime();
+ return (endTime - startTime) / 1_000_000_000.0;
+ }
+
+ private static double calculateIntegerMath() {
+ final int numIterations = 1_000_000_000;
+ final int numRuns = 30;
+ double totalMopsPerSec = 0;
+
+ for (int run = 0; run < numRuns; run++) {
+ long startTime = System.nanoTime();
+ int result = 0;
+
+ for (int i = 0; i < numIterations; i++) {
+ result += i * 2;
+ result -= i / 2;
+ result ^= i;
+ result <<= 1;
+ result >>= 1;
+ }
+
+ long endTime = System.nanoTime();
+ double elapsedSeconds = (endTime - startTime) / 1_000_000_000.0;
+ double mopsPerSec = (numIterations / elapsedSeconds) / 1_000_000.0;
+
+ totalMopsPerSec += mopsPerSec;
+ }
+
+ double averageMopsPerSec = totalMopsPerSec / numRuns;
+ return averageMopsPerSec;
+ }
+
+ private static double calculateFloatingPoint() {
+ long numIterations = 85_000_000;
+ int numRuns = 30;
+ double totalMopsPerSec = 0;
+ for (int run = 0; run < numRuns; run++) {
+ double result = 0;
+ long startTime = System.nanoTime();
+
+ for (int i = 0; i < numIterations; i++) {
+ result += Math.sqrt(i) * Math.sin(i) / (i + 1);
+ }
+
+ long endTime = System.nanoTime();
+ double elapsedSeconds = (endTime - startTime) / 1_000_000_000.0;
+ double mopsPerSec = (numIterations / elapsedSeconds) / 1_000_000.0;
+
+ totalMopsPerSec += mopsPerSec;
+ }
+
+ double averageMopsPerSec = totalMopsPerSec / numRuns;
+ return averageMopsPerSec;
+ }
+
+ private static double calculatePrimeNumbers() {
+ int primeCount;
+ long numIterations = 1_000_000;
+ int numRuns = 30;
+ double totalMopsPerSec = 0;
+
+ for (int run = 0; run < numRuns; run++) {
+ primeCount = 0;
+ long startTime = System.nanoTime();
+
+ for (int num = 2; primeCount < numIterations; num++) {
+ if (isPrime(num)) {
+ primeCount++;
+ }
+ }
+
+ long endTime = System.nanoTime();
+ double elapsedSeconds = (endTime - startTime) / 1_000_000_000.0;
+ double mopsPerSec = (primeCount / elapsedSeconds) / 1_000_000.0;
+
+ totalMopsPerSec += mopsPerSec;
+ }
+
+ double averageMopsPerSec = totalMopsPerSec / numRuns;
+ return averageMopsPerSec;
+ }
+
+ private static double calculateStringSorting() {
+ int stringCount = 1_000_000;
+ int stringLength = 100;
+ int numRuns = 30;
+ double totalMopsPerSec = 0;
+
+ for (int run = 0; run < numRuns; run++) {
+ List randomStrings = generateRandomStrings(stringCount, stringLength);
+ long startTime = System.nanoTime();
+ randomStrings.sort(String::compareTo);
+ long endTime = System.nanoTime();
+
+ double elapsedSeconds = (endTime - startTime) / 1_000_000_000.0;
+ double mopsPerSec = (stringCount / elapsedSeconds) / 1_000.0;
+
+ totalMopsPerSec += mopsPerSec;
+ }
+
+ double averageMopsPerSec = totalMopsPerSec / numRuns;
+ return averageMopsPerSec;
+ }
+
+ public static double calculateDataEncryption() {
+ int dataSizeMB = 100;
+ byte[] dataToEncrypt = generateRandomData(dataSizeMB * 1024 * 1024);
+ int numRuns = 20;
+ double totalMBytesPerSec = 0;
+
+ for (int run = 0; run < numRuns; run++) {
+ long startTime = System.nanoTime();
+ byte[] encryptedData = performEncryption(dataToEncrypt, 1);
+
+ long endTime = System.nanoTime();
+ double elapsedSeconds = (endTime - startTime) / 1_000_000_000.0;
+ double mbytesPerSec = (dataToEncrypt.length / (1024 * 1024.0)) / elapsedSeconds;
+
+ totalMBytesPerSec += mbytesPerSec;
+ }
+
+ double averageMBytesPerSec = totalMBytesPerSec / numRuns;
+ return averageMBytesPerSec;
+ }
+
+ private static byte[] performEncryption(byte[] data, int numRuns) {
+ byte[] key = "MyEncryptionKey".getBytes();
+ byte[] result = Arrays.copyOf(data, data.length);
+ for (int run = 0; run < numRuns; run++) {
+ for (int i = 0; i < result.length; i++) {
+ result[i] ^= key[i % key.length];
+ }
+ }
+ return result;
+ }
+
+ public static double calculateDataCompression() {
+ int dataSizeMB = 500;
+ byte[] dataToCompress = generateRandomData(dataSizeMB * 1024 * 1024);
+ long startTime = System.nanoTime();
+ byte[] compressedData = performCompression(dataToCompress);
+ long endTime = System.nanoTime();
+
+ double elapsedSeconds = (endTime - startTime) / 1e9;
+ double mbytesPerSec = (compressedData.length / (1024.0 * 1024.0)) / elapsedSeconds;
+
+ return mbytesPerSec;
+ }
+
+ private static byte[] performCompression(byte[] data) {
+ Deflater deflater = new Deflater();
+ deflater.setInput(data);
+ deflater.finish();
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
+
+ byte[] buffer = new byte[1024];
+ while (!deflater.finished()) {
+ int count = deflater.deflate(buffer);
+ outputStream.write(buffer, 0, count);
+ }
+
+ deflater.end();
+ return outputStream.toByteArray();
+ }
+
+ private static List generateRandomStrings(int count, int length) {
+ SecureRandom random = new SecureRandom();
+ List randomStrings = new ArrayList<>();
+
+ IntStream.range(0, count).forEach(i -> {
+ byte[] bytes = new byte[length];
+ random.nextBytes(bytes);
+ randomStrings.add(Base64.getEncoder().encodeToString(bytes));
+ });
+ return randomStrings;
+ }
+
+ private static byte[] generateRandomData(int size) {
+ SecureRandom random = new SecureRandom();
+ byte[] data = new byte[size];
+ random.nextBytes(data);
+ return data;
+ }
+
+ private static double roundToTwoDecimalPlaces(double value) {
+ return Double.parseDouble(String.format("%.2f", value));
+ }
+
+ private static double calculateCPUScore(long elapsedTimeNs) {
+ return 1.0 / (elapsedTimeNs / 1_000_000.0);
+ }
+
+ public static double calculateDiskSpeed() {
+ int numRuns = 10;
+ int fileSizeMB = 1000;
+
+ double[] writeSpeeds = new double[numRuns];
+ double[] readSpeeds = new double[numRuns];
+
+ for (int run = 0; run < numRuns; run++) {
+ long writeStartTime = System.nanoTime();
+ deleteTestFile(filePath);
+ createTestFile(filePath, fileSizeMB);
+ long writeEndTime = System.nanoTime();
+
+ long readStartTime = System.nanoTime();
+ readTestFile(filePath);
+ long readEndTime = System.nanoTime();
+
+ double writeSpeed = calculateDiskSpeedMBps(fileSizeMB, writeStartTime, writeEndTime);
+ double readSpeed = calculateDiskSpeedMBps(fileSizeMB, readStartTime, readEndTime);
+
+ writeSpeeds[run] = writeSpeed;
+ readSpeeds[run] = readSpeed;
+
+ if (run == 0) {
+ lowestWriteSpeedMBps = writeSpeed;
+ highestWriteSpeedMBps = writeSpeed;
+ lowestReadSpeedMBps = readSpeed;
+ highestReadSpeedMBps = readSpeed;
+ } else {
+ if (writeSpeed < lowestWriteSpeedMBps) {
+ lowestWriteSpeedMBps = writeSpeed;
+ }
+ if (writeSpeed > highestWriteSpeedMBps) {
+ highestWriteSpeedMBps = writeSpeed;
+ }
+ if (readSpeed < lowestReadSpeedMBps) {
+ lowestReadSpeedMBps = readSpeed;
+ }
+ if (readSpeed > highestReadSpeedMBps) {
+ highestReadSpeedMBps = readSpeed;
+ }
+ }
+ }
+ avgWriteSpeedMBps = calculateAverage(writeSpeeds);
+ avgReadSpeedMBps = calculateAverage(readSpeeds);
+ return 2;
+ }
+
+ public static void createTestFile(String filePath, int fileSizeMB) {
+ try {
+ File file = new File(filePath);
+ byte[] data = new byte[1024 * 1024];
+ Arrays.fill(data, (byte) 0);
+ FileOutputStream fos = new FileOutputStream(file);
+ for (int i = 0; i < fileSizeMB; i++) {
+ fos.write(data);
+ }
+ fos.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void readTestFile(String filePath) {
+ try {
+ File file = new File(filePath);
+ FileInputStream fis = new FileInputStream(file);
+ byte[] buffer = new byte[1024];
+ while (fis.read(buffer) != -1) {
+ }
+ fis.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void deleteTestFile(String filePath) {
+ File file = new File(filePath);
+ file.delete();
+ }
+
+ public static double calculateDiskSpeedMBps(int fileSizeMB, long startTime, long endTime) {
+ double elapsedSeconds = (endTime - startTime) / 1_000_000_000.0;
+ double writeSpeed = (fileSizeMB / elapsedSeconds);
+ return writeSpeed;
+ }
+
+ public static double calculateAverage(double[] values) {
+ double sum = 0;
+ for (double value : values) {
+ sum += value;
+ }
+ return sum / values.length;
+ }
+
+ public static void WindowsDiskSpeedTest() {
+ try {
+ String command = "winsat disk";
+ Process process = Runtime.getRuntime().exec(command);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ String line;
+
+ while ((line = reader.readLine()) != null) {
+ Iris.debug(line);
+
+ if (line.contains("Disk Sequential 64.0 Read")) {
+ avgReadSpeedMBps = extractSpeed(line);
+ } else if (line.contains("Disk Sequential 64.0 Write")) {
+ avgWriteSpeedMBps = extractSpeed(line);
+ }
+ }
+
+ process.waitFor();
+ process.destroy();
+
+ Iris.debug("Sequential Read Speed: " + avgReadSpeedMBps + " MB/s");
+ Iris.debug("Sequential Write Speed: " + avgWriteSpeedMBps + " MB/s");
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static double extractSpeed(String line) {
+ String[] tokens = line.split("\\s+");
+ for (int i = 0; i < tokens.length; i++) {
+ if (tokens[i].endsWith("MB/s") && i > 0) {
+ try {
+ return Double.parseDouble(tokens[i - 1]);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return 0.0;
+ }
+
+ public static void WindowsCpuSpeedTest() {
+ try {
+ String command = "winsat cpuformal";
+ Process process = Runtime.getRuntime().exec(command);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ String line;
+
+ while ((line = reader.readLine()) != null) {
+ Iris.debug(line);
+
+ if (line.contains("CPU AES256 Encryption")) {
+ WindowsCPUEncryption = extractCpuInfo(line);
+ }
+ if (line.contains("CPU LZW Compression")) {
+ WindowsCPUCompression = extractCpuInfo(line);
+ }
+ if (line.contains("CPU SHA1 Hash")) {
+ WindowsCPUCSHA1 = extractCpuInfo(line);
+ }
+ }
+ process.waitFor();
+ process.destroy();
+
+ Iris.debug("Winsat Encryption: " + WindowsCPUEncryption + " MB/s");
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static double extractCpuInfo(String line) {
+ String[] tokens = line.split("\\s+");
+ for (int i = 0; i < tokens.length; i++) {
+ if (tokens[i].endsWith("MB/s") && i > 0) {
+ try {
+ return Double.parseDouble(tokens[i - 1]);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return 0.0;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/core/tools/IrisCreator.java b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java
similarity index 82%
rename from src/main/java/com/volmit/iris/core/tools/IrisCreator.java
rename to core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java
index 372a63a74..7e6285d07 100644
--- a/src/main/java/com/volmit/iris/core/tools/IrisCreator.java
+++ b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java
@@ -24,8 +24,10 @@
import com.volmit.iris.core.ServerConfigurator;
import com.volmit.iris.core.pregenerator.PregenTask;
import com.volmit.iris.core.service.StudioSVC;
+import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.object.IrisDimension;
import com.volmit.iris.engine.platform.PlatformChunkGenerator;
+import com.volmit.iris.core.safeguard.UtilsSFG;
import com.volmit.iris.util.exceptions.IrisException;
import com.volmit.iris.util.format.C;
import com.volmit.iris.util.format.Form;
@@ -44,6 +46,11 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark;
+import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode;
/**
* Makes it a lot easier to setup an engine, world, studio or whatever
@@ -93,6 +100,9 @@ public static boolean removeFromBukkitYml(String name) throws IOException {
yml.save(BUKKIT_YML);
return true;
}
+ public static boolean worldLoaded(){
+ return true;
+ }
/**
* Create the IrisAccess (contains the world)
@@ -100,7 +110,15 @@ public static boolean removeFromBukkitYml(String name) throws IOException {
* @return the IrisAccess
* @throws IrisException shit happens
*/
+ IrisPackBenchmarking PackBench = new IrisPackBenchmarking();
public World create() throws IrisException {
+ if (unstablemode){
+ Iris.info(C.RED + "Your server is experiencing an incompatibility with the Iris plugin. Please rectify this problem to avoid further complications.");
+ Iris.info(C.RED + "----------------------------------------------------------------");
+ Iris.info(C.RED + "Operation ran: Loading Iris World..");
+ UtilsSFG.printIncompatibleWarnings();
+ Iris.info(C.RED + "----------------------------------------------------------------");
+ }
if (Bukkit.isPrimaryThread()) {
throw new IrisException("You cannot invoke create() on the main thread.");
}
@@ -117,6 +135,9 @@ public World create() throws IrisException {
if (!studio()) {
Iris.service(StudioSVC.class).installIntoWorld(sender, d.getLoadKey(), new File(Bukkit.getWorldContainer(), name()));
}
+ if (benchmark) {
+ Iris.service(StudioSVC.class).installIntoWorld(sender, d.getLoadKey(), new File(Bukkit.getWorldContainer(), name()));
+ }
PlatformChunkGenerator access = null;
AtomicReference world = new AtomicReference<>();
@@ -143,15 +164,16 @@ public World create() throws IrisException {
}
return finalAccess1.getEngine().getGenerated();
};
- while (g.get() < req) {
- double v = (double) g.get() / (double) req;
-
- if (sender.isPlayer()) {
- sender.sendProgress(v, "Generating");
- J.sleep(16);
- } else {
- sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - g.get()) + " Left)")));
- J.sleep(1000);
+ if(!benchmark) {
+ while (g.get() < req) {
+ double v = (double) g.get() / (double) req;
+ if (sender.isPlayer()) {
+ sender.sendProgress(v, "Generating");
+ J.sleep(16);
+ } else {
+ sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - g.get()) + " Left)")));
+ J.sleep(1000);
+ }
}
}
});
@@ -177,7 +199,7 @@ public World create() throws IrisException {
});
}
- if (studio) {
+ if (studio || benchmark) {
J.s(() -> {
Iris.linkMultiverseCore.removeFromConfig(world.get());
diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java b/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java
new file mode 100644
index 000000000..13577cc82
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java
@@ -0,0 +1,170 @@
+package com.volmit.iris.core.tools;
+
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.pregenerator.IrisPregenerator;
+import com.volmit.iris.core.pregenerator.LazyPregenerator;
+import com.volmit.iris.core.pregenerator.PregenTask;
+import com.volmit.iris.util.exceptions.IrisException;
+import com.volmit.iris.util.format.C;
+import com.volmit.iris.util.math.Position2;
+
+import com.volmit.iris.util.scheduling.J;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.Bukkit;
+
+import java.io.File;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+import static com.volmit.iris.core.commands.CommandIris.BenchDimension;
+
+
+public class IrisPackBenchmarking {
+ public static boolean loaded = false;
+ public static boolean benchmark = false;
+ static boolean cancelled = false;
+ static boolean pregenInProgress = false;
+ static long startTime;
+ static long totalChunks;
+ static long generatedChunks;
+ static double elapsedTimeNs;
+
+ public static void runBenchmark() {
+ // IrisPackBenchmarking IrisPackBenchmarking = new IrisPackBenchmarking();
+ benchmark = true;
+ Iris.info(C.BLUE + "Benchmarking Dimension: " + C.AQUA + BenchDimension);
+ //progress();
+ CompletableFuture future = CompletableFuture.runAsync(() -> {
+ Iris.info(C.GOLD + "Setting everything up..");
+ try {
+ String BenchmarkFolder = "\\Benchmark";
+ File folder = new File(BenchmarkFolder);
+ if (folder.exists() && folder.isDirectory()) {
+ FileUtils.deleteDirectory(folder);
+ Iris.debug("Deleted old Benchmark");
+ } else {
+ Iris.info(C.GOLD + "Old Benchmark not found!");
+ if(folder.exists()){
+ Iris.info(C.RED + "FAILED To remove old Benchmark!");
+ //cancelled = true;
+
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException();
+ }
+
+ }).thenRun(() -> {
+ Iris.info(C.GOLD + "Creating Benchmark Environment");
+ createBenchmark();
+
+ }).thenRun(() -> {
+ Iris.info( C.BLUE + "Benchmark Started!");
+ boolean done = false;
+ startBenchmarkTimer();
+ startBenchmark();
+ basicScheduler();
+ }).thenRun(() -> {
+
+ });
+ // cancelled = future.cancel(true);
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static void results(){
+ double averageCps = calculateAverageCPS();
+ Iris.info("Benchmark Dimension: " + BenchDimension);
+ Iris.info("Speeds");
+ Iris.info("- Average CPS: " + roundToTwoDecimalPlaces(averageCps));
+ Iris.info("Duration: " + roundToTwoDecimalPlaces(elapsedTimeNs));
+
+ }
+ private static void basicScheduler() {
+ while (true) {
+ totalChunks = IrisPregenerator.getLongTotalChunks();
+ generatedChunks = IrisPregenerator.getLongGeneratedChunks();
+ if(totalChunks > 0) {
+ if (generatedChunks >= totalChunks) {
+ Iris.info("Benchmark Completed!");
+ elapsedTimeNs = stopBenchmarkTimer();
+ results();
+ break;
+ }
+ }
+ //J.sleep(100); test
+ }
+ }
+ static void createBenchmark(){
+ try {
+ IrisToolbelt.createWorld()
+ .dimension(BenchDimension)
+ .name("Benchmark")
+ .seed(1337)
+ .studio(false)
+ .create();
+ } catch (IrisException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ static void startBenchmark(){
+ int x = 0;
+ int z = 0;
+ IrisToolbelt.pregenerate(PregenTask
+ .builder()
+ .center(new Position2(x, z))
+ .width(5)
+ .height(5)
+ .build(), Bukkit.getWorld("Benchmark")
+ );
+ }
+ static void startLazyBenchmark(){
+ int x = 0;
+ int z = 0;
+ LazyPregenerator.LazyPregenJob pregenJob = LazyPregenerator.LazyPregenJob.builder()
+ //.world("Benchmark")
+ .healingPosition(0)
+ .healing(false)
+ .chunksPerMinute(3200)
+ .radiusBlocks(5000)
+ .position(0)
+ .build();
+
+ LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, new File("plugins/Iris/lazygen.json"));
+ pregenerator.start();
+ }
+ public static double calculateAverageCPS() {
+ double elapsedTimeSec = elapsedTimeNs / 1_000_000_000.0; // Convert to seconds
+ return generatedChunks / elapsedTimeSec;
+ }
+
+ private static void startBenchmarkTimer() {
+ startTime = System.nanoTime();
+ }
+
+ private static double stopBenchmarkTimer() {
+ long endTime = System.nanoTime();
+ return (endTime - startTime) / 1_000_000_000.0;
+ }
+
+ public static void deleteDirectory(File dir) {
+ File[] files = dir.listFiles();
+ if(files != null) {
+ for(File file: files) {
+ if(file.isDirectory()) {
+ deleteDirectory(file);
+ } else {
+ file.delete();
+ }
+ }
+ }
+ dir.delete();
+ }
+ private static double roundToTwoDecimalPlaces(double value) {
+ return Double.parseDouble(String.format("%.2f", value));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/core/tools/IrisReflectiveAPI.java b/core/src/main/java/com/volmit/iris/core/tools/IrisReflectiveAPI.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/tools/IrisReflectiveAPI.java
rename to core/src/main/java/com/volmit/iris/core/tools/IrisReflectiveAPI.java
diff --git a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java b/core/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java
rename to core/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java
diff --git a/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java b/core/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java
similarity index 96%
rename from src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java
rename to core/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java
index 14d9a732f..cd6c17a91 100644
--- a/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java
+++ b/core/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java
@@ -19,8 +19,7 @@
package com.volmit.iris.core.tools;
import com.volmit.iris.core.loader.IrisData;
-import com.volmit.iris.engine.object.IrisDimension;
-import com.volmit.iris.engine.object.IrisWorld;
+import com.volmit.iris.engine.object.*;
import com.volmit.iris.engine.platform.BukkitChunkGenerator;
import org.bukkit.Bukkit;
import org.bukkit.World;
@@ -79,6 +78,7 @@ public WorldCreator create() {
? dim.getLoader().getDataFolder() :
new File(w.worldFolder(), "iris/pack"), dimensionName);
+
return new WorldCreator(name)
.environment(findEnvironment())
.generateStructures(true)
diff --git a/src/main/java/com/volmit/iris/core/wand/WandSelection.java b/core/src/main/java/com/volmit/iris/core/wand/WandSelection.java
similarity index 100%
rename from src/main/java/com/volmit/iris/core/wand/WandSelection.java
rename to core/src/main/java/com/volmit/iris/core/wand/WandSelection.java
diff --git a/src/main/java/com/volmit/iris/engine/EnginePanic.java b/core/src/main/java/com/volmit/iris/engine/EnginePanic.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/EnginePanic.java
rename to core/src/main/java/com/volmit/iris/engine/EnginePanic.java
diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java
similarity index 99%
rename from src/main/java/com/volmit/iris/engine/IrisComplex.java
rename to core/src/main/java/com/volmit/iris/engine/IrisComplex.java
index 989aa0ef9..db92954a8 100644
--- a/src/main/java/com/volmit/iris/engine/IrisComplex.java
+++ b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java
@@ -35,6 +35,8 @@
import com.volmit.iris.util.stream.ProceduralStream;
import com.volmit.iris.util.stream.interpolation.Interpolated;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -42,6 +44,8 @@
import java.util.UUID;
@Data
+@EqualsAndHashCode(exclude = "data")
+@ToString(exclude = "data")
public class IrisComplex implements DataProvider {
private static final BlockData AIR = Material.AIR.createBlockData();
private RNG rng;
diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java
similarity index 89%
rename from src/main/java/com/volmit/iris/engine/IrisEngine.java
rename to core/src/main/java/com/volmit/iris/engine/IrisEngine.java
index 7b6c1850b..e1ea0a00e 100644
--- a/src/main/java/com/volmit/iris/engine/IrisEngine.java
+++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java
@@ -21,9 +21,12 @@
import com.google.common.util.concurrent.AtomicDouble;
import com.google.gson.Gson;
import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.ServerConfigurator;
import com.volmit.iris.core.events.IrisEngineHotloadEvent;
import com.volmit.iris.core.gui.PregeneratorJob;
+import com.volmit.iris.core.nms.container.BlockPos;
+import com.volmit.iris.core.nms.container.Pair;
import com.volmit.iris.core.project.IrisProject;
import com.volmit.iris.core.service.PreservationSVC;
import com.volmit.iris.engine.data.cache.AtomicCache;
@@ -48,12 +51,13 @@
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import lombok.Data;
-import net.minecraft.core.BlockPos;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.command.CommandSender;
-import oshi.util.tuples.Pair;
import java.io.File;
import java.io.IOException;
@@ -62,8 +66,12 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
@Data
+@EqualsAndHashCode(exclude = "context")
+@ToString(exclude = "context")
public class IrisEngine implements Engine {
private final AtomicInteger bud;
private final AtomicInteger buds;
@@ -250,7 +258,14 @@ public IrisEngineData getEngineData() {
if (!f.exists()) {
try {
f.getParentFile().mkdirs();
- IO.writeAll(f, new Gson().toJson(new IrisEngineData()));
+ IrisEngineData data = new IrisEngineData();
+ data.getStatistics().setVersion(Iris.instance.getIrisVersion());
+ data.getStatistics().setMCVersion(Iris.instance.getMCVersion());
+ data.getStatistics().setUpgradedVersion(Iris.instance.getIrisVersion());
+ if (data.getStatistics().getVersion() == -1 || data.getStatistics().getMCVersion() == -1 ) {
+ Iris.error("Failed to setup Engine Data!");
+ }
+ IO.writeAll(f, new Gson().toJson(data));
} catch (IOException e) {
e.printStackTrace();
}
@@ -418,7 +433,6 @@ public void recycle() {
J.a(() -> {
try {
- getMantle().trim();
getData().getObjectLoader().clean();
} catch (Throwable e) {
Iris.reportError(e);
@@ -518,4 +532,19 @@ public boolean hasFailed() {
public int getCacheID() {
return cacheId;
}
+
+ private boolean EngineSafe() {
+ // Todo: this has potential if done right
+ int EngineMCVersion = getEngineData().getStatistics().getMCVersion();
+ int EngineIrisVersion = getEngineData().getStatistics().getVersion();
+ int MinecraftVersion = Iris.instance.getMCVersion();
+ int IrisVersion = Iris.instance.getIrisVersion();
+ if (EngineIrisVersion != IrisVersion) {
+ return false;
+ }
+ if (EngineMCVersion != MinecraftVersion) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineEffects.java b/core/src/main/java/com/volmit/iris/engine/IrisEngineEffects.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/IrisEngineEffects.java
rename to core/src/main/java/com/volmit/iris/engine/IrisEngineEffects.java
diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java
similarity index 92%
rename from src/main/java/com/volmit/iris/engine/IrisEngineMantle.java
rename to core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java
index 2ba5b5526..f61d90531 100644
--- a/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java
+++ b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java
@@ -19,6 +19,8 @@
package com.volmit.iris.engine;
import com.volmit.iris.Iris;
+import com.volmit.iris.core.IrisSettings;
+import com.volmit.iris.core.tools.IrisPackBenchmarking;
import com.volmit.iris.engine.data.cache.AtomicCache;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.EngineMantle;
@@ -31,10 +33,13 @@
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.collection.KSet;
+import com.volmit.iris.util.format.C;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.parallel.BurstExecutor;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import org.bukkit.util.BlockVector;
import java.io.File;
@@ -42,7 +47,12 @@
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
+import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark;
+import static com.volmit.iris.core.safeguard.PerformanceSFG.*;
+
@Data
+@EqualsAndHashCode(exclude = "engine")
+@ToString(exclude = "engine")
public class IrisEngineMantle implements EngineMantle {
private final Engine engine;
private final Mantle mantle;
@@ -280,10 +290,16 @@ private int computeParallaxSize() {
x = Math.max(x, c);
x = (Math.max(x, 16) + 16) >> 4;
x = x % 2 == 0 ? x + 1 : x;
- Iris.info("Mantle Size: " + x + " Chunks");
- Iris.info(" Object Mantle Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")");
- Iris.info(" Jigsaw Mantle Size: " + jig + " (" + ((Math.max(jig, 16) + 16) >> 4) + ")");
- Iris.info(" Carving Mantle Size: " + c + " (" + ((Math.max(c, 16) + 16) >> 4) + ")");
+ if (benchmark){
+ x = 4;
+ Iris.info("Mantle Size: " + x + " Chunks " + C.BLUE + "BENCHMARK MODE");
+ } else {
+ Iris.info("Mantle Size: " + x + " Chunks");
+ Iris.info(" Object Mantle Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")");
+ Iris.info(" Jigsaw Mantle Size: " + jig + " (" + ((Math.max(jig, 16) + 16) >> 4) + ")");
+ Iris.info(" Carving Mantle Size: " + c + " (" + ((Math.max(c, 16) + 16) >> 4) + ")");
+ }
+
return x;
}
diff --git a/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java b/core/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java
similarity index 95%
rename from src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java
rename to core/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java
index 4420600a4..51ca6d1f9 100644
--- a/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java
+++ b/core/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java
@@ -25,11 +25,15 @@
import com.volmit.iris.engine.scripting.IrisScriptingAPI;
import com.volmit.iris.util.format.C;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import org.apache.bsf.BSFException;
import org.apache.bsf.BSFManager;
import org.apache.bsf.engines.javascript.JavaScriptEngine;
@Data
+@EqualsAndHashCode(exclude = "engine")
+@ToString(exclude = "engine")
public class IrisExecutionEnvironment implements EngineExecutionEnvironment {
private final BSFManager manager;
private final Engine engine;
diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/IrisWorldManager.java
rename to core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java
diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java b/core/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java
rename to core/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java
diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java b/core/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java
rename to core/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java
diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java b/core/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java
rename to core/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java
diff --git a/src/main/java/com/volmit/iris/engine/data/cache/AtomicCache.java b/core/src/main/java/com/volmit/iris/engine/data/cache/AtomicCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/cache/AtomicCache.java
rename to core/src/main/java/com/volmit/iris/engine/data/cache/AtomicCache.java
diff --git a/src/main/java/com/volmit/iris/engine/data/cache/Cache.java b/core/src/main/java/com/volmit/iris/engine/data/cache/Cache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/cache/Cache.java
rename to core/src/main/java/com/volmit/iris/engine/data/cache/Cache.java
diff --git a/src/main/java/com/volmit/iris/engine/data/cache/Multicache.java b/core/src/main/java/com/volmit/iris/engine/data/cache/Multicache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/cache/Multicache.java
rename to core/src/main/java/com/volmit/iris/engine/data/cache/Multicache.java
diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java b/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java
rename to core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java
diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java b/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java
rename to core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java
diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java b/core/src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java
rename to core/src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/Deserializer.java b/core/src/main/java/com/volmit/iris/engine/data/io/Deserializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/Deserializer.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/Deserializer.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/ExceptionBiFunction.java b/core/src/main/java/com/volmit/iris/engine/data/io/ExceptionBiFunction.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/ExceptionBiFunction.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/ExceptionBiFunction.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/ExceptionTriConsumer.java b/core/src/main/java/com/volmit/iris/engine/data/io/ExceptionTriConsumer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/ExceptionTriConsumer.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/ExceptionTriConsumer.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/MaxDepthIO.java b/core/src/main/java/com/volmit/iris/engine/data/io/MaxDepthIO.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/MaxDepthIO.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/MaxDepthIO.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/MaxDepthReachedException.java b/core/src/main/java/com/volmit/iris/engine/data/io/MaxDepthReachedException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/MaxDepthReachedException.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/MaxDepthReachedException.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/Serializer.java b/core/src/main/java/com/volmit/iris/engine/data/io/Serializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/Serializer.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/Serializer.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/StringDeserializer.java b/core/src/main/java/com/volmit/iris/engine/data/io/StringDeserializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/StringDeserializer.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/StringDeserializer.java
diff --git a/src/main/java/com/volmit/iris/engine/data/io/StringSerializer.java b/core/src/main/java/com/volmit/iris/engine/data/io/StringSerializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/data/io/StringSerializer.java
rename to core/src/main/java/com/volmit/iris/engine/data/io/StringSerializer.java
diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/BlockUpdater.java b/core/src/main/java/com/volmit/iris/engine/framework/BlockUpdater.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/BlockUpdater.java
rename to core/src/main/java/com/volmit/iris/engine/framework/BlockUpdater.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java
similarity index 94%
rename from src/main/java/com/volmit/iris/engine/framework/Engine.java
rename to core/src/main/java/com/volmit/iris/engine/framework/Engine.java
index 794c7ec6f..4d57cdf83 100644
--- a/src/main/java/com/volmit/iris/engine/framework/Engine.java
+++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java
@@ -24,6 +24,8 @@
import com.volmit.iris.core.gui.components.Renderer;
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.loader.IrisRegistrant;
+import com.volmit.iris.core.nms.container.BlockPos;
+import com.volmit.iris.core.nms.container.Pair;
import com.volmit.iris.engine.IrisComplex;
import com.volmit.iris.engine.data.cache.Cache;
import com.volmit.iris.engine.data.chunk.TerrainChunk;
@@ -49,6 +51,7 @@
import com.volmit.iris.util.matter.MatterCavern;
import com.volmit.iris.util.matter.MatterUpdate;
import com.volmit.iris.util.matter.TileWrapper;
+import com.volmit.iris.util.matter.slices.container.JigsawPieceContainer;
import com.volmit.iris.util.parallel.BurstExecutor;
import com.volmit.iris.util.parallel.MultiBurst;
import com.volmit.iris.util.scheduling.ChronoLatch;
@@ -56,7 +59,6 @@
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import com.volmit.iris.util.stream.ProceduralStream;
import io.papermc.lib.PaperLib;
-import net.minecraft.core.BlockPos;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
@@ -70,7 +72,6 @@
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
-import oshi.util.tuples.Pair;
import java.awt.*;
import java.util.Arrays;
@@ -345,6 +346,7 @@ default void updateLighting(int x, int y, int z, Chunk c) {
@BlockCoordinates
@Override
+
default void update(int x, int y, int z, Chunk c, RNG rf) {
Block block = c.getBlock(x, y, z);
BlockData data = block.getBlockData();
@@ -361,8 +363,17 @@ default void update(int x, int y, int z, Chunk c, RNG rf) {
KList tables = getLootTables(rx, block);
try {
+ Bukkit.getPluginManager().callEvent(new IrisLootEvent(this, block, slot, tables));
+
+ if (!tables.isEmpty()){
+ Iris.debug("IrisLootEvent has been accessed");
+ }
+
+ if (tables.isEmpty())
+ return;
InventoryHolder m = (InventoryHolder) block.getState();
addItems(false, m.getInventory(), rx, tables, slot, x, y, z, 15);
+
} catch (Throwable e) {
Iris.reportError(e);
}
@@ -512,8 +523,9 @@ default MultiBurst burst() {
return getTarget().getBurster();
}
+ @Deprecated
default void clean() {
- burst().lazy(() -> getMantle().trim());
+ burst().lazy(() -> getMantle().trim(10));
}
@BlockCoordinates
@@ -651,7 +663,7 @@ default IrisPosition lookForBiome(IrisBiome biome, long timeout, Consumer triesc) {
- if (getWorld().hasRealWorld()) {
+ if (!getWorld().hasRealWorld()) {
Iris.error("Cannot GOTO without a bound world (headless mode)");
return null;
}
@@ -758,6 +770,15 @@ default PlacedObject getObjectPlacement(int x, int y, int z) {
String[] v = objectAt.split("\\Q@\\E");
String object = v[0];
int id = Integer.parseInt(v[1]);
+
+
+ JigsawPieceContainer container = getMantle().getMantle().get(x, y, z, JigsawPieceContainer.class);
+ if (container != null) {
+ IrisJigsawPiece piece = container.load(getData());
+ if (piece.getObject().equals(object))
+ return new PlacedObject(piece.getPlacementOptions(), getData().getObjectLoader().load(object), id, x, z);
+ }
+
IrisRegion region = getRegion(x, z);
for (IrisObjectPlacement i : region.getObjects()) {
@@ -777,14 +798,13 @@ default PlacedObject getObjectPlacement(int x, int y, int z) {
return new PlacedObject(null, getData().getObjectLoader().load(object), id, x, z);
}
-
int getCacheID();
default IrisBiome getBiomeOrMantle(Location l) {
return getBiomeOrMantle(l.getBlockX(), l.getBlockY(), l.getBlockZ());
}
- default void gotoBiome(IrisBiome biome, Player player) {
+ default void gotoBiome(IrisBiome biome, Player player, boolean teleport) {
Set regionKeys = getDimension()
.getAllRegions(this).stream()
.filter((i) -> i.getAllBiomes(this).contains(biome))
@@ -796,13 +816,13 @@ default void gotoBiome(IrisBiome biome, Player player) {
&& lb.matches(engine, chunk);
if (!regionKeys.isEmpty()) {
- locator.find(player);
+ locator.find(player, teleport, "Biome " + biome.getName());
} else {
player.sendMessage(C.RED + biome.getName() + " is not in any defined regions!");
}
}
- default void gotoJigsaw(IrisJigsawStructure s, Player player) {
+ default void gotoJigsaw(IrisJigsawStructure s, Player player, boolean teleport) {
if (s.getLoadKey().equals(getDimension().getStronghold())) {
KList p = getDimension().getStrongholds(getSeedManager().getSpawn());
@@ -839,7 +859,7 @@ default void gotoJigsaw(IrisJigsawStructure s, Player player) {
if (getDimension().getJigsawStructures().stream()
.map(IrisJigsawStructurePlacement::getStructure)
.collect(Collectors.toSet()).contains(s.getLoadKey())) {
- Locator.jigsawStructure(s.getLoadKey()).find(player);
+ Locator.jigsawStructure(s.getLoadKey()).find(player, teleport, "Structure " + s.getLoadKey());
} else {
Set biomeKeys = getDimension().getAllBiomes(this).stream()
.filter((i) -> i.getJigsawStructures()
@@ -866,7 +886,7 @@ default void gotoJigsaw(IrisJigsawStructure s, Player player) {
};
if (!regionKeys.isEmpty()) {
- locator.find(player);
+ locator.find(player, teleport, "Structure " + s.getLoadKey());
} else {
player.sendMessage(C.RED + s.getLoadKey() + " is not in any defined regions, biomes or dimensions!");
}
@@ -874,7 +894,7 @@ default void gotoJigsaw(IrisJigsawStructure s, Player player) {
}
- default void gotoObject(String s, Player player) {
+ default void gotoObject(String s, Player player, boolean teleport) {
Set biomeKeys = getDimension().getAllBiomes(this).stream()
.filter((i) -> i.getObjects().stream().anyMatch((f) -> f.getPlace().contains(s)))
.map(IrisRegistrant::getLoadKey)
@@ -897,23 +917,23 @@ default void gotoObject(String s, Player player) {
};
if (!regionKeys.isEmpty()) {
- locator.find(player);
+ locator.find(player, teleport, "Object " + s);
} else {
player.sendMessage(C.RED + s + " is not in any defined regions or biomes!");
}
}
- default void gotoRegion(IrisRegion r, Player player) {
+ default void gotoRegion(IrisRegion r, Player player, boolean teleport) {
if (!getDimension().getAllRegions(this).contains(r)) {
player.sendMessage(C.RED + r.getName() + " is not defined in the dimension!");
return;
}
- Locator.region(r.getLoadKey()).find(player);
+ Locator.region(r.getLoadKey()).find(player, teleport, "Region " + r.getName());
}
- default void gotoPOI(String type, Player p) {
- Locator.poi(type).find(p);
+ default void gotoPOI(String type, Player p, boolean teleport) {
+ Locator.poi(type).find(p, teleport, "POI " + type);
}
default void cleanupMantleChunk(int x, int z) {
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineActuator.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineActuator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineActuator.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineActuator.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedBiModifier.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedBiModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineAssignedBiModifier.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedBiModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java
similarity index 91%
rename from src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java
index a9e83e95c..b356eb722 100644
--- a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java
+++ b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java
@@ -21,8 +21,12 @@
import com.volmit.iris.Iris;
import com.volmit.iris.util.math.RollingSequence;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
@Data
+@EqualsAndHashCode(exclude = "engine")
+@ToString(exclude = "engine")
public class EngineAssignedComponent implements EngineComponent {
private final Engine engine;
private final RollingSequence metrics;
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedModifier.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineAssignedModifier.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineBiModifier.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineBiModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineBiModifier.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineBiModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineComponent.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineComponent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineComponent.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineComponent.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineData.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineData.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineData.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineData.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineEffects.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineEffects.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineEffects.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineEffects.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineMetrics.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineMetrics.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineMetrics.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineMetrics.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineMode.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineMode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineMode.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineMode.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineModifier.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineModifier.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EnginePlayer.java b/core/src/main/java/com/volmit/iris/engine/framework/EnginePlayer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EnginePlayer.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EnginePlayer.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineStage.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineStage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineStage.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineStage.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java
similarity index 92%
rename from src/main/java/com/volmit/iris/engine/framework/EngineTarget.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java
index cd33cf998..7e9388ffb 100644
--- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java
+++ b/core/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java
@@ -23,8 +23,12 @@
import com.volmit.iris.engine.object.IrisWorld;
import com.volmit.iris.util.parallel.MultiBurst;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
@Data
+@EqualsAndHashCode(exclude = "data")
+@ToString(exclude = "data")
public class EngineTarget {
private final MultiBurst burster;
private final IrisData data;
diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineWorldManager.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineWorldManager.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/EngineWorldManager.java
rename to core/src/main/java/com/volmit/iris/engine/framework/EngineWorldManager.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/Fallible.java b/core/src/main/java/com/volmit/iris/engine/framework/Fallible.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/Fallible.java
rename to core/src/main/java/com/volmit/iris/engine/framework/Fallible.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/Hotloadable.java b/core/src/main/java/com/volmit/iris/engine/framework/Hotloadable.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/Hotloadable.java
rename to core/src/main/java/com/volmit/iris/engine/framework/Hotloadable.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/IrisEngineMode.java b/core/src/main/java/com/volmit/iris/engine/framework/IrisEngineMode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/IrisEngineMode.java
rename to core/src/main/java/com/volmit/iris/engine/framework/IrisEngineMode.java
diff --git a/core/src/main/java/com/volmit/iris/engine/framework/IrisLootEvent.java b/core/src/main/java/com/volmit/iris/engine/framework/IrisLootEvent.java
new file mode 100644
index 000000000..057763893
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/engine/framework/IrisLootEvent.java
@@ -0,0 +1,32 @@
+package com.volmit.iris.engine.framework;
+
+import com.volmit.iris.engine.object.InventorySlotType;
+import com.volmit.iris.engine.object.IrisLootTable;
+import com.volmit.iris.util.collection.KList;
+import lombok.Getter;
+import org.bukkit.block.Block;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+@Getter
+public class IrisLootEvent extends Event {
+ private static final HandlerList handlers = new HandlerList();
+ private final Engine engine;
+ private final Block block;
+ private final InventorySlotType slot;
+ private final KList tables;
+
+ public IrisLootEvent(Engine engine, Block block, InventorySlotType slot, KList tables) {
+ this.engine = engine;
+ this.block = block;
+ this.slot = slot;
+ this.tables = tables;
+ }
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
diff --git a/src/main/java/com/volmit/iris/engine/framework/Locator.java b/core/src/main/java/com/volmit/iris/engine/framework/Locator.java
similarity index 85%
rename from src/main/java/com/volmit/iris/engine/framework/Locator.java
rename to core/src/main/java/com/volmit/iris/engine/framework/Locator.java
index 8e57298f5..0c05c068b 100644
--- a/src/main/java/com/volmit/iris/engine/framework/Locator.java
+++ b/core/src/main/java/com/volmit/iris/engine/framework/Locator.java
@@ -19,12 +19,15 @@
package com.volmit.iris.engine.framework;
import com.volmit.iris.core.IrisSettings;
+import com.volmit.iris.core.nms.container.BlockPos;
+import com.volmit.iris.core.nms.container.Pair;
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.object.IrisBiome;
import com.volmit.iris.engine.object.IrisJigsawStructure;
import com.volmit.iris.engine.object.IrisObject;
import com.volmit.iris.engine.object.IrisRegion;
import com.volmit.iris.util.context.ChunkContext;
+import com.volmit.iris.util.format.C;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.math.M;
import com.volmit.iris.util.math.Position2;
@@ -36,10 +39,9 @@
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import com.volmit.iris.util.scheduling.jobs.SingleJob;
-import net.minecraft.core.BlockPos;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.entity.Player;
-import oshi.util.tuples.Pair;
import java.util.Set;
import java.util.concurrent.ExecutionException;
@@ -109,23 +111,35 @@ static Locator caveOrMantleBiome(String loadKey) {
boolean matches(Engine engine, Position2 chunk);
- default void find(Player player) {
- find(player, 30_000);
+ default void find(Player player, boolean teleport, String message) {
+ find(player, location -> {
+ if (teleport) {
+ J.s(() -> player.teleport(location));
+ } else {
+ player.sendMessage(C.GREEN + message + " at: " + location.getBlockX() + " " + location.getBlockY() + " " + location.getBlockZ());
+ }
+ });
+ }
+
+ default void find(Player player, Consumer consumer) {
+ find(player, 30_000, consumer);
}
- default void find(Player player, long timeout) {
+ default void find(Player player, long timeout, Consumer consumer) {
AtomicLong checks = new AtomicLong();
long ms = M.ms();
new SingleJob("Searching", () -> {
try {
- Position2 at = find(IrisToolbelt.access(player.getWorld()).getEngine(), new Position2(player.getLocation().getBlockX() >> 4, player.getLocation().getBlockZ() >> 4), timeout, checks::set).get();
+ World world = player.getWorld();
+ Engine engine = IrisToolbelt.access(world).getEngine();
+ Position2 at = find(engine, new Position2(player.getLocation().getBlockX() >> 4, player.getLocation().getBlockZ() >> 4), timeout, checks::set).get();
if (at != null) {
- J.s(() -> player.teleport(new Location(player.getWorld(), (at.getX() << 4) + 8,
- IrisToolbelt.access(player.getWorld()).getEngine().getHeight(
+ consumer.accept(new Location(world, (at.getX() << 4) + 8,
+ engine.getHeight(
(at.getX() << 4) + 8,
(at.getZ() << 4) + 8, false),
- (at.getZ() << 4) + 8)));
+ (at.getZ() << 4) + 8));
}
} catch (WrongEngineBroException | InterruptedException | ExecutionException e) {
e.printStackTrace();
diff --git a/src/main/java/com/volmit/iris/engine/framework/LocatorCanceller.java b/core/src/main/java/com/volmit/iris/engine/framework/LocatorCanceller.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/LocatorCanceller.java
rename to core/src/main/java/com/volmit/iris/engine/framework/LocatorCanceller.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/LootProvider.java b/core/src/main/java/com/volmit/iris/engine/framework/LootProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/LootProvider.java
rename to core/src/main/java/com/volmit/iris/engine/framework/LootProvider.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/MeteredCache.java b/core/src/main/java/com/volmit/iris/engine/framework/MeteredCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/MeteredCache.java
rename to core/src/main/java/com/volmit/iris/engine/framework/MeteredCache.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/PlacedObject.java b/core/src/main/java/com/volmit/iris/engine/framework/PlacedObject.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/PlacedObject.java
rename to core/src/main/java/com/volmit/iris/engine/framework/PlacedObject.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/PregeneratedData.java b/core/src/main/java/com/volmit/iris/engine/framework/PregeneratedData.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/PregeneratedData.java
rename to core/src/main/java/com/volmit/iris/engine/framework/PregeneratedData.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/SeedManager.java b/core/src/main/java/com/volmit/iris/engine/framework/SeedManager.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/SeedManager.java
rename to core/src/main/java/com/volmit/iris/engine/framework/SeedManager.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/Staged.java b/core/src/main/java/com/volmit/iris/engine/framework/Staged.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/Staged.java
rename to core/src/main/java/com/volmit/iris/engine/framework/Staged.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/WrongEngineBroException.java b/core/src/main/java/com/volmit/iris/engine/framework/WrongEngineBroException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/WrongEngineBroException.java
rename to core/src/main/java/com/volmit/iris/engine/framework/WrongEngineBroException.java
diff --git a/src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java b/core/src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java
rename to core/src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java
diff --git a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java
similarity index 88%
rename from src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java
rename to core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java
index 158790a91..e93fe5c7d 100644
--- a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java
+++ b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java
@@ -18,6 +18,7 @@
package com.volmit.iris.engine.jigsaw;
+import com.volmit.iris.Iris;
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.framework.Engine;
@@ -38,6 +39,9 @@
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.util.BlockVector;
+import java.util.ArrayList;
+import java.util.List;
+
@SuppressWarnings("ALL")
@Data
public class PlannedPiece {
@@ -72,6 +76,7 @@ public PlannedPiece(PlannedStructure structure, IrisPosition position, IrisJigsa
this.object.setLoadKey(piece.getObject());
this.ogObject.setLoadKey(piece.getObject());
this.connected = new KList<>();
+
}
public void setPosition(IrisPosition p) {
@@ -133,10 +138,29 @@ public IrisPosition getWorldPosition(IrisJigsawPieceConnector c) {
return getWorldPosition(c.getPosition());
}
+ public List getConnectorWorldPositions() {
+ List worldPositions = new ArrayList<>();
+
+ for (IrisJigsawPieceConnector connector : this.piece.getConnectors()) {
+ IrisPosition worldPosition = getWorldPosition(connector.getPosition());
+ worldPositions.add(worldPosition);
+ }
+
+ return worldPositions;
+ }
+
public IrisPosition getWorldPosition(IrisPosition position) {
return this.position.add(position).add(new IrisPosition(object.getCenter()));
}
+ public void debugPrintConnectorPositions() {
+ Iris.debug("Connector World Positions for PlannedPiece at " + position + ":");
+ List connectorPositions = getConnectorWorldPositions();
+ for (IrisPosition pos : connectorPositions) {
+ Iris.debug(" - Connector at: " + pos);
+ }
+ }
+
public boolean isFull() {
return connected.size() >= piece.getConnectors().size() || isDead();
}
diff --git a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java
similarity index 80%
rename from src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java
rename to core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java
index 63d8c97f2..e4d2b0853 100644
--- a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java
+++ b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java
@@ -23,13 +23,18 @@
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.engine.data.cache.Cache;
import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.engine.mantle.MantleWriter;
import com.volmit.iris.engine.object.*;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.math.RNG;
+import com.volmit.iris.util.matter.slices.JigsawPieceMatter;
+import com.volmit.iris.util.matter.slices.container.JigsawPieceContainer;
import lombok.Data;
import org.bukkit.Axis;
import org.bukkit.World;
+import org.bukkit.block.TileState;
+import org.bukkit.block.data.BlockData;
@Data
public class PlannedStructure {
@@ -70,7 +75,7 @@ public PlannedStructure(IrisJigsawStructure structure, IrisPosition position, RN
}
}
- public void place(IObjectPlacer placer, Mantle e, Engine eng) {
+ public void place(MantleWriter placer, Mantle e, Engine eng) {
IrisObjectPlacement options = new IrisObjectPlacement();
options.getRotation().setEnabled(false);
int startHeight = pieces.get(0).getPosition().getY();
@@ -80,7 +85,7 @@ public void place(IObjectPlacer placer, Mantle e, Engine eng) {
}
}
- public void place(PlannedPiece i, int startHeight, IrisObjectPlacement o, IObjectPlacer placer, Mantle e, Engine eng) {
+ public void place(PlannedPiece i, int startHeight, IrisObjectPlacement o, MantleWriter placer, Mantle e, Engine eng) {
IrisObjectPlacement options = o;
if (i.getPiece().getPlacementOptions() != null) {
@@ -117,7 +122,70 @@ public void place(PlannedPiece i, int startHeight, IrisObjectPlacement o, IObjec
}
int id = rng.i(0, Integer.MAX_VALUE);
- vo.place(xx, height, zz, placer, options, rng, (b, data) -> e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id), null, getData());
+ JigsawPieceContainer container = JigsawPieceContainer.toContainer(i.getPiece());
+ vo.place(xx, height, zz, new IObjectPlacer() {
+ @Override
+ public int getHighest(int x, int z, IrisData data) {
+ return placer.getHighest(x, z, data);
+ }
+
+ @Override
+ public int getHighest(int x, int z, IrisData data, boolean ignoreFluid) {
+ return placer.getHighest(x, z, data, ignoreFluid);
+ }
+
+ @Override
+ public void set(int x, int y, int z, BlockData d) {
+ placer.setData(x, y, z, container);
+ placer.set(x, y, z, d);
+ }
+
+ @Override
+ public BlockData get(int x, int y, int z) {
+ placer.setData(x, y, z, container);
+ return placer.get(x, y, z);
+ }
+
+ @Override
+ public boolean isPreventingDecay() {
+ return placer.isPreventingDecay();
+ }
+
+ @Override
+ public boolean isCarved(int x, int y, int z) {
+ return placer.isCarved(x, y, z);
+ }
+
+ @Override
+ public boolean isSolid(int x, int y, int z) {
+ return placer.isSolid(x, y, z);
+ }
+
+ @Override
+ public boolean isUnderwater(int x, int z) {
+ return placer.isUnderwater(x, z);
+ }
+
+ @Override
+ public int getFluidHeight() {
+ return placer.getFluidHeight();
+ }
+
+ @Override
+ public boolean isDebugSmartBore() {
+ return placer.isDebugSmartBore();
+ }
+
+ @Override
+ public void setTile(int xx, int yy, int zz, TileData extends TileState> tile) {
+ placer.setTile(xx, yy, zz, tile);
+ }
+
+ @Override
+ public Engine getEngine() {
+ return placer.getEngine();
+ }
+ }, options, rng, (b, data) -> e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id), null, getData());
}
public void place(World world) {
@@ -140,6 +208,7 @@ private boolean generatePieceOutwards(PlannedPiece piece) {
for (IrisJigsawPieceConnector i : piece.getAvailableConnectors().shuffleCopy(rng)) {
if (generateConnectorOutwards(piece, i)) {
b = true;
+ piece.debugPrintConnectorPositions();
}
}
@@ -256,7 +325,7 @@ private KList getShuffledPiecesFor(IrisJigsawPieceConnector c)
}
private void generateStartPiece() {
- pieces.add(new PlannedPiece(this, position, getData().getJigsawPieceLoader().load(rng.pick(getStructure().getPieces())), 0, rng.nextInt(4), 0));
+ pieces.add(new PlannedPiece(this, position, getData().getJigsawPieceLoader().load(rng.pick(getStructure().getPieces())), 0, getStructure().isDisableInitialRotation() ? 0 : rng.nextInt(4), 0));
}
private void generateTerminators() {
diff --git a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java
similarity index 92%
rename from src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java
index 5dbd7a7d1..25aca5aed 100644
--- a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java
+++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java
@@ -143,8 +143,8 @@ default boolean isDebugSmartBore() {
return getEngine().getDimension().isDebugSmartBore();
}
- default void trim(long dur) {
- getMantle().trim(dur);
+ default void trim(long dur, int limit) {
+ getMantle().trim(dur, limit);
}
default IrisData getData() {
@@ -175,8 +175,11 @@ default void save() {
}
- default void trim() {
- getMantle().trim(TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive()));
+ default void trim(int limit) {
+ getMantle().trim(TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive()), limit);
+ }
+ default int unloadTectonicPlate(int tectonicLimit){
+ return getMantle().unloadTectonicPlate(tectonicLimit);
}
default MultiBurst burst() {
@@ -257,6 +260,9 @@ default boolean dequeueRegenerate(int x, int z) {
default int getLoadedRegionCount() {
return getMantle().getLoadedRegionCount();
}
+ default long getLastUseMapMemoryUsage(){
+ return getMantle().LastUseMapMemoryUsage();
+ }
MantleJigsawComponent getJigsawComponent();
@@ -288,4 +294,14 @@ default void cleanupChunk(int x, int z) {
});
}
}
-}
+
+ default long getToUnload(){
+ return getMantle().getToUnload().size();
+ }
+ default long getNotClearedLoadedRegions(){
+ return getMantle().getLoadedRegions().size() - getMantle().getToUnload().size();
+ }
+ default double getTectonicDuration(){
+ return getMantle().getAdjustedIdleDuration().get();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java
similarity index 88%
rename from src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java
index 16c71652d..48e33957a 100644
--- a/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java
+++ b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java
@@ -20,8 +20,12 @@
import com.volmit.iris.util.mantle.MantleFlag;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
@Data
+@EqualsAndHashCode(exclude = "engineMantle")
+@ToString(exclude = "engineMantle")
public abstract class IrisMantleComponent implements MantleComponent {
private final EngineMantle engineMantle;
private final MantleFlag flag;
diff --git a/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java
diff --git a/src/main/java/com/volmit/iris/engine/mantle/MantleSized.java b/core/src/main/java/com/volmit/iris/engine/mantle/MantleSized.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mantle/MantleSized.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/MantleSized.java
diff --git a/src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java b/core/src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java
diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java
diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java
diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java
diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java
similarity index 86%
rename from src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java
rename to core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java
index ac7fe51e8..94cf3547e 100644
--- a/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java
+++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java
@@ -23,10 +23,7 @@
import com.volmit.iris.engine.mantle.EngineMantle;
import com.volmit.iris.engine.mantle.IrisMantleComponent;
import com.volmit.iris.engine.mantle.MantleWriter;
-import com.volmit.iris.engine.object.IrisBiome;
-import com.volmit.iris.engine.object.IrisObject;
-import com.volmit.iris.engine.object.IrisObjectPlacement;
-import com.volmit.iris.engine.object.IrisRegion;
+import com.volmit.iris.engine.object.*;
import com.volmit.iris.util.collection.KSet;
import com.volmit.iris.util.context.ChunkContext;
import com.volmit.iris.util.data.B;
@@ -35,6 +32,8 @@
import com.volmit.iris.util.mantle.MantleFlag;
import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.matter.MatterStructurePOI;
+import com.volmit.iris.util.noise.CNG;
+import com.volmit.iris.util.noise.NoiseType;
import java.util.Set;
@@ -45,7 +44,7 @@ public MantleObjectComponent(EngineMantle engineMantle) {
@Override
public void generateLayer(MantleWriter writer, int x, int z, ChunkContext context) {
- RNG rng = new RNG(Cache.key(x, z) + seed());
+ RNG rng = applyNoise(x, z, Cache.key(x, z) + seed());
int xxx = 8 + (x << 4);
int zzz = 8 + (z << 4);
IrisRegion region = getComplex().getRegionStream().get(xxx, zzz);
@@ -53,15 +52,17 @@ public void generateLayer(MantleWriter writer, int x, int z, ChunkContext contex
placeObjects(writer, rng, x, z, biome, region);
}
+ private RNG applyNoise(int x, int z, long seed) {
+ CNG noise = CNG.signatureFast(new RNG(seed), NoiseType.WHITE, NoiseType.GLOB);
+ return new RNG((long) (seed * noise.noise(x, z)));
+ }
+
@ChunkCoordinates
private void placeObjects(MantleWriter writer, RNG rng, int x, int z, IrisBiome biome, IrisRegion region) {
- long s = Cache.key(x, z) + seed();
- RNG rnp = new RNG(s);
for (IrisObjectPlacement i : biome.getSurfaceObjects()) {
if (rng.chance(i.getChance() + rng.d(-0.005, 0.005))) {
try {
- placeObject(writer, rnp, x << 4, z << 4, i);
- rnp.setSeed(s);
+ placeObject(writer, rng, x << 4, z << 4, i);
} catch (Throwable e) {
Iris.reportError(e);
Iris.error("Failed to place objects in the following biome: " + biome.getName());
@@ -75,8 +76,7 @@ private void placeObjects(MantleWriter writer, RNG rng, int x, int z, IrisBiome
for (IrisObjectPlacement i : region.getSurfaceObjects()) {
if (rng.chance(i.getChance() + rng.d(-0.005, 0.005))) {
try {
- placeObject(writer, rnp, x << 4, z << 4, i);
- rnp.setSeed(s);
+ placeObject(writer, rng, x << 4, z << 4, i);
} catch (Throwable e) {
Iris.reportError(e);
Iris.error("Failed to place objects in the following region: " + region.getName());
@@ -123,23 +123,19 @@ private Set guessPlacedKeys(RNG rng, int x, int z, IrisObjectPlacement o
}
public Set guess(int x, int z) {
- RNG rng = new RNG(Cache.key(x, z) + seed());
- long s = Cache.key(x, z) + seed();
- RNG rngd = new RNG(s);
+ RNG rng = applyNoise(x, z, Cache.key(x, z) + seed());
IrisBiome biome = getEngineMantle().getEngine().getSurfaceBiome((x << 4) + 8, (z << 4) + 8);
IrisRegion region = getEngineMantle().getEngine().getRegion((x << 4) + 8, (z << 4) + 8);
Set v = new KSet<>();
for (IrisObjectPlacement i : biome.getSurfaceObjects()) {
if (rng.chance(i.getChance() + rng.d(-0.005, 0.005))) {
- v.addAll(guessPlacedKeys(rngd, x, z, i));
- rngd.setSeed(s);
+ v.addAll(guessPlacedKeys(rng, x, z, i));
}
}
for (IrisObjectPlacement i : region.getSurfaceObjects()) {
if (rng.chance(i.getChance() + rng.d(-0.005, 0.005))) {
- v.addAll(guessPlacedKeys(rngd, x, z, i));
- rngd.setSeed(s);
+ v.addAll(guessPlacedKeys(rng, x, z, i));
}
}
diff --git a/src/main/java/com/volmit/iris/engine/mode/ModeEnclosure.java b/core/src/main/java/com/volmit/iris/engine/mode/ModeEnclosure.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mode/ModeEnclosure.java
rename to core/src/main/java/com/volmit/iris/engine/mode/ModeEnclosure.java
diff --git a/src/main/java/com/volmit/iris/engine/mode/ModeIslands.java b/core/src/main/java/com/volmit/iris/engine/mode/ModeIslands.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mode/ModeIslands.java
rename to core/src/main/java/com/volmit/iris/engine/mode/ModeIslands.java
diff --git a/src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java b/core/src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java
rename to core/src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java
diff --git a/src/main/java/com/volmit/iris/engine/mode/ModeSuperFlat.java b/core/src/main/java/com/volmit/iris/engine/mode/ModeSuperFlat.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/mode/ModeSuperFlat.java
rename to core/src/main/java/com/volmit/iris/engine/mode/ModeSuperFlat.java
diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java
rename to core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java
rename to core/src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java
rename to core/src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java
rename to core/src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/object/CarveResult.java b/core/src/main/java/com/volmit/iris/engine/object/CarveResult.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/CarveResult.java
rename to core/src/main/java/com/volmit/iris/engine/object/CarveResult.java
diff --git a/src/main/java/com/volmit/iris/engine/object/CarvingMode.java b/core/src/main/java/com/volmit/iris/engine/object/CarvingMode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/CarvingMode.java
rename to core/src/main/java/com/volmit/iris/engine/object/CarvingMode.java
diff --git a/src/main/java/com/volmit/iris/engine/object/CaveResult.java b/core/src/main/java/com/volmit/iris/engine/object/CaveResult.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/CaveResult.java
rename to core/src/main/java/com/volmit/iris/engine/object/CaveResult.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java b/core/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IPostBlockAccess.java b/core/src/main/java/com/volmit/iris/engine/object/IPostBlockAccess.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IPostBlockAccess.java
rename to core/src/main/java/com/volmit/iris/engine/object/IPostBlockAccess.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IRare.java b/core/src/main/java/com/volmit/iris/engine/object/IRare.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IRare.java
rename to core/src/main/java/com/volmit/iris/engine/object/IRare.java
diff --git a/src/main/java/com/volmit/iris/engine/object/InferredType.java b/core/src/main/java/com/volmit/iris/engine/object/InferredType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/InferredType.java
rename to core/src/main/java/com/volmit/iris/engine/object/InferredType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/InventorySlotType.java b/core/src/main/java/com/volmit/iris/engine/object/InventorySlotType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/InventorySlotType.java
rename to core/src/main/java/com/volmit/iris/engine/object/InventorySlotType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisAttributeModifier.java b/core/src/main/java/com/volmit/iris/engine/object/IrisAttributeModifier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisAttributeModifier.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisAttributeModifier.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisAxisRotationClamp.java b/core/src/main/java/com/volmit/iris/engine/object/IrisAxisRotationClamp.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisAxisRotationClamp.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisAxisRotationClamp.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiome.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiome.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiome.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiome.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustom.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustom.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomeCustom.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustom.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomCategory.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomCategory.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomCategory.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomCategory.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomParticle.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomParticle.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomParticle.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomParticle.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomPrecipType.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomPrecipType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomPrecipType.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomPrecipType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawn.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawn.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawn.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawn.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawnType.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawnType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawnType.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomeCustomSpawnType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiomePaletteLayer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomePaletteLayer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBiomePaletteLayer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBiomePaletteLayer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBlockData.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBlockDrops.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBlockDrops.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisBlockDrops.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisBlockDrops.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCarving.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCarving.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCarving.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCarving.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCave.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCave.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCave.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCave.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisColor.java b/core/src/main/java/com/volmit/iris/engine/object/IrisColor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisColor.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisColor.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCommand.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCommand.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCommand.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCommand.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCommandRegistry.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCommandRegistry.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCommandRegistry.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCommandRegistry.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCompat.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCompat.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCompat.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCompat.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCompatabilityBlockFilter.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCompatabilityBlockFilter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCompatabilityBlockFilter.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCompatabilityBlockFilter.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisCompatabilityItemFilter.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCompatabilityItemFilter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisCompatabilityItemFilter.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisCompatabilityItemFilter.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDecorationPart.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDecorationPart.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDecorationPart.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDecorationPart.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDecorator.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDecorator.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDecorator.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDepositGenerator.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDepositGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDepositGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDepositGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDimension.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDimensionMode.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDimensionMode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDimensionMode.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDimensionMode.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDimensionModeType.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDimensionModeType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDimensionModeType.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDimensionModeType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDirection.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDirection.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDirection.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDirection.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDuration.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDuration.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisDuration.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisDuration.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEffect.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEffect.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEffect.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEffect.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisElipsoid.java b/core/src/main/java/com/volmit/iris/engine/object/IrisElipsoid.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisElipsoid.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisElipsoid.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEnchantment.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEnchantment.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEnchantment.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEnchantment.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEngineChunkData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineChunkData.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEngineChunkData.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEngineChunkData.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEngineData.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEngineSpawnerCooldown.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineSpawnerCooldown.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEngineSpawnerCooldown.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEngineSpawnerCooldown.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java
similarity index 64%
rename from src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java
index f6a723cd5..883ef4025 100644
--- a/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java
+++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java
@@ -24,11 +24,36 @@
public class IrisEngineStatistics {
private int totalHotloads = 0;
private int chunksGenerated = 0;
+ private int IrisToUpgradedVersion = 0;
+ private int IrisCreationVersion = 0;
+ private int MinecraftVersion = 0;
public void generatedChunk() {
chunksGenerated++;
}
+ public void setUpgradedVersion(int i) {
+ IrisToUpgradedVersion = i;
+ }
+ public int getUpgradedVersion() {
+ return IrisToUpgradedVersion;
+ }
+ public void setVersion(int i) {
+ IrisCreationVersion = i;
+ }
+
+ public int getVersion() {
+ return IrisCreationVersion;
+ }
+
+ public void setMCVersion(int i) {
+ MinecraftVersion = i;
+ }
+
+ public int getMCVersion() {
+ return MinecraftVersion;
+ }
+
public void hotloaded() {
totalHotloads++;
}
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEngineStreamType.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStreamType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEngineStreamType.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEngineStreamType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEngineValueType.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineValueType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEngineValueType.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEngineValueType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEntity.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEntity.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEntity.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEntity.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisExpression.java b/core/src/main/java/com/volmit/iris/engine/object/IrisExpression.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisExpression.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisExpression.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisExpressionLoad.java b/core/src/main/java/com/volmit/iris/engine/object/IrisExpressionLoad.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisExpressionLoad.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisExpressionLoad.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisFluidBodies.java b/core/src/main/java/com/volmit/iris/engine/object/IrisFluidBodies.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisFluidBodies.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisFluidBodies.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisFontStyle.java b/core/src/main/java/com/volmit/iris/engine/object/IrisFontStyle.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisFontStyle.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisFontStyle.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisGenerator.java b/core/src/main/java/com/volmit/iris/engine/object/IrisGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java b/core/src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisImage.java b/core/src/main/java/com/volmit/iris/engine/object/IrisImage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisImage.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisImage.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisImageChannel.java b/core/src/main/java/com/volmit/iris/engine/object/IrisImageChannel.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisImageChannel.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisImageChannel.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisImageMap.java b/core/src/main/java/com/volmit/iris/engine/object/IrisImageMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisImageMap.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisImageMap.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java b/core/src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisInterpolator3D.java b/core/src/main/java/com/volmit/iris/engine/object/IrisInterpolator3D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisInterpolator3D.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisInterpolator3D.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisJigsawPlacement.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPlacement.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisJigsawPlacement.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPlacement.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisJigsawPool.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPool.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisJigsawPool.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPool.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java
similarity index 97%
rename from src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java
index b12e8deee..8a009364f 100644
--- a/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java
+++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructure.java
@@ -62,6 +62,9 @@ public class IrisJigsawStructure extends IrisRegistrant {
@Desc("Force Y to a specific value")
private int lockY = -1;
+ @Desc("Set to true to prevent rotating the initial structure piece")
+ private boolean disableInitialRotation = false;
+
private transient AtomicCache maxDimension = new AtomicCache<>();
private void loadPool(String p, KList pools, KList pieces) {
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLake.java b/core/src/main/java/com/volmit/iris/engine/object/IrisLake.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisLake.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisLake.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java b/core/src/main/java/com/volmit/iris/engine/object/IrisLoot.java
similarity index 89%
rename from src/main/java/com/volmit/iris/engine/object/IrisLoot.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisLoot.java
index fa8a4f4ad..d7001f233 100644
--- a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java
+++ b/core/src/main/java/com/volmit/iris/engine/object/IrisLoot.java
@@ -18,9 +18,9 @@
package com.volmit.iris.engine.object;
-import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.volmit.iris.Iris;
import com.volmit.iris.core.link.Identifier;
+import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.core.service.ExternalDataSVC;
import com.volmit.iris.engine.data.cache.AtomicCache;
import com.volmit.iris.engine.object.annotations.*;
@@ -36,11 +36,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.nbt.TagParser;
import org.bukkit.DyeColor;
import org.bukkit.Material;
-import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
@@ -118,7 +115,7 @@ public ItemStack get(boolean debug, RNG rng) {
if (is == null)
return new ItemStack(Material.AIR);
is.setItemMeta(applyProperties(is, rng, debug, null));
- return applyCustomNbt(is);
+ return INMS.get().applyCustomNbt(is, customNbt);
} catch (Throwable e) {
Iris.reportError(e);
return new ItemStack(Material.AIR);
@@ -136,7 +133,7 @@ public ItemStack get(boolean debug, boolean giveSomething, IrisLootTable table,
if (is == null)
return null;
is.setItemMeta(applyProperties(is, rng, debug, table));
- return applyCustomNbt(is);
+ return INMS.get().applyCustomNbt(is, customNbt);
} catch (Throwable e) {
//Iris.reportError(e);
e.printStackTrace();
@@ -238,15 +235,4 @@ private ItemMeta applyProperties(ItemStack is, RNG rng, boolean debug, IrisLootT
return m;
}
-
-
- private ItemStack applyCustomNbt(ItemStack stack) throws CommandSyntaxException {
- if (customNbt == null || customNbt.isEmpty())
- return stack;
- net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(stack);
- CompoundTag tag = TagParser.parseTag(new JSONObject(customNbt).toString());
- tag.merge(s.getOrCreateTag());
- s.setTag(tag);
- return CraftItemStack.asBukkitCopy(s);
- }
}
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLootMode.java b/core/src/main/java/com/volmit/iris/engine/object/IrisLootMode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisLootMode.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisLootMode.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLootReference.java b/core/src/main/java/com/volmit/iris/engine/object/IrisLootReference.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisLootReference.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisLootReference.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLootTable.java b/core/src/main/java/com/volmit/iris/engine/object/IrisLootTable.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisLootTable.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisLootTable.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMarker.java b/core/src/main/java/com/volmit/iris/engine/object/IrisMarker.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisMarker.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisMarker.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMaterialPalette.java b/core/src/main/java/com/volmit/iris/engine/object/IrisMaterialPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisMaterialPalette.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisMaterialPalette.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMod.java b/core/src/main/java/com/volmit/iris/engine/object/IrisMod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisMod.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisMod.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisModBiomeInjector.java b/core/src/main/java/com/volmit/iris/engine/object/IrisModBiomeInjector.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisModBiomeInjector.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisModBiomeInjector.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisModBiomeReplacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisModBiomeReplacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisModBiomeReplacer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisModBiomeReplacer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisModNoiseStyleReplacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisModNoiseStyleReplacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisModNoiseStyleReplacer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisModNoiseStyleReplacer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementBiomeInjector.java b/core/src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementBiomeInjector.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementBiomeInjector.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementBiomeInjector.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementRegionInjector.java b/core/src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementRegionInjector.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementRegionInjector.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisModObjectPlacementRegionInjector.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisModObjectReplacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisModObjectReplacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisModObjectReplacer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisModObjectReplacer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisModRegionReplacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisModRegionReplacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisModRegionReplacer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisModRegionReplacer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisNoiseGenerator.java b/core/src/main/java/com/volmit/iris/engine/object/IrisNoiseGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisNoiseGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisNoiseGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java
similarity index 95%
rename from src/main/java/com/volmit/iris/engine/object/IrisObject.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObject.java
index 651a033ce..566ea9bb4 100644
--- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java
+++ b/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java
@@ -22,6 +22,7 @@
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.loader.IrisRegistrant;
import com.volmit.iris.engine.data.cache.AtomicCache;
+import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.framework.placer.HeightmapObjectPlacer;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
@@ -525,7 +526,7 @@ public int place(int x, int yv, int z, IObjectPlacer oplacer, IrisObjectPlacemen
}
}
double newRotation = config.getRotation().getYAxis().getMin() + slopeRotationY;
- config.getRotation().setYAxis(new IrisAxisRotationClamp(true, false, newRotation, newRotation, 360));
+ config.getRotation().setYAxis(new IrisAxisRotationClamp(true, false, newRotation, newRotation, 90));
config.getRotation().setEnabled(true);
}
@@ -688,6 +689,25 @@ public int place(int x, int yv, int z, IObjectPlacer oplacer, IrisObjectPlacemen
return -1;
}
+ if (!config.getAllowedCollisions().isEmpty() || !config.getForbiddenCollisions().isEmpty()) {
+ Engine engine = rdata.getEngine();
+ String key;
+ BlockVector offset = new BlockVector(config.getTranslate().getX(), config.getTranslate().getY(), config.getTranslate().getZ());
+ for (int i = x - Math.floorDiv(w, 2) + (int) offset.getX(); i <= x + Math.floorDiv(w, 2) - (w % 2 == 0 ? 1 : 0) + (int) offset.getX(); i++) {
+ for (int j = y - Math.floorDiv(h, 2) + (int) offset.getY(); j <= y + Math.floorDiv(h, 2) - (h % 2 == 0 ? 1 : 0) + (int) offset.getY(); j++) {
+ for (int k = z - Math.floorDiv(d, 2) + (int) offset.getZ(); k <= z + Math.floorDiv(d, 2) - (d % 2 == 0 ? 1 : 0) + (int) offset.getX(); k++) {
+ key = engine.getObjectPlacementKey(i, j, k);
+ if (key != null) {
+ if (config.getForbiddenCollisions().contains(key) && !config.getAllowedCollisions().contains(key)) {
+ Iris.warn("%s collides with %s (%s / %s / %s)", getLoadKey(), key, i, j, k);
+ return -1;
+ }
+ }
+ }
+ }
+ }
+ }
+
if (config.isBore()) {
BlockVector offset = new BlockVector(config.getTranslate().getX(), config.getTranslate().getY(), config.getTranslate().getZ());
for (int i = x - Math.floorDiv(w, 2) + (int) offset.getX(); i <= x + Math.floorDiv(w, 2) - (w % 2 == 0 ? 1 : 0) + (int) offset.getX(); i++) {
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectLimit.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectLimit.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectLimit.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectLimit.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectLoot.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectLoot.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectLoot.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectLoot.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java
similarity index 96%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java
index 0825a98c7..813ef8c4a 100644
--- a/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java
+++ b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java
@@ -128,6 +128,14 @@ public class IrisObjectPlacement {
@Desc("This object / these objects override the following trees when they grow...")
@ArrayType(min = 1, type = IrisTree.class)
private KList trees = new KList<>();
+ @RegistryListResource(IrisObject.class)
+ @ArrayType(type = String.class)
+ @Desc("List of objects to this object is allowed to collied with")
+ private KList allowedCollisions = new KList<>();
+ @RegistryListResource(IrisObject.class)
+ @ArrayType(type = String.class)
+ @Desc("List of objects to this object is forbidden to collied with")
+ private KList forbiddenCollisions = new KList<>();
private transient AtomicCache cache = new AtomicCache<>();
public IrisObjectPlacement toPlacement(String... place) {
@@ -255,7 +263,7 @@ public IrisLootTable getTable(BlockData data, IrisData dataManager) {
if (B.isStorageChest(data)) {
IrisLootTable picked = null;
- if (cache.exact.containsKey(data.getMaterial()) && cache.exact.containsKey(data)) {
+ if (cache.exact.containsKey(data.getMaterial()) && cache.exact.get(data.getMaterial()).containsKey(data)) {
picked = cache.exact.get(data.getMaterial()).get(data).pullRandom();
} else if (cache.basic.containsKey(data.getMaterial())) {
picked = cache.basic.get(data.getMaterial()).pullRandom();
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacementScaleInterpolator.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacementScaleInterpolator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectPlacementScaleInterpolator.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacementScaleInterpolator.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectReplace.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectReplace.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectReplace.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectReplace.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectRotation.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectRotation.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectRotation.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectRotation.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectScale.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectScale.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectScale.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectScale.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectTranslate.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectTranslate.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisObjectTranslate.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisObjectTranslate.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisOreGenerator.java b/core/src/main/java/com/volmit/iris/engine/object/IrisOreGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisOreGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisOreGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisPosition.java b/core/src/main/java/com/volmit/iris/engine/object/IrisPosition.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisPosition.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisPosition.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisPosition2D.java b/core/src/main/java/com/volmit/iris/engine/object/IrisPosition2D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisPosition2D.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisPosition2D.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisPotionEffect.java b/core/src/main/java/com/volmit/iris/engine/object/IrisPotionEffect.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisPotionEffect.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisPotionEffect.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisPyramid.java b/core/src/main/java/com/volmit/iris/engine/object/IrisPyramid.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisPyramid.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisPyramid.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRange.java b/core/src/main/java/com/volmit/iris/engine/object/IrisRange.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisRange.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisRange.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRareObject.java b/core/src/main/java/com/volmit/iris/engine/object/IrisRareObject.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisRareObject.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisRareObject.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRate.java b/core/src/main/java/com/volmit/iris/engine/object/IrisRate.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisRate.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisRate.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRavine.java b/core/src/main/java/com/volmit/iris/engine/object/IrisRavine.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisRavine.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisRavine.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRavinePlacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisRavinePlacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisRavinePlacer.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisRavinePlacer.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRegion.java b/core/src/main/java/com/volmit/iris/engine/object/IrisRegion.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisRegion.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisRegion.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRiver.java b/core/src/main/java/com/volmit/iris/engine/object/IrisRiver.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisRiver.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisRiver.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisScript.java b/core/src/main/java/com/volmit/iris/engine/object/IrisScript.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisScript.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisScript.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisSeed.java b/core/src/main/java/com/volmit/iris/engine/object/IrisSeed.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisSeed.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisSeed.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisShapedGeneratorStyle.java b/core/src/main/java/com/volmit/iris/engine/object/IrisShapedGeneratorStyle.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisShapedGeneratorStyle.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisShapedGeneratorStyle.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisSlopeClip.java b/core/src/main/java/com/volmit/iris/engine/object/IrisSlopeClip.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisSlopeClip.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisSlopeClip.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisSpawnGroup.java b/core/src/main/java/com/volmit/iris/engine/object/IrisSpawnGroup.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisSpawnGroup.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisSpawnGroup.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisSpawner.java b/core/src/main/java/com/volmit/iris/engine/object/IrisSpawner.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisSpawner.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisSpawner.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisSphere.java b/core/src/main/java/com/volmit/iris/engine/object/IrisSphere.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisSphere.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisSphere.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisStiltSettings.java b/core/src/main/java/com/volmit/iris/engine/object/IrisStiltSettings.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisStiltSettings.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisStiltSettings.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java b/core/src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisSurface.java b/core/src/main/java/com/volmit/iris/engine/object/IrisSurface.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisSurface.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisSurface.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisTimeBlock.java b/core/src/main/java/com/volmit/iris/engine/object/IrisTimeBlock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisTimeBlock.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisTimeBlock.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisTree.java b/core/src/main/java/com/volmit/iris/engine/object/IrisTree.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisTree.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisTree.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisTreeModes.java b/core/src/main/java/com/volmit/iris/engine/object/IrisTreeModes.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisTreeModes.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisTreeModes.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisTreeSettings.java b/core/src/main/java/com/volmit/iris/engine/object/IrisTreeSettings.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisTreeSettings.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisTreeSettings.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisTreeSize.java b/core/src/main/java/com/volmit/iris/engine/object/IrisTreeSize.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisTreeSize.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisTreeSize.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisVillagerOverride.java b/core/src/main/java/com/volmit/iris/engine/object/IrisVillagerOverride.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisVillagerOverride.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisVillagerOverride.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisVillagerTrade.java b/core/src/main/java/com/volmit/iris/engine/object/IrisVillagerTrade.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisVillagerTrade.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisVillagerTrade.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisWeather.java b/core/src/main/java/com/volmit/iris/engine/object/IrisWeather.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisWeather.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisWeather.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisWorld.java b/core/src/main/java/com/volmit/iris/engine/object/IrisWorld.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisWorld.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisWorld.java
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisWorm.java b/core/src/main/java/com/volmit/iris/engine/object/IrisWorm.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/IrisWorm.java
rename to core/src/main/java/com/volmit/iris/engine/object/IrisWorm.java
diff --git a/src/main/java/com/volmit/iris/engine/object/NoiseStyle.java b/core/src/main/java/com/volmit/iris/engine/object/NoiseStyle.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/NoiseStyle.java
rename to core/src/main/java/com/volmit/iris/engine/object/NoiseStyle.java
diff --git a/src/main/java/com/volmit/iris/engine/object/ObjectPlaceMode.java b/core/src/main/java/com/volmit/iris/engine/object/ObjectPlaceMode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/ObjectPlaceMode.java
rename to core/src/main/java/com/volmit/iris/engine/object/ObjectPlaceMode.java
diff --git a/src/main/java/com/volmit/iris/engine/object/StudioMode.java b/core/src/main/java/com/volmit/iris/engine/object/StudioMode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/StudioMode.java
rename to core/src/main/java/com/volmit/iris/engine/object/StudioMode.java
diff --git a/src/main/java/com/volmit/iris/engine/object/TileBanner.java b/core/src/main/java/com/volmit/iris/engine/object/TileBanner.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/TileBanner.java
rename to core/src/main/java/com/volmit/iris/engine/object/TileBanner.java
diff --git a/src/main/java/com/volmit/iris/engine/object/TileData.java b/core/src/main/java/com/volmit/iris/engine/object/TileData.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/TileData.java
rename to core/src/main/java/com/volmit/iris/engine/object/TileData.java
diff --git a/src/main/java/com/volmit/iris/engine/object/TileSign.java b/core/src/main/java/com/volmit/iris/engine/object/TileSign.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/TileSign.java
rename to core/src/main/java/com/volmit/iris/engine/object/TileSign.java
diff --git a/src/main/java/com/volmit/iris/engine/object/TileSpawner.java b/core/src/main/java/com/volmit/iris/engine/object/TileSpawner.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/TileSpawner.java
rename to core/src/main/java/com/volmit/iris/engine/object/TileSpawner.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/ArrayType.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/ArrayType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/ArrayType.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/ArrayType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/DependsOn.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/DependsOn.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/DependsOn.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/DependsOn.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/Desc.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/Desc.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/Desc.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/Desc.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/MaxNumber.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/MaxNumber.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/MaxNumber.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/MaxNumber.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/MinNumber.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/MinNumber.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/MinNumber.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/MinNumber.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBiomeDownfallType.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBiomeDownfallType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBiomeDownfallType.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBiomeDownfallType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBlockType.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBlockType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBlockType.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListBlockType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListEnchantment.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListEnchantment.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/RegistryListEnchantment.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListEnchantment.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFont.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFont.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFont.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListFont.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListItemType.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListItemType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/RegistryListItemType.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListItemType.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListResource.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListResource.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/RegistryListResource.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListResource.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListSpecialEntity.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListSpecialEntity.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/RegistryListSpecialEntity.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryListSpecialEntity.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/Required.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/Required.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/Required.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/Required.java
diff --git a/src/main/java/com/volmit/iris/engine/object/annotations/Snippet.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/Snippet.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/annotations/Snippet.java
rename to core/src/main/java/com/volmit/iris/engine/object/annotations/Snippet.java
diff --git a/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterObject.java b/core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterObject.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/matter/IrisMatterObject.java
rename to core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterObject.java
diff --git a/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacement.java b/core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacement.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacement.java
rename to core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacement.java
diff --git a/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacementLocation.java b/core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacementLocation.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacementLocation.java
rename to core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacementLocation.java
diff --git a/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterTranslate.java b/core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterTranslate.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/object/matter/IrisMatterTranslate.java
rename to core/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterTranslate.java
diff --git a/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java
similarity index 89%
rename from src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java
index 9fe19f048..f63b6d12a 100644
--- a/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java
+++ b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java
@@ -20,7 +20,7 @@
import com.volmit.iris.Iris;
import com.volmit.iris.core.loader.IrisData;
-import com.volmit.iris.core.nms.v20.CustomBiomeSource;
+import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.core.service.StudioSVC;
import com.volmit.iris.engine.IrisEngine;
import com.volmit.iris.engine.data.chunk.TerrainChunk;
@@ -42,11 +42,9 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Setter;
-import net.minecraft.server.level.ServerLevel;
import org.bukkit.*;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
-import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -58,7 +56,6 @@
import org.bukkit.generator.WorldInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import sun.misc.Unsafe;
import java.io.File;
import java.lang.reflect.Field;
@@ -129,17 +126,7 @@ public void onWorldInit(WorldInitEvent event) {
if (!initialized) {
world.setRawWorldSeed(event.getWorld().getSeed());
if (world.name().equals(event.getWorld().getName())) {
- ServerLevel serverLevel = ((CraftWorld) event.getWorld()).getHandle();
- Engine engine = getEngine(event.getWorld());
- Class> clazz = serverLevel.getChunkSource().chunkMap.generator.getClass();
- Field biomeSource = getField(clazz, "b");
- biomeSource.setAccessible(true);
- Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
- unsafeField.setAccessible(true);
- Unsafe unsafe = (Unsafe) unsafeField.get(null);
- CustomBiomeSource customBiomeSource = new CustomBiomeSource(event.getWorld().getSeed(), engine, event.getWorld());
- unsafe.putObject(biomeSource.get(serverLevel.getChunkSource().chunkMap.generator), unsafe.objectFieldOffset(biomeSource), customBiomeSource);
- biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource);
+ INMS.get().inject(event.getWorld().getSeed(), getEngine(event.getWorld()), event.getWorld());
Iris.info("Injected Iris Biome Source into " + event.getWorld().getName());
initialized = true;
}
diff --git a/src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java b/core/src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java
rename to core/src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java
diff --git a/src/main/java/com/volmit/iris/engine/platform/DummyBiomeProvider.java b/core/src/main/java/com/volmit/iris/engine/platform/DummyBiomeProvider.java
similarity index 84%
rename from src/main/java/com/volmit/iris/engine/platform/DummyBiomeProvider.java
rename to core/src/main/java/com/volmit/iris/engine/platform/DummyBiomeProvider.java
index b8d8b2b1e..551d95583 100644
--- a/src/main/java/com/volmit/iris/engine/platform/DummyBiomeProvider.java
+++ b/core/src/main/java/com/volmit/iris/engine/platform/DummyBiomeProvider.java
@@ -1,5 +1,6 @@
package com.volmit.iris.engine.platform;
+import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.util.collection.KList;
import org.bukkit.block.Biome;
import org.bukkit.generator.BiomeProvider;
@@ -9,7 +10,7 @@
import java.util.List;
public class DummyBiomeProvider extends BiomeProvider {
- private final List ALL = new KList<>(Biome.values()).qdel(Biome.CHERRY_GROVE).qdel(Biome.CUSTOM);
+ private final List ALL = INMS.get().getBiomes();
@NotNull
@Override
diff --git a/src/main/java/com/volmit/iris/engine/platform/DummyChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/DummyChunkGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/platform/DummyChunkGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/platform/DummyChunkGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/platform/studio/EnginedStudioGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/studio/EnginedStudioGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/platform/studio/EnginedStudioGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/platform/studio/EnginedStudioGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/platform/studio/StudioGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/studio/StudioGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/platform/studio/StudioGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/platform/studio/StudioGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/platform/studio/generators/BiomeBuffetGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/studio/generators/BiomeBuffetGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/platform/studio/generators/BiomeBuffetGenerator.java
rename to core/src/main/java/com/volmit/iris/engine/platform/studio/generators/BiomeBuffetGenerator.java
diff --git a/src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java b/core/src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java
similarity index 100%
rename from src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java
rename to core/src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java
diff --git a/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java b/core/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java
similarity index 95%
rename from src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java
rename to core/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java
index c0a3e35d9..ae613c48f 100644
--- a/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java
+++ b/core/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java
@@ -27,10 +27,14 @@
import com.volmit.iris.engine.object.IrisDimension;
import com.volmit.iris.engine.object.IrisExpression;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
@Data
+@EqualsAndHashCode(exclude = "engine")
+@ToString(exclude = "engine")
public class IrisScriptingAPI {
private final Engine engine;
private IrisRegistrant preprocessorObject;
diff --git a/src/main/java/com/volmit/iris/util/api/APIAwareBlock.java b/core/src/main/java/com/volmit/iris/util/api/APIAwareBlock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/api/APIAwareBlock.java
rename to core/src/main/java/com/volmit/iris/util/api/APIAwareBlock.java
diff --git a/src/main/java/com/volmit/iris/util/api/APIWorldBlock.java b/core/src/main/java/com/volmit/iris/util/api/APIWorldBlock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/api/APIWorldBlock.java
rename to core/src/main/java/com/volmit/iris/util/api/APIWorldBlock.java
diff --git a/src/main/java/com/volmit/iris/util/atomics/AtomicAverage.java b/core/src/main/java/com/volmit/iris/util/atomics/AtomicAverage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/atomics/AtomicAverage.java
rename to core/src/main/java/com/volmit/iris/util/atomics/AtomicAverage.java
diff --git a/src/main/java/com/volmit/iris/util/atomics/AtomicRollingSequence.java b/core/src/main/java/com/volmit/iris/util/atomics/AtomicRollingSequence.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/atomics/AtomicRollingSequence.java
rename to core/src/main/java/com/volmit/iris/util/atomics/AtomicRollingSequence.java
diff --git a/src/main/java/com/volmit/iris/util/board/Board.java b/core/src/main/java/com/volmit/iris/util/board/Board.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/board/Board.java
rename to core/src/main/java/com/volmit/iris/util/board/Board.java
diff --git a/src/main/java/com/volmit/iris/util/board/BoardEntry.java b/core/src/main/java/com/volmit/iris/util/board/BoardEntry.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/board/BoardEntry.java
rename to core/src/main/java/com/volmit/iris/util/board/BoardEntry.java
diff --git a/src/main/java/com/volmit/iris/util/board/BoardManager.java b/core/src/main/java/com/volmit/iris/util/board/BoardManager.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/board/BoardManager.java
rename to core/src/main/java/com/volmit/iris/util/board/BoardManager.java
diff --git a/src/main/java/com/volmit/iris/util/board/BoardProvider.java b/core/src/main/java/com/volmit/iris/util/board/BoardProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/board/BoardProvider.java
rename to core/src/main/java/com/volmit/iris/util/board/BoardProvider.java
diff --git a/src/main/java/com/volmit/iris/util/board/BoardSettings.java b/core/src/main/java/com/volmit/iris/util/board/BoardSettings.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/board/BoardSettings.java
rename to core/src/main/java/com/volmit/iris/util/board/BoardSettings.java
diff --git a/src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java b/core/src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java
rename to core/src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java
diff --git a/src/main/java/com/volmit/iris/util/board/ScoreDirection.java b/core/src/main/java/com/volmit/iris/util/board/ScoreDirection.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/board/ScoreDirection.java
rename to core/src/main/java/com/volmit/iris/util/board/ScoreDirection.java
diff --git a/src/main/java/com/volmit/iris/util/cache/ArrayCache.java b/core/src/main/java/com/volmit/iris/util/cache/ArrayCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/ArrayCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/ArrayCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/ByteBitCache.java b/core/src/main/java/com/volmit/iris/util/cache/ByteBitCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/ByteBitCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/ByteBitCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/ByteCache.java b/core/src/main/java/com/volmit/iris/util/cache/ByteCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/ByteCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/ByteCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/ChunkCache2D.java b/core/src/main/java/com/volmit/iris/util/cache/ChunkCache2D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/ChunkCache2D.java
rename to core/src/main/java/com/volmit/iris/util/cache/ChunkCache2D.java
diff --git a/src/main/java/com/volmit/iris/util/cache/DataBitCache.java b/core/src/main/java/com/volmit/iris/util/cache/DataBitCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/DataBitCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/DataBitCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/FloatBitCache.java b/core/src/main/java/com/volmit/iris/util/cache/FloatBitCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/FloatBitCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/FloatBitCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/FloatCache.java b/core/src/main/java/com/volmit/iris/util/cache/FloatCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/FloatCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/FloatCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/IntBitCache.java b/core/src/main/java/com/volmit/iris/util/cache/IntBitCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/IntBitCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/IntBitCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/IntCache.java b/core/src/main/java/com/volmit/iris/util/cache/IntCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/IntCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/IntCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/ShortBitCache.java b/core/src/main/java/com/volmit/iris/util/cache/ShortBitCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/ShortBitCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/ShortBitCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/ShortCache.java b/core/src/main/java/com/volmit/iris/util/cache/ShortCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/ShortCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/ShortCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/UByteBitCache.java b/core/src/main/java/com/volmit/iris/util/cache/UByteBitCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/UByteBitCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/UByteBitCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/UByteCache.java b/core/src/main/java/com/volmit/iris/util/cache/UByteCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/UByteCache.java
rename to core/src/main/java/com/volmit/iris/util/cache/UByteCache.java
diff --git a/src/main/java/com/volmit/iris/util/cache/WorldCache2D.java b/core/src/main/java/com/volmit/iris/util/cache/WorldCache2D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/cache/WorldCache2D.java
rename to core/src/main/java/com/volmit/iris/util/cache/WorldCache2D.java
diff --git a/src/main/java/com/volmit/iris/util/collection/GBiset.java b/core/src/main/java/com/volmit/iris/util/collection/GBiset.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/collection/GBiset.java
rename to core/src/main/java/com/volmit/iris/util/collection/GBiset.java
diff --git a/src/main/java/com/volmit/iris/util/collection/GListAdapter.java b/core/src/main/java/com/volmit/iris/util/collection/GListAdapter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/collection/GListAdapter.java
rename to core/src/main/java/com/volmit/iris/util/collection/GListAdapter.java
diff --git a/src/main/java/com/volmit/iris/util/collection/KList.java b/core/src/main/java/com/volmit/iris/util/collection/KList.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/collection/KList.java
rename to core/src/main/java/com/volmit/iris/util/collection/KList.java
diff --git a/src/main/java/com/volmit/iris/util/collection/KMap.java b/core/src/main/java/com/volmit/iris/util/collection/KMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/collection/KMap.java
rename to core/src/main/java/com/volmit/iris/util/collection/KMap.java
diff --git a/src/main/java/com/volmit/iris/util/collection/KSet.java b/core/src/main/java/com/volmit/iris/util/collection/KSet.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/collection/KSet.java
rename to core/src/main/java/com/volmit/iris/util/collection/KSet.java
diff --git a/src/main/java/com/volmit/iris/util/collection/KeyPair.java b/core/src/main/java/com/volmit/iris/util/collection/KeyPair.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/collection/KeyPair.java
rename to core/src/main/java/com/volmit/iris/util/collection/KeyPair.java
diff --git a/src/main/java/com/volmit/iris/util/collection/StateList.java b/core/src/main/java/com/volmit/iris/util/collection/StateList.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/collection/StateList.java
rename to core/src/main/java/com/volmit/iris/util/collection/StateList.java
diff --git a/src/main/java/com/volmit/iris/util/context/ChunkContext.java b/core/src/main/java/com/volmit/iris/util/context/ChunkContext.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/context/ChunkContext.java
rename to core/src/main/java/com/volmit/iris/util/context/ChunkContext.java
diff --git a/src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java b/core/src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java
rename to core/src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java
diff --git a/src/main/java/com/volmit/iris/util/context/IrisContext.java b/core/src/main/java/com/volmit/iris/util/context/IrisContext.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/context/IrisContext.java
rename to core/src/main/java/com/volmit/iris/util/context/IrisContext.java
diff --git a/src/main/java/com/volmit/iris/util/data/B.java b/core/src/main/java/com/volmit/iris/util/data/B.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/B.java
rename to core/src/main/java/com/volmit/iris/util/data/B.java
diff --git a/src/main/java/com/volmit/iris/util/data/BiomeMap.java b/core/src/main/java/com/volmit/iris/util/data/BiomeMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/BiomeMap.java
rename to core/src/main/java/com/volmit/iris/util/data/BiomeMap.java
diff --git a/src/main/java/com/volmit/iris/util/data/ChunkCache.java b/core/src/main/java/com/volmit/iris/util/data/ChunkCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/ChunkCache.java
rename to core/src/main/java/com/volmit/iris/util/data/ChunkCache.java
diff --git a/src/main/java/com/volmit/iris/util/data/ComplexCache.java b/core/src/main/java/com/volmit/iris/util/data/ComplexCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/ComplexCache.java
rename to core/src/main/java/com/volmit/iris/util/data/ComplexCache.java
diff --git a/src/main/java/com/volmit/iris/util/data/Cuboid.java b/core/src/main/java/com/volmit/iris/util/data/Cuboid.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/Cuboid.java
rename to core/src/main/java/com/volmit/iris/util/data/Cuboid.java
diff --git a/src/main/java/com/volmit/iris/util/data/CuboidException.java b/core/src/main/java/com/volmit/iris/util/data/CuboidException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/CuboidException.java
rename to core/src/main/java/com/volmit/iris/util/data/CuboidException.java
diff --git a/src/main/java/com/volmit/iris/util/data/DUTF.java b/core/src/main/java/com/volmit/iris/util/data/DUTF.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/DUTF.java
rename to core/src/main/java/com/volmit/iris/util/data/DUTF.java
diff --git a/src/main/java/com/volmit/iris/util/data/DataPalette.java b/core/src/main/java/com/volmit/iris/util/data/DataPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/DataPalette.java
rename to core/src/main/java/com/volmit/iris/util/data/DataPalette.java
diff --git a/src/main/java/com/volmit/iris/util/data/DataProvider.java b/core/src/main/java/com/volmit/iris/util/data/DataProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/DataProvider.java
rename to core/src/main/java/com/volmit/iris/util/data/DataProvider.java
diff --git a/src/main/java/com/volmit/iris/util/data/Dimension.java b/core/src/main/java/com/volmit/iris/util/data/Dimension.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/Dimension.java
rename to core/src/main/java/com/volmit/iris/util/data/Dimension.java
diff --git a/src/main/java/com/volmit/iris/util/data/DimensionFace.java b/core/src/main/java/com/volmit/iris/util/data/DimensionFace.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/DimensionFace.java
rename to core/src/main/java/com/volmit/iris/util/data/DimensionFace.java
diff --git a/src/main/java/com/volmit/iris/util/data/DoubleArrayUtils.java b/core/src/main/java/com/volmit/iris/util/data/DoubleArrayUtils.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/DoubleArrayUtils.java
rename to core/src/main/java/com/volmit/iris/util/data/DoubleArrayUtils.java
diff --git a/src/main/java/com/volmit/iris/util/data/Heafty.java b/core/src/main/java/com/volmit/iris/util/data/Heafty.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/Heafty.java
rename to core/src/main/java/com/volmit/iris/util/data/Heafty.java
diff --git a/src/main/java/com/volmit/iris/util/data/HeightMap.java b/core/src/main/java/com/volmit/iris/util/data/HeightMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/HeightMap.java
rename to core/src/main/java/com/volmit/iris/util/data/HeightMap.java
diff --git a/src/main/java/com/volmit/iris/util/data/IOAdapter.java b/core/src/main/java/com/volmit/iris/util/data/IOAdapter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/IOAdapter.java
rename to core/src/main/java/com/volmit/iris/util/data/IOAdapter.java
diff --git a/src/main/java/com/volmit/iris/util/data/InvertedBiomeGrid.java b/core/src/main/java/com/volmit/iris/util/data/InvertedBiomeGrid.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/InvertedBiomeGrid.java
rename to core/src/main/java/com/volmit/iris/util/data/InvertedBiomeGrid.java
diff --git a/src/main/java/com/volmit/iris/util/data/IrisBiomeStorage.java b/core/src/main/java/com/volmit/iris/util/data/IrisBiomeStorage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/IrisBiomeStorage.java
rename to core/src/main/java/com/volmit/iris/util/data/IrisBiomeStorage.java
diff --git a/src/main/java/com/volmit/iris/util/data/KCache.java b/core/src/main/java/com/volmit/iris/util/data/KCache.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/KCache.java
rename to core/src/main/java/com/volmit/iris/util/data/KCache.java
diff --git a/src/main/java/com/volmit/iris/util/data/MaterialBlock.java b/core/src/main/java/com/volmit/iris/util/data/MaterialBlock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/MaterialBlock.java
rename to core/src/main/java/com/volmit/iris/util/data/MaterialBlock.java
diff --git a/src/main/java/com/volmit/iris/util/data/NibbleArray.java b/core/src/main/java/com/volmit/iris/util/data/NibbleArray.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/NibbleArray.java
rename to core/src/main/java/com/volmit/iris/util/data/NibbleArray.java
diff --git a/src/main/java/com/volmit/iris/util/data/NibbleDataPalette.java b/core/src/main/java/com/volmit/iris/util/data/NibbleDataPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/NibbleDataPalette.java
rename to core/src/main/java/com/volmit/iris/util/data/NibbleDataPalette.java
diff --git a/src/main/java/com/volmit/iris/util/data/Recycler.java b/core/src/main/java/com/volmit/iris/util/data/Recycler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/Recycler.java
rename to core/src/main/java/com/volmit/iris/util/data/Recycler.java
diff --git a/src/main/java/com/volmit/iris/util/data/Shrinkwrap.java b/core/src/main/java/com/volmit/iris/util/data/Shrinkwrap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/Shrinkwrap.java
rename to core/src/main/java/com/volmit/iris/util/data/Shrinkwrap.java
diff --git a/src/main/java/com/volmit/iris/util/data/VanillaBiomeMap.java b/core/src/main/java/com/volmit/iris/util/data/VanillaBiomeMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/VanillaBiomeMap.java
rename to core/src/main/java/com/volmit/iris/util/data/VanillaBiomeMap.java
diff --git a/src/main/java/com/volmit/iris/util/data/Varint.java b/core/src/main/java/com/volmit/iris/util/data/Varint.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/Varint.java
rename to core/src/main/java/com/volmit/iris/util/data/Varint.java
diff --git a/src/main/java/com/volmit/iris/util/data/WeightMap.java b/core/src/main/java/com/volmit/iris/util/data/WeightMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/WeightMap.java
rename to core/src/main/java/com/volmit/iris/util/data/WeightMap.java
diff --git a/src/main/java/com/volmit/iris/util/data/WeightedRandom.java b/core/src/main/java/com/volmit/iris/util/data/WeightedRandom.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/WeightedRandom.java
rename to core/src/main/java/com/volmit/iris/util/data/WeightedRandom.java
diff --git a/src/main/java/com/volmit/iris/util/data/Writable.java b/core/src/main/java/com/volmit/iris/util/data/Writable.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/Writable.java
rename to core/src/main/java/com/volmit/iris/util/data/Writable.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/BitStorage.java b/core/src/main/java/com/volmit/iris/util/data/palette/BitStorage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/BitStorage.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/BitStorage.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/CountConsumer.java b/core/src/main/java/com/volmit/iris/util/data/palette/CountConsumer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/CountConsumer.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/CountConsumer.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/CrudeIncrementalIntIdentityHashBiMap.java b/core/src/main/java/com/volmit/iris/util/data/palette/CrudeIncrementalIntIdentityHashBiMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/CrudeIncrementalIntIdentityHashBiMap.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/CrudeIncrementalIntIdentityHashBiMap.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/GlobalPalette.java b/core/src/main/java/com/volmit/iris/util/data/palette/GlobalPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/GlobalPalette.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/GlobalPalette.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/HashMapPalette.java b/core/src/main/java/com/volmit/iris/util/data/palette/HashMapPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/HashMapPalette.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/HashMapPalette.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/IdMap.java b/core/src/main/java/com/volmit/iris/util/data/palette/IdMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/IdMap.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/IdMap.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/IdMapper.java b/core/src/main/java/com/volmit/iris/util/data/palette/IdMapper.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/IdMapper.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/IdMapper.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/LinearPalette.java b/core/src/main/java/com/volmit/iris/util/data/palette/LinearPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/LinearPalette.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/LinearPalette.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/Mth.java b/core/src/main/java/com/volmit/iris/util/data/palette/Mth.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/Mth.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/Mth.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/Palette.java b/core/src/main/java/com/volmit/iris/util/data/palette/Palette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/Palette.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/Palette.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/PaletteAccess.java b/core/src/main/java/com/volmit/iris/util/data/palette/PaletteAccess.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/PaletteAccess.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/PaletteAccess.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/PaletteResize.java b/core/src/main/java/com/volmit/iris/util/data/palette/PaletteResize.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/PaletteResize.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/PaletteResize.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/PaletteType.java b/core/src/main/java/com/volmit/iris/util/data/palette/PaletteType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/PaletteType.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/PaletteType.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/PalettedContainer.java b/core/src/main/java/com/volmit/iris/util/data/palette/PalettedContainer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/PalettedContainer.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/PalettedContainer.java
diff --git a/src/main/java/com/volmit/iris/util/data/palette/QuartPos.java b/core/src/main/java/com/volmit/iris/util/data/palette/QuartPos.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/data/palette/QuartPos.java
rename to core/src/main/java/com/volmit/iris/util/data/palette/QuartPos.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeContext.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeContext.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeContext.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeContext.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeContextHandler.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeContextHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeContextHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeContextHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeNode.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeNode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeNode.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeNode.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeOrigin.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeOrigin.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeOrigin.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeOrigin.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeParameter.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/DecreeSystem.java
rename to core/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java
diff --git a/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java b/core/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/annotations/Decree.java
rename to core/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java
diff --git a/src/main/java/com/volmit/iris/util/decree/annotations/Param.java b/core/src/main/java/com/volmit/iris/util/decree/annotations/Param.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/annotations/Param.java
rename to core/src/main/java/com/volmit/iris/util/decree/annotations/Param.java
diff --git a/src/main/java/com/volmit/iris/util/decree/context/BiomeContextHandler.java b/core/src/main/java/com/volmit/iris/util/decree/context/BiomeContextHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/context/BiomeContextHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/context/BiomeContextHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/context/DimensionContextHandler.java b/core/src/main/java/com/volmit/iris/util/decree/context/DimensionContextHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/context/DimensionContextHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/context/DimensionContextHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/context/GeneratorContextHandler.java b/core/src/main/java/com/volmit/iris/util/decree/context/GeneratorContextHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/context/GeneratorContextHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/context/GeneratorContextHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/context/RegionContextHandler.java b/core/src/main/java/com/volmit/iris/util/decree/context/RegionContextHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/context/RegionContextHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/context/RegionContextHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/context/VectorContextHandler.java b/core/src/main/java/com/volmit/iris/util/decree/context/VectorContextHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/context/VectorContextHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/context/VectorContextHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/context/WorldContextHandler.java b/core/src/main/java/com/volmit/iris/util/decree/context/WorldContextHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/context/WorldContextHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/context/WorldContextHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/exceptions/DecreeParsingException.java b/core/src/main/java/com/volmit/iris/util/decree/exceptions/DecreeParsingException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/exceptions/DecreeParsingException.java
rename to core/src/main/java/com/volmit/iris/util/decree/exceptions/DecreeParsingException.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/BlockVectorHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/BlockVectorHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/BlockVectorHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/BlockVectorHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/BooleanHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/BooleanHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/BooleanHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/BooleanHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/VectorHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/VectorHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/VectorHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/VectorHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/specialhandlers/DummyHandler.java b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/DummyHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/specialhandlers/DummyHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/specialhandlers/DummyHandler.java
diff --git a/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/NullablePlayerHandler.java b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/NullablePlayerHandler.java
new file mode 100644
index 000000000..3c7567140
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/NullablePlayerHandler.java
@@ -0,0 +1,13 @@
+package com.volmit.iris.util.decree.specialhandlers;
+
+import com.volmit.iris.util.decree.exceptions.DecreeParsingException;
+import com.volmit.iris.util.decree.handlers.PlayerHandler;
+import org.bukkit.entity.Player;
+
+public class NullablePlayerHandler extends PlayerHandler {
+
+ @Override
+ public Player parse(String in, boolean force) throws DecreeParsingException {
+ return getPossibilities(in).stream().filter((i) -> toString(i).equalsIgnoreCase(in)).findFirst().orElse(null);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java
rename to core/src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java
diff --git a/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java b/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java
rename to core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java
diff --git a/src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java b/core/src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java
rename to core/src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java
diff --git a/src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java b/core/src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java
rename to core/src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java
diff --git a/src/main/java/com/volmit/iris/util/documentation/ChunkRelativeBlockCoordinates.java b/core/src/main/java/com/volmit/iris/util/documentation/ChunkRelativeBlockCoordinates.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/documentation/ChunkRelativeBlockCoordinates.java
rename to core/src/main/java/com/volmit/iris/util/documentation/ChunkRelativeBlockCoordinates.java
diff --git a/src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java b/core/src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java
rename to core/src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java
diff --git a/src/main/java/com/volmit/iris/util/exceptions/IrisException.java b/core/src/main/java/com/volmit/iris/util/exceptions/IrisException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/exceptions/IrisException.java
rename to core/src/main/java/com/volmit/iris/util/exceptions/IrisException.java
diff --git a/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java b/core/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java
rename to core/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java
diff --git a/src/main/java/com/volmit/iris/util/format/C.java b/core/src/main/java/com/volmit/iris/util/format/C.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/format/C.java
rename to core/src/main/java/com/volmit/iris/util/format/C.java
diff --git a/src/main/java/com/volmit/iris/util/format/Form.java b/core/src/main/java/com/volmit/iris/util/format/Form.java
similarity index 99%
rename from src/main/java/com/volmit/iris/util/format/Form.java
rename to core/src/main/java/com/volmit/iris/util/format/Form.java
index a38867767..bb2e7ec27 100644
--- a/src/main/java/com/volmit/iris/util/format/Form.java
+++ b/core/src/main/java/com/volmit/iris/util/format/Form.java
@@ -683,23 +683,23 @@ public static String stampDay(long t) {
*/
public static String ofSize(long s, int div) {
double d = (double) s;
- String sub = "Bytes";
+ String sub = " Bytes";
if (d > div - 1) {
d /= div;
- sub = "KB";
+ sub = " KB";
if (d > div - 1) {
d /= div;
- sub = "MB";
+ sub = " MB";
if (d > div - 1) {
d /= div;
- sub = "GB";
+ sub = " GB";
if (d > div - 1) {
d /= div;
- sub = "TB";
+ sub = " TB";
}
}
}
diff --git a/src/main/java/com/volmit/iris/util/format/MemoryMonitor.java b/core/src/main/java/com/volmit/iris/util/format/MemoryMonitor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/format/MemoryMonitor.java
rename to core/src/main/java/com/volmit/iris/util/format/MemoryMonitor.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer2.java b/core/src/main/java/com/volmit/iris/util/function/Consumer2.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer2.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer2.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer2IO.java b/core/src/main/java/com/volmit/iris/util/function/Consumer2IO.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer2IO.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer2IO.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer3.java b/core/src/main/java/com/volmit/iris/util/function/Consumer3.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer3.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer3.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer4.java b/core/src/main/java/com/volmit/iris/util/function/Consumer4.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer4.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer4.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer4IO.java b/core/src/main/java/com/volmit/iris/util/function/Consumer4IO.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer4IO.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer4IO.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer5.java b/core/src/main/java/com/volmit/iris/util/function/Consumer5.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer5.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer5.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer6.java b/core/src/main/java/com/volmit/iris/util/function/Consumer6.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer6.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer6.java
diff --git a/src/main/java/com/volmit/iris/util/function/Consumer8.java b/core/src/main/java/com/volmit/iris/util/function/Consumer8.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Consumer8.java
rename to core/src/main/java/com/volmit/iris/util/function/Consumer8.java
diff --git a/src/main/java/com/volmit/iris/util/function/Function2.java b/core/src/main/java/com/volmit/iris/util/function/Function2.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Function2.java
rename to core/src/main/java/com/volmit/iris/util/function/Function2.java
diff --git a/src/main/java/com/volmit/iris/util/function/Function3.java b/core/src/main/java/com/volmit/iris/util/function/Function3.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Function3.java
rename to core/src/main/java/com/volmit/iris/util/function/Function3.java
diff --git a/src/main/java/com/volmit/iris/util/function/Function4.java b/core/src/main/java/com/volmit/iris/util/function/Function4.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Function4.java
rename to core/src/main/java/com/volmit/iris/util/function/Function4.java
diff --git a/src/main/java/com/volmit/iris/util/function/NastyFunction.java b/core/src/main/java/com/volmit/iris/util/function/NastyFunction.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/NastyFunction.java
rename to core/src/main/java/com/volmit/iris/util/function/NastyFunction.java
diff --git a/src/main/java/com/volmit/iris/util/function/NastyFuture.java b/core/src/main/java/com/volmit/iris/util/function/NastyFuture.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/NastyFuture.java
rename to core/src/main/java/com/volmit/iris/util/function/NastyFuture.java
diff --git a/src/main/java/com/volmit/iris/util/function/NastyRunnable.java b/core/src/main/java/com/volmit/iris/util/function/NastyRunnable.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/NastyRunnable.java
rename to core/src/main/java/com/volmit/iris/util/function/NastyRunnable.java
diff --git a/src/main/java/com/volmit/iris/util/function/NastySupplier.java b/core/src/main/java/com/volmit/iris/util/function/NastySupplier.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/NastySupplier.java
rename to core/src/main/java/com/volmit/iris/util/function/NastySupplier.java
diff --git a/src/main/java/com/volmit/iris/util/function/NoiseInjector.java b/core/src/main/java/com/volmit/iris/util/function/NoiseInjector.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/NoiseInjector.java
rename to core/src/main/java/com/volmit/iris/util/function/NoiseInjector.java
diff --git a/src/main/java/com/volmit/iris/util/function/NoiseProvider.java b/core/src/main/java/com/volmit/iris/util/function/NoiseProvider.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/NoiseProvider.java
rename to core/src/main/java/com/volmit/iris/util/function/NoiseProvider.java
diff --git a/src/main/java/com/volmit/iris/util/function/NoiseProvider3.java b/core/src/main/java/com/volmit/iris/util/function/NoiseProvider3.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/NoiseProvider3.java
rename to core/src/main/java/com/volmit/iris/util/function/NoiseProvider3.java
diff --git a/src/main/java/com/volmit/iris/util/function/Supplier2.java b/core/src/main/java/com/volmit/iris/util/function/Supplier2.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Supplier2.java
rename to core/src/main/java/com/volmit/iris/util/function/Supplier2.java
diff --git a/src/main/java/com/volmit/iris/util/function/Supplier3.java b/core/src/main/java/com/volmit/iris/util/function/Supplier3.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Supplier3.java
rename to core/src/main/java/com/volmit/iris/util/function/Supplier3.java
diff --git a/src/main/java/com/volmit/iris/util/function/Supplier3R.java b/core/src/main/java/com/volmit/iris/util/function/Supplier3R.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/function/Supplier3R.java
rename to core/src/main/java/com/volmit/iris/util/function/Supplier3R.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/Hunk.java b/core/src/main/java/com/volmit/iris/util/hunk/Hunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/Hunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/Hunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/HunkFace.java b/core/src/main/java/com/volmit/iris/util/hunk/HunkFace.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/HunkFace.java
rename to core/src/main/java/com/volmit/iris/util/hunk/HunkFace.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/HunkFactory.java b/core/src/main/java/com/volmit/iris/util/hunk/HunkFactory.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/HunkFactory.java
rename to core/src/main/java/com/volmit/iris/util/hunk/HunkFactory.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/bits/DataBits.java b/core/src/main/java/com/volmit/iris/util/hunk/bits/DataBits.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/bits/DataBits.java
rename to core/src/main/java/com/volmit/iris/util/hunk/bits/DataBits.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/bits/DataContainer.java b/core/src/main/java/com/volmit/iris/util/hunk/bits/DataContainer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/bits/DataContainer.java
rename to core/src/main/java/com/volmit/iris/util/hunk/bits/DataContainer.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java b/core/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java
similarity index 75%
rename from src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java
rename to core/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java
index 2afc2c696..c35c02acc 100644
--- a/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java
+++ b/core/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java
@@ -23,8 +23,10 @@
import java.util.LinkedHashMap;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
public class HashPalette implements Palette {
+ private final ReentrantLock lock = new ReentrantLock();
private final LinkedHashMap palette;
private final KMap lookup;
private final AtomicInteger size;
@@ -47,14 +49,18 @@ public T get(int id) {
@Override
public int add(T t) {
- int index = size.getAndIncrement();
- palette.put(t, index);
+ lock.lock();
+ try {
+ int index = size.getAndIncrement();
+ palette.put(t, index);
- if (t != null) {
- lookup.put(index, t);
+ if (t != null) {
+ lookup.put(index, t);
+ }
+ return index;
+ } finally {
+ lock.unlock();
}
-
- return index;
}
@Override
@@ -74,12 +80,17 @@ public int size() {
@Override
public void iterate(Consumer2 c) {
- for (T i : palette.keySet()) {
- if (i == null) {
- continue;
- }
+ lock.lock();
+ try {
+ for (T i : palette.keySet()) {
+ if (i == null) {
+ continue;
+ }
- c.accept(i, id(i));
+ c.accept(i, id(i));
+ }
+ } finally {
+ lock.unlock();
}
}
}
diff --git a/src/main/java/com/volmit/iris/util/hunk/bits/LinearPalette.java b/core/src/main/java/com/volmit/iris/util/hunk/bits/LinearPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/bits/LinearPalette.java
rename to core/src/main/java/com/volmit/iris/util/hunk/bits/LinearPalette.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/bits/Palette.java b/core/src/main/java/com/volmit/iris/util/hunk/bits/Palette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/bits/Palette.java
rename to core/src/main/java/com/volmit/iris/util/hunk/bits/Palette.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/bits/Writable.java b/core/src/main/java/com/volmit/iris/util/hunk/bits/Writable.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/bits/Writable.java
rename to core/src/main/java/com/volmit/iris/util/hunk/bits/Writable.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/ArrayHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/ArrayHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/ArrayHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/ArrayHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/AtomicDoubleHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicDoubleHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/AtomicDoubleHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicDoubleHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/AtomicHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/AtomicHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/AtomicIntegerHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicIntegerHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/AtomicIntegerHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicIntegerHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/AtomicLongHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicLongHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/AtomicLongHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/AtomicLongHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/MappedHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/MappedHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/MappedHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/MappedHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/MappedSyncHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/MappedSyncHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/MappedSyncHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/MappedSyncHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/PaletteHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/PaletteHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/PaletteHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/PaletteHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/PaletteOrHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/PaletteOrHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/PaletteOrHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/PaletteOrHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/StorageHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/StorageHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/StorageHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/StorageHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/storage/SynchronizedArrayHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/storage/SynchronizedArrayHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/storage/SynchronizedArrayHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/storage/SynchronizedArrayHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkHolder.java b/core/src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkHolder.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkHolder.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkHolder.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/BiomeGridHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/ChunkBiomeHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkBiomeHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/ChunkBiomeHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/ChunkBiomeHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkHolder.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkHolder.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkHolder.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkHolder.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/ChunkHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/ChunkHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/ChunkHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/DriftHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/DriftHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/DriftHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/DriftHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/FringedHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/FringedHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/FringedHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/FringedHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/FunctionalHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/FunctionalHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/FunctionalHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/FunctionalHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/HunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/HunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/HunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/HunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/InvertedHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/InvertedHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/InvertedHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/InvertedHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/ListeningHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ListeningHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/ListeningHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/ListeningHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/ReadOnlyHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ReadOnlyHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/ReadOnlyHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/ReadOnlyHunk.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/RotatedXHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/RotatedXHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/RotatedXHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/RotatedXHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/RotatedYHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/RotatedYHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/RotatedYHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/RotatedYHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/RotatedZHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/RotatedZHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/RotatedZHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/RotatedZHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/SynchronizedHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/SynchronizedHunkView.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/SynchronizedHunkView.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/SynchronizedHunkView.java
diff --git a/src/main/java/com/volmit/iris/util/hunk/view/WriteTrackHunk.java b/core/src/main/java/com/volmit/iris/util/hunk/view/WriteTrackHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/hunk/view/WriteTrackHunk.java
rename to core/src/main/java/com/volmit/iris/util/hunk/view/WriteTrackHunk.java
diff --git a/src/main/java/com/volmit/iris/util/interpolation/CompiledStarcast.java b/core/src/main/java/com/volmit/iris/util/interpolation/CompiledStarcast.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/interpolation/CompiledStarcast.java
rename to core/src/main/java/com/volmit/iris/util/interpolation/CompiledStarcast.java
diff --git a/src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod.java b/core/src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod.java
rename to core/src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod.java
diff --git a/src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod3D.java b/core/src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod3D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod3D.java
rename to core/src/main/java/com/volmit/iris/util/interpolation/InterpolationMethod3D.java
diff --git a/src/main/java/com/volmit/iris/util/interpolation/InterpolationType.java b/core/src/main/java/com/volmit/iris/util/interpolation/InterpolationType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/interpolation/InterpolationType.java
rename to core/src/main/java/com/volmit/iris/util/interpolation/InterpolationType.java
diff --git a/src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java b/core/src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java
rename to core/src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java
diff --git a/src/main/java/com/volmit/iris/util/interpolation/Starcast.java b/core/src/main/java/com/volmit/iris/util/interpolation/Starcast.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/interpolation/Starcast.java
rename to core/src/main/java/com/volmit/iris/util/interpolation/Starcast.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/Element.java b/core/src/main/java/com/volmit/iris/util/inventorygui/Element.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/Element.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/Element.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/ElementEvent.java b/core/src/main/java/com/volmit/iris/util/inventorygui/ElementEvent.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/ElementEvent.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/ElementEvent.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/RandomColor.java b/core/src/main/java/com/volmit/iris/util/inventorygui/RandomColor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/RandomColor.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/RandomColor.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/UIElement.java b/core/src/main/java/com/volmit/iris/util/inventorygui/UIElement.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/UIElement.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/UIElement.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/UIStaticDecorator.java b/core/src/main/java/com/volmit/iris/util/inventorygui/UIStaticDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/UIStaticDecorator.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/UIStaticDecorator.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/UIVoidDecorator.java b/core/src/main/java/com/volmit/iris/util/inventorygui/UIVoidDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/UIVoidDecorator.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/UIVoidDecorator.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/UIWindow.java b/core/src/main/java/com/volmit/iris/util/inventorygui/UIWindow.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/UIWindow.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/UIWindow.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/Window.java b/core/src/main/java/com/volmit/iris/util/inventorygui/Window.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/Window.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/Window.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/WindowDecorator.java b/core/src/main/java/com/volmit/iris/util/inventorygui/WindowDecorator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/WindowDecorator.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/WindowDecorator.java
diff --git a/src/main/java/com/volmit/iris/util/inventorygui/WindowResolution.java b/core/src/main/java/com/volmit/iris/util/inventorygui/WindowResolution.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/inventorygui/WindowResolution.java
rename to core/src/main/java/com/volmit/iris/util/inventorygui/WindowResolution.java
diff --git a/src/main/java/com/volmit/iris/util/io/Converter.java b/core/src/main/java/com/volmit/iris/util/io/Converter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/Converter.java
rename to core/src/main/java/com/volmit/iris/util/io/Converter.java
diff --git a/src/main/java/com/volmit/iris/util/io/CustomOutputStream.java b/core/src/main/java/com/volmit/iris/util/io/CustomOutputStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/CustomOutputStream.java
rename to core/src/main/java/com/volmit/iris/util/io/CustomOutputStream.java
diff --git a/src/main/java/com/volmit/iris/util/io/FileWatcher.java b/core/src/main/java/com/volmit/iris/util/io/FileWatcher.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/FileWatcher.java
rename to core/src/main/java/com/volmit/iris/util/io/FileWatcher.java
diff --git a/src/main/java/com/volmit/iris/util/io/FolderWatcher.java b/core/src/main/java/com/volmit/iris/util/io/FolderWatcher.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/FolderWatcher.java
rename to core/src/main/java/com/volmit/iris/util/io/FolderWatcher.java
diff --git a/src/main/java/com/volmit/iris/util/io/IO.java b/core/src/main/java/com/volmit/iris/util/io/IO.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/IO.java
rename to core/src/main/java/com/volmit/iris/util/io/IO.java
diff --git a/src/main/java/com/volmit/iris/util/io/IORunnable.java b/core/src/main/java/com/volmit/iris/util/io/IORunnable.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/IORunnable.java
rename to core/src/main/java/com/volmit/iris/util/io/IORunnable.java
diff --git a/src/main/java/com/volmit/iris/util/io/InstanceState.java b/core/src/main/java/com/volmit/iris/util/io/InstanceState.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/InstanceState.java
rename to core/src/main/java/com/volmit/iris/util/io/InstanceState.java
diff --git a/src/main/java/com/volmit/iris/util/io/JarScanner.java b/core/src/main/java/com/volmit/iris/util/io/JarScanner.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/JarScanner.java
rename to core/src/main/java/com/volmit/iris/util/io/JarScanner.java
diff --git a/src/main/java/com/volmit/iris/util/io/ReactiveFolder.java b/core/src/main/java/com/volmit/iris/util/io/ReactiveFolder.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/ReactiveFolder.java
rename to core/src/main/java/com/volmit/iris/util/io/ReactiveFolder.java
diff --git a/src/main/java/com/volmit/iris/util/io/VoidOutputStream.java b/core/src/main/java/com/volmit/iris/util/io/VoidOutputStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/io/VoidOutputStream.java
rename to core/src/main/java/com/volmit/iris/util/io/VoidOutputStream.java
diff --git a/src/main/java/com/volmit/iris/util/json/HTTP.java b/core/src/main/java/com/volmit/iris/util/json/HTTP.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/HTTP.java
rename to core/src/main/java/com/volmit/iris/util/json/HTTP.java
diff --git a/src/main/java/com/volmit/iris/util/json/HTTPTokener.java b/core/src/main/java/com/volmit/iris/util/json/HTTPTokener.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/HTTPTokener.java
rename to core/src/main/java/com/volmit/iris/util/json/HTTPTokener.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONArray.java b/core/src/main/java/com/volmit/iris/util/json/JSONArray.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONArray.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONArray.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONException.java b/core/src/main/java/com/volmit/iris/util/json/JSONException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONException.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONException.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONML.java b/core/src/main/java/com/volmit/iris/util/json/JSONML.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONML.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONML.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONObject.java b/core/src/main/java/com/volmit/iris/util/json/JSONObject.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONObject.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONObject.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONString.java b/core/src/main/java/com/volmit/iris/util/json/JSONString.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONString.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONString.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONStringer.java b/core/src/main/java/com/volmit/iris/util/json/JSONStringer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONStringer.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONStringer.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONTokener.java b/core/src/main/java/com/volmit/iris/util/json/JSONTokener.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONTokener.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONTokener.java
diff --git a/src/main/java/com/volmit/iris/util/json/JSONWriter.java b/core/src/main/java/com/volmit/iris/util/json/JSONWriter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/JSONWriter.java
rename to core/src/main/java/com/volmit/iris/util/json/JSONWriter.java
diff --git a/src/main/java/com/volmit/iris/util/json/XML.java b/core/src/main/java/com/volmit/iris/util/json/XML.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/XML.java
rename to core/src/main/java/com/volmit/iris/util/json/XML.java
diff --git a/src/main/java/com/volmit/iris/util/json/XMLTokener.java b/core/src/main/java/com/volmit/iris/util/json/XMLTokener.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/json/XMLTokener.java
rename to core/src/main/java/com/volmit/iris/util/json/XMLTokener.java
diff --git a/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java
similarity index 78%
rename from src/main/java/com/volmit/iris/util/mantle/Mantle.java
rename to core/src/main/java/com/volmit/iris/util/mantle/Mantle.java
index 6ef668ff5..4b7f415b3 100644
--- a/src/main/java/com/volmit/iris/util/mantle/Mantle.java
+++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java
@@ -18,6 +18,7 @@
package com.volmit.iris.util.mantle;
+import com.google.common.util.concurrent.AtomicDouble;
import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.tools.IrisToolbelt;
@@ -25,8 +26,8 @@
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.EngineMantle;
import com.volmit.iris.engine.mantle.MantleWriter;
+import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
-import com.volmit.iris.util.collection.KSet;
import com.volmit.iris.util.documentation.BlockCoordinates;
import com.volmit.iris.util.documentation.ChunkCoordinates;
import com.volmit.iris.util.documentation.RegionCoordinates;
@@ -45,27 +46,30 @@
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
+import java.util.*;
+import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReentrantLock;
/**
* The mantle can store any type of data slice anywhere and manage regions & IO on it's own.
* This class is fully thread safe read & writeNodeData
*/
+
public class Mantle {
private final File dataFolder;
+ @Getter
private final int worldHeight;
private final Map lastUse;
@Getter
private final Map loadedRegions;
private final HyperLock hyperLock;
- private final KSet unload;
private final AtomicBoolean closed;
private final MultiBurst ioBurst;
- private final AtomicBoolean io;
+ private final AtomicBoolean ioTrim;
+ private final AtomicBoolean ioTectonicUnload;
/**
* Create a new mantle
@@ -79,9 +83,9 @@ public Mantle(File dataFolder, int worldHeight) {
this.closed = new AtomicBoolean(false);
this.dataFolder = dataFolder;
this.worldHeight = worldHeight;
- this.io = new AtomicBoolean(false);
+ this.ioTrim = new AtomicBoolean(false);
+ this.ioTectonicUnload = new AtomicBoolean(false);
dataFolder.mkdirs();
- unload = new KSet<>();
loadedRegions = new KMap<>();
lastUse = new KMap<>();
ioBurst = MultiBurst.burst;
@@ -108,7 +112,7 @@ public static File fileForRegion(File folder, int x, int z) {
* @return the file
*/
public static File fileForRegion(File folder, Long key) {
- File f = new File(folder, "p." + key + ".ttp");
+ File f = new File(folder, "p." + key + ".ttp.lz4b");
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
}
@@ -374,46 +378,116 @@ public synchronized void close() {
Iris.debug("The Mantle has Closed " + C.DARK_AQUA + dataFolder.getAbsolutePath());
}
+ /**
+ * Estimates the memory usage of the lastUse map.
+ *
+ * @return Estimated memory usage in bytes.
+ */
+
+ public long LastUseMapMemoryUsage() {
+ long numberOfEntries = lastUse.size();
+ long bytesPerEntry = Long.BYTES * 2;
+ return numberOfEntries * bytesPerEntry;
+ }
+
+ @Getter
+ private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0);
+ @Getter
+ private final AtomicInteger forceAggressiveThreshold = new AtomicInteger(30);
+ @Getter
+ private final AtomicLong oldestTectonicPlate = new AtomicLong(0);
+ private final ReentrantLock unloadLock = new ReentrantLock();
+ @Getter
+ private final KList toUnload = new KList<>();
+
/**
* Save & unload regions that have not been used for more than the
* specified amount of milliseconds
*
- * @param idleDuration the duration
+ * @param baseIdleDuration the duration
*/
- public synchronized void trim(long idleDuration) {
+ public synchronized void trim(long baseIdleDuration, int tectonicLimit) {
if (closed.get()) {
throw new RuntimeException("The Mantle is closed");
}
- io.set(true);
- Iris.debug("Trimming Tectonic Plates older than " + Form.duration((double) idleDuration, 0));
- unload.clear();
+ adjustedIdleDuration.set(baseIdleDuration);
- for (Long i : lastUse.keySet()) {
- hyperLock.withLong(i, () -> {
- if (M.ms() - lastUse.get(i) >= idleDuration) {
- unload.add(i);
- }
- });
+ if (loadedRegions != null) {
+ if (loadedRegions.size() > tectonicLimit) {
+ // todo update this correctly and maybe do something when its above a 100%
+ adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimit) / (double) tectonicLimit) * 100) * 0.4), 4000));
+ }
}
- for (Long i : unload) {
- hyperLock.withLong(i, () -> {
- TectonicPlate m = loadedRegions.remove(i);
- lastUse.remove(i);
-
- try {
- m.write(fileForRegion(dataFolder, i));
- } catch (IOException e) {
- e.printStackTrace();
+ ioTrim.set(true);
+ unloadLock.lock();
+ try {
+ Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0));
+ if (lastUse != null) {
+ if (!lastUse.isEmpty()) {
+ for (Long i : new ArrayList<>(lastUse.keySet())) {
+ double finalAdjustedIdleDuration = adjustedIdleDuration.get();
+ hyperLock.withLong(i, () -> {
+ Long lastUseTime = lastUse.get(i);
+ if (lastUseTime != null && M.ms() - lastUseTime >= finalAdjustedIdleDuration) {
+ toUnload.add(i);
+ Iris.debug("Tectonic Region added to unload");
+ //Iris.panic();
+ }
+ });
+ }
}
+ }
- Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i));
- });
+ } catch (Throwable e) {
+ Iris.reportError(e);
+ } finally {
+ ioTrim.set(false);
+ unloadLock.unlock();
+ }
+ }
+
+ public synchronized int unloadTectonicPlate(int tectonicLimit) {
+ AtomicInteger i = new AtomicInteger();
+ unloadLock.lock();
+ BurstExecutor burst = null;
+ try {
+ KList copy = toUnload.copy();
+ burst = MultiBurst.burst.burst(copy.size());
+ burst.setMulticore(copy.size() > tectonicLimit);
+ for (long id : copy) {
+ burst.queue(() ->
+ hyperLock.withLong(id, () -> {
+ TectonicPlate m = loadedRegions.get(id);
+ if (m != null) {
+ try {
+ m.write(fileForRegion(dataFolder, id));
+ loadedRegions.remove(id);
+ lastUse.remove(id);
+ toUnload.remove(id);
+ i.incrementAndGet();
+ Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id));
+ } catch (IOException e) {
+ Iris.reportError(e);
+ }
+ }
+ }));
+
+ }
+ burst.complete();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ if (burst != null)
+ burst.complete();
+ } finally {
+ unloadLock.unlock();
+ ioTectonicUnload.set(true);
}
- io.set(false);
+ return i.get();
}
+
/**
* This retreives a future of the Tectonic Plate at the given coordinates.
* All methods accessing tectonic plates should go through this method
@@ -424,7 +498,7 @@ public synchronized void trim(long idleDuration) {
*/
@RegionCoordinates
private TectonicPlate get(int x, int z) {
- if (io.get()) {
+ if (ioTrim.get()) {
try {
return getSafe(x, z).get();
} catch (InterruptedException e) {
@@ -481,6 +555,8 @@ private Future getSafe(int x, int z) {
}
File file = fileForRegion(dataFolder, x, z);
+ if (!file.exists())
+ file = new File(dataFolder, file.getName().substring(".lz4b".length()));
if (file.exists()) {
try {
@@ -519,10 +595,6 @@ public void saveAll() {
}
- public int getWorldHeight() {
- return worldHeight;
- }
-
public MantleChunk getChunk(Chunk e) {
return getChunk(e.getX(), e.getZ());
}
@@ -554,4 +626,4 @@ public boolean isLoaded(Chunk c) {
public boolean shouldReduce(Engine engine) {
return !engine.isStudio() || IrisSettings.get().getPerformance().isTrimMantleInStudio();
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/mantle/MantleChunk.java
rename to core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java
diff --git a/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/mantle/MantleFlag.java
rename to core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java
diff --git a/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java
similarity index 87%
rename from src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java
rename to core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java
index bea18ba3a..6f3cd0f35 100644
--- a/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java
+++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java
@@ -26,6 +26,10 @@
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import lombok.Getter;
+import net.jpountz.lz4.LZ4BlockInputStream;
+import net.jpountz.lz4.LZ4BlockOutputStream;
+import net.jpountz.lz4.LZ4FrameInputStream;
+import net.jpountz.lz4.LZ4FrameOutputStream;
import java.io.*;
import java.util.concurrent.atomic.AtomicReferenceArray;
@@ -79,8 +83,14 @@ public TectonicPlate(int worldHeight, DataInputStream din) throws IOException, C
public static TectonicPlate read(int worldHeight, File file) throws IOException, ClassNotFoundException {
FileInputStream fin = new FileInputStream(file);
- GZIPInputStream gzi = new GZIPInputStream(fin);
- DataInputStream din = new DataInputStream(gzi);
+ DataInputStream din;
+ if (file.getName().endsWith("ttp.lz4b")) {
+ LZ4BlockInputStream lz4 = new LZ4BlockInputStream(fin);
+ din = new DataInputStream(lz4);
+ } else {
+ GZIPInputStream gzi = new GZIPInputStream(fin);
+ din = new DataInputStream(gzi);
+ }
TectonicPlate p = new TectonicPlate(worldHeight, din);
din.close();
@@ -164,8 +174,14 @@ private int index(int x, int z) {
public void write(File file) throws IOException {
PrecisionStopwatch p = PrecisionStopwatch.start();
FileOutputStream fos = new FileOutputStream(file);
- GZIPOutputStream gzo = new GZIPOutputStream(fos);
- DataOutputStream dos = new DataOutputStream(gzo);
+ DataOutputStream dos;
+ if (file.getName().endsWith("ttp.lz4b")) {
+ LZ4BlockOutputStream lz4 = new LZ4BlockOutputStream(fos);
+ dos = new DataOutputStream(lz4);
+ } else {
+ GZIPOutputStream gzo = new GZIPOutputStream(fos);
+ dos = new DataOutputStream(gzo);
+ }
write(dos);
dos.close();
Iris.debug("Saved Tectonic Plate " + C.DARK_GREEN + file.getName().split("\\Q.\\E")[0] + C.RED + " in " + Form.duration(p.getMilliseconds(), 2));
diff --git a/src/main/java/com/volmit/iris/util/math/AlignedPoint.java b/core/src/main/java/com/volmit/iris/util/math/AlignedPoint.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/AlignedPoint.java
rename to core/src/main/java/com/volmit/iris/util/math/AlignedPoint.java
diff --git a/src/main/java/com/volmit/iris/util/math/Average.java b/core/src/main/java/com/volmit/iris/util/math/Average.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Average.java
rename to core/src/main/java/com/volmit/iris/util/math/Average.java
diff --git a/src/main/java/com/volmit/iris/util/math/AxisAlignedBB.java b/core/src/main/java/com/volmit/iris/util/math/AxisAlignedBB.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/AxisAlignedBB.java
rename to core/src/main/java/com/volmit/iris/util/math/AxisAlignedBB.java
diff --git a/src/main/java/com/volmit/iris/util/math/BlockPosition.java b/core/src/main/java/com/volmit/iris/util/math/BlockPosition.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/BlockPosition.java
rename to core/src/main/java/com/volmit/iris/util/math/BlockPosition.java
diff --git a/src/main/java/com/volmit/iris/util/math/CDou.java b/core/src/main/java/com/volmit/iris/util/math/CDou.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/CDou.java
rename to core/src/main/java/com/volmit/iris/util/math/CDou.java
diff --git a/src/main/java/com/volmit/iris/util/math/DOP.java b/core/src/main/java/com/volmit/iris/util/math/DOP.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/DOP.java
rename to core/src/main/java/com/volmit/iris/util/math/DOP.java
diff --git a/src/main/java/com/volmit/iris/util/math/Direction.java b/core/src/main/java/com/volmit/iris/util/math/Direction.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Direction.java
rename to core/src/main/java/com/volmit/iris/util/math/Direction.java
diff --git a/src/main/java/com/volmit/iris/util/math/FinalInteger.java b/core/src/main/java/com/volmit/iris/util/math/FinalInteger.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/FinalInteger.java
rename to core/src/main/java/com/volmit/iris/util/math/FinalInteger.java
diff --git a/src/main/java/com/volmit/iris/util/math/INode.java b/core/src/main/java/com/volmit/iris/util/math/INode.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/INode.java
rename to core/src/main/java/com/volmit/iris/util/math/INode.java
diff --git a/src/main/java/com/volmit/iris/util/math/IrisMathHelper.java b/core/src/main/java/com/volmit/iris/util/math/IrisMathHelper.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/IrisMathHelper.java
rename to core/src/main/java/com/volmit/iris/util/math/IrisMathHelper.java
diff --git a/src/main/java/com/volmit/iris/util/math/KochanekBartelsInterpolation.java b/core/src/main/java/com/volmit/iris/util/math/KochanekBartelsInterpolation.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/KochanekBartelsInterpolation.java
rename to core/src/main/java/com/volmit/iris/util/math/KochanekBartelsInterpolation.java
diff --git a/src/main/java/com/volmit/iris/util/math/M.java b/core/src/main/java/com/volmit/iris/util/math/M.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/M.java
rename to core/src/main/java/com/volmit/iris/util/math/M.java
diff --git a/src/main/java/com/volmit/iris/util/math/MathHelper.java b/core/src/main/java/com/volmit/iris/util/math/MathHelper.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/MathHelper.java
rename to core/src/main/java/com/volmit/iris/util/math/MathHelper.java
diff --git a/src/main/java/com/volmit/iris/util/math/PathInterpolation.java b/core/src/main/java/com/volmit/iris/util/math/PathInterpolation.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/PathInterpolation.java
rename to core/src/main/java/com/volmit/iris/util/math/PathInterpolation.java
diff --git a/src/main/java/com/volmit/iris/util/math/Point3d.java b/core/src/main/java/com/volmit/iris/util/math/Point3d.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Point3d.java
rename to core/src/main/java/com/volmit/iris/util/math/Point3d.java
diff --git a/src/main/java/com/volmit/iris/util/math/Point3f.java b/core/src/main/java/com/volmit/iris/util/math/Point3f.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Point3f.java
rename to core/src/main/java/com/volmit/iris/util/math/Point3f.java
diff --git a/src/main/java/com/volmit/iris/util/math/Point4d.java b/core/src/main/java/com/volmit/iris/util/math/Point4d.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Point4d.java
rename to core/src/main/java/com/volmit/iris/util/math/Point4d.java
diff --git a/src/main/java/com/volmit/iris/util/math/Point4f.java b/core/src/main/java/com/volmit/iris/util/math/Point4f.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Point4f.java
rename to core/src/main/java/com/volmit/iris/util/math/Point4f.java
diff --git a/src/main/java/com/volmit/iris/util/math/Position2.java b/core/src/main/java/com/volmit/iris/util/math/Position2.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Position2.java
rename to core/src/main/java/com/volmit/iris/util/math/Position2.java
diff --git a/src/main/java/com/volmit/iris/util/math/RNG.java b/core/src/main/java/com/volmit/iris/util/math/RNG.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/RNG.java
rename to core/src/main/java/com/volmit/iris/util/math/RNG.java
diff --git a/core/src/main/java/com/volmit/iris/util/math/RNGV2.java b/core/src/main/java/com/volmit/iris/util/math/RNGV2.java
new file mode 100644
index 000000000..2ded4af70
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/util/math/RNGV2.java
@@ -0,0 +1,168 @@
+package com.volmit.iris.util.math;
+
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Random;
+import java.util.UUID;
+
+import java.security.SecureRandom;
+import java.util.List;
+import java.util.UUID;
+import java.nio.charset.StandardCharsets;
+
+public class RNGV2 extends SecureRandom {
+ private static final long serialVersionUID = 5222938581174415179L;
+ private static final char[] CHARGEN = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-=!@#$%^&*()_+`~[];',./<>?:\\\"{}|\\\\".toCharArray();
+ private final long sx;
+
+ // Constructor with no seed
+ public RNGV2() {
+ super();
+ sx = 0;
+ }
+
+ public RNGV2(long seed) {
+ super();
+ this.setSeed(seed);
+ this.sx = seed;
+ }
+
+ // Constructor with a string seed
+ public RNGV2(String seed) {
+ this(UUID.nameUUIDFromBytes(seed.getBytes(StandardCharsets.UTF_8)).getLeastSignificantBits() +
+ UUID.nameUUIDFromBytes(seed.getBytes(StandardCharsets.UTF_8)).getMostSignificantBits() +
+ (seed.length() * 32564L));
+ }
+
+ public RNGV2 nextParallelRNG(int signature) {
+ return new RNGV2(sx + signature);
+ }
+
+ public RNGV2 nextParallelRNG(long signature) {
+ return new RNGV2(sx + signature);
+ }
+
+ public String s(int length) {
+ StringBuilder sb = new StringBuilder();
+
+ for (int i = 0; i < length; i++) {
+ sb.append(c());
+ }
+
+ return sb.toString();
+ }
+
+ public char c() {
+ return CHARGEN[i(CHARGEN.length - 1)];
+ }
+
+ // Pick a random enum
+ public T e(Class t) {
+ T[] c = t.getEnumConstants();
+ return c[i(c.length)];
+ }
+
+ public boolean b() {
+ return nextBoolean();
+ }
+
+ public boolean b(double percent) {
+ return d() > percent;
+ }
+
+ public short si(int lowerBound, int upperBound) {
+ return (short) (lowerBound + (nextFloat() * ((upperBound - lowerBound) + 1)));
+ }
+
+ public short si(int upperBound) {
+ return si(0, upperBound);
+ }
+
+ public short si() {
+ return si(1);
+ }
+
+ public float f(float lowerBound, float upperBound) {
+ return lowerBound + (nextFloat() * ((upperBound - lowerBound)));
+ }
+
+ public float f(float upperBound) {
+ return f(0, upperBound);
+ }
+
+ public float f() {
+ return f(1);
+ }
+
+ public double d(double lowerBound, double upperBound) {
+ return lowerBound + (nextDouble() * (upperBound - lowerBound));
+ }
+
+ public double d(double upperBound) {
+ return d(0, upperBound);
+ }
+
+ public double d() {
+ return nextDouble();
+ }
+
+ public int i(int lowerBound, int upperBound) {
+ if (lowerBound >= upperBound) {
+ throw new IllegalArgumentException("Upper bound must be greater than lower bound");
+ }
+ return lowerBound + this.nextInt(upperBound - lowerBound + 1);
+ }
+
+ public int i(int upperBound) {
+ return i(0, upperBound);
+ }
+
+ public long l(long lowerBound, long upperBound) {
+ return Math.round(d(lowerBound, upperBound));
+ }
+
+ public long l(long upperBound) {
+ return l(0, upperBound);
+ }
+
+ public int imax() {
+ return i(Integer.MIN_VALUE, Integer.MAX_VALUE);
+ }
+
+ public long lmax() {
+ return l(Long.MIN_VALUE, Long.MAX_VALUE);
+ }
+
+ public float fmax() {
+ return f(Float.MIN_VALUE, Float.MAX_VALUE);
+ }
+
+ public double dmax() {
+ return d(Double.MIN_VALUE, Double.MAX_VALUE);
+ }
+
+ public short simax() {
+ return si(Short.MIN_VALUE, Short.MAX_VALUE);
+ }
+
+ public boolean chance(double chance) {
+ return nextDouble() <= chance;
+ }
+
+ public T pick(List pieces) {
+ if (pieces.isEmpty()) {
+ return null;
+ }
+
+ if (pieces.size() == 1) {
+ return pieces.get(0);
+ }
+
+ return pieces.get(this.nextInt(pieces.size()));
+ }
+
+ public long getSeed() {
+ return sx;
+ }
+}
+
diff --git a/src/main/java/com/volmit/iris/util/math/RollingSequence.java b/core/src/main/java/com/volmit/iris/util/math/RollingSequence.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/RollingSequence.java
rename to core/src/main/java/com/volmit/iris/util/math/RollingSequence.java
diff --git a/src/main/java/com/volmit/iris/util/math/Spiral.java b/core/src/main/java/com/volmit/iris/util/math/Spiral.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Spiral.java
rename to core/src/main/java/com/volmit/iris/util/math/Spiral.java
diff --git a/src/main/java/com/volmit/iris/util/math/Spiraled.java b/core/src/main/java/com/volmit/iris/util/math/Spiraled.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Spiraled.java
rename to core/src/main/java/com/volmit/iris/util/math/Spiraled.java
diff --git a/src/main/java/com/volmit/iris/util/math/Spiraler.java b/core/src/main/java/com/volmit/iris/util/math/Spiraler.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Spiraler.java
rename to core/src/main/java/com/volmit/iris/util/math/Spiraler.java
diff --git a/src/main/java/com/volmit/iris/util/math/Tuple2d.java b/core/src/main/java/com/volmit/iris/util/math/Tuple2d.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Tuple2d.java
rename to core/src/main/java/com/volmit/iris/util/math/Tuple2d.java
diff --git a/src/main/java/com/volmit/iris/util/math/Tuple2f.java b/core/src/main/java/com/volmit/iris/util/math/Tuple2f.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Tuple2f.java
rename to core/src/main/java/com/volmit/iris/util/math/Tuple2f.java
diff --git a/src/main/java/com/volmit/iris/util/math/Tuple3d.java b/core/src/main/java/com/volmit/iris/util/math/Tuple3d.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Tuple3d.java
rename to core/src/main/java/com/volmit/iris/util/math/Tuple3d.java
diff --git a/src/main/java/com/volmit/iris/util/math/Tuple3f.java b/core/src/main/java/com/volmit/iris/util/math/Tuple3f.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Tuple3f.java
rename to core/src/main/java/com/volmit/iris/util/math/Tuple3f.java
diff --git a/src/main/java/com/volmit/iris/util/math/Tuple4d.java b/core/src/main/java/com/volmit/iris/util/math/Tuple4d.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Tuple4d.java
rename to core/src/main/java/com/volmit/iris/util/math/Tuple4d.java
diff --git a/src/main/java/com/volmit/iris/util/math/Tuple4f.java b/core/src/main/java/com/volmit/iris/util/math/Tuple4f.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Tuple4f.java
rename to core/src/main/java/com/volmit/iris/util/math/Tuple4f.java
diff --git a/src/main/java/com/volmit/iris/util/math/VecMathUtil.java b/core/src/main/java/com/volmit/iris/util/math/VecMathUtil.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/VecMathUtil.java
rename to core/src/main/java/com/volmit/iris/util/math/VecMathUtil.java
diff --git a/src/main/java/com/volmit/iris/util/math/Vector2d.java b/core/src/main/java/com/volmit/iris/util/math/Vector2d.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Vector2d.java
rename to core/src/main/java/com/volmit/iris/util/math/Vector2d.java
diff --git a/src/main/java/com/volmit/iris/util/math/Vector2f.java b/core/src/main/java/com/volmit/iris/util/math/Vector2f.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Vector2f.java
rename to core/src/main/java/com/volmit/iris/util/math/Vector2f.java
diff --git a/src/main/java/com/volmit/iris/util/math/Vector3d.java b/core/src/main/java/com/volmit/iris/util/math/Vector3d.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Vector3d.java
rename to core/src/main/java/com/volmit/iris/util/math/Vector3d.java
diff --git a/src/main/java/com/volmit/iris/util/math/Vector3f.java b/core/src/main/java/com/volmit/iris/util/math/Vector3f.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/Vector3f.java
rename to core/src/main/java/com/volmit/iris/util/math/Vector3f.java
diff --git a/src/main/java/com/volmit/iris/util/math/VectorMath.java b/core/src/main/java/com/volmit/iris/util/math/VectorMath.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/math/VectorMath.java
rename to core/src/main/java/com/volmit/iris/util/math/VectorMath.java
diff --git a/src/main/java/com/volmit/iris/util/matter/IrisMatter.java b/core/src/main/java/com/volmit/iris/util/matter/IrisMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/IrisMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/IrisMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/Matter.java b/core/src/main/java/com/volmit/iris/util/matter/Matter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/Matter.java
rename to core/src/main/java/com/volmit/iris/util/matter/Matter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java b/core/src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterCavern.java b/core/src/main/java/com/volmit/iris/util/matter/MatterCavern.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterCavern.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterCavern.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterEntity.java b/core/src/main/java/com/volmit/iris/util/matter/MatterEntity.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterEntity.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterEntity.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterEntityGroup.java b/core/src/main/java/com/volmit/iris/util/matter/MatterEntityGroup.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterEntityGroup.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterEntityGroup.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterFilter.java b/core/src/main/java/com/volmit/iris/util/matter/MatterFilter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterFilter.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterFilter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterFluidBody.java b/core/src/main/java/com/volmit/iris/util/matter/MatterFluidBody.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterFluidBody.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterFluidBody.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterHeader.java b/core/src/main/java/com/volmit/iris/util/matter/MatterHeader.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterHeader.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterHeader.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterMarker.java b/core/src/main/java/com/volmit/iris/util/matter/MatterMarker.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterMarker.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterMarker.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterPalette.java b/core/src/main/java/com/volmit/iris/util/matter/MatterPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterPalette.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterPalette.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterPlacer.java b/core/src/main/java/com/volmit/iris/util/matter/MatterPlacer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterPlacer.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterPlacer.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterReader.java b/core/src/main/java/com/volmit/iris/util/matter/MatterReader.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterReader.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterReader.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterSlice.java b/core/src/main/java/com/volmit/iris/util/matter/MatterSlice.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterSlice.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterSlice.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterStructurePOI.java b/core/src/main/java/com/volmit/iris/util/matter/MatterStructurePOI.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterStructurePOI.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterStructurePOI.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterUpdate.java b/core/src/main/java/com/volmit/iris/util/matter/MatterUpdate.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterUpdate.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterUpdate.java
diff --git a/src/main/java/com/volmit/iris/util/matter/MatterWriter.java b/core/src/main/java/com/volmit/iris/util/matter/MatterWriter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/MatterWriter.java
rename to core/src/main/java/com/volmit/iris/util/matter/MatterWriter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/Sliced.java b/core/src/main/java/com/volmit/iris/util/matter/Sliced.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/Sliced.java
rename to core/src/main/java/com/volmit/iris/util/matter/Sliced.java
diff --git a/src/main/java/com/volmit/iris/util/matter/TileWrapper.java b/core/src/main/java/com/volmit/iris/util/matter/TileWrapper.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/TileWrapper.java
rename to core/src/main/java/com/volmit/iris/util/matter/TileWrapper.java
diff --git a/src/main/java/com/volmit/iris/util/matter/WorldMatter.java b/core/src/main/java/com/volmit/iris/util/matter/WorldMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/WorldMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/WorldMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/CavernMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/CavernMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/CavernMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/CavernMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/EntityMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/EntityMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/EntityMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/EntityMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java
diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/JigsawPieceMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/JigsawPieceMatter.java
new file mode 100644
index 000000000..05cc08385
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/util/matter/slices/JigsawPieceMatter.java
@@ -0,0 +1,35 @@
+package com.volmit.iris.util.matter.slices;
+
+import com.volmit.iris.util.data.palette.Palette;
+import com.volmit.iris.util.matter.Sliced;
+import com.volmit.iris.util.matter.slices.container.JigsawPieceContainer;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+@Sliced
+public class JigsawPieceMatter extends RawMatter {
+ public JigsawPieceMatter() {
+ this(1,1,1);
+ }
+
+ public JigsawPieceMatter(int width, int height, int depth) {
+ super(width, height, depth, JigsawPieceContainer.class);
+ }
+
+ @Override
+ public Palette getGlobalPalette() {
+ return null;
+ }
+
+ @Override
+ public void writeNode(JigsawPieceContainer b, DataOutputStream dos) throws IOException {
+ dos.writeUTF(b.getLoadKey());
+ }
+
+ @Override
+ public JigsawPieceContainer readNode(DataInputStream din) throws IOException {
+ return new JigsawPieceContainer(din.readUTF());
+ }
+}
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/MarkerMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/MarkerMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/MarkerMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/MarkerMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/NBTMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/NBTMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/NBTMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/NBTMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/RawMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/RawMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/RawMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/RawMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/RegistryMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/RegistryMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/RegistryMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/RegistryMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/SpawnerMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/SpawnerMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/SpawnerMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/SpawnerMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/StructurePOIMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/StructurePOIMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/StructurePOIMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/StructurePOIMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/TileMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/TileMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/TileMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/TileMatter.java
diff --git a/src/main/java/com/volmit/iris/util/matter/slices/UpdateMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/UpdateMatter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/matter/slices/UpdateMatter.java
rename to core/src/main/java/com/volmit/iris/util/matter/slices/UpdateMatter.java
diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/container/JigsawPieceContainer.java b/core/src/main/java/com/volmit/iris/util/matter/slices/container/JigsawPieceContainer.java
new file mode 100644
index 000000000..08e569d5f
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/util/matter/slices/container/JigsawPieceContainer.java
@@ -0,0 +1,13 @@
+package com.volmit.iris.util.matter.slices.container;
+
+import com.volmit.iris.engine.object.IrisJigsawPiece;
+
+public class JigsawPieceContainer extends RegistrantContainer {
+ public JigsawPieceContainer(String loadKey) {
+ super(IrisJigsawPiece.class, loadKey);
+ }
+
+ public static JigsawPieceContainer toContainer(IrisJigsawPiece piece) {
+ return new JigsawPieceContainer(piece.getLoadKey());
+ }
+}
diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/container/RegistrantContainer.java b/core/src/main/java/com/volmit/iris/util/matter/slices/container/RegistrantContainer.java
new file mode 100644
index 000000000..0ab161e57
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/util/matter/slices/container/RegistrantContainer.java
@@ -0,0 +1,22 @@
+package com.volmit.iris.util.matter.slices.container;
+
+import com.volmit.iris.core.loader.IrisData;
+import com.volmit.iris.core.loader.IrisRegistrant;
+
+public abstract class RegistrantContainer {
+ private final Class type;
+ private final String loadKey;
+
+ public RegistrantContainer(Class type, String loadKey) {
+ this.type = type;
+ this.loadKey = loadKey;
+ }
+
+ public T load(IrisData data) {
+ return (T) data.getLoaders().get(type).load(loadKey);
+ }
+
+ public String getLoadKey() {
+ return loadKey;
+ }
+}
diff --git a/core/src/main/java/com/volmit/iris/util/misc/getHardware.java b/core/src/main/java/com/volmit/iris/util/misc/getHardware.java
new file mode 100644
index 000000000..0b9a52033
--- /dev/null
+++ b/core/src/main/java/com/volmit/iris/util/misc/getHardware.java
@@ -0,0 +1,57 @@
+package com.volmit.iris.util.misc;
+
+import oshi.SystemInfo;
+import oshi.hardware.CentralProcessor;
+import oshi.hardware.HWDiskStore;
+import oshi.software.os.OperatingSystem;
+
+import java.util.List;
+
+public class getHardware {
+ public static String getServerOS() {
+ SystemInfo systemInfo = new SystemInfo();
+ OperatingSystem os = systemInfo.getOperatingSystem();
+ return os.toString();
+ }
+ public static long getProcessMemory(){
+ long maxMemory = Runtime.getRuntime().maxMemory() / (1024 * 1024);
+ return maxMemory;
+ }
+ public static long getProcessUsedMemory() {
+ Runtime runtime = Runtime.getRuntime();
+
+ long totalMemory = runtime.totalMemory();
+ long freeMemory = runtime.freeMemory();
+ long usedMemory = totalMemory - freeMemory;
+
+ return usedMemory / (1024 * 1024);
+ }
+
+ public static long getAvailableProcessMemory(){
+ long availableMemory = getHardware.getProcessMemory() - getHardware.getProcessUsedMemory();
+ return availableMemory;
+ }
+
+ public static String getCPUModel() {
+ try {
+ SystemInfo systemInfo = new SystemInfo();
+ CentralProcessor processor = systemInfo.getHardware().getProcessor();
+ String cpuModel = processor.getProcessorIdentifier().getName();
+ return cpuModel.isEmpty() ? "Unknown CPU Model" : cpuModel;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "Unknown CPU Model";
+ }
+ }
+
+ public static String getDiskModel() {
+ SystemInfo systemInfo = new SystemInfo();
+ List diskStores = systemInfo.getHardware().getDiskStores();
+ if (!diskStores.isEmpty()) {
+ HWDiskStore firstDisk = diskStores.get(0);
+ return firstDisk.getModel();
+ } else {
+ return "Unknown Disk Model";
+ }
+ }
+}
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/NBTDeserializer.java b/core/src/main/java/com/volmit/iris/util/nbt/io/NBTDeserializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/NBTDeserializer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/NBTDeserializer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/NBTInputStream.java b/core/src/main/java/com/volmit/iris/util/nbt/io/NBTInputStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/NBTInputStream.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/NBTInputStream.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/NBTOutputStream.java b/core/src/main/java/com/volmit/iris/util/nbt/io/NBTOutputStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/NBTOutputStream.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/NBTOutputStream.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/NBTSerializer.java b/core/src/main/java/com/volmit/iris/util/nbt/io/NBTSerializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/NBTSerializer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/NBTSerializer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/NBTUtil.java b/core/src/main/java/com/volmit/iris/util/nbt/io/NBTUtil.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/NBTUtil.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/NBTUtil.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/NamedTag.java b/core/src/main/java/com/volmit/iris/util/nbt/io/NamedTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/NamedTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/NamedTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/ParseException.java b/core/src/main/java/com/volmit/iris/util/nbt/io/ParseException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/ParseException.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/ParseException.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/SNBTDeserializer.java b/core/src/main/java/com/volmit/iris/util/nbt/io/SNBTDeserializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/SNBTDeserializer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/SNBTDeserializer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/SNBTParser.java b/core/src/main/java/com/volmit/iris/util/nbt/io/SNBTParser.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/SNBTParser.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/SNBTParser.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/SNBTSerializer.java b/core/src/main/java/com/volmit/iris/util/nbt/io/SNBTSerializer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/SNBTSerializer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/SNBTSerializer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/SNBTUtil.java b/core/src/main/java/com/volmit/iris/util/nbt/io/SNBTUtil.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/SNBTUtil.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/SNBTUtil.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/SNBTWriter.java b/core/src/main/java/com/volmit/iris/util/nbt/io/SNBTWriter.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/SNBTWriter.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/SNBTWriter.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/io/StringPointer.java b/core/src/main/java/com/volmit/iris/util/nbt/io/StringPointer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/io/StringPointer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/io/StringPointer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/Chunk.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/Chunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/Chunk.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/Chunk.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/CompressionType.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/CompressionType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/CompressionType.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/CompressionType.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/ExceptionFunction.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/ExceptionFunction.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/ExceptionFunction.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/ExceptionFunction.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/LoadFlags.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/LoadFlags.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/LoadFlags.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/LoadFlags.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/MCAFile.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/MCAFile.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/MCAFile.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/MCAFile.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/MCAUtil.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/MCAUtil.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/MCAUtil.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/MCAUtil.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/Section.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/Section.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/Section.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/Section.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABiomeContainer.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABiomeContainer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABiomeContainer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABiomeContainer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABitStorage.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABitStorage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABitStorage.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCABitStorage.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAChunkBiomeContainer.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAChunkBiomeContainer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAChunkBiomeContainer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAChunkBiomeContainer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACountConsumer.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACountConsumer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACountConsumer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACountConsumer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACrudeIncrementalIntIdentityHashBiMap.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACrudeIncrementalIntIdentityHashBiMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACrudeIncrementalIntIdentityHashBiMap.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCACrudeIncrementalIntIdentityHashBiMap.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAGlobalPalette.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAGlobalPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAGlobalPalette.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAGlobalPalette.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAHashMapPalette.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAHashMapPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAHashMapPalette.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAHashMapPalette.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMap.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMap.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMap.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMapper.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMapper.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMapper.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAIdMapper.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCALinearPalette.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCALinearPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCALinearPalette.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCALinearPalette.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAMth.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAMth.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAMth.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAMth.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalette.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalette.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalette.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalette.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteAccess.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteAccess.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteAccess.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteAccess.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteResize.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteResize.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteResize.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPaletteResize.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalettedContainer.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalettedContainer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalettedContainer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAPalettedContainer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAQuartPos.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAQuartPos.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAQuartPos.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAQuartPos.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAWrappedPalettedContainer.java b/core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAWrappedPalettedContainer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAWrappedPalettedContainer.java
rename to core/src/main/java/com/volmit/iris/util/nbt/mca/palette/MCAWrappedPalettedContainer.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/ArrayTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/ArrayTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/ArrayTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/ArrayTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/ByteArrayTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/ByteArrayTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/ByteArrayTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/ByteArrayTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/ByteTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/ByteTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/ByteTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/ByteTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/CompoundTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/CompoundTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/CompoundTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/CompoundTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/DoubleTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/DoubleTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/DoubleTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/DoubleTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/EndTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/EndTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/EndTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/EndTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/FloatTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/FloatTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/FloatTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/FloatTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/IntArrayTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/IntArrayTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/IntArrayTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/IntArrayTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/IntTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/IntTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/IntTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/IntTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/ListTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/ListTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/ListTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/ListTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/LongArrayTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/LongArrayTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/LongArrayTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/LongArrayTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/LongTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/LongTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/LongTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/LongTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/NonNullEntrySet.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/NonNullEntrySet.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/NonNullEntrySet.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/NonNullEntrySet.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/NumberTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/NumberTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/NumberTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/NumberTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/ShortTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/ShortTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/ShortTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/ShortTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/StringTag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/StringTag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/StringTag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/StringTag.java
diff --git a/src/main/java/com/volmit/iris/util/nbt/tag/Tag.java b/core/src/main/java/com/volmit/iris/util/nbt/tag/Tag.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/nbt/tag/Tag.java
rename to core/src/main/java/com/volmit/iris/util/nbt/tag/Tag.java
diff --git a/src/main/java/com/volmit/iris/util/network/DL.java b/core/src/main/java/com/volmit/iris/util/network/DL.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/network/DL.java
rename to core/src/main/java/com/volmit/iris/util/network/DL.java
diff --git a/src/main/java/com/volmit/iris/util/network/DownloadException.java b/core/src/main/java/com/volmit/iris/util/network/DownloadException.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/network/DownloadException.java
rename to core/src/main/java/com/volmit/iris/util/network/DownloadException.java
diff --git a/src/main/java/com/volmit/iris/util/network/DownloadMonitor.java b/core/src/main/java/com/volmit/iris/util/network/DownloadMonitor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/network/DownloadMonitor.java
rename to core/src/main/java/com/volmit/iris/util/network/DownloadMonitor.java
diff --git a/src/main/java/com/volmit/iris/util/network/MeteredInputStream.java b/core/src/main/java/com/volmit/iris/util/network/MeteredInputStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/network/MeteredInputStream.java
rename to core/src/main/java/com/volmit/iris/util/network/MeteredInputStream.java
diff --git a/src/main/java/com/volmit/iris/util/network/MeteredOutputStream.java b/core/src/main/java/com/volmit/iris/util/network/MeteredOutputStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/network/MeteredOutputStream.java
rename to core/src/main/java/com/volmit/iris/util/network/MeteredOutputStream.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CNG.java b/core/src/main/java/com/volmit/iris/util/noise/CNG.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CNG.java
rename to core/src/main/java/com/volmit/iris/util/noise/CNG.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CNGFactory.java b/core/src/main/java/com/volmit/iris/util/noise/CNGFactory.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CNGFactory.java
rename to core/src/main/java/com/volmit/iris/util/noise/CNGFactory.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CachedNoise.java b/core/src/main/java/com/volmit/iris/util/noise/CachedNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CachedNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/CachedNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CachedNoiseMap.java b/core/src/main/java/com/volmit/iris/util/noise/CachedNoiseMap.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CachedNoiseMap.java
rename to core/src/main/java/com/volmit/iris/util/noise/CachedNoiseMap.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CellGenerator.java b/core/src/main/java/com/volmit/iris/util/noise/CellGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CellGenerator.java
rename to core/src/main/java/com/volmit/iris/util/noise/CellGenerator.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CellHeightNoise.java b/core/src/main/java/com/volmit/iris/util/noise/CellHeightNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CellHeightNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/CellHeightNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CellularNoise.java b/core/src/main/java/com/volmit/iris/util/noise/CellularNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CellularNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/CellularNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CloverNoise.java b/core/src/main/java/com/volmit/iris/util/noise/CloverNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CloverNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/CloverNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/CubicNoise.java b/core/src/main/java/com/volmit/iris/util/noise/CubicNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/CubicNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/CubicNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java b/core/src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FastNoise.java b/core/src/main/java/com/volmit/iris/util/noise/FastNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FastNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/FastNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FastNoiseDouble.java b/core/src/main/java/com/volmit/iris/util/noise/FastNoiseDouble.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FastNoiseDouble.java
rename to core/src/main/java/com/volmit/iris/util/noise/FastNoiseDouble.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FlatNoise.java b/core/src/main/java/com/volmit/iris/util/noise/FlatNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FlatNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/FlatNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FractalBillowPerlinNoise.java b/core/src/main/java/com/volmit/iris/util/noise/FractalBillowPerlinNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FractalBillowPerlinNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/FractalBillowPerlinNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FractalBillowSimplexNoise.java b/core/src/main/java/com/volmit/iris/util/noise/FractalBillowSimplexNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FractalBillowSimplexNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/FractalBillowSimplexNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FractalCubicNoise.java b/core/src/main/java/com/volmit/iris/util/noise/FractalCubicNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FractalCubicNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/FractalCubicNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FractalFBMSimplexNoise.java b/core/src/main/java/com/volmit/iris/util/noise/FractalFBMSimplexNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FractalFBMSimplexNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/FractalFBMSimplexNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/FractalRigidMultiSimplexNoise.java b/core/src/main/java/com/volmit/iris/util/noise/FractalRigidMultiSimplexNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/FractalRigidMultiSimplexNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/FractalRigidMultiSimplexNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/GlobNoise.java b/core/src/main/java/com/volmit/iris/util/noise/GlobNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/GlobNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/GlobNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/ImageNoise.java b/core/src/main/java/com/volmit/iris/util/noise/ImageNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/ImageNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/ImageNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/InterpolatedNoise.java b/core/src/main/java/com/volmit/iris/util/noise/InterpolatedNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/InterpolatedNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/InterpolatedNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/NoiseFactory.java b/core/src/main/java/com/volmit/iris/util/noise/NoiseFactory.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/NoiseFactory.java
rename to core/src/main/java/com/volmit/iris/util/noise/NoiseFactory.java
diff --git a/src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java b/core/src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java
rename to core/src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java
diff --git a/src/main/java/com/volmit/iris/util/noise/NoiseType.java b/core/src/main/java/com/volmit/iris/util/noise/NoiseType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/NoiseType.java
rename to core/src/main/java/com/volmit/iris/util/noise/NoiseType.java
diff --git a/src/main/java/com/volmit/iris/util/noise/OctaveNoise.java b/core/src/main/java/com/volmit/iris/util/noise/OctaveNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/OctaveNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/OctaveNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/PerlinNoise.java b/core/src/main/java/com/volmit/iris/util/noise/PerlinNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/PerlinNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/PerlinNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/RarityCellGenerator.java b/core/src/main/java/com/volmit/iris/util/noise/RarityCellGenerator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/RarityCellGenerator.java
rename to core/src/main/java/com/volmit/iris/util/noise/RarityCellGenerator.java
diff --git a/src/main/java/com/volmit/iris/util/noise/SimplexNoise.java b/core/src/main/java/com/volmit/iris/util/noise/SimplexNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/SimplexNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/SimplexNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/VascularNoise.java b/core/src/main/java/com/volmit/iris/util/noise/VascularNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/VascularNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/VascularNoise.java
diff --git a/src/main/java/com/volmit/iris/util/noise/WhiteNoise.java b/core/src/main/java/com/volmit/iris/util/noise/WhiteNoise.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/noise/WhiteNoise.java
rename to core/src/main/java/com/volmit/iris/util/noise/WhiteNoise.java
diff --git a/src/main/java/com/volmit/iris/util/parallel/BurstExecutor.java b/core/src/main/java/com/volmit/iris/util/parallel/BurstExecutor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/parallel/BurstExecutor.java
rename to core/src/main/java/com/volmit/iris/util/parallel/BurstExecutor.java
diff --git a/src/main/java/com/volmit/iris/util/parallel/BurstedHunk.java b/core/src/main/java/com/volmit/iris/util/parallel/BurstedHunk.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/parallel/BurstedHunk.java
rename to core/src/main/java/com/volmit/iris/util/parallel/BurstedHunk.java
diff --git a/src/main/java/com/volmit/iris/util/parallel/GridLock.java b/core/src/main/java/com/volmit/iris/util/parallel/GridLock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/parallel/GridLock.java
rename to core/src/main/java/com/volmit/iris/util/parallel/GridLock.java
diff --git a/src/main/java/com/volmit/iris/util/parallel/HyperLock.java b/core/src/main/java/com/volmit/iris/util/parallel/HyperLock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/parallel/HyperLock.java
rename to core/src/main/java/com/volmit/iris/util/parallel/HyperLock.java
diff --git a/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java b/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/parallel/MultiBurst.java
rename to core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java
diff --git a/src/main/java/com/volmit/iris/util/parallel/NOOPGridLock.java b/core/src/main/java/com/volmit/iris/util/parallel/NOOPGridLock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/parallel/NOOPGridLock.java
rename to core/src/main/java/com/volmit/iris/util/parallel/NOOPGridLock.java
diff --git a/src/main/java/com/volmit/iris/util/particle/FastParticle.java b/core/src/main/java/com/volmit/iris/util/particle/FastParticle.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/particle/FastParticle.java
rename to core/src/main/java/com/volmit/iris/util/particle/FastParticle.java
diff --git a/src/main/java/com/volmit/iris/util/particle/FastReflection.java b/core/src/main/java/com/volmit/iris/util/particle/FastReflection.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/particle/FastReflection.java
rename to core/src/main/java/com/volmit/iris/util/particle/FastReflection.java
diff --git a/src/main/java/com/volmit/iris/util/particle/ParticleSender.java b/core/src/main/java/com/volmit/iris/util/particle/ParticleSender.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/particle/ParticleSender.java
rename to core/src/main/java/com/volmit/iris/util/particle/ParticleSender.java
diff --git a/src/main/java/com/volmit/iris/util/particle/ParticleSenderLegacy.java b/core/src/main/java/com/volmit/iris/util/particle/ParticleSenderLegacy.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/particle/ParticleSenderLegacy.java
rename to core/src/main/java/com/volmit/iris/util/particle/ParticleSenderLegacy.java
diff --git a/src/main/java/com/volmit/iris/util/particle/ParticleType.java b/core/src/main/java/com/volmit/iris/util/particle/ParticleType.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/particle/ParticleType.java
rename to core/src/main/java/com/volmit/iris/util/particle/ParticleType.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/CancellableTask.java b/core/src/main/java/com/volmit/iris/util/plugin/CancellableTask.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/CancellableTask.java
rename to core/src/main/java/com/volmit/iris/util/plugin/CancellableTask.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/Chunks.java b/core/src/main/java/com/volmit/iris/util/plugin/Chunks.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/Chunks.java
rename to core/src/main/java/com/volmit/iris/util/plugin/Chunks.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/Command.java b/core/src/main/java/com/volmit/iris/util/plugin/Command.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/Command.java
rename to core/src/main/java/com/volmit/iris/util/plugin/Command.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/CommandDummy.java b/core/src/main/java/com/volmit/iris/util/plugin/CommandDummy.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/CommandDummy.java
rename to core/src/main/java/com/volmit/iris/util/plugin/CommandDummy.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/Control.java b/core/src/main/java/com/volmit/iris/util/plugin/Control.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/Control.java
rename to core/src/main/java/com/volmit/iris/util/plugin/Control.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/Controller.java b/core/src/main/java/com/volmit/iris/util/plugin/Controller.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/Controller.java
rename to core/src/main/java/com/volmit/iris/util/plugin/Controller.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/ICommand.java b/core/src/main/java/com/volmit/iris/util/plugin/ICommand.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/ICommand.java
rename to core/src/main/java/com/volmit/iris/util/plugin/ICommand.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/IController.java b/core/src/main/java/com/volmit/iris/util/plugin/IController.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/IController.java
rename to core/src/main/java/com/volmit/iris/util/plugin/IController.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/Instance.java b/core/src/main/java/com/volmit/iris/util/plugin/Instance.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/Instance.java
rename to core/src/main/java/com/volmit/iris/util/plugin/Instance.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/IrisService.java b/core/src/main/java/com/volmit/iris/util/plugin/IrisService.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/IrisService.java
rename to core/src/main/java/com/volmit/iris/util/plugin/IrisService.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/Metrics.java b/core/src/main/java/com/volmit/iris/util/plugin/Metrics.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/Metrics.java
rename to core/src/main/java/com/volmit/iris/util/plugin/Metrics.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/MetricsLite.java b/core/src/main/java/com/volmit/iris/util/plugin/MetricsLite.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/MetricsLite.java
rename to core/src/main/java/com/volmit/iris/util/plugin/MetricsLite.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/MortarCommand.java b/core/src/main/java/com/volmit/iris/util/plugin/MortarCommand.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/MortarCommand.java
rename to core/src/main/java/com/volmit/iris/util/plugin/MortarCommand.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/MortarPermission.java b/core/src/main/java/com/volmit/iris/util/plugin/MortarPermission.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/MortarPermission.java
rename to core/src/main/java/com/volmit/iris/util/plugin/MortarPermission.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/Permission.java b/core/src/main/java/com/volmit/iris/util/plugin/Permission.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/Permission.java
rename to core/src/main/java/com/volmit/iris/util/plugin/Permission.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/PluginRegistry.java b/core/src/main/java/com/volmit/iris/util/plugin/PluginRegistry.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/PluginRegistry.java
rename to core/src/main/java/com/volmit/iris/util/plugin/PluginRegistry.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/PluginRegistryGroup.java b/core/src/main/java/com/volmit/iris/util/plugin/PluginRegistryGroup.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/PluginRegistryGroup.java
rename to core/src/main/java/com/volmit/iris/util/plugin/PluginRegistryGroup.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/RouterCommand.java b/core/src/main/java/com/volmit/iris/util/plugin/RouterCommand.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/RouterCommand.java
rename to core/src/main/java/com/volmit/iris/util/plugin/RouterCommand.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/VirtualCommand.java b/core/src/main/java/com/volmit/iris/util/plugin/VirtualCommand.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/VirtualCommand.java
rename to core/src/main/java/com/volmit/iris/util/plugin/VirtualCommand.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java b/core/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java
rename to core/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java
diff --git a/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java b/core/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/plugin/VolmitSender.java
rename to core/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java
diff --git a/src/main/java/com/volmit/iris/util/reflect/ShadeFix.java b/core/src/main/java/com/volmit/iris/util/reflect/ShadeFix.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/reflect/ShadeFix.java
rename to core/src/main/java/com/volmit/iris/util/reflect/ShadeFix.java
diff --git a/src/main/java/com/volmit/iris/util/reflect/V.java b/core/src/main/java/com/volmit/iris/util/reflect/V.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/reflect/V.java
rename to core/src/main/java/com/volmit/iris/util/reflect/V.java
diff --git a/src/main/java/com/volmit/iris/util/reflect/Violator.java b/core/src/main/java/com/volmit/iris/util/reflect/Violator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/reflect/Violator.java
rename to core/src/main/java/com/volmit/iris/util/reflect/Violator.java
diff --git a/src/main/java/com/volmit/iris/util/reflect/WrappedField.java b/core/src/main/java/com/volmit/iris/util/reflect/WrappedField.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/reflect/WrappedField.java
rename to core/src/main/java/com/volmit/iris/util/reflect/WrappedField.java
diff --git a/src/main/java/com/volmit/iris/util/reflect/WrappedReturningMethod.java b/core/src/main/java/com/volmit/iris/util/reflect/WrappedReturningMethod.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/reflect/WrappedReturningMethod.java
rename to core/src/main/java/com/volmit/iris/util/reflect/WrappedReturningMethod.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/AR.java b/core/src/main/java/com/volmit/iris/util/scheduling/AR.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/AR.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/AR.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Callback.java b/core/src/main/java/com/volmit/iris/util/scheduling/Callback.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Callback.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Callback.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/ChronoLatch.java b/core/src/main/java/com/volmit/iris/util/scheduling/ChronoLatch.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/ChronoLatch.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/ChronoLatch.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Contained.java b/core/src/main/java/com/volmit/iris/util/scheduling/Contained.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Contained.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Contained.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/GroupedExecutor.java b/core/src/main/java/com/volmit/iris/util/scheduling/GroupedExecutor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/GroupedExecutor.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/GroupedExecutor.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/IrisLock.java b/core/src/main/java/com/volmit/iris/util/scheduling/IrisLock.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/IrisLock.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/IrisLock.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/J.java b/core/src/main/java/com/volmit/iris/util/scheduling/J.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/J.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/J.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Looper.java b/core/src/main/java/com/volmit/iris/util/scheduling/Looper.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Looper.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Looper.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/O.java b/core/src/main/java/com/volmit/iris/util/scheduling/O.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/O.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/O.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Observable.java b/core/src/main/java/com/volmit/iris/util/scheduling/Observable.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Observable.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Observable.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Observer.java b/core/src/main/java/com/volmit/iris/util/scheduling/Observer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Observer.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Observer.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/PrecisionStopwatch.java b/core/src/main/java/com/volmit/iris/util/scheduling/PrecisionStopwatch.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/PrecisionStopwatch.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/PrecisionStopwatch.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Queue.java b/core/src/main/java/com/volmit/iris/util/scheduling/Queue.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Queue.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Queue.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/QueueExecutor.java b/core/src/main/java/com/volmit/iris/util/scheduling/QueueExecutor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/QueueExecutor.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/QueueExecutor.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/S.java b/core/src/main/java/com/volmit/iris/util/scheduling/S.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/S.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/S.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/SR.java b/core/src/main/java/com/volmit/iris/util/scheduling/SR.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/SR.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/SR.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/ShurikenQueue.java b/core/src/main/java/com/volmit/iris/util/scheduling/ShurikenQueue.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/ShurikenQueue.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/ShurikenQueue.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Switch.java b/core/src/main/java/com/volmit/iris/util/scheduling/Switch.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Switch.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Switch.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/TaskExecutor.java b/core/src/main/java/com/volmit/iris/util/scheduling/TaskExecutor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/TaskExecutor.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/TaskExecutor.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/ThreadMonitor.java b/core/src/main/java/com/volmit/iris/util/scheduling/ThreadMonitor.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/ThreadMonitor.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/ThreadMonitor.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/Wrapper.java b/core/src/main/java/com/volmit/iris/util/scheduling/Wrapper.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/Wrapper.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/Wrapper.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/DownloadJob.java b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/DownloadJob.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/jobs/DownloadJob.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/jobs/DownloadJob.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/JobCollection.java b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/JobCollection.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/jobs/JobCollection.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/jobs/JobCollection.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java
diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/SingleJob.java b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/SingleJob.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/scheduling/jobs/SingleJob.java
rename to core/src/main/java/com/volmit/iris/util/scheduling/jobs/SingleJob.java
diff --git a/src/main/java/com/volmit/iris/util/stream/ArraySignificance.java b/core/src/main/java/com/volmit/iris/util/stream/ArraySignificance.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/ArraySignificance.java
rename to core/src/main/java/com/volmit/iris/util/stream/ArraySignificance.java
diff --git a/src/main/java/com/volmit/iris/util/stream/BasicLayer.java b/core/src/main/java/com/volmit/iris/util/stream/BasicLayer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/BasicLayer.java
rename to core/src/main/java/com/volmit/iris/util/stream/BasicLayer.java
diff --git a/src/main/java/com/volmit/iris/util/stream/BasicStream.java b/core/src/main/java/com/volmit/iris/util/stream/BasicStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/BasicStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/BasicStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/ProceduralLayer.java b/core/src/main/java/com/volmit/iris/util/stream/ProceduralLayer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/ProceduralLayer.java
rename to core/src/main/java/com/volmit/iris/util/stream/ProceduralLayer.java
diff --git a/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java b/core/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/ProceduralStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/Significance.java b/core/src/main/java/com/volmit/iris/util/stream/Significance.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/Significance.java
rename to core/src/main/java/com/volmit/iris/util/stream/Significance.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/AddingStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/AddingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/AddingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/AddingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/ClampedStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/ClampedStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/ClampedStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/ClampedStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftLeftStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftLeftStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftLeftStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftLeftStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftRightStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftRightStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftRightStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/CoordinateBitShiftRightStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/DividingStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/DividingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/DividingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/DividingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/FittedStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/FittedStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/FittedStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/FittedStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/MaxingStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/MaxingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/MaxingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/MaxingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/MinningStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/MinningStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/MinningStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/MinningStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/ModuloStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/ModuloStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/ModuloStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/ModuloStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/MultiplyingStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/MultiplyingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/MultiplyingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/MultiplyingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/OffsetStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/OffsetStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/OffsetStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/OffsetStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/RadialStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/RadialStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/RadialStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/RadialStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/SlopeStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/SlopeStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/SlopeStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/SlopeStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/SubtractingStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/SubtractingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/SubtractingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/SubtractingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/arithmetic/ZoomStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/ZoomStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/arithmetic/ZoomStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/arithmetic/ZoomStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java b/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java b/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/convert/To3DStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/To3DStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/convert/To3DStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/convert/To3DStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/BiHermiteStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/BiHermiteStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/BiHermiteStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/BiHermiteStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/BiStarcastStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/BiStarcastStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/BiStarcastStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/BiStarcastStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/BicubicStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/BicubicStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/BicubicStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/BicubicStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/BilinearStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/BilinearStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/BilinearStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/BilinearStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/Interpolated.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/Interpolated.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/Interpolated.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/Interpolated.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatingStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/Interpolator.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/Interpolator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/Interpolator.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/Interpolator.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatorFactory.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatorFactory.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatorFactory.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/InterpolatorFactory.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/TriHermiteStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/TriHermiteStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/TriHermiteStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/TriHermiteStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/TriStarcastStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/TriStarcastStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/TriStarcastStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/TriStarcastStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/TricubicStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/TricubicStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/TricubicStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/TricubicStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/interpolation/TrilinearStream.java b/core/src/main/java/com/volmit/iris/util/stream/interpolation/TrilinearStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/interpolation/TrilinearStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/interpolation/TrilinearStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java b/core/src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java b/core/src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java b/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java b/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/ContextInjectingStream.java b/core/src/main/java/com/volmit/iris/util/stream/utility/ContextInjectingStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/ContextInjectingStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/ContextInjectingStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java b/core/src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/ProfiledStream.java b/core/src/main/java/com/volmit/iris/util/stream/utility/ProfiledStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/ProfiledStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/ProfiledStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/SemaphoreStream.java b/core/src/main/java/com/volmit/iris/util/stream/utility/SemaphoreStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/SemaphoreStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/SemaphoreStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/SynchronizedStream.java b/core/src/main/java/com/volmit/iris/util/stream/utility/SynchronizedStream.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/SynchronizedStream.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/SynchronizedStream.java
diff --git a/src/main/java/com/volmit/iris/util/stream/utility/WasteDetector.java b/core/src/main/java/com/volmit/iris/util/stream/utility/WasteDetector.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/stream/utility/WasteDetector.java
rename to core/src/main/java/com/volmit/iris/util/stream/utility/WasteDetector.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/U.java b/core/src/main/java/com/volmit/iris/util/uniques/U.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/U.java
rename to core/src/main/java/com/volmit/iris/util/uniques/U.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/UBufferedImage.java b/core/src/main/java/com/volmit/iris/util/uniques/UBufferedImage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/UBufferedImage.java
rename to core/src/main/java/com/volmit/iris/util/uniques/UBufferedImage.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/UFeature.java b/core/src/main/java/com/volmit/iris/util/uniques/UFeature.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/UFeature.java
rename to core/src/main/java/com/volmit/iris/util/uniques/UFeature.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/UFeatureMeta.java b/core/src/main/java/com/volmit/iris/util/uniques/UFeatureMeta.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/UFeatureMeta.java
rename to core/src/main/java/com/volmit/iris/util/uniques/UFeatureMeta.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/UImage.java b/core/src/main/java/com/volmit/iris/util/uniques/UImage.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/UImage.java
rename to core/src/main/java/com/volmit/iris/util/uniques/UImage.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/UMeta.java b/core/src/main/java/com/volmit/iris/util/uniques/UMeta.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/UMeta.java
rename to core/src/main/java/com/volmit/iris/util/uniques/UMeta.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/UniqueRenderer.java b/core/src/main/java/com/volmit/iris/util/uniques/UniqueRenderer.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/UniqueRenderer.java
rename to core/src/main/java/com/volmit/iris/util/uniques/UniqueRenderer.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/features/UFInterpolator.java b/core/src/main/java/com/volmit/iris/util/uniques/features/UFInterpolator.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/features/UFInterpolator.java
rename to core/src/main/java/com/volmit/iris/util/uniques/features/UFInterpolator.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/features/UFNOOP.java b/core/src/main/java/com/volmit/iris/util/uniques/features/UFNOOP.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/features/UFNOOP.java
rename to core/src/main/java/com/volmit/iris/util/uniques/features/UFNOOP.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedBackground.java b/core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedBackground.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/features/UFWarpedBackground.java
rename to core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedBackground.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedCircle.java b/core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedCircle.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/features/UFWarpedCircle.java
rename to core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedCircle.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDisc.java b/core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDisc.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDisc.java
rename to core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDisc.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDots.java b/core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDots.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDots.java
rename to core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedDots.java
diff --git a/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedLines.java b/core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedLines.java
similarity index 100%
rename from src/main/java/com/volmit/iris/util/uniques/features/UFWarpedLines.java
rename to core/src/main/java/com/volmit/iris/util/uniques/features/UFWarpedLines.java
diff --git a/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml
similarity index 88%
rename from src/main/resources/plugin.yml
rename to core/src/main/resources/plugin.yml
index 052267332..83ad85017 100644
--- a/src/main/resources/plugin.yml
+++ b/core/src/main/resources/plugin.yml
@@ -9,6 +9,7 @@ libraries:
- com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2
- com.github.ben-manes.caffeine:caffeine:3.0.5
- org.apache.commons:commons-lang3:3.12.0
+ - commons-io:commons-io:2.13.0
- io.timeandspace:smoothie-map:2.0.2
- com.google.guava:guava:31.0.1-jre
- com.google.code.gson:gson:2.8.9
@@ -17,6 +18,7 @@ libraries:
- org.ow2.asm:asm:9.2
- rhino:js:1.7R2
- bsf:bsf:2.4.0
+ - org.lz4:lz4-java:1.8.0
commands:
iris:
aliases: [ ir, irs ]
diff --git a/listing.json b/listing.json
index be6166b3c..e657b976b 100644
--- a/listing.json
+++ b/listing.json
@@ -4,7 +4,7 @@
"flat IrisDimensions/flat",
"redstone IrisDimensions/redstone",
"mars IrisDimensions/mars",
- "example IrisDimensions/example"
+ "example IrisDimensions/example",
"newhorizons IrisDimensions/newhorizons",
"theend IrisDimensions/theend"
]
diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/CustomBiomeSource.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/CustomBiomeSource.java
new file mode 100644
index 000000000..a24e62d85
--- /dev/null
+++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/CustomBiomeSource.java
@@ -0,0 +1,150 @@
+package com.volmit.iris.core.nms.v1_19_R1;
+
+import com.mojang.serialization.Codec;
+import com.volmit.iris.Iris;
+import com.volmit.iris.engine.data.cache.AtomicCache;
+import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.engine.object.IrisBiome;
+import com.volmit.iris.engine.object.IrisBiomeCustom;
+import com.volmit.iris.util.collection.KMap;
+import com.volmit.iris.util.math.RNG;
+import net.minecraft.core.Holder;
+import net.minecraft.core.Registry;
+import net.minecraft.core.RegistryAccess;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.level.biome.Biome;
+import net.minecraft.world.level.biome.BiomeSource;
+import net.minecraft.world.level.biome.Climate;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CustomBiomeSource extends BiomeSource {
+ private final long seed;
+ private final Engine engine;
+ private final Registry biomeCustomRegistry;
+ private final Registry biomeRegistry;
+ private final AtomicCache registryAccess = new AtomicCache<>();
+ private final RNG rng;
+ private final KMap> customBiomes;
+
+ public CustomBiomeSource(long seed, Engine engine, World world) {
+ super(getAllBiomes(
+ ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer()))
+ .registry(Registry.BIOME_REGISTRY).orElse(null),
+ ((CraftWorld) world).getHandle().registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null),
+ engine));
+ this.engine = engine;
+ this.seed = seed;
+ this.biomeCustomRegistry = registry().registry(Registry.BIOME_REGISTRY).orElse(null);
+ this.biomeRegistry = ((CraftWorld) world).getHandle().registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null);
+ this.rng = new RNG(engine.getSeedManager().getBiome());
+ this.customBiomes = fillCustomBiomes(biomeCustomRegistry, engine);
+ }
+
+ private static List> getAllBiomes(Registry customRegistry, Registry registry, Engine engine) {
+ List> b = new ArrayList<>();
+
+ for (IrisBiome i : engine.getAllBiomes()) {
+ if (i.isCustom()) {
+ for (IrisBiomeCustom j : i.getCustomDerivitives()) {
+ b.add(customRegistry.getHolder(customRegistry.getResourceKey(customRegistry
+ .get(new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()))).get()).get());
+ }
+ } else {
+ b.add(CraftBlock.biomeToBiomeBase(registry, i.getVanillaDerivative()));
+ }
+ }
+
+ return b;
+ }
+
+ private static Object getFor(Class> type, Object source) {
+ Object o = fieldFor(type, source);
+
+ if (o != null) {
+ return o;
+ }
+
+ return invokeFor(type, source);
+ }
+
+ private static Object fieldFor(Class> returns, Object in) {
+ return fieldForClass(returns, in.getClass(), in);
+ }
+
+ private static Object invokeFor(Class> returns, Object in) {
+ for (Method i : in.getClass().getMethods()) {
+ if (i.getReturnType().equals(returns)) {
+ i.setAccessible(true);
+ try {
+ Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()");
+ return i.invoke(in);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ private static T fieldForClass(Class returnType, Class> sourceType, Object in) {
+ for (Field i : sourceType.getDeclaredFields()) {
+ if (i.getType().equals(returnType)) {
+ i.setAccessible(true);
+ try {
+ Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName());
+ return (T) i.get(in);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return null;
+ }
+
+ private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) {
+ KMap> m = new KMap<>();
+
+ for (IrisBiome i : engine.getAllBiomes()) {
+ if (i.isCustom()) {
+ for (IrisBiomeCustom j : i.getCustomDerivitives()) {
+ m.put(j.getId(), customRegistry.getHolder(customRegistry.getResourceKey(customRegistry
+ .get(new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()))).get()).get());
+ }
+ }
+ }
+
+ return m;
+ }
+
+ private RegistryAccess registry() {
+ return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer()));
+ }
+
+ @Override
+ protected Codec extends BiomeSource> codec() {
+ throw new UnsupportedOperationException("Not supported");
+ }
+
+ @Override
+ public Holder getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) {
+ int m = (y - engine.getMinHeight()) << 2;
+ IrisBiome ib = engine.getComplex().getTrueBiomeStream().get(x << 2, z << 2);
+ if (ib.isCustom()) {
+ return customBiomes.get(ib.getCustomBiome(rng, x << 2, m, z << 2).getId());
+ } else {
+ org.bukkit.block.Biome v = ib.getSkyBiome(rng, x << 2, m, z << 2);
+ return CraftBlock.biomeToBiomeBase(biomeRegistry, v);
+ }
+ }
+}
\ No newline at end of file
diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java
new file mode 100644
index 000000000..eec445bee
--- /dev/null
+++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java
@@ -0,0 +1,502 @@
+package com.volmit.iris.core.nms.v1_19_R1;
+
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.volmit.iris.Iris;
+import com.volmit.iris.core.nms.INMSBinding;
+import com.volmit.iris.engine.data.cache.AtomicCache;
+import com.volmit.iris.engine.framework.Engine;
+import com.volmit.iris.util.collection.KList;
+import com.volmit.iris.util.collection.KMap;
+import com.volmit.iris.util.hunk.Hunk;
+import com.volmit.iris.util.json.JSONObject;
+import com.volmit.iris.util.mantle.Mantle;
+import com.volmit.iris.util.matter.MatterBiomeInject;
+import com.volmit.iris.util.nbt.io.NBTUtil;
+import com.volmit.iris.util.nbt.mca.NBTWorld;
+import com.volmit.iris.util.nbt.mca.palette.*;
+import com.volmit.iris.util.nbt.tag.CompoundTag;
+import it.unimi.dsi.fastutil.objects.Object2IntMap;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Holder;
+import net.minecraft.core.Registry;
+import net.minecraft.core.RegistryAccess;
+import net.minecraft.nbt.NbtIo;
+import net.minecraft.nbt.TagParser;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.world.level.biome.BiomeSource;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.chunk.ChunkAccess;
+import net.minecraft.world.level.chunk.LevelChunk;
+import org.bukkit.*;
+import org.bukkit.block.Biome;
+import org.bukkit.block.data.BlockData;
+
+import org.bukkit.craftbukkit.v1_19_R1.CraftChunk;
+import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock;
+import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData;
+import org.bukkit.craftbukkit.v1_19_R1.entity.CraftDolphin;
+import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Dolphin;
+import org.bukkit.entity.Entity;
+import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import sun.misc.Unsafe;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class NMSBinding implements INMSBinding {
+ private final KMap baseBiomeCache = new KMap<>();
+ private final BlockData AIR = Material.AIR.createBlockData();
+ private final AtomicCache> biomeMapCache = new AtomicCache<>();
+ private final AtomicCache> registryCache = new AtomicCache<>();
+ private final AtomicCache> globalCache = new AtomicCache<>();
+ private final AtomicCache registryAccess = new AtomicCache<>();
+ private final AtomicCache byIdRef = new AtomicCache<>();
+ private Field biomeStorageCache = null;
+
+ private static Object getFor(Class> type, Object source) {
+ Object o = fieldFor(type, source);
+
+ if (o != null) {
+ return o;
+ }
+
+ return invokeFor(type, source);
+ }
+
+ private static Object invokeFor(Class> returns, Object in) {
+ for (Method i : in.getClass().getMethods()) {
+ if (i.getReturnType().equals(returns)) {
+ i.setAccessible(true);
+ try {
+ Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()");
+ return i.invoke(in);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private static Object fieldFor(Class> returns, Object in) {
+ return fieldForClass(returns, in.getClass(), in);
+ }
+
+ @SuppressWarnings("unchecked")
+ private static T fieldForClass(Class returnType, Class> sourceType, Object in) {
+ for (Field i : sourceType.getDeclaredFields()) {
+ if (i.getType().equals(returnType)) {
+ i.setAccessible(true);
+ try {
+ Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName());
+ return (T) i.get(in);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return null;
+ }
+
+ private static Class> getClassType(Class> type, int ordinal) {
+ return type.getDeclaredClasses()[ordinal];
+ }
+
+ @Override
+ public boolean hasTile(Location l) {
+ return ((CraftWorld) l.getWorld()).getHandle().getBlockEntity(new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()), false) != null;
+ }
+
+ @Override
+ public CompoundTag serializeTile(Location location) {
+ BlockEntity e = ((CraftWorld) location.getWorld()).getHandle().getBlockEntity(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), true);
+
+ if (e == null) {
+ return null;
+ }
+
+ net.minecraft.nbt.CompoundTag tag = e.saveWithFullMetadata();
+ return convert(tag);
+ }
+
+ private CompoundTag convert(net.minecraft.nbt.CompoundTag tag) {
+ try {
+ ByteArrayOutputStream boas = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(boas);
+ tag.write(dos);
+ dos.close();
+ return (CompoundTag) NBTUtil.read(new ByteArrayInputStream(boas.toByteArray()), false).getTag();
+ } catch (Throwable ex) {
+ ex.printStackTrace();
+ }
+
+ return null;
+ }
+
+ private net.minecraft.nbt.CompoundTag convert(CompoundTag tag) {
+ try {
+ ByteArrayOutputStream boas = new ByteArrayOutputStream();
+ NBTUtil.write(tag, boas, false);
+ DataInputStream din = new DataInputStream(new ByteArrayInputStream(boas.toByteArray()));
+ net.minecraft.nbt.CompoundTag c = NbtIo.read(din);
+ din.close();
+ return c;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ @Override
+ public void deserializeTile(CompoundTag c, Location pos) {
+ ((CraftWorld) pos.getWorld()).getHandle().getChunkAt(new BlockPos(pos.getBlockX(), 0, pos.getBlockZ())).setBlockEntityNbt(convert(c));
+ }
+
+ @Override
+ public CompoundTag serializeEntity(Entity location) {
+ return null;// TODO:
+ }
+
+ @Override
+ public Entity deserializeEntity(CompoundTag s, Location newPosition) {
+ return null;// TODO:
+ }
+
+ @Override
+ public boolean supportsCustomHeight() {
+ return true;
+ }
+
+ private RegistryAccess registry() {
+ return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer()));
+ }
+
+ private Registry getCustomBiomeRegistry() {
+ return registry().registry(Registry.BIOME_REGISTRY).orElse(null);
+ }
+
+ private Registry getBlockRegistry() {
+ return registry().registry(Registry.BLOCK_REGISTRY).orElse(null);
+ }
+
+ @Override
+ public Object getBiomeBaseFromId(int id) {
+ return getCustomBiomeRegistry().getHolder(id);
+ }
+
+ @Override
+ public int getMinHeight(World world) {
+ return world.getMinHeight();
+ }
+
+ @Override
+ public boolean supportsCustomBiomes() {
+ return true;
+ }
+
+ @Override
+ public int getTrueBiomeBaseId(Object biomeBase) {
+ return getCustomBiomeRegistry().getId(((Holder) biomeBase).value());
+ }
+
+ @Override
+ public Object getTrueBiomeBase(Location location) {
+ return ((CraftWorld) location.getWorld()).getHandle().getBiome(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()));
+ }
+
+ @Override
+ public String getTrueBiomeBaseKey(Location location) {
+ return getKeyForBiomeBase(getTrueBiomeBase(location));
+ }
+
+ @Override
+ public Object getCustomBiomeBaseFor(String mckey) {
+ return getCustomBiomeRegistry().get(new ResourceLocation(mckey));
+ }
+
+ @Override
+ public Object getCustomBiomeBaseHolderFor(String mckey) {
+ return getCustomBiomeRegistry().getHolder(getTrueBiomeBaseId(getCustomBiomeRegistry().get(new ResourceLocation(mckey)))).get();
+ }
+
+ public int getBiomeBaseIdForKey(String key) {
+ return getCustomBiomeRegistry().getId(getCustomBiomeRegistry().get(new ResourceLocation(key)));
+ }
+
+ @Override
+ public String getKeyForBiomeBase(Object biomeBase) {
+ return getCustomBiomeRegistry().getKey((net.minecraft.world.level.biome.Biome) biomeBase).getPath(); // something, not something:something
+ }
+
+ @Override
+ public Object getBiomeBase(World world, Biome biome) {
+ return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle()
+ .registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null), biome);
+ }
+
+ @Override
+ public Object getBiomeBase(Object registry, Biome biome) {
+ Object v = baseBiomeCache.get(biome);
+
+ if (v != null) {
+ return v;
+ }
+ //noinspection unchecked
+ v = CraftBlock.biomeToBiomeBase((Registry) registry, biome);
+ if (v == null) {
+ // Ok so there is this new biome name called "CUSTOM" in Paper's new releases.
+ // But, this does NOT exist within CraftBukkit which makes it return an error.
+ // So, we will just return the ID that the plains biome returns instead.
+ //noinspection unchecked
+ return CraftBlock.biomeToBiomeBase((Registry) registry, Biome.PLAINS);
+ }
+ baseBiomeCache.put(biome, v);
+ return v;
+ }
+
+ @Override
+ public KList getBiomes() {
+ return new KList<>(Biome.values()).qdel(Biome.CUSTOM);
+ }
+
+ @Override
+ public boolean isBukkit() {
+ return true;
+ }
+
+ @Override
+ public int getBiomeId(Biome biome) {
+ for (World i : Bukkit.getWorlds()) {
+ if (i.getEnvironment().equals(World.Environment.NORMAL)) {
+ Registry registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null);
+ return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome));
+ }
+ }
+
+ return biome.ordinal();
+ }
+
+ private MCAIdMap getBiomeMapping() {
+ return biomeMapCache.aquire(() -> new MCAIdMap<>() {
+ @NotNull
+ @Override
+ public Iterator iterator() {
+ return getCustomBiomeRegistry().iterator();
+ }
+
+ @Override
+ public int getId(net.minecraft.world.level.biome.Biome paramT) {
+ return getCustomBiomeRegistry().getId(paramT);
+ }
+
+ @Override
+ public net.minecraft.world.level.biome.Biome byId(int paramInt) {
+ return (net.minecraft.world.level.biome.Biome) getBiomeBaseFromId(paramInt);
+ }
+ });
+ }
+
+ @NotNull
+ private MCABiomeContainer getBiomeContainerInterface(MCAIdMap biomeMapping, MCAChunkBiomeContainer base) {
+ return new MCABiomeContainer() {
+ @Override
+ public int[] getData() {
+ return base.writeBiomes();
+ }
+
+ @Override
+ public void setBiome(int x, int y, int z, int id) {
+ base.setBiome(x, y, z, biomeMapping.byId(id));
+ }
+
+ @Override
+ public int getBiome(int x, int y, int z) {
+ return biomeMapping.getId(base.getBiome(x, y, z));
+ }
+ };
+ }
+
+ @Override
+ public MCABiomeContainer newBiomeContainer(int min, int max) {
+ MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max);
+ return getBiomeContainerInterface(getBiomeMapping(), base);
+ }
+
+ @Override
+ public MCABiomeContainer newBiomeContainer(int min, int max, int[] data) {
+ MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max, data);
+ return getBiomeContainerInterface(getBiomeMapping(), base);
+ }
+
+ @Override
+ public int countCustomBiomes() {
+ AtomicInteger a = new AtomicInteger(0);
+
+ getCustomBiomeRegistry().keySet().forEach((i) -> {
+ if (i.getNamespace().equals("minecraft")) {
+ return;
+ }
+
+ a.incrementAndGet();
+ Iris.debug("Custom Biome: " + i);
+ });
+
+ return a.get();
+ }
+
+ public boolean supportsDataPacks() {
+ return true;
+ }
+
+ public void setBiomes(int cx, int cz, World world, Hunk