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 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 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 biomes) { + LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); + biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); + c.setUnsaved(true); + } + + @Override + public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { + try { + ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); + Holder biome = (Holder) somethingVeryDirty; + s.setBiome(x, y, z, biome); + } catch (IllegalAccessException e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + + private Field getFieldForBiomeStorage(Object storage) { + Field f = biomeStorageCache; + + if (f != null) { + return f; + } + try { + f = storage.getClass().getDeclaredField("biome"); + f.setAccessible(true); + return f; + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + Iris.error(storage.getClass().getCanonicalName()); + } + + biomeStorageCache = f; + return null; + } + + @Override + public MCAPaletteAccess createPalette() { + MCAIdMapper registry = registryCache.aquireNasty(() -> { + Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); + Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); + Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); + cf.setAccessible(true); + df.setAccessible(true); + bf.setAccessible(true); + net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; + int b = bf.getInt(blockData); + Object2IntMap c = (Object2IntMap) cf.get(blockData); + List d = (List) df.get(blockData); + return new MCAIdMapper(c, d, b); + }); + MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); + MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + ((CraftBlockData) AIR).getState()); + return new MCAWrappedPalettedContainer<>(container, + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); + } + + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + ChunkAccess chunk = ((CraftChunk) e).getHandle(); + AtomicInteger c = new AtomicInteger(); + AtomicInteger r = new AtomicInteger(); + mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { + if (b != null) { + if (b.isCustom()) { + chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); + c.getAndIncrement(); + } else { + chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); + r.getAndIncrement(); + } + } + }); + } + + public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { + if (customNbt != null && !customNbt.isEmpty()) { + net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); + + try { + net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); + tag.merge(s.getOrCreateTag()); + s.setTag(tag); + } catch (CommandSyntaxException var5) { + throw new IllegalArgumentException(var5); + } + + return CraftItemStack.asBukkitCopy(s); + } else { + return itemStack; + } + } + + public void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos) { + CraftDolphin cd = (CraftDolphin)dolphin; + cd.getHandle().setTreasurePos(new BlockPos(pos.getX(), pos.getY(), pos.getZ())); + cd.getHandle().setGotFish(true); + } + + public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException { + ServerLevel serverLevel = ((CraftWorld)world).getHandle(); + Class clazz = serverLevel.getChunkSource().chunkMap.generator.getClass(); + Field biomeSource = getField(clazz, BiomeSource.class); + biomeSource.setAccessible(true); + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe)unsafeField.get(null); + CustomBiomeSource customBiomeSource = new CustomBiomeSource(seed, engine, world); + unsafe.putObject(biomeSource.get(serverLevel.getChunkSource().chunkMap.generator), unsafe.objectFieldOffset(biomeSource), customBiomeSource); + biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); + } + + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { + try { + for (Field f : clazz.getDeclaredFields()) { + if (f.getType().equals(fieldType)) + return f; + } + throw new NoSuchFieldException(fieldType.getName()); + } catch (NoSuchFieldException var4) { + Class superClass = clazz.getSuperclass(); + if (superClass == null) { + throw var4; + } else { + return getField(superClass, fieldType); + } + } + } +} diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/CustomBiomeSource.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/CustomBiomeSource.java new file mode 100644 index 000000000..7a82acf42 --- /dev/null +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/CustomBiomeSource.java @@ -0,0 +1,152 @@ +package com.volmit.iris.core.nms.v1_19_R2; + +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.core.registries.Registries; +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_R2.CraftServer; +import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R2.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(Registries.BIOME).orElse(null), + ((CraftWorld) world).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), + engine)); + this.engine = engine; + this.seed = seed; + this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); + this.biomeRegistry = ((CraftWorld) world).getHandle().registryAccess().registry(Registries.BIOME).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 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_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java new file mode 100644 index 000000000..bcdda2dea --- /dev/null +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java @@ -0,0 +1,502 @@ +package com.volmit.iris.core.nms.v1_19_R2; + +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.core.registries.Registries; +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_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R2.CraftServer; +import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R2.block.CraftBlock; +import org.bukkit.craftbukkit.v1_19_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_19_R2.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_19_R2.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(Registries.BIOME).orElse(null); + } + + private Registry getBlockRegistry() { + return registry().registry(Registries.BLOCK).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(Registries.BIOME).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(Registries.BIOME).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 biomes) { + LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); + biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); + c.setUnsaved(true); + } + + @Override + public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { + try { + ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); + Holder biome = (Holder) somethingVeryDirty; + s.setBiome(x, y, z, biome); + } catch (IllegalAccessException e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + + private Field getFieldForBiomeStorage(Object storage) { + Field f = biomeStorageCache; + + if (f != null) { + return f; + } + try { + f = storage.getClass().getDeclaredField("biome"); + f.setAccessible(true); + return f; + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + Iris.error(storage.getClass().getCanonicalName()); + } + + biomeStorageCache = f; + return null; + } + + @Override + public MCAPaletteAccess createPalette() { + MCAIdMapper registry = registryCache.aquireNasty(() -> { + Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); + Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); + Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); + cf.setAccessible(true); + df.setAccessible(true); + bf.setAccessible(true); + net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; + int b = bf.getInt(blockData); + Object2IntMap c = (Object2IntMap) cf.get(blockData); + List d = (List) df.get(blockData); + return new MCAIdMapper(c, d, b); + }); + MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); + MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + ((CraftBlockData) AIR).getState()); + return new MCAWrappedPalettedContainer<>(container, + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); + } + + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + ChunkAccess chunk = ((CraftChunk) e).getHandle(); + AtomicInteger c = new AtomicInteger(); + AtomicInteger r = new AtomicInteger(); + mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { + if (b != null) { + if (b.isCustom()) { + chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); + c.getAndIncrement(); + } else { + chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); + r.getAndIncrement(); + } + } + }); + } + + public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { + if (customNbt != null && !customNbt.isEmpty()) { + net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); + + try { + net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); + tag.merge(s.getOrCreateTag()); + s.setTag(tag); + } catch (CommandSyntaxException var5) { + throw new IllegalArgumentException(var5); + } + + return CraftItemStack.asBukkitCopy(s); + } else { + return itemStack; + } + } + + public void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos) { + CraftDolphin cd = (CraftDolphin)dolphin; + cd.getHandle().setTreasurePos(new BlockPos(pos.getX(), pos.getY(), pos.getZ())); + cd.getHandle().setGotFish(true); + } + + public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException { + ServerLevel serverLevel = ((CraftWorld)world).getHandle(); + Class clazz = serverLevel.getChunkSource().chunkMap.generator.getClass(); + Field biomeSource = getField(clazz, BiomeSource.class); + biomeSource.setAccessible(true); + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe)unsafeField.get(null); + CustomBiomeSource customBiomeSource = new CustomBiomeSource(seed, engine, world); + unsafe.putObject(biomeSource.get(serverLevel.getChunkSource().chunkMap.generator), unsafe.objectFieldOffset(biomeSource), customBiomeSource); + biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); + } + + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { + try { + for (Field f : clazz.getDeclaredFields()) { + if (f.getType().equals(fieldType)) + return f; + } + throw new NoSuchFieldException(fieldType.getName()); + } catch (NoSuchFieldException var4) { + Class superClass = clazz.getSuperclass(); + if (superClass == null) { + throw var4; + } else { + return getField(superClass, fieldType); + } + } + } +} diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/CustomBiomeSource.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/CustomBiomeSource.java new file mode 100644 index 000000000..f3debbaad --- /dev/null +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/CustomBiomeSource.java @@ -0,0 +1,169 @@ +package com.volmit.iris.core.nms.v1_19_R3; + +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.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +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_R3.CraftServer; +import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +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) { + this.engine = engine; + this.seed = seed; + this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); + this.biomeRegistry = ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())).registry(Registries.BIOME).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; + } + + @Override + protected Stream> collectPossibleBiomes() { + return getAllBiomes( + ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) + .registry(Registries.BIOME).orElse(null), + ((CraftWorld) engine.getWorld().realWorld()).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), + engine).stream(); + } + private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { + KMap> m = new KMap<>(); + + for (IrisBiome i : engine.getAllBiomes()) { + if (i.isCustom()) { + for (IrisBiomeCustom j : i.getCustomDerivitives()) { + ResourceLocation resourceLocation = new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()); + Biome biome = customRegistry.get(resourceLocation); + Optional> optionalBiomeKey = customRegistry.getResourceKey(biome); + if (optionalBiomeKey.isEmpty()) { + Iris.error("Cannot find biome for IrisBiomeCustom " + j.getId() + " from engine " + engine.getName()); + continue; + } + ResourceKey biomeKey = optionalBiomeKey.get(); + Optional> optionalReferenceHolder = customRegistry.getHolder(biomeKey); + if (optionalReferenceHolder.isEmpty()) { + Iris.error("Cannot find reference to biome " + biomeKey + " for engine " + engine.getName()); + continue; + } + m.put(j.getId(), optionalReferenceHolder.get()); + } + } + } + + return m; + } + + private RegistryAccess registry() { + return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); + } + + @Override + protected Codec 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_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java new file mode 100644 index 000000000..f11974faf --- /dev/null +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java @@ -0,0 +1,505 @@ +package com.volmit.iris.core.nms.v1_19_R3; + +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.core.registries.Registries; +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.ChunkStatus; +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_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R3.CraftServer; +import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_19_R3.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(Registries.BIOME).orElse(null); + } + + private Registry getBlockRegistry() { + return registry().registry(Registries.BLOCK).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(Registries.BIOME).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()).qadd(Biome.CHERRY_GROVE).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(Registries.BIOME).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 biomes) { + LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); + biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); + c.setUnsaved(true); + } + + @Override + public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { + try { + ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); + Holder biome = (Holder) somethingVeryDirty; + s.setBiome(x, y, z, biome); + } catch (IllegalAccessException e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + + private Field getFieldForBiomeStorage(Object storage) { + Field f = biomeStorageCache; + + if (f != null) { + return f; + } + try { + f = storage.getClass().getDeclaredField("biome"); + f.setAccessible(true); + return f; + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + Iris.error(storage.getClass().getCanonicalName()); + } + + biomeStorageCache = f; + return null; + } + + @Override + public MCAPaletteAccess createPalette() { + MCAIdMapper registry = registryCache.aquireNasty(() -> { + Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); + Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); + Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); + cf.setAccessible(true); + df.setAccessible(true); + bf.setAccessible(true); + net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; + int b = bf.getInt(blockData); + Object2IntMap c = (Object2IntMap) cf.get(blockData); + List d = (List) df.get(blockData); + return new MCAIdMapper(c, d, b); + }); + MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); + MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + ((CraftBlockData) AIR).getState()); + return new MCAWrappedPalettedContainer<>(container, + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); + } + + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + ChunkAccess chunk = ((CraftChunk) e).getHandle(ChunkStatus.FULL); + AtomicInteger c = new AtomicInteger(); + AtomicInteger r = new AtomicInteger(); + mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { + if (b != null) { + if (b.isCustom()) { + chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); + c.getAndIncrement(); + } else { + chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); + r.getAndIncrement(); + } + } + }); + } + + public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { + if (customNbt != null && !customNbt.isEmpty()) { + net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); + + try { + net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); + tag.merge(s.getOrCreateTag()); + s.setTag(tag); + } catch (CommandSyntaxException var5) { + throw new IllegalArgumentException(var5); + } + + return CraftItemStack.asBukkitCopy(s); + } else { + return itemStack; + } + } + + public void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos) { + CraftDolphin cd = (CraftDolphin)dolphin; + cd.getHandle().setTreasurePos(new BlockPos(pos.getX(), pos.getY(), pos.getZ())); + cd.getHandle().setGotFish(true); + } + + public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException { + ServerLevel serverLevel = ((CraftWorld)world).getHandle(); + Class clazz = serverLevel.getChunkSource().chunkMap.generator.getClass(); + Field biomeSource = getField(clazz, BiomeSource.class); + biomeSource.setAccessible(true); + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe)unsafeField.get(null); + CustomBiomeSource customBiomeSource = new CustomBiomeSource(seed, engine, world); + unsafe.putObject(biomeSource.get(serverLevel.getChunkSource().chunkMap.generator), unsafe.objectFieldOffset(biomeSource), customBiomeSource); + biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); + } + + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { + try { + for (Field f : clazz.getDeclaredFields()) { + if (f.getType().equals(fieldType)) + return f; + } + throw new NoSuchFieldException(fieldType.getName()); + } catch (NoSuchFieldException var4) { + Class superClass = clazz.getSuperclass(); + if (superClass == null) { + throw var4; + } else { + return getField(superClass, fieldType); + } + } + } +} diff --git a/src/main/java/com/volmit/iris/core/nms/v20/CustomBiomeSource.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/CustomBiomeSource.java similarity index 97% rename from src/main/java/com/volmit/iris/core/nms/v20/CustomBiomeSource.java rename to nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/CustomBiomeSource.java index 3a22557e6..41f4170c8 100644 --- a/src/main/java/com/volmit/iris/core/nms/v20/CustomBiomeSource.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/CustomBiomeSource.java @@ -1,169 +1,169 @@ -package com.volmit.iris.core.nms.v20; - -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.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -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_20_R1.CraftServer; -import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -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) { - this.engine = engine; - this.seed = seed; - this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); - this.biomeRegistry = ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())).registry(Registries.BIOME).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; - } - - @Override - protected Stream> collectPossibleBiomes() { - return getAllBiomes( - ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) - .registry(Registries.BIOME).orElse(null), - ((CraftWorld) engine.getWorld().realWorld()).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), - engine).stream(); - } - private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { - KMap> m = new KMap<>(); - - for (IrisBiome i : engine.getAllBiomes()) { - if (i.isCustom()) { - for (IrisBiomeCustom j : i.getCustomDerivitives()) { - ResourceLocation resourceLocation = new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()); - Biome biome = customRegistry.get(resourceLocation); - Optional> optionalBiomeKey = customRegistry.getResourceKey(biome); - if (optionalBiomeKey.isEmpty()) { - Iris.error("Cannot find biome for IrisBiomeCustom " + j.getId() + " from engine " + engine.getName()); - continue; - } - ResourceKey biomeKey = optionalBiomeKey.get(); - Optional> optionalReferenceHolder = customRegistry.getHolder(biomeKey); - if (optionalReferenceHolder.isEmpty()) { - Iris.error("Cannot find reference to biome " + biomeKey + " for engine " + engine.getName()); - continue; - } - m.put(j.getId(), optionalReferenceHolder.get()); - } - } - } - - return m; - } - - private RegistryAccess registry() { - return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); - } - - @Override - protected Codec 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); - } - } +package com.volmit.iris.core.nms.v1_20_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.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +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_20_R1.CraftServer; +import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +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) { + this.engine = engine; + this.seed = seed; + this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); + this.biomeRegistry = ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())).registry(Registries.BIOME).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; + } + + @Override + protected Stream> collectPossibleBiomes() { + return getAllBiomes( + ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) + .registry(Registries.BIOME).orElse(null), + ((CraftWorld) engine.getWorld().realWorld()).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), + engine).stream(); + } + private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { + KMap> m = new KMap<>(); + + for (IrisBiome i : engine.getAllBiomes()) { + if (i.isCustom()) { + for (IrisBiomeCustom j : i.getCustomDerivitives()) { + ResourceLocation resourceLocation = new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()); + Biome biome = customRegistry.get(resourceLocation); + Optional> optionalBiomeKey = customRegistry.getResourceKey(biome); + if (optionalBiomeKey.isEmpty()) { + Iris.error("Cannot find biome for IrisBiomeCustom " + j.getId() + " from engine " + engine.getName()); + continue; + } + ResourceKey biomeKey = optionalBiomeKey.get(); + Optional> optionalReferenceHolder = customRegistry.getHolder(biomeKey); + if (optionalReferenceHolder.isEmpty()) { + Iris.error("Cannot find reference to biome " + biomeKey + " for engine " + engine.getName()); + continue; + } + m.put(j.getId(), optionalReferenceHolder.get()); + } + } + } + + return m; + } + + private RegistryAccess registry() { + return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); + } + + @Override + protected Codec 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/src/main/java/com/volmit/iris/core/nms/v20/NMSBinding1_20_1.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java similarity index 83% rename from src/main/java/com/volmit/iris/core/nms/v20/NMSBinding1_20_1.java rename to nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java index 71f17640b..02169ff3f 100644 --- a/src/main/java/com/volmit/iris/core/nms/v20/NMSBinding1_20_1.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java @@ -1,454 +1,506 @@ -/* - * 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.v20; - - -import com.volmit.iris.Iris; -import com.volmit.iris.core.nms.INMSBinding; -import com.volmit.iris.engine.data.cache.AtomicCache; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.hunk.Hunk; -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.core.registries.Registries; -import net.minecraft.nbt.NbtIo; -import net.minecraft.resources.ResourceLocation; -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.ChunkStatus; -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_20_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R1.CraftServer; -import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock; -import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; -import org.bukkit.entity.Entity; -import org.bukkit.generator.ChunkGenerator; -import org.jetbrains.annotations.NotNull; - -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 NMSBinding1_20_1 implements INMSBinding { - - public static final String NMS_VERSION = "1.20.1"; - 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(Registries.BIOME).orElse(null); - } - - private Registry getBlockRegistry() { - return registry().registry(Registries.BLOCK).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(Registries.BIOME).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 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(Registries.BIOME).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 biomes) { - LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); - biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); - c.setUnsaved(true); - } - - @Override - public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { - try { - ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); - Holder biome = (Holder) somethingVeryDirty; - s.setBiome(x, y, z, biome); - } catch (IllegalAccessException e) { - Iris.reportError(e); - e.printStackTrace(); - } - } - - private Field getFieldForBiomeStorage(Object storage) { - Field f = biomeStorageCache; - - if (f != null) { - return f; - } - try { - f = storage.getClass().getDeclaredField("biome"); - f.setAccessible(true); - return f; - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - Iris.error(storage.getClass().getCanonicalName()); - } - - biomeStorageCache = f; - return null; - } - - @Override - public MCAPaletteAccess createPalette() { - MCAIdMapper registry = registryCache.aquireNasty(() -> { - Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); - Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); - Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); - cf.setAccessible(true); - df.setAccessible(true); - bf.setAccessible(true); - net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; - int b = bf.getInt(blockData); - Object2IntMap c = (Object2IntMap) cf.get(blockData); - List d = (List) df.get(blockData); - return new MCAIdMapper(c, d, b); - }); - MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); - MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - ((CraftBlockData) AIR).getState()); - return new MCAWrappedPalettedContainer<>(container, - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); - } - - @Override - public void injectBiomesFromMantle(Chunk e, Mantle mantle) { - ChunkAccess chunk = ((CraftChunk) e).getHandle(ChunkStatus.FULL); - AtomicInteger c = new AtomicInteger(); - AtomicInteger r = new AtomicInteger(); - mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { - if (b != null) { - if (b.isCustom()) { - chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); - c.getAndIncrement(); - } else { - chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); - r.getAndIncrement(); - } - } - }); - } -} +package com.volmit.iris.core.nms.v1_20_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.core.registries.Registries; +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.ChunkStatus; +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_20_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R1.CraftServer; +import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R1.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_20_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 { + + public static final String NMS_VERSION = "1.20.1"; + 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(Registries.BIOME).orElse(null); + } + + private Registry getBlockRegistry() { + return registry().registry(Registries.BLOCK).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(Registries.BIOME).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()).qadd(Biome.CHERRY_GROVE).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(Registries.BIOME).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 biomes) { + LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); + biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); + c.setUnsaved(true); + } + + @Override + public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { + try { + ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); + Holder biome = (Holder) somethingVeryDirty; + s.setBiome(x, y, z, biome); + } catch (IllegalAccessException e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + + private Field getFieldForBiomeStorage(Object storage) { + Field f = biomeStorageCache; + + if (f != null) { + return f; + } + try { + f = storage.getClass().getDeclaredField("biome"); + f.setAccessible(true); + return f; + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + Iris.error(storage.getClass().getCanonicalName()); + } + + biomeStorageCache = f; + return null; + } + + @Override + public MCAPaletteAccess createPalette() { + MCAIdMapper registry = registryCache.aquireNasty(() -> { + Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); + Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); + Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); + cf.setAccessible(true); + df.setAccessible(true); + bf.setAccessible(true); + net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; + int b = bf.getInt(blockData); + Object2IntMap c = (Object2IntMap) cf.get(blockData); + List d = (List) df.get(blockData); + return new MCAIdMapper(c, d, b); + }); + MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); + MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + ((CraftBlockData) AIR).getState()); + return new MCAWrappedPalettedContainer<>(container, + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); + } + + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + ChunkAccess chunk = ((CraftChunk) e).getHandle(ChunkStatus.FULL); + AtomicInteger c = new AtomicInteger(); + AtomicInteger r = new AtomicInteger(); + mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { + if (b != null) { + if (b.isCustom()) { + chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); + c.getAndIncrement(); + } else { + chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); + r.getAndIncrement(); + } + } + }); + } + + public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { + if (customNbt != null && !customNbt.isEmpty()) { + net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); + + try { + net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); + tag.merge(s.getOrCreateTag()); + s.setTag(tag); + } catch (CommandSyntaxException var5) { + throw new IllegalArgumentException(var5); + } + + return CraftItemStack.asBukkitCopy(s); + } else { + return itemStack; + } + } + + public void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos) { + CraftDolphin cd = (CraftDolphin)dolphin; + cd.getHandle().setTreasurePos(new BlockPos(pos.getX(), pos.getY(), pos.getZ())); + cd.getHandle().setGotFish(true); + } + + public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException { + ServerLevel serverLevel = ((CraftWorld)world).getHandle(); + Class clazz = serverLevel.getChunkSource().chunkMap.generator.getClass(); + Field biomeSource = getField(clazz, BiomeSource.class); + biomeSource.setAccessible(true); + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe)unsafeField.get(null); + CustomBiomeSource customBiomeSource = new CustomBiomeSource(seed, engine, world); + unsafe.putObject(biomeSource.get(serverLevel.getChunkSource().chunkMap.generator), unsafe.objectFieldOffset(biomeSource), customBiomeSource); + biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); + } + + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { + try { + for (Field f : clazz.getDeclaredFields()) { + if (f.getType().equals(fieldType)) + return f; + } + throw new NoSuchFieldException(fieldType.getName()); + } catch (NoSuchFieldException var4) { + Class superClass = clazz.getSuperclass(); + if (superClass == null) { + throw var4; + } else { + return getField(superClass, fieldType); + } + } + } +} diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/CustomBiomeSource.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/CustomBiomeSource.java new file mode 100644 index 000000000..fcf462f95 --- /dev/null +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/CustomBiomeSource.java @@ -0,0 +1,168 @@ +package com.volmit.iris.core.nms.v1_20_R2; + +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.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +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_20_R2.CraftServer; +import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +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) { + this.engine = engine; + this.seed = seed; + this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); + this.biomeRegistry = ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())).registry(Registries.BIOME).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(NMSBinding.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; + } + + @Override + protected Stream> collectPossibleBiomes() { + return getAllBiomes( + ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) + .registry(Registries.BIOME).orElse(null), + ((CraftWorld) engine.getWorld().realWorld()).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), + engine).stream(); + } + private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { + KMap> m = new KMap<>(); + + for (IrisBiome i : engine.getAllBiomes()) { + if (i.isCustom()) { + for (IrisBiomeCustom j : i.getCustomDerivitives()) { + ResourceLocation resourceLocation = new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()); + Biome biome = customRegistry.get(resourceLocation); + Optional> optionalBiomeKey = customRegistry.getResourceKey(biome); + if (optionalBiomeKey.isEmpty()) { + Iris.error("Cannot find biome for IrisBiomeCustom " + j.getId() + " from engine " + engine.getName()); + continue; + } + ResourceKey biomeKey = optionalBiomeKey.get(); + Optional> optionalReferenceHolder = customRegistry.getHolder(biomeKey); + if (optionalReferenceHolder.isEmpty()) { + Iris.error("Cannot find reference to biome " + biomeKey + " for engine " + engine.getName()); + continue; + } + m.put(j.getId(), optionalReferenceHolder.get()); + } + } + } + + return m; + } + + private RegistryAccess registry() { + return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); + } + + @Override + protected Codec 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 NMSBinding.biomeToBiomeBase(biomeRegistry, v); + } + } +} \ No newline at end of file diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java new file mode 100644 index 000000000..1f02cf3ab --- /dev/null +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java @@ -0,0 +1,509 @@ +package com.volmit.iris.core.nms.v1_20_R2; + +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.core.registries.Registries; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.TagParser; +import net.minecraft.resources.ResourceKey; +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.ChunkStatus; +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_20_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R2.CraftServer; +import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R2.util.CraftNamespacedKey; +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(Registries.BIOME).orElse(null); + } + + private Registry getBlockRegistry() { + return registry().registry(Registries.BLOCK).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 biomeToBiomeBase(((CraftWorld) world).getHandle() + .registryAccess().registry(Registries.BIOME).orElse(null), biome); + } + + @Override + public Object getBiomeBase(Object registry, Biome biome) { + Object v = baseBiomeCache.get(biome); + + if (v != null) { + return v; + } + //noinspection unchecked + v = 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 biomeToBiomeBase((Registry) registry, Biome.PLAINS); + } + baseBiomeCache.put(biome, v); + return v; + } + + @Override + public KList getBiomes() { + return new KList<>(Biome.values()).qadd(Biome.CHERRY_GROVE).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(Registries.BIOME).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 biomes) { + LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); + biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); + c.setUnsaved(true); + } + + @Override + public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { + try { + ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); + Holder biome = (Holder) somethingVeryDirty; + s.setBiome(x, y, z, biome); + } catch (IllegalAccessException e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + + private Field getFieldForBiomeStorage(Object storage) { + Field f = biomeStorageCache; + + if (f != null) { + return f; + } + try { + f = storage.getClass().getDeclaredField("biome"); + f.setAccessible(true); + return f; + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + Iris.error(storage.getClass().getCanonicalName()); + } + + biomeStorageCache = f; + return null; + } + + @Override + public MCAPaletteAccess createPalette() { + MCAIdMapper registry = registryCache.aquireNasty(() -> { + Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); + Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); + Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); + cf.setAccessible(true); + df.setAccessible(true); + bf.setAccessible(true); + net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; + int b = bf.getInt(blockData); + Object2IntMap c = (Object2IntMap) cf.get(blockData); + List d = (List) df.get(blockData); + return new MCAIdMapper(c, d, b); + }); + MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); + MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + ((CraftBlockData) AIR).getState()); + return new MCAWrappedPalettedContainer<>(container, + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); + } + + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + ChunkAccess chunk = ((CraftChunk) e).getHandle(ChunkStatus.FULL); + AtomicInteger c = new AtomicInteger(); + AtomicInteger r = new AtomicInteger(); + mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { + if (b != null) { + if (b.isCustom()) { + chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); + c.getAndIncrement(); + } else { + chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); + r.getAndIncrement(); + } + } + }); + } + + public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { + if (customNbt != null && !customNbt.isEmpty()) { + net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); + + try { + net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); + tag.merge(s.getOrCreateTag()); + s.setTag(tag); + } catch (CommandSyntaxException var5) { + throw new IllegalArgumentException(var5); + } + + return CraftItemStack.asBukkitCopy(s); + } else { + return itemStack; + } + } + + public void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos) { + CraftDolphin cd = (CraftDolphin)dolphin; + cd.getHandle().setTreasurePos(new BlockPos(pos.getX(), pos.getY(), pos.getZ())); + cd.getHandle().setGotFish(true); + } + + public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException { + ServerLevel serverLevel = ((CraftWorld)world).getHandle(); + Class clazz = serverLevel.getChunkSource().chunkMap.generator.getClass(); + Field biomeSource = getField(clazz, BiomeSource.class); + biomeSource.setAccessible(true); + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe)unsafeField.get(null); + CustomBiomeSource customBiomeSource = new CustomBiomeSource(seed, engine, world); + unsafe.putObject(biomeSource.get(serverLevel.getChunkSource().chunkMap.generator), unsafe.objectFieldOffset(biomeSource), customBiomeSource); + biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); + } + + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { + try { + for (Field f : clazz.getDeclaredFields()) { + if (f.getType().equals(fieldType)) + return f; + } + throw new NoSuchFieldException(fieldType.getName()); + } catch (NoSuchFieldException var4) { + Class superClass = clazz.getSuperclass(); + if (superClass == null) { + throw var4; + } else { + return getField(superClass, fieldType); + } + } + } + + public static Holder biomeToBiomeBase(Registry registry, Biome biome) { + return registry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(biome.getKey()))); + } +} diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/CustomBiomeSource.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/CustomBiomeSource.java new file mode 100644 index 000000000..3d3582239 --- /dev/null +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/CustomBiomeSource.java @@ -0,0 +1,168 @@ +package com.volmit.iris.core.nms.v1_20_R3; + +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.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +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_20_R3.CraftServer; +import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +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) { + this.engine = engine; + this.seed = seed; + this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); + this.biomeRegistry = ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())).registry(Registries.BIOME).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(NMSBinding.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; + } + + @Override + protected Stream> collectPossibleBiomes() { + return getAllBiomes( + ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) + .registry(Registries.BIOME).orElse(null), + ((CraftWorld) engine.getWorld().realWorld()).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), + engine).stream(); + } + private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { + KMap> m = new KMap<>(); + + for (IrisBiome i : engine.getAllBiomes()) { + if (i.isCustom()) { + for (IrisBiomeCustom j : i.getCustomDerivitives()) { + ResourceLocation resourceLocation = new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()); + Biome biome = customRegistry.get(resourceLocation); + Optional> optionalBiomeKey = customRegistry.getResourceKey(biome); + if (optionalBiomeKey.isEmpty()) { + Iris.error("Cannot find biome for IrisBiomeCustom " + j.getId() + " from engine " + engine.getName()); + continue; + } + ResourceKey biomeKey = optionalBiomeKey.get(); + Optional> optionalReferenceHolder = customRegistry.getHolder(biomeKey); + if (optionalReferenceHolder.isEmpty()) { + Iris.error("Cannot find reference to biome " + biomeKey + " for engine " + engine.getName()); + continue; + } + m.put(j.getId(), optionalReferenceHolder.get()); + } + } + } + + return m; + } + + private RegistryAccess registry() { + return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); + } + + @Override + protected Codec 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 NMSBinding.biomeToBiomeBase(biomeRegistry, v); + } + } +} \ No newline at end of file diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java new file mode 100644 index 000000000..167400d19 --- /dev/null +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -0,0 +1,509 @@ +package com.volmit.iris.core.nms.v1_20_R3; + +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.core.registries.Registries; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.TagParser; +import net.minecraft.resources.ResourceKey; +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.ChunkStatus; +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_20_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R3.CraftServer; +import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; +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(Registries.BIOME).orElse(null); + } + + private Registry getBlockRegistry() { + return registry().registry(Registries.BLOCK).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 biomeToBiomeBase(((CraftWorld) world).getHandle() + .registryAccess().registry(Registries.BIOME).orElse(null), biome); + } + + @Override + public Object getBiomeBase(Object registry, Biome biome) { + Object v = baseBiomeCache.get(biome); + + if (v != null) { + return v; + } + //noinspection unchecked + v = 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 biomeToBiomeBase((Registry) registry, Biome.PLAINS); + } + baseBiomeCache.put(biome, v); + return v; + } + + @Override + public KList getBiomes() { + return new KList<>(Biome.values()).qadd(Biome.CHERRY_GROVE).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(Registries.BIOME).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 biomes) { + LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); + biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); + c.setUnsaved(true); + } + + @Override + public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { + try { + ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); + Holder biome = (Holder) somethingVeryDirty; + s.setBiome(x, y, z, biome); + } catch (IllegalAccessException e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + + private Field getFieldForBiomeStorage(Object storage) { + Field f = biomeStorageCache; + + if (f != null) { + return f; + } + try { + f = storage.getClass().getDeclaredField("biome"); + f.setAccessible(true); + return f; + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + Iris.error(storage.getClass().getCanonicalName()); + } + + biomeStorageCache = f; + return null; + } + + @Override + public MCAPaletteAccess createPalette() { + MCAIdMapper registry = registryCache.aquireNasty(() -> { + Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); + Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); + Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); + cf.setAccessible(true); + df.setAccessible(true); + bf.setAccessible(true); + net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; + int b = bf.getInt(blockData); + Object2IntMap c = (Object2IntMap) cf.get(blockData); + List d = (List) df.get(blockData); + return new MCAIdMapper(c, d, b); + }); + MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); + MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + ((CraftBlockData) AIR).getState()); + return new MCAWrappedPalettedContainer<>(container, + i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), + i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); + } + + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + ChunkAccess chunk = ((CraftChunk) e).getHandle(ChunkStatus.FULL); + AtomicInteger c = new AtomicInteger(); + AtomicInteger r = new AtomicInteger(); + mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { + if (b != null) { + if (b.isCustom()) { + chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); + c.getAndIncrement(); + } else { + chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); + r.getAndIncrement(); + } + } + }); + } + + public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { + if (customNbt != null && !customNbt.isEmpty()) { + net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); + + try { + net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); + tag.merge(s.getOrCreateTag()); + s.setTag(tag); + } catch (CommandSyntaxException var5) { + throw new IllegalArgumentException(var5); + } + + return CraftItemStack.asBukkitCopy(s); + } else { + return itemStack; + } + } + + public void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos) { + CraftDolphin cd = (CraftDolphin)dolphin; + cd.getHandle().setTreasurePos(new BlockPos(pos.getX(), pos.getY(), pos.getZ())); + cd.getHandle().setGotFish(true); + } + + public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException { + ServerLevel serverLevel = ((CraftWorld)world).getHandle(); + Class clazz = serverLevel.getChunkSource().chunkMap.generator.getClass(); + Field biomeSource = getField(clazz, BiomeSource.class); + biomeSource.setAccessible(true); + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe)unsafeField.get(null); + CustomBiomeSource customBiomeSource = new CustomBiomeSource(seed, engine, world); + unsafe.putObject(biomeSource.get(serverLevel.getChunkSource().chunkMap.generator), unsafe.objectFieldOffset(biomeSource), customBiomeSource); + biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); + } + + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { + try { + for (Field f : clazz.getDeclaredFields()) { + if (f.getType().equals(fieldType)) + return f; + } + throw new NoSuchFieldException(fieldType.getName()); + } catch (NoSuchFieldException var4) { + Class superClass = clazz.getSuperclass(); + if (superClass == null) { + throw var4; + } else { + return getField(superClass, fieldType); + } + } + } + + public static Holder biomeToBiomeBase(Registry registry, Biome biome) { + return registry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(biome.getKey()))); + } +} diff --git a/settings.gradle b/settings.gradle index b7c58eb8b..ba41bb67e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,4 +22,14 @@ pluginManagement { gradlePluginPortal() } } -rootProject.name = 'Iris' \ No newline at end of file +rootProject.name = 'Iris' + +include(':core') +include( + ':nms:v1_20_R3', + ':nms:v1_20_R2', + ':nms:v1_20_R1', + ':nms:v1_19_R3', + ':nms:v1_19_R2', + ':nms:v1_19_R1' +) \ No newline at end of file diff --git a/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/src/main/java/com/volmit/iris/core/commands/CommandIris.java deleted file mode 100644 index b41a31ab0..000000000 --- a/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ /dev/null @@ -1,342 +0,0 @@ -/* - * 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.service.StudioSVC; -import com.volmit.iris.core.tools.IrisToolbelt; -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.util.collection.KList; -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; -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.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.jobs.QueueJob; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.World; - -import java.io.File; -import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -@Decree(name = "iris", aliases = {"ir", "irs"}, description = "Basic Command") -public class CommandIris implements DecreeExecutor { - private CommandStudio studio; - private CommandPregen pregen; - private CommandSettings settings; - private CommandObject object; - private CommandJigsaw jigsaw; - private CommandWhat what; - private CommandEdit edit; - private CommandFind find; - - @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 (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 (new File(Bukkit.getWorldContainer(), name).exists()) { - sender().sendMessage(C.RED + "That folder already exists!"); - return; - } - - try { - 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); - return; - } - - sender().sendMessage(C.GREEN + "Successfully created your world!"); - } - - @Decree(description = "Remove an Iris world", aliases = {"del", "rm"}, 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"); - Bukkit.unloadWorld(world, false); - if (delete && world.getWorldFolder().delete()) { - sender().sendMessage(C.GREEN + "Successfully removed world folder"); - } else { - sender().sendMessage(C.RED + "Failed to remove world folder"); - } - } - - @Decree(description = "Print version information") - public void version() { - sender().sendMessage(C.GREEN + "Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software"); - } - - @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 = "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(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 = "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); - } -} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java deleted file mode 100644 index 065d03169..000000000 --- a/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.volmit.iris.core.pregenerator; - -import com.google.gson.Gson; -import com.volmit.iris.Iris; -import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.io.IO; -import com.volmit.iris.util.math.Position2; -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 org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.WorldUnloadEvent; - -import java.io.File; -import java.io.IOException; -import java.util.concurrent.atomic.AtomicInteger; - -public class LazyPregenerator extends Thread implements Listener { - private final LazyPregenJob job; - private final File destination; - private final int maxPosition; - private final World world; - private final long rate; - private final ChronoLatch latch; - - 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.chunksPerMinute / 60D)) * 1000D); - this.latch = new ChronoLatch(60000); - } - - 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() { - if (latch.flip()) { - save(); - Iris.info("LazyGen: " + world.getName() + " RTT: " + Form.duration((Math.pow((job.radiusBlocks / 16D), 2) / job.chunksPerMinute) * 60 * 1000, 2)); - } - - if (job.getPosition() >= maxPosition) { - if (job.isHealing()) { - int pos = (job.getHealingPosition() + 1) % maxPosition; - job.setHealingPosition(pos); - tickRegenerate(getChunk(pos)); - } else { - Iris.verbose("Completed Lazy Gen!"); - interrupt(); - } - } else { - int pos = job.getPosition() + 1; - job.setPosition(pos); - tickGenerate(getChunk(pos)); - } - } - - private void tickGenerate(Position2 chunk) { - if (PaperLib.isPaper()) { - PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true).thenAccept((i) -> Iris.verbose("Generated Async " + chunk)); - } else { - J.s(() -> world.getChunkAt(chunk.getX(), chunk.getZ())); - Iris.verbose("Generated " + chunk); - } - } - - 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 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; // 48 hours is roughly 5000 radius - @Builder.Default - private int radiusBlocks = 5000; - @Builder.Default - private int position = 0; - } -}