Merge pull request #704 from VolmitSoftware/1.18.1

1.18.1
This commit is contained in:
Dan 2022-01-12 08:40:23 -05:00 committed by GitHub
commit 6921ad49db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
467 changed files with 12587 additions and 10813 deletions

View File

@ -4,7 +4,39 @@ For 1.16 and below, see the 1.14-1.16 branch. The master branch is for the lates
# [Support](https://discord.gg/3xxPTpT) **|** [Documentation](https://docs.volmit.com/iris/) **|** [Git](https://github.com/IrisDimensions) # [Support](https://discord.gg/3xxPTpT) **|** [Documentation](https://docs.volmit.com/iris/) **|** [Git](https://github.com/IrisDimensions)
## Iris Toolbelt # Building
Building Iris is fairly simple, though you will need to setup a few things if your system has never been used for java development.
Consider supporting our development by buying Iris on spigot! We work hard to make Iris the best it can be for everyone.
### Command Line Builds
1. Install [Java JDK 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
2. Set the JDK installation path to `JAVA_HOME` as an environment variable.
* Windows
1. Start > Type `env` and press Enter
2. Advanced > Environment Variables
3. Under System Variables, click `New...`
4. Variable Name: `JAVA_HOME`
5. Variable Value: `C:\Program Files\Java\jdk-17.0.1` (verify this eixsts after installing java dont just copy the example text)
* MacOS
1. Run `/usr/libexec/java_home -V` and look for Java 17
2. Run `sudo nano ~/.zshenv`
3. Add `export JAVA_HOME=$(/usr/libexec/java_home)` as a new line
4. Use `CTRL + X`, then Press `Y`, Then `ENTER`
5. Quit & Reopen Terminal and verify with `echo $JAVA_HOME`. It should print a directory
3. If this is your first time building Iris for MC 1.18+ run `gradlew setup` inside the root Iris project folder. Otherwise skip this step. Grab a coffee, this may take up to 5 minutes depending on your cpu & internet connection.
4. Once the project is setup, run `gradlew iris`
5. The Iris jar will be placed in `Iris/build/Iris-XXX-XXX.jar` Enjoy! Consider supporting us by buying it on spigot!
### IDE Builds (for development)
* Run `gradlew setup` any time you get dependency issues with craftbukkit
* Configure ITJ Gradle to use JDK 17 (in settings, search for gradle)
* Add a build line in the build.gradle for your own build task to directly compile Iris into your plugins folder if you prefer.
* Resync the project & run your newly created task (under the development folder in gradle tasks!)
# Iris Toolbelt
Everyone needs a toolbelt. Everyone needs a toolbelt.

View File

@ -18,64 +18,30 @@
plugins { plugins {
id 'java' id 'java'
id 'io.freefair.lombok' version '5.2.1' id 'io.freefair.lombok' version '5.2.1'
id "com.github.johnrengelman.shadow" version "7.0.0" id "com.github.johnrengelman.shadow" version "7.1.2"
id "de.undercouch.download" version "4.1.2"
} }
group 'com.volmit.iris' group 'com.volmit.iris'
version '1.9.6-1.17.X' version '1.9.6-1.18.X'
def apiVersion = '1.17' def nmsVersion = "1.18.1"
def apiVersion = '1.18'
def spigotJarVersion = '1.18.1-R0.1-SNAPSHOT'
def name = getRootProject().getName() // Defined in settings.gradle def name = getRootProject().getName() // Defined in settings.gradle
def main = 'com.volmit.iris.Iris' def main = 'com.volmit.iris.Iris'
// ADD YOURSELF AS A NEW LINE IF YOU WANT YOUR OWN BUILD TASK GENERATED // ADD YOURSELF AS A NEW LINE IF YOU WANT YOUR OWN BUILD TASK GENERATED
// ======================== WINDOWS ============================= // ======================== WINDOWS =============================
registerCustomOutputTask('Cyberpwn', 'C://Users/cyberpwn/Documents/development/server/plugins', name) registerCustomOutputTask('Cyberpwn', 'C://Users/cyberpwn/Documents/development/server/plugins')
registerCustomOutputTask('Psycho', 'D://Dan/MinecraftDevelopment/server/plugins', name) registerCustomOutputTask('Psycho', 'D://Dan/MinecraftDevelopment/server/plugins')
registerCustomOutputTask('ArcaneArts', 'C://Users/arcane/Documents/development/server/plugins', name) registerCustomOutputTask('ArcaneArts', 'C://Users/arcane/Documents/development/server/plugins')
registerCustomOutputTask('Coco', 'C://Users/sjoer/Desktop/MCSM/plugins', name) registerCustomOutputTask('Coco', 'C://Users/sjoer/Desktop/MCSM/plugins')
registerCustomOutputTask('Strange', 'D://Servers/1.17 Test Server/plugins', name) registerCustomOutputTask('Strange', 'D://Servers/1.17 Test Server/plugins')
// ========================== UNIX ============================== // ========================== UNIX ==============================
registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/Documents/development/server/plugins', name) registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/Documents/development/server/plugins')
registerCustomOutputTaskUnix('PsychoLT', '/Users/brianfopiano/Desktop/REMOTES/RemoteMinecraft/plugins', name) registerCustomOutputTaskUnix('PsychoLT', '/Users/brianfopiano/Desktop/REMOTES/RemoteMinecraft/plugins')
// ============================================================== // ==============================================================
def registerCustomOutputTask(name, path, plugin) {
if (!System.properties['os.name'].toLowerCase().contains('windows'))
{
return;
}
tasks.register('build' + name, Copy) {
group('development')
outputs.upToDateWhen { false }
dependsOn ':shadowJar'
from(file('build/libs/' + plugin + '-' + version + '-all.jar'))
into(file(path))
rename { String fileName ->
fileName.replace(plugin + '-' + version + '-all.jar', plugin + ".jar")
}
}
}
def registerCustomOutputTaskUnix(name, path, plugin) {
if(System.properties['os.name'].toLowerCase().contains('windows'))
{
return;
}
tasks.register('build' + name, Copy) {
group('development')
outputs.upToDateWhen { false }
dependsOn ':shadowJar'
from(file('build/libs/' + plugin + '-' + version + '-all.jar'))
into(file(path))
rename { String fileName ->
fileName.replace(plugin + '-' + version + '-all.jar', plugin + ".jar")
}
}
}
/** /**
* Gradle is weird sometimes, we need to delete the plugin yml from the build folder to actually filter properly. * Gradle is weird sometimes, we need to delete the plugin yml from the build folder to actually filter properly.
*/ */
@ -99,8 +65,15 @@ processResources {
* Unified repo * Unified repo
*/ */
repositories { repositories {
mavenLocal{
content{
includeGroup("org.bukkit")
includeGroup("org.spigotmc")
}
}
maven { url "https://dl.cloudsmith.io/public/arcane/archive/maven/" } maven { url "https://dl.cloudsmith.io/public/arcane/archive/maven/" }
mavenCentral() mavenCentral()
mavenLocal()
} }
/** /**
@ -114,7 +87,7 @@ compileJava {
* Configure Iris for shading * Configure Iris for shading
*/ */
shadowJar { shadowJar {
minimize() //minimize()
append("plugin.yml") append("plugin.yml")
relocate 'com.dfsek.paralithic', 'com.volmit.iris.util.paralithic' relocate 'com.dfsek.paralithic', 'com.volmit.iris.util.paralithic'
relocate 'io.papermc.lib', 'com.volmit.iris.util.paper' relocate 'io.papermc.lib', 'com.volmit.iris.util.paper'
@ -147,10 +120,10 @@ dependencies {
// Provided or Classpath // Provided or Classpath
compileOnly 'org.projectlombok:lombok:1.18.22' compileOnly 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22' annotationProcessor 'org.projectlombok:lombok:1.18.22'
implementation 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT' implementation 'org.spigotmc:spigot-api:1.18.1-R0.1-SNAPSHOT'
implementation 'org.bukkit.craftbukkit:1.17.1:1.17.1'
implementation 'me.clip:placeholderapi:2.10.10' implementation 'me.clip:placeholderapi:2.10.10'
implementation 'io.th0rgal:oraxen:1.94.0' implementation 'io.th0rgal:oraxen:1.94.0'
implementation 'org.bukkit:craftbukkit:1.18.1-R0.1-SNAPSHOT:remapped-mojang'
// Shaded // Shaded
implementation 'com.dfsek:Paralithic:0.4.0' implementation 'com.dfsek:Paralithic:0.4.0'
@ -172,3 +145,175 @@ dependencies {
implementation 'com.github.ben-manes.caffeine:caffeine:3.0.5' implementation 'com.github.ben-manes.caffeine:caffeine:3.0.5'
implementation 'org.apache.commons:commons-lang3:3.12.0' implementation 'org.apache.commons:commons-lang3:3.12.0'
} }
if(JavaVersion.current().toString() != "17")
{
System.err.println()
System.err.println("=========================================================================================================")
System.err.println("You must run gradle on Java 17. You are using " + JavaVersion.current())
System.err.println()
System.err.println("=== For IDEs ===")
System.err.println("1. Configure the project for Java 17")
System.err.println("2. Configure the bundled gradle to use Java 17 in settings")
System.err.println()
System.err.println("=== For Command Line (gradlew) ===")
System.err.println("1. Install JDK 17 from https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html")
System.err.println("2. Set JAVA_HOME environment variable to the new jdk installation folder such as C:\\Program Files\\Java\\jdk-17.0.1")
System.err.println("3. Open a new command prompt window to get the new environment variables if need be.")
System.err.println("=========================================================================================================")
System.err.println()
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 downloadSpecialSource(type: Download){
group "remapping"
src 'https://repo.maven.apache.org/maven2/net/md-5/SpecialSource/1.10.0/SpecialSource-1.10.0-shaded.jar'
dest specialSourceJar
onlyIf{
!specialSourceJar.exists()
}
}
task executeBuildTools(dependsOn: downloadBuildtools, type: JavaExec)
{
group "remapping"
classpath = files(buildToolsJar)
workingDir = buildToolsFolder
args = [
"--rev",
nmsVersion,
"--compile",
"craftbukkit",
"--remap"
]
onlyIf{
!buildToolsHint.exists()
}
}
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)
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")
}
dependsOn(specialSourceRemap)
}
def registerCustomOutputTask(name, path) {
if (!System.properties['os.name'].toLowerCase().contains('windows'))
{
return;
}
tasks.register('build' + name, Copy) {
group('development')
outputs.upToDateWhen { false }
dependsOn(iris)
from(new File(buildDir, "Iris-" + version + ".jar"))
into(file(path))
rename { String fileName ->
fileName.replace("Iris-" + version + ".jar", "Iris.jar")
}
}
}
def registerCustomOutputTaskUnix(name, path) {
if(System.properties['os.name'].toLowerCase().contains('windows'))
{
return;
}
tasks.register('build' + name, Copy) {
group('development')
outputs.upToDateWhen { false }
dependsOn(iris)
from(new File(buildDir, "Iris-" + version + ".jar"))
into(file(path))
rename { String fileName ->
fileName.replace("Iris-" + version + ".jar", "Iris.jar")
}
}
}

View File

@ -17,6 +17,6 @@
# #
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -97,7 +97,7 @@ public class Iris extends VolmitPlugin implements Listener {
try { try {
fixShading(); fixShading();
InstanceState.updateInstanceId(); InstanceState.updateInstanceId();
} catch (Throwable ignored) { } catch(Throwable ignored) {
} }
} }
@ -115,7 +115,7 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public static void callEvent(Event e) { public static void callEvent(Event e) {
if (!e.isAsynchronous()) { if(!e.isAsynchronous()) {
J.s(() -> Bukkit.getPluginManager().callEvent(e)); J.s(() -> Bukkit.getPluginManager().callEvent(e));
} else { } else {
Bukkit.getPluginManager().callEvent(e); Bukkit.getPluginManager().callEvent(e);
@ -126,11 +126,11 @@ public class Iris extends VolmitPlugin implements Listener {
JarScanner js = new JarScanner(instance.getJarFile(), s); JarScanner js = new JarScanner(instance.getJarFile(), s);
KList<Object> v = new KList<>(); KList<Object> v = new KList<>();
J.attempt(js::scan); J.attempt(js::scan);
for (Class<?> i : js.getClasses()) { for(Class<?> i : js.getClasses()) {
if (slicedClass == null || i.isAnnotationPresent(slicedClass)) { if(slicedClass == null || i.isAnnotationPresent(slicedClass)) {
try { try {
v.add(i.getDeclaredConstructor().newInstance()); v.add(i.getDeclaredConstructor().newInstance());
} catch (Throwable ignored) { } catch(Throwable ignored) {
} }
} }
@ -143,11 +143,11 @@ public class Iris extends VolmitPlugin implements Listener {
JarScanner js = new JarScanner(instance.getJarFile(), s); JarScanner js = new JarScanner(instance.getJarFile(), s);
KList<Class<?>> v = new KList<>(); KList<Class<?>> v = new KList<>();
J.attempt(js::scan); J.attempt(js::scan);
for (Class<?> i : js.getClasses()) { for(Class<?> i : js.getClasses()) {
if (slicedClass == null || i.isAnnotationPresent(slicedClass)) { if(slicedClass == null || i.isAnnotationPresent(slicedClass)) {
try { try {
v.add(i); v.add(i);
} catch (Throwable ignored) { } catch(Throwable ignored) {
} }
} }
@ -161,7 +161,7 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public static void sq(Runnable r) { public static void sq(Runnable r) {
synchronized (syncJobs) { synchronized(syncJobs) {
syncJobs.queue(r); syncJobs.queue(r);
} }
} }
@ -173,10 +173,10 @@ public class Iris extends VolmitPlugin implements Listener {
public static void msg(String string) { public static void msg(String string) {
try { try {
sender.sendMessage(string); sender.sendMessage(string);
} catch (Throwable e) { } catch(Throwable e) {
try { try {
System.out.println(instance.getTag() + string.replaceAll("(<([^>]+)>)", "")); System.out.println(instance.getTag() + string.replaceAll("(<([^>]+)>)", ""));
} catch (Throwable ignored1) { } catch(Throwable ignored1) {
} }
} }
@ -186,15 +186,15 @@ public class Iris extends VolmitPlugin implements Listener {
String h = IO.hash(name + "@" + url); String h = IO.hash(name + "@" + url);
File f = Iris.instance.getDataFile("cache", h.substring(0, 2), h.substring(3, 5), h); File f = Iris.instance.getDataFile("cache", h.substring(0, 2), h.substring(3, 5), h);
if (!f.exists()) { if(!f.exists()) {
try (BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); FileOutputStream fileOutputStream = new FileOutputStream(f)) { try(BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); FileOutputStream fileOutputStream = new FileOutputStream(f)) {
byte[] dataBuffer = new byte[1024]; byte[] dataBuffer = new byte[1024];
int bytesRead; int bytesRead;
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { while((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead); fileOutputStream.write(dataBuffer, 0, bytesRead);
Iris.verbose("Aquiring " + name); Iris.verbose("Aquiring " + name);
} }
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
@ -206,19 +206,19 @@ public class Iris extends VolmitPlugin implements Listener {
String h = IO.hash(name + "*" + url); String h = IO.hash(name + "*" + url);
File f = Iris.instance.getDataFile("cache", h.substring(0, 2), h.substring(3, 5), h); File f = Iris.instance.getDataFile("cache", h.substring(0, 2), h.substring(3, 5), h);
try (BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); FileOutputStream fileOutputStream = new FileOutputStream(f)) { try(BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); FileOutputStream fileOutputStream = new FileOutputStream(f)) {
byte[] dataBuffer = new byte[1024]; byte[] dataBuffer = new byte[1024];
int bytesRead; int bytesRead;
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { while((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead); fileOutputStream.write(dataBuffer, 0, bytesRead);
} }
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
try { try {
return IO.readAll(f); return IO.readAll(f);
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -229,15 +229,15 @@ public class Iris extends VolmitPlugin implements Listener {
String h = IO.hash(name + "*" + url); String h = IO.hash(name + "*" + url);
File f = Iris.instance.getDataFile("cache", h.substring(0, 2), h.substring(3, 5), h); File f = Iris.instance.getDataFile("cache", h.substring(0, 2), h.substring(3, 5), h);
Iris.verbose("Download " + name + " -> " + url); Iris.verbose("Download " + name + " -> " + url);
try (BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); FileOutputStream fileOutputStream = new FileOutputStream(f)) { try(BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); FileOutputStream fileOutputStream = new FileOutputStream(f)) {
byte[] dataBuffer = new byte[1024]; byte[] dataBuffer = new byte[1024];
int bytesRead; int bytesRead;
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { while((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead); fileOutputStream.write(dataBuffer, 0, bytesRead);
} }
fileOutputStream.flush(); fileOutputStream.flush();
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -254,35 +254,35 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public static void debug(String string) { public static void debug(String string) {
if (!IrisSettings.get().getGeneral().isDebug()) { if(!IrisSettings.get().getGeneral().isDebug()) {
return; return;
} }
try { try {
throw new RuntimeException(); throw new RuntimeException();
} catch (Throwable e) { } catch(Throwable e) {
try { try {
String[] cc = e.getStackTrace()[1].getClassName().split("\\Q.\\E"); String[] cc = e.getStackTrace()[1].getClassName().split("\\Q.\\E");
if (cc.length > 5) { if(cc.length > 5) {
debug(cc[3] + "/" + cc[4] + "/" + cc[cc.length - 1], e.getStackTrace()[1].getLineNumber(), string); debug(cc[3] + "/" + cc[4] + "/" + cc[cc.length - 1], e.getStackTrace()[1].getLineNumber(), string);
} else { } else {
debug(cc[3] + "/" + cc[4], e.getStackTrace()[1].getLineNumber(), string); debug(cc[3] + "/" + cc[4], e.getStackTrace()[1].getLineNumber(), string);
} }
} catch (Throwable ex) { } catch(Throwable ex) {
debug("Origin", -1, string); debug("Origin", -1, string);
} }
} }
} }
public static void debug(String category, int line, String string) { public static void debug(String category, int line, String string) {
if (!IrisSettings.get().getGeneral().isDebug()) { if(!IrisSettings.get().getGeneral().isDebug()) {
return; return;
} }
if(IrisSettings.get().getGeneral().isUseConsoleCustomColors()){ if(IrisSettings.get().getGeneral().isUseConsoleCustomColors()) {
msg("<gradient:#095fe0:#a848db>" + category + " <#bf3b76>" + line + "<reset> " + C.LIGHT_PURPLE + string.replaceAll("\\Q<\\E", "[").replaceAll("\\Q>\\E", "]")); msg("<gradient:#095fe0:#a848db>" + category + " <#bf3b76>" + line + "<reset> " + C.LIGHT_PURPLE + string.replaceAll("\\Q<\\E", "[").replaceAll("\\Q>\\E", "]"));
} else { } else {
msg(C.BLUE + category + ":" + C.AQUA +line + C.RESET + C.LIGHT_PURPLE + " " + string.replaceAll("\\Q<\\E", "[").replaceAll("\\Q>\\E", "]")); msg(C.BLUE + category + ":" + C.AQUA + line + C.RESET + C.LIGHT_PURPLE + " " + string.replaceAll("\\Q<\\E", "[").replaceAll("\\Q>\\E", "]"));
} }
} }
@ -301,21 +301,17 @@ public class Iris extends VolmitPlugin implements Listener {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static void later(NastyRunnable object) { public static void later(NastyRunnable object) {
try try {
{
Bukkit.getScheduler().scheduleAsyncDelayedTask(instance, () -> Bukkit.getScheduler().scheduleAsyncDelayedTask(instance, () ->
{ {
try { try {
object.run(); object.run();
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
}, RNG.r.i(100, 1200)); }, RNG.r.i(100, 1200));
} } catch(IllegalPluginAccessException ignored) {
catch(IllegalPluginAccessException ignored)
{
} }
} }
@ -325,18 +321,18 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public static void clearQueues() { public static void clearQueues() {
synchronized (syncJobs) { synchronized(syncJobs) {
syncJobs.clear(); syncJobs.clear();
} }
} }
private static int getJavaVersion() { private static int getJavaVersion() {
String version = System.getProperty("java.version"); String version = System.getProperty("java.version");
if (version.startsWith("1.")) { if(version.startsWith("1.")) {
version = version.substring(2, 3); version = version.substring(2, 3);
} else { } else {
int dot = version.indexOf("."); int dot = version.indexOf(".");
if (dot != -1) { if(dot != -1) {
version = version.substring(0, dot); version = version.substring(0, dot);
} }
} }
@ -344,10 +340,10 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public static void reportErrorChunk(int x, int z, Throwable e, String extra) { public static void reportErrorChunk(int x, int z, Throwable e, String extra) {
if (IrisSettings.get().getGeneral().isDebug()) { if(IrisSettings.get().getGeneral().isDebug()) {
File f = instance.getDataFile("debug", "chunk-errors", "chunk." + x + "." + z + ".txt"); File f = instance.getDataFile("debug", "chunk-errors", "chunk." + x + "." + z + ".txt");
if (!f.exists()) { if(!f.exists()) {
J.attempt(() -> { J.attempt(() -> {
PrintWriter pw = new PrintWriter(f); PrintWriter pw = new PrintWriter(f);
pw.println("Thread: " + Thread.currentThread().getName()); pw.println("Thread: " + Thread.currentThread().getName());
@ -362,16 +358,16 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public static void reportError(Throwable e) { public static void reportError(Throwable e) {
if (IrisSettings.get().getGeneral().isDebug()) { if(IrisSettings.get().getGeneral().isDebug()) {
String n = e.getClass().getCanonicalName() + "-" + e.getStackTrace()[0].getClassName() + "-" + e.getStackTrace()[0].getLineNumber(); String n = e.getClass().getCanonicalName() + "-" + e.getStackTrace()[0].getClassName() + "-" + e.getStackTrace()[0].getLineNumber();
if (e.getCause() != null) { if(e.getCause() != null) {
n += "-" + e.getCause().getStackTrace()[0].getClassName() + "-" + e.getCause().getStackTrace()[0].getLineNumber(); n += "-" + e.getCause().getStackTrace()[0].getClassName() + "-" + e.getCause().getStackTrace()[0].getLineNumber();
} }
File f = instance.getDataFile("debug", "caught-exceptions", n + ".txt"); File f = instance.getDataFile("debug", "caught-exceptions", n + ".txt");
if (!f.exists()) { if(!f.exists()) {
J.attempt(() -> { J.attempt(() -> {
PrintWriter pw = new PrintWriter(f); PrintWriter pw = new PrintWriter(f);
pw.println("Thread: " + Thread.currentThread().getName()); pw.println("Thread: " + Thread.currentThread().getName());
@ -417,19 +413,19 @@ public class Iris extends VolmitPlugin implements Listener {
} }
private void autoStartStudio() { private void autoStartStudio() {
if (IrisSettings.get().getStudio().isAutoStartDefaultStudio()) { if(IrisSettings.get().getStudio().isAutoStartDefaultStudio()) {
Iris.info("Starting up auto Studio!"); Iris.info("Starting up auto Studio!");
try { try {
Player r = new KList<>(getServer().getOnlinePlayers()).getRandom(); Player r = new KList<>(getServer().getOnlinePlayers()).getRandom();
Iris.service(StudioSVC.class).open(r != null ? new VolmitSender(r) : sender, 1337, IrisSettings.get().getGenerator().getDefaultWorldType(), (w) -> { Iris.service(StudioSVC.class).open(r != null ? new VolmitSender(r) : sender, 1337, IrisSettings.get().getGenerator().getDefaultWorldType(), (w) -> {
J.s(() -> { J.s(() -> {
for (Player i : getServer().getOnlinePlayers()) { for(Player i : getServer().getOnlinePlayers()) {
i.setGameMode(GameMode.SPECTATOR); i.setGameMode(GameMode.SPECTATOR);
i.teleport(new Location(w, 0, 200, 0)); i.teleport(new Location(w, 0, 200, 0));
} }
}); });
}); });
} catch (IrisException e) { } catch(IrisException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -438,7 +434,7 @@ public class Iris extends VolmitPlugin implements Listener {
private void setupAudience() { private void setupAudience() {
try { try {
audiences = BukkitAudiences.create(this); audiences = BukkitAudiences.create(this);
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
IrisSettings.get().getGeneral().setUseConsoleCustomColors(false); IrisSettings.get().getGeneral().setUseConsoleCustomColors(false);
IrisSettings.get().getGeneral().setUseCustomColorsIngame(false); IrisSettings.get().getGeneral().setUseCustomColorsIngame(false);
@ -452,11 +448,11 @@ public class Iris extends VolmitPlugin implements Listener {
FileOutputStream fos = new FileOutputStream(fi); FileOutputStream fos = new FileOutputStream(fi);
Map<Thread, StackTraceElement[]> f = Thread.getAllStackTraces(); Map<Thread, StackTraceElement[]> f = Thread.getAllStackTraces();
PrintWriter pw = new PrintWriter(fos); PrintWriter pw = new PrintWriter(fos);
for (Thread i : f.keySet()) { for(Thread i : f.keySet()) {
pw.println("========================================"); pw.println("========================================");
pw.println("Thread: '" + i.getName() + "' ID: " + i.getId() + " STATUS: " + i.getState().name()); pw.println("Thread: '" + i.getName() + "' ID: " + i.getId() + " STATUS: " + i.getState().name());
for (StackTraceElement j : f.get(i)) { for(StackTraceElement j : f.get(i)) {
pw.println(" @ " + j.toString()); pw.println(" @ " + j.toString());
} }
@ -467,7 +463,7 @@ public class Iris extends VolmitPlugin implements Listener {
pw.close(); pw.close();
System.out.println("DUMPED! See " + fi.getAbsolutePath()); System.out.println("DUMPED! See " + fi.getAbsolutePath());
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -476,13 +472,11 @@ public class Iris extends VolmitPlugin implements Listener {
postShutdown.add(r); postShutdown.add(r);
} }
public static void panic() public static void panic() {
{
EnginePanic.panic(); EnginePanic.panic();
} }
public static void addPanic(String s, String v) public static void addPanic(String s, String v) {
{
EnginePanic.add(s, v); EnginePanic.add(s, v);
} }
@ -508,7 +502,7 @@ public class Iris extends VolmitPlugin implements Listener {
} }
private void setupPapi() { private void setupPapi() {
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { if(Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
new IrisPapiExpansion().register(); new IrisPapiExpansion().register();
} }
} }
@ -529,7 +523,7 @@ public class Iris extends VolmitPlugin implements Listener {
} }
private void checkConfigHotload() { private void checkConfigHotload() {
if (configWatcher.checkModified()) { if(configWatcher.checkModified()) {
IrisSettings.invalidate(); IrisSettings.invalidate();
IrisSettings.get(); IrisSettings.get();
configWatcher.checkModified(); configWatcher.checkModified();
@ -538,17 +532,17 @@ public class Iris extends VolmitPlugin implements Listener {
} }
private void tickQueue() { private void tickQueue() {
synchronized (Iris.syncJobs) { synchronized(Iris.syncJobs) {
if (!Iris.syncJobs.hasNext()) { if(!Iris.syncJobs.hasNext()) {
return; return;
} }
long ms = M.ms(); long ms = M.ms();
while (Iris.syncJobs.hasNext() && M.ms() - ms < 25) { while(Iris.syncJobs.hasNext() && M.ms() - ms < 25) {
try { try {
Iris.syncJobs.next().run(); Iris.syncJobs.next().run();
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -557,7 +551,7 @@ public class Iris extends VolmitPlugin implements Listener {
} }
private void bstats() { private void bstats() {
if (IrisSettings.get().getGeneral().isPluginMetrics()) { if(IrisSettings.get().getGeneral().isPluginMetrics()) {
J.s(() -> new Metrics(Iris.instance, 8757)); J.s(() -> new Metrics(Iris.instance, 8757));
} }
} }
@ -573,12 +567,12 @@ public class Iris extends VolmitPlugin implements Listener {
@Override @Override
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
if (worldName.equals("test")) { if(worldName.equals("test")) {
try { try {
throw new RuntimeException(); throw new RuntimeException();
} catch (Throwable e) { } catch(Throwable e) {
Iris.info(e.getStackTrace()[1].getClassName()); Iris.info(e.getStackTrace()[1].getClassName());
if (e.getStackTrace()[1].getClassName().contains("com.onarandombox.MultiverseCore")) { if(e.getStackTrace()[1].getClassName().contains("com.onarandombox.MultiverseCore")) {
Iris.debug("MVC Test detected, Quick! Send them the dummy!"); Iris.debug("MVC Test detected, Quick! Send them the dummy!");
return new DummyChunkGenerator(); return new DummyChunkGenerator();
} }
@ -586,20 +580,20 @@ public class Iris extends VolmitPlugin implements Listener {
} }
IrisDimension dim; IrisDimension dim;
if (id == null || id.isEmpty()) { if(id == null || id.isEmpty()) {
dim = IrisData.loadAnyDimension(IrisSettings.get().getGenerator().getDefaultWorldType()); dim = IrisData.loadAnyDimension(IrisSettings.get().getGenerator().getDefaultWorldType());
} else { } else {
dim = IrisData.loadAnyDimension(id); dim = IrisData.loadAnyDimension(id);
} }
Iris.debug("Generator ID: " + id + " requested by bukkit/plugin"); Iris.debug("Generator ID: " + id + " requested by bukkit/plugin");
if (dim == null) { if(dim == null) {
Iris.warn("Unable to find dimension type " + id + " Looking for online packs..."); Iris.warn("Unable to find dimension type " + id + " Looking for online packs...");
service(StudioSVC.class).downloadSearch(new VolmitSender(Bukkit.getConsoleSender()), id, true); service(StudioSVC.class).downloadSearch(new VolmitSender(Bukkit.getConsoleSender()), id, true);
dim = IrisData.loadAnyDimension(id); dim = IrisData.loadAnyDimension(id);
if (dim == null) { if(dim == null) {
throw new RuntimeException("Can't find dimension " + id + "!"); throw new RuntimeException("Can't find dimension " + id + "!");
} else { } else {
Iris.info("Resolved missing dimension, proceeding with generation."); Iris.info("Resolved missing dimension, proceeding with generation.");
@ -613,14 +607,14 @@ public class Iris extends VolmitPlugin implements Listener {
.seed(1337) .seed(1337)
.environment(dim.getEnvironment()) .environment(dim.getEnvironment())
.worldFolder(new File(worldName)) .worldFolder(new File(worldName))
.minHeight(0) .minHeight(dim.getMinHeight())
.maxHeight(256) .maxHeight(dim.getMaxHeight())
.build(); .build();
Iris.debug("Generator Config: " + w.toString()); Iris.debug("Generator Config: " + w.toString());
File ff = new File(w.worldFolder(), "iris/pack"); File ff = new File(w.worldFolder(), "iris/pack");
if (!ff.exists() || ff.listFiles().length == 0) { if(!ff.exists() || ff.listFiles().length == 0) {
ff.mkdirs(); ff.mkdirs();
service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), ff.getParentFile()); service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), ff.getParentFile());
} }
@ -629,7 +623,7 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public void splash() { public void splash() {
if (!IrisSettings.get().getGeneral().isSplashLogoStartup()) { if(!IrisSettings.get().getGeneral().isSplashLogoStartup()) {
return; return;
} }
@ -645,7 +639,7 @@ public class Iris extends VolmitPlugin implements Listener {
Iris.info("Bukkit version: " + Bukkit.getBukkitVersion()); Iris.info("Bukkit version: " + Bukkit.getBukkitVersion());
Iris.info("Java version: " + getJavaVersion()); Iris.info("Java version: " + getJavaVersion());
Iris.info("Custom Biomes: " + INMS.get().countCustomBiomes()); Iris.info("Custom Biomes: " + INMS.get().countCustomBiomes());
for (int i = 0; i < info.length; i++) { for(int i = 0; i < info.length; i++) {
splash[i] += info[i]; splash[i] += info[i];
} }

View File

@ -43,7 +43,7 @@ public class IrisSettings {
private IrisSettingsPerformance performance = new IrisSettingsPerformance(); private IrisSettingsPerformance performance = new IrisSettingsPerformance();
public static int getThreadCount(int c) { public static int getThreadCount(int c) {
return switch (c) { return switch(c) {
case -1, -2, -4 -> Runtime.getRuntime().availableProcessors() / -c; case -1, -2, -4 -> Runtime.getRuntime().availableProcessors() / -c;
case 0, 1, 2 -> 1; case 0, 1, 2 -> 1;
default -> Math.max(c, 2); default -> Math.max(c, 2);
@ -134,7 +134,7 @@ public class IrisSettings {
} }
public static IrisSettings get() { public static IrisSettings get() {
if (settings != null) { if(settings != null) {
return settings; return settings;
} }
@ -142,10 +142,10 @@ public class IrisSettings {
File s = Iris.instance.getDataFile("settings.json"); File s = Iris.instance.getDataFile("settings.json");
if (!s.exists()) { if(!s.exists()) {
try { try {
IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4)); IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4));
} catch (JSONException | IOException e) { } catch(JSONException | IOException e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -155,10 +155,10 @@ public class IrisSettings {
settings = new Gson().fromJson(ss, IrisSettings.class); settings = new Gson().fromJson(ss, IrisSettings.class);
try { try {
IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4)); IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4));
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} catch (Throwable ee) { } catch(Throwable ee) {
// Iris.reportError(ee); causes a self-reference & stackoverflow // Iris.reportError(ee); causes a self-reference & stackoverflow
Iris.error("Configuration Error in settings.json! " + ee.getClass().getSimpleName() + ": " + ee.getMessage()); Iris.error("Configuration Error in settings.json! " + ee.getClass().getSimpleName() + ": " + ee.getMessage());
} }
@ -168,7 +168,7 @@ public class IrisSettings {
} }
public static void invalidate() { public static void invalidate() {
synchronized (settings) { synchronized(settings) {
settings = null; settings = null;
} }
} }
@ -178,7 +178,7 @@ public class IrisSettings {
try { try {
IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4)); IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4));
} catch (JSONException | IOException e) { } catch(JSONException | IOException e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }

View File

@ -43,11 +43,11 @@ import java.util.concurrent.TimeUnit;
public class ServerConfigurator { public class ServerConfigurator {
public static void configure() { public static void configure() {
IrisSettings.IrisSettingsAutoconfiguration s = IrisSettings.get().getAutoConfiguration(); IrisSettings.IrisSettingsAutoconfiguration s = IrisSettings.get().getAutoConfiguration();
if (s.isConfigureSpigotTimeoutTime()) { if(s.isConfigureSpigotTimeoutTime()) {
J.attempt(ServerConfigurator::increaseKeepAliveSpigot); J.attempt(ServerConfigurator::increaseKeepAliveSpigot);
} }
if (s.isConfigurePaperWatchdogDelay()) { if(s.isConfigurePaperWatchdogDelay()) {
J.attempt(ServerConfigurator::increasePaperWatchdog); J.attempt(ServerConfigurator::increasePaperWatchdog);
} }
@ -60,7 +60,7 @@ public class ServerConfigurator {
f.load(spigotConfig); f.load(spigotConfig);
long tt = f.getLong("settings.timeout-time"); long tt = f.getLong("settings.timeout-time");
if (tt < TimeUnit.MINUTES.toSeconds(5)) { 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(5) + " (5 minutes)");
Iris.warn("You can disable this change (autoconfigureServer) in Iris settings, then change back the value."); 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.set("settings.timeout-time", TimeUnit.MINUTES.toSeconds(5));
@ -74,7 +74,7 @@ public class ServerConfigurator {
f.load(spigotConfig); f.load(spigotConfig);
long tt = f.getLong("settings.watchdog.early-warning-delay"); long tt = f.getLong("settings.watchdog.early-warning-delay");
if (tt < TimeUnit.MINUTES.toMillis(3)) { 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(3) + " (3 minutes)");
Iris.warn("You can disable this change (autoconfigureServer) in Iris settings, then change back the value."); Iris.warn("You can disable this change (autoconfigureServer) in Iris settings, then change back the value.");
f.set("settings.watchdog.early-warning-delay", TimeUnit.MINUTES.toMillis(3)); f.set("settings.watchdog.early-warning-delay", TimeUnit.MINUTES.toMillis(3));
@ -83,22 +83,22 @@ public class ServerConfigurator {
} }
private static File getDatapacksFolder() { private static File getDatapacksFolder() {
if (!IrisSettings.get().getGeneral().forceMainWorld.isEmpty()) { if(!IrisSettings.get().getGeneral().forceMainWorld.isEmpty()) {
return new File(IrisSettings.get().getGeneral().forceMainWorld + "/datapacks"); return new File(IrisSettings.get().getGeneral().forceMainWorld + "/datapacks");
} }
File props = new File("server.properties"); File props = new File("server.properties");
if (props.exists()) { if(props.exists()) {
try { try {
KList<String> m = new KList<>(IO.readAll(props).split("\\Q\n\\E")); KList<String> m = new KList<>(IO.readAll(props).split("\\Q\n\\E"));
for (String i : m) { for(String i : m) {
if (i.trim().startsWith("level-name=")) { if(i.trim().startsWith("level-name=")) {
return new File(i.trim().split("\\Q=\\E")[1] + "/datapacks"); return new File(i.trim().split("\\Q=\\E")[1] + "/datapacks");
} }
} }
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -113,29 +113,29 @@ public class ServerConfigurator {
File packs = new File("plugins/Iris/packs"); File packs = new File("plugins/Iris/packs");
File dpacks = getDatapacksFolder(); File dpacks = getDatapacksFolder();
if (dpacks == null) { if(dpacks == null) {
Iris.error("Cannot find the datapacks folder! Please try generating a default world first maybe? Is this a new server?"); Iris.error("Cannot find the datapacks folder! Please try generating a default world first maybe? Is this a new server?");
return; return;
} }
if (packs.exists()) { if(packs.exists()) {
for (File i : packs.listFiles()) { for(File i : packs.listFiles()) {
if (i.isDirectory()) { if(i.isDirectory()) {
Iris.verbose("Checking Pack: " + i.getPath()); Iris.verbose("Checking Pack: " + i.getPath());
IrisData data = IrisData.get(i); IrisData data = IrisData.get(i);
File dims = new File(i, "dimensions"); File dims = new File(i, "dimensions");
if (dims.exists()) { if(dims.exists()) {
for (File j : dims.listFiles()) { for(File j : dims.listFiles()) {
if (j.getName().endsWith(".json")) { if(j.getName().endsWith(".json")) {
IrisDimension dim = data.getDimensionLoader().load(j.getName().split("\\Q.\\E")[0]); IrisDimension dim = data.getDimensionLoader().load(j.getName().split("\\Q.\\E")[0]);
if (dim == null) { if(dim == null) {
continue; continue;
} }
Iris.verbose(" Checking Dimension " + dim.getLoadFile().getPath()); Iris.verbose(" Checking Dimension " + dim.getLoadFile().getPath());
if (dim.installDataPack(() -> data, dpacks)) { if(dim.installDataPack(() -> data, dpacks)) {
reboot = true; reboot = true;
} }
} }
@ -147,7 +147,7 @@ public class ServerConfigurator {
Iris.info("Data Packs Setup!"); Iris.info("Data Packs Setup!");
if (fullInstall) { if(fullInstall) {
verifyDataPacksPost(IrisSettings.get().getAutoConfiguration().isAutoRestartOnCustomBiomeInstall()); verifyDataPacksPost(IrisSettings.get().getAutoConfiguration().isAutoRestartOnCustomBiomeInstall());
} }
} }
@ -156,30 +156,30 @@ public class ServerConfigurator {
File packs = new File("plugins/Iris/packs"); File packs = new File("plugins/Iris/packs");
File dpacks = getDatapacksFolder(); File dpacks = getDatapacksFolder();
if (dpacks == null) { if(dpacks == null) {
Iris.error("Cannot find the datapacks folder! Please try generating a default world first maybe? Is this a new server?"); Iris.error("Cannot find the datapacks folder! Please try generating a default world first maybe? Is this a new server?");
return; return;
} }
boolean bad = false; boolean bad = false;
if (packs.exists()) { if(packs.exists()) {
for (File i : packs.listFiles()) { for(File i : packs.listFiles()) {
if (i.isDirectory()) { if(i.isDirectory()) {
Iris.verbose("Checking Pack: " + i.getPath()); Iris.verbose("Checking Pack: " + i.getPath());
IrisData data = IrisData.get(i); IrisData data = IrisData.get(i);
File dims = new File(i, "dimensions"); File dims = new File(i, "dimensions");
if (dims.exists()) { if(dims.exists()) {
for (File j : dims.listFiles()) { for(File j : dims.listFiles()) {
if (j.getName().endsWith(".json")) { if(j.getName().endsWith(".json")) {
IrisDimension dim = data.getDimensionLoader().load(j.getName().split("\\Q.\\E")[0]); IrisDimension dim = data.getDimensionLoader().load(j.getName().split("\\Q.\\E")[0]);
if (dim == null) { if(dim == null) {
Iris.error("Failed to load " + j.getPath() + " "); Iris.error("Failed to load " + j.getPath() + " ");
continue; continue;
} }
if (!verifyDataPackInstalled(dim)) { if(!verifyDataPackInstalled(dim)) {
bad = true; bad = true;
} }
} }
@ -189,10 +189,10 @@ public class ServerConfigurator {
} }
} }
if (bad) { if(bad) {
if (allowRestarting) { if(allowRestarting) {
restart(); restart();
} else if (INMS.get().supportsDataPacks()) { } else if(INMS.get().supportsDataPacks()) {
Iris.error("============================================================================"); Iris.error("============================================================================");
Iris.error(C.ITALIC + "You need to restart your server to properly generate custom biomes."); Iris.error(C.ITALIC + "You need to restart your server to properly generate custom biomes.");
Iris.error(C.ITALIC + "By continuing, Iris will use backup biomes in place of the custom biomes."); Iris.error(C.ITALIC + "By continuing, Iris will use backup biomes in place of the custom biomes.");
@ -200,8 +200,8 @@ public class ServerConfigurator {
Iris.error(C.UNDERLINE + "IT IS HIGHLY RECOMMENDED YOU RESTART THE SERVER BEFORE GENERATING!"); Iris.error(C.UNDERLINE + "IT IS HIGHLY RECOMMENDED YOU RESTART THE SERVER BEFORE GENERATING!");
Iris.error("============================================================================"); Iris.error("============================================================================");
for (Player i : Bukkit.getOnlinePlayers()) { for(Player i : Bukkit.getOnlinePlayers()) {
if (i.isOp() || i.hasPermission("iris.all")) { if(i.isOp() || i.hasPermission("iris.all")) {
VolmitSender sender = new VolmitSender(i, Iris.instance.getTag("WARNING")); VolmitSender sender = new VolmitSender(i, Iris.instance.getTag("WARNING"));
sender.sendMessage("There are some Iris Packs that have custom biomes in them"); sender.sendMessage("There are some Iris Packs that have custom biomes in them");
sender.sendMessage("You need to restart your server to use these packs."); sender.sendMessage("You need to restart your server to use these packs.");
@ -231,16 +231,16 @@ public class ServerConfigurator {
KSet<String> keys = new KSet<>(); KSet<String> keys = new KSet<>();
boolean warn = false; boolean warn = false;
for (IrisBiome i : dimension.getAllBiomes(() -> idm)) { for(IrisBiome i : dimension.getAllBiomes(() -> idm)) {
if (i.isCustom()) { if(i.isCustom()) {
for (IrisBiomeCustom j : i.getCustomDerivitives()) { for(IrisBiomeCustom j : i.getCustomDerivitives()) {
keys.add(dimension.getLoadKey() + ":" + j.getId()); keys.add(dimension.getLoadKey() + ":" + j.getId());
} }
} }
} }
if (!INMS.get().supportsDataPacks()) { if(!INMS.get().supportsDataPacks()) {
if (!keys.isEmpty()) { if(!keys.isEmpty()) {
Iris.warn("==================================================================================="); Iris.warn("===================================================================================");
Iris.warn("Pack " + dimension.getLoadKey() + " has " + keys.size() + " custom biome(s). "); Iris.warn("Pack " + dimension.getLoadKey() + " has " + keys.size() + " custom biome(s). ");
Iris.warn("Your server version does not yet support datapacks for iris."); Iris.warn("Your server version does not yet support datapacks for iris.");
@ -251,16 +251,16 @@ public class ServerConfigurator {
return true; return true;
} }
for (String i : keys) { for(String i : keys) {
Object o = INMS.get().getCustomBiomeBaseFor(i); Object o = INMS.get().getCustomBiomeBaseFor(i);
if (o == null) { if(o == null) {
Iris.warn("The Biome " + i + " is not registered on the server."); Iris.warn("The Biome " + i + " is not registered on the server.");
warn = true; warn = true;
} }
} }
if (warn) { if(warn) {
Iris.error("The Pack " + dimension.getLoadKey() + " is INCAPABLE of generating custom biomes"); Iris.error("The Pack " + dimension.getLoadKey() + " is INCAPABLE of generating custom biomes");
Iris.error("If not done automatically, restart your server before generating with this pack!"); Iris.error("If not done automatically, restart your server before generating with this pack!");
} }

View File

@ -19,44 +19,36 @@
package com.volmit.iris.core.commands; package com.volmit.iris.core.commands;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.edit.BlockSignal;
import com.volmit.iris.core.loader.IrisRegistrant;
import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.service.StudioSVC;
import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.object.IrisBiome;
import com.volmit.iris.engine.object.*; import com.volmit.iris.engine.object.IrisCave;
import com.volmit.iris.util.data.B; import com.volmit.iris.engine.object.IrisDimension;
import com.volmit.iris.engine.object.IrisJigsawPiece;
import com.volmit.iris.engine.object.IrisJigsawPool;
import com.volmit.iris.engine.object.IrisJigsawStructure;
import com.volmit.iris.engine.object.IrisRegion;
import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeExecutor;
import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.DecreeOrigin;
import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.annotations.Decree;
import com.volmit.iris.util.decree.annotations.Param; import com.volmit.iris.util.decree.annotations.Param;
import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.C;
import com.volmit.iris.util.matter.MatterMarker;
import com.volmit.iris.util.scheduling.J;
import org.bukkit.Chunk;
import org.bukkit.FluidCollisionMode;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import java.awt.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.awt.Desktop;
@Decree(name = "edit", origin = DecreeOrigin.PLAYER, studio = true, description = "Edit something") @Decree(name = "edit", origin = DecreeOrigin.PLAYER, studio = true, description = "Edit something")
public class CommandEdit implements DecreeExecutor { public class CommandEdit implements DecreeExecutor {
private boolean noStudio() { private boolean noStudio() {
if (!sender().isPlayer()) { if(!sender().isPlayer()) {
sender().sendMessage(C.RED + "Players only!"); sender().sendMessage(C.RED + "Players only!");
return true; return true;
} }
if (!Iris.service(StudioSVC.class).isProjectOpen()) { if(!Iris.service(StudioSVC.class).isProjectOpen()) {
sender().sendMessage(C.RED + "No studio world is open!"); sender().sendMessage(C.RED + "No studio world is open!");
return true; return true;
} }
if (!engine().isStudio()) { if(!engine().isStudio()) {
sender().sendMessage(C.RED + "You must be in a studio world!"); sender().sendMessage(C.RED + "You must be in a studio world!");
return true; return true;
} }
@ -64,18 +56,19 @@ public class CommandEdit implements DecreeExecutor {
} }
@Decree(description = "Edit the biome you specified", aliases = {"b"}, origin = DecreeOrigin.PLAYER) @Decree(description = "Edit the biome you specified", aliases = {"b"}, origin = DecreeOrigin.PLAYER)
public void biome(@Param(contextual = false, description = "The biome to edit") IrisBiome biome) { public void biome(@Param(contextual = false, description = "The biome to edit") IrisBiome biome) {
if (noStudio()) {return;} if(noStudio()) {
return;
}
try { try {
if ( biome==null || biome.getLoadFile() == null) { if(biome == null || biome.getLoadFile() == null) {
sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?"); sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?");
return; return;
} }
Desktop.getDesktop().open(biome.getLoadFile()); Desktop.getDesktop().open(biome.getLoadFile());
sender().sendMessage(C.GREEN + "Opening " + biome.getTypeName() + " " + biome.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! "); sender().sendMessage(C.GREEN + "Opening " + biome.getTypeName() + " " + biome.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! ");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist"); sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist");
} }
@ -83,15 +76,17 @@ public class CommandEdit implements DecreeExecutor {
@Decree(description = "Edit the region you specified", aliases = {"r"}, origin = DecreeOrigin.PLAYER) @Decree(description = "Edit the region you specified", aliases = {"r"}, origin = DecreeOrigin.PLAYER)
public void region(@Param(contextual = false, description = "The region to edit") IrisRegion region) { public void region(@Param(contextual = false, description = "The region to edit") IrisRegion region) {
if (noStudio()) {return;} if(noStudio()) {
return;
}
try { try {
if ( region==null || region.getLoadFile() == null) { if(region == null || region.getLoadFile() == null) {
sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?"); sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?");
return; return;
} }
Desktop.getDesktop().open(region.getLoadFile()); Desktop.getDesktop().open(region.getLoadFile());
sender().sendMessage(C.GREEN + "Opening " + region.getTypeName() + " " + region.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! "); sender().sendMessage(C.GREEN + "Opening " + region.getTypeName() + " " + region.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! ");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist"); sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist");
} }
@ -99,15 +94,17 @@ public class CommandEdit implements DecreeExecutor {
@Decree(description = "Edit the dimension you specified", aliases = {"d"}, origin = DecreeOrigin.PLAYER) @Decree(description = "Edit the dimension you specified", aliases = {"d"}, origin = DecreeOrigin.PLAYER)
public void dimension(@Param(contextual = false, description = "The dimension to edit") IrisDimension dimension) { public void dimension(@Param(contextual = false, description = "The dimension to edit") IrisDimension dimension) {
if (noStudio()) {return;} if(noStudio()) {
return;
}
try { try {
if ( dimension==null || dimension.getLoadFile() == null) { if(dimension == null || dimension.getLoadFile() == null) {
sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?"); sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?");
return; return;
} }
Desktop.getDesktop().open(dimension.getLoadFile()); Desktop.getDesktop().open(dimension.getLoadFile());
sender().sendMessage(C.GREEN + "Opening " + dimension.getTypeName() + " " + dimension.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! "); sender().sendMessage(C.GREEN + "Opening " + dimension.getTypeName() + " " + dimension.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! ");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist"); sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist");
} }
@ -115,15 +112,17 @@ public class CommandEdit implements DecreeExecutor {
@Decree(description = "Edit the cave file you specified", aliases = {"c"}, origin = DecreeOrigin.PLAYER) @Decree(description = "Edit the cave file you specified", aliases = {"c"}, origin = DecreeOrigin.PLAYER)
public void cave(@Param(contextual = false, description = "The cave to edit") IrisCave cave) { public void cave(@Param(contextual = false, description = "The cave to edit") IrisCave cave) {
if (noStudio()) {return;} if(noStudio()) {
return;
}
try { try {
if ( cave==null || cave.getLoadFile() == null) { if(cave == null || cave.getLoadFile() == null) {
sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?"); sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?");
return; return;
} }
Desktop.getDesktop().open(cave.getLoadFile()); Desktop.getDesktop().open(cave.getLoadFile());
sender().sendMessage(C.GREEN + "Opening " + cave.getTypeName() + " " + cave.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! "); sender().sendMessage(C.GREEN + "Opening " + cave.getTypeName() + " " + cave.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! ");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist"); sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist");
} }
@ -131,15 +130,17 @@ public class CommandEdit implements DecreeExecutor {
@Decree(description = "Edit the structure file you specified", aliases = {"jigsawstructure", "structure"}, origin = DecreeOrigin.PLAYER) @Decree(description = "Edit the structure file you specified", aliases = {"jigsawstructure", "structure"}, origin = DecreeOrigin.PLAYER)
public void jigsaw(@Param(contextual = false, description = "The jigsaw structure to edit") IrisJigsawStructure jigsaw) { public void jigsaw(@Param(contextual = false, description = "The jigsaw structure to edit") IrisJigsawStructure jigsaw) {
if (noStudio()) {return;} if(noStudio()) {
return;
}
try { try {
if ( jigsaw==null || jigsaw.getLoadFile() == null) { if(jigsaw == null || jigsaw.getLoadFile() == null) {
sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?"); sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?");
return; return;
} }
Desktop.getDesktop().open(jigsaw.getLoadFile()); Desktop.getDesktop().open(jigsaw.getLoadFile());
sender().sendMessage(C.GREEN + "Opening " + jigsaw.getTypeName() + " " + jigsaw.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! "); sender().sendMessage(C.GREEN + "Opening " + jigsaw.getTypeName() + " " + jigsaw.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! ");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist"); sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist");
} }
@ -147,15 +148,17 @@ public class CommandEdit implements DecreeExecutor {
@Decree(description = "Edit the pool file you specified", aliases = {"jigsawpool", "pool"}, origin = DecreeOrigin.PLAYER) @Decree(description = "Edit the pool file you specified", aliases = {"jigsawpool", "pool"}, origin = DecreeOrigin.PLAYER)
public void jigsawPool(@Param(contextual = false, description = "The jigsaw pool to edit") IrisJigsawPool pool) { public void jigsawPool(@Param(contextual = false, description = "The jigsaw pool to edit") IrisJigsawPool pool) {
if (noStudio()) {return;} if(noStudio()) {
return;
}
try { try {
if ( pool==null || pool.getLoadFile() == null) { if(pool == null || pool.getLoadFile() == null) {
sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?"); sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?");
return; return;
} }
Desktop.getDesktop().open(pool.getLoadFile()); Desktop.getDesktop().open(pool.getLoadFile());
sender().sendMessage(C.GREEN + "Opening " + pool.getTypeName() + " " + pool.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! "); sender().sendMessage(C.GREEN + "Opening " + pool.getTypeName() + " " + pool.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! ");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist"); sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist");
} }
@ -163,15 +166,17 @@ public class CommandEdit implements DecreeExecutor {
@Decree(description = "Edit the jigsaw piece file you specified", aliases = {"jigsawpiece", "piece"}, origin = DecreeOrigin.PLAYER) @Decree(description = "Edit the jigsaw piece file you specified", aliases = {"jigsawpiece", "piece"}, origin = DecreeOrigin.PLAYER)
public void jigsawPiece(@Param(contextual = false, description = "The jigsaw piece to edit") IrisJigsawPiece piece) { public void jigsawPiece(@Param(contextual = false, description = "The jigsaw piece to edit") IrisJigsawPiece piece) {
if (noStudio()) {return;} if(noStudio()) {
return;
}
try { try {
if ( piece==null || piece.getLoadFile() == null) { if(piece == null || piece.getLoadFile() == null) {
sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?"); sender().sendMessage(C.GOLD + "Cannot find the file; Perhaps it was not loaded directly from a file?");
return; return;
} }
Desktop.getDesktop().open(piece.getLoadFile()); Desktop.getDesktop().open(piece.getLoadFile());
sender().sendMessage(C.GREEN + "Opening " + piece.getTypeName() + " " + piece.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! "); sender().sendMessage(C.GREEN + "Opening " + piece.getTypeName() + " " + piece.getLoadFile().getName().split("\\Q.\\E")[0] + " in VSCode! ");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist"); sender().sendMessage(C.RED + "Cant find the file. Or registrant does not exist");
} }

View File

@ -38,7 +38,7 @@ public class CommandFind implements DecreeExecutor {
) { ) {
Engine e = engine(); Engine e = engine();
if (e == null) { if(e == null) {
sender().sendMessage(C.GOLD + "Not in an Iris World!"); sender().sendMessage(C.GOLD + "Not in an Iris World!");
return; return;
} }
@ -53,7 +53,7 @@ public class CommandFind implements DecreeExecutor {
) { ) {
Engine e = engine(); Engine e = engine();
if (e == null) { if(e == null) {
sender().sendMessage(C.GOLD + "Not in an Iris World!"); sender().sendMessage(C.GOLD + "Not in an Iris World!");
return; return;
} }
@ -68,7 +68,7 @@ public class CommandFind implements DecreeExecutor {
) { ) {
Engine e = engine(); Engine e = engine();
if (e == null) { if(e == null) {
sender().sendMessage(C.GOLD + "Not in an Iris World!"); sender().sendMessage(C.GOLD + "Not in an Iris World!");
return; return;
} }
@ -83,7 +83,7 @@ public class CommandFind implements DecreeExecutor {
) { ) {
Engine e = engine(); Engine e = engine();
if (e == null) { if(e == null) {
sender().sendMessage(C.GOLD + "Not in an Iris World!"); sender().sendMessage(C.GOLD + "Not in an Iris World!");
return; return;
} }

View File

@ -65,13 +65,13 @@ public class CommandIris implements DecreeExecutor {
@Param(description = "The seed to generate the world with", defaultValue = "1337") @Param(description = "The seed to generate the world with", defaultValue = "1337")
long seed long seed
) { ) {
if (name.equals("iris")) { 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 + "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?"); sender().sendMessage(C.RED + "May we suggest the name \"IrisWorld\" instead?");
return; return;
} }
if (new File(name).exists()) { if(new File(name).exists()) {
sender().sendMessage(C.RED + "That folder already exists!"); sender().sendMessage(C.RED + "That folder already exists!");
return; return;
} }
@ -86,7 +86,7 @@ public class CommandIris implements DecreeExecutor {
.sender(sender()) .sender(sender())
.studio(false) .studio(false)
.create(); .create();
} catch (Throwable e) { } catch(Throwable e) {
sender().sendMessage(C.RED + "Exception raised during creation. See the console for more details."); sender().sendMessage(C.RED + "Exception raised during creation. See the console for more details.");
Iris.error("Exception raised during world creation: " + e.getMessage()); Iris.error("Exception raised during world creation: " + e.getMessage());
Iris.reportError(e); Iris.reportError(e);
@ -101,6 +101,12 @@ public class CommandIris implements DecreeExecutor {
sender().sendMessage(C.GREEN + "Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software"); sender().sendMessage(C.GREEN + "Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software");
} }
@Decree(description = "Print version 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 = "Set aura spins") @Decree(description = "Set aura spins")
public void aura( public void aura(
@Param(description = "The h color value", defaultValue = "-20") @Param(description = "The h color value", defaultValue = "-20")
@ -127,7 +133,7 @@ public class CommandIris implements DecreeExecutor {
int value2 int value2
) { ) {
Integer v = null; Integer v = null;
switch (operator) { 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;
@ -135,7 +141,7 @@ public class CommandIris implements DecreeExecutor {
case ">>" -> v = value1 >> value2; case ">>" -> v = value1 >> value2;
case "<<" -> v = value1 << value2; case "<<" -> v = value1 << value2;
} }
if (v == null) { if(v == null) {
sender().sendMessage(C.RED + "The operator you entered: (" + operator + ") is invalid!"); sender().sendMessage(C.RED + "The operator you entered: (" + operator + ") is invalid!");
return; return;
} }
@ -171,7 +177,7 @@ public class CommandIris implements DecreeExecutor {
@Decree(description = "Get metrics for your world", aliases = "measure", origin = DecreeOrigin.PLAYER) @Decree(description = "Get metrics for your world", aliases = "measure", origin = DecreeOrigin.PLAYER)
public void metrics() { public void metrics() {
if (!IrisToolbelt.isIrisWorld(world())) { if(!IrisToolbelt.isIrisWorld(world())) {
sender().sendMessage(C.RED + "You must be in an Iris world"); sender().sendMessage(C.RED + "You must be in an Iris world");
return; return;
} }
@ -191,7 +197,7 @@ public class CommandIris implements DecreeExecutor {
@Param(name = "radius", description = "The radius of nearby cunks", defaultValue = "5") @Param(name = "radius", description = "The radius of nearby cunks", defaultValue = "5")
int radius int radius
) { ) {
if (IrisToolbelt.isIrisWorld(player().getWorld())) { if(IrisToolbelt.isIrisWorld(player().getWorld())) {
VolmitSender sender = sender(); VolmitSender sender = sender();
J.a(() -> { J.a(() -> {
DecreeContext.touch(sender); DecreeContext.touch(sender);
@ -203,18 +209,18 @@ public class CommandIris implements DecreeExecutor {
BurstExecutor b = MultiBurst.burst.burst(); BurstExecutor b = MultiBurst.burst.burst();
b.setMulticore(false); b.setMulticore(false);
int rad = engine.getMantle().getRealRadius(); int rad = engine.getMantle().getRealRadius();
for (int i = -(radius + rad); i <= radius + rad; i++) { for(int i = -(radius + rad); i <= radius + rad; i++) {
for (int j = -(radius + rad); j <= radius + rad; j++) { for(int j = -(radius + rad); j <= radius + rad; j++) {
engine.getMantle().getMantle().deleteChunk(i + cx.getX(), j + cx.getZ()); engine.getMantle().getMantle().deleteChunk(i + cx.getX(), j + cx.getZ());
} }
} }
for (int i = -radius; i <= radius; i++) { for(int i = -radius; i <= radius; i++) {
for (int j = -radius; j <= radius; j++) { for(int j = -radius; j <= radius; j++) {
int finalJ = j; int finalJ = j;
int finalI = i; int finalI = i;
b.queue(() -> plat.injectChunkReplacement(player().getWorld(), finalI + cx.getX(), finalJ + cx.getZ(), (f) -> { b.queue(() -> plat.injectChunkReplacement(player().getWorld(), finalI + cx.getX(), finalJ + cx.getZ(), (f) -> {
synchronized (js) { synchronized(js) {
js.add(f); js.add(f);
} }
})); }));
@ -230,11 +236,11 @@ public class CommandIris implements DecreeExecutor {
public void execute(Runnable runnable) { public void execute(Runnable runnable) {
futures.add(J.sfut(runnable)); futures.add(J.sfut(runnable));
if (futures.size() > 64) { if(futures.size() > 64) {
while (futures.isNotEmpty()) { while(futures.isNotEmpty()) {
try { try {
futures.remove(0).get(); futures.remove(0).get();
} catch (InterruptedException | ExecutionException e) { } catch(InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -248,7 +254,7 @@ public class CommandIris implements DecreeExecutor {
}; };
r.queue(js); r.queue(js);
r.execute(sender()); r.execute(sender());
} catch (Throwable e) { } catch(Throwable e) {
sender().sendMessage("Unable to parse view-distance"); sender().sendMessage("Unable to parse view-distance");
} }
}); });
@ -268,8 +274,8 @@ public class CommandIris implements DecreeExecutor {
@Param(description = "Should Iris download the pack again for you", defaultValue = "false", name = "fresh-download", aliases = {"fresh", "new"}) @Param(description = "Should Iris download the pack again for you", defaultValue = "false", name = "fresh-download", aliases = {"fresh", "new"})
boolean freshDownload boolean freshDownload
) { ) {
if (!confirm) { if(!confirm) {
sender().sendMessage(new String[]{ sender().sendMessage(new String[] {
C.RED + "You should always make a backup before using this", 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 + "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 + " - Broken chunks (cut-offs) between old and new chunks (before & after the update)",
@ -286,7 +292,7 @@ public class CommandIris implements DecreeExecutor {
File folder = world.getWorldFolder(); File folder = world.getWorldFolder();
folder.mkdirs(); folder.mkdirs();
if (freshDownload) { if(freshDownload) {
Iris.service(StudioSVC.class).downloadSearch(sender(), pack.getLoadKey(), false, true); Iris.service(StudioSVC.class).downloadSearch(sender(), pack.getLoadKey(), false, true);
} }

View File

@ -71,7 +71,7 @@ public class CommandJigsaw implements DecreeExecutor {
) { ) {
IrisObject o = IrisData.loadAnyObject(object); IrisObject o = IrisData.loadAnyObject(object);
if (object == null) { if(object == null) {
sender().sendMessage(C.RED + "Failed to find existing object"); sender().sendMessage(C.RED + "Failed to find existing object");
return; return;
} }
@ -88,7 +88,7 @@ public class CommandJigsaw implements DecreeExecutor {
public void exit() { public void exit() {
JigsawEditor editor = JigsawEditor.editors.get(player()); JigsawEditor editor = JigsawEditor.editors.get(player());
if (editor == null) { if(editor == null) {
sender().sendMessage(C.GOLD + "You don't have any pieces open to exit!"); sender().sendMessage(C.GOLD + "You don't have any pieces open to exit!");
return; return;
} }
@ -101,7 +101,7 @@ public class CommandJigsaw implements DecreeExecutor {
public void save() { public void save() {
JigsawEditor editor = JigsawEditor.editors.get(player()); JigsawEditor editor = JigsawEditor.editors.get(player());
if (editor == null) { if(editor == null) {
sender().sendMessage(C.GOLD + "You don't have any pieces open to save!"); sender().sendMessage(C.GOLD + "You don't have any pieces open to save!");
return; return;
} }

View File

@ -91,7 +91,7 @@ public class CommandObject implements DecreeExecutor {
Block block = world.getBlockAt(x, y, z); Block block = world.getBlockAt(x, y, z);
//Prevent blocks being set in or bellow bedrock //Prevent blocks being set in or bellow bedrock
if (y <= world.getMinHeight() || block.getType() == Material.BEDROCK) return; if(y <= world.getMinHeight() || block.getType() == Material.BEDROCK) return;
futureBlockChanges.put(block, block.getBlockData()); futureBlockChanges.put(block, block.getBlockData());
@ -160,19 +160,19 @@ public class CommandObject implements DecreeExecutor {
Map<Material, Set<BlockData>> unsorted = new HashMap<>(); Map<Material, Set<BlockData>> unsorted = new HashMap<>();
Map<BlockData, Integer> amounts = new HashMap<>(); Map<BlockData, Integer> amounts = new HashMap<>();
Map<Material, Integer> materials = new HashMap<>(); Map<Material, Integer> materials = new HashMap<>();
while (queue.hasNext()) { while(queue.hasNext()) {
BlockData block = queue.next(); BlockData block = queue.next();
//unsorted.put(block.getMaterial(), block); //unsorted.put(block.getMaterial(), block);
if (!amounts.containsKey(block)) { if(!amounts.containsKey(block)) {
amounts.put(block, 1); amounts.put(block, 1);
} else } else
amounts.put(block, amounts.get(block) + 1); amounts.put(block, amounts.get(block) + 1);
if (!materials.containsKey(block.getMaterial())) { if(!materials.containsKey(block.getMaterial())) {
materials.put(block.getMaterial(), 1); materials.put(block.getMaterial(), 1);
unsorted.put(block.getMaterial(), new HashSet<>()); unsorted.put(block.getMaterial(), new HashSet<>());
unsorted.get(block.getMaterial()).add(block); unsorted.get(block.getMaterial()).add(block);
@ -190,7 +190,7 @@ public class CommandObject implements DecreeExecutor {
sender().sendMessage("== Blocks in object =="); sender().sendMessage("== Blocks in object ==");
int n = 0; int n = 0;
for (Material mat : sortedMats) { for(Material mat : sortedMats) {
int amount = materials.get(mat); int amount = materials.get(mat);
List<BlockData> set = new ArrayList<>(unsorted.get(mat)); List<BlockData> set = new ArrayList<>(unsorted.get(mat));
set.sort(Comparator.comparingInt(amounts::get).reversed()); set.sort(Comparator.comparingInt(amounts::get).reversed());
@ -198,7 +198,7 @@ public class CommandObject implements DecreeExecutor {
int dataAmount = amounts.get(data); int dataAmount = amounts.get(data);
String string = " - " + mat.toString() + "*" + amount; String string = " - " + mat.toString() + "*" + amount;
if (data.getAsString(true).contains("[")) { if(data.getAsString(true).contains("[")) {
string = string + " --> [" + data.getAsString(true).split("\\[")[1] string = string + " --> [" + data.getAsString(true).split("\\[")[1]
.replaceAll("true", ChatColor.GREEN + "true" + ChatColor.GRAY) .replaceAll("true", ChatColor.GREEN + "true" + ChatColor.GRAY)
.replaceAll("false", ChatColor.RED + "false" + ChatColor.GRAY) + "*" + dataAmount; .replaceAll("false", ChatColor.RED + "false" + ChatColor.GRAY) + "*" + dataAmount;
@ -208,7 +208,7 @@ public class CommandObject implements DecreeExecutor {
n++; n++;
if (n >= 10) { if(n >= 10) {
sender().sendMessage(" + " + (sortedMats.size() - n) + " other block types"); sender().sendMessage(" + " + (sortedMats.size() - n) + " other block types");
return; return;
} }
@ -226,7 +226,7 @@ public class CommandObject implements DecreeExecutor {
@Param(description = "The amount to inset by", defaultValue = "1") @Param(description = "The amount to inset by", defaultValue = "1")
int amount int amount
) { ) {
if (!WandSVC.isHoldingWand(player())) { if(!WandSVC.isHoldingWand(player())) {
sender().sendMessage("Hold your wand."); sender().sendMessage("Hold your wand.");
return; return;
} }
@ -251,17 +251,17 @@ public class CommandObject implements DecreeExecutor {
@Param(description = "Whether to use your current position, or where you look", defaultValue = "true") @Param(description = "Whether to use your current position, or where you look", defaultValue = "true")
boolean here boolean here
) { ) {
if (!WandSVC.isHoldingWand(player())) { if(!WandSVC.isHoldingWand(player())) {
sender().sendMessage("Ready your Wand."); sender().sendMessage("Ready your Wand.");
return; return;
} }
ItemStack wand = player().getInventory().getItemInMainHand(); ItemStack wand = player().getInventory().getItemInMainHand();
if (WandSVC.isWand(wand)) { if(WandSVC.isWand(wand)) {
Location[] g = WandSVC.getCuboid(wand); Location[] g = WandSVC.getCuboid(wand);
if (!here) { if(!here) {
// TODO: WARNING HEIGHT // TODO: WARNING HEIGHT
g[1] = player().getTargetBlock(null, 256).getLocation().clone(); g[1] = player().getTargetBlock(null, 256).getLocation().clone();
} else { } else {
@ -276,17 +276,17 @@ public class CommandObject implements DecreeExecutor {
@Param(description = "Whether to use your current position, or where you look", defaultValue = "true") @Param(description = "Whether to use your current position, or where you look", defaultValue = "true")
boolean here boolean here
) { ) {
if (!WandSVC.isHoldingWand(player())) { if(!WandSVC.isHoldingWand(player())) {
sender().sendMessage("Ready your Wand."); sender().sendMessage("Ready your Wand.");
return; return;
} }
ItemStack wand = player().getInventory().getItemInMainHand(); ItemStack wand = player().getInventory().getItemInMainHand();
if (WandSVC.isWand(wand)) { if(WandSVC.isWand(wand)) {
Location[] g = WandSVC.getCuboid(wand); Location[] g = WandSVC.getCuboid(wand);
if (!here) { if(!here) {
// TODO: WARNING HEIGHT // TODO: WARNING HEIGHT
g[0] = player().getTargetBlock(null, 256).getLocation().clone(); g[0] = player().getTargetBlock(null, 256).getLocation().clone();
} else { } else {
@ -312,7 +312,7 @@ public class CommandObject implements DecreeExecutor {
) { ) {
IrisObject o = IrisData.loadAnyObject(object); IrisObject o = IrisData.loadAnyObject(object);
double maxScale = Double.max(10 - o.getBlocks().size() / 10000d, 1); double maxScale = Double.max(10 - o.getBlocks().size() / 10000d, 1);
if (scale > maxScale) { if(scale > maxScale) {
sender().sendMessage(C.YELLOW + "Indicated scale exceeds maximum. Downscaled to maximum: " + maxScale); sender().sendMessage(C.YELLOW + "Indicated scale exceeds maximum. Downscaled to maximum: " + maxScale);
scale = maxScale; scale = maxScale;
} }
@ -332,16 +332,16 @@ public class CommandObject implements DecreeExecutor {
Iris.service(ObjectSVC.class).addChanges(futureChanges); Iris.service(ObjectSVC.class).addChanges(futureChanges);
if (edit) { if(edit) {
ItemStack newWand = WandSVC.createWand(block.clone().subtract(o.getCenter()).add(o.getW() - 1, ItemStack newWand = WandSVC.createWand(block.clone().subtract(o.getCenter()).add(o.getW() - 1,
o.getH() + o.getCenter().clone().getY() - 1, o.getD() - 1), block.clone().subtract(o.getCenter().clone().setY(0))); o.getH() + o.getCenter().clone().getY() - 1, o.getD() - 1), block.clone().subtract(o.getCenter().clone().setY(0)));
if (WandSVC.isWand(wand)) { if(WandSVC.isWand(wand)) {
wand = newWand; wand = newWand;
player().getInventory().setItemInMainHand(wand); player().getInventory().setItemInMainHand(wand);
sender().sendMessage("Updated wand for " + "objects/" + o.getLoadKey() + ".iob "); sender().sendMessage("Updated wand for " + "objects/" + o.getLoadKey() + ".iob ");
} else { } else {
int slot = WandSVC.findWand(player().getInventory()); int slot = WandSVC.findWand(player().getInventory());
if (slot == -1) { if(slot == -1) {
player().getInventory().addItem(newWand); player().getInventory().addItem(newWand);
sender().sendMessage("Given new wand for " + "objects/" + o.getLoadKey() + ".iob "); sender().sendMessage("Given new wand for " + "objects/" + o.getLoadKey() + ".iob ");
} else { } else {
@ -365,20 +365,20 @@ public class CommandObject implements DecreeExecutor {
) { ) {
IrisObject o = WandSVC.createSchematic(player().getInventory().getItemInMainHand()); IrisObject o = WandSVC.createSchematic(player().getInventory().getItemInMainHand());
if (o == null) { if(o == null) {
sender().sendMessage(C.YELLOW + "You need to hold your wand!"); sender().sendMessage(C.YELLOW + "You need to hold your wand!");
return; return;
} }
File file = Iris.service(StudioSVC.class).getWorkspaceFile(dimension.getLoadKey(), "objects", name + ".iob"); File file = Iris.service(StudioSVC.class).getWorkspaceFile(dimension.getLoadKey(), "objects", name + ".iob");
if (file.exists() && !overwrite) { if(file.exists() && !overwrite) {
sender().sendMessage(C.RED + "File already exists. Set overwrite=true to overwrite it."); sender().sendMessage(C.RED + "File already exists. Set overwrite=true to overwrite it.");
return; return;
} }
try { try {
o.write(file); o.write(file);
} catch (IOException e) { } catch(IOException e) {
sender().sendMessage(C.RED + "Failed to save object because of an IOException: " + e.getMessage()); sender().sendMessage(C.RED + "Failed to save object because of an IOException: " + e.getMessage());
Iris.reportError(e); Iris.reportError(e);
} }
@ -392,7 +392,7 @@ public class CommandObject implements DecreeExecutor {
@Param(description = "The amount to shift by", defaultValue = "1") @Param(description = "The amount to shift by", defaultValue = "1")
int amount int amount
) { ) {
if (!WandSVC.isHoldingWand(player())) { if(!WandSVC.isHoldingWand(player())) {
sender().sendMessage("Hold your wand."); sender().sendMessage("Hold your wand.");
return; return;
} }
@ -431,7 +431,7 @@ public class CommandObject implements DecreeExecutor {
@Decree(name = "x&y", description = "Autoselect up, down & out", sync = true) @Decree(name = "x&y", description = "Autoselect up, down & out", sync = true)
public void xay() { public void xay() {
if (!WandSVC.isHoldingWand(player())) { if(!WandSVC.isHoldingWand(player())) {
sender().sendMessage(C.YELLOW + "Hold your wand!"); sender().sendMessage(C.YELLOW + "Hold your wand!");
return; return;
} }
@ -444,7 +444,7 @@ public class CommandObject implements DecreeExecutor {
Cuboid cursor = new Cuboid(a1, a2); Cuboid cursor = new Cuboid(a1, a2);
Cuboid cursorx = new Cuboid(a1, a2); Cuboid cursorx = new Cuboid(a1, a2);
while (!cursor.containsOnly(Material.AIR)) { while(!cursor.containsOnly(Material.AIR)) {
a1.add(new org.bukkit.util.Vector(0, 1, 0)); a1.add(new org.bukkit.util.Vector(0, 1, 0));
a2.add(new org.bukkit.util.Vector(0, 1, 0)); a2.add(new org.bukkit.util.Vector(0, 1, 0));
cursor = new Cuboid(a1, a2); cursor = new Cuboid(a1, a2);
@ -453,7 +453,7 @@ public class CommandObject implements DecreeExecutor {
a1.add(new org.bukkit.util.Vector(0, -1, 0)); a1.add(new org.bukkit.util.Vector(0, -1, 0));
a2.add(new org.bukkit.util.Vector(0, -1, 0)); a2.add(new org.bukkit.util.Vector(0, -1, 0));
while (!cursorx.containsOnly(Material.AIR)) { while(!cursorx.containsOnly(Material.AIR)) {
a1x.add(new org.bukkit.util.Vector(0, -1, 0)); a1x.add(new org.bukkit.util.Vector(0, -1, 0));
a2x.add(new org.bukkit.util.Vector(0, -1, 0)); a2x.add(new org.bukkit.util.Vector(0, -1, 0));
cursorx = new Cuboid(a1x, a2x); cursorx = new Cuboid(a1x, a2x);
@ -478,7 +478,7 @@ public class CommandObject implements DecreeExecutor {
@Decree(name = "x+y", description = "Autoselect up & out", sync = true) @Decree(name = "x+y", description = "Autoselect up & out", sync = true)
public void xpy() { public void xpy() {
if (!WandSVC.isHoldingWand(player())) { if(!WandSVC.isHoldingWand(player())) {
sender().sendMessage(C.YELLOW + "Hold your wand!"); sender().sendMessage(C.YELLOW + "Hold your wand!");
return; return;
} }
@ -490,7 +490,7 @@ public class CommandObject implements DecreeExecutor {
Location a2 = b[1].clone(); Location a2 = b[1].clone();
Cuboid cursor = new Cuboid(a1, a2); Cuboid cursor = new Cuboid(a1, a2);
while (!cursor.containsOnly(Material.AIR)) { while(!cursor.containsOnly(Material.AIR)) {
a1.add(new Vector(0, 1, 0)); a1.add(new Vector(0, 1, 0));
a2.add(new Vector(0, 1, 0)); a2.add(new Vector(0, 1, 0));
cursor = new Cuboid(a1, a2); cursor = new Cuboid(a1, a2);

View File

@ -42,7 +42,7 @@ public class CommandPregen implements DecreeExecutor {
Vector center Vector center
) { ) {
try { try {
if (sender().isPlayer() && access() == null) { if(sender().isPlayer() && access() == null) {
sender().sendMessage(C.RED + "The engine access for this world is 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."); sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example.");
} }
@ -57,7 +57,7 @@ public class CommandPregen implements DecreeExecutor {
String msg = C.GREEN + "Pregen started in " + C.GOLD + world.getName() + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ(); String msg = C.GREEN + "Pregen started in " + C.GOLD + world.getName() + 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); sender().sendMessage(msg);
Iris.info(msg); Iris.info(msg);
} catch (Throwable e) { } catch(Throwable e) {
sender().sendMessage(C.RED + "Epic fail. See console."); sender().sendMessage(C.RED + "Epic fail. See console.");
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
@ -66,7 +66,7 @@ public class CommandPregen implements DecreeExecutor {
@Decree(description = "Stop the active pregeneration task", aliases = "x") @Decree(description = "Stop the active pregeneration task", aliases = "x")
public void stop() { public void stop() {
if (PregeneratorJob.shutdownInstance()) { if(PregeneratorJob.shutdownInstance()) {
sender().sendMessage(C.GREEN + "Stopped pregeneration task"); sender().sendMessage(C.GREEN + "Stopped pregeneration task");
} else { } else {
sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop"); sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop");
@ -75,7 +75,7 @@ public class CommandPregen implements DecreeExecutor {
@Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"}) @Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"})
public void pause() { public void pause() {
if (PregeneratorJob.pauseResume()) { if(PregeneratorJob.pauseResume()) {
sender().sendMessage(C.GREEN + "Paused/unpaused pregeneration task, now: " + (PregeneratorJob.isPaused() ? "Paused" : "Running") + "."); sender().sendMessage(C.GREEN + "Paused/unpaused pregeneration task, now: " + (PregeneratorJob.isPaused() ? "Paused" : "Running") + ".");
} else { } else {
sender().sendMessage(C.YELLOW + "No active pregeneration tasks to pause/unpause."); sender().sendMessage(C.YELLOW + "No active pregeneration tasks to pause/unpause.");

View File

@ -23,7 +23,6 @@ import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.gui.NoiseExplorerGUI; import com.volmit.iris.core.gui.NoiseExplorerGUI;
import com.volmit.iris.core.gui.VisionGUI; import com.volmit.iris.core.gui.VisionGUI;
import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.loader.IrisRegistrant;
import com.volmit.iris.core.project.IrisProject; import com.volmit.iris.core.project.IrisProject;
import com.volmit.iris.core.service.ConversionSVC; import com.volmit.iris.core.service.ConversionSVC;
import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.service.StudioSVC;
@ -82,7 +81,6 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.util.BlockVector; import org.bukkit.util.BlockVector;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.awt.Desktop;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
@ -102,6 +100,7 @@ public class CommandStudio implements DecreeExecutor {
public static String hrf(Duration duration) { public static String hrf(Duration duration) {
return duration.toString().substring(2).replaceAll("(\\d[HMS])(?!$)", "$1 ").toLowerCase(); return duration.toString().substring(2).replaceAll("(\\d[HMS])(?!$)", "$1 ").toLowerCase();
} }
private CommandFind find; private CommandFind find;
private CommandEdit edit; private CommandEdit edit;
@ -141,7 +140,7 @@ public class CommandStudio implements DecreeExecutor {
@Decree(description = "Close an open studio project", aliases = {"x", "c"}, sync = true) @Decree(description = "Close an open studio project", aliases = {"x", "c"}, sync = true)
public void close() { public void close() {
if (!Iris.service(StudioSVC.class).isProjectOpen()) { if(!Iris.service(StudioSVC.class).isProjectOpen()) {
sender().sendMessage(C.RED + "No open studio projects."); sender().sendMessage(C.RED + "No open studio projects.");
return; return;
} }
@ -156,7 +155,7 @@ public class CommandStudio implements DecreeExecutor {
String name, String name,
@Param(description = "Copy the contents of an existing project in your packs folder and use it as a template in this new project.", contextual = true) @Param(description = "Copy the contents of an existing project in your packs folder and use it as a template in this new project.", contextual = true)
IrisDimension template) { IrisDimension template) {
if (template != null) { if(template != null) {
Iris.service(StudioSVC.class).create(sender(), name, template.getLoadKey()); Iris.service(StudioSVC.class).create(sender(), name, template.getLoadKey());
} else { } else {
Iris.service(StudioSVC.class).create(sender(), name); Iris.service(StudioSVC.class).create(sender(), name);
@ -183,7 +182,7 @@ public class CommandStudio implements DecreeExecutor {
MultiBurst burst = MultiBurst.burst; MultiBurst burst = MultiBurst.burst;
jobs.add(new SingleJob("Updating Workspace", () -> { jobs.add(new SingleJob("Updating Workspace", () -> {
if (!new IrisProject(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey())).updateWorkspace()) { if(!new IrisProject(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey())).updateWorkspace()) {
sender().sendMessage(C.GOLD + "Invalid project: " + project.getLoadKey() + ". Try deleting the code-workspace file and try again."); sender().sendMessage(C.GOLD + "Invalid project: " + project.getLoadKey() + ". Try deleting the code-workspace file and try again.");
} }
J.sleep(250); J.sleep(250);
@ -191,7 +190,7 @@ public class CommandStudio implements DecreeExecutor {
sender().sendMessage("Files: " + files.size()); sender().sendMessage("Files: " + files.size());
if (fixIds) { if(fixIds) {
QueueJob<File> r = new QueueJob<>() { QueueJob<File> r = new QueueJob<>() {
@Override @Override
public void execute(File f) { public void execute(File f) {
@ -201,7 +200,7 @@ public class CommandStudio implements DecreeExecutor {
J.sleep(1); J.sleep(1);
IO.writeAll(f, p.toString(4)); IO.writeAll(f, p.toString(4));
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -216,7 +215,7 @@ public class CommandStudio implements DecreeExecutor {
jobs.add(r); jobs.add(r);
} }
if (beautify) { if(beautify) {
QueueJob<File> r = new QueueJob<>() { QueueJob<File> r = new QueueJob<>() {
@Override @Override
public void execute(File f) { public void execute(File f) {
@ -224,7 +223,7 @@ public class CommandStudio implements DecreeExecutor {
JSONObject p = new JSONObject(IO.readAll(f)); JSONObject p = new JSONObject(IO.readAll(f));
IO.writeAll(f, p.toString(4)); IO.writeAll(f, p.toString(4));
J.sleep(1); J.sleep(1);
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -239,7 +238,7 @@ public class CommandStudio implements DecreeExecutor {
jobs.add(r); jobs.add(r);
} }
if (rewriteObjects) { if(rewriteObjects) {
QueueJob<Runnable> q = new QueueJob<>() { QueueJob<Runnable> q = new QueueJob<>() {
@Override @Override
public void execute(Runnable runnable) { public void execute(Runnable runnable) {
@ -254,20 +253,20 @@ public class CommandStudio implements DecreeExecutor {
}; };
IrisData data = IrisData.get(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey())); IrisData data = IrisData.get(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey()));
for (String f : data.getObjectLoader().getPossibleKeys()) { for(String f : data.getObjectLoader().getPossibleKeys()) {
Future<?> gg = burst.complete(() -> { Future<?> gg = burst.complete(() -> {
File ff = data.getObjectLoader().findFile(f); File ff = data.getObjectLoader().findFile(f);
IrisObject oo = new IrisObject(0, 0, 0); IrisObject oo = new IrisObject(0, 0, 0);
try { try {
oo.read(ff); oo.read(ff);
} catch (Throwable e) { } catch(Throwable e) {
Iris.error("FAILER TO READ: " + f); Iris.error("FAILER TO READ: " + f);
return; return;
} }
try { try {
oo.write(ff); oo.write(ff);
} catch (IOException e) { } catch(IOException e) {
Iris.error("FAILURE TO WRITE: " + oo.getLoadFile()); Iris.error("FAILURE TO WRITE: " + oo.getLoadFile());
} }
}); });
@ -275,7 +274,7 @@ public class CommandStudio implements DecreeExecutor {
q.queue(() -> { q.queue(() -> {
try { try {
gg.get(); gg.get();
} catch (InterruptedException | ExecutionException e) { } catch(InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
} }
}); });
@ -301,7 +300,6 @@ public class CommandStudio implements DecreeExecutor {
} }
@Decree(description = "Execute a script", aliases = "run", origin = DecreeOrigin.PLAYER) @Decree(description = "Execute a script", aliases = "run", origin = DecreeOrigin.PLAYER)
public void execute( public void execute(
@Param(description = "The script to run") @Param(description = "The script to run")
@ -312,14 +310,14 @@ public class CommandStudio implements DecreeExecutor {
@Decree(description = "Open the noise explorer (External GUI)", aliases = {"nmap", "n"}) @Decree(description = "Open the noise explorer (External GUI)", aliases = {"nmap", "n"})
public void noise() { public void noise() {
if (noGUI()) return; if(noGUI()) return;
sender().sendMessage(C.GREEN + "Opening Noise Explorer!"); sender().sendMessage(C.GREEN + "Opening Noise Explorer!");
NoiseExplorerGUI.launch(); NoiseExplorerGUI.launch();
} }
@Decree(description = "Charges all spawners in the area", aliases = "zzt", origin = DecreeOrigin.PLAYER) @Decree(description = "Charges all spawners in the area", aliases = "zzt", origin = DecreeOrigin.PLAYER)
public void charge() { public void charge() {
if (!IrisToolbelt.isIrisWorld(world())) { if(!IrisToolbelt.isIrisWorld(world())) {
sender().sendMessage(C.RED + "You must be in an Iris world to charge spawners!"); sender().sendMessage(C.RED + "You must be in an Iris world to charge spawners!");
return; return;
} }
@ -334,12 +332,12 @@ public class CommandStudio implements DecreeExecutor {
@Param(description = "The seed to generate with", defaultValue = "12345") @Param(description = "The seed to generate with", defaultValue = "12345")
long seed long seed
) { ) {
if (noGUI()) return; if(noGUI()) return;
sender().sendMessage(C.GREEN + "Opening Noise Explorer!"); sender().sendMessage(C.GREEN + "Opening Noise Explorer!");
Supplier<Function2<Double, Double, Double>> l = () -> { Supplier<Function2<Double, Double, Double>> l = () -> {
if (generator == null) { if(generator == null) {
return (x, z) -> 0D; return (x, z) -> 0D;
} }
@ -350,7 +348,7 @@ public class CommandStudio implements DecreeExecutor {
@Decree(description = "Hotload a studio", aliases = {"reload", "h"}) @Decree(description = "Hotload a studio", aliases = {"reload", "h"})
public void hotload() { public void hotload() {
if (!Iris.service(StudioSVC.class).isProjectOpen()) { if(!Iris.service(StudioSVC.class).isProjectOpen()) {
sender().sendMessage(C.RED + "No studio world open!"); sender().sendMessage(C.RED + "No studio world open!");
return; return;
} }
@ -365,14 +363,14 @@ public class CommandStudio implements DecreeExecutor {
@Param(description = "Whether or not to append to the inventory currently open (if false, clears opened inventory)", defaultValue = "true") @Param(description = "Whether or not to append to the inventory currently open (if false, clears opened inventory)", defaultValue = "true")
boolean add boolean add
) { ) {
if (noStudio()) return; if(noStudio()) return;
KList<IrisLootTable> tables = engine().getLootTables(RNG.r, player().getLocation().getBlock()); KList<IrisLootTable> tables = engine().getLootTables(RNG.r, player().getLocation().getBlock());
Inventory inv = Bukkit.createInventory(null, 27 * 2); Inventory inv = Bukkit.createInventory(null, 27 * 2);
try { try {
engine().addItems(true, inv, RNG.r, tables, InventorySlotType.STORAGE, player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ(), 1); engine().addItems(true, inv, RNG.r, tables, InventorySlotType.STORAGE, player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ(), 1);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage(C.RED + "Cannot add items to virtual inventory because of: " + e.getMessage()); sender().sendMessage(C.RED + "Cannot add items to virtual inventory because of: " + e.getMessage());
return; return;
@ -384,13 +382,13 @@ public class CommandStudio implements DecreeExecutor {
ta.set(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, () -> ta.set(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, () ->
{ {
if (!player().getOpenInventory().getType().equals(InventoryType.CHEST)) { if(!player().getOpenInventory().getType().equals(InventoryType.CHEST)) {
Bukkit.getScheduler().cancelTask(ta.get()); Bukkit.getScheduler().cancelTask(ta.get());
sender().sendMessage(C.GREEN + "Opened inventory!"); sender().sendMessage(C.GREEN + "Opened inventory!");
return; return;
} }
if (!add) { if(!add) {
inv.clear(); inv.clear();
} }
@ -406,9 +404,9 @@ public class CommandStudio implements DecreeExecutor {
@Param(name = "world", description = "The world to open the generator for", contextual = true) @Param(name = "world", description = "The world to open the generator for", contextual = true)
World world World world
) { ) {
if (noGUI()) return; if(noGUI()) return;
if (!IrisToolbelt.isIrisWorld(world)) { if(!IrisToolbelt.isIrisWorld(world)) {
sender().sendMessage(C.RED + "You need to be in or specify an Iris-generated world!"); sender().sendMessage(C.RED + "You need to be in or specify an Iris-generated world!");
return; return;
} }
@ -449,17 +447,17 @@ public class CommandStudio implements DecreeExecutor {
sender().sendMessage("Calculating Performance Metrics for Noise generators"); sender().sendMessage("Calculating Performance Metrics for Noise generators");
for (NoiseStyle i : NoiseStyle.values()) { for(NoiseStyle i : NoiseStyle.values()) {
CNG c = i.create(new RNG(i.hashCode())); CNG c = i.create(new RNG(i.hashCode()));
for (int j = 0; j < 3000; j++) { for(int j = 0; j < 3000; j++) {
c.noise(j, j + 1000, j * j); c.noise(j, j + 1000, j * j);
c.noise(j, -j); c.noise(j, -j);
} }
PrecisionStopwatch px = PrecisionStopwatch.start(); PrecisionStopwatch px = PrecisionStopwatch.start();
for (int j = 0; j < 100000; j++) { for(int j = 0; j < 100000; j++) {
c.noise(j, j + 1000, j * j); c.noise(j, j + 1000, j * j);
c.noise(j, -j); c.noise(j, -j);
} }
@ -469,7 +467,7 @@ public class CommandStudio implements DecreeExecutor {
fileText.add("Noise Style Performance Impacts: "); fileText.add("Noise Style Performance Impacts: ");
for (NoiseStyle i : styleTimings.sortKNumber()) { for(NoiseStyle i : styleTimings.sortKNumber()) {
fileText.add(i.name() + ": " + styleTimings.get(i)); fileText.add(i.name() + ": " + styleTimings.get(i));
} }
@ -477,20 +475,20 @@ public class CommandStudio implements DecreeExecutor {
sender().sendMessage("Calculating Interpolator Timings..."); sender().sendMessage("Calculating Interpolator Timings...");
for (InterpolationMethod i : InterpolationMethod.values()) { for(InterpolationMethod i : InterpolationMethod.values()) {
IrisInterpolator in = new IrisInterpolator(); IrisInterpolator in = new IrisInterpolator();
in.setFunction(i); in.setFunction(i);
in.setHorizontalScale(8); in.setHorizontalScale(8);
NoiseProvider np = (x, z) -> Math.random(); NoiseProvider np = (x, z) -> Math.random();
for (int j = 0; j < 3000; j++) { for(int j = 0; j < 3000; j++) {
in.interpolate(j, -j, np); in.interpolate(j, -j, np);
} }
PrecisionStopwatch px = PrecisionStopwatch.start(); PrecisionStopwatch px = PrecisionStopwatch.start();
for (int j = 0; j < 100000; j++) { for(int j = 0; j < 100000; j++) {
in.interpolate(j + 10000, -j - 100000, np); in.interpolate(j + 10000, -j - 100000, np);
} }
@ -499,7 +497,7 @@ public class CommandStudio implements DecreeExecutor {
fileText.add("Noise Interpolator Performance Impacts: "); fileText.add("Noise Interpolator Performance Impacts: ");
for (InterpolationMethod i : interpolatorTimings.sortKNumber()) { for(InterpolationMethod i : interpolatorTimings.sortKNumber()) {
fileText.add(i.name() + ": " + interpolatorTimings.get(i)); fileText.add(i.name() + ": " + interpolatorTimings.get(i));
} }
@ -509,13 +507,13 @@ public class CommandStudio implements DecreeExecutor {
KMap<String, KList<String>> btx = new KMap<>(); KMap<String, KList<String>> btx = new KMap<>();
for (String i : data.getGeneratorLoader().getPossibleKeys()) { for(String i : data.getGeneratorLoader().getPossibleKeys()) {
KList<String> vv = new KList<>(); KList<String> vv = new KList<>();
IrisGenerator g = data.getGeneratorLoader().load(i); IrisGenerator g = data.getGeneratorLoader().load(i);
KList<IrisNoiseGenerator> composites = g.getAllComposites(); KList<IrisNoiseGenerator> composites = g.getAllComposites();
double score = 0; double score = 0;
int m = 0; int m = 0;
for (IrisNoiseGenerator j : composites) { for(IrisNoiseGenerator j : composites) {
m++; m++;
score += styleTimings.get(j.getStyle().getStyle()); score += styleTimings.get(j.getStyle().getStyle());
vv.add("Composite Noise Style " + m + " " + j.getStyle().getStyle().name() + ": " + styleTimings.get(j.getStyle().getStyle())); vv.add("Composite Noise Style " + m + " " + j.getStyle().getStyle().name() + ": " + styleTimings.get(j.getStyle().getStyle()));
@ -529,7 +527,7 @@ public class CommandStudio implements DecreeExecutor {
fileText.add("Project Generator Performance Impacts: "); fileText.add("Project Generator Performance Impacts: ");
for (String i : generatorTimings.sortKNumber()) { for(String i : generatorTimings.sortKNumber()) {
fileText.add(i + ": " + generatorTimings.get(i)); fileText.add(i + ": " + generatorTimings.get(i));
btx.get(i).forEach((ii) -> fileText.add(" " + ii)); btx.get(i).forEach((ii) -> fileText.add(" " + ii));
@ -539,13 +537,13 @@ public class CommandStudio implements DecreeExecutor {
KMap<String, KList<String>> bt = new KMap<>(); KMap<String, KList<String>> bt = new KMap<>();
for (String i : data.getBiomeLoader().getPossibleKeys()) { for(String i : data.getBiomeLoader().getPossibleKeys()) {
KList<String> vv = new KList<>(); KList<String> vv = new KList<>();
IrisBiome b = data.getBiomeLoader().load(i); IrisBiome b = data.getBiomeLoader().load(i);
double score = 0; double score = 0;
int m = 0; int m = 0;
for (IrisBiomePaletteLayer j : b.getLayers()) { for(IrisBiomePaletteLayer j : b.getLayers()) {
m++; m++;
score += styleTimings.get(j.getStyle().getStyle()); score += styleTimings.get(j.getStyle().getStyle());
vv.add("Palette Layer " + m + ": " + styleTimings.get(j.getStyle().getStyle())); vv.add("Palette Layer " + m + ": " + styleTimings.get(j.getStyle().getStyle()));
@ -561,7 +559,7 @@ public class CommandStudio implements DecreeExecutor {
fileText.add("Project Biome Performance Impacts: "); fileText.add("Project Biome Performance Impacts: ");
for (String i : biomeTimings.sortKNumber()) { for(String i : biomeTimings.sortKNumber()) {
fileText.add(i + ": " + biomeTimings.get(i)); fileText.add(i + ": " + biomeTimings.get(i));
bt.get(i).forEach((ff) -> fileText.add(" " + ff)); bt.get(i).forEach((ff) -> fileText.add(" " + ff));
@ -569,7 +567,7 @@ public class CommandStudio implements DecreeExecutor {
fileText.add(""); fileText.add("");
for (String i : data.getRegionLoader().getPossibleKeys()) { for(String i : data.getRegionLoader().getPossibleKeys()) {
IrisRegion b = data.getRegionLoader().load(i); IrisRegion b = data.getRegionLoader().load(i);
double score = 0; double score = 0;
@ -580,25 +578,25 @@ public class CommandStudio implements DecreeExecutor {
fileText.add("Project Region Performance Impacts: "); fileText.add("Project Region Performance Impacts: ");
for (String i : regionTimings.sortKNumber()) { for(String i : regionTimings.sortKNumber()) {
fileText.add(i + ": " + regionTimings.get(i)); fileText.add(i + ": " + regionTimings.get(i));
} }
fileText.add(""); fileText.add("");
double m = 0; double m = 0;
for (double i : biomeTimings.v()) { for(double i : biomeTimings.v()) {
m += i; m += i;
} }
m /= biomeTimings.size(); m /= biomeTimings.size();
double mm = 0; double mm = 0;
for (double i : generatorTimings.v()) { for(double i : generatorTimings.v()) {
mm += i; mm += i;
} }
mm /= generatorTimings.size(); mm /= generatorTimings.size();
m += mm; m += mm;
double mmm = 0; double mmm = 0;
for (double i : regionTimings.v()) { for(double i : regionTimings.v()) {
mmm += i; mmm += i;
} }
mmm /= regionTimings.size(); mmm /= regionTimings.size();
@ -609,7 +607,7 @@ public class CommandStudio implements DecreeExecutor {
try { try {
IO.writeAll(report, fileText.toString("\n")); IO.writeAll(report, fileText.toString("\n"));
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -624,7 +622,7 @@ public class CommandStudio implements DecreeExecutor {
@Param(description = "The location at which to spawn the entity", defaultValue = "self") @Param(description = "The location at which to spawn the entity", defaultValue = "self")
Vector location Vector location
) { ) {
if (!sender().isPlayer()) { if(!sender().isPlayer()) {
sender().sendMessage(C.RED + "Players only (this is a config error. Ask support to add DecreeOrigin.PLAYER to the command you tried to run)"); sender().sendMessage(C.RED + "Players only (this is a config error. Ask support to add DecreeOrigin.PLAYER to the command you tried to run)");
return; return;
} }
@ -635,12 +633,12 @@ public class CommandStudio implements DecreeExecutor {
@Decree(description = "Teleport to the active studio world", aliases = "stp", origin = DecreeOrigin.PLAYER, sync = true) @Decree(description = "Teleport to the active studio world", aliases = "stp", origin = DecreeOrigin.PLAYER, sync = true)
public void tpstudio() { public void tpstudio() {
if (!Iris.service(StudioSVC.class).isProjectOpen()) { if(!Iris.service(StudioSVC.class).isProjectOpen()) {
sender().sendMessage(C.RED + "No studio world is open!"); sender().sendMessage(C.RED + "No studio world is open!");
return; return;
} }
if (IrisToolbelt.isIrisWorld(world()) && engine().isStudio()) { if(IrisToolbelt.isIrisWorld(world()) && engine().isStudio()) {
sender().sendMessage(C.RED + "You are already in a studio world!"); sender().sendMessage(C.RED + "You are already in a studio world!");
return; return;
} }
@ -656,7 +654,7 @@ public class CommandStudio implements DecreeExecutor {
IrisDimension dimension IrisDimension dimension
) { ) {
sender().sendMessage(C.GOLD + "Updating Code Workspace for " + dimension.getName() + "..."); sender().sendMessage(C.GOLD + "Updating Code Workspace for " + dimension.getName() + "...");
if (new IrisProject(dimension.getLoader().getDataFolder()).updateWorkspace()) { if(new IrisProject(dimension.getLoader().getDataFolder()).updateWorkspace()) {
sender().sendMessage(C.GREEN + "Updated Code Workspace for " + dimension.getName()); sender().sendMessage(C.GREEN + "Updated Code Workspace for " + dimension.getName());
} else { } else {
sender().sendMessage(C.RED + "Invalid project: " + dimension.getName() + ". Try deleting the code-workspace file and try again."); sender().sendMessage(C.RED + "Invalid project: " + dimension.getName() + ". Try deleting the code-workspace file and try again.");
@ -665,14 +663,14 @@ public class CommandStudio implements DecreeExecutor {
@Decree(aliases = "find-objects", description = "Get information about nearby structures") @Decree(aliases = "find-objects", description = "Get information about nearby structures")
public void objects() { public void objects() {
if (!IrisToolbelt.isIrisWorld(player().getWorld())) { if(!IrisToolbelt.isIrisWorld(player().getWorld())) {
sender().sendMessage(C.RED + "You must be in an Iris world"); sender().sendMessage(C.RED + "You must be in an Iris world");
return; return;
} }
World world = player().getWorld(); World world = player().getWorld();
if (!IrisToolbelt.isIrisWorld(world)) { if(!IrisToolbelt.isIrisWorld(world)) {
sender().sendMessage("You must be in an iris world."); sender().sendMessage("You must be in an iris world.");
return; return;
} }
@ -686,7 +684,7 @@ public class CommandStudio implements DecreeExecutor {
int cx = l.getChunk().getX(); int cx = l.getChunk().getX();
int cz = l.getChunk().getZ(); int cz = l.getChunk().getZ();
new Spiraler(3, 3, (x, z) -> chunks.addIfMissing(world.getChunkAt(x + cx, z + cz))).drain(); new Spiraler(3, 3, (x, z) -> chunks.addIfMissing(world.getChunkAt(x + cx, z + cz))).drain();
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -704,7 +702,7 @@ public class CommandStudio implements DecreeExecutor {
pw.println("Report Captured At: " + new Date()); pw.println("Report Captured At: " + new Date());
pw.println("Chunks: (" + chunks.size() + "): "); pw.println("Chunks: (" + chunks.size() + "): ");
for (Chunk i : chunks) { for(Chunk i : chunks) {
pw.println("- [" + i.getX() + ", " + i.getZ() + "]"); pw.println("- [" + i.getX() + ", " + i.getZ() + "]");
} }
@ -713,19 +711,19 @@ public class CommandStudio implements DecreeExecutor {
String age = "No idea..."; String age = "No idea...";
try { try {
for (File i : Objects.requireNonNull(new File(world.getWorldFolder(), "region").listFiles())) { for(File i : Objects.requireNonNull(new File(world.getWorldFolder(), "region").listFiles())) {
if (i.isFile()) { if(i.isFile()) {
size += i.length(); size += i.length();
} }
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
try { try {
FileTime creationTime = (FileTime) Files.getAttribute(world.getWorldFolder().toPath(), "creationTime"); FileTime creationTime = (FileTime) Files.getAttribute(world.getWorldFolder().toPath(), "creationTime");
age = hrf(Duration.of(M.ms() - creationTime.toMillis(), ChronoUnit.MILLIS)); age = hrf(Duration.of(M.ms() - creationTime.toMillis(), ChronoUnit.MILLIS));
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -733,10 +731,10 @@ public class CommandStudio implements DecreeExecutor {
KList<String> caveBiomes = new KList<>(); KList<String> caveBiomes = new KList<>();
KMap<String, KMap<String, KList<String>>> objects = new KMap<>(); KMap<String, KMap<String, KList<String>>> objects = new KMap<>();
for (Chunk i : chunks) { for(Chunk i : chunks) {
for (int j = 0; j < 16; j += 3) { for(int j = 0; j < 16; j += 3) {
for (int k = 0; k < 16; k += 3) { for(int k = 0; k < 16; k += 3) {
assert engine() != null; assert engine() != null;
IrisBiome bb = engine().getSurfaceBiome((i.getX() * 16) + j, (i.getZ() * 16) + k); IrisBiome bb = engine().getSurfaceBiome((i.getX() * 16) + j, (i.getZ() * 16) + k);
@ -763,20 +761,20 @@ public class CommandStudio implements DecreeExecutor {
pw.println("== Biome Info =="); pw.println("== Biome Info ==");
pw.println("Found " + biomes.size() + " Biome(s): "); pw.println("Found " + biomes.size() + " Biome(s): ");
for (String i : biomes) { for(String i : biomes) {
pw.println("- " + i); pw.println("- " + i);
} }
pw.println(); pw.println();
pw.println("== Object Info =="); pw.println("== Object Info ==");
for (String i : objects.k()) { for(String i : objects.k()) {
pw.println("- " + i); pw.println("- " + i);
for (String j : objects.get(i).k()) { for(String j : objects.get(i).k()) {
pw.println(" @ " + j); pw.println(" @ " + j);
for (String k : objects.get(i).get(j)) { for(String k : objects.get(i).get(j)) {
pw.println(" * " + k); pw.println(" * " + k);
} }
} }
@ -786,7 +784,7 @@ public class CommandStudio implements DecreeExecutor {
pw.close(); pw.close();
sender().sendMessage("Reported to: " + ff.getPath()); sender().sendMessage("Reported to: " + ff.getPath());
} catch (FileNotFoundException e) { } catch(FileNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -796,15 +794,15 @@ public class CommandStudio implements DecreeExecutor {
String n1 = bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")"; String n1 = bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")";
int m = 0; int m = 0;
KSet<String> stop = new KSet<>(); KSet<String> stop = new KSet<>();
for (IrisObjectPlacement f : bb.getObjects()) { for(IrisObjectPlacement f : bb.getObjects()) {
m++; m++;
String n2 = "Placement #" + m + " (" + f.getPlace().size() + " possible objects)"; String n2 = "Placement #" + m + " (" + f.getPlace().size() + " possible objects)";
for (String i : f.getPlace()) { for(String i : f.getPlace()) {
String nn3 = i + ": [ERROR] Failed to find object!"; String nn3 = i + ": [ERROR] Failed to find object!";
try { try {
if (stop.contains(i)) { if(stop.contains(i)) {
continue; continue;
} }
@ -812,7 +810,7 @@ public class CommandStudio implements DecreeExecutor {
BlockVector sz = IrisObject.sampleSize(ff); BlockVector sz = IrisObject.sampleSize(ff);
nn3 = i + ": size=[" + sz.getBlockX() + "," + sz.getBlockY() + "," + sz.getBlockZ() + "] location=[" + ff.getPath() + "]"; nn3 = i + ": size=[" + sz.getBlockX() + "," + sz.getBlockY() + "," + sz.getBlockZ() + "] location=[" + ff.getPath() + "]";
stop.add(i); stop.add(i);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -827,7 +825,7 @@ public class CommandStudio implements DecreeExecutor {
* @return true if server GUIs are not enabled * @return true if server GUIs are not enabled
*/ */
private boolean noGUI() { private boolean noGUI() {
if (!IrisSettings.get().getGui().isUseServerLaunchedGuis()) { if(!IrisSettings.get().getGui().isUseServerLaunchedGuis()) {
sender().sendMessage(C.RED + "You must have server launched GUIs enabled in the settings!"); sender().sendMessage(C.RED + "You must have server launched GUIs enabled in the settings!");
return true; return true;
} }
@ -838,15 +836,15 @@ public class CommandStudio implements DecreeExecutor {
* @return true if no studio is open or the player is not in one * @return true if no studio is open or the player is not in one
*/ */
private boolean noStudio() { private boolean noStudio() {
if (!sender().isPlayer()) { if(!sender().isPlayer()) {
sender().sendMessage(C.RED + "Players only!"); sender().sendMessage(C.RED + "Players only!");
return true; return true;
} }
if (!Iris.service(StudioSVC.class).isProjectOpen()) { if(!Iris.service(StudioSVC.class).isProjectOpen()) {
sender().sendMessage(C.RED + "No studio world is open!"); sender().sendMessage(C.RED + "No studio world is open!");
return true; return true;
} }
if (!engine().isStudio()) { if(!engine().isStudio()) {
sender().sendMessage(C.RED + "You must be in a studio world!"); sender().sendMessage(C.RED + "You must be in a studio world!");
return true; return true;
} }
@ -855,14 +853,14 @@ public class CommandStudio implements DecreeExecutor {
public void files(File clean, KList<File> files) { public void files(File clean, KList<File> files) {
if (clean.isDirectory()) { if(clean.isDirectory()) {
for (File i : clean.listFiles()) { for(File i : clean.listFiles()) {
files(i, files); files(i, files);
} }
} else if (clean.getName().endsWith(".json")) { } else if(clean.getName().endsWith(".json")) {
try { try {
files.add(clean); files.add(clean);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.error("Failed to beautify " + clean.getAbsolutePath() + " You may have errors in your json!"); Iris.error("Failed to beautify " + clean.getAbsolutePath() + " You may have errors in your json!");
} }
@ -870,28 +868,28 @@ public class CommandStudio implements DecreeExecutor {
} }
private void fixBlocks(JSONObject obj) { private void fixBlocks(JSONObject obj) {
for (String i : obj.keySet()) { for(String i : obj.keySet()) {
Object o = obj.get(i); Object o = obj.get(i);
if (i.equals("block") && o instanceof String && !o.toString().trim().isEmpty() && !o.toString().contains(":")) { if(i.equals("block") && o instanceof String && !o.toString().trim().isEmpty() && !o.toString().contains(":")) {
obj.put(i, "minecraft:" + o); obj.put(i, "minecraft:" + o);
} }
if (o instanceof JSONObject) { if(o instanceof JSONObject) {
fixBlocks((JSONObject) o); fixBlocks((JSONObject) o);
} else if (o instanceof JSONArray) { } else if(o instanceof JSONArray) {
fixBlocks((JSONArray) o); fixBlocks((JSONArray) o);
} }
} }
} }
private void fixBlocks(JSONArray obj) { private void fixBlocks(JSONArray obj) {
for (int i = 0; i < obj.length(); i++) { for(int i = 0; i < obj.length(); i++) {
Object o = obj.get(i); Object o = obj.get(i);
if (o instanceof JSONObject) { if(o instanceof JSONObject) {
fixBlocks((JSONObject) o); fixBlocks((JSONObject) o);
} else if (o instanceof JSONArray) { } else if(o instanceof JSONArray) {
fixBlocks((JSONArray) o); fixBlocks((JSONArray) o);
} }
} }

View File

@ -45,16 +45,16 @@ public class CommandWhat implements DecreeExecutor {
public void hand() { public void hand() {
try { try {
BlockData bd = player().getInventory().getItemInMainHand().getType().createBlockData(); BlockData bd = player().getInventory().getItemInMainHand().getType().createBlockData();
if (!bd.getMaterial().equals(Material.AIR)) { if(!bd.getMaterial().equals(Material.AIR)) {
sender().sendMessage("Material: " + C.GREEN + bd.getMaterial().name()); sender().sendMessage("Material: " + C.GREEN + bd.getMaterial().name());
sender().sendMessage("Full: " + C.WHITE + bd.getAsString(true)); sender().sendMessage("Full: " + C.WHITE + bd.getAsString(true));
} else { } else {
sender().sendMessage("Please hold a block/item"); sender().sendMessage("Please hold a block/item");
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Material bd = player().getInventory().getItemInMainHand().getType(); Material bd = player().getInventory().getItemInMainHand().getType();
if (!bd.equals(Material.AIR)) { if(!bd.equals(Material.AIR)) {
sender().sendMessage("Material: " + C.GREEN + bd.name()); sender().sendMessage("Material: " + C.GREEN + bd.name());
} else { } else {
sender().sendMessage("Please hold a block/item"); sender().sendMessage("Please hold a block/item");
@ -68,14 +68,14 @@ public class CommandWhat implements DecreeExecutor {
IrisBiome b = engine().getBiome(player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ()); IrisBiome b = engine().getBiome(player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ());
sender().sendMessage("IBiome: " + b.getLoadKey() + " (" + b.getDerivative().name() + ")"); sender().sendMessage("IBiome: " + b.getLoadKey() + " (" + b.getDerivative().name() + ")");
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage("Non-Iris Biome: " + player().getLocation().getBlock().getBiome().name()); sender().sendMessage("Non-Iris Biome: " + player().getLocation().getBlock().getBiome().name());
if (player().getLocation().getBlock().getBiome().equals(Biome.CUSTOM)) { if(player().getLocation().getBlock().getBiome().equals(Biome.CUSTOM)) {
try { try {
sender().sendMessage("Data Pack Biome: " + INMS.get().getTrueBiomeBaseKey(player().getLocation()) + " (ID: " + INMS.get().getTrueBiomeBaseId(INMS.get().getTrueBiomeBase(player().getLocation())) + ")"); sender().sendMessage("Data Pack Biome: " + INMS.get().getTrueBiomeBaseKey(player().getLocation()) + " (ID: " + INMS.get().getTrueBiomeBaseId(INMS.get().getTrueBiomeBase(player().getLocation())) + ")");
} catch (Throwable ee) { } catch(Throwable ee) {
Iris.reportError(ee); Iris.reportError(ee);
} }
} }
@ -87,41 +87,41 @@ public class CommandWhat implements DecreeExecutor {
BlockData bd; BlockData bd;
try { try {
bd = player().getTargetBlockExact(128, FluidCollisionMode.NEVER).getBlockData(); bd = player().getTargetBlockExact(128, FluidCollisionMode.NEVER).getBlockData();
} catch (NullPointerException e) { } catch(NullPointerException e) {
Iris.reportError(e); Iris.reportError(e);
sender().sendMessage("Please look at any block, not at the sky"); sender().sendMessage("Please look at any block, not at the sky");
bd = null; bd = null;
} }
if (bd != null) { if(bd != null) {
sender().sendMessage("Material: " + C.GREEN + bd.getMaterial().name()); sender().sendMessage("Material: " + C.GREEN + bd.getMaterial().name());
sender().sendMessage("Full: " + C.WHITE + bd.getAsString(true)); sender().sendMessage("Full: " + C.WHITE + bd.getAsString(true));
if (B.isStorage(bd)) { if(B.isStorage(bd)) {
sender().sendMessage(C.YELLOW + "* Storage Block (Loot Capable)"); sender().sendMessage(C.YELLOW + "* Storage Block (Loot Capable)");
} }
if (B.isLit(bd)) { if(B.isLit(bd)) {
sender().sendMessage(C.YELLOW + "* Lit Block (Light Capable)"); sender().sendMessage(C.YELLOW + "* Lit Block (Light Capable)");
} }
if (B.isFoliage(bd)) { if(B.isFoliage(bd)) {
sender().sendMessage(C.YELLOW + "* Foliage Block"); sender().sendMessage(C.YELLOW + "* Foliage Block");
} }
if (B.isDecorant(bd)) { if(B.isDecorant(bd)) {
sender().sendMessage(C.YELLOW + "* Decorant Block"); sender().sendMessage(C.YELLOW + "* Decorant Block");
} }
if (B.isFluid(bd)) { if(B.isFluid(bd)) {
sender().sendMessage(C.YELLOW + "* Fluid Block"); sender().sendMessage(C.YELLOW + "* Fluid Block");
} }
if (B.isFoliagePlantable(bd)) { if(B.isFoliagePlantable(bd)) {
sender().sendMessage(C.YELLOW + "* Plantable Foliage Block"); sender().sendMessage(C.YELLOW + "* Plantable Foliage Block");
} }
if (B.isSolid(bd)) { if(B.isSolid(bd)) {
sender().sendMessage(C.YELLOW + "* Solid Block"); sender().sendMessage(C.YELLOW + "* Solid Block");
} }
} }
@ -131,12 +131,12 @@ public class CommandWhat implements DecreeExecutor {
public void markers(@Param(description = "Marker name such as cave_floor or cave_ceiling") String marker) { public void markers(@Param(description = "Marker name such as cave_floor or cave_ceiling") String marker) {
Chunk c = player().getLocation().getChunk(); Chunk c = player().getLocation().getChunk();
if (IrisToolbelt.isIrisWorld(c.getWorld())) { if(IrisToolbelt.isIrisWorld(c.getWorld())) {
int m = 1; int m = 1;
AtomicInteger v = new AtomicInteger(0); AtomicInteger v = new AtomicInteger(0);
for (int xxx = c.getX() - 4; xxx <= c.getX() + 4; xxx++) { for(int xxx = c.getX() - 4; xxx <= c.getX() + 4; xxx++) {
for (int zzz = c.getZ() - 4; zzz <= c.getZ() + 4; zzz++) { for(int zzz = c.getZ() - 4; zzz <= c.getZ() + 4; zzz++) {
IrisToolbelt.access(c.getWorld()).getEngine().getMantle().findMarkers(xxx, zzz, new MatterMarker(marker)) IrisToolbelt.access(c.getWorld()).getEngine().getMantle().findMarkers(xxx, zzz, new MatterMarker(marker))
.convert((i) -> i.toLocation(c.getWorld())).forEach((i) -> { .convert((i) -> i.toLocation(c.getWorld())).forEach((i) -> {
J.s(() -> BlockSignal.of(i.getBlock(), 100)); J.s(() -> BlockSignal.of(i.getBlock(), 100));

View File

@ -52,7 +52,7 @@ public class BlockSignal {
active.decrementAndGet(); active.decrementAndGet();
BlockData type = block.getBlockData(); BlockData type = block.getBlockData();
MultiBurst.burst.lazy(() -> { MultiBurst.burst.lazy(() -> {
for (Player i : block.getWorld().getPlayers()) { for(Player i : block.getWorld().getPlayers()) {
i.sendBlockChange(block.getLocation(), block.getBlockData()); i.sendBlockChange(block.getLocation(), block.getBlockData());
} }
}); });
@ -83,7 +83,7 @@ public class BlockSignal {
new SR(20) { new SR(20) {
@Override @Override
public void run() { public void run() {
if (e.isDead()) { if(e.isDead()) {
cancel(); cancel();
return; return;
} }
@ -99,7 +99,7 @@ public class BlockSignal {
BlockData type = block.getBlockData(); BlockData type = block.getBlockData();
MultiBurst.burst.lazy(() -> { MultiBurst.burst.lazy(() -> {
for (Player i : block.getWorld().getPlayers()) { for(Player i : block.getWorld().getPlayers()) {
i.sendBlockChange(block.getLocation(), block.getBlockData()); i.sendBlockChange(block.getLocation(), block.getBlockData());
} }
}); });

View File

@ -50,11 +50,11 @@ public class DustRevealer {
J.s(() -> { J.s(() -> {
new BlockSignal(world.getBlockAt(block.getX(), block.getY(), block.getZ()), 7); new BlockSignal(world.getBlockAt(block.getX(), block.getY(), block.getZ()), 7);
if (M.r(0.25)) { if(M.r(0.25)) {
world.playSound(block.toBlock(world).getLocation(), Sound.BLOCK_AMETHYST_BLOCK_CHIME, 1f, RNG.r.f(0.2f, 2f)); world.playSound(block.toBlock(world).getLocation(), Sound.BLOCK_AMETHYST_BLOCK_CHIME, 1f, RNG.r.f(0.2f, 2f));
} }
J.a(() -> { J.a(() -> {
while (BlockSignal.active.get() > 128) { while(BlockSignal.active.get() > 128) {
J.sleep(5); J.sleep(5);
} }
@ -85,7 +85,7 @@ public class DustRevealer {
is(new BlockPosition(block.getX() + 1, block.getY() + 1, block.getZ() + 1)); is(new BlockPosition(block.getX() + 1, block.getY() + 1, block.getZ() + 1));
is(new BlockPosition(block.getX() + 1, block.getY() - 1, block.getZ() - 1)); is(new BlockPosition(block.getX() + 1, block.getY() - 1, block.getZ() - 1));
is(new BlockPosition(block.getX() + 1, block.getY() - 1, block.getZ() + 1)); is(new BlockPosition(block.getX() + 1, block.getY() - 1, block.getZ() + 1));
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -97,10 +97,10 @@ public class DustRevealer {
World world = block.getWorld(); World world = block.getWorld();
Engine access = IrisToolbelt.access(world).getEngine(); Engine access = IrisToolbelt.access(world).getEngine();
if (access != null) { if(access != null) {
String a = access.getObjectPlacementKey(block.getX(), block.getY(), block.getZ()); String a = access.getObjectPlacementKey(block.getX(), block.getY(), block.getZ());
if (a != null) { if(a != null) {
world.playSound(block.getLocation(), Sound.ITEM_LODESTONE_COMPASS_LOCK, 1f, 0.1f); world.playSound(block.getLocation(), Sound.ITEM_LODESTONE_COMPASS_LOCK, 1f, 0.1f);
sender.sendMessage("Found object " + a); sender.sendMessage("Found object " + a);
@ -112,7 +112,7 @@ public class DustRevealer {
} }
private boolean is(BlockPosition a) { private boolean is(BlockPosition a) {
if (isValidTry(a) && engine.getObjectPlacementKey(a.getX(), a.getY(), a.getZ()) != null && engine.getObjectPlacementKey(a.getX(), a.getY(), a.getZ()).equals(key)) { if(isValidTry(a) && engine.getObjectPlacementKey(a.getX(), a.getY(), a.getZ()) != null && engine.getObjectPlacementKey(a.getX(), a.getY(), a.getZ()).equals(key)) {
hits.add(a); hits.add(a);
new DustRevealer(engine, world, a, key, hits); new DustRevealer(engine, world, a, key, hits);
return true; return true;

View File

@ -63,7 +63,7 @@ public class JigsawEditor implements Listener {
private Location target; private Location target;
public JigsawEditor(Player player, IrisJigsawPiece piece, IrisObject object, File saveLocation) { public JigsawEditor(Player player, IrisJigsawPiece piece, IrisObject object, File saveLocation) {
if (editors.containsKey(player)) { if(editors.containsKey(player)) {
editors.get(player).close(); editors.get(player).close();
} }
@ -83,20 +83,20 @@ public class JigsawEditor implements Listener {
@EventHandler @EventHandler
public void on(PlayerMoveEvent e) { public void on(PlayerMoveEvent e) {
if (e.getPlayer().equals(player)) { if(e.getPlayer().equals(player)) {
try { try {
target = player.getTargetBlockExact(7).getLocation(); target = player.getTargetBlockExact(7).getLocation();
} catch (Throwable ex) { } catch(Throwable ex) {
Iris.reportError(ex); Iris.reportError(ex);
target = player.getLocation(); target = player.getLocation();
return; return;
} }
if (cuboid.contains(target)) { if(cuboid.contains(target)) {
for (IrisPosition i : falling.k()) { for(IrisPosition i : falling.k()) {
Location at = toLocation(i); Location at = toLocation(i);
if (at.equals(target)) { if(at.equals(target)) {
falling.remove(i).run(); falling.remove(i).run();
} }
} }
@ -122,27 +122,27 @@ public class JigsawEditor implements Listener {
@EventHandler @EventHandler
public void on(PlayerInteractEvent e) { public void on(PlayerInteractEvent e) {
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
if (e.getClickedBlock() != null && cuboid.contains(e.getClickedBlock().getLocation()) && e.getPlayer().equals(player)) { if(e.getClickedBlock() != null && cuboid.contains(e.getClickedBlock().getLocation()) && e.getPlayer().equals(player)) {
IrisPosition pos = toPosition(e.getClickedBlock().getLocation()); IrisPosition pos = toPosition(e.getClickedBlock().getLocation());
IrisJigsawPieceConnector connector = null; IrisJigsawPieceConnector connector = null;
for (IrisJigsawPieceConnector i : piece.getConnectors()) { for(IrisJigsawPieceConnector i : piece.getConnectors()) {
if (i.getPosition().equals(pos)) { if(i.getPosition().equals(pos)) {
connector = i; connector = i;
break; break;
} }
} }
if (!player.isSneaking() && connector == null) { if(!player.isSneaking() && connector == null) {
connector = new IrisJigsawPieceConnector(); connector = new IrisJigsawPieceConnector();
connector.setDirection(IrisDirection.getDirection(e.getBlockFace())); connector.setDirection(IrisDirection.getDirection(e.getBlockFace()));
connector.setPosition(pos); connector.setPosition(pos);
piece.getConnectors().add(connector); piece.getConnectors().add(connector);
player.playSound(e.getClickedBlock().getLocation(), Sound.ENTITY_ITEM_FRAME_ADD_ITEM, 1f, 1f); player.playSound(e.getClickedBlock().getLocation(), Sound.ENTITY_ITEM_FRAME_ADD_ITEM, 1f, 1f);
} else if (player.isSneaking() && connector != null) { } else if(player.isSneaking() && connector != null) {
piece.getConnectors().remove(connector); piece.getConnectors().remove(connector);
player.playSound(e.getClickedBlock().getLocation(), Sound.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1f, 1f); player.playSound(e.getClickedBlock().getLocation(), Sound.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1f, 1f);
} else if (connector != null && !player.isSneaking()) { } else if(connector != null && !player.isSneaking()) {
connector.setDirection(IrisDirection.getDirection(e.getBlockFace())); connector.setDirection(IrisDirection.getDirection(e.getBlockFace()));
player.playSound(e.getClickedBlock().getLocation(), Sound.ENTITY_ITEM_FRAME_ROTATE_ITEM, 1f, 1f); player.playSound(e.getClickedBlock().getLocation(), Sound.ENTITY_ITEM_FRAME_ROTATE_ITEM, 1f, 1f);
} }
@ -154,7 +154,7 @@ public class JigsawEditor implements Listener {
exit(); exit();
try { try {
IO.writeAll(targetSaveLocation, new JSONObject(new Gson().toJson(piece)).toString(4)); IO.writeAll(targetSaveLocation, new JSONObject(new Gson().toJson(piece)).toString(4));
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -168,20 +168,20 @@ public class JigsawEditor implements Listener {
object.unplaceCenterY(origin); object.unplaceCenterY(origin);
falling.v().forEach(Runnable::run); falling.v().forEach(Runnable::run);
}).get(); }).get();
} catch (InterruptedException | ExecutionException e) { } catch(InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
} }
editors.remove(player); editors.remove(player);
} }
public void onTick() { public void onTick() {
if (cl.flip()) { if(cl.flip()) {
Iris.service(WandSVC.class).draw(cuboid, player); Iris.service(WandSVC.class).draw(cuboid, player);
f: f:
for (IrisPosition i : falling.k()) { for(IrisPosition i : falling.k()) {
for (IrisJigsawPieceConnector j : piece.getConnectors()) { for(IrisJigsawPieceConnector j : piece.getConnectors()) {
if (j.getPosition().equals(i)) { if(j.getPosition().equals(i)) {
continue f; continue f;
} }
} }
@ -189,23 +189,23 @@ public class JigsawEditor implements Listener {
falling.remove(i).run(); falling.remove(i).run();
} }
for (IrisJigsawPieceConnector i : piece.getConnectors()) { for(IrisJigsawPieceConnector i : piece.getConnectors()) {
IrisPosition pos = i.getPosition(); IrisPosition pos = i.getPosition();
Location at = toLocation(pos); Location at = toLocation(pos);
Vector dir = i.getDirection().toVector().clone(); Vector dir = i.getDirection().toVector().clone();
for (int ix = 0; ix < RNG.r.i(1, 3); ix++) { for(int ix = 0; ix < RNG.r.i(1, 3); ix++) {
at.getWorld().spawnParticle(Particle.SOUL_FIRE_FLAME, at.clone().getBlock().getLocation().add(0.25, 0.25, 0.25).add(RNG.r.d(0.5), RNG.r.d(0.5), RNG.r.d(0.5)), 0, dir.getX(), dir.getY(), dir.getZ(), 0.092 + RNG.r.d(-0.03, 0.08)); at.getWorld().spawnParticle(Particle.SOUL_FIRE_FLAME, at.clone().getBlock().getLocation().add(0.25, 0.25, 0.25).add(RNG.r.d(0.5), RNG.r.d(0.5), RNG.r.d(0.5)), 0, dir.getX(), dir.getY(), dir.getZ(), 0.092 + RNG.r.d(-0.03, 0.08));
} }
if (at.getBlock().getLocation().equals(target)) { if(at.getBlock().getLocation().equals(target)) {
continue; continue;
} }
if (!falling.containsKey(pos)) { if(!falling.containsKey(pos)) {
if (at.getBlock().getType().isAir()) { if(at.getBlock().getType().isAir()) {
at.getBlock().setType(Material.STONE); at.getBlock().setType(Material.STONE);
} }

View File

@ -133,10 +133,10 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
frame.add(pane); frame.add(pane);
File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png"); File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png");
if (file != null) { if(file != null) {
try { try {
frame.setIconImage(ImageIO.read(file)); frame.setIconImage(ImageIO.read(file));
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
@ -167,10 +167,10 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
frame.add(pane); frame.add(pane);
File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png"); File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png");
if (file != null) { if(file != null) {
try { try {
frame.setIconImage(ImageIO.read(file)); frame.setIconImage(ImageIO.read(file));
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
@ -194,14 +194,14 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
@EventHandler @EventHandler
public void on(IrisEngineHotloadEvent e) { public void on(IrisEngineHotloadEvent e) {
if (generator != null) if(generator != null)
generator = loader.get(); generator = loader.get();
} }
public void mouseWheelMoved(MouseWheelEvent e) { public void mouseWheelMoved(MouseWheelEvent e) {
int notches = e.getWheelRotation(); int notches = e.getWheelRotation();
if (e.isControlDown()) { if(e.isControlDown()) {
t = t + ((0.0025 * t) * notches); t = t + ((0.0025 * t) * notches);
return; return;
} }
@ -212,51 +212,51 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
@Override @Override
public void paint(Graphics g) { public void paint(Graphics g) {
if (scale < ascale) { if(scale < ascale) {
ascale -= Math.abs(scale - ascale) * 0.16; ascale -= Math.abs(scale - ascale) * 0.16;
} }
if (scale > ascale) { if(scale > ascale) {
ascale += Math.abs(ascale - scale) * 0.16; ascale += Math.abs(ascale - scale) * 0.16;
} }
if (t < tz) { if(t < tz) {
tz -= Math.abs(t - tz) * 0.29; tz -= Math.abs(t - tz) * 0.29;
} }
if (t > tz) { if(t > tz) {
tz += Math.abs(tz - t) * 0.29; tz += Math.abs(tz - t) * 0.29;
} }
if (ox < oxp) { if(ox < oxp) {
oxp -= Math.abs(ox - oxp) * 0.16; oxp -= Math.abs(ox - oxp) * 0.16;
} }
if (ox > oxp) { if(ox > oxp) {
oxp += Math.abs(oxp - ox) * 0.16; oxp += Math.abs(oxp - ox) * 0.16;
} }
if (oz < ozp) { if(oz < ozp) {
ozp -= Math.abs(oz - ozp) * 0.16; ozp -= Math.abs(oz - ozp) * 0.16;
} }
if (oz > ozp) { if(oz > ozp) {
ozp += Math.abs(ozp - oz) * 0.16; ozp += Math.abs(ozp - oz) * 0.16;
} }
if (mx < mxx) { if(mx < mxx) {
mxx -= Math.abs(mx - mxx) * 0.16; mxx -= Math.abs(mx - mxx) * 0.16;
} }
if (mx > mxx) { if(mx > mxx) {
mxx += Math.abs(mxx - mx) * 0.16; mxx += Math.abs(mxx - mx) * 0.16;
} }
if (mz < mzz) { if(mz < mzz) {
mzz -= Math.abs(mz - mzz) * 0.16; mzz -= Math.abs(mz - mzz) * 0.16;
} }
if (mz > mzz) { if(mz > mzz) {
mzz += Math.abs(mzz - mz) * 0.16; mzz += Math.abs(mzz - mz) * 0.16;
} }
@ -265,26 +265,26 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
accuracy = down ? accuracy * 4 : accuracy; accuracy = down ? accuracy * 4 : accuracy;
int v = 1000; int v = 1000;
if (g instanceof Graphics2D gg) { if(g instanceof Graphics2D gg) {
if (getParent().getWidth() != w || getParent().getHeight() != h) { if(getParent().getWidth() != w || getParent().getHeight() != h) {
w = getParent().getWidth(); w = getParent().getWidth();
h = getParent().getHeight(); h = getParent().getHeight();
img = null; img = null;
} }
if (img == null) { if(img == null) {
img = new BufferedImage(w / accuracy, h / accuracy, BufferedImage.TYPE_INT_RGB); img = new BufferedImage(w / accuracy, h / accuracy, BufferedImage.TYPE_INT_RGB);
} }
BurstExecutor e = gx.burst(w); BurstExecutor e = gx.burst(w);
for (int x = 0; x < w / accuracy; x++) { for(int x = 0; x < w / accuracy; x++) {
int xx = x; int xx = x;
int finalAccuracy = accuracy; int finalAccuracy = accuracy;
e.queue(() -> { e.queue(() -> {
for (int z = 0; z < h / finalAccuracy; z++) { for(int z = 0; z < h / finalAccuracy; z++) {
double n = generator != null ? generator.apply(((xx * finalAccuracy) * ascale) + oxp, ((z * finalAccuracy) * ascale) + ozp) : cng.noise(((xx * finalAccuracy) * ascale) + oxp, ((z * finalAccuracy) * ascale) + ozp); double n = generator != null ? generator.apply(((xx * finalAccuracy) * ascale) + oxp, ((z * finalAccuracy) * ascale) + ozp) : cng.noise(((xx * finalAccuracy) * ascale) + oxp, ((z * finalAccuracy) * ascale) + ozp);
n = n > 1 ? 1 : n < 0 ? 0 : n; n = n > 1 ? 1 : n < 0 ? 0 : n;
@ -292,7 +292,7 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
Color color = colorMode ? Color.getHSBColor((float) (n), 1f - (float) (n * n * n * n * n * n), 1f - (float) n) : Color.getHSBColor(0f, 0f, (float) n); Color color = colorMode ? Color.getHSBColor((float) (n), 1f - (float) (n * n * n * n * n * n), 1f - (float) n) : Color.getHSBColor(0f, 0f, (float) n);
int rgb = color.getRGB(); int rgb = color.getRGB();
img.setRGB(xx, z, rgb); img.setRGB(xx, z, rgb);
} catch (Throwable xxx) { } catch(Throwable xxx) {
} }
} }
@ -308,15 +308,15 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
t += 1D; t += 1D;
r.put(p.getMilliseconds()); r.put(p.getMilliseconds());
if (!isVisible()) { if(!isVisible()) {
return; return;
} }
if (!getParent().isVisible()) { if(!getParent().isVisible()) {
return; return;
} }
if (!getParent().getParent().isVisible()) { if(!getParent().getParent().isVisible()) {
return; return;
} }

View File

@ -78,7 +78,7 @@ public class PregeneratorJob implements PregenListener {
instance = this; instance = this;
monitor = new MemoryMonitor(50); monitor = new MemoryMonitor(50);
saving = false; saving = false;
info = new String[]{"Initializing..."}; info = new String[] {"Initializing..."};
this.task = task; this.task = task;
this.pregenerator = new IrisPregenerator(task, method, this); this.pregenerator = new IrisPregenerator(task, method, this);
max = new Position2(0, 0); max = new Position2(0, 0);
@ -91,7 +91,7 @@ public class PregeneratorJob implements PregenListener {
max.setZ(Math.max((zz << 5) + 31, max.getZ())); max.setZ(Math.max((zz << 5) + 31, max.getZ()));
}); });
if (IrisSettings.get().getGui().isUseServerLaunchedGuis()) { if(IrisSettings.get().getGui().isUseServerLaunchedGuis()) {
open(); open();
} }
@ -103,7 +103,7 @@ public class PregeneratorJob implements PregenListener {
} }
public static boolean shutdownInstance() { public static boolean shutdownInstance() {
if (instance == null) { if(instance == null) {
return false; return false;
} }
@ -116,11 +116,11 @@ public class PregeneratorJob implements PregenListener {
} }
public static boolean pauseResume() { public static boolean pauseResume() {
if (instance == null) { if(instance == null) {
return false; return false;
} }
if (isPaused()) { if(isPaused()) {
instance.pregenerator.resume(); instance.pregenerator.resume();
} else { } else {
instance.pregenerator.pause(); instance.pregenerator.pause();
@ -129,7 +129,7 @@ public class PregeneratorJob implements PregenListener {
} }
public static boolean isPaused() { public static boolean isPaused() {
if (instance == null) { if(instance == null) {
return true; return true;
} }
@ -140,7 +140,7 @@ public class PregeneratorJob implements PregenListener {
String v = (c.startsWith("#") ? c : "#" + c).trim(); String v = (c.startsWith("#") ? c : "#" + c).trim();
try { try {
return Color.decode(v); return Color.decode(v);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.error("Error Parsing 'color', (" + c + ")"); Iris.error("Error Parsing 'color', (" + c + ")");
} }
@ -169,10 +169,10 @@ public class PregeneratorJob implements PregenListener {
public void draw(int x, int z, Color color) { public void draw(int x, int z, Color color) {
try { try {
if (renderer != null && frame != null && frame.isVisible()) { if(renderer != null && frame != null && frame.isVisible()) {
renderer.func.accept(new Position2(x, z), color); renderer.func.accept(new Position2(x, z), color);
} }
} catch (Throwable ignored) { } catch(Throwable ignored) {
} }
} }
@ -191,7 +191,7 @@ public class PregeneratorJob implements PregenListener {
monitor.close(); monitor.close();
J.sleep(3000); J.sleep(3000);
frame.setVisible(false); frame.setVisible(false);
} catch (Throwable e) { } catch(Throwable e) {
} }
}); });
@ -215,7 +215,7 @@ public class PregeneratorJob implements PregenListener {
frame.add(renderer); frame.add(renderer);
frame.setSize(1000, 1000); frame.setSize(1000, 1000);
frame.setVisible(true); frame.setVisible(true);
} catch (Throwable e) { } catch(Throwable e) {
} }
}); });
@ -223,7 +223,7 @@ public class PregeneratorJob implements PregenListener {
@Override @Override
public void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method) { public void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method) {
info = new String[]{ info = new String[] {
(paused() ? "PAUSED" : (saving ? "Saving... " : "Generating")) + " " + Form.f(generated) + " of " + Form.f(totalChunks) + " (" + Form.pc(percent, 0) + " Complete)", (paused() ? "PAUSED" : (saving ? "Saving... " : "Generating")) + " " + Form.f(generated) + " of " + Form.f(totalChunks) + " (" + Form.pc(percent, 0) + " Complete)",
"Speed: " + Form.f(chunksPerSecond, 0) + " Chunks/s, " + Form.f(regionsPerMinute, 1) + " Regions/m, " + Form.f(chunksPerMinute, 0) + " Chunks/m", "Speed: " + Form.f(chunksPerSecond, 0) + " Chunks/s, " + Form.f(regionsPerMinute, 1) + " Regions/m, " + Form.f(chunksPerMinute, 0) + " Chunks/m",
Form.duration(eta, 2) + " Remaining " + " (" + Form.duration(elapsed, 2) + " Elapsed)", Form.duration(eta, 2) + " Remaining " + " (" + Form.duration(elapsed, 2) + " Elapsed)",
@ -232,14 +232,14 @@ public class PregeneratorJob implements PregenListener {
}; };
for (Consumer<Double> i : onProgress) { for(Consumer<Double> i : onProgress) {
i.accept(percent); i.accept(percent);
} }
} }
@Override @Override
public void onChunkGenerating(int x, int z) { public void onChunkGenerating(int x, int z) {
if (engine != null) { if(engine != null) {
return; return;
} }
@ -248,7 +248,7 @@ public class PregeneratorJob implements PregenListener {
@Override @Override
public void onChunkGenerated(int x, int z) { public void onChunkGenerated(int x, int z) {
if (engine != null) { if(engine != null) {
draw(x, z, engine.draw((x << 4) + 8, (z << 4) + 8)); draw(x, z, engine.draw((x << 4) + 8, (z << 4) + 8));
return; return;
} }
@ -263,7 +263,7 @@ public class PregeneratorJob implements PregenListener {
} }
private void shouldGc() { private void shouldGc() {
if (cl.flip() && rgc > 16) { if(cl.flip() && rgc > 16) {
System.gc(); System.gc();
} }
} }
@ -322,7 +322,7 @@ public class PregeneratorJob implements PregenListener {
@Override @Override
public void onChunkExistsInRegionGen(int x, int z) { public void onChunkExistsInRegionGen(int x, int z) {
if (engine != null) { if(engine != null) {
draw(x, z, engine.draw((x << 4) + 8, (z << 4) + 8)); draw(x, z, engine.draw((x << 4) + 8, (z << 4) + 8));
return; return;
} }
@ -371,10 +371,10 @@ public class PregeneratorJob implements PregenListener {
bg = (Graphics2D) image.getGraphics(); bg = (Graphics2D) image.getGraphics();
l.lock(); l.lock();
while (order.isNotEmpty()) { while(order.isNotEmpty()) {
try { try {
order.pop().run(); order.pop().run();
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -388,12 +388,12 @@ public class PregeneratorJob implements PregenListener {
int h = g.getFontMetrics().getHeight() + 5; int h = g.getFontMetrics().getHeight() + 5;
int hh = 20; int hh = 20;
if (job.paused()) { if(job.paused()) {
g.drawString("PAUSED", 20, hh += h); g.drawString("PAUSED", 20, hh += h);
g.drawString("Press P to Resume", 20, hh += h); g.drawString("Press P to Resume", 20, hh += h);
} else { } else {
for (String i : prog) { for(String i : prog) {
g.drawString(i, 20, hh += h); g.drawString(i, 20, hh += h);
} }
@ -429,7 +429,7 @@ public class PregeneratorJob implements PregenListener {
@Override @Override
public void keyReleased(KeyEvent e) { public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_P) { if(e.getKeyCode() == KeyEvent.VK_P) {
PregeneratorJob.pauseResume(); PregeneratorJob.pauseResume();
} }
} }

View File

@ -149,7 +149,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
J.a(() -> { J.a(() -> {
J.sleep(10000); J.sleep(10000);
if (!helpIgnored && help) { if(!helpIgnored && help) {
help = false; help = false;
} }
}); });
@ -173,11 +173,11 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
frame.setVisible(true); frame.setVisible(true);
File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png"); File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png");
if (file != null) { if(file != null) {
try { try {
nv.texture = ImageIO.read(file); nv.texture = ImageIO.read(file);
frame.setIconImage(ImageIO.read(file)); frame.setIconImage(ImageIO.read(file));
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -190,13 +190,13 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
} }
public boolean updateEngine() { public boolean updateEngine() {
if (engine.isClosed()) { if(engine.isClosed()) {
if (world.hasRealWorld()) { if(world.hasRealWorld()) {
try { try {
engine = IrisToolbelt.access(world.realWorld()).getEngine(); engine = IrisToolbelt.access(world.realWorld()).getEngine();
Iris.info("Updated Renderer"); Iris.info("Updated Renderer");
return !engine.isClosed(); return !engine.isClosed();
} catch (Throwable e) { } catch(Throwable e) {
} }
} }
@ -224,7 +224,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
public int getColor(double wx, double wz) { public int getColor(double wx, double wz) {
BiFunction<Double, Double, Integer> colorFunction = (d, dx) -> Color.black.getRGB(); BiFunction<Double, Double, Integer> colorFunction = (d, dx) -> Color.black.getRGB();
switch (currentType) { switch(currentType) {
case BIOME, DECORATOR_LOAD, OBJECT_LOAD, LAYER_LOAD -> colorFunction = (x, z) -> engine.getComplex().getTrueBiomeStream().get(x, z).getColor(engine, currentType).getRGB(); case BIOME, DECORATOR_LOAD, OBJECT_LOAD, LAYER_LOAD -> colorFunction = (x, z) -> engine.getComplex().getTrueBiomeStream().get(x, z).getColor(engine, currentType).getRGB();
case BIOME_LAND -> colorFunction = (x, z) -> engine.getComplex().getLandBiomeStream().get(x, z).getColor(engine, currentType).getRGB(); case BIOME_LAND -> colorFunction = (x, z) -> engine.getComplex().getLandBiomeStream().get(x, z).getColor(engine, currentType).getRGB();
case BIOME_SEA -> colorFunction = (x, z) -> engine.getComplex().getSeaBiomeStream().get(x, z).getColor(engine, currentType).getRGB(); case BIOME_SEA -> colorFunction = (x, z) -> engine.getComplex().getSeaBiomeStream().get(x, z).getColor(engine, currentType).getRGB();
@ -247,51 +247,51 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
@Override @Override
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SHIFT) { if(e.getKeyCode() == KeyEvent.VK_SHIFT) {
shift = true; shift = true;
} }
if (e.getKeyCode() == KeyEvent.VK_CONTROL) { if(e.getKeyCode() == KeyEvent.VK_CONTROL) {
control = true; control = true;
} }
if (e.getKeyCode() == KeyEvent.VK_SEMICOLON) { if(e.getKeyCode() == KeyEvent.VK_SEMICOLON) {
debug = true; debug = true;
} }
if (e.getKeyCode() == KeyEvent.VK_SLASH) { if(e.getKeyCode() == KeyEvent.VK_SLASH) {
help = true; help = true;
helpIgnored = true; helpIgnored = true;
} }
if (e.getKeyCode() == KeyEvent.VK_ALT) { if(e.getKeyCode() == KeyEvent.VK_ALT) {
alt = true; alt = true;
} }
} }
@Override @Override
public void keyReleased(KeyEvent e) { public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SEMICOLON) { if(e.getKeyCode() == KeyEvent.VK_SEMICOLON) {
debug = false; debug = false;
} }
if (e.getKeyCode() == KeyEvent.VK_SHIFT) { if(e.getKeyCode() == KeyEvent.VK_SHIFT) {
shift = false; shift = false;
} }
if (e.getKeyCode() == KeyEvent.VK_CONTROL) { if(e.getKeyCode() == KeyEvent.VK_CONTROL) {
control = false; control = false;
} }
if (e.getKeyCode() == KeyEvent.VK_SLASH) { if(e.getKeyCode() == KeyEvent.VK_SLASH) {
help = false; help = false;
helpIgnored = true; helpIgnored = true;
} }
if (e.getKeyCode() == KeyEvent.VK_ALT) { if(e.getKeyCode() == KeyEvent.VK_ALT) {
alt = false; alt = false;
} }
// Pushes // Pushes
if (e.getKeyCode() == KeyEvent.VK_F) { if(e.getKeyCode() == KeyEvent.VK_F) {
follow = !follow; follow = !follow;
if (player != null && follow) { if(player != null && follow) {
notify("Following " + player.getName() + ". Press F to disable"); notify("Following " + player.getName() + ". Press F to disable");
} else if (follow) { } else if(follow) {
notify("Can't follow, no one is in the world"); notify("Can't follow, no one is in the world");
follow = false; follow = false;
} else { } else {
@ -301,38 +301,38 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
return; return;
} }
if (e.getKeyCode() == KeyEvent.VK_R) { if(e.getKeyCode() == KeyEvent.VK_R) {
dump(); dump();
notify("Refreshing Chunks"); notify("Refreshing Chunks");
return; return;
} }
if (e.getKeyCode() == KeyEvent.VK_P) { if(e.getKeyCode() == KeyEvent.VK_P) {
lowtile = !lowtile; lowtile = !lowtile;
dump(); dump();
notify("Rendering " + (lowtile ? "Low" : "High") + " Quality Tiles"); notify("Rendering " + (lowtile ? "Low" : "High") + " Quality Tiles");
return; return;
} }
if (e.getKeyCode() == KeyEvent.VK_E) { if(e.getKeyCode() == KeyEvent.VK_E) {
eco = !eco; eco = !eco;
dump(); dump();
notify("Using " + (eco ? "60" : "Uncapped") + " FPS Limit"); notify("Using " + (eco ? "60" : "Uncapped") + " FPS Limit");
return; return;
} }
if (e.getKeyCode() == KeyEvent.VK_EQUALS) { if(e.getKeyCode() == KeyEvent.VK_EQUALS) {
mscale = mscale + ((0.044 * mscale) * -3); mscale = mscale + ((0.044 * mscale) * -3);
mscale = Math.max(mscale, 0.00001); mscale = Math.max(mscale, 0.00001);
dump(); dump();
return; return;
} }
if (e.getKeyCode() == KeyEvent.VK_MINUS) { if(e.getKeyCode() == KeyEvent.VK_MINUS) {
mscale = mscale + ((0.044 * mscale) * 3); mscale = mscale + ((0.044 * mscale) * 3);
mscale = Math.max(mscale, 0.00001); mscale = Math.max(mscale, 0.00001);
dump(); dump();
return; return;
} }
if (e.getKeyCode() == KeyEvent.VK_BACK_SLASH) { if(e.getKeyCode() == KeyEvent.VK_BACK_SLASH) {
mscale = 1D; mscale = 1D;
dump(); dump();
notify("Zoom Reset"); notify("Zoom Reset");
@ -341,9 +341,9 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
int currentMode = currentType.ordinal(); int currentMode = currentType.ordinal();
for (RenderType i : RenderType.values()) { for(RenderType i : RenderType.values()) {
if (e.getKeyChar() == String.valueOf(i.ordinal() + 1).charAt(0)) { if(e.getKeyChar() == String.valueOf(i.ordinal() + 1).charAt(0)) {
if (i.ordinal() != currentMode) { if(i.ordinal() != currentMode) {
currentType = i; currentType = i;
dump(); dump();
notify("Rendering " + Form.capitalizeWords(currentType.name().toLowerCase().replaceAll("\\Q_\\E", " "))); notify("Rendering " + Form.capitalizeWords(currentType.name().toLowerCase().replaceAll("\\Q_\\E", " ")));
@ -352,7 +352,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
} }
} }
if (e.getKeyCode() == KeyEvent.VK_M) { if(e.getKeyCode() == KeyEvent.VK_M) {
currentType = RenderType.values()[(currentMode + 1) % RenderType.values().length]; currentType = RenderType.values()[(currentMode + 1) % RenderType.values().length];
notify("Rendering " + Form.capitalizeWords(currentType.name().toLowerCase().replaceAll("\\Q_\\E", " "))); notify("Rendering " + Form.capitalizeWords(currentType.name().toLowerCase().replaceAll("\\Q_\\E", " ")));
dump(); dump();
@ -368,15 +368,15 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
BlockPosition key = new BlockPosition((int) mscale, Math.floorDiv(x, div), Math.floorDiv(z, div)); BlockPosition key = new BlockPosition((int) mscale, Math.floorDiv(x, div), Math.floorDiv(z, div));
fg.add(key); fg.add(key);
if (positions.containsKey(key)) { if(positions.containsKey(key)) {
return positions.get(key); return positions.get(key);
} }
if (fastpositions.containsKey(key)) { if(fastpositions.containsKey(key)) {
if (!working.contains(key) && working.size() < 9) { if(!working.contains(key) && working.size() < 9) {
m.set(m.get() - 1); m.set(m.get() - 1);
if (m.get() >= 0 && velocity < 50) { if(m.get() >= 0 && velocity < 50) {
working.add(key); working.add(key);
double mk = mscale; double mk = mscale;
double mkd = scale; double mkd = scale;
@ -387,7 +387,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
rs.put(ps.getMilliseconds()); rs.put(ps.getMilliseconds());
working.remove(key); working.remove(key);
if (mk == mscale && mkd == scale) { if(mk == mscale && mkd == scale) {
positions.put(key, b); positions.put(key, b);
} }
}); });
@ -397,7 +397,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
return fastpositions.get(key); return fastpositions.get(key);
} }
if (workingfast.contains(key) || workingfast.size() > Runtime.getRuntime().availableProcessors()) { if(workingfast.contains(key) || workingfast.size() > Runtime.getRuntime().availableProcessors()) {
return null; return null;
} }
@ -411,7 +411,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
rs.put(ps.getMilliseconds()); rs.put(ps.getMilliseconds());
workingfast.remove(key); workingfast.remove(key);
if (mk == mscale && mkd == scale) { if(mk == mscale && mkd == scale) {
fastpositions.put(key, b); fastpositions.put(key, b);
} }
}); });
@ -437,49 +437,49 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
@Override @Override
public void paint(Graphics gx) { public void paint(Graphics gx) {
if (updateEngine()) { if(updateEngine()) {
dump(); dump();
} }
if (ox < oxp) { if(ox < oxp) {
velocity = Math.abs(ox - oxp) * 0.36; velocity = Math.abs(ox - oxp) * 0.36;
oxp -= velocity; oxp -= velocity;
} }
if (ox > oxp) { if(ox > oxp) {
velocity = Math.abs(oxp - ox) * 0.36; velocity = Math.abs(oxp - ox) * 0.36;
oxp += velocity; oxp += velocity;
} }
if (oz < ozp) { if(oz < ozp) {
velocity = Math.abs(oz - ozp) * 0.36; velocity = Math.abs(oz - ozp) * 0.36;
ozp -= velocity; ozp -= velocity;
} }
if (oz > ozp) { if(oz > ozp) {
velocity = Math.abs(ozp - oz) * 0.36; velocity = Math.abs(ozp - oz) * 0.36;
ozp += velocity; ozp += velocity;
} }
if (lx < hx) { if(lx < hx) {
hx -= Math.abs(lx - hx) * 0.36; hx -= Math.abs(lx - hx) * 0.36;
} }
if (lx > hx) { if(lx > hx) {
hx += Math.abs(hx - lx) * 0.36; hx += Math.abs(hx - lx) * 0.36;
} }
if (lz < hz) { if(lz < hz) {
hz -= Math.abs(lz - hz) * 0.36; hz -= Math.abs(lz - hz) * 0.36;
} }
if (lz > hz) { if(lz > hz) {
hz += Math.abs(hz - lz) * 0.36; hz += Math.abs(hz - lz) * 0.36;
} }
if (centities.flip()) { if(centities.flip()) {
J.s(() -> { J.s(() -> {
synchronized (lastEntities) { synchronized(lastEntities) {
lastEntities.clear(); lastEntities.clear();
lastEntities.addAll(world.getEntitiesByClass(LivingEntity.class)); lastEntities.addAll(world.getEntitiesByClass(LivingEntity.class));
} }
@ -493,7 +493,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
double vscale = scale; double vscale = scale;
scale = w / 12D; scale = w / 12D;
if (scale != vscale) { if(scale != vscale) {
positions.clear(); positions.clear();
} }
@ -505,15 +505,15 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
posZ = (int) ozp; posZ = (int) ozp;
m.set(3); m.set(3);
for (int r = 0; r < Math.max(w, h); r += iscale) { for(int r = 0; r < Math.max(w, h); r += iscale) {
for (int i = -iscale; i < w + iscale; i += iscale) { for(int i = -iscale; i < w + iscale; i += iscale) {
for (int j = -iscale; j < h + iscale; j += iscale) { for(int j = -iscale; j < h + iscale; j += iscale) {
int a = i - (w / 2); int a = i - (w / 2);
int b = j - (h / 2); int b = j - (h / 2);
if (a * a + b * b <= r * r) { if(a * a + b * b <= r * r) {
BufferedImage t = getTile(gg, iscale, Math.floorDiv((posX / iscale) + i, iscale) * iscale, Math.floorDiv((posZ / iscale) + j, iscale) * iscale, m); BufferedImage t = getTile(gg, iscale, Math.floorDiv((posX / iscale) + i, iscale) * iscale, Math.floorDiv((posZ / iscale) + j, iscale) * iscale, m);
if (t != null) { if(t != null) {
g.drawImage(t, i - ((posX / iscale) % (iscale)), j - ((posZ / iscale) % (iscale)), iscale, iscale, (img, infoflags, x, y, width, height) -> true); g.drawImage(t, i - ((posX / iscale) % (iscale)), j - ((posZ / iscale) % (iscale)), iscale, iscale, (img, infoflags, x, y, width, height) -> true);
} }
} }
@ -523,8 +523,8 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
p.end(); p.end();
for (BlockPosition i : positions.k()) { for(BlockPosition i : positions.k()) {
if (!gg.contains(i)) { if(!gg.contains(i)) {
positions.remove(i); positions.remove(i);
} }
} }
@ -532,15 +532,15 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
hanleFollow(); hanleFollow();
renderOverlays(g); renderOverlays(g);
if (!isVisible()) { if(!isVisible()) {
return; return;
} }
if (!getParent().isVisible()) { if(!getParent().isVisible()) {
return; return;
} }
if (!getParent().getParent().isVisible()) { if(!getParent().getParent().isVisible()) {
return; return;
} }
@ -552,7 +552,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
} }
private void hanleFollow() { private void hanleFollow() {
if (follow && player != null) { if(follow && player != null) {
animateTo(player.getLocation().getX(), player.getLocation().getZ()); animateTo(player.getLocation().getX(), player.getLocation().getZ());
} }
} }
@ -560,16 +560,16 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
private void renderOverlays(Graphics2D g) { private void renderOverlays(Graphics2D g) {
renderPlayer(g); renderPlayer(g);
if (help) { if(help) {
renderOverlayHelp(g); renderOverlayHelp(g);
} else if (debug) { } else if(debug) {
renderOverlayDebug(g); renderOverlayDebug(g);
} }
renderOverlayLegend(g); renderOverlayLegend(g);
renderHoverOverlay(g, shift); renderHoverOverlay(g, shift);
if (!notifications.isEmpty()) { if(!notifications.isEmpty()) {
renderNotification(g); renderNotification(g);
} }
} }
@ -587,8 +587,8 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
private void renderNotification(Graphics2D g) { private void renderNotification(Graphics2D g) {
drawCardCB(g, notifications.k()); drawCardCB(g, notifications.k());
for (String i : notifications.k()) { for(String i : notifications.k()) {
if (M.ms() > notifications.get(i)) { if(M.ms() > notifications.get(i)) {
notifications.remove(i); notifications.remove(i);
} }
} }
@ -597,32 +597,32 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
private void renderPlayer(Graphics2D g) { private void renderPlayer(Graphics2D g) {
Player b = null; Player b = null;
for (Player i : world.getPlayers()) { for(Player i : world.getPlayers()) {
b = i; b = i;
renderPosition(g, i.getLocation().getX(), i.getLocation().getZ()); renderPosition(g, i.getLocation().getX(), i.getLocation().getZ());
} }
synchronized (lastEntities) { synchronized(lastEntities) {
double dist = Double.MAX_VALUE; double dist = Double.MAX_VALUE;
LivingEntity h = null; LivingEntity h = null;
for (LivingEntity i : lastEntities) { for(LivingEntity i : lastEntities) {
if (i instanceof Player) { if(i instanceof Player) {
continue; continue;
} }
renderMobPosition(g, i, i.getLocation().getX(), i.getLocation().getZ()); renderMobPosition(g, i, i.getLocation().getX(), i.getLocation().getZ());
if (shift) { if(shift) {
double d = i.getLocation().distanceSquared(new Location(i.getWorld(), getWorldX(hx), i.getLocation().getY(), getWorldZ(hz))); double d = i.getLocation().distanceSquared(new Location(i.getWorld(), getWorldX(hx), i.getLocation().getY(), getWorldZ(hz)));
if (d < dist) { if(d < dist) {
dist = d; dist = d;
h = i; h = i;
} }
} }
} }
if (h != null && shift) { if(h != null && shift) {
g.setColor(Color.red); g.setColor(Color.red);
g.fillRoundRect((int) getScreenX(h.getLocation().getX()) - 10, (int) getScreenZ(h.getLocation().getZ()) - 10, 20, 20, 20, 20); g.fillRoundRect((int) getScreenX(h.getLocation().getX()) - 10, (int) getScreenZ(h.getLocation().getZ()) - 10, 20, 20, 20, 20);
KList<String> k = new KList<>(); KList<String> k = new KList<>();
@ -647,7 +647,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
} }
private void renderPosition(Graphics2D g, double x, double z) { private void renderPosition(Graphics2D g, double x, double z) {
if (texture != null) { if(texture != null) {
g.drawImage(texture, (int) getScreenX(x), (int) getScreenZ(z), 66, 66, (img, infoflags, xx, xy, width, height) -> true); g.drawImage(texture, (int) getScreenX(x), (int) getScreenZ(z), 66, 66, (img, infoflags, xx, xy, width, height) -> true);
} else { } else {
g.setColor(Color.darkGray); g.setColor(Color.darkGray);
@ -669,7 +669,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
l.add("Biome: " + biome.getName()); l.add("Biome: " + biome.getName());
l.add("Region: " + region.getName() + "(" + region.getLoadKey() + ")"); l.add("Region: " + region.getName() + "(" + region.getLoadKey() + ")");
l.add("Block " + (int) getWorldX(hx) + ", " + (int) getWorldZ(hz)); l.add("Block " + (int) getWorldX(hx) + ", " + (int) getWorldZ(hz));
if (detailed) { if(detailed) {
l.add("Chunk " + ((int) getWorldX(hx) >> 4) + ", " + ((int) getWorldZ(hz) >> 4)); l.add("Chunk " + ((int) getWorldX(hx) >> 4) + ", " + ((int) getWorldZ(hz) >> 4));
l.add("Region " + (((int) getWorldX(hx) >> 4) >> 5) + ", " + (((int) getWorldZ(hz) >> 4) >> 5)); l.add("Region " + (((int) getWorldX(hx) >> 4) >> 5) + ", " + (((int) getWorldZ(hz) >> 4) >> 5));
l.add("Key: " + biome.getLoadKey()); l.add("Key: " + biome.getLoadKey());
@ -698,7 +698,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
l.add("E to toggle Eco FPS Mode"); l.add("E to toggle Eco FPS Mode");
int ff = 0; int ff = 0;
for (RenderType i : RenderType.values()) { for(RenderType i : RenderType.values()) {
ff++; ff++;
l.add(ff + " to view " + Form.capitalizeWords(i.name().toLowerCase().replaceAll("\\Q_\\E", " "))); l.add(ff + " to view " + Form.capitalizeWords(i.name().toLowerCase().replaceAll("\\Q_\\E", " ")));
} }
@ -728,7 +728,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
private void open() { private void open() {
IrisComplex complex = engine.getComplex(); IrisComplex complex = engine.getComplex();
File r = null; File r = null;
switch (currentType) { switch(currentType) {
case BIOME, LAYER_LOAD, DECORATOR_LOAD, OBJECT_LOAD, HEIGHT -> r = complex.getTrueBiomeStream().get(getWorldX(hx), getWorldZ(hz)).openInVSCode(); case BIOME, LAYER_LOAD, DECORATOR_LOAD, OBJECT_LOAD, HEIGHT -> r = complex.getTrueBiomeStream().get(getWorldX(hx), getWorldZ(hz)).openInVSCode();
case BIOME_LAND -> r = complex.getLandBiomeStream().get(getWorldX(hx), getWorldZ(hz)).openInVSCode(); case BIOME_LAND -> r = complex.getLandBiomeStream().get(getWorldX(hx), getWorldZ(hz)).openInVSCode();
case BIOME_SEA -> r = complex.getSeaBiomeStream().get(getWorldX(hx), getWorldZ(hz)).openInVSCode(); case BIOME_SEA -> r = complex.getSeaBiomeStream().get(getWorldX(hx), getWorldZ(hz)).openInVSCode();
@ -741,7 +741,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
private void teleport() { private void teleport() {
J.s(() -> { J.s(() -> {
if (player != null) { if(player != null) {
int xx = (int) getWorldX(hx); int xx = (int) getWorldX(hx);
int zz = (int) getWorldZ(hz); int zz = (int) getWorldZ(hz);
int h = engine.getComplex().getRoundedHeighteightStream().get(xx, zz); int h = engine.getComplex().getRoundedHeighteightStream().get(xx, zz);
@ -766,7 +766,7 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
int h = 0; int h = 0;
int w = 0; int w = 0;
for (String i : text) { for(String i : text) {
h += g.getFontMetrics().getHeight(); h += g.getFontMetrics().getHeight();
w = Math.max(w, g.getFontMetrics().stringWidth(i)); w = Math.max(w, g.getFontMetrics().stringWidth(i));
} }
@ -786,14 +786,14 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
g.setColor(Color.black); g.setColor(Color.black);
int m = 0; int m = 0;
for (String i : text) { for(String i : text) {
g.drawString(i, x + 14 - cw, y + 14 - ch + (++m * g.getFontMetrics().getHeight())); g.drawString(i, x + 14 - cw, y + 14 - ch + (++m * g.getFontMetrics().getHeight()));
} }
} }
public void mouseWheelMoved(MouseWheelEvent e) { public void mouseWheelMoved(MouseWheelEvent e) {
int notches = e.getWheelRotation(); int notches = e.getWheelRotation();
if (e.isControlDown()) { if(e.isControlDown()) {
return; return;
} }
@ -806,9 +806,9 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
if (control) { if(control) {
teleport(); teleport();
} else if (alt) { } else if(alt) {
open(); open();
} }
} }

View File

@ -37,7 +37,7 @@ public class IrisRenderer {
BufferedImage image = new BufferedImage(resolution, resolution, BufferedImage.TYPE_INT_RGB); BufferedImage image = new BufferedImage(resolution, resolution, BufferedImage.TYPE_INT_RGB);
BiFunction<Double, Double, Integer> colorFunction = (d, dx) -> Color.black.getRGB(); BiFunction<Double, Double, Integer> colorFunction = (d, dx) -> Color.black.getRGB();
switch (currentType) { switch(currentType) {
case BIOME, DECORATOR_LOAD, OBJECT_LOAD, LAYER_LOAD -> colorFunction = (x, z) -> renderer.getComplex().getTrueBiomeStream().get(x, z).getColor(renderer, currentType).getRGB(); case BIOME, DECORATOR_LOAD, OBJECT_LOAD, LAYER_LOAD -> colorFunction = (x, z) -> renderer.getComplex().getTrueBiomeStream().get(x, z).getColor(renderer, currentType).getRGB();
case BIOME_LAND -> colorFunction = (x, z) -> renderer.getComplex().getLandBiomeStream().get(x, z).getColor(renderer, currentType).getRGB(); case BIOME_LAND -> colorFunction = (x, z) -> renderer.getComplex().getLandBiomeStream().get(x, z).getColor(renderer, currentType).getRGB();
case BIOME_SEA -> colorFunction = (x, z) -> renderer.getComplex().getSeaBiomeStream().get(x, z).getColor(renderer, currentType).getRGB(); case BIOME_SEA -> colorFunction = (x, z) -> renderer.getComplex().getSeaBiomeStream().get(x, z).getColor(renderer, currentType).getRGB();
@ -48,10 +48,10 @@ public class IrisRenderer {
double x, z; double x, z;
int i, j; int i, j;
for (i = 0; i < resolution; i++) { for(i = 0; i < resolution; i++) {
x = IrisInterpolation.lerp(sx, sx + size, (double) i / (double) (resolution)); x = IrisInterpolation.lerp(sx, sx + size, (double) i / (double) (resolution));
for (j = 0; j < resolution; j++) { for(j = 0; j < resolution; j++) {
z = IrisInterpolation.lerp(sz, sz + size, (double) j / (double) (resolution)); z = IrisInterpolation.lerp(sz, sz + size, (double) j / (double) (resolution));
image.setRGB(i, j, colorFunction.apply(x, z)); image.setRGB(i, j, colorFunction.apply(x, z));
} }

View File

@ -52,55 +52,55 @@ public class IrisPapiExpansion extends PlaceholderExpansion {
Location l = null; Location l = null;
PlatformChunkGenerator a = null; PlatformChunkGenerator a = null;
if (player.isOnline()) { if(player.isOnline()) {
l = player.getPlayer().getLocation(); l = player.getPlayer().getLocation();
a = IrisToolbelt.access(l.getWorld()); a = IrisToolbelt.access(l.getWorld());
} }
if (p.equalsIgnoreCase("biome_name")) { if(p.equalsIgnoreCase("biome_name")) {
if (a != null) { if(a != null) {
return a.getEngine().getBiome(l).getName(); return a.getEngine().getBiome(l).getName();
} }
} else if (p.equalsIgnoreCase("biome_id")) { } else if(p.equalsIgnoreCase("biome_id")) {
if (a != null) { if(a != null) {
return a.getEngine().getBiome(l).getLoadKey(); return a.getEngine().getBiome(l).getLoadKey();
} }
} else if (p.equalsIgnoreCase("biome_file")) { } else if(p.equalsIgnoreCase("biome_file")) {
if (a != null) { if(a != null) {
return a.getEngine().getBiome(l).getLoadFile().getPath(); return a.getEngine().getBiome(l).getLoadFile().getPath();
} }
} else if (p.equalsIgnoreCase("region_name")) { } else if(p.equalsIgnoreCase("region_name")) {
if (a != null) { if(a != null) {
return a.getEngine().getRegion(l).getName(); return a.getEngine().getRegion(l).getName();
} }
} else if (p.equalsIgnoreCase("region_id")) { } else if(p.equalsIgnoreCase("region_id")) {
if (a != null) { if(a != null) {
return a.getEngine().getRegion(l).getLoadKey(); return a.getEngine().getRegion(l).getLoadKey();
} }
} else if (p.equalsIgnoreCase("region_file")) { } else if(p.equalsIgnoreCase("region_file")) {
if (a != null) { if(a != null) {
return a.getEngine().getRegion(l).getLoadFile().getPath(); return a.getEngine().getRegion(l).getLoadFile().getPath();
} }
} else if (p.equalsIgnoreCase("terrain_slope")) { } else if(p.equalsIgnoreCase("terrain_slope")) {
if (a != null) { if(a != null) {
return (a.getEngine()) return (a.getEngine())
.getComplex().getSlopeStream() .getComplex().getSlopeStream()
.get(l.getX(), l.getZ()) + ""; .get(l.getX(), l.getZ()) + "";
} }
} else if (p.equalsIgnoreCase("terrain_height")) { } else if(p.equalsIgnoreCase("terrain_height")) {
if (a != null) { if(a != null) {
return Math.round(a.getEngine().getHeight(l.getBlockX(), l.getBlockZ())) + ""; return Math.round(a.getEngine().getHeight(l.getBlockX(), l.getBlockZ())) + "";
} }
} else if (p.equalsIgnoreCase("world_mode")) { } else if(p.equalsIgnoreCase("world_mode")) {
if (a != null) { if(a != null) {
return a.isStudio() ? "Studio" : "Production"; return a.isStudio() ? "Studio" : "Production";
} }
} else if (p.equalsIgnoreCase("world_seed")) { } else if(p.equalsIgnoreCase("world_seed")) {
if (a != null) { if(a != null) {
return a.getEngine().getSeedManager().getSeed() + ""; return a.getEngine().getSeedManager().getSeed() + "";
} }
} else if (p.equalsIgnoreCase("world_speed")) { } else if(p.equalsIgnoreCase("world_speed")) {
if (a != null) { if(a != null) {
return a.getEngine().getGeneratedPerSecond() + "/s"; return a.getEngine().getGeneratedPerSecond() + "/s";
} }
} }

View File

@ -38,7 +38,7 @@ public class MultiverseCoreLink {
} }
public boolean addWorld(String worldName, IrisDimension dim, String seed) { public boolean addWorld(String worldName, IrisDimension dim, String seed) {
if (!isSupported()) { if(!isSupported()) {
return false; return false;
} }
@ -51,7 +51,7 @@ public class MultiverseCoreLink {
boolean b = (boolean) m.invoke(mvWorldManager, worldName, dim.getEnvironment(), seed, WorldType.NORMAL, false, "Iris", false); boolean b = (boolean) m.invoke(mvWorldManager, worldName, dim.getEnvironment(), seed, WorldType.NORMAL, false, "Iris", false);
saveConfig(); saveConfig();
return b; return b;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -67,7 +67,7 @@ public class MultiverseCoreLink {
Field f = mvWorldManager.getClass().getDeclaredField("worldsFromTheConfig"); Field f = mvWorldManager.getClass().getDeclaredField("worldsFromTheConfig");
f.setAccessible(true); f.setAccessible(true);
return (Map<String, ?>) f.get(mvWorldManager); return (Map<String, ?>) f.get(mvWorldManager);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -76,7 +76,7 @@ public class MultiverseCoreLink {
} }
public void removeFromConfig(World world) { public void removeFromConfig(World world) {
if (!isSupported()) { if(!isSupported()) {
return; return;
} }
@ -85,7 +85,7 @@ public class MultiverseCoreLink {
} }
public void removeFromConfig(String world) { public void removeFromConfig(String world) {
if (!isSupported()) { if(!isSupported()) {
return; return;
} }
@ -98,7 +98,7 @@ public class MultiverseCoreLink {
Plugin p = getMultiverse(); Plugin p = getMultiverse();
Object mvWorldManager = p.getClass().getDeclaredMethod("getMVWorldManager").invoke(p); Object mvWorldManager = p.getClass().getDeclaredMethod("getMVWorldManager").invoke(p);
mvWorldManager.getClass().getDeclaredMethod("saveWorldsConfig").invoke(mvWorldManager); mvWorldManager.getClass().getDeclaredMethod("saveWorldsConfig").invoke(mvWorldManager);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -112,7 +112,7 @@ public class MultiverseCoreLink {
try { try {
String t = worldNameTypes.get(worldName); String t = worldNameTypes.get(worldName);
return t == null ? defaultType : t; return t == null ? defaultType : t;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
return defaultType; return defaultType;
} }
@ -128,11 +128,11 @@ public class MultiverseCoreLink {
} }
public String envName(World.Environment environment) { public String envName(World.Environment environment) {
if (environment == null) { if(environment == null) {
return "normal"; return "normal";
} }
return switch (environment) { return switch(environment) {
case NORMAL -> "normal"; case NORMAL -> "normal";
case NETHER -> "nether"; case NETHER -> "nether";
case THE_END -> "end"; case THE_END -> "end";

View File

@ -50,15 +50,17 @@ public class MythicMobsLink {
/** /**
* Spawn a mythic mob at this location * Spawn a mythic mob at this location
* *
* @param mob The mob * @param mob
* @param location The location * The mob
* @param location
* The location
* @return The mob, or null if it can't be spawned * @return The mob, or null if it can't be spawned
*/ */
public @Nullable public @Nullable
Entity spawnMob(String mob, Location location) { Entity spawnMob(String mob, Location location) {
if (!isEnabled()) return null; if(!isEnabled()) return null;
if (spawnMobFunction != null) { if(spawnMobFunction != null) {
return spawnMobFunction.apply(mob, location); return spawnMobFunction.apply(mob, location);
} }
@ -73,14 +75,14 @@ public class MythicMobsLink {
spawnMobFunction = (str, loc) -> { spawnMobFunction = (str, loc) -> {
try { try {
return (Entity) spawnMobMethod.invoke(apiHelper, str, loc); return (Entity) spawnMobMethod.invoke(apiHelper, str, loc);
} catch (InvocationTargetException | IllegalAccessException e) { } catch(InvocationTargetException | IllegalAccessException e) {
e.printStackTrace(); e.printStackTrace();
} }
return null; return null;
}; };
return spawnMobFunction.apply(mob, location); return spawnMobFunction.apply(mob, location);
} catch (Exception e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -88,11 +90,11 @@ public class MythicMobsLink {
} }
public Collection<String> getMythicMobTypes() { public Collection<String> getMythicMobTypes() {
if (mobs != null) { if(mobs != null) {
return mobs; return mobs;
} }
if (isEnabled()) { if(isEnabled()) {
try { try {
Class<?> mythicMobClass = Class.forName("io.lumine.xikage.mythicmobs.MythicMobs"); Class<?> mythicMobClass = Class.forName("io.lumine.xikage.mythicmobs.MythicMobs");
@ -103,7 +105,7 @@ public class MythicMobsLink {
Method getMobNames = mobManager.getClass().getDeclaredMethod("getMobNames"); Method getMobNames = mobManager.getClass().getDeclaredMethod("getMobNames");
mobs = (Collection<String>) getMobNames.invoke(mobManager); mobs = (Collection<String>) getMobNames.invoke(mobManager);
return mobs; return mobs;
} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { } catch(ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -44,22 +44,22 @@ public class OraxenLink {
} }
public BlockData getBlockDataFor(String id) { public BlockData getBlockDataFor(String id) {
if (!supported()) { if(!supported()) {
return null; return null;
} }
MechanicFactory f = getFactory(id); MechanicFactory f = getFactory(id);
if (f == null) { if(f == null) {
return null; return null;
} }
Mechanic m = f.getMechanic(id); Mechanic m = f.getMechanic(id);
// TODO: Why isnt there a simple getBlockData() function? // TODO: Why isnt there a simple getBlockData() function?
if (m.getFactory() instanceof NoteBlockMechanicFactory) { if(m.getFactory() instanceof NoteBlockMechanicFactory) {
return ((NoteBlockMechanicFactory) m.getFactory()).createNoteBlockData(id); return ((NoteBlockMechanicFactory) m.getFactory()).createNoteBlockData(id);
} else if (m.getFactory() instanceof BlockMechanicFactory) { } else if(m.getFactory() instanceof BlockMechanicFactory) {
MultipleFacing newBlockData = (MultipleFacing) Bukkit.createBlockData(Material.MUSHROOM_STEM); MultipleFacing newBlockData = (MultipleFacing) Bukkit.createBlockData(Material.MUSHROOM_STEM);
Utils.setBlockFacing(newBlockData, ((BlockMechanic) m).getCustomVariation()); Utils.setBlockFacing(newBlockData, ((BlockMechanic) m).getCustomVariation());
return newBlockData; return newBlockData;
@ -69,7 +69,7 @@ public class OraxenLink {
} }
public MechanicFactory getFactory(String id) { public MechanicFactory getFactory(String id) {
if (!supported()) { if(!supported()) {
return null; return null;
} }
@ -78,12 +78,12 @@ public class OraxenLink {
f.setAccessible(true); f.setAccessible(true);
Map<String, MechanicFactory> map = (Map<String, MechanicFactory>) f.get(null); Map<String, MechanicFactory> map = (Map<String, MechanicFactory>) f.get(null);
for (MechanicFactory i : map.values()) { for(MechanicFactory i : map.values()) {
if (i.getItems().contains(id)) { if(i.getItems().contains(id)) {
return i; return i;
} }
} }
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -91,14 +91,14 @@ public class OraxenLink {
} }
public String[] getItemTypes() { public String[] getItemTypes() {
if (!supported()) { if(!supported()) {
return EMPTY; return EMPTY;
} }
KList<String> v = new KList<>(); KList<String> v = new KList<>();
for (String i : OraxenItems.getItemNames()) { for(String i : OraxenItems.getItemNames()) {
if (getBlockDataFor(i) != null) { if(getBlockDataFor(i) != null) {
v.add(i); v.add(i);
} }
} }

View File

@ -21,7 +21,6 @@ package com.volmit.iris.core.loader;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.engine.object.IrisImage; import com.volmit.iris.engine.object.IrisImage;
import com.volmit.iris.engine.object.IrisObject;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.collection.KSet;
import com.volmit.iris.util.data.KCache; import com.volmit.iris.util.data.KCache;
@ -60,7 +59,7 @@ public class ImageResourceLoader extends ResourceLoader<IrisImage> {
logLoad(j, img); logLoad(j, img);
tlt.addAndGet(p.getMilliseconds()); tlt.addAndGet(p.getMilliseconds());
return img; return img;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage()); Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage());
return null; return null;
@ -68,24 +67,24 @@ public class ImageResourceLoader extends ResourceLoader<IrisImage> {
} }
public String[] getPossibleKeys() { public String[] getPossibleKeys() {
if (possibleKeys != null) { if(possibleKeys != null) {
return possibleKeys; return possibleKeys;
} }
Iris.debug("Building " + resourceTypeName + " Possibility Lists"); Iris.debug("Building " + resourceTypeName + " Possibility Lists");
KSet<String> m = new KSet<>(); KSet<String> m = new KSet<>();
for (File i : getFolders()) { for(File i : getFolders()) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".png")) { if(j.isFile() && j.getName().endsWith(".png")) {
m.add(j.getName().replaceAll("\\Q.png\\E", "")); m.add(j.getName().replaceAll("\\Q.png\\E", ""));
} else if (j.isDirectory()) { } else if(j.isDirectory()) {
for (File k : j.listFiles()) { for(File k : j.listFiles()) {
if (k.isFile() && k.getName().endsWith(".png")) { if(k.isFile() && k.getName().endsWith(".png")) {
m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.png\\E", "")); m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.png\\E", ""));
} else if (k.isDirectory()) { } else if(k.isDirectory()) {
for (File l : k.listFiles()) { for(File l : k.listFiles()) {
if (l.isFile() && l.getName().endsWith(".png")) { if(l.isFile() && l.getName().endsWith(".png")) {
m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.png\\E", "")); m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.png\\E", ""));
} }
} }
@ -101,16 +100,16 @@ public class ImageResourceLoader extends ResourceLoader<IrisImage> {
} }
public File findFile(String name) { public File findFile(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".png") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".png") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return j; return j;
} }
} }
File file = new File(i, name + ".png"); File file = new File(i, name + ".png");
if (file.exists()) { if(file.exists()) {
return file; return file;
} }
} }
@ -125,16 +124,16 @@ public class ImageResourceLoader extends ResourceLoader<IrisImage> {
} }
private IrisImage loadRaw(String name) { private IrisImage loadRaw(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".png") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".png") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return loadFile(j, name); return loadFile(j, name);
} }
} }
File file = new File(i, name + ".png"); File file = new File(i, name + ".png");
if (file.exists()) { if(file.exists()) {
return loadFile(file, name); return loadFile(file, name);
} }
} }

View File

@ -115,8 +115,8 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
public static int cacheSize() { public static int cacheSize() {
int m = 0; int m = 0;
for (IrisData i : dataLoaders.values()) { for(IrisData i : dataLoaders.values()) {
for (ResourceLoader<?> j : i.getLoaders().values()) { for(ResourceLoader<?> j : i.getLoaders().values()) {
m += j.getLoadCache().getSize(); m += j.getLoadCache().getSize();
} }
} }
@ -206,17 +206,17 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
public static <T extends IrisRegistrant> T loadAny(String key, Function<IrisData, T> v) { public static <T extends IrisRegistrant> T loadAny(String key, Function<IrisData, T> v) {
try { try {
for (File i : Objects.requireNonNull(Iris.instance.getDataFolder("packs").listFiles())) { for(File i : Objects.requireNonNull(Iris.instance.getDataFolder("packs").listFiles())) {
if (i.isDirectory()) { if(i.isDirectory()) {
IrisData dm = get(i); IrisData dm = get(i);
T t = v.apply(dm); T t = v.apply(dm);
if (t != null) { if(t != null) {
return t; return t;
} }
} }
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -227,9 +227,9 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
public ResourceLoader<?> getTypedLoaderFor(File f) { public ResourceLoader<?> getTypedLoaderFor(File f) {
String[] k = f.getPath().split("\\Q" + File.separator + "\\E"); String[] k = f.getPath().split("\\Q" + File.separator + "\\E");
for (String i : k) { for(String i : k) {
for (ResourceLoader<?> j : loaders.values()) { for(ResourceLoader<?> j : loaders.values()) {
if (j.getFolderName().equals(i)) { if(j.getFolderName().equals(i)) {
return j; return j;
} }
} }
@ -239,7 +239,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
} }
public void cleanupEngine() { public void cleanupEngine() {
if (engine != null && engine.isClosed()) { if(engine != null && engine.isClosed()) {
engine = null; engine = null;
Iris.debug("Dereferenced Data<Engine> " + getId() + " " + getDataFolder()); Iris.debug("Dereferenced Data<Engine> " + getId() + " " + getDataFolder());
} }
@ -250,30 +250,30 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
IrisContext ctx = IrisContext.get(); IrisContext ctx = IrisContext.get();
Engine engine = this.engine; Engine engine = this.engine;
if (engine == null && ctx != null && ctx.getEngine() != null) { if(engine == null && ctx != null && ctx.getEngine() != null) {
engine = ctx.getEngine(); engine = ctx.getEngine();
} }
if (engine == null && t.getPreprocessors().isNotEmpty()) { if(engine == null && t.getPreprocessors().isNotEmpty()) {
Iris.error("Failed to preprocess object " + t.getLoadKey() + " because there is no engine context here. (See stack below)"); Iris.error("Failed to preprocess object " + t.getLoadKey() + " because there is no engine context here. (See stack below)");
try { try {
throw new RuntimeException(); throw new RuntimeException();
} catch (Throwable ex) { } catch(Throwable ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
if (engine != null && t.getPreprocessors().isNotEmpty()) { if(engine != null && t.getPreprocessors().isNotEmpty()) {
synchronized (this) { synchronized(this) {
engine.getExecution().getAPI().setPreprocessorObject(t); engine.getExecution().getAPI().setPreprocessorObject(t);
for (String i : t.getPreprocessors()) { for(String i : t.getPreprocessors()) {
engine.getExecution().execute(i); engine.getExecution().execute(i);
Iris.debug("Loader<" + C.GREEN + t.getTypeName() + C.LIGHT_PURPLE + "> iprocess " + C.YELLOW + t.getLoadKey() + C.LIGHT_PURPLE + " in <rainbow>" + i); Iris.debug("Loader<" + C.GREEN + t.getTypeName() + C.LIGHT_PURPLE + "> iprocess " + C.YELLOW + t.getLoadKey() + C.LIGHT_PURPLE + " in <rainbow>" + i);
} }
} }
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.error("Failed to preprocess object!"); Iris.error("Failed to preprocess object!");
e.printStackTrace(); e.printStackTrace();
} }
@ -292,13 +292,13 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
try { try {
IrisRegistrant rr = registrant.getConstructor().newInstance(); IrisRegistrant rr = registrant.getConstructor().newInstance();
ResourceLoader<T> r = null; ResourceLoader<T> r = null;
if (registrant.equals(IrisObject.class)) { if(registrant.equals(IrisObject.class)) {
r = (ResourceLoader<T>) new ObjectResourceLoader(dataFolder, this, rr.getFolderName(), r = (ResourceLoader<T>) new ObjectResourceLoader(dataFolder, this, rr.getFolderName(),
rr.getTypeName()); rr.getTypeName());
} else if (registrant.equals(IrisScript.class)) { } else if(registrant.equals(IrisScript.class)) {
r = (ResourceLoader<T>) new ScriptResourceLoader(dataFolder, this, rr.getFolderName(), r = (ResourceLoader<T>) new ScriptResourceLoader(dataFolder, this, rr.getFolderName(),
rr.getTypeName()); rr.getTypeName());
}else if (registrant.equals(IrisImage.class)) { } else if(registrant.equals(IrisImage.class)) {
r = (ResourceLoader<T>) new ImageResourceLoader(dataFolder, this, rr.getFolderName(), r = (ResourceLoader<T>) new ImageResourceLoader(dataFolder, this, rr.getFolderName(),
rr.getTypeName()); rr.getTypeName());
} else { } else {
@ -309,7 +309,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
loaders.put(registrant, r); loaders.put(registrant, r);
return r; return r;
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
Iris.error("Failed to create loader! " + registrant.getCanonicalName()); Iris.error("Failed to create loader! " + registrant.getCanonicalName());
} }
@ -351,26 +351,26 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
} }
public void dump() { public void dump() {
for (ResourceLoader<?> i : loaders.values()) { for(ResourceLoader<?> i : loaders.values()) {
i.clearCache(); i.clearCache();
} }
} }
public void clearLists() { public void clearLists() {
for (ResourceLoader<?> i : loaders.values()) { for(ResourceLoader<?> i : loaders.values()) {
i.clearList(); i.clearList();
} }
} }
public String toLoadKey(File f) { public String toLoadKey(File f) {
if (f.getPath().startsWith(getDataFolder().getPath())) { if(f.getPath().startsWith(getDataFolder().getPath())) {
String[] full = f.getPath().split("\\Q" + File.separator + "\\E"); String[] full = f.getPath().split("\\Q" + File.separator + "\\E");
String[] df = getDataFolder().getPath().split("\\Q" + File.separator + "\\E"); String[] df = getDataFolder().getPath().split("\\Q" + File.separator + "\\E");
String g = ""; String g = "";
boolean m = true; boolean m = true;
for (int i = 0; i < full.length; i++) { for(int i = 0; i < full.length; i++) {
if (i >= df.length) { if(i >= df.length) {
if (m) { if(m) {
m = false; m = false;
continue; continue;
} }
@ -397,14 +397,14 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
@Override @Override
public boolean shouldSkipClass(Class<?> c) { public boolean shouldSkipClass(Class<?> c) {
if (c.equals(AtomicCache.class)) { if(c.equals(AtomicCache.class)) {
return true; return true;
} else return c.equals(ChronoLatch.class); } else return c.equals(ChronoLatch.class);
} }
@Override @Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
if (!typeToken.getRawType().isAnnotationPresent(Snippet.class)) { if(!typeToken.getRawType().isAnnotationPresent(Snippet.class)) {
return null; return null;
} }
@ -420,17 +420,17 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
public T read(JsonReader reader) throws IOException { public T read(JsonReader reader) throws IOException {
TypeAdapter<T> adapter = gson.getDelegateAdapter(IrisData.this, typeToken); TypeAdapter<T> adapter = gson.getDelegateAdapter(IrisData.this, typeToken);
if (reader.peek().equals(JsonToken.STRING)) { if(reader.peek().equals(JsonToken.STRING)) {
String r = reader.nextString(); String r = reader.nextString();
if (r.startsWith("snippet/" + snippetType + "/")) { if(r.startsWith("snippet/" + snippetType + "/")) {
File f = new File(getDataFolder(), r + ".json"); File f = new File(getDataFolder(), r + ".json");
if (f.exists()) { if(f.exists()) {
try { try {
JsonReader snippetReader = new JsonReader(new FileReader(f)); JsonReader snippetReader = new JsonReader(new FileReader(f));
return adapter.read(snippetReader); return adapter.read(snippetReader);
} catch (Throwable e) { } catch(Throwable e) {
Iris.error("Couldn't read snippet " + r + " in " + reader.getPath() + " (" + e.getMessage() + ")"); Iris.error("Couldn't read snippet " + r + " in " + reader.getPath() + " (" + e.getMessage() + ")");
} }
} else { } else {
@ -443,11 +443,11 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
try { try {
return adapter.read(reader); return adapter.read(reader);
} catch (Throwable e) { } catch(Throwable e) {
Iris.error("Failed to read " + typeToken.getRawType().getCanonicalName() + "... faking objects a little to load the file at least."); Iris.error("Failed to read " + typeToken.getRawType().getCanonicalName() + "... faking objects a little to load the file at least.");
try { try {
return (T) typeToken.getRawType().getConstructor().newInstance(); return (T) typeToken.getRawType().getConstructor().newInstance();
} catch (Throwable ignored) { } catch(Throwable ignored) {
} }
} }
@ -462,8 +462,8 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory {
File snippetFolder = new File(getDataFolder(), "snippet/" + f); File snippetFolder = new File(getDataFolder(), "snippet/" + f);
if (snippetFolder.exists() && snippetFolder.isDirectory()) { if(snippetFolder.exists() && snippetFolder.isDirectory()) {
for (File i : snippetFolder.listFiles()) { for(File i : snippetFolder.listFiles()) {
l.add("snippet/" + f + "/" + i.getName().split("\\Q.\\E")[0]); l.add("snippet/" + f + "/" + i.getName().split("\\Q.\\E")[0]);
} }
} }

View File

@ -56,7 +56,7 @@ public abstract class IrisRegistrant {
public File openInVSCode() { public File openInVSCode() {
try { try {
Desktop.getDesktop().open(getLoadFile()); Desktop.getDesktop().open(getLoadFile());
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }

View File

@ -57,7 +57,7 @@ public class ObjectResourceLoader extends ResourceLoader<IrisObject> {
logLoad(j, t); logLoad(j, t);
tlt.addAndGet(p.getMilliseconds()); tlt.addAndGet(p.getMilliseconds());
return t; return t;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage()); Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage());
return null; return null;
@ -65,24 +65,24 @@ public class ObjectResourceLoader extends ResourceLoader<IrisObject> {
} }
public String[] getPossibleKeys() { public String[] getPossibleKeys() {
if (possibleKeys != null) { if(possibleKeys != null) {
return possibleKeys; return possibleKeys;
} }
Iris.debug("Building " + resourceTypeName + " Possibility Lists"); Iris.debug("Building " + resourceTypeName + " Possibility Lists");
KSet<String> m = new KSet<>(); KSet<String> m = new KSet<>();
for (File i : getFolders()) { for(File i : getFolders()) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".iob")) { if(j.isFile() && j.getName().endsWith(".iob")) {
m.add(j.getName().replaceAll("\\Q.iob\\E", "")); m.add(j.getName().replaceAll("\\Q.iob\\E", ""));
} else if (j.isDirectory()) { } else if(j.isDirectory()) {
for (File k : j.listFiles()) { for(File k : j.listFiles()) {
if (k.isFile() && k.getName().endsWith(".iob")) { if(k.isFile() && k.getName().endsWith(".iob")) {
m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.iob\\E", "")); m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.iob\\E", ""));
} else if (k.isDirectory()) { } else if(k.isDirectory()) {
for (File l : k.listFiles()) { for(File l : k.listFiles()) {
if (l.isFile() && l.getName().endsWith(".iob")) { if(l.isFile() && l.getName().endsWith(".iob")) {
m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.iob\\E", "")); m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.iob\\E", ""));
} }
} }
@ -98,16 +98,16 @@ public class ObjectResourceLoader extends ResourceLoader<IrisObject> {
} }
public File findFile(String name) { public File findFile(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".iob") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".iob") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return j; return j;
} }
} }
File file = new File(i, name + ".iob"); File file = new File(i, name + ".iob");
if (file.exists()) { if(file.exists()) {
return file; return file;
} }
} }
@ -122,16 +122,16 @@ public class ObjectResourceLoader extends ResourceLoader<IrisObject> {
} }
private IrisObject loadRaw(String name) { private IrisObject loadRaw(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".iob") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".iob") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return loadFile(j, name); return loadFile(j, name);
} }
} }
File file = new File(i, name + ".iob"); File file = new File(i, name + ".iob");
if (file.exists()) { if(file.exists()) {
return loadFile(file, name); return loadFile(file, name);
} }
} }

View File

@ -41,7 +41,6 @@ import java.io.File;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -82,7 +81,7 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
JSONObject o = new JSONObject(); JSONObject o = new JSONObject();
KList<String> fm = new KList<>(); KList<String> fm = new KList<>();
for (int g = 1; g < 8; g++) { for(int g = 1; g < 8; g++) {
fm.add("/" + folderName + Form.repeat("/*", g) + ".json"); fm.add("/" + folderName + Form.repeat("/*", g) + ".json");
} }
@ -95,16 +94,16 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
} }
public File findFile(String name) { public File findFile(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".json") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".json") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return j; return j;
} }
} }
File file = new File(i, name + ".json"); File file = new File(i, name + ".json");
if (file.exists()) { if(file.exists()) {
return file; return file;
} }
} }
@ -117,11 +116,11 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
public void logLoad(File path, T t) { public void logLoad(File path, T t) {
loads.getAndIncrement(); loads.getAndIncrement();
if (loads.get() == 1) { if(loads.get() == 1) {
sec.flip(); sec.flip();
} }
if (sec.flip()) { if(sec.flip()) {
J.a(() -> { J.a(() -> {
Iris.verbose("Loaded " + C.WHITE + loads.get() + " " + resourceTypeName + (loads.get() == 1 ? "" : "s") + C.GRAY + " (" + Form.f(getLoadCache().getSize()) + " " + resourceTypeName + (loadCache.getSize() == 1 ? "" : "s") + " Loaded)"); Iris.verbose("Loaded " + C.WHITE + loads.get() + " " + resourceTypeName + (loads.get() == 1 ? "" : "s") + C.GRAY + " (" + Form.f(getLoadCache().getSize()) + " " + resourceTypeName + (loadCache.getSize() == 1 ? "" : "s") + " Loaded)");
loads.set(0); loads.set(0);
@ -142,32 +141,32 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
} }
private void matchFiles(File at, KList<File> files, Predicate<File> f) { private void matchFiles(File at, KList<File> files, Predicate<File> f) {
if (at.isDirectory()) { if(at.isDirectory()) {
for (File i : at.listFiles()) { for(File i : at.listFiles()) {
matchFiles(i, files, f); matchFiles(i, files, f);
} }
} else { } else {
if (f.test(at)) { if(f.test(at)) {
files.add(at); files.add(at);
} }
} }
} }
public String[] getPossibleKeys() { public String[] getPossibleKeys() {
if (possibleKeys != null) { if(possibleKeys != null) {
return possibleKeys; return possibleKeys;
} }
KSet<String> m = new KSet<>(); KSet<String> m = new KSet<>();
KList<File> files = getFolders(); KList<File> files = getFolders();
if (files == null) { if(files == null) {
possibleKeys = new String[0]; possibleKeys = new String[0];
return possibleKeys; return possibleKeys;
} }
for (File i : files) { for(File i : files) {
for (File j : matchAllFiles(i, (f) -> f.getName().endsWith(".json"))) { for(File j : matchAllFiles(i, (f) -> f.getName().endsWith(".json"))) {
m.add(i.toURI().relativize(j.toURI()).getPath().replaceAll("\\Q.json\\E", "")); m.add(i.toURI().relativize(j.toURI()).getPath().replaceAll("\\Q.json\\E", ""));
} }
} }
@ -193,7 +192,7 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
logLoad(j, t); logLoad(j, t);
tlt.addAndGet(p.getMilliseconds()); tlt.addAndGet(p.getMilliseconds());
return t; return t;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
failLoad(j, e); failLoad(j, e);
return null; return null;
@ -211,10 +210,10 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
public KList<T> loadAll(KList<String> s) { public KList<T> loadAll(KList<String> s) {
KList<T> m = new KList<>(); KList<T> m = new KList<>();
for (String i : s) { for(String i : s) {
T t = load(i); T t = load(i);
if (t != null) { if(t != null) {
m.add(t); m.add(t);
} }
} }
@ -225,10 +224,10 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
public KList<T> loadAll(KList<String> s, Consumer<T> postLoad) { public KList<T> loadAll(KList<String> s, Consumer<T> postLoad) {
KList<T> m = new KList<>(); KList<T> m = new KList<>();
for (String i : s) { for(String i : s) {
T t = load(i); T t = load(i);
if (t != null) { if(t != null) {
m.add(t); m.add(t);
postLoad.accept(t); postLoad.accept(t);
} }
@ -240,10 +239,10 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
public KList<T> loadAll(String[] s) { public KList<T> loadAll(String[] s) {
KList<T> m = new KList<>(); KList<T> m = new KList<>();
for (String i : s) { for(String i : s) {
T t = load(i); T t = load(i);
if (t != null) { if(t != null) {
m.add(t); m.add(t);
} }
} }
@ -256,17 +255,17 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
} }
private T loadRaw(String name) { private T loadRaw(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
//noinspection ConstantConditions //noinspection ConstantConditions
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".json") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".json") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return loadFile(j, name); return loadFile(j, name);
} }
} }
File file = new File(i, name + ".json"); File file = new File(i, name + ".json");
if (file.exists()) { if(file.exists()) {
return loadFile(file, name); return loadFile(file, name);
} }
} }
@ -275,11 +274,11 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
} }
public T load(String name, boolean warn) { public T load(String name, boolean warn) {
if (name == null) { if(name == null) {
return null; return null;
} }
if (name.trim().isEmpty()) { if(name.trim().isEmpty()) {
return null; return null;
} }
@ -287,12 +286,12 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
} }
public KList<File> getFolders() { public KList<File> getFolders() {
if (folderCache.get() == null) { if(folderCache.get() == null) {
folderCache.set(new KList<>()); folderCache.set(new KList<>());
for (File i : root.listFiles()) { for(File i : root.listFiles()) {
if (i.isDirectory()) { if(i.isDirectory()) {
if (i.getName().equals(folderName)) { if(i.getName().equals(folderName)) {
folderCache.get().add(i); folderCache.get().add(i);
break; break;
} }
@ -306,9 +305,9 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
public KList<File> getFolders(String rc) { public KList<File> getFolders(String rc) {
KList<File> folders = getFolders().copy(); KList<File> folders = getFolders().copy();
if (rc.contains(":")) { if(rc.contains(":")) {
for (File i : folders.copy()) { for(File i : folders.copy()) {
if (!rc.startsWith(i.getName() + ":")) { if(!rc.startsWith(i.getName() + ":")) {
folders.remove(i); folders.remove(i);
} }
} }
@ -324,16 +323,16 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
} }
public File fileFor(T b) { public File fileFor(T b) {
for (File i : getFolders()) { for(File i : getFolders()) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".json") && j.getName().split("\\Q.\\E")[0].equals(b.getLoadKey())) { if(j.isFile() && j.getName().endsWith(".json") && j.getName().split("\\Q.\\E")[0].equals(b.getLoadKey())) {
return j; return j;
} }
} }
File file = new File(i, b.getLoadKey() + ".json"); File file = new File(i, b.getLoadKey() + ".json");
if (file.exists()) { if(file.exists()) {
return file; return file;
} }
} }
@ -353,8 +352,8 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
public KList<String> getPossibleKeys(String arg) { public KList<String> getPossibleKeys(String arg) {
KList<String> f = new KList<>(); KList<String> f = new KList<>();
for (String i : getPossibleKeys()) { for(String i : getPossibleKeys()) {
if (i.equalsIgnoreCase(arg) || i.toLowerCase(Locale.ROOT).startsWith(arg.toLowerCase(Locale.ROOT)) || i.toLowerCase(Locale.ROOT).contains(arg.toLowerCase(Locale.ROOT)) || arg.toLowerCase(Locale.ROOT).contains(i.toLowerCase(Locale.ROOT))) { if(i.equalsIgnoreCase(arg) || i.toLowerCase(Locale.ROOT).startsWith(arg.toLowerCase(Locale.ROOT)) || i.toLowerCase(Locale.ROOT).contains(arg.toLowerCase(Locale.ROOT)) || arg.toLowerCase(Locale.ROOT).contains(i.toLowerCase(Locale.ROOT))) {
f.add(i); f.add(i);
} }
} }

View File

@ -53,7 +53,7 @@ public class ScriptResourceLoader extends ResourceLoader<IrisScript> {
logLoad(j, t); logLoad(j, t);
tlt.addAndGet(p.getMilliseconds()); tlt.addAndGet(p.getMilliseconds());
return t; return t;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage()); Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage());
return null; return null;
@ -61,24 +61,24 @@ public class ScriptResourceLoader extends ResourceLoader<IrisScript> {
} }
public String[] getPossibleKeys() { public String[] getPossibleKeys() {
if (possibleKeys != null) { if(possibleKeys != null) {
return possibleKeys; return possibleKeys;
} }
Iris.debug("Building " + resourceTypeName + " Possibility Lists"); Iris.debug("Building " + resourceTypeName + " Possibility Lists");
KSet<String> m = new KSet<>(); KSet<String> m = new KSet<>();
for (File i : getFolders()) { for(File i : getFolders()) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".js")) { if(j.isFile() && j.getName().endsWith(".js")) {
m.add(j.getName().replaceAll("\\Q.js\\E", "")); m.add(j.getName().replaceAll("\\Q.js\\E", ""));
} else if (j.isDirectory()) { } else if(j.isDirectory()) {
for (File k : j.listFiles()) { for(File k : j.listFiles()) {
if (k.isFile() && k.getName().endsWith(".js")) { if(k.isFile() && k.getName().endsWith(".js")) {
m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.js\\E", "")); m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.js\\E", ""));
} else if (k.isDirectory()) { } else if(k.isDirectory()) {
for (File l : k.listFiles()) { for(File l : k.listFiles()) {
if (l.isFile() && l.getName().endsWith(".js")) { if(l.isFile() && l.getName().endsWith(".js")) {
m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.js\\E", "")); m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.js\\E", ""));
} }
} }
@ -94,16 +94,16 @@ public class ScriptResourceLoader extends ResourceLoader<IrisScript> {
} }
public File findFile(String name) { public File findFile(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".js") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".js") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return j; return j;
} }
} }
File file = new File(i, name + ".js"); File file = new File(i, name + ".js");
if (file.exists()) { if(file.exists()) {
return file; return file;
} }
} }
@ -114,16 +114,16 @@ public class ScriptResourceLoader extends ResourceLoader<IrisScript> {
} }
private IrisScript loadRaw(String name) { private IrisScript loadRaw(String name) {
for (File i : getFolders(name)) { for(File i : getFolders(name)) {
for (File j : i.listFiles()) { for(File j : i.listFiles()) {
if (j.isFile() && j.getName().endsWith(".js") && j.getName().split("\\Q.\\E")[0].equals(name)) { if(j.isFile() && j.getName().endsWith(".js") && j.getName().split("\\Q.\\E")[0].equals(name)) {
return loadFile(j, name); return loadFile(j, name);
} }
} }
File file = new File(i, name + ".js"); File file = new File(i, name + ".js");
if (file.exists()) { if(file.exists()) {
return loadFile(file, name); return loadFile(file, name);
} }
} }

View File

@ -20,7 +20,7 @@ package com.volmit.iris.core.nms;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.nms.v17_1.NMSBinding17_1; import com.volmit.iris.core.nms.v18_1.NMSBinding18_1;
import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.nms.v1X.NMSBinding1X;
import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KMap;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -28,7 +28,7 @@ import org.bukkit.Bukkit;
public class INMS { public class INMS {
//@builder //@builder
private static final KMap<String, Class<? extends INMSBinding>> bindings = new KMap<String, Class<? extends INMSBinding>>() private static final KMap<String, Class<? extends INMSBinding>> bindings = new KMap<String, Class<? extends INMSBinding>>()
.qput("v1_17_R1", NMSBinding17_1.class); .qput("v1_18_R1", NMSBinding18_1.class);
//@done //@done
private static final INMSBinding binding = bind(); private static final INMSBinding binding = bind();
@ -37,13 +37,13 @@ public class INMS {
} }
public static final String getNMSTag() { public static final String getNMSTag() {
if (IrisSettings.get().getGeneral().isDisableNMS()) { if(IrisSettings.get().getGeneral().isDisableNMS()) {
return "BUKKIT"; return "BUKKIT";
} }
try { try {
return Bukkit.getServer().getClass().getCanonicalName().split("\\Q.\\E")[3]; return Bukkit.getServer().getClass().getCanonicalName().split("\\Q.\\E")[3];
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.error("Failed to determine server nms version!"); Iris.error("Failed to determine server nms version!");
e.printStackTrace(); e.printStackTrace();
@ -56,13 +56,13 @@ public class INMS {
String code = getNMSTag(); String code = getNMSTag();
Iris.info("Locating NMS Binding for " + code); Iris.info("Locating NMS Binding for " + code);
if (bindings.containsKey(code)) { if(bindings.containsKey(code)) {
try { try {
INMSBinding b = bindings.get(code).getConstructor().newInstance(); INMSBinding b = bindings.get(code).getConstructor().newInstance();
Iris.info("Craftbukkit " + code + " <-> " + b.getClass().getSimpleName() + " Successfully Bound"); Iris.info("Craftbukkit " + code + " <-> " + b.getClass().getSimpleName() + " Successfully Bound");
return b; return b;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -24,6 +24,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public enum NMSVersion { public enum NMSVersion {
R1_18,
R1_17,
R1_16, R1_16,
R1_15, R1_15,
R1_14, R1_14,
@ -45,49 +47,57 @@ public enum NMSVersion {
} }
public static NMSVersion current() { public static NMSVersion current() {
if (tryVersion("1_8_R3")) { if(tryVersion("1_8_R3")) {
return R1_8; return R1_8;
} }
if (tryVersion("1_9_R1")) { if(tryVersion("1_9_R1")) {
return R1_9_2; return R1_9_2;
} }
if (tryVersion("1_9_R2")) { if(tryVersion("1_9_R2")) {
return R1_9_4; return R1_9_4;
} }
if (tryVersion("1_10_R1")) { if(tryVersion("1_10_R1")) {
return R1_10; return R1_10;
} }
if (tryVersion("1_11_R1")) { if(tryVersion("1_11_R1")) {
return R1_11; return R1_11;
} }
if (tryVersion("1_12_R1")) { if(tryVersion("1_12_R1")) {
return R1_12; return R1_12;
} }
if (tryVersion("1_13_R1")) { if(tryVersion("1_13_R1")) {
return R1_13; return R1_13;
} }
if (tryVersion("1_13_R2")) { if(tryVersion("1_13_R2")) {
return R1_13_1; return R1_13_1;
} }
if (tryVersion("1_14_R1")) { if(tryVersion("1_14_R1")) {
return R1_14; return R1_14;
} }
if (tryVersion("1_15_R1")) { if(tryVersion("1_15_R1")) {
return R1_15; return R1_15;
} }
if (tryVersion("1_16_R1")) { if(tryVersion("1_16_R1")) {
return R1_16; return R1_16;
} }
if(tryVersion("1_17_R1")) {
return R1_17;
}
if(tryVersion("1_18_R1")) {
return R1_18;
}
return null; return null;
} }
@ -95,7 +105,7 @@ public enum NMSVersion {
try { try {
Class.forName("org.bukkit.craftbukkit.v" + v + ".CraftWorld"); Class.forName("org.bukkit.craftbukkit.v" + v + ".CraftWorld");
return true; return true;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -106,8 +116,8 @@ public enum NMSVersion {
public List<NMSVersion> getAboveInclusive() { public List<NMSVersion> getAboveInclusive() {
List<NMSVersion> n = new ArrayList<>(); List<NMSVersion> n = new ArrayList<>();
for (NMSVersion i : values()) { for(NMSVersion i : values()) {
if (i.ordinal() >= ordinal()) { if(i.ordinal() >= ordinal()) {
n.add(i); n.add(i);
} }
} }
@ -118,8 +128,8 @@ public enum NMSVersion {
public List<NMSVersion> betweenInclusive(NMSVersion other) { public List<NMSVersion> betweenInclusive(NMSVersion other) {
List<NMSVersion> n = new ArrayList<>(); List<NMSVersion> n = new ArrayList<>();
for (NMSVersion i : values()) { for(NMSVersion i : values()) {
if (i.ordinal() <= Math.max(other.ordinal(), ordinal()) && i.ordinal() >= Math.min(ordinal(), other.ordinal())) { if(i.ordinal() <= Math.max(other.ordinal(), ordinal()) && i.ordinal() >= Math.min(ordinal(), other.ordinal())) {
n.add(i); n.add(i);
} }
} }
@ -130,8 +140,8 @@ public enum NMSVersion {
public List<NMSVersion> getBelowInclusive() { public List<NMSVersion> getBelowInclusive() {
List<NMSVersion> n = new ArrayList<>(); List<NMSVersion> n = new ArrayList<>();
for (NMSVersion i : values()) { for(NMSVersion i : values()) {
if (i.ordinal() <= ordinal()) { if(i.ordinal() <= ordinal()) {
n.add(i); n.add(i);
} }
} }

View File

@ -1,486 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.core.nms.v17_1;
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.nbt.io.NBTUtil;
import com.volmit.iris.util.nbt.mca.NBTWorld;
import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAChunkBiomeContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAGlobalPalette;
import com.volmit.iris.util.nbt.mca.palette.MCAIdMap;
import com.volmit.iris.util.nbt.mca.palette.MCAIdMapper;
import com.volmit.iris.util.nbt.mca.palette.MCAPalette;
import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess;
import com.volmit.iris.util.nbt.mca.palette.MCAPalettedContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAWrappedPalettedContainer;
import com.volmit.iris.util.nbt.tag.CompoundTag;
import net.minecraft.core.BlockPosition;
import net.minecraft.core.IRegistry;
import net.minecraft.core.IRegistryWritable;
import net.minecraft.nbt.NBTCompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagDouble;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.WorldServer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.biome.BiomeBase;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.TileEntity;
import net.minecraft.world.level.block.state.IBlockData;
import net.minecraft.world.level.chunk.BiomeStorage;
import net.minecraft.world.level.chunk.Chunk;
import net.minecraft.world.level.chunk.ChunkSection;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.v1_17_R1.CraftServer;
import org.bukkit.craftbukkit.v1_17_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity;
import org.bukkit.entity.EntityType;
import org.bukkit.generator.ChunkGenerator;
import org.jetbrains.annotations.NotNull;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class NMSBinding17_1 implements INMSBinding {
private final BlockData AIR = Material.AIR.createBlockData();
private final KMap<Biome, Object> baseBiomeCache = new KMap<>();
private final AtomicCache<MCAIdMapper<IBlockData>> registryCache = new AtomicCache<>();
private final AtomicCache<MCAPalette<IBlockData>> globalCache = new AtomicCache<>();
private final AtomicCache<MCAIdMap<BiomeBase>> biomeMapCache = new AtomicCache<>();
private Field biomeStorageCache = null;
public boolean supportsDataPacks() {
return true;
}
@Override
public MCAPaletteAccess createPalette() {
MCAIdMapper<IBlockData> registry = registryCache.aquireNasty(() -> {
Field cf = net.minecraft.core.RegistryBlockID.class.getDeclaredField("c");
Field df = net.minecraft.core.RegistryBlockID.class.getDeclaredField("d");
Field bf = net.minecraft.core.RegistryBlockID.class.getDeclaredField("b");
cf.setAccessible(true);
df.setAccessible(true);
bf.setAccessible(true);
net.minecraft.core.RegistryBlockID<IBlockData> blockData = Block.p;
int b = bf.getInt(blockData);
IdentityHashMap<IBlockData, Integer> c = (IdentityHashMap<IBlockData, Integer>) cf.get(blockData);
List<IBlockData> d = (List<IBlockData>) df.get(blockData);
return new MCAIdMapper<>(c, d, b);
});
MCAPalette<IBlockData> global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState()));
MCAPalettedContainer<IBlockData> 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());
}
private Object getBiomeStorage(ChunkGenerator.BiomeGrid g) {
try {
return getFieldForBiomeStorage(g).get(g);
} catch (IllegalAccessException e) {
Iris.reportError(e);
e.printStackTrace();
}
return null;
}
@Override
public boolean hasTile(Location l) {
return ((CraftWorld) l.getWorld()).getHandle().getTileEntity(new BlockPosition(l.getBlockX(), l.getBlockY(), l.getBlockZ()), false) != null;
}
@Override
public CompoundTag serializeTile(Location location) {
TileEntity e = ((CraftWorld) location.getWorld()).getHandle().getTileEntity(new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()), true);
if (e == null) {
return null;
}
NBTTagCompound tag = new NBTTagCompound();
e.save(tag);
return convert(tag);
}
@Override
public void deserializeTile(CompoundTag s, Location newPosition) {
NBTTagCompound c = convert(s);
if (c != null) {
int x = newPosition.getBlockX();
int y = newPosition.getBlockY();
int z = newPosition.getBlockZ();
WorldServer w = ((CraftWorld) newPosition.getWorld()).getHandle();
Chunk ch = w.getChunkAt(x >> 4, z >> 4);
ChunkSection sect = ch.getSections()[y >> 4];
IBlockData block = sect.getBlocks().a(x & 15, y & 15, z & 15);
BlockPosition pos = new BlockPosition(x, y, z);
ch.b(TileEntity.create(pos, block, c));
}
}
private NBTTagCompound convert(CompoundTag tag) {
try {
ByteArrayOutputStream boas = new ByteArrayOutputStream();
NBTUtil.write(tag, boas, false);
DataInputStream din = new DataInputStream(new ByteArrayInputStream(boas.toByteArray()));
NBTTagCompound c = NBTCompressedStreamTools.a((DataInput) din);
din.close();
return c;
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
private CompoundTag convert(NBTTagCompound tag) {
try {
ByteArrayOutputStream boas = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(boas);
NBTCompressedStreamTools.a(tag, (DataOutput) dos);
dos.close();
return (CompoundTag) NBTUtil.read(new ByteArrayInputStream(boas.toByteArray()), false).getTag();
} catch (Throwable ex) {
ex.printStackTrace();
}
return null;
}
@Override
public CompoundTag serializeEntity(org.bukkit.entity.Entity be) {
Entity entity = ((CraftEntity) be).getHandle();
NBTTagCompound tag = new NBTTagCompound();
entity.save(tag);
CompoundTag t = convert(tag);
t.putInt("btype", be.getType().ordinal());
return t;
}
@Override
public org.bukkit.entity.Entity deserializeEntity(CompoundTag s, Location newPosition) {
EntityType type = EntityType.values()[s.getInt("btype")];
s.remove("btype");
NBTTagCompound tag = convert(s);
NBTTagList pos = tag.getList("Pos", 6);
pos.a(0, NBTTagDouble.a(newPosition.getX()));
pos.a(1, NBTTagDouble.a(newPosition.getY()));
pos.a(2, NBTTagDouble.a(newPosition.getZ()));
tag.set("Pos", pos);
org.bukkit.entity.Entity be = newPosition.getWorld().spawnEntity(newPosition, type);
((CraftEntity) be).getHandle().load(tag);
return be;
}
@Override
public boolean supportsCustomHeight() {
return false;
}
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;
}
private IRegistryWritable<BiomeBase> getCustomBiomeRegistry() {
return ((CraftServer) Bukkit.getServer()).getHandle().getServer().getCustomRegistry().b(IRegistry.aO);
}
@Override
public Object getBiomeBaseFromId(int id) {
return getCustomBiomeRegistry().fromId(id);
}
@Override
public int getTrueBiomeBaseId(Object biomeBase) {
return getCustomBiomeRegistry().getId((BiomeBase) biomeBase);
}
@Override
public Object getTrueBiomeBase(Location location) {
return ((CraftWorld) location.getWorld()).getHandle().getBiome(location.getBlockX(), location.getBlockY(), location.getBlockZ());
}
@Override
public String getTrueBiomeBaseKey(Location location) {
return getKeyForBiomeBase(getTrueBiomeBase(location));
}
@Override
public boolean supportsCustomBiomes() {
return true;
}
@Override
public int getMinHeight(World world) {
return world.getMinHeight();
}
@Override
public Object getCustomBiomeBaseFor(String mckey) {
try {
return getCustomBiomeRegistry().d(ResourceKey.a(IRegistry.aO, new MinecraftKey(mckey.toLowerCase())));
} catch (Throwable e) {
Iris.reportError(e);
}
return null;
}
@SuppressWarnings("OptionalGetWithoutIsPresent")
@Override
public String getKeyForBiomeBase(Object biomeBase) {
return getCustomBiomeRegistry().c((BiomeBase) biomeBase).get().a().toString();
}
@Override
public Object getBiomeBase(World world, Biome biome) {
return getBiomeBase(((CraftWorld) world).getHandle().t().d(IRegistry.aO), biome);
}
private Class<?>[] classify(Object... par) {
Class<?>[] g = new Class<?>[par.length];
for (int i = 0; i < g.length; i++) {
g[i] = par[i].getClass();
}
return g;
}
private <T> T invoke(Object from, String name, Object... par) {
try {
Method f = from.getClass().getDeclaredMethod(name, classify(par));
f.setAccessible(true);
//noinspection unchecked
return (T) f.invoke(from, par);
} catch (Throwable e) {
Iris.reportError(e);
e.printStackTrace();
}
return null;
}
private <T> T invokeStatic(Class<?> from, String name, Object... par) {
try {
Method f = from.getDeclaredMethod(name, classify(par));
f.setAccessible(true);
//noinspection unchecked
return (T) f.invoke(null, par);
} catch (Throwable e) {
Iris.reportError(e);
e.printStackTrace();
}
return null;
}
private <T> T getField(Object from, String name) {
try {
Field f = from.getClass().getDeclaredField(name);
f.setAccessible(true);
//noinspection unchecked
return (T) f.get(from);
} catch (Throwable e) {
Iris.reportError(e);
e.printStackTrace();
}
return null;
}
private <T> T getStaticField(Class<?> t, String name) {
try {
Field f = t.getDeclaredField(name);
f.setAccessible(true);
//noinspection unchecked
return (T) f.get(null);
} catch (Throwable e) {
Iris.reportError(e);
e.printStackTrace();
}
return null;
}
@Override
public Object getBiomeBase(Object registry, Biome biome) {
Object v = baseBiomeCache.get(biome);
if (v != null) {
return v;
}
//noinspection unchecked
v = org.bukkit.craftbukkit.v1_17_R1.block.CraftBlock.biomeToBiomeBase((IRegistry<BiomeBase>) 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 org.bukkit.craftbukkit.v1_17_R1.block.CraftBlock.biomeToBiomeBase((IRegistry<BiomeBase>) registry, Biome.PLAINS);
}
baseBiomeCache.put(biome, v);
return v;
}
@Override
public int getBiomeId(Biome biome) {
for (World i : Bukkit.getWorlds()) {
if (i.getEnvironment().equals(World.Environment.NORMAL)) {
IRegistry<BiomeBase> registry = ((CraftWorld) i).getHandle().t().d(IRegistry.aO);
return registry.getId((BiomeBase) getBiomeBase(registry, biome));
}
}
return biome.ordinal();
}
private MCAIdMap<BiomeBase> getBiomeMapping() {
return biomeMapCache.aquire(() -> new MCAIdMap<>() {
@NotNull
@Override
public Iterator<BiomeBase> iterator() {
return getCustomBiomeRegistry().iterator();
}
@Override
public int getId(BiomeBase paramT) {
return getCustomBiomeRegistry().getId(paramT);
}
@Override
public BiomeBase byId(int paramInt) {
return getCustomBiomeRegistry().fromId(paramInt);
}
});
}
@Override
public MCABiomeContainer newBiomeContainer(int min, int max) {
MCAChunkBiomeContainer<BiomeBase> base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max);
return getBiomeContainerInterface(getBiomeMapping(), base);
}
@Override
public MCABiomeContainer newBiomeContainer(int min, int max, int[] data) {
MCAChunkBiomeContainer<BiomeBase> base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max, data);
return getBiomeContainerInterface(getBiomeMapping(), base);
}
@NotNull
private MCABiomeContainer getBiomeContainerInterface(MCAIdMap<BiomeBase> biomeMapping, MCAChunkBiomeContainer<BiomeBase> 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 int countCustomBiomes() {
AtomicInteger a = new AtomicInteger(0);
getCustomBiomeRegistry().d().forEach((i) -> {
MinecraftKey k = i.getKey().a();
if (k.getNamespace().equals("minecraft")) {
return;
}
a.incrementAndGet();
Iris.debug("Custom Biome: " + k);
});
return a.get();
}
@Override
public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) {
try {
BiomeStorage s = (BiomeStorage) getFieldForBiomeStorage(chunk).get(chunk);
s.setBiome(x, y, z, (BiomeBase) somethingVeryDirty);
} catch (IllegalAccessException e) {
Iris.reportError(e);
e.printStackTrace();
}
}
@Override
public boolean isBukkit() {
return false;
}
}

View File

@ -0,0 +1,431 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.core.nms.v18_1;
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.nbt.io.NBTUtil;
import com.volmit.iris.util.nbt.mca.NBTWorld;
import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAChunkBiomeContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAGlobalPalette;
import com.volmit.iris.util.nbt.mca.palette.MCAIdMap;
import com.volmit.iris.util.nbt.mca.palette.MCAIdMapper;
import com.volmit.iris.util.nbt.mca.palette.MCAPalette;
import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess;
import com.volmit.iris.util.nbt.mca.palette.MCAPalettedContainer;
import com.volmit.iris.util.nbt.mca.palette.MCAWrappedPalettedContainer;
import com.volmit.iris.util.nbt.tag.CompoundTag;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import net.minecraft.core.BlockPos;
import net.minecraft.core.IdMap;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
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 org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.v1_18_R1.CraftServer;
import org.bukkit.craftbukkit.v1_18_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_18_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.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class NMSBinding18_1 implements INMSBinding {
private final KMap<Biome, Object> baseBiomeCache = new KMap<>();
private final BlockData AIR = Material.AIR.createBlockData();
private final AtomicCache<MCAIdMap<net.minecraft.world.level.biome.Biome>> biomeMapCache = new AtomicCache<>();
private final AtomicCache<MCAIdMapper<BlockState>> registryCache = new AtomicCache<>();
private final AtomicCache<MCAPalette<BlockState>> globalCache = new AtomicCache<>();
private final AtomicCache<RegistryAccess> registryAccess = new AtomicCache<>();
private final AtomicCache<Method> byIdRef = new AtomicCache<>();
private Field biomeStorageCache = null;
@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 newPosition) {
((CraftWorld) newPosition.getWorld()).getHandle().getChunkAt(new BlockPos(newPosition.getBlockX(), 0, newPosition.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.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer()));
}
private Registry<net.minecraft.world.level.biome.Biome> getCustomBiomeRegistry() {
return registry().registry(Registry.BIOME_REGISTRY).orElse(null);
}
private Registry<Block> getBlockRegistry() {
return registry().registry(Registry.BLOCK_REGISTRY).orElse(null);
}
@Override
public Object getBiomeBaseFromId(int id) {
try {
return byIdRef.aquire(() -> {
for(Method i : IdMap.class.getDeclaredMethods()) {
if(i.getParameterCount() == 1 && i.getParameterTypes()[0].equals(int.class)) {
Iris.info("[NMS] Found byId method in " + IdMap.class.getSimpleName() + "." + i.getName() + "(int) => " + Biome.class.getSimpleName());
return i;
}
}
Iris.error("Cannot find byId method!");
return null;
}).invoke(getCustomBiomeRegistry(), id);
} catch(IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
@Override
public int getMinHeight(World world) {
return world.getMinHeight();
}
@Override
public boolean supportsCustomBiomes() {
return true;
}
@Override
public int getTrueBiomeBaseId(Object biomeBase) {
return getCustomBiomeRegistry().getId((net.minecraft.world.level.biome.Biome) biomeBase);
}
@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 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 getBiomeBase(((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 = org.bukkit.craftbukkit.v1_18_R1.block.CraftBlock.biomeToBiomeBase((Registry<net.minecraft.world.level.biome.Biome>) 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 org.bukkit.craftbukkit.v1_18_R1.block.CraftBlock.biomeToBiomeBase((Registry<net.minecraft.world.level.biome.Biome>) 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<net.minecraft.world.level.biome.Biome> 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<net.minecraft.world.level.biome.Biome> getBiomeMapping() {
return biomeMapCache.aquire(() -> new MCAIdMap<>() {
@NotNull
@Override
public Iterator<net.minecraft.world.level.biome.Biome> 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<net.minecraft.world.level.biome.Biome> biomeMapping, MCAChunkBiomeContainer<net.minecraft.world.level.biome.Biome> 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<net.minecraft.world.level.biome.Biome> base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max);
return getBiomeContainerInterface(getBiomeMapping(), base);
}
@Override
public MCABiomeContainer newBiomeContainer(int min, int max, int[] data) {
MCAChunkBiomeContainer<net.minecraft.world.level.biome.Biome> 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;
}
@Override
public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) {
try {
ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk);
s.setBiome(x, y, z, (net.minecraft.world.level.biome.Biome) somethingVeryDirty);
} 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<BlockState> 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<BlockState> blockData = Block.BLOCK_STATE_REGISTRY;
int b = bf.getInt(blockData);
Object2IntMap<BlockState> c = (Object2IntMap<BlockState>) cf.get(blockData);
List<BlockState> d = (List<BlockState>) df.get(blockData);
return new MCAIdMapper<BlockState>(c, d, b);
});
MCAPalette<BlockState> global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState()));
MCAPalettedContainer<BlockState> 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());
}
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.info("[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) {
for(Field i : in.getClass().getFields()) {
if(i.getType().equals(returns)) {
i.setAccessible(true);
try {
Iris.info("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName());
return i.get(in);
} catch(IllegalAccessException e) {
e.printStackTrace();
}
}
}
return null;
}
}

View File

@ -35,12 +35,12 @@ public class NMSBinding1X implements INMSBinding {
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
private static boolean testCustomHeight() { private static boolean testCustomHeight() {
try { try {
if (World.class.getDeclaredMethod("getMaxHeight") != null && World.class.getDeclaredMethod("getMinHeight") != null) if(World.class.getDeclaredMethod("getMaxHeight") != null && World.class.getDeclaredMethod("getMinHeight") != null)
; ;
{ {
return true; return true;
} }
} catch (Throwable ignored) { } catch(Throwable ignored) {
} }

View File

@ -54,7 +54,8 @@ public class IrisPack {
* Create an iris pack backed by a data folder * Create an iris pack backed by a data folder
* the data folder is assumed to be in the Iris/packs/NAME folder * the data folder is assumed to be in the Iris/packs/NAME folder
* *
* @param name the name * @param name
* the name
*/ */
public IrisPack(String name) { public IrisPack(String name) {
this(packsPack(name)); this(packsPack(name));
@ -63,16 +64,17 @@ public class IrisPack {
/** /**
* Create an iris pack backed by a data folder * Create an iris pack backed by a data folder
* *
* @param folder the folder of the pack. Must be a directory * @param folder
* the folder of the pack. Must be a directory
*/ */
public IrisPack(File folder) { public IrisPack(File folder) {
this.folder = folder; this.folder = folder;
if (!folder.exists()) { if(!folder.exists()) {
throw new RuntimeException("Cannot open Pack " + folder.getPath() + " (directory doesnt exist)"); throw new RuntimeException("Cannot open Pack " + folder.getPath() + " (directory doesnt exist)");
} }
if (!folder.isDirectory()) { if(!folder.isDirectory()) {
throw new RuntimeException("Cannot open Pack " + folder.getPath() + " (not a directory)"); throw new RuntimeException("Cannot open Pack " + folder.getPath() + " (not a directory)");
} }
@ -82,20 +84,23 @@ public class IrisPack {
/** /**
* Create a new pack from the input url * Create a new pack from the input url
* *
* @param sender the sender * @param sender
* @param url the url, or name, or really anything see IrisPackRepository.from(String) * the sender
* @param url
* the url, or name, or really anything see IrisPackRepository.from(String)
* @return the iris pack * @return the iris pack
* @throws IrisException fails * @throws IrisException
* fails
*/ */
public static Future<IrisPack> from(VolmitSender sender, String url) throws IrisException { public static Future<IrisPack> from(VolmitSender sender, String url) throws IrisException {
IrisPackRepository repo = IrisPackRepository.from(url); IrisPackRepository repo = IrisPackRepository.from(url);
if (repo == null) { if(repo == null) {
throw new IrisException("Null Repo"); throw new IrisException("Null Repo");
} }
try { try {
return from(sender, repo); return from(sender, repo);
} catch (MalformedURLException e) { } catch(MalformedURLException e) {
throw new IrisException("Malformed URL " + e.getMessage()); throw new IrisException("Malformed URL " + e.getMessage());
} }
} }
@ -103,10 +108,13 @@ public class IrisPack {
/** /**
* Create a pack from a repo * Create a pack from a repo
* *
* @param sender the sender * @param sender
* @param repo the repo * the sender
* @param repo
* the repo
* @return the pack * @return the pack
* @throws MalformedURLException shit happens * @throws MalformedURLException
* shit happens
*/ */
public static Future<IrisPack> from(VolmitSender sender, IrisPackRepository repo) throws MalformedURLException { public static Future<IrisPack> from(VolmitSender sender, IrisPackRepository repo) throws MalformedURLException {
CompletableFuture<IrisPack> pack = new CompletableFuture<>(); CompletableFuture<IrisPack> pack = new CompletableFuture<>();
@ -119,14 +127,16 @@ public class IrisPack {
/** /**
* Create a blank pack with a given name * Create a blank pack with a given name
* *
* @param name the name of the pack * @param name
* the name of the pack
* @return the pack * @return the pack
* @throws IrisException if the pack already exists or another error * @throws IrisException
* if the pack already exists or another error
*/ */
public static IrisPack blank(String name) throws IrisException { public static IrisPack blank(String name) throws IrisException {
File f = packsPack(name); File f = packsPack(name);
if (f.exists()) { if(f.exists()) {
throw new IrisException("Already exists"); throw new IrisException("Already exists");
} }
@ -137,7 +147,7 @@ public class IrisPack {
" \"name\": \"" + Form.capitalize(name) + "\",\n" + " \"name\": \"" + Form.capitalize(name) + "\",\n" +
" \"version\": 1\n" + " \"version\": 1\n" +
"}\n"); "}\n");
} catch (IOException e) { } catch(IOException e) {
throw new IrisException(e.getMessage(), e); throw new IrisException(e.getMessage(), e);
} }
@ -149,7 +159,8 @@ public class IrisPack {
/** /**
* Get a packs pack folder for a name. Such that overworld would resolve as Iris/packs/overworld * Get a packs pack folder for a name. Such that overworld would resolve as Iris/packs/overworld
* *
* @param name the name * @param name
* the name
* @return the file path * @return the file path
*/ */
public static File packsPack(String name) { public static File packsPack(String name) {
@ -159,11 +170,11 @@ public class IrisPack {
private static KList<File> collectFiles(File f, String fileExtension) { private static KList<File> collectFiles(File f, String fileExtension) {
KList<File> l = new KList<>(); KList<File> l = new KList<>();
if (f.isDirectory()) { if(f.isDirectory()) {
for (File i : f.listFiles()) { for(File i : f.listFiles()) {
l.addAll(collectFiles(i, fileExtension)); l.addAll(collectFiles(i, fileExtension));
} }
} else if (f.getName().endsWith("." + fileExtension)) { } else if(f.getName().endsWith("." + fileExtension)) {
l.add(f); l.add(f);
} }
@ -214,13 +225,13 @@ public class IrisPack {
p.end(); p.end();
Iris.debug("Building Workspace: " + ws.getPath() + " took " + Form.duration(p.getMilliseconds(), 2)); Iris.debug("Building Workspace: " + ws.getPath() + " took " + Form.duration(p.getMilliseconds(), 2));
return true; return true;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.warn("Pack invalid: " + ws.getAbsolutePath() + " Re-creating. You may loose some vs-code workspace settings! But not your actual project!"); Iris.warn("Pack invalid: " + ws.getAbsolutePath() + " Re-creating. You may loose some vs-code workspace settings! But not your actual project!");
ws.delete(); ws.delete();
try { try {
IO.writeAll(ws, generateWorkspaceConfig()); IO.writeAll(ws, generateWorkspaceConfig());
} catch (IOException e1) { } catch(IOException e1) {
Iris.reportError(e1); Iris.reportError(e1);
e1.printStackTrace(); e1.printStackTrace();
} }
@ -232,7 +243,8 @@ public class IrisPack {
/** /**
* Install this pack into a world * Install this pack into a world
* *
* @param world the world to install into (world/iris/pack) * @param world
* the world to install into (world/iris/pack)
* @return the installed pack * @return the installed pack
*/ */
public IrisPack install(World world) throws IrisException { public IrisPack install(World world) throws IrisException {
@ -242,7 +254,8 @@ public class IrisPack {
/** /**
* Install this pack into a world * Install this pack into a world
* *
* @param world the world to install into (world/iris/pack) * @param world
* the world to install into (world/iris/pack)
* @return the installed pack * @return the installed pack
*/ */
public IrisPack install(IrisWorld world) throws IrisException { public IrisPack install(IrisWorld world) throws IrisException {
@ -252,11 +265,12 @@ public class IrisPack {
/** /**
* Install this pack into a world * Install this pack into a world
* *
* @param folder the folder to install this pack into * @param folder
* the folder to install this pack into
* @return the installed pack * @return the installed pack
*/ */
public IrisPack install(File folder) throws IrisException { public IrisPack install(File folder) throws IrisException {
if (folder.exists()) { if(folder.exists()) {
throw new IrisException("Cannot install new pack because the folder " + folder.getName() + " already exists!"); throw new IrisException("Cannot install new pack because the folder " + folder.getName() + " already exists!");
} }
@ -264,7 +278,7 @@ public class IrisPack {
try { try {
FileUtils.copyDirectory(getFolder(), folder); FileUtils.copyDirectory(getFolder(), folder);
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -275,19 +289,20 @@ public class IrisPack {
* Create a new pack using this pack as a template. The new pack will be renamed & have a renamed dimension * Create a new pack using this pack as a template. The new pack will be renamed & have a renamed dimension
* to match it. * to match it.
* *
* @param newName the new pack name * @param newName
* the new pack name
* @return the new IrisPack * @return the new IrisPack
*/ */
public IrisPack install(String newName) throws IrisException { public IrisPack install(String newName) throws IrisException {
File newPack = packsPack(newName); File newPack = packsPack(newName);
if (newPack.exists()) { if(newPack.exists()) {
throw new IrisException("Cannot install new pack because the folder " + newName + " already exists!"); throw new IrisException("Cannot install new pack because the folder " + newName + " already exists!");
} }
try { try {
FileUtils.copyDirectory(getFolder(), newPack); FileUtils.copyDirectory(getFolder(), newPack);
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -299,7 +314,7 @@ public class IrisPack {
try { try {
FileUtils.moveFile(from, to); FileUtils.moveFile(from, to);
new File(newPack, getWorkspaceFile().getName()).delete(); new File(newPack, getWorkspaceFile().getName()).delete();
} catch (Throwable e) { } catch(Throwable e) {
throw new IrisException(e); throw new IrisException(e);
} }
@ -330,7 +345,8 @@ public class IrisPack {
/** /**
* Find all files in this pack with the given extension * Find all files in this pack with the given extension
* *
* @param fileExtension the extension * @param fileExtension
* the extension
* @return the list of files * @return the list of files
*/ */
public KList<File> collectFiles(String fileExtension) { public KList<File> collectFiles(String fileExtension) {
@ -370,8 +386,8 @@ public class IrisPack {
JSONArray schemas = new JSONArray(); JSONArray schemas = new JSONArray();
IrisData dm = IrisData.get(getFolder()); IrisData dm = IrisData.get(getFolder());
for (ResourceLoader<?> r : dm.getLoaders().v()) { for(ResourceLoader<?> r : dm.getLoaders().v()) {
if (r.supportsSchemas()) { if(r.supportsSchemas()) {
schemas.put(r.buildSchema()); schemas.put(r.buildSchema());
} }
} }

View File

@ -51,39 +51,38 @@ public class IrisPackRepository {
private String tag = ""; private String tag = "";
/** /**
* @param g *
* @return
*/ */
public static IrisPackRepository from(String g) { public static IrisPackRepository from(String g) {
// https://github.com/IrisDimensions/overworld // https://github.com/IrisDimensions/overworld
if (g.startsWith("https://github.com/")) { if(g.startsWith("https://github.com/")) {
String sub = g.split("\\Qgithub.com/\\E")[1]; String sub = g.split("\\Qgithub.com/\\E")[1];
IrisPackRepository r = IrisPackRepository.builder() IrisPackRepository r = IrisPackRepository.builder()
.user(sub.split("\\Q/\\E")[0]) .user(sub.split("\\Q/\\E")[0])
.repo(sub.split("\\Q/\\E")[1]).build(); .repo(sub.split("\\Q/\\E")[1]).build();
if (g.contains("/tree/")) { if(g.contains("/tree/")) {
r.setBranch(g.split("/tree/")[1]); r.setBranch(g.split("/tree/")[1]);
} }
return r; return r;
} else if (g.contains("/")) { } else if(g.contains("/")) {
String[] f = g.split("\\Q/\\E"); String[] f = g.split("\\Q/\\E");
if (f.length == 1) { if(f.length == 1) {
return from(g); return from(g);
} else if (f.length == 2) { } else if(f.length == 2) {
return IrisPackRepository.builder() return IrisPackRepository.builder()
.user(f[0]) .user(f[0])
.repo(f[1]) .repo(f[1])
.build(); .build();
} else if (f.length >= 3) { } else if(f.length >= 3) {
IrisPackRepository r = IrisPackRepository.builder() IrisPackRepository r = IrisPackRepository.builder()
.user(f[0]) .user(f[0])
.repo(f[1]) .repo(f[1])
.build(); .build();
if (f[2].startsWith("#")) { if(f[2].startsWith("#")) {
r.setTag(f[2].substring(1)); r.setTag(f[2].substring(1));
} else { } else {
r.setBranch(f[2]); r.setBranch(f[2]);
@ -103,7 +102,7 @@ public class IrisPackRepository {
} }
public String toURL() { public String toURL() {
if (!tag.trim().isEmpty()) { if(!tag.trim().isEmpty()) {
return "https://codeload.github.com/" + user + "/" + repo + "/zip/refs/tags/" + tag; return "https://codeload.github.com/" + user + "/" + repo + "/zip/refs/tags/" + tag;
} }
@ -113,7 +112,7 @@ public class IrisPackRepository {
public void install(VolmitSender sender, Runnable whenComplete) throws MalformedURLException { public void install(VolmitSender sender, Runnable whenComplete) throws MalformedURLException {
File pack = Iris.instance.getDataFolderNoCreate(StudioSVC.WORKSPACE_NAME, getRepo()); File pack = Iris.instance.getDataFolderNoCreate(StudioSVC.WORKSPACE_NAME, getRepo());
if (!pack.exists()) { if(!pack.exists()) {
File dl = new File(Iris.getTemp(), "dltk-" + UUID.randomUUID() + ".zip"); File dl = new File(Iris.getTemp(), "dltk-" + UUID.randomUUID() + ".zip");
File work = new File(Iris.getTemp(), "extk-" + UUID.randomUUID()); File work = new File(Iris.getTemp(), "extk-" + UUID.randomUUID());
new JobCollection(Form.capitalize(getRepo()), new JobCollection(Form.capitalize(getRepo()),
@ -122,7 +121,7 @@ public class IrisPackRepository {
new SingleJob("Installing", () -> { new SingleJob("Installing", () -> {
try { try {
FileUtils.copyDirectory(work.listFiles()[0], pack); FileUtils.copyDirectory(work.listFiles()[0], pack);
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
})).execute(sender, whenComplete); })).execute(sender, whenComplete);

View File

@ -85,7 +85,7 @@ public class IrisPregenerator {
generatedLast.set(generated.get()); generatedLast.set(generated.get());
chunksPerSecond.put(secondGenerated); chunksPerSecond.put(secondGenerated);
if (minuteLatch.flip()) { if(minuteLatch.flip()) {
int minuteGenerated = generated.get() - generatedLastMinute.get(); int minuteGenerated = generated.get() - generatedLastMinute.get();
generatedLastMinute.set(generated.get()); generatedLastMinute.set(generated.get());
chunksPerMinute.put(minuteGenerated); chunksPerMinute.put(minuteGenerated);
@ -99,7 +99,7 @@ public class IrisPregenerator {
totalChunks.get() - generated.get(), totalChunks.get() - generated.get(),
eta, M.ms() - startTime.get(), currentGeneratorMethod.get()); eta, M.ms() - startTime.get(), currentGeneratorMethod.get());
if (cl.flip()) { if(cl.flip()) {
Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (" + Form.pc((double) generated.get() / (double) totalChunks.get(), 0) + ") " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2)); Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (" + Form.pc((double) generated.get() / (double) totalChunks.get(), 0) + ") " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2));
} }
@ -143,34 +143,34 @@ public class IrisPregenerator {
} }
private void visitRegion(int x, int z, boolean regions) { private void visitRegion(int x, int z, boolean regions) {
while (paused.get() && !shutdown.get()) { while(paused.get() && !shutdown.get()) {
J.sleep(50); J.sleep(50);
} }
if (shutdown.get()) { if(shutdown.get()) {
listener.onRegionSkipped(x, z); listener.onRegionSkipped(x, z);
return; return;
} }
Position2 pos = new Position2(x, z); Position2 pos = new Position2(x, z);
if (generatedRegions.contains(pos)) { if(generatedRegions.contains(pos)) {
return; return;
} }
currentGeneratorMethod.set(generator.getMethod(x, z)); currentGeneratorMethod.set(generator.getMethod(x, z));
boolean hit = false; boolean hit = false;
if (generator.supportsRegions(x, z, listener) && regions) { if(generator.supportsRegions(x, z, listener) && regions) {
hit = true; hit = true;
listener.onRegionGenerating(x, z); listener.onRegionGenerating(x, z);
generator.generateRegion(x, z, listener); generator.generateRegion(x, z, listener);
} else if (!regions) { } else if(!regions) {
hit = true; hit = true;
listener.onRegionGenerating(x, z); listener.onRegionGenerating(x, z);
PregenTask.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener)); PregenTask.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener));
} }
if (hit) { if(hit) {
listener.onRegionGenerated(x, z); listener.onRegionGenerated(x, z);
listener.onSaving(); listener.onSaving();
generator.save(); generator.save();
@ -180,7 +180,7 @@ public class IrisPregenerator {
} }
private void checkRegion(int x, int z) { private void checkRegion(int x, int z) {
if (generatedRegions.contains(new Position2(x, z))) { if(generatedRegions.contains(new Position2(x, z))) {
return; return;
} }

View File

@ -43,7 +43,7 @@ public class PregenTask {
private int height = 1; private int height = 1;
public static void iterateRegion(int xr, int zr, Spiraled s, Position2 pull) { public static void iterateRegion(int xr, int zr, Spiraled s, Position2 pull) {
for (Position2 i : ORDERS.computeIfAbsent(pull, PregenTask::computeOrder)) { for(Position2 i : ORDERS.computeIfAbsent(pull, PregenTask::computeOrder)) {
s.on(i.getX() + (xr << 5), i.getZ() + (zr << 5)); s.on(i.getX() + (xr << 5), i.getZ() + (zr << 5));
} }
} }
@ -57,7 +57,7 @@ public class PregenTask {
new Spiraler(33, 33, (x, z) -> { new Spiraler(33, 33, (x, z) -> {
int xx = (x + 15); int xx = (x + 15);
int zz = (z + 15); int zz = (z + 15);
if (xx < 0 || xx > 31 || zz < 0 || zz > 31) { if(xx < 0 || xx > 31 || zz < 0 || zz > 31) {
return; return;
} }
@ -74,7 +74,7 @@ public class PregenTask {
new Spiraler(33, 33, (x, z) -> { new Spiraler(33, 33, (x, z) -> {
int xx = x + 15; int xx = x + 15;
int zz = z + 15; int zz = z + 15;
if (xx < 0 || xx > 31 || zz < 0 || zz > 31) { if(xx < 0 || xx > 31 || zz < 0 || zz > 31) {
return; return;
} }

View File

@ -43,8 +43,10 @@ public interface PregeneratorMethod {
/** /**
* Return true if regions can be generated * Return true if regions can be generated
* *
* @param x the x region * @param x
* @param z the z region * the x region
* @param z
* the z region
* @return true if they can be * @return true if they can be
*/ */
boolean supportsRegions(int x, int z, PregenListener listener); boolean supportsRegions(int x, int z, PregenListener listener);
@ -52,8 +54,10 @@ public interface PregeneratorMethod {
/** /**
* Return the name of the method being used * Return the name of the method being used
* *
* @param x the x region * @param x
* @param z the z region * the x region
* @param z
* the z region
* @return the name * @return the name
*/ */
String getMethod(int x, int z); String getMethod(int x, int z);
@ -62,18 +66,22 @@ public interface PregeneratorMethod {
* Called to generate a region. Execute sync, if multicore internally, wait * Called to generate a region. Execute sync, if multicore internally, wait
* for the task to complete * for the task to complete
* *
* @param x the x * @param x
* @param z the z * the x
* @param listener signal chunks generating & generated. Parallel capable. * @param z
* the z
* @param listener
* signal chunks generating & generated. Parallel capable.
*/ */
void generateRegion(int x, int z, PregenListener listener); void generateRegion(int x, int z, PregenListener listener);
/** /**
* Called to generate a chunk. You can go async so long as save will wait on the threads to finish * Called to generate a chunk. You can go async so long as save will wait on the threads to finish
* *
* @param x the x * @param x
* @param z the z * the x
* @param listener * @param z
* the z
*/ */
void generateChunk(int x, int z, PregenListener listener); void generateChunk(int x, int z, PregenListener listener);

View File

@ -39,7 +39,7 @@ public class AsyncPregenMethod implements PregeneratorMethod {
private final KList<Future<?>> future; private final KList<Future<?>> future;
public AsyncPregenMethod(World world, int threads) { public AsyncPregenMethod(World world, int threads) {
if (!PaperLib.isPaper()) { if(!PaperLib.isPaper()) {
throw new UnsupportedOperationException("Cannot use PaperAsync on non paper!"); throw new UnsupportedOperationException("Cannot use PaperAsync on non paper!");
} }
@ -51,17 +51,17 @@ public class AsyncPregenMethod implements PregeneratorMethod {
private void unloadAndSaveAllChunks() { private void unloadAndSaveAllChunks() {
try { try {
J.sfut(() -> { J.sfut(() -> {
if (world == null) { if(world == null) {
Iris.warn("World was null somehow..."); Iris.warn("World was null somehow...");
return; return;
} }
for (Chunk i : world.getLoadedChunks()) { for(Chunk i : world.getLoadedChunks()) {
i.unload(true); i.unload(true);
} }
world.save(); world.save();
}).get(); }).get();
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -71,7 +71,7 @@ public class AsyncPregenMethod implements PregeneratorMethod {
PaperLib.getChunkAtAsync(world, x, z, true).get(); PaperLib.getChunkAtAsync(world, x, z, true).get();
listener.onChunkGenerated(x, z); listener.onChunkGenerated(x, z);
listener.onChunkCleaned(x, z); listener.onChunkCleaned(x, z);
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
J.sleep(5); J.sleep(5);
future.add(burst.complete(() -> completeChunk(x, z, listener))); future.add(burst.complete(() -> completeChunk(x, z, listener)));
@ -79,11 +79,11 @@ public class AsyncPregenMethod implements PregeneratorMethod {
} }
private void waitForChunks() { private void waitForChunks() {
for (Future<?> i : future.copy()) { for(Future<?> i : future.copy()) {
try { try {
i.get(); i.get();
future.remove(i); future.remove(i);
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -123,7 +123,7 @@ public class AsyncPregenMethod implements PregeneratorMethod {
@Override @Override
public void generateChunk(int x, int z, PregenListener listener) { public void generateChunk(int x, int z, PregenListener listener) {
if (future.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())) { // TODO: FIX if(future.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())) { // TODO: FIX
waitForChunks(); waitForChunks();
} }
@ -133,7 +133,7 @@ public class AsyncPregenMethod implements PregeneratorMethod {
@Override @Override
public Mantle getMantle() { public Mantle getMantle() {
if (IrisToolbelt.isIrisWorld(world)) { if(IrisToolbelt.isIrisWorld(world)) {
return IrisToolbelt.access(world).getEngine().getMantle().getMantle(); return IrisToolbelt.access(world).getEngine().getMantle().getMantle();
} }

View File

@ -71,18 +71,18 @@ public class HybridPregenMethod implements PregeneratorMethod {
@Override @Override
public boolean supportsRegions(int x, int z, PregenListener listener) { public boolean supportsRegions(int x, int z, PregenListener listener) {
if (headless instanceof DummyPregenMethod) { if(headless instanceof DummyPregenMethod) {
return false; return false;
} }
boolean r = !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); boolean r = !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists();
if (!r && listener != null) { if(!r && listener != null) {
try { try {
for (Position2 i : ((HeadlessPregenMethod) headless).getGenerator().getChunksInRegion(x, z)) { for(Position2 i : ((HeadlessPregenMethod) headless).getGenerator().getChunksInRegion(x, z)) {
listener.onChunkExistsInRegionGen((x << 5) + i.getX(), (z << 5) + i.getZ()); listener.onChunkExistsInRegionGen((x << 5) + i.getX(), (z << 5) + i.getZ());
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
@ -102,7 +102,7 @@ public class HybridPregenMethod implements PregeneratorMethod {
@Override @Override
public Mantle getMantle() { public Mantle getMantle() {
if (headless == null) { if(headless == null) {
return inWorld.getMantle(); return inWorld.getMantle();
} }

View File

@ -40,10 +40,10 @@ public class MedievalPregenMethod implements PregeneratorMethod {
} }
private void waitForChunks() { private void waitForChunks() {
for (CompletableFuture<?> i : futures) { for(CompletableFuture<?> i : futures) {
try { try {
i.get(); i.get();
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -55,12 +55,12 @@ public class MedievalPregenMethod implements PregeneratorMethod {
waitForChunks(); waitForChunks();
try { try {
J.sfut(() -> { J.sfut(() -> {
for (Chunk i : world.getLoadedChunks()) { for(Chunk i : world.getLoadedChunks()) {
i.unload(true); i.unload(true);
} }
world.save(); world.save();
}).get(); }).get();
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -97,7 +97,7 @@ public class MedievalPregenMethod implements PregeneratorMethod {
@Override @Override
public void generateChunk(int x, int z, PregenListener listener) { public void generateChunk(int x, int z, PregenListener listener) {
if (futures.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())) { if(futures.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())) {
waitForChunks(); waitForChunks();
} }
@ -111,7 +111,7 @@ public class MedievalPregenMethod implements PregeneratorMethod {
@Override @Override
public Mantle getMantle() { public Mantle getMantle() {
if (IrisToolbelt.isIrisWorld(world)) { if(IrisToolbelt.isIrisWorld(world)) {
return IrisToolbelt.access(world).getEngine().getMantle().getMantle(); return IrisToolbelt.access(world).getEngine().getMantle().getMantle();
} }

View File

@ -70,7 +70,7 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
} }
public synchronized void setup() { public synchronized void setup() {
if (ready) { if(ready) {
return; return;
} }
@ -88,22 +88,22 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
try { try {
IO.writeAll(to, o); IO.writeAll(to, o);
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
to.deleteOnExit(); to.deleteOnExit();
}) })
.build().go((response, data) -> { .build().go((response, data) -> {
if (response instanceof SyndicateBusy) { if(response instanceof SyndicateBusy) {
throw new RuntimeException("Service is busy, will try later"); throw new RuntimeException("Service is busy, will try later");
} }
ready = true; ready = true;
}); });
ready = true; ready = true;
} catch (Throwable throwable) { } catch(Throwable throwable) {
if (throwable instanceof RuntimeException) { if(throwable instanceof RuntimeException) {
ready = false; ready = false;
return; return;
} }
@ -113,7 +113,7 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
} }
public boolean canGenerate() { public boolean canGenerate() {
if (!ready) { if(!ready) {
J.a(this::setup); J.a(this::setup);
} }
@ -127,7 +127,7 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
@Override @Override
public void close() { public void close() {
if (ready) { if(ready) {
try { try {
connect() connect()
.command(SyndicateClose .command(SyndicateClose
@ -137,7 +137,7 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
.build() .build()
.go((__, __b) -> { .go((__, __b) -> {
}); });
} catch (Throwable throwable) { } catch(Throwable throwable) {
throwable.printStackTrace(); throwable.printStackTrace();
} }
} }
@ -165,21 +165,21 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
.command(SyndicateGetProgress.builder() .command(SyndicateGetProgress.builder()
.pack(pack).build()).output((i) -> { .pack(pack).build()).output((i) -> {
}).build().go((response, o) -> { }).build().go((response, o) -> {
if (response instanceof SyndicateSendProgress) { if(response instanceof SyndicateSendProgress) {
if (((SyndicateSendProgress) response).isAvailable()) { if(((SyndicateSendProgress) response).isAvailable()) {
progress.set(((SyndicateSendProgress) response).getProgress()); progress.set(((SyndicateSendProgress) response).getProgress());
File f = new File(worldFolder, "region/r." + x + "." + z + ".mca"); File f = new File(worldFolder, "region/r." + x + "." + z + ".mca");
try { try {
f.getParentFile().mkdirs(); f.getParentFile().mkdirs();
IO.writeAll(f, o); IO.writeAll(f, o);
progress.set(1000); progress.set(1000);
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
}); });
} catch (Throwable throwable) { } catch(Throwable throwable) {
throwable.printStackTrace(); throwable.printStackTrace();
} }
@ -188,7 +188,7 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
@Override @Override
public void generateRegion(int x, int z, PregenListener listener) { public void generateRegion(int x, int z, PregenListener listener) {
if (!ready) { if(!ready) {
throw new RuntimeException(); throw new RuntimeException();
} }
@ -198,26 +198,26 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
.x(x).z(z).pack(pack) .x(x).z(z).pack(pack)
.build()) .build())
.build().go((response, data) -> { .build().go((response, data) -> {
if (response instanceof SyndicateOK) { if(response instanceof SyndicateOK) {
listener.onNetworkStarted(x, z); listener.onNetworkStarted(x, z);
J.a(() -> { J.a(() -> {
double lastp = 0; double lastp = 0;
int calls = 0; int calls = 0;
boolean installed = false; boolean installed = false;
while (true) { while(true) {
J.sleep(100); J.sleep(100);
double progress = checkProgress(x, z); double progress = checkProgress(x, z);
if (progress == 1000) { if(progress == 1000) {
installed = true; installed = true;
AtomicInteger a = new AtomicInteger(calls); AtomicInteger a = new AtomicInteger(calls);
PregenTask.iterateRegion(x, z, (xx, zz) -> { PregenTask.iterateRegion(x, z, (xx, zz) -> {
if (a.decrementAndGet() < 0) { if(a.decrementAndGet() < 0) {
listener.onNetworkGeneratedChunk(xx, zz); listener.onNetworkGeneratedChunk(xx, zz);
} }
}); });
calls = 1024; calls = 1024;
} else if (progress < 0) { } else if(progress < 0) {
break; break;
} }
@ -227,8 +227,8 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
AtomicInteger a = new AtomicInteger(calls); AtomicInteger a = new AtomicInteger(calls);
AtomicInteger b = new AtomicInteger(change); AtomicInteger b = new AtomicInteger(change);
PregenTask.iterateRegion(x, z, (xx, zz) -> { PregenTask.iterateRegion(x, z, (xx, zz) -> {
if (a.decrementAndGet() < 0) { if(a.decrementAndGet() < 0) {
if (b.decrementAndGet() >= 0) { if(b.decrementAndGet() >= 0) {
listener.onNetworkGeneratedChunk(xx, zz); listener.onNetworkGeneratedChunk(xx, zz);
} }
} }
@ -236,25 +236,25 @@ public class SyndicatePregenMethod implements PregeneratorMethod {
calls += change; calls += change;
} }
if (!installed) { if(!installed) {
// TODO RETRY REGION // TODO RETRY REGION
return; return;
} }
listener.onNetworkDownloaded(x, z); listener.onNetworkDownloaded(x, z);
}); });
} else if (response instanceof SyndicateInstallFirst) { } else if(response instanceof SyndicateInstallFirst) {
ready = false; ready = false;
throw new RuntimeException(); throw new RuntimeException();
} else if (response instanceof SyndicateBusy) { } else if(response instanceof SyndicateBusy) {
throw new RuntimeException(); throw new RuntimeException();
} else { } else {
throw new RuntimeException(); throw new RuntimeException();
} }
}); });
} catch (Throwable throwable) { } catch(Throwable throwable) {
if (throwable instanceof RuntimeException) { if(throwable instanceof RuntimeException) {
throw (RuntimeException) throwable; throw (RuntimeException) throwable;
} }

View File

@ -40,7 +40,7 @@ public class SyndicateClient {
DataOutputStream o = new DataOutputStream(socket.getOutputStream()); DataOutputStream o = new DataOutputStream(socket.getOutputStream());
SyndicateCommandIO.write(command, o); SyndicateCommandIO.write(command, o);
if (output != null) { if(output != null) {
output.accept(o); output.accept(o);
} }

View File

@ -69,7 +69,7 @@ public class SyndicateServer extends Thread implements PregenListener {
} }
public void run() { public void run() {
while (!interrupted()) { while(!interrupted()) {
try { try {
Socket client = server.accept(); Socket client = server.accept();
DataInputStream i = new DataInputStream(client.getInputStream()); DataInputStream i = new DataInputStream(client.getInputStream());
@ -77,13 +77,13 @@ public class SyndicateServer extends Thread implements PregenListener {
try { try {
handle(client, i, o); handle(client, i, o);
o.flush(); o.flush();
} catch (Throwable throwable) { } catch(Throwable throwable) {
throwable.printStackTrace(); throwable.printStackTrace();
} }
client.close(); client.close();
} catch (SocketTimeoutException ignored) { } catch(SocketTimeoutException ignored) {
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -92,7 +92,7 @@ public class SyndicateServer extends Thread implements PregenListener {
private void handle(Socket client, DataInputStream i, DataOutputStream o) throws Throwable { private void handle(Socket client, DataInputStream i, DataOutputStream o) throws Throwable {
SyndicateCommand cmd = handle(SyndicateCommandIO.read(i), i, o); SyndicateCommand cmd = handle(SyndicateCommandIO.read(i), i, o);
if (cmd != null) { if(cmd != null) {
SyndicateCommandIO.write(cmd, o); SyndicateCommandIO.write(cmd, o);
} }
@ -104,12 +104,12 @@ public class SyndicateServer extends Thread implements PregenListener {
} }
private SyndicateCommand handle(SyndicateCommand command, DataInputStream i, DataOutputStream o) throws Throwable { private SyndicateCommand handle(SyndicateCommand command, DataInputStream i, DataOutputStream o) throws Throwable {
if (command instanceof SyndicateInstallPack) { if(command instanceof SyndicateInstallPack) {
if (busy) { if(busy) {
return new SyndicateBusy(); return new SyndicateBusy();
} }
if (generator != null) { if(generator != null) {
generator.close(); generator.close();
IO.delete(generator.getWorld().getWorld().worldFolder()); IO.delete(generator.getWorld().getWorld().worldFolder());
generator = null; generator = null;
@ -133,12 +133,12 @@ public class SyndicateServer extends Thread implements PregenListener {
return new SyndicateOK(); return new SyndicateOK();
} }
if (command instanceof SyndicateGenerate) { if(command instanceof SyndicateGenerate) {
if (busy) { if(busy) {
return new SyndicateBusy(); return new SyndicateBusy();
} }
if (generator == null || !Objects.equals(currentId, ((SyndicateGenerate) command).getPack())) { if(generator == null || !Objects.equals(currentId, ((SyndicateGenerate) command).getPack())) {
return new SyndicateInstallFirst(); return new SyndicateInstallFirst();
} }
@ -151,8 +151,8 @@ public class SyndicateServer extends Thread implements PregenListener {
return new SyndicateOK(); return new SyndicateOK();
} }
if (command instanceof SyndicateClose) { if(command instanceof SyndicateClose) {
if (generator != null && Objects.equals(currentId, ((SyndicateClose) command).getPack()) && !busy) { if(generator != null && Objects.equals(currentId, ((SyndicateClose) command).getPack()) && !busy) {
generator.close(); generator.close();
IO.delete(generator.getWorld().getWorld().worldFolder()); IO.delete(generator.getWorld().getWorld().worldFolder());
generator = null; generator = null;
@ -160,10 +160,10 @@ public class SyndicateServer extends Thread implements PregenListener {
} }
} }
if (command instanceof SyndicateGetProgress) { if(command instanceof SyndicateGetProgress) {
if (generator != null && busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack())) { if(generator != null && busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack())) {
return SyndicateSendProgress.builder().progress((double) g.get() / 1024D).build(); return SyndicateSendProgress.builder().progress((double) g.get() / 1024D).build();
} else if (generator != null && !busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack()) && lastGeneratedRegion != null && lastGeneratedRegion.exists()) { } else if(generator != null && !busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack()) && lastGeneratedRegion != null && lastGeneratedRegion.exists()) {
SyndicateCommandIO.write(SyndicateSendProgress SyndicateCommandIO.write(SyndicateSendProgress
.builder() .builder()
.progress(1).available(true) .progress(1).available(true)
@ -171,7 +171,7 @@ public class SyndicateServer extends Thread implements PregenListener {
o.writeLong(lastGeneratedRegion.length()); o.writeLong(lastGeneratedRegion.length());
IO.writeAll(lastGeneratedRegion, o); IO.writeAll(lastGeneratedRegion, o);
return null; return null;
} else if (generator == null) { } else if(generator == null) {
return new SyndicateInstallFirst(); return new SyndicateInstallFirst();
} else { } else {
return new SyndicateBusy(); return new SyndicateBusy();

View File

@ -82,14 +82,14 @@ public class IrisProject {
public static int clean(VolmitSender s, File clean) { public static int clean(VolmitSender s, File clean) {
int c = 0; int c = 0;
if (clean.isDirectory()) { if(clean.isDirectory()) {
for (File i : clean.listFiles()) { for(File i : clean.listFiles()) {
c += clean(s, i); c += clean(s, i);
} }
} else if (clean.getName().endsWith(".json")) { } else if(clean.getName().endsWith(".json")) {
try { try {
clean(clean); clean(clean);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.error("Failed to beautify " + clean.getAbsolutePath() + " You may have errors in your json!"); Iris.error("Failed to beautify " + clean.getAbsolutePath() + " You may have errors in your json!");
} }
@ -108,29 +108,29 @@ public class IrisProject {
} }
public static void fixBlocks(JSONObject obj, File f) { public static void fixBlocks(JSONObject obj, File f) {
for (String i : obj.keySet()) { for(String i : obj.keySet()) {
Object o = obj.get(i); Object o = obj.get(i);
if (i.equals("block") && o instanceof String && !o.toString().trim().isEmpty() && !o.toString().contains(":")) { if(i.equals("block") && o instanceof String && !o.toString().trim().isEmpty() && !o.toString().contains(":")) {
obj.put(i, "minecraft:" + o); obj.put(i, "minecraft:" + o);
Iris.debug("Updated Block Key: " + o + " to " + obj.getString(i) + " in " + f.getPath()); Iris.debug("Updated Block Key: " + o + " to " + obj.getString(i) + " in " + f.getPath());
} }
if (o instanceof JSONObject) { if(o instanceof JSONObject) {
fixBlocks((JSONObject) o, f); fixBlocks((JSONObject) o, f);
} else if (o instanceof JSONArray) { } else if(o instanceof JSONArray) {
fixBlocks((JSONArray) o, f); fixBlocks((JSONArray) o, f);
} }
} }
} }
public static void fixBlocks(JSONArray obj, File f) { public static void fixBlocks(JSONArray obj, File f) {
for (int i = 0; i < obj.length(); i++) { for(int i = 0; i < obj.length(); i++) {
Object o = obj.get(i); Object o = obj.get(i);
if (o instanceof JSONObject) { if(o instanceof JSONObject) {
fixBlocks((JSONObject) o, f); fixBlocks((JSONObject) o, f);
} else if (o instanceof JSONArray) { } else if(o instanceof JSONArray) {
fixBlocks((JSONArray) o, f); fixBlocks((JSONArray) o, f);
} }
} }
@ -143,11 +143,11 @@ public class IrisProject {
public KList<File> collectFiles(File f, String fileExtension) { public KList<File> collectFiles(File f, String fileExtension) {
KList<File> l = new KList<>(); KList<File> l = new KList<>();
if (f.isDirectory()) { if(f.isDirectory()) {
for (File i : f.listFiles()) { for(File i : f.listFiles()) {
l.addAll(collectFiles(i, fileExtension)); l.addAll(collectFiles(i, fileExtension));
} }
} else if (f.getName().endsWith("." + fileExtension)) { } else if(f.getName().endsWith("." + fileExtension)) {
l.add(f); l.add(f);
} }
@ -170,28 +170,28 @@ public class IrisProject {
J.attemptAsync(() -> J.attemptAsync(() ->
{ {
try { try {
if (d.getLoader() == null) { if(d.getLoader() == null) {
sender.sendMessage("Could not get dimension loader"); sender.sendMessage("Could not get dimension loader");
return; return;
} }
File f = d.getLoader().getDataFolder(); File f = d.getLoader().getDataFolder();
if (!doOpenVSCode(f)) { if(!doOpenVSCode(f)) {
File ff = new File(d.getLoader().getDataFolder(), d.getLoadKey() + ".code-workspace"); File ff = new File(d.getLoader().getDataFolder(), d.getLoadKey() + ".code-workspace");
Iris.warn("Project missing code-workspace: " + ff.getAbsolutePath() + " Re-creating code workspace."); Iris.warn("Project missing code-workspace: " + ff.getAbsolutePath() + " Re-creating code workspace.");
try { try {
IO.writeAll(ff, createCodeWorkspaceConfig()); IO.writeAll(ff, createCodeWorkspaceConfig());
} catch (IOException e1) { } catch(IOException e1) {
Iris.reportError(e1); Iris.reportError(e1);
e1.printStackTrace(); e1.printStackTrace();
} }
updateWorkspace(); updateWorkspace();
if (!doOpenVSCode(f)) { if(!doOpenVSCode(f)) {
Iris.warn("Tried creating code workspace but failed a second time. Your project is likely corrupt."); Iris.warn("Tried creating code workspace but failed a second time. Your project is likely corrupt.");
} }
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -200,16 +200,16 @@ public class IrisProject {
private boolean doOpenVSCode(File f) throws IOException { private boolean doOpenVSCode(File f) throws IOException {
boolean foundWork = false; boolean foundWork = false;
for (File i : Objects.requireNonNull(f.listFiles())) { for(File i : Objects.requireNonNull(f.listFiles())) {
if (i.getName().endsWith(".code-workspace")) { if(i.getName().endsWith(".code-workspace")) {
foundWork = true; foundWork = true;
J.a(() -> J.a(() ->
{ {
updateWorkspace(); updateWorkspace();
}); });
if (IrisSettings.get().getStudio().isOpenVSCode()) { if(IrisSettings.get().getStudio().isOpenVSCode()) {
if (!GraphicsEnvironment.isHeadless()) { if(!GraphicsEnvironment.isHeadless()) {
Iris.msg("Opening VSCode. You may see the output from VSCode."); Iris.msg("Opening VSCode. You may see the output from VSCode.");
Iris.msg("VSCode output always starts with: '(node:#####) electron'"); Iris.msg("VSCode output always starts with: '(node:#####) electron'");
Desktop.getDesktop().open(i); Desktop.getDesktop().open(i);
@ -223,21 +223,21 @@ public class IrisProject {
} }
public void open(VolmitSender sender, long seed, Consumer<World> onDone) throws IrisException { public void open(VolmitSender sender, long seed, Consumer<World> onDone) throws IrisException {
if (isOpen()) { if(isOpen()) {
close(); close();
} }
boolean hasError = false; boolean hasError = false;
if (hasError) { if(hasError) {
return; return;
} }
IrisDimension d = IrisData.loadAnyDimension(getName()); IrisDimension d = IrisData.loadAnyDimension(getName());
if (d == null) { if(d == null) {
sender.sendMessage("Can't find dimension: " + getName()); sender.sendMessage("Can't find dimension: " + getName());
return; return;
} else if (sender.isPlayer()) { } else if(sender.isPlayer()) {
sender.player().setGameMode(GameMode.SPECTATOR); sender.player().setGameMode(GameMode.SPECTATOR);
} }
@ -254,7 +254,7 @@ public class IrisProject {
.dimension(d.getLoadKey()) .dimension(d.getLoadKey())
.create().getGenerator(); .create().getGenerator();
onDone.accept(activeProvider.getTarget().getWorld().realWorld()); onDone.accept(activeProvider.getTarget().getWorld().realWorld());
} catch (IrisException e) { } catch(IrisException e) {
e.printStackTrace(); e.printStackTrace();
} }
}); });
@ -286,13 +286,13 @@ public class IrisProject {
IO.writeAll(ws, j.toString(4)); IO.writeAll(ws, j.toString(4));
p.end(); p.end();
return true; return true;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.warn("Project invalid: " + ws.getAbsolutePath() + " Re-creating. You may loose some vs-code workspace settings! But not your actual project!"); Iris.warn("Project invalid: " + ws.getAbsolutePath() + " Re-creating. You may loose some vs-code workspace settings! But not your actual project!");
ws.delete(); ws.delete();
try { try {
IO.writeAll(ws, createCodeWorkspaceConfig()); IO.writeAll(ws, createCodeWorkspaceConfig());
} catch (IOException e1) { } catch(IOException e1) {
Iris.reportError(e1); Iris.reportError(e1);
e1.printStackTrace(); e1.printStackTrace();
} }
@ -334,19 +334,19 @@ public class IrisProject {
JSONArray schemas = new JSONArray(); JSONArray schemas = new JSONArray();
IrisData dm = IrisData.get(getPath()); IrisData dm = IrisData.get(getPath());
for (ResourceLoader<?> r : dm.getLoaders().v()) { for(ResourceLoader<?> r : dm.getLoaders().v()) {
if (r.supportsSchemas()) { if(r.supportsSchemas()) {
schemas.put(r.buildSchema()); schemas.put(r.buildSchema());
} }
} }
for (Class<?> i : Iris.getClasses("com.volmit.iris.engine.object.", Snippet.class)) { for(Class<?> i : Iris.getClasses("com.volmit.iris.engine.object.", Snippet.class)) {
try { try {
String snipType = i.getDeclaredAnnotation(Snippet.class).value(); String snipType = i.getDeclaredAnnotation(Snippet.class).value();
JSONObject o = new JSONObject(); JSONObject o = new JSONObject();
KList<String> fm = new KList<>(); KList<String> fm = new KList<>();
for (int g = 1; g < 8; g++) { for(int g = 1; g < 8; g++) {
fm.add("/snippet/" + snipType + Form.repeat("/*", g) + ".json"); fm.add("/snippet/" + snipType + Form.repeat("/*", g) + ".json");
} }
@ -357,11 +357,11 @@ public class IrisProject {
J.attemptAsync(() -> { J.attemptAsync(() -> {
try { try {
IO.writeAll(a, new SchemaBuilder(i, dm).construct().toString(4)); IO.writeAll(a, new SchemaBuilder(i, dm).construct().toString(4));
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
}); });
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -387,7 +387,7 @@ public class IrisProject {
KSet<IrisLootTable> loot = new KSet<>(); KSet<IrisLootTable> loot = new KSet<>();
KSet<IrisBlockData> blocks = new KSet<>(); KSet<IrisBlockData> blocks = new KSet<>();
for (String i : dm.getDimensionLoader().getPossibleKeys()) { for(String i : dm.getDimensionLoader().getPossibleKeys()) {
blocks.add(dm.getBlockLoader().load(i)); blocks.add(dm.getBlockLoader().load(i));
} }
@ -407,13 +407,13 @@ public class IrisProject {
StringBuilder c = new StringBuilder(); StringBuilder c = new StringBuilder();
sender.sendMessage("Serializing Objects"); sender.sendMessage("Serializing Objects");
for (IrisBiome i : biomes) { for(IrisBiome i : biomes) {
for (IrisObjectPlacement j : i.getObjects()) { for(IrisObjectPlacement j : i.getObjects()) {
b.append(j.hashCode()); b.append(j.hashCode());
KList<String> newNames = new KList<>(); KList<String> newNames = new KList<>();
for (String k : j.getPlace()) { for(String k : j.getPlace()) {
if (renameObjects.containsKey(k)) { if(renameObjects.containsKey(k)) {
newNames.add(renameObjects.get(k)); newNames.add(renameObjects.get(k));
continue; continue;
} }
@ -441,12 +441,12 @@ public class IrisProject {
gb.append(IO.hash(f)); gb.append(IO.hash(f));
ggg.set(ggg.get() + 1); ggg.set(ggg.get() + 1);
if (cl.flip()) { if(cl.flip()) {
int g = ggg.get(); int g = ggg.get();
ggg.set(0); ggg.set(0);
sender.sendMessage("Wrote another " + g + " Objects"); sender.sendMessage("Wrote another " + g + " Objects");
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
}))); })));
@ -462,7 +462,7 @@ public class IrisProject {
IO.writeAll(new File(folder, "dimensions/" + dimension.getLoadKey() + ".json"), a); IO.writeAll(new File(folder, "dimensions/" + dimension.getLoadKey() + ".json"), a);
b.append(IO.hash(a)); b.append(IO.hash(a));
for (IrisGenerator i : generators) { for(IrisGenerator i : generators) {
a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4); a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4);
IO.writeAll(new File(folder, "generators/" + i.getLoadKey() + ".json"), a); IO.writeAll(new File(folder, "generators/" + i.getLoadKey() + ".json"), a);
b.append(IO.hash(a)); b.append(IO.hash(a));
@ -471,31 +471,31 @@ public class IrisProject {
c.append(IO.hash(b.toString())); c.append(IO.hash(b.toString()));
b = new StringBuilder(); b = new StringBuilder();
for (IrisRegion i : regions) { for(IrisRegion i : regions) {
a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4); a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4);
IO.writeAll(new File(folder, "regions/" + i.getLoadKey() + ".json"), a); IO.writeAll(new File(folder, "regions/" + i.getLoadKey() + ".json"), a);
b.append(IO.hash(a)); b.append(IO.hash(a));
} }
for (IrisBlockData i : blocks) { for(IrisBlockData i : blocks) {
a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4); a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4);
IO.writeAll(new File(folder, "blocks/" + i.getLoadKey() + ".json"), a); IO.writeAll(new File(folder, "blocks/" + i.getLoadKey() + ".json"), a);
b.append(IO.hash(a)); b.append(IO.hash(a));
} }
for (IrisBiome i : biomes) { for(IrisBiome i : biomes) {
a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4); a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4);
IO.writeAll(new File(folder, "biomes/" + i.getLoadKey() + ".json"), a); IO.writeAll(new File(folder, "biomes/" + i.getLoadKey() + ".json"), a);
b.append(IO.hash(a)); b.append(IO.hash(a));
} }
for (IrisEntity i : entities) { for(IrisEntity i : entities) {
a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4); a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4);
IO.writeAll(new File(folder, "entities/" + i.getLoadKey() + ".json"), a); IO.writeAll(new File(folder, "entities/" + i.getLoadKey() + ".json"), a);
b.append(IO.hash(a)); b.append(IO.hash(a));
} }
for (IrisLootTable i : loot) { for(IrisLootTable i : loot) {
a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4); a = new JSONObject(new Gson().toJson(i)).toString(minify ? 0 : 4);
IO.writeAll(new File(folder, "loot/" + i.getLoadKey() + ".json"), a); IO.writeAll(new File(folder, "loot/" + i.getLoadKey() + ".json"), a);
b.append(IO.hash(a)); b.append(IO.hash(a));
@ -515,7 +515,7 @@ public class IrisProject {
sender.sendMessage("Package Compiled!"); sender.sendMessage("Package Compiled!");
return p; return p;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -538,18 +538,18 @@ public class IrisProject {
IrisObject o = new IrisObject(0, 0, 0); IrisObject o = new IrisObject(0, 0, 0);
o.read(f); o.read(f);
if (o.getBlocks().isEmpty()) { if(o.getBlocks().isEmpty()) {
sender.sendMessageRaw("<hover:show_text:'Error:\n" + sender.sendMessageRaw("<hover:show_text:'Error:\n" +
"<yellow>" + f.getPath() + "<yellow>" + f.getPath() +
"'><red>- IOB " + f.getName() + " has 0 blocks!"); "'><red>- IOB " + f.getName() + " has 0 blocks!");
} }
if (o.getW() == 0 || o.getH() == 0 || o.getD() == 0) { if(o.getW() == 0 || o.getH() == 0 || o.getD() == 0) {
sender.sendMessageRaw("<hover:show_text:'Error:\n" + sender.sendMessageRaw("<hover:show_text:'Error:\n" +
"<yellow>" + f.getPath() + "\n<red>The width height or depth has a zero in it (bad format)" + "<yellow>" + f.getPath() + "\n<red>The width height or depth has a zero in it (bad format)" +
"'><red>- IOB " + f.getName() + " is not 3D!"); "'><red>- IOB " + f.getName() + " is not 3D!");
} }
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -569,7 +569,7 @@ public class IrisProject {
scanForErrors(data, f, p, sender); scanForErrors(data, f, p, sender);
IO.writeAll(f, p.toString(4)); IO.writeAll(f, p.toString(4));
} catch (Throwable e) { } catch(Throwable e) {
sender.sendMessageRaw("<hover:show_text:'Error:\n" + sender.sendMessageRaw("<hover:show_text:'Error:\n" +
"<yellow>" + f.getPath() + "<yellow>" + f.getPath() +
"\n<red>" + e.getMessage() + "\n<red>" + e.getMessage() +
@ -590,7 +590,7 @@ public class IrisProject {
String key = data.toLoadKey(f); String key = data.toLoadKey(f);
ResourceLoader<?> loader = data.getTypedLoaderFor(f); ResourceLoader<?> loader = data.getTypedLoaderFor(f);
if (loader == null) { if(loader == null) {
sender.sendMessageBasic("Can't find loader for " + f.getPath()); sender.sendMessageBasic("Can't find loader for " + f.getPath());
return; return;
} }
@ -603,62 +603,62 @@ public class IrisProject {
public void compare(Class<?> c, JSONObject j, VolmitSender sender, KList<String> path) { public void compare(Class<?> c, JSONObject j, VolmitSender sender, KList<String> path) {
try { try {
Object o = c.getClass().getConstructor().newInstance(); Object o = c.getClass().getConstructor().newInstance();
} catch (Throwable e) { } catch(Throwable e) {
} }
} }
public void files(File clean, KList<File> files) { public void files(File clean, KList<File> files) {
if (clean.isDirectory()) { if(clean.isDirectory()) {
for (File i : clean.listFiles()) { for(File i : clean.listFiles()) {
files(i, files); files(i, files);
} }
} else if (clean.getName().endsWith(".json")) { } else if(clean.getName().endsWith(".json")) {
try { try {
files.add(clean); files.add(clean);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
} }
public void filesObjects(File clean, KList<File> files) { public void filesObjects(File clean, KList<File> files) {
if (clean.isDirectory()) { if(clean.isDirectory()) {
for (File i : clean.listFiles()) { for(File i : clean.listFiles()) {
filesObjects(i, files); filesObjects(i, files);
} }
} else if (clean.getName().endsWith(".iob")) { } else if(clean.getName().endsWith(".iob")) {
try { try {
files.add(clean); files.add(clean);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
} }
private void fixBlocks(JSONObject obj) { private void fixBlocks(JSONObject obj) {
for (String i : obj.keySet()) { for(String i : obj.keySet()) {
Object o = obj.get(i); Object o = obj.get(i);
if (i.equals("block") && o instanceof String && !o.toString().trim().isEmpty() && !o.toString().contains(":")) { if(i.equals("block") && o instanceof String && !o.toString().trim().isEmpty() && !o.toString().contains(":")) {
obj.put(i, "minecraft:" + o); obj.put(i, "minecraft:" + o);
} }
if (o instanceof JSONObject) { if(o instanceof JSONObject) {
fixBlocks((JSONObject) o); fixBlocks((JSONObject) o);
} else if (o instanceof JSONArray) { } else if(o instanceof JSONArray) {
fixBlocks((JSONArray) o); fixBlocks((JSONArray) o);
} }
} }
} }
private void fixBlocks(JSONArray obj) { private void fixBlocks(JSONArray obj) {
for (int i = 0; i < obj.length(); i++) { for(int i = 0; i < obj.length(); i++) {
Object o = obj.get(i); Object o = obj.get(i);
if (o instanceof JSONObject) { if(o instanceof JSONObject) {
fixBlocks((JSONObject) o); fixBlocks((JSONObject) o);
} else if (o instanceof JSONArray) { } else if(o instanceof JSONArray) {
fixBlocks((JSONArray) o); fixBlocks((JSONArray) o);
} }
} }

View File

@ -70,7 +70,7 @@ public class SchemaBuilder {
private static JSONArray getEnchantmentTypes() { private static JSONArray getEnchantmentTypes() {
JSONArray a = new JSONArray(); JSONArray a = new JSONArray();
for (Field gg : Enchantment.class.getDeclaredFields()) { for(Field gg : Enchantment.class.getDeclaredFields()) {
a.put(gg.getName()); a.put(gg.getName());
} }
@ -80,7 +80,7 @@ public class SchemaBuilder {
private static JSONArray getPotionTypes() { private static JSONArray getPotionTypes() {
JSONArray a = new JSONArray(); JSONArray a = new JSONArray();
for (PotionEffectType gg : PotionEffectType.values()) { for(PotionEffectType gg : PotionEffectType.values()) {
a.put(gg.getName().toUpperCase().replaceAll("\\Q \\E", "_")); a.put(gg.getName().toUpperCase().replaceAll("\\Q \\E", "_"));
} }
@ -94,21 +94,21 @@ public class SchemaBuilder {
JSONObject props = buildProperties(root); JSONObject props = buildProperties(root);
for (String i : props.keySet()) { for(String i : props.keySet()) {
if (!schema.has(i)) { if(!schema.has(i)) {
schema.put(i, props.get(i)); schema.put(i, props.get(i));
} }
} }
JSONObject defs = new JSONObject(); JSONObject defs = new JSONObject();
for (Map.Entry<String, JSONObject> entry : definitions.entrySet()) { for(Map.Entry<String, JSONObject> entry : definitions.entrySet()) {
defs.put(entry.getKey(), entry.getValue()); defs.put(entry.getKey(), entry.getValue());
} }
schema.put("definitions", defs); schema.put("definitions", defs);
for (String i : warnings) { for(String i : warnings) {
Iris.warn(root.getSimpleName() + ": " + i); Iris.warn(root.getSimpleName() + ": " + i);
} }
@ -122,17 +122,17 @@ public class SchemaBuilder {
o.put("type", getType(c)); o.put("type", getType(c));
JSONArray required = new JSONArray(); JSONArray required = new JSONArray();
if (c.isAssignableFrom(IrisRegistrant.class) || IrisRegistrant.class.isAssignableFrom(c)) { if(c.isAssignableFrom(IrisRegistrant.class) || IrisRegistrant.class.isAssignableFrom(c)) {
for (Field k : IrisRegistrant.class.getDeclaredFields()) { for(Field k : IrisRegistrant.class.getDeclaredFields()) {
k.setAccessible(true); k.setAccessible(true);
if (Modifier.isStatic(k.getModifiers()) || Modifier.isFinal(k.getModifiers()) || Modifier.isTransient(k.getModifiers())) { if(Modifier.isStatic(k.getModifiers()) || Modifier.isFinal(k.getModifiers()) || Modifier.isTransient(k.getModifiers())) {
continue; continue;
} }
JSONObject property = buildProperty(k, c); JSONObject property = buildProperty(k, c);
if (property.getBoolean("!required")) { if(property.getBoolean("!required")) {
required.put(k.getName()); required.put(k.getName());
} }
@ -141,10 +141,10 @@ public class SchemaBuilder {
} }
} }
for (Field k : c.getDeclaredFields()) { for(Field k : c.getDeclaredFields()) {
k.setAccessible(true); k.setAccessible(true);
if (Modifier.isStatic(k.getModifiers()) || Modifier.isFinal(k.getModifiers()) || Modifier.isTransient(k.getModifiers())) { if(Modifier.isStatic(k.getModifiers()) || Modifier.isFinal(k.getModifiers()) || Modifier.isTransient(k.getModifiers())) {
continue; continue;
} }
@ -154,14 +154,14 @@ public class SchemaBuilder {
properties.put(k.getName(), property); properties.put(k.getName(), property);
} }
if (required.length() > 0) { if(required.length() > 0) {
o.put("required", required); o.put("required", required);
} }
o.put("properties", properties); o.put("properties", properties);
if (c.isAnnotationPresent(Snippet.class)) { if(c.isAnnotationPresent(Snippet.class)) {
JSONObject anyOf = new JSONObject(); JSONObject anyOf = new JSONObject();
JSONArray arr = new JSONArray(); JSONArray arr = new JSONArray();
JSONObject str = new JSONObject(); JSONObject str = new JSONObject();
@ -184,16 +184,16 @@ public class SchemaBuilder {
prop.put("type", type); prop.put("type", type);
String fancyType = "Unknown Type"; String fancyType = "Unknown Type";
switch (type) { switch(type) {
case "boolean" -> fancyType = "Boolean"; case "boolean" -> fancyType = "Boolean";
case "integer" -> { case "integer" -> {
fancyType = "Integer"; fancyType = "Integer";
if (k.isAnnotationPresent(MinNumber.class)) { if(k.isAnnotationPresent(MinNumber.class)) {
int min = (int) k.getDeclaredAnnotation(MinNumber.class).value(); int min = (int) k.getDeclaredAnnotation(MinNumber.class).value();
prop.put("minimum", min); prop.put("minimum", min);
description.add(SYMBOL_LIMIT__N + " Minimum allowed is " + min); description.add(SYMBOL_LIMIT__N + " Minimum allowed is " + min);
} }
if (k.isAnnotationPresent(MaxNumber.class)) { if(k.isAnnotationPresent(MaxNumber.class)) {
int max = (int) k.getDeclaredAnnotation(MaxNumber.class).value(); int max = (int) k.getDeclaredAnnotation(MaxNumber.class).value();
prop.put("maximum", max); prop.put("maximum", max);
description.add(SYMBOL_LIMIT__N + " Maximum allowed is " + max); description.add(SYMBOL_LIMIT__N + " Maximum allowed is " + max);
@ -201,12 +201,12 @@ public class SchemaBuilder {
} }
case "number" -> { case "number" -> {
fancyType = "Number"; fancyType = "Number";
if (k.isAnnotationPresent(MinNumber.class)) { if(k.isAnnotationPresent(MinNumber.class)) {
double min = k.getDeclaredAnnotation(MinNumber.class).value(); double min = k.getDeclaredAnnotation(MinNumber.class).value();
prop.put("minimum", min); prop.put("minimum", min);
description.add(SYMBOL_LIMIT__N + " Minimum allowed is " + min); description.add(SYMBOL_LIMIT__N + " Minimum allowed is " + min);
} }
if (k.isAnnotationPresent(MaxNumber.class)) { if(k.isAnnotationPresent(MaxNumber.class)) {
double max = k.getDeclaredAnnotation(MaxNumber.class).value(); double max = k.getDeclaredAnnotation(MaxNumber.class).value();
prop.put("maximum", max); prop.put("maximum", max);
description.add(SYMBOL_LIMIT__N + " Maximum allowed is " + max); description.add(SYMBOL_LIMIT__N + " Maximum allowed is " + max);
@ -214,26 +214,26 @@ public class SchemaBuilder {
} }
case "string" -> { case "string" -> {
fancyType = "Text"; fancyType = "Text";
if (k.isAnnotationPresent(MinNumber.class)) { if(k.isAnnotationPresent(MinNumber.class)) {
int min = (int) k.getDeclaredAnnotation(MinNumber.class).value(); int min = (int) k.getDeclaredAnnotation(MinNumber.class).value();
prop.put("minLength", min); prop.put("minLength", min);
description.add(SYMBOL_LIMIT__N + " Minimum Length allowed is " + min); description.add(SYMBOL_LIMIT__N + " Minimum Length allowed is " + min);
} }
if (k.isAnnotationPresent(MaxNumber.class)) { if(k.isAnnotationPresent(MaxNumber.class)) {
int max = (int) k.getDeclaredAnnotation(MaxNumber.class).value(); int max = (int) k.getDeclaredAnnotation(MaxNumber.class).value();
prop.put("maxLength", max); prop.put("maxLength", max);
description.add(SYMBOL_LIMIT__N + " Maximum Length allowed is " + max); description.add(SYMBOL_LIMIT__N + " Maximum Length allowed is " + max);
} }
if (k.isAnnotationPresent(RegistryListResource.class)) { if(k.isAnnotationPresent(RegistryListResource.class)) {
RegistryListResource rr = k.getDeclaredAnnotation(RegistryListResource.class); RegistryListResource rr = k.getDeclaredAnnotation(RegistryListResource.class);
ResourceLoader<?> loader = data.getLoaders().get(rr.value()); ResourceLoader<?> loader = data.getLoaders().get(rr.value());
if (loader != null) { if(loader != null) {
String key = "erz" + loader.getFolderName(); String key = "erz" + loader.getFolderName();
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", new JSONArray(loader.getPossibleKeys())); j.put("enum", new JSONArray(loader.getPossibleKeys()));
definitions.put(key, j); definitions.put(key, j);
@ -245,18 +245,18 @@ public class SchemaBuilder {
} else { } else {
Iris.error("Cannot find Registry Loader for type " + rr.value() + " used in " + k.getDeclaringClass().getCanonicalName() + " in field " + k.getName()); Iris.error("Cannot find Registry Loader for type " + rr.value() + " used in " + k.getDeclaringClass().getCanonicalName() + " in field " + k.getName());
} }
} else if (k.isAnnotationPresent(RegistryListBlockType.class)) { } else if(k.isAnnotationPresent(RegistryListBlockType.class)) {
String key = "enum-block-type"; String key = "enum-block-type";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
JSONArray ja = new JSONArray(); JSONArray ja = new JSONArray();
for (String i : data.getBlockLoader().getPossibleKeys()) { for(String i : data.getBlockLoader().getPossibleKeys()) {
ja.put(i); ja.put(i);
} }
for (String i : B.getBlockTypes()) { for(String i : B.getBlockTypes()) {
ja.put(i); ja.put(i);
} }
@ -268,10 +268,10 @@ public class SchemaBuilder {
prop.put("$ref", "#/definitions/" + key); prop.put("$ref", "#/definitions/" + key);
description.add(SYMBOL_TYPE__N + " Must be a valid Block Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Block Type (use ctrl+space for auto complete!)");
} else if (k.isAnnotationPresent(RegistryListItemType.class)) { } else if(k.isAnnotationPresent(RegistryListItemType.class)) {
String key = "enum-item-type"; String key = "enum-item-type";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", ITEM_TYPES); j.put("enum", ITEM_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -281,10 +281,10 @@ public class SchemaBuilder {
prop.put("$ref", "#/definitions/" + key); prop.put("$ref", "#/definitions/" + key);
description.add(SYMBOL_TYPE__N + " Must be a valid Item Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Item Type (use ctrl+space for auto complete!)");
} else if (k.isAnnotationPresent(RegistryListSpecialEntity.class)) { } else if(k.isAnnotationPresent(RegistryListSpecialEntity.class)) {
String key = "enum-reg-specialentity"; String key = "enum-reg-specialentity";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
KList<String> list = new KList<>(); KList<String> list = new KList<>();
list.addAll(Iris.linkMythicMobs.getMythicMobTypes().stream().map(s -> "MythicMobs:" + s).collect(Collectors.toList())); list.addAll(Iris.linkMythicMobs.getMythicMobTypes().stream().map(s -> "MythicMobs:" + s).collect(Collectors.toList()));
@ -296,10 +296,10 @@ public class SchemaBuilder {
fancyType = "Mythic Mob Type"; fancyType = "Mythic Mob Type";
prop.put("$ref", "#/definitions/" + key); prop.put("$ref", "#/definitions/" + key);
description.add(SYMBOL_TYPE__N + " Must be a valid Mythic Mob Type (use ctrl+space for auto complete!) Define mythic mobs with the mythic mobs plugin configuration files."); description.add(SYMBOL_TYPE__N + " Must be a valid Mythic Mob Type (use ctrl+space for auto complete!) Define mythic mobs with the mythic mobs plugin configuration files.");
} else if (k.isAnnotationPresent(RegistryListFont.class)) { } else if(k.isAnnotationPresent(RegistryListFont.class)) {
String key = "enum-font"; String key = "enum-font";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", FONT_TYPES); j.put("enum", FONT_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -309,10 +309,10 @@ public class SchemaBuilder {
prop.put("$ref", "#/definitions/" + key); prop.put("$ref", "#/definitions/" + key);
description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)");
} else if (k.getType().equals(Enchantment.class)) { } else if(k.getType().equals(Enchantment.class)) {
String key = "enum-enchantment"; String key = "enum-enchantment";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", ENCHANT_TYPES); j.put("enum", ENCHANT_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -321,10 +321,10 @@ public class SchemaBuilder {
fancyType = "Enchantment Type"; fancyType = "Enchantment Type";
prop.put("$ref", "#/definitions/" + key); prop.put("$ref", "#/definitions/" + key);
description.add(SYMBOL_TYPE__N + " Must be a valid Enchantment Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Enchantment Type (use ctrl+space for auto complete!)");
} else if (k.getType().equals(PotionEffectType.class)) { } else if(k.getType().equals(PotionEffectType.class)) {
String key = "enum-potion-effect-type"; String key = "enum-potion-effect-type";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", POTION_TYPES); j.put("enum", POTION_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -334,12 +334,12 @@ public class SchemaBuilder {
prop.put("$ref", "#/definitions/" + key); prop.put("$ref", "#/definitions/" + key);
description.add(SYMBOL_TYPE__N + " Must be a valid Potion Effect Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Potion Effect Type (use ctrl+space for auto complete!)");
} else if (k.getType().isEnum()) { } else if(k.getType().isEnum()) {
fancyType = k.getType().getSimpleName().replaceAll("\\QIris\\E", ""); fancyType = k.getType().getSimpleName().replaceAll("\\QIris\\E", "");
JSONArray a = new JSONArray(); JSONArray a = new JSONArray();
boolean advanced = k.getType().isAnnotationPresent(Desc.class); boolean advanced = k.getType().isAnnotationPresent(Desc.class);
for (Object gg : k.getType().getEnumConstants()) { for(Object gg : k.getType().getEnumConstants()) {
if (advanced) { if(advanced) {
try { try {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
String name = ((Enum<?>) gg).name(); String name = ((Enum<?>) gg).name();
@ -347,7 +347,7 @@ public class SchemaBuilder {
Desc dd = k.getType().getField(name).getAnnotation(Desc.class); Desc dd = k.getType().getField(name).getAnnotation(Desc.class);
j.put("description", dd == null ? ("No Description for " + name) : dd.value()); j.put("description", dd == null ? ("No Description for " + name) : dd.value());
a.put(j); a.put(j);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -358,7 +358,7 @@ public class SchemaBuilder {
String key = (advanced ? "oneof-" : "") + "enum-" + k.getType().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase(); String key = (advanced ? "oneof-" : "") + "enum-" + k.getType().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase();
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put(advanced ? "oneOf" : "enum", a); j.put(advanced ? "oneOf" : "enum", a);
definitions.put(key, j); definitions.put(key, j);
@ -372,7 +372,7 @@ public class SchemaBuilder {
case "object" -> { case "object" -> {
fancyType = k.getType().getSimpleName().replaceAll("\\QIris\\E", "") + " (Object)"; fancyType = k.getType().getSimpleName().replaceAll("\\QIris\\E", "") + " (Object)";
String key = "obj-" + k.getType().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase(); String key = "obj-" + k.getType().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase();
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
definitions.put(key, new JSONObject()); definitions.put(key, new JSONObject());
definitions.put(key, buildProperties(k.getType())); definitions.put(key, buildProperties(k.getType()));
} }
@ -381,10 +381,10 @@ public class SchemaBuilder {
case "array" -> { case "array" -> {
fancyType = "List of Something...?"; fancyType = "List of Something...?";
ArrayType t = k.getDeclaredAnnotation(ArrayType.class); ArrayType t = k.getDeclaredAnnotation(ArrayType.class);
if (t != null) { if(t != null) {
if (t.min() > 0) { if(t.min() > 0) {
prop.put("minItems", t.min()); prop.put("minItems", t.min());
if (t.min() == 1) { if(t.min() == 1) {
description.add(SYMBOL_LIMIT__N + " At least one entry must be defined, or just remove this list."); description.add(SYMBOL_LIMIT__N + " At least one entry must be defined, or just remove this list.");
} else { } else {
description.add(SYMBOL_LIMIT__N + " Requires at least " + t.min() + " entries."); description.add(SYMBOL_LIMIT__N + " Requires at least " + t.min() + " entries.");
@ -393,13 +393,13 @@ public class SchemaBuilder {
String arrayType = getType(t.type()); String arrayType = getType(t.type());
switch (arrayType) { switch(arrayType) {
case "integer" -> fancyType = "List of Integers"; case "integer" -> fancyType = "List of Integers";
case "number" -> fancyType = "List of Numbers"; case "number" -> fancyType = "List of Numbers";
case "object" -> { case "object" -> {
fancyType = "List of " + t.type().getSimpleName().replaceAll("\\QIris\\E", "") + "s (Objects)"; fancyType = "List of " + t.type().getSimpleName().replaceAll("\\QIris\\E", "") + "s (Objects)";
String key = "obj-" + t.type().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase(); String key = "obj-" + t.type().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase();
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
definitions.put(key, new JSONObject()); definitions.put(key, new JSONObject());
definitions.put(key, buildProperties(t.type())); definitions.put(key, buildProperties(t.type()));
} }
@ -410,15 +410,15 @@ public class SchemaBuilder {
case "string" -> { case "string" -> {
fancyType = "List of Text"; fancyType = "List of Text";
if (k.isAnnotationPresent(RegistryListResource.class)) { if(k.isAnnotationPresent(RegistryListResource.class)) {
RegistryListResource rr = k.getDeclaredAnnotation(RegistryListResource.class); RegistryListResource rr = k.getDeclaredAnnotation(RegistryListResource.class);
ResourceLoader<?> loader = data.getLoaders().get(rr.value()); ResourceLoader<?> loader = data.getLoaders().get(rr.value());
if (loader != null) { if(loader != null) {
fancyType = "List<" + loader.getResourceTypeName() + ">"; fancyType = "List<" + loader.getResourceTypeName() + ">";
String key = "erz" + loader.getFolderName(); String key = "erz" + loader.getFolderName();
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", new JSONArray(loader.getPossibleKeys())); j.put("enum", new JSONArray(loader.getPossibleKeys()));
definitions.put(key, j); definitions.put(key, j);
@ -431,19 +431,19 @@ public class SchemaBuilder {
} else { } else {
Iris.error("Cannot find Registry Loader for type (list schema) " + rr.value() + " used in " + k.getDeclaringClass().getCanonicalName() + " in field " + k.getName()); Iris.error("Cannot find Registry Loader for type (list schema) " + rr.value() + " used in " + k.getDeclaringClass().getCanonicalName() + " in field " + k.getName());
} }
} else if (k.isAnnotationPresent(RegistryListBlockType.class)) { } else if(k.isAnnotationPresent(RegistryListBlockType.class)) {
fancyType = "List of Block Types"; fancyType = "List of Block Types";
String key = "enum-block-type"; String key = "enum-block-type";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
JSONArray ja = new JSONArray(); JSONArray ja = new JSONArray();
for (String i : data.getBlockLoader().getPossibleKeys()) { for(String i : data.getBlockLoader().getPossibleKeys()) {
ja.put(i); ja.put(i);
} }
for (String i : B.getBlockTypes()) { for(String i : B.getBlockTypes()) {
ja.put(i); ja.put(i);
} }
@ -455,11 +455,11 @@ public class SchemaBuilder {
items.put("$ref", "#/definitions/" + key); items.put("$ref", "#/definitions/" + key);
prop.put("items", items); prop.put("items", items);
description.add(SYMBOL_TYPE__N + " Must be a valid Block Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Block Type (use ctrl+space for auto complete!)");
} else if (k.isAnnotationPresent(RegistryListItemType.class)) { } else if(k.isAnnotationPresent(RegistryListItemType.class)) {
fancyType = "List of Item Types"; fancyType = "List of Item Types";
String key = "enum-item-type"; String key = "enum-item-type";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", ITEM_TYPES); j.put("enum", ITEM_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -469,11 +469,11 @@ public class SchemaBuilder {
items.put("$ref", "#/definitions/" + key); items.put("$ref", "#/definitions/" + key);
prop.put("items", items); prop.put("items", items);
description.add(SYMBOL_TYPE__N + " Must be a valid Item Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Item Type (use ctrl+space for auto complete!)");
} else if (k.isAnnotationPresent(RegistryListFont.class)) { } else if(k.isAnnotationPresent(RegistryListFont.class)) {
String key = "enum-font"; String key = "enum-font";
fancyType = "List of Font Families"; fancyType = "List of Font Families";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", FONT_TYPES); j.put("enum", FONT_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -483,11 +483,11 @@ public class SchemaBuilder {
items.put("$ref", "#/definitions/" + key); items.put("$ref", "#/definitions/" + key);
prop.put("items", items); prop.put("items", items);
description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)");
} else if (t.type().equals(Enchantment.class)) { } else if(t.type().equals(Enchantment.class)) {
fancyType = "List of Enchantment Types"; fancyType = "List of Enchantment Types";
String key = "enum-enchantment"; String key = "enum-enchantment";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", ENCHANT_TYPES); j.put("enum", ENCHANT_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -497,11 +497,11 @@ public class SchemaBuilder {
items.put("$ref", "#/definitions/" + key); items.put("$ref", "#/definitions/" + key);
prop.put("items", items); prop.put("items", items);
description.add(SYMBOL_TYPE__N + " Must be a valid Enchantment Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Enchantment Type (use ctrl+space for auto complete!)");
} else if (t.type().equals(PotionEffectType.class)) { } else if(t.type().equals(PotionEffectType.class)) {
fancyType = "List of Potion Effect Types"; fancyType = "List of Potion Effect Types";
String key = "enum-potion-effect-type"; String key = "enum-potion-effect-type";
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put("enum", POTION_TYPES); j.put("enum", POTION_TYPES);
definitions.put(key, j); definitions.put(key, j);
@ -511,12 +511,12 @@ public class SchemaBuilder {
items.put("$ref", "#/definitions/" + key); items.put("$ref", "#/definitions/" + key);
prop.put("items", items); prop.put("items", items);
description.add(SYMBOL_TYPE__N + " Must be a valid Potion Effect Type (use ctrl+space for auto complete!)"); description.add(SYMBOL_TYPE__N + " Must be a valid Potion Effect Type (use ctrl+space for auto complete!)");
} else if (t.type().isEnum()) { } else if(t.type().isEnum()) {
fancyType = "List of " + t.type().getSimpleName().replaceAll("\\QIris\\E", "") + "s"; fancyType = "List of " + t.type().getSimpleName().replaceAll("\\QIris\\E", "") + "s";
JSONArray a = new JSONArray(); JSONArray a = new JSONArray();
boolean advanced = t.type().isAnnotationPresent(Desc.class); boolean advanced = t.type().isAnnotationPresent(Desc.class);
for (Object gg : t.type().getEnumConstants()) { for(Object gg : t.type().getEnumConstants()) {
if (advanced) { if(advanced) {
try { try {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
String name = ((Enum<?>) gg).name(); String name = ((Enum<?>) gg).name();
@ -524,7 +524,7 @@ public class SchemaBuilder {
Desc dd = t.type().getField(name).getAnnotation(Desc.class); Desc dd = t.type().getField(name).getAnnotation(Desc.class);
j.put("description", dd == null ? ("No Description for " + name) : dd.value()); j.put("description", dd == null ? ("No Description for " + name) : dd.value());
a.put(j); a.put(j);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -535,7 +535,7 @@ public class SchemaBuilder {
String key = (advanced ? "oneof-" : "") + "enum-" + t.type().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase(); String key = (advanced ? "oneof-" : "") + "enum-" + t.type().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase();
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
j.put(advanced ? "oneOf" : "enum", a); j.put(advanced ? "oneOf" : "enum", a);
definitions.put(key, j); definitions.put(key, j);
@ -562,7 +562,7 @@ public class SchemaBuilder {
d.add(fancyType); d.add(fancyType);
d.add(getDescription(k.getType())); d.add(getDescription(k.getType()));
if (k.getType().isAnnotationPresent(Snippet.class)) { if(k.getType().isAnnotationPresent(Snippet.class)) {
String sm = k.getType().getDeclaredAnnotation(Snippet.class).value(); String sm = k.getType().getDeclaredAnnotation(Snippet.class).value();
d.add(" "); d.add(" ");
d.add("You can instead specify \"snippet/" + sm + "/some-name.json\" to use a snippet file instead of specifying it here."); d.add("You can instead specify \"snippet/" + sm + "/some-name.json\" to use a snippet file instead of specifying it here.");
@ -572,11 +572,11 @@ public class SchemaBuilder {
k.setAccessible(true); k.setAccessible(true);
Object value = k.get(cl.newInstance()); Object value = k.get(cl.newInstance());
if (value != null) { if(value != null) {
if (value instanceof List) { if(value instanceof List) {
d.add(" "); d.add(" ");
d.add("* Default Value is an empty list"); d.add("* Default Value is an empty list");
} else if (!cl.isPrimitive() && !(value instanceof Number) && !(value instanceof String) && !(cl.isEnum())) { } else if(!cl.isPrimitive() && !(value instanceof Number) && !(value instanceof String) && !(cl.isEnum())) {
d.add(" "); d.add(" ");
d.add("* Default Value is a default object (create this object to see default properties)"); d.add("* Default Value is a default object (create this object to see default properties)");
} else { } else {
@ -584,7 +584,7 @@ public class SchemaBuilder {
d.add("* Default Value is " + value); d.add("* Default Value is " + value);
} }
} }
} catch (Throwable ignored) { } catch(Throwable ignored) {
} }
@ -592,7 +592,7 @@ public class SchemaBuilder {
prop.put("type", type); prop.put("type", type);
prop.put("description", d.toString("\n")); prop.put("description", d.toString("\n"));
if (k.getType().isAnnotationPresent(Snippet.class)) { if(k.getType().isAnnotationPresent(Snippet.class)) {
JSONObject anyOf = new JSONObject(); JSONObject anyOf = new JSONObject();
JSONArray arr = new JSONArray(); JSONArray arr = new JSONArray();
JSONObject str = new JSONObject(); JSONObject str = new JSONObject();
@ -600,7 +600,7 @@ public class SchemaBuilder {
String key = "enum-snippet-" + k.getType().getDeclaredAnnotation(Snippet.class).value(); String key = "enum-snippet-" + k.getType().getDeclaredAnnotation(Snippet.class).value();
str.put("$ref", "#/definitions/" + key); str.put("$ref", "#/definitions/" + key);
if (!definitions.containsKey(key)) { if(!definitions.containsKey(key)) {
JSONObject j = new JSONObject(); JSONObject j = new JSONObject();
JSONArray snl = new JSONArray(); JSONArray snl = new JSONArray();
data.getPossibleSnippets(k.getType().getDeclaredAnnotation(Snippet.class).value()).forEach(snl::put); data.getPossibleSnippets(k.getType().getDeclaredAnnotation(Snippet.class).value()).forEach(snl::put);
@ -623,31 +623,31 @@ public class SchemaBuilder {
} }
private String getType(Class<?> c) { private String getType(Class<?> c) {
if (c.equals(int.class) || c.equals(Integer.class) || c.equals(long.class) || c.equals(Long.class)) { if(c.equals(int.class) || c.equals(Integer.class) || c.equals(long.class) || c.equals(Long.class)) {
return "integer"; return "integer";
} }
if (c.equals(float.class) || c.equals(double.class) || c.equals(Float.class) || c.equals(Double.class)) { if(c.equals(float.class) || c.equals(double.class) || c.equals(Float.class) || c.equals(Double.class)) {
return "number"; return "number";
} }
if (c.equals(boolean.class) || c.equals(Boolean.class)) { if(c.equals(boolean.class) || c.equals(Boolean.class)) {
return "boolean"; return "boolean";
} }
if (c.equals(String.class) || c.isEnum() || c.equals(Enchantment.class) || c.equals(PotionEffectType.class)) { if(c.equals(String.class) || c.isEnum() || c.equals(Enchantment.class) || c.equals(PotionEffectType.class)) {
return "string"; return "string";
} }
if (c.equals(KList.class)) { if(c.equals(KList.class)) {
return "array"; return "array";
} }
if (c.equals(KMap.class)) { if(c.equals(KMap.class)) {
return "object"; return "object";
} }
if (!c.isAnnotationPresent(Desc.class) && c.getCanonicalName().startsWith("com.volmit.iris.")) { if(!c.isAnnotationPresent(Desc.class) && c.getCanonicalName().startsWith("com.volmit.iris.")) {
warnings.addIfMissing("Unsupported Type: " + c.getCanonicalName() + " Did you forget @Desc?"); warnings.addIfMissing("Unsupported Type: " + c.getCanonicalName() + " Did you forget @Desc?");
} }
@ -656,12 +656,12 @@ public class SchemaBuilder {
private String getFieldDescription(Field r) { private String getFieldDescription(Field r) {
if (r.isAnnotationPresent(Desc.class)) { if(r.isAnnotationPresent(Desc.class)) {
return r.getDeclaredAnnotation(Desc.class).value(); return r.getDeclaredAnnotation(Desc.class).value();
} }
// suppress warnings on bukkit classes // suppress warnings on bukkit classes
if (r.getDeclaringClass().getName().startsWith("org.bukkit.")) { if(r.getDeclaringClass().getName().startsWith("org.bukkit.")) {
return "Bukkit package classes and enums have no descriptions"; return "Bukkit package classes and enums have no descriptions";
} }
@ -670,11 +670,11 @@ public class SchemaBuilder {
} }
private String getDescription(Class<?> r) { private String getDescription(Class<?> r) {
if (r.isAnnotationPresent(Desc.class)) { if(r.isAnnotationPresent(Desc.class)) {
return r.getDeclaredAnnotation(Desc.class).value(); return r.getDeclaredAnnotation(Desc.class).value();
} }
if (!r.isPrimitive() && !r.equals(KList.class) && !r.equals(KMap.class) && r.getCanonicalName().startsWith("com.volmit.")) { if(!r.isPrimitive() && !r.equals(KList.class) && !r.equals(KMap.class) && r.getCanonicalName().startsWith("com.volmit.")) {
warnings.addIfMissing("Missing @Desc on " + r.getSimpleName() + " in " + (r.getDeclaringClass() != null ? r.getDeclaringClass().getCanonicalName() : " NOSRC")); warnings.addIfMissing("Missing @Desc on " + r.getSimpleName() + " in " + (r.getDeclaringClass() != null ? r.getDeclaringClass().getCanonicalName() : " NOSRC"));
} }
return ""; return "";

View File

@ -19,9 +19,7 @@
package com.volmit.iris.core.service; package com.volmit.iris.core.service;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.project.IrisProject;
import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.util.board.BoardManager; import com.volmit.iris.util.board.BoardManager;
@ -72,7 +70,7 @@ public class BoardSVC implements IrisService, BoardProvider {
} }
public void updatePlayer(Player p) { public void updatePlayer(Player p) {
if (IrisToolbelt.isIrisStudioWorld(p.getWorld())) { if(IrisToolbelt.isIrisStudioWorld(p.getWorld())) {
manager.remove(p); manager.remove(p);
manager.setup(p); manager.setup(p);
} else { } else {
@ -87,8 +85,7 @@ public class BoardSVC implements IrisService, BoardProvider {
} }
public void tick() { public void tick() {
if(!Iris.service(StudioSVC.class).isProjectOpen()) if(!Iris.service(StudioSVC.class).isProjectOpen()) {
{
return; return;
} }
@ -98,7 +95,7 @@ public class BoardSVC implements IrisService, BoardProvider {
@Override @Override
public List<String> getLines(Player player) { public List<String> getLines(Player player) {
PlayerBoard pb = boards.computeIfAbsent(player, PlayerBoard::new); PlayerBoard pb = boards.computeIfAbsent(player, PlayerBoard::new);
synchronized (pb.lines) { synchronized(pb.lines) {
return pb.lines; return pb.lines;
} }
} }
@ -115,10 +112,10 @@ public class BoardSVC implements IrisService, BoardProvider {
} }
public void update() { public void update() {
synchronized (lines) { synchronized(lines) {
lines.clear(); lines.clear();
if (!IrisToolbelt.isIrisStudioWorld(player.getWorld())) { if(!IrisToolbelt.isIrisStudioWorld(player.getWorld())) {
return; return;
} }
@ -134,7 +131,7 @@ public class BoardSVC implements IrisService, BoardProvider {
lines.add("&7&m "); lines.add("&7&m ");
lines.add(C.AQUA + "Region" + C.GRAY + ": " + engine.getRegion(x, z).getName()); 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 + "Biome" + C.GRAY + ": " + engine.getBiomeOrMantle(x, y, z).getName());
lines.add(C.AQUA + "Height" + C.GRAY + ": " + Math.round(engine.getHeight(x, z))); lines.add(C.AQUA + "Height" + C.GRAY + ": " + Math.round(engine.getHeight(x, z) + player.getWorld().getMinHeight()));
lines.add(C.AQUA + "Slope" + C.GRAY + ": " + Form.f(engine.getComplex().getSlopeStream().get(x, z), 2)); 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(C.AQUA + "BUD/s" + C.GRAY + ": " + Form.f(engine.getBlockUpdatesPerSecond()));
lines.add("&7&m "); lines.add("&7&m ");

View File

@ -56,18 +56,18 @@ public class CommandSVC implements IrisService, DecreeSystem {
public void on(PlayerCommandPreprocessEvent e) { public void on(PlayerCommandPreprocessEvent e) {
String msg = e.getMessage().startsWith("/") ? e.getMessage().substring(1) : e.getMessage(); String msg = e.getMessage().startsWith("/") ? e.getMessage().substring(1) : e.getMessage();
if (msg.startsWith("irisdecree ")) { if(msg.startsWith("irisdecree ")) {
String[] args = msg.split("\\Q \\E"); String[] args = msg.split("\\Q \\E");
CompletableFuture<String> future = futures.get(args[1]); CompletableFuture<String> future = futures.get(args[1]);
if (future != null) { if(future != null) {
future.complete(args[2]); future.complete(args[2]);
e.setCancelled(true); e.setCancelled(true);
return; return;
} }
} }
if ((msg.startsWith("locate ") || msg.startsWith("locatebiome ")) && IrisToolbelt.isIrisWorld(e.getPlayer().getWorld())) { if((msg.startsWith("locate ") || msg.startsWith("locatebiome ")) && IrisToolbelt.isIrisWorld(e.getPlayer().getWorld())) {
new VolmitSender(e.getPlayer()).sendMessage(C.RED + "Locating biomes & objects is disabled in Iris Worlds. Use /iris studio goto <biome>"); new VolmitSender(e.getPlayer()).sendMessage(C.RED + "Locating biomes & objects is disabled in Iris Worlds. Use /iris studio goto <biome>");
e.setCancelled(true); e.setCancelled(true);
} }
@ -75,8 +75,8 @@ public class CommandSVC implements IrisService, DecreeSystem {
@EventHandler @EventHandler
public void on(ServerCommandEvent e) { public void on(ServerCommandEvent e) {
if (consoleFuture != null && !consoleFuture.isCancelled() && !consoleFuture.isDone()) { if(consoleFuture != null && !consoleFuture.isCancelled() && !consoleFuture.isDone()) {
if (!e.getCommand().contains(" ")) { if(!e.getCommand().contains(" ")) {
String pick = e.getCommand().trim().toLowerCase(Locale.ROOT); String pick = e.getCommand().trim().toLowerCase(Locale.ROOT);
consoleFuture.complete(pick); consoleFuture.complete(pick);
e.setCancelled(true); e.setCancelled(true);

View File

@ -84,13 +84,13 @@ public class ConversionSVC implements IrisService {
destPools.mkdirs(); destPools.mkdirs();
findAllNBT(in, (folder, file) -> { findAllNBT(in, (folder, file) -> {
total.getAndIncrement(); total.getAndIncrement();
if (roots.addIfMissing(folder)) { if(roots.addIfMissing(folder)) {
String b = in.toURI().relativize(folder.toURI()).getPath(); String b = in.toURI().relativize(folder.toURI()).getPath();
if (b.startsWith("/")) { if(b.startsWith("/")) {
b = b.substring(1); b = b.substring(1);
} }
if (b.endsWith("/")) { if(b.endsWith("/")) {
b = b.substring(0, b.length() - 1); b = b.substring(0, b.length() - 1);
} }
@ -100,11 +100,11 @@ public class ConversionSVC implements IrisService {
findAllNBT(in, (folder, file) -> { findAllNBT(in, (folder, file) -> {
at.getAndIncrement(); at.getAndIncrement();
String b = in.toURI().relativize(folder.toURI()).getPath(); String b = in.toURI().relativize(folder.toURI()).getPath();
if (b.startsWith("/")) { if(b.startsWith("/")) {
b = b.substring(1); b = b.substring(1);
} }
if (b.endsWith("/")) { if(b.endsWith("/")) {
b = b.substring(0, b.length() - 1); b = b.substring(0, b.length() - 1);
} }
IrisJigsawPool jpool = pools.get(b); IrisJigsawPool jpool = pools.get(b);
@ -117,7 +117,7 @@ public class ConversionSVC implements IrisService {
NamedTag tag = NBTUtil.read(file); NamedTag tag = NBTUtil.read(file);
CompoundTag compound = (CompoundTag) tag.getTag(); CompoundTag compound = (CompoundTag) tag.getTag();
if (compound.containsKey("blocks") && compound.containsKey("palette") && compound.containsKey("size")) { if(compound.containsKey("blocks") && compound.containsKey("palette") && compound.containsKey("size")) {
String id = in.toURI().relativize(folder.toURI()).getPath() + file.getName().split("\\Q.\\E")[0]; String id = in.toURI().relativize(folder.toURI()).getPath() + file.getName().split("\\Q.\\E")[0];
@SuppressWarnings("unchecked") ListTag<IntTag> size = (ListTag<IntTag>) compound.getListTag("size"); @SuppressWarnings("unchecked") ListTag<IntTag> size = (ListTag<IntTag>) compound.getListTag("size");
int w = size.get(0).asInt(); int w = size.get(0).asInt();
@ -125,14 +125,14 @@ public class ConversionSVC implements IrisService {
int d = size.get(2).asInt(); int d = size.get(2).asInt();
KList<BlockData> palette = new KList<>(); KList<BlockData> palette = new KList<>();
@SuppressWarnings("unchecked") ListTag<CompoundTag> paletteList = (ListTag<CompoundTag>) compound.getListTag("palette"); @SuppressWarnings("unchecked") ListTag<CompoundTag> paletteList = (ListTag<CompoundTag>) compound.getListTag("palette");
for (int i = 0; i < paletteList.size(); i++) { for(int i = 0; i < paletteList.size(); i++) {
CompoundTag cp = paletteList.get(i); CompoundTag cp = paletteList.get(i);
palette.add(NBTWorld.getBlockData(cp)); palette.add(NBTWorld.getBlockData(cp));
} }
IrisJigsawPiece piece = new IrisJigsawPiece(); IrisJigsawPiece piece = new IrisJigsawPiece();
IrisObject object = new IrisObject(w, h, d); IrisObject object = new IrisObject(w, h, d);
@SuppressWarnings("unchecked") ListTag<CompoundTag> blockList = (ListTag<CompoundTag>) compound.getListTag("blocks"); @SuppressWarnings("unchecked") ListTag<CompoundTag> blockList = (ListTag<CompoundTag>) compound.getListTag("blocks");
for (int i = 0; i < blockList.size(); i++) { for(int i = 0; i < blockList.size(); i++) {
CompoundTag cp = blockList.get(i); CompoundTag cp = blockList.get(i);
@SuppressWarnings("unchecked") ListTag<IntTag> pos = (ListTag<IntTag>) cp.getListTag("pos"); @SuppressWarnings("unchecked") ListTag<IntTag> pos = (ListTag<IntTag>) cp.getListTag("pos");
int x = pos.get(0).asInt(); int x = pos.get(0).asInt();
@ -140,7 +140,7 @@ public class ConversionSVC implements IrisService {
int z = pos.get(2).asInt(); int z = pos.get(2).asInt();
BlockData bd = palette.get(cp.getInt("state")).clone(); BlockData bd = palette.get(cp.getInt("state")).clone();
if (bd.getMaterial().equals(Material.JIGSAW) && cp.containsKey("nbt")) { if(bd.getMaterial().equals(Material.JIGSAW) && cp.containsKey("nbt")) {
piece.setObject(in.toURI().relativize(folder.toURI()).getPath() + file.getName().split("\\Q.\\E")[0]); piece.setObject(in.toURI().relativize(folder.toURI()).getPath() + file.getName().split("\\Q.\\E")[0]);
IrisPosition spos = new IrisPosition(object.getSigned(x, y, z)); IrisPosition spos = new IrisPosition(object.getSigned(x, y, z));
CompoundTag nbt = cp.getCompoundTag("nbt"); CompoundTag nbt = cp.getCompoundTag("nbt");
@ -162,14 +162,14 @@ public class ConversionSVC implements IrisService {
connector.getPools().add(poolId); connector.getPools().add(poolId);
connector.setDirection(IrisDirection.getDirection(((Jigsaw) jd).getOrientation())); connector.setDirection(IrisDirection.getDirection(((Jigsaw) jd).getOrientation()));
if (target.equals("minecraft:building_entrance")) { if(target.equals("minecraft:building_entrance")) {
connector.setInnerConnector(true); connector.setInnerConnector(true);
} }
piece.getConnectors().add(connector); piece.getConnectors().add(connector);
} }
if (!bd.getMaterial().equals(Material.STRUCTURE_VOID) && !bd.getMaterial().equals(Material.AIR)) { if(!bd.getMaterial().equals(Material.STRUCTURE_VOID) && !bd.getMaterial().equals(Material.AIR)) {
object.setUnsigned(x, y, z, bd); object.setUnsigned(x, y, z, bd);
} }
} }
@ -179,16 +179,16 @@ public class ConversionSVC implements IrisService {
IO.writeAll(new File(destPieces, file.getName().split("\\Q.\\E")[0] + ".json"), new JSONObject(new Gson().toJson(piece)).toString(4)); IO.writeAll(new File(destPieces, file.getName().split("\\Q.\\E")[0] + ".json"), new JSONObject(new Gson().toJson(piece)).toString(4));
Iris.info("[Jigsaw]: (" + Form.pc((double) at.get() / (double) total.get(), 0) + ") Exported Piece: " + id); Iris.info("[Jigsaw]: (" + Form.pc((double) at.get() / (double) total.get(), 0) + ") Exported Piece: " + id);
} }
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
}); });
for (String i : pools.k()) { for(String i : pools.k()) {
try { try {
IO.writeAll(new File(destPools, i + ".json"), new JSONObject(new Gson().toJson(pools.get(i))).toString(4)); IO.writeAll(new File(destPools, i + ".json"), new JSONObject(new Gson().toJson(pools.get(i))).toString(4));
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -198,19 +198,19 @@ public class ConversionSVC implements IrisService {
} }
public void findAllNBT(File path, Consumer2<File, File> inFile) { public void findAllNBT(File path, Consumer2<File, File> inFile) {
if (path == null) { if(path == null) {
return; return;
} }
if (path.isFile() && path.getName().endsWith(".nbt")) { if(path.isFile() && path.getName().endsWith(".nbt")) {
inFile.accept(path.getParentFile(), path); inFile.accept(path.getParentFile(), path);
return; return;
} }
for (File i : path.listFiles()) { for(File i : path.listFiles()) {
if (i.isDirectory()) { if(i.isDirectory()) {
findAllNBT(i, inFile); findAllNBT(i, inFile);
} else if (i.isFile() && i.getName().endsWith(".nbt")) { } else if(i.isFile() && i.getName().endsWith(".nbt")) {
inFile.accept(path, i); inFile.accept(path, i);
} }
} }
@ -220,9 +220,9 @@ public class ConversionSVC implements IrisService {
int m = 0; int m = 0;
Iris.instance.getDataFolder("convert"); Iris.instance.getDataFolder("convert");
for (File i : folder.listFiles()) { for(File i : folder.listFiles()) {
for (Converter j : converters) { for(Converter j : converters) {
if (i.getName().endsWith("." + j.getInExtension())) { if(i.getName().endsWith("." + j.getInExtension())) {
File out = new File(folder, i.getName().replaceAll("\\Q." + j.getInExtension() + "\\E", "." + j.getOutExtension())); File out = new File(folder, i.getName().replaceAll("\\Q." + j.getInExtension() + "\\E", "." + j.getOutExtension()));
m++; m++;
j.convert(i, out); j.convert(i, out);
@ -230,10 +230,10 @@ public class ConversionSVC implements IrisService {
} }
} }
if (i.isDirectory() && i.getName().equals("structures")) { if(i.isDirectory() && i.getName().equals("structures")) {
File f = new File(folder, "jigsaw"); File f = new File(folder, "jigsaw");
if (!f.exists()) { if(!f.exists()) {
s.sendMessage("Converting NBT Structures into Iris Jigsaw Structures..."); s.sendMessage("Converting NBT Structures into Iris Jigsaw Structures...");
f.mkdirs(); f.mkdirs();
J.a(() -> convertStructures(i, f, s)); J.a(() -> convertStructures(i, f, s));

View File

@ -42,12 +42,12 @@ public class DolphinSVC implements IrisService {
*/ */
@EventHandler @EventHandler
public void on(PlayerInteractEntityEvent event) { public void on(PlayerInteractEntityEvent event) {
if (!IrisToolbelt.isIrisWorld(event.getPlayer().getWorld())) { if(!IrisToolbelt.isIrisWorld(event.getPlayer().getWorld())) {
return; return;
} }
Material hand = event.getPlayer().getInventory().getItem(event.getHand()).getType(); Material hand = event.getPlayer().getInventory().getItem(event.getHand()).getType();
if (event.getRightClicked().getType().equals(EntityType.DOLPHIN) && (hand.equals(Material.TROPICAL_FISH) || hand.equals(Material.PUFFERFISH) || hand.equals(Material.COD) || hand.equals(Material.SALMON))) { if(event.getRightClicked().getType().equals(EntityType.DOLPHIN) && (hand.equals(Material.TROPICAL_FISH) || hand.equals(Material.PUFFERFISH) || hand.equals(Material.COD) || hand.equals(Material.SALMON))) {
event.setCancelled(true); event.setCancelled(true);
} }
} }

View File

@ -71,27 +71,27 @@ public class EditSVC implements IrisService {
@EventHandler @EventHandler
public void on(WorldUnloadEvent e) { public void on(WorldUnloadEvent e) {
if (editors.containsKey(e.getWorld())) { if(editors.containsKey(e.getWorld())) {
editors.remove(e.getWorld()).close(); editors.remove(e.getWorld()).close();
} }
} }
public void update() { public void update() {
for (World i : editors.k()) { for(World i : editors.k()) {
if (M.ms() - editors.get(i).last() > 1000) { if(M.ms() - editors.get(i).last() > 1000) {
editors.remove(i).close(); editors.remove(i).close();
} }
} }
} }
public void flushNow() { public void flushNow() {
for (World i : editors.k()) { for(World i : editors.k()) {
editors.remove(i).close(); editors.remove(i).close();
} }
} }
public BlockEditor open(World world) { public BlockEditor open(World world) {
if (editors.containsKey(world)) { if(editors.containsKey(world)) {
return editors.get(world); return editors.get(world);
} }

View File

@ -54,9 +54,9 @@ public class ObjectSVC implements IrisService {
} }
private void loopChange(int amount) { private void loopChange(int amount) {
if (undos.size() > 0) { if(undos.size() > 0) {
revert(undos.pollLast()); revert(undos.pollLast());
if (amount > 1) { if(amount > 1) {
J.s(() -> loopChange(amount - 1), 2); J.s(() -> loopChange(amount - 1), 2);
} }
} }
@ -65,12 +65,13 @@ public class ObjectSVC implements IrisService {
/** /**
* Reverts all the block changes provided, 200 blocks per tick * Reverts all the block changes provided, 200 blocks per tick
* *
* @param blocks The blocks to remove * @param blocks
* The blocks to remove
*/ */
private void revert(Map<Block, BlockData> blocks) { private void revert(Map<Block, BlockData> blocks) {
int amount = 0; int amount = 0;
Iterator<Map.Entry<Block, BlockData>> it = blocks.entrySet().iterator(); Iterator<Map.Entry<Block, BlockData>> it = blocks.entrySet().iterator();
while (it.hasNext()) { while(it.hasNext()) {
Map.Entry<Block, BlockData> entry = it.next(); Map.Entry<Block, BlockData> entry = it.next();
BlockData data = entry.getValue(); BlockData data = entry.getValue();
entry.getKey().setBlockData(data, false); entry.getKey().setBlockData(data, false);
@ -78,7 +79,7 @@ public class ObjectSVC implements IrisService {
amount++; amount++;
if (amount > 200) { if(amount > 200) {
J.s(() -> revert(blocks), 1); J.s(() -> revert(blocks), 1);
} }
} }

View File

@ -57,8 +57,8 @@ public class PreservationSVC implements IrisService {
double p = 0; double p = 0;
double mf = 0; double mf = 0;
for (MeteredCache i : caches) { for(MeteredCache i : caches) {
if (i.isClosed()) { if(i.isClosed()) {
continue; continue;
} }
@ -100,22 +100,22 @@ public class PreservationSVC implements IrisService {
dereference(); dereference();
postShutdown(() -> { postShutdown(() -> {
for (Thread i : threads) { for(Thread i : threads) {
if (i.isAlive()) { if(i.isAlive()) {
try { try {
i.interrupt(); i.interrupt();
Iris.info("Shutdown Thread " + i.getName()); Iris.info("Shutdown Thread " + i.getName());
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
} }
for (ExecutorService i : services) { for(ExecutorService i : services) {
try { try {
i.shutdownNow(); i.shutdownNow();
Iris.info("Shutdown Executor Service " + i); Iris.info("Shutdown Executor Service " + i);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }

View File

@ -61,7 +61,7 @@ public class StudioSVC implements IrisService {
String pack = IrisSettings.get().getGenerator().getDefaultWorldType(); String pack = IrisSettings.get().getGenerator().getDefaultWorldType();
File f = IrisPack.packsPack(pack); File f = IrisPack.packsPack(pack);
if (!f.exists()) { if(!f.exists()) {
Iris.info("Downloading Default Pack " + pack); Iris.info("Downloading Default Pack " + pack);
downloadSearch(Iris.getSender(), pack, false); downloadSearch(Iris.getSender(), pack, false);
} }
@ -72,9 +72,9 @@ public class StudioSVC implements IrisService {
public void onDisable() { public void onDisable() {
Iris.debug("Studio Mode Active: Closing Projects"); Iris.debug("Studio Mode Active: Closing Projects");
for (World i : Bukkit.getWorlds()) { for(World i : Bukkit.getWorlds()) {
if (IrisToolbelt.isIrisWorld(i)) { if(IrisToolbelt.isIrisWorld(i)) {
if (IrisToolbelt.isStudio(i)) { if(IrisToolbelt.isStudio(i)) {
IrisToolbelt.evacuate(i); IrisToolbelt.evacuate(i);
IrisToolbelt.access(i).close(); IrisToolbelt.access(i).close();
} }
@ -88,9 +88,9 @@ public class StudioSVC implements IrisService {
File irispack = new File(folder, "iris/pack"); File irispack = new File(folder, "iris/pack");
IrisDimension dim = IrisData.loadAnyDimension(type); IrisDimension dim = IrisData.loadAnyDimension(type);
if (dim == null) { if(dim == null) {
for (File i : getWorkspaceFolder().listFiles()) { for(File i : getWorkspaceFolder().listFiles()) {
if (i.isFile() && i.getName().equals(type + ".iris")) { if(i.isFile() && i.getName().equals(type + ".iris")) {
sender.sendMessage("Found " + type + ".iris in " + WORKSPACE_NAME + " folder"); sender.sendMessage("Found " + type + ".iris in " + WORKSPACE_NAME + " folder");
ZipUtil.unpack(i, irispack); ZipUtil.unpack(i, irispack);
break; break;
@ -102,29 +102,29 @@ public class StudioSVC implements IrisService {
try { try {
FileUtils.copyDirectory(f, irispack); FileUtils.copyDirectory(f, irispack);
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
File dimf = new File(irispack, "dimensions/" + type + ".json"); File dimf = new File(irispack, "dimensions/" + type + ".json");
if (!dimf.exists() || !dimf.isFile()) { if(!dimf.exists() || !dimf.isFile()) {
downloadSearch(sender, type, false); downloadSearch(sender, type, false);
File downloaded = getWorkspaceFolder(type); File downloaded = getWorkspaceFolder(type);
for (File i : downloaded.listFiles()) { for(File i : downloaded.listFiles()) {
if (i.isFile()) { if(i.isFile()) {
try { try {
FileUtils.copyFile(i, new File(irispack, i.getName())); FileUtils.copyFile(i, new File(irispack, i.getName()));
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
} else { } else {
try { try {
FileUtils.copyDirectory(i, new File(irispack, i.getName())); FileUtils.copyDirectory(i, new File(irispack, i.getName()));
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -134,7 +134,7 @@ public class StudioSVC implements IrisService {
IO.delete(downloaded); IO.delete(downloaded);
} }
if (!dimf.exists() || !dimf.isFile()) { if(!dimf.exists() || !dimf.isFile()) {
sender.sendMessage("Can't find the " + dimf.getName() + " in the dimensions folder of this pack! Failed!"); sender.sendMessage("Can't find the " + dimf.getName() + " in the dimensions folder of this pack! Failed!");
return null; return null;
} }
@ -142,7 +142,7 @@ public class StudioSVC implements IrisService {
IrisData dm = IrisData.get(irispack); IrisData dm = IrisData.get(irispack);
dim = dm.getDimensionLoader().load(type); dim = dm.getDimensionLoader().load(type);
if (dim == null) { if(dim == null) {
sender.sendMessage("Can't load the dimension! Failed!"); sender.sendMessage("Can't load the dimension! Failed!");
return null; return null;
} }
@ -161,7 +161,7 @@ public class StudioSVC implements IrisService {
try { try {
url = getListing(false).get(key); url = getListing(false).get(key);
if (url == null) { if(url == null) {
Iris.warn("ITS ULL for " + key); Iris.warn("ITS ULL for " + key);
} }
@ -172,7 +172,7 @@ public class StudioSVC implements IrisService {
String repo = nodes.length == 1 ? "IrisDimensions/" + nodes[0] : nodes[0] + "/" + nodes[1]; String repo = nodes.length == 1 ? "IrisDimensions/" + nodes[0] : nodes[0] + "/" + nodes[1];
branch = nodes.length > 2 ? nodes[2] : branch; branch = nodes.length > 2 ? nodes[2] : branch;
download(sender, repo, branch, trim, forceOverwrite); download(sender, repo, branch, trim, forceOverwrite);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
sender.sendMessage("Failed to download '" + key + "' from " + url + "."); sender.sendMessage("Failed to download '" + key + "' from " + url + ".");
@ -191,7 +191,7 @@ public class StudioSVC implements IrisService {
File work = new File(temp, "dl-" + UUID.randomUUID()); File work = new File(temp, "dl-" + UUID.randomUUID());
File packs = getWorkspaceFolder(); File packs = getWorkspaceFolder();
if (zip == null || !zip.exists()) { if(zip == null || !zip.exists()) {
sender.sendMessage("Failed to find pack at " + url); sender.sendMessage("Failed to find pack at " + url);
sender.sendMessage("Make sure you specified the correct repo and branch!"); sender.sendMessage("Make sure you specified the correct repo and branch!");
sender.sendMessage("For example: /iris download IrisDimensions/overworld branch=master"); sender.sendMessage("For example: /iris download IrisDimensions/overworld branch=master");
@ -200,7 +200,7 @@ public class StudioSVC implements IrisService {
sender.sendMessage("Unpacking " + repo); sender.sendMessage("Unpacking " + repo);
try { try {
ZipUtil.unpack(zip, work); ZipUtil.unpack(zip, work);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
sender.sendMessage( sender.sendMessage(
@ -216,42 +216,42 @@ public class StudioSVC implements IrisService {
File dir = null; File dir = null;
File[] zipFiles = work.listFiles(); File[] zipFiles = work.listFiles();
if (zipFiles == null) { if(zipFiles == null) {
sender.sendMessage("No files were extracted from the zip file."); sender.sendMessage("No files were extracted from the zip file.");
return; return;
} }
try { try {
dir = zipFiles.length == 1 && zipFiles[0].isDirectory() ? zipFiles[0] : null; dir = zipFiles.length == 1 && zipFiles[0].isDirectory() ? zipFiles[0] : null;
} catch (NullPointerException e) { } catch(NullPointerException e) {
Iris.reportError(e); Iris.reportError(e);
sender.sendMessage("Error when finding home directory. Are there any non-text characters in the file name?"); sender.sendMessage("Error when finding home directory. Are there any non-text characters in the file name?");
return; return;
} }
if (dir == null) { if(dir == null) {
sender.sendMessage("Invalid Format. Missing root folder or too many folders!"); sender.sendMessage("Invalid Format. Missing root folder or too many folders!");
return; return;
} }
File dimensions = new File(dir, "dimensions"); File dimensions = new File(dir, "dimensions");
if (!(dimensions.exists() && dimensions.isDirectory())) { if(!(dimensions.exists() && dimensions.isDirectory())) {
sender.sendMessage("Invalid Format. Missing dimensions folder"); sender.sendMessage("Invalid Format. Missing dimensions folder");
return; return;
} }
if (dimensions.listFiles() == null) { if(dimensions.listFiles() == null) {
sender.sendMessage("No dimension file found in the extracted zip file."); sender.sendMessage("No dimension file found in the extracted zip file.");
sender.sendMessage("Check it is there on GitHub and report this to staff!"); sender.sendMessage("Check it is there on GitHub and report this to staff!");
} else if (dimensions.listFiles().length != 1) { } else if(dimensions.listFiles().length != 1) {
sender.sendMessage("Dimensions folder must have 1 file in it"); sender.sendMessage("Dimensions folder must have 1 file in it");
return; return;
} }
File dim = dimensions.listFiles()[0]; File dim = dimensions.listFiles()[0];
if (!dim.isFile()) { if(!dim.isFile()) {
sender.sendMessage("Invalid dimension (folder) in dimensions folder"); sender.sendMessage("Invalid dimension (folder) in dimensions folder");
return; return;
} }
@ -261,23 +261,23 @@ public class StudioSVC implements IrisService {
sender.sendMessage("Importing " + d.getName() + " (" + key + ")"); sender.sendMessage("Importing " + d.getName() + " (" + key + ")");
File packEntry = new File(packs, key); File packEntry = new File(packs, key);
if (forceOverwrite) { if(forceOverwrite) {
IO.delete(packEntry); IO.delete(packEntry);
} }
if (IrisData.loadAnyDimension(key) != null) { if(IrisData.loadAnyDimension(key) != null) {
sender.sendMessage("Another dimension in the packs folder is already using the key " + key + " IMPORT FAILED!"); sender.sendMessage("Another dimension in the packs folder is already using the key " + key + " IMPORT FAILED!");
return; return;
} }
if (packEntry.exists() && packEntry.listFiles().length > 0) { if(packEntry.exists() && packEntry.listFiles().length > 0) {
sender.sendMessage("Another pack is using the key " + key + ". IMPORT FAILED!"); sender.sendMessage("Another pack is using the key " + key + ". IMPORT FAILED!");
return; return;
} }
FileUtils.copyDirectory(dir, packEntry); FileUtils.copyDirectory(dir, packEntry);
if (trim) { if(trim) {
sender.sendMessage("Trimming " + key); sender.sendMessage("Trimming " + key);
File cp = compilePackage(sender, key, false, false); File cp = compilePackage(sender, key, false, false);
IO.delete(packEntry); IO.delete(packEntry);
@ -292,7 +292,7 @@ public class StudioSVC implements IrisService {
public KMap<String, String> getListing(boolean cached) { public KMap<String, String> getListing(boolean cached) {
JSONObject a; JSONObject a;
if (cached) { if(cached) {
a = new JSONObject(Iris.getCached("cachedlisting", LISTING)); a = new JSONObject(Iris.getCached("cachedlisting", LISTING));
} else { } else {
a = new JSONObject(Iris.getNonCached(true + "listing", LISTING)); a = new JSONObject(Iris.getNonCached(true + "listing", LISTING));
@ -300,8 +300,8 @@ public class StudioSVC implements IrisService {
KMap<String, String> l = new KMap<>(); KMap<String, String> l = new KMap<>();
for (String i : a.keySet()) { for(String i : a.keySet()) {
if (a.get(i) instanceof String) if(a.get(i) instanceof String)
l.put(i, a.getString(i)); l.put(i, a.getString(i));
} }
@ -324,7 +324,7 @@ public class StudioSVC implements IrisService {
try { try {
open(sender, seed, dimm, (w) -> { open(sender, seed, dimm, (w) -> {
}); });
} catch (Exception e) { } catch(Exception e) {
Iris.reportError(e); Iris.reportError(e);
sender.sendMessage("Error when creating studio world:"); sender.sendMessage("Error when creating studio world:");
e.printStackTrace(); e.printStackTrace();
@ -332,7 +332,7 @@ public class StudioSVC implements IrisService {
} }
public void open(VolmitSender sender, long seed, String dimm, Consumer<World> onDone) throws IrisException { public void open(VolmitSender sender, long seed, String dimm, Consumer<World> onDone) throws IrisException {
if (isProjectOpen()) { if(isProjectOpen()) {
close(); close();
} }
@ -354,7 +354,7 @@ public class StudioSVC implements IrisService {
} }
public void close() { public void close() {
if (isProjectOpen()) { if(isProjectOpen()) {
Iris.debug("Closing Active Project"); Iris.debug("Closing Active Project");
activeProject.close(); activeProject.close();
activeProject = null; activeProject = null;
@ -369,14 +369,14 @@ public class StudioSVC implements IrisService {
File importPack = getWorkspaceFolder(existingPack); File importPack = getWorkspaceFolder(existingPack);
File newPack = getWorkspaceFolder(newName); File newPack = getWorkspaceFolder(newName);
if (importPack.listFiles().length == 0) { if(importPack.listFiles().length == 0) {
Iris.warn("Couldn't find the pack to create a new dimension from."); Iris.warn("Couldn't find the pack to create a new dimension from.");
return; return;
} }
try { try {
FileUtils.copyDirectory(importPack, newPack, pathname -> !pathname.getAbsolutePath().contains(".git"), false); FileUtils.copyDirectory(importPack, newPack, pathname -> !pathname.getAbsolutePath().contains(".git"), false);
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -387,7 +387,7 @@ public class StudioSVC implements IrisService {
try { try {
FileUtils.copyFile(dimFile, newDimFile); FileUtils.copyFile(dimFile, newDimFile);
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -397,11 +397,11 @@ public class StudioSVC implements IrisService {
try { try {
JSONObject json = new JSONObject(IO.readAll(newDimFile)); JSONObject json = new JSONObject(IO.readAll(newDimFile));
if (json.has("name")) { if(json.has("name")) {
json.put("name", Form.capitalizeWords(newName.replaceAll("\\Q-\\E", " "))); json.put("name", Form.capitalizeWords(newName.replaceAll("\\Q-\\E", " ")));
IO.writeAll(newDimFile, json.toString(4)); IO.writeAll(newDimFile, json.toString(4));
} }
} catch (JSONException | IOException e) { } catch(JSONException | IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -410,7 +410,7 @@ public class StudioSVC implements IrisService {
IrisProject p = new IrisProject(getWorkspaceFolder(newName)); IrisProject p = new IrisProject(getWorkspaceFolder(newName));
JSONObject ws = p.createCodeWorkspaceConfig(); JSONObject ws = p.createCodeWorkspaceConfig();
IO.writeAll(getWorkspaceFile(newName, newName + ".code-workspace"), ws.toString(0)); IO.writeAll(getWorkspaceFile(newName, newName + ".code-workspace"), ws.toString(0));
} catch (JSONException | IOException e) { } catch(JSONException | IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -420,29 +420,29 @@ public class StudioSVC implements IrisService {
boolean shouldDelete = false; boolean shouldDelete = false;
File importPack = getWorkspaceFolder(downloadable); File importPack = getWorkspaceFolder(downloadable);
if (importPack.listFiles().length == 0) { if(importPack.listFiles().length == 0) {
downloadSearch(sender, downloadable, false); downloadSearch(sender, downloadable, false);
if (importPack.listFiles().length > 0) { if(importPack.listFiles().length > 0) {
shouldDelete = true; shouldDelete = true;
} }
} }
if (importPack.listFiles().length == 0) { if(importPack.listFiles().length == 0) {
sender.sendMessage("Couldn't find the pack to create a new dimension from."); sender.sendMessage("Couldn't find the pack to create a new dimension from.");
return; return;
} }
File importDimensionFile = new File(importPack, "dimensions/" + downloadable + ".json"); File importDimensionFile = new File(importPack, "dimensions/" + downloadable + ".json");
if (!importDimensionFile.exists()) { if(!importDimensionFile.exists()) {
sender.sendMessage("Missing Imported Dimension File"); sender.sendMessage("Missing Imported Dimension File");
return; return;
} }
sender.sendMessage("Importing " + downloadable + " into new Project " + s); sender.sendMessage("Importing " + downloadable + " into new Project " + s);
createFrom(downloadable, s); createFrom(downloadable, s);
if (shouldDelete) { if(shouldDelete) {
importPack.delete(); importPack.delete();
} }
open(sender, s); open(sender, s);
@ -457,7 +457,7 @@ public class StudioSVC implements IrisService {
} }
public void updateWorkspace() { public void updateWorkspace() {
if (isProjectOpen()) { if(isProjectOpen()) {
activeProject.updateWorkspace(); activeProject.updateWorkspace();
} }
} }

View File

@ -79,22 +79,23 @@ public class TreeSVC implements IrisService {
* <br>4. Check biome, region and dimension for overrides for that sapling type -> Found -> use</br> * <br>4. Check biome, region and dimension for overrides for that sapling type -> Found -> use</br>
* <br>5. Exit if none are found, cancel event if one or more are.</br> * <br>5. Exit if none are found, cancel event if one or more are.</br>
* *
* @param event Checks the given event for sapling overrides * @param event
* Checks the given event for sapling overrides
*/ */
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void on(StructureGrowEvent event) { public void on(StructureGrowEvent event) {
if (block || event.isCancelled()) { if(block || event.isCancelled()) {
return; return;
} }
Iris.debug(this.getClass().getName() + " received a structure grow event"); Iris.debug(this.getClass().getName() + " received a structure grow event");
if (!IrisToolbelt.isIrisWorld(event.getWorld())) { if(!IrisToolbelt.isIrisWorld(event.getWorld())) {
Iris.debug(this.getClass().getName() + " passed grow event off to vanilla since not an Iris world"); Iris.debug(this.getClass().getName() + " passed grow event off to vanilla since not an Iris world");
return; return;
} }
PlatformChunkGenerator worldAccess = IrisToolbelt.access(event.getWorld()); PlatformChunkGenerator worldAccess = IrisToolbelt.access(event.getWorld());
if (worldAccess == null) { if(worldAccess == null) {
Iris.debug(this.getClass().getName() + " passed it off to vanilla because could not get IrisAccess for this world"); Iris.debug(this.getClass().getName() + " passed it off to vanilla because could not get IrisAccess for this world");
Iris.reportError(new NullPointerException(event.getWorld().getName() + " could not be accessed despite being an Iris world")); Iris.reportError(new NullPointerException(event.getWorld().getName() + " could not be accessed despite being an Iris world"));
return; return;
@ -102,7 +103,7 @@ public class TreeSVC implements IrisService {
Engine engine = worldAccess.getEngine(); Engine engine = worldAccess.getEngine();
if (engine == null) { if(engine == null) {
Iris.debug(this.getClass().getName() + " passed it off to vanilla because could not get Engine for this world"); Iris.debug(this.getClass().getName() + " passed it off to vanilla because could not get Engine for this world");
Iris.reportError(new NullPointerException(event.getWorld().getName() + " could not be accessed despite being an Iris world")); Iris.reportError(new NullPointerException(event.getWorld().getName() + " could not be accessed despite being an Iris world"));
return; return;
@ -110,13 +111,13 @@ public class TreeSVC implements IrisService {
IrisDimension dimension = engine.getDimension(); IrisDimension dimension = engine.getDimension();
if (dimension == null) { if(dimension == null) {
Iris.debug(this.getClass().getName() + " passed it off to vanilla because could not get Dimension for this world"); Iris.debug(this.getClass().getName() + " passed it off to vanilla because could not get Dimension for this world");
Iris.reportError(new NullPointerException(event.getWorld().getName() + " could not be accessed despite being an Iris world")); Iris.reportError(new NullPointerException(event.getWorld().getName() + " could not be accessed despite being an Iris world"));
return; return;
} }
if (!dimension.getTreeSettings().isEnabled()) { if(!dimension.getTreeSettings().isEnabled()) {
Iris.debug(this.getClass().getName() + " cancelled because tree overrides are disabled"); Iris.debug(this.getClass().getName() + " cancelled because tree overrides are disabled");
return; return;
} }
@ -128,7 +129,7 @@ public class TreeSVC implements IrisService {
Iris.debug("Sapling plane is: " + saplingPlane.getSizeX() + " by " + saplingPlane.getSizeZ()); Iris.debug("Sapling plane is: " + saplingPlane.getSizeX() + " by " + saplingPlane.getSizeZ());
IrisObjectPlacement placement = getObjectPlacement(worldAccess, event.getLocation(), event.getSpecies(), new IrisTreeSize(1, 1)); IrisObjectPlacement placement = getObjectPlacement(worldAccess, event.getLocation(), event.getSpecies(), new IrisTreeSize(1, 1));
if (placement == null) { if(placement == null) {
Iris.debug(this.getClass().getName() + " had options but did not manage to find objectPlacements for them"); Iris.debug(this.getClass().getName() + " had options but did not manage to find objectPlacements for them");
return; return;
} }
@ -225,11 +226,11 @@ public class TreeSVC implements IrisService {
Bukkit.getServer().getPluginManager().callEvent(iGrow); Bukkit.getServer().getPluginManager().callEvent(iGrow);
block = false; block = false;
if (!iGrow.isCancelled()) { if(!iGrow.isCancelled()) {
for (BlockState block : iGrow.getBlocks()) { for(BlockState block : iGrow.getBlocks()) {
Location l = block.getLocation(); Location l = block.getLocation();
if (dataCache.containsKey(l)) { if(dataCache.containsKey(l)) {
l.getBlock().setBlockData(dataCache.get(l), false); l.getBlock().setBlockData(dataCache.get(l), false);
} }
} }
@ -238,12 +239,17 @@ public class TreeSVC implements IrisService {
} }
/** /**
* Finds a single object placement (which may contain more than one object) for the requirements species, location & size * Finds a single object placement (which may contain more than one object) for the requirements species, location &
* size
* *
* @param worldAccess The world to access (check for biome, region, dimension, etc) * @param worldAccess
* @param location The location of the growth event (For biome/region finding) * The world to access (check for biome, region, dimension, etc)
* @param type The bukkit TreeType to match * @param location
* @param size The size of the sapling area * The location of the growth event (For biome/region finding)
* @param type
* The bukkit TreeType to match
* @param size
* The size of the sapling area
* @return An object placement which contains the matched tree, or null if none were found / it's disabled. * @return An object placement which contains the matched tree, or null if none were found / it's disabled.
*/ */
private IrisObjectPlacement getObjectPlacement(PlatformChunkGenerator worldAccess, Location location, TreeType type, IrisTreeSize size) { private IrisObjectPlacement getObjectPlacement(PlatformChunkGenerator worldAccess, Location location, TreeType type, IrisTreeSize size) {
@ -256,7 +262,7 @@ public class TreeSVC implements IrisService {
placements.addAll(matchObjectPlacements(biome.getObjects(), size, type)); placements.addAll(matchObjectPlacements(biome.getObjects(), size, type));
// Add more or find any in the region // Add more or find any in the region
if (isUseAll || placements.isEmpty()) { if(isUseAll || placements.isEmpty()) {
IrisRegion region = worldAccess.getEngine().getRegion(location.getBlockX(), location.getBlockZ()); IrisRegion region = worldAccess.getEngine().getRegion(location.getBlockX(), location.getBlockZ());
placements.addAll(matchObjectPlacements(region.getObjects(), size, type)); placements.addAll(matchObjectPlacements(region.getObjects(), size, type));
} }
@ -268,17 +274,20 @@ public class TreeSVC implements IrisService {
/** /**
* Filters out mismatches and returns matches * Filters out mismatches and returns matches
* *
* @param objects The object placements to check * @param objects
* @param size The size of the sapling area to filter with * The object placements to check
* @param type The type of the tree to filter with * @param size
* The size of the sapling area to filter with
* @param type
* The type of the tree to filter with
* @return A list of objectPlacements that matched. May be empty. * @return A list of objectPlacements that matched. May be empty.
*/ */
private KList<IrisObjectPlacement> matchObjectPlacements(KList<IrisObjectPlacement> objects, IrisTreeSize size, TreeType type) { private KList<IrisObjectPlacement> matchObjectPlacements(KList<IrisObjectPlacement> objects, IrisTreeSize size, TreeType type) {
KList<IrisObjectPlacement> p = new KList<>(); KList<IrisObjectPlacement> p = new KList<>();
for (IrisObjectPlacement i : objects) { for(IrisObjectPlacement i : objects) {
if (i.matches(size, type)) { if(i.matches(size, type)) {
p.add(i); p.add(i);
} }
} }
@ -289,9 +298,12 @@ public class TreeSVC implements IrisService {
/** /**
* Get the Cuboid of sapling sizes at a location & blockData predicate * Get the Cuboid of sapling sizes at a location & blockData predicate
* *
* @param at this location * @param at
* @param valid with this blockData predicate * this location
* @param world the world to check in * @param valid
* with this blockData predicate
* @param world
* the world to check in
* @return A cuboid containing only saplings * @return A cuboid containing only saplings
*/ */
public Cuboid getSaplings(Location at, Predicate<BlockData> valid, World world) { public Cuboid getSaplings(Location at, Predicate<BlockData> valid, World world) {
@ -301,7 +313,7 @@ public class TreeSVC implements IrisService {
BlockPosition b = new BlockPosition(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE); BlockPosition b = new BlockPosition(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
// Maximise the block position in x and z to get max cuboid bounds // Maximise the block position in x and z to get max cuboid bounds
for (BlockPosition blockPosition : blockPositions) { for(BlockPosition blockPosition : blockPositions) {
a.max(blockPosition); a.max(blockPosition);
b.min(blockPosition); b.min(blockPosition);
} }
@ -314,12 +326,12 @@ public class TreeSVC implements IrisService {
boolean cuboidIsValid = true; boolean cuboidIsValid = true;
// Loop while the cuboid is larger than 2 // Loop while the cuboid is larger than 2
while (Math.min(cuboid.getSizeX(), cuboid.getSizeZ()) > 0) { while(Math.min(cuboid.getSizeX(), cuboid.getSizeZ()) > 0) {
checking: checking:
for (int i = cuboid.getLowerX(); i < cuboid.getUpperX(); i++) { for(int i = cuboid.getLowerX(); i < cuboid.getUpperX(); i++) {
for (int j = cuboid.getLowerY(); j < cuboid.getUpperY(); j++) { for(int j = cuboid.getLowerY(); j < cuboid.getUpperY(); j++) {
for (int k = cuboid.getLowerZ(); k < cuboid.getUpperZ(); k++) { for(int k = cuboid.getLowerZ(); k < cuboid.getUpperZ(); k++) {
if (!blockPositions.contains(new BlockPosition(i, j, k))) { if(!blockPositions.contains(new BlockPosition(i, j, k))) {
cuboidIsValid = false; cuboidIsValid = false;
break checking; break checking;
} }
@ -328,7 +340,7 @@ public class TreeSVC implements IrisService {
} }
// Return this cuboid if it's valid // Return this cuboid if it's valid
if (cuboidIsValid) { if(cuboidIsValid) {
return cuboid; return cuboid;
} }
@ -343,14 +355,18 @@ public class TreeSVC implements IrisService {
/** /**
* Grows the blockPosition list by means of checking neighbours in * Grows the blockPosition list by means of checking neighbours in
* *
* @param world the world to check in * @param world
* @param center the location of this position * the world to check in
* @param valid validation on blockData to check block with * @param center
* @param l list of block positions to add new neighbors too * the location of this position
* @param valid
* validation on blockData to check block with
* @param l
* list of block positions to add new neighbors too
*/ */
private void grow(World world, BlockPosition center, Predicate<BlockData> valid, KList<BlockPosition> l) { private void grow(World world, BlockPosition center, Predicate<BlockData> valid, KList<BlockPosition> l) {
// Make sure size is less than 50, the block to check isn't already in, and make sure the blockData still matches // Make sure size is less than 50, the block to check isn't already in, and make sure the blockData still matches
if (l.size() <= 50 && !l.contains(center) && valid.test(center.toBlock(world).getBlockData())) { if(l.size() <= 50 && !l.contains(center) && valid.test(center.toBlock(world).getBlockData())) {
l.add(center); l.add(center);
grow(world, center.add(1, 0, 0), valid, l); grow(world, center.add(1, 0, 0), valid, l);
grow(world, center.add(-1, 0, 0), valid, l); grow(world, center.add(-1, 0, 0), valid, l);

View File

@ -43,25 +43,25 @@ public class VillageSVC implements IrisService {
*/ */
@EventHandler @EventHandler
public void on(VillagerAcquireTradeEvent event) { public void on(VillagerAcquireTradeEvent event) {
if (!IrisToolbelt.isIrisWorld((event.getEntity().getWorld()))) { if(!IrisToolbelt.isIrisWorld((event.getEntity().getWorld()))) {
return; return;
} }
// Iris.info("Trade event: type " + event.getRecipe().getResult().getType() + " / meta " + event.getRecipe().getResult().getItemMeta() + " / data " + event.getRecipe().getResult().getData()); // Iris.info("Trade event: type " + event.getRecipe().getResult().getType() + " / meta " + event.getRecipe().getResult().getItemMeta() + " / data " + event.getRecipe().getResult().getData());
if (!event.getRecipe().getResult().getType().equals(Material.FILLED_MAP)) { if(!event.getRecipe().getResult().getType().equals(Material.FILLED_MAP)) {
return; return;
} }
IrisVillagerOverride override = IrisToolbelt.access(event.getEntity().getWorld()).getEngine() IrisVillagerOverride override = IrisToolbelt.access(event.getEntity().getWorld()).getEngine()
.getDimension().getPatchCartographers(); .getDimension().getPatchCartographers();
if (override.isDisableTrade()) { if(override.isDisableTrade()) {
event.setCancelled(true); event.setCancelled(true);
Iris.debug("Cancelled cartographer trade @ " + event.getEntity().getLocation()); Iris.debug("Cancelled cartographer trade @ " + event.getEntity().getLocation());
return; return;
} }
if (override.getValidItems() == null) { if(override.getValidItems() == null) {
event.setCancelled(true); event.setCancelled(true);
Iris.debug("Cancelled cartographer trade because no override items are valid @ " + event.getEntity().getLocation()); Iris.debug("Cancelled cartographer trade because no override items are valid @ " + event.getEntity().getLocation());
return; return;

View File

@ -64,11 +64,12 @@ public class WandSVC implements IrisService {
/** /**
* Creates an Iris Object from the 2 coordinates selected with a wand * Creates an Iris Object from the 2 coordinates selected with a wand
* *
* @param wand The wand itemstack * @param wand
* The wand itemstack
* @return The new object * @return The new object
*/ */
public static IrisObject createSchematic(ItemStack wand) { public static IrisObject createSchematic(ItemStack wand) {
if (!isWand(wand)) { if(!isWand(wand)) {
return null; return null;
} }
@ -76,8 +77,8 @@ public class WandSVC implements IrisService {
Location[] f = getCuboid(wand); Location[] f = getCuboid(wand);
Cuboid c = new Cuboid(f[0], f[1]); Cuboid c = new Cuboid(f[0], f[1]);
IrisObject s = new IrisObject(c.getSizeX(), c.getSizeY(), c.getSizeZ()); IrisObject s = new IrisObject(c.getSizeX(), c.getSizeY(), c.getSizeZ());
for (Block b : c) { for(Block b : c) {
if (b.getType().equals(Material.AIR)) { if(b.getType().equals(Material.AIR)) {
continue; continue;
} }
@ -86,7 +87,7 @@ public class WandSVC implements IrisService {
} }
return s; return s;
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -97,11 +98,12 @@ public class WandSVC implements IrisService {
/** /**
* Creates an Iris Object from the 2 coordinates selected with a wand * Creates an Iris Object from the 2 coordinates selected with a wand
* *
* @param wand The wand itemstack * @param wand
* The wand itemstack
* @return The new object * @return The new object
*/ */
public static Matter createMatterSchem(Player p, ItemStack wand) { public static Matter createMatterSchem(Player p, ItemStack wand) {
if (!isWand(wand)) { if(!isWand(wand)) {
return null; return null;
} }
@ -109,7 +111,7 @@ public class WandSVC implements IrisService {
Location[] f = getCuboid(wand); Location[] f = getCuboid(wand);
return WorldMatter.createMatter(p.getName(), f[0], f[1]); return WorldMatter.createMatter(p.getName(), f[0], f[1]);
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
Iris.reportError(e); Iris.reportError(e);
} }
@ -120,7 +122,8 @@ public class WandSVC implements IrisService {
/** /**
* Converts a user friendly location string to an actual Location * Converts a user friendly location string to an actual Location
* *
* @param s The string * @param s
* The string
* @return The location * @return The location
*/ */
public static Location stringToLocation(String s) { public static Location stringToLocation(String s) {
@ -128,7 +131,7 @@ public class WandSVC implements IrisService {
String[] f = s.split("\\Q in \\E"); String[] f = s.split("\\Q in \\E");
String[] g = f[0].split("\\Q,\\E"); String[] g = f[0].split("\\Q,\\E");
return new Location(Bukkit.getWorld(f[1]), Integer.parseInt(g[0]), Integer.parseInt(g[1]), Integer.parseInt(g[2])); return new Location(Bukkit.getWorld(f[1]), Integer.parseInt(g[0]), Integer.parseInt(g[1]), Integer.parseInt(g[2]));
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
return null; return null;
} }
@ -137,11 +140,12 @@ public class WandSVC implements IrisService {
/** /**
* Get a user friendly string of a location * Get a user friendly string of a location
* *
* @param loc The location * @param loc
* The location
* @return The string * @return The string
*/ */
public static String locationToString(Location loc) { public static String locationToString(Location loc) {
if (loc == null) { if(loc == null) {
return "<#>"; return "<#>";
} }
@ -178,7 +182,8 @@ public class WandSVC implements IrisService {
/** /**
* Finds an existing wand in a users inventory * Finds an existing wand in a users inventory
* *
* @param inventory The inventory to search * @param inventory
* The inventory to search
* @return The slot number the wand is in. Or -1 if none are found * @return The slot number the wand is in. Or -1 if none are found
*/ */
public static int findWand(Inventory inventory) { public static int findWand(Inventory inventory) {
@ -187,14 +192,14 @@ public class WandSVC implements IrisService {
meta.setLore(new ArrayList<>()); //We are resetting the lore as the lore differs between wands meta.setLore(new ArrayList<>()); //We are resetting the lore as the lore differs between wands
wand.setItemMeta(meta); wand.setItemMeta(meta);
for (int s = 0; s < inventory.getSize(); s++) { for(int s = 0; s < inventory.getSize(); s++) {
ItemStack stack = inventory.getItem(s); ItemStack stack = inventory.getItem(s);
if (stack == null) continue; if(stack == null) continue;
meta = stack.getItemMeta(); meta = stack.getItemMeta();
meta.setLore(new ArrayList<>()); //Reset the lore on this too so we can compare them meta.setLore(new ArrayList<>()); //Reset the lore on this too so we can compare them
stack.setItemMeta(meta); //We dont need to clone the item as items from .get are cloned stack.setItemMeta(meta); //We dont need to clone the item as items from .get are cloned
if (wand.isSimilar(stack)) return s; //If the name, material and NBT is the same if(wand.isSimilar(stack)) return s; //If the name, material and NBT is the same
} }
return -1; return -1;
} }
@ -202,8 +207,10 @@ public class WandSVC implements IrisService {
/** /**
* Creates an Iris wand. The locations should be the currently selected locations, or null * Creates an Iris wand. The locations should be the currently selected locations, or null
* *
* @param a Location A * @param a
* @param b Location B * Location A
* @param b
* Location B
* @return A new wand * @return A new wand
*/ */
public static ItemStack createWand(Location a, Location b) { public static ItemStack createWand(Location a, Location b) {
@ -222,18 +229,20 @@ public class WandSVC implements IrisService {
/** /**
* Get a pair of locations that are selected in an Iris wand * Get a pair of locations that are selected in an Iris wand
* *
* @param is The wand item * @param is
* The wand item
* @return An array with the 2 locations * @return An array with the 2 locations
*/ */
public static Location[] getCuboid(ItemStack is) { public static Location[] getCuboid(ItemStack is) {
ItemMeta im = is.getItemMeta(); ItemMeta im = is.getItemMeta();
return new Location[]{stringToLocation(im.getLore().get(0)), stringToLocation(im.getLore().get(1))}; return new Location[] {stringToLocation(im.getLore().get(0)), stringToLocation(im.getLore().get(1))};
} }
/** /**
* Is a player holding an Iris wand * Is a player holding an Iris wand
* *
* @param p The player * @param p
* The player
* @return True if they are * @return True if they are
*/ */
public static boolean isHoldingWand(Player p) { public static boolean isHoldingWand(Player p) {
@ -244,12 +253,13 @@ public class WandSVC implements IrisService {
/** /**
* Is the itemstack passed an Iris wand * Is the itemstack passed an Iris wand
* *
* @param is The itemstack * @param is
* The itemstack
* @return True if it is * @return True if it is
*/ */
public static boolean isWand(ItemStack is) { public static boolean isWand(ItemStack is) {
ItemStack wand = createWand(); ItemStack wand = createWand();
if (is.getItemMeta() == null) return false; if(is.getItemMeta() == null) return false;
return is.getType().equals(wand.getType()) && return is.getType().equals(wand.getType()) &&
is.getItemMeta().getDisplayName().equals(wand.getItemMeta().getDisplayName()) && is.getItemMeta().getDisplayName().equals(wand.getItemMeta().getDisplayName()) &&
is.getItemMeta().getEnchants().equals(wand.getItemMeta().getEnchants()) && is.getItemMeta().getEnchants().equals(wand.getItemMeta().getEnchants()) &&
@ -262,7 +272,7 @@ public class WandSVC implements IrisService {
dust = createDust(); dust = createDust();
J.ar(() -> { J.ar(() -> {
for (Player i : Bukkit.getOnlinePlayers()) { for(Player i : Bukkit.getOnlinePlayers()) {
tick(i); tick(i);
} }
}, 0); }, 0);
@ -276,14 +286,14 @@ public class WandSVC implements IrisService {
public void tick(Player p) { public void tick(Player p) {
try { try {
try { try {
if (isWand(p.getInventory().getItemInMainHand())) { if(isWand(p.getInventory().getItemInMainHand())) {
Location[] d = getCuboid(p.getInventory().getItemInMainHand()); Location[] d = getCuboid(p.getInventory().getItemInMainHand());
new WandSelection(new Cuboid(d[0], d[1]), p).draw(); new WandSelection(new Cuboid(d[0], d[1]), p).draw();
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -291,18 +301,22 @@ public class WandSVC implements IrisService {
/** /**
* Draw the outline of a selected region * Draw the outline of a selected region
* *
* @param d The cuboid * @param d
* @param p The player to show it to * The cuboid
* @param p
* The player to show it to
*/ */
public void draw(Cuboid d, Player p) { public void draw(Cuboid d, Player p) {
draw(new Location[]{d.getLowerNE(), d.getUpperSW()}, p); draw(new Location[] {d.getLowerNE(), d.getUpperSW()}, p);
} }
/** /**
* Draw the outline of a selected region * Draw the outline of a selected region
* *
* @param d A pair of locations * @param d
* @param p The player to show them to * A pair of locations
* @param p
* The player to show them to
*/ */
public void draw(Location[] d, Player p) { public void draw(Location[] d, Player p) {
Vector gx = Vector.getRandom().subtract(Vector.getRandom()).normalize().clone().multiply(0.65); Vector gx = Vector.getRandom().subtract(Vector.getRandom()).normalize().clone().multiply(0.65);
@ -310,11 +324,11 @@ public class WandSVC implements IrisService {
Vector gxx = Vector.getRandom().subtract(Vector.getRandom()).normalize().clone().multiply(0.65); Vector gxx = Vector.getRandom().subtract(Vector.getRandom()).normalize().clone().multiply(0.65);
d[1].getWorld().spawnParticle(Particle.CRIT, d[1], 1, 0.5 + gxx.getX(), 0.5 + gxx.getY(), 0.5 + gxx.getZ(), 0, null, false); d[1].getWorld().spawnParticle(Particle.CRIT, d[1], 1, 0.5 + gxx.getX(), 0.5 + gxx.getY(), 0.5 + gxx.getZ(), 0, null, false);
if (!d[0].getWorld().equals(d[1].getWorld())) { if(!d[0].getWorld().equals(d[1].getWorld())) {
return; return;
} }
if (d[0].distanceSquared(d[1]) > 64 * 64) { if(d[0].distanceSquared(d[1]) > 64 * 64) {
return; return;
} }
@ -325,38 +339,38 @@ public class WandSVC implements IrisService {
int maxy = Math.max(d[0].getBlockY(), d[1].getBlockY()); int maxy = Math.max(d[0].getBlockY(), d[1].getBlockY());
int maxz = Math.max(d[0].getBlockZ(), d[1].getBlockZ()); int maxz = Math.max(d[0].getBlockZ(), d[1].getBlockZ());
for (double j = minx - 1; j < maxx + 1; j += 0.25) { for(double j = minx - 1; j < maxx + 1; j += 0.25) {
for (double k = miny - 1; k < maxy + 1; k += 0.25) { for(double k = miny - 1; k < maxy + 1; k += 0.25) {
for (double l = minz - 1; l < maxz + 1; l += 0.25) { for(double l = minz - 1; l < maxz + 1; l += 0.25) {
if (M.r(0.2)) { if(M.r(0.2)) {
boolean jj = j == minx || j == maxx; boolean jj = j == minx || j == maxx;
boolean kk = k == miny || k == maxy; boolean kk = k == miny || k == maxy;
boolean ll = l == minz || l == maxz; boolean ll = l == minz || l == maxz;
if ((jj && kk) || (jj && ll) || (ll && kk)) { if((jj && kk) || (jj && ll) || (ll && kk)) {
Vector push = new Vector(0, 0, 0); Vector push = new Vector(0, 0, 0);
if (j == minx) { if(j == minx) {
push.add(new Vector(-0.55, 0, 0)); push.add(new Vector(-0.55, 0, 0));
} }
if (k == miny) { if(k == miny) {
push.add(new Vector(0, -0.55, 0)); push.add(new Vector(0, -0.55, 0));
} }
if (l == minz) { if(l == minz) {
push.add(new Vector(0, 0, -0.55)); push.add(new Vector(0, 0, -0.55));
} }
if (j == maxx) { if(j == maxx) {
push.add(new Vector(0.55, 0, 0)); push.add(new Vector(0.55, 0, 0));
} }
if (k == maxy) { if(k == maxy) {
push.add(new Vector(0, 0.55, 0)); push.add(new Vector(0, 0.55, 0));
} }
if (l == maxz) { if(l == maxz) {
push.add(new Vector(0, 0, 0.55)); push.add(new Vector(0, 0, 0.55));
} }
@ -376,13 +390,13 @@ public class WandSVC implements IrisService {
@EventHandler @EventHandler
public void on(PlayerInteractEvent e) { public void on(PlayerInteractEvent e) {
try { try {
if (isHoldingWand(e.getPlayer())) { if(isHoldingWand(e.getPlayer())) {
if (e.getAction().equals(Action.LEFT_CLICK_BLOCK)) { if(e.getAction().equals(Action.LEFT_CLICK_BLOCK)) {
e.setCancelled(true); e.setCancelled(true);
e.getPlayer().getInventory().setItemInMainHand(update(true, Objects.requireNonNull(e.getClickedBlock()).getLocation(), e.getPlayer().getInventory().getItemInMainHand())); e.getPlayer().getInventory().setItemInMainHand(update(true, Objects.requireNonNull(e.getClickedBlock()).getLocation(), e.getPlayer().getInventory().getItemInMainHand()));
e.getPlayer().playSound(e.getClickedBlock().getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1f, 0.67f); e.getPlayer().playSound(e.getClickedBlock().getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1f, 0.67f);
e.getPlayer().updateInventory(); e.getPlayer().updateInventory();
} else if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { } else if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
e.setCancelled(true); e.setCancelled(true);
e.getPlayer().getInventory().setItemInMainHand(update(false, Objects.requireNonNull(e.getClickedBlock()).getLocation(), e.getPlayer().getInventory().getItemInMainHand())); e.getPlayer().getInventory().setItemInMainHand(update(false, Objects.requireNonNull(e.getClickedBlock()).getLocation(), e.getPlayer().getInventory().getItemInMainHand()));
e.getPlayer().playSound(e.getClickedBlock().getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1f, 1.17f); e.getPlayer().playSound(e.getClickedBlock().getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1f, 1.17f);
@ -390,15 +404,15 @@ public class WandSVC implements IrisService {
} }
} }
if (isHoldingDust(e.getPlayer())) { if(isHoldingDust(e.getPlayer())) {
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
e.setCancelled(true); e.setCancelled(true);
e.getPlayer().playSound(Objects.requireNonNull(e.getClickedBlock()).getLocation(), Sound.ENTITY_ENDER_EYE_DEATH, 2f, 1.97f); e.getPlayer().playSound(Objects.requireNonNull(e.getClickedBlock()).getLocation(), Sound.ENTITY_ENDER_EYE_DEATH, 2f, 1.97f);
DustRevealer.spawn(e.getClickedBlock(), new VolmitSender(e.getPlayer(), Iris.instance.getTag())); DustRevealer.spawn(e.getClickedBlock(), new VolmitSender(e.getPlayer(), Iris.instance.getTag()));
} }
} }
} catch (Throwable xx) { } catch(Throwable xx) {
Iris.reportError(xx); Iris.reportError(xx);
} }
} }
@ -406,7 +420,8 @@ public class WandSVC implements IrisService {
/** /**
* Is the player holding Dust? * Is the player holding Dust?
* *
* @param p The player * @param p
* The player
* @return True if they are * @return True if they are
*/ */
public boolean isHoldingDust(Player p) { public boolean isHoldingDust(Player p) {
@ -417,7 +432,8 @@ public class WandSVC implements IrisService {
/** /**
* Is the itemstack passed Iris dust? * Is the itemstack passed Iris dust?
* *
* @param is The itemstack * @param is
* The itemstack
* @return True if it is * @return True if it is
*/ */
public boolean isDust(ItemStack is) { public boolean isDust(ItemStack is) {
@ -427,20 +443,23 @@ public class WandSVC implements IrisService {
/** /**
* Update the location on an Iris wand * Update the location on an Iris wand
* *
* @param left True for first location, false for second * @param left
* @param a The location * True for first location, false for second
* @param item The wand * @param a
* The location
* @param item
* The wand
* @return The updated wand * @return The updated wand
*/ */
public ItemStack update(boolean left, Location a, ItemStack item) { public ItemStack update(boolean left, Location a, ItemStack item) {
if (!isWand(item)) { if(!isWand(item)) {
return item; return item;
} }
Location[] f = getCuboid(item); Location[] f = getCuboid(item);
Location other = left ? f[1] : f[0]; Location other = left ? f[1] : f[0];
if (other != null && !other.getWorld().getName().equals(a.getWorld().getName())) { if(other != null && !other.getWorld().getName().equals(a.getWorld().getName())) {
other = null; other = null;
} }

View File

@ -88,20 +88,21 @@ public class IrisCreator {
* Create the IrisAccess (contains the world) * Create the IrisAccess (contains the world)
* *
* @return the IrisAccess * @return the IrisAccess
* @throws IrisException shit happens * @throws IrisException
* shit happens
*/ */
public World create() throws IrisException { public World create() throws IrisException {
if (Bukkit.isPrimaryThread()) { if(Bukkit.isPrimaryThread()) {
throw new IrisException("You cannot invoke create() on the main thread."); throw new IrisException("You cannot invoke create() on the main thread.");
} }
IrisDimension d = IrisToolbelt.getDimension(dimension()); IrisDimension d = IrisToolbelt.getDimension(dimension());
if (d == null) { if(d == null) {
throw new IrisException("Dimension cannot be found null for id " + dimension()); throw new IrisException("Dimension cannot be found null for id " + dimension());
} }
if (!studio()) { if(!studio()) {
Iris.service(StudioSVC.class).installIntoWorld(sender, d.getLoadKey(), new File(name())); Iris.service(StudioSVC.class).installIntoWorld(sender, d.getLoadKey(), new File(name()));
} }
@ -126,14 +127,14 @@ public class IrisCreator {
Supplier<Integer> g = () -> { Supplier<Integer> g = () -> {
try { try {
return finalAccess1.getEngine().getGenerated(); return finalAccess1.getEngine().getGenerated();
} catch (Throwable e) { } catch(Throwable e) {
return 0; return 0;
} }
}; };
while (g.get() < req) { while(g.get() < req) {
double v = (double) g.get() / (double) req; double v = (double) g.get() / (double) req;
if (sender.isPlayer()) { if(sender.isPlayer()) {
sender.sendProgress(v, "Generating"); sender.sendProgress(v, "Generating");
J.sleep(16); J.sleep(16);
} else { } else {
@ -148,27 +149,27 @@ public class IrisCreator {
J.sfut(() -> { J.sfut(() -> {
world.set(wc.createWorld()); world.set(wc.createWorld());
}).get(); }).get();
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
if (access == null) { if(access == null) {
throw new IrisException("Access is null. Something bad happened."); throw new IrisException("Access is null. Something bad happened.");
} }
done.set(true); done.set(true);
if (sender.isPlayer()) { if(sender.isPlayer()) {
J.s(() -> { J.s(() -> {
sender.player().teleport(new Location(world.get(), 0, world.get().getHighestBlockYAt(0, 0), 0)); sender.player().teleport(new Location(world.get(), 0, world.get().getHighestBlockYAt(0, 0), 0));
}); });
} }
if (studio) { if(studio) {
J.s(() -> { J.s(() -> {
Iris.linkMultiverseCore.removeFromConfig(world.get()); Iris.linkMultiverseCore.removeFromConfig(world.get());
if (IrisSettings.get().getStudio().isDisableTimeAndWeather()) { if(IrisSettings.get().getStudio().isDisableTimeAndWeather()) {
world.get().setGameRule(GameRule.DO_WEATHER_CYCLE, false); world.get().setGameRule(GameRule.DO_WEATHER_CYCLE, false);
world.get().setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false); world.get().setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
world.get().setTime(6000); world.get().setTime(6000);
@ -176,7 +177,7 @@ public class IrisCreator {
}); });
} }
if (pregen != null) { if(pregen != null) {
CompletableFuture<Boolean> ff = new CompletableFuture<>(); CompletableFuture<Boolean> ff = new CompletableFuture<>();
IrisToolbelt.pregenerate(pregen, access) IrisToolbelt.pregenerate(pregen, access)
@ -187,8 +188,8 @@ public class IrisCreator {
AtomicBoolean dx = new AtomicBoolean(false); AtomicBoolean dx = new AtomicBoolean(false);
J.a(() -> { J.a(() -> {
while (!dx.get()) { while(!dx.get()) {
if (sender.isPlayer()) { if(sender.isPlayer()) {
sender.sendProgress(pp.get(), "Pregenerating"); sender.sendProgress(pp.get(), "Pregenerating");
J.sleep(16); J.sleep(16);
} else { } else {
@ -200,7 +201,7 @@ public class IrisCreator {
ff.get(); ff.get();
dx.set(true); dx.set(true);
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -51,17 +51,18 @@ public class IrisToolbelt {
* - GithubUsername/repository * - GithubUsername/repository
* - GithubUsername/repository/branch * - GithubUsername/repository/branch
* *
* @param dimension the dimension id such as overworld or flat * @param dimension
* the dimension id such as overworld or flat
* @return the IrisDimension or null * @return the IrisDimension or null
*/ */
public static IrisDimension getDimension(String dimension) { public static IrisDimension getDimension(String dimension) {
File pack = Iris.instance.getDataFolder("packs", dimension); File pack = Iris.instance.getDataFolder("packs", dimension);
if (!pack.exists()) { if(!pack.exists()) {
Iris.service(StudioSVC.class).downloadSearch(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), dimension, false, false); Iris.service(StudioSVC.class).downloadSearch(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), dimension, false, false);
} }
if (!pack.exists()) { if(!pack.exists()) {
return null; return null;
} }
@ -80,15 +81,16 @@ public class IrisToolbelt {
/** /**
* Checks if the given world is an Iris World (same as access(world) != null) * Checks if the given world is an Iris World (same as access(world) != null)
* *
* @param world the world * @param world
* the world
* @return true if it is an Iris Access world * @return true if it is an Iris Access world
*/ */
public static boolean isIrisWorld(World world) { public static boolean isIrisWorld(World world) {
if (world == null) { if(world == null) {
return false; return false;
} }
if (world.getGenerator() instanceof PlatformChunkGenerator f) { if(world.getGenerator() instanceof PlatformChunkGenerator f) {
f.touch(world); f.touch(world);
return true; return true;
} }
@ -103,11 +105,12 @@ public class IrisToolbelt {
/** /**
* Get the Iris generator for the given world * Get the Iris generator for the given world
* *
* @param world the given world * @param world
* the given world
* @return the IrisAccess or null if it's not an Iris World * @return the IrisAccess or null if it's not an Iris World
*/ */
public static PlatformChunkGenerator access(World world) { public static PlatformChunkGenerator access(World world) {
if (isIrisWorld(world)) { if(isIrisWorld(world)) {
return ((PlatformChunkGenerator) world.getGenerator()); return ((PlatformChunkGenerator) world.getGenerator());
} }
@ -117,8 +120,10 @@ public class IrisToolbelt {
/** /**
* Start a pregenerator task * Start a pregenerator task
* *
* @param task the scheduled task * @param task
* @param method the method to execute the task * the scheduled task
* @param method
* the method to execute the task
* @return the pregenerator job (already started) * @return the pregenerator job (already started)
*/ */
public static PregeneratorJob pregenerate(PregenTask task, PregeneratorMethod method, Engine engine) { public static PregeneratorJob pregenerate(PregenTask task, PregeneratorMethod method, Engine engine) {
@ -129,12 +134,14 @@ public class IrisToolbelt {
* Start a pregenerator task. If the supplied generator is headless, headless mode is used, * Start a pregenerator task. If the supplied generator is headless, headless mode is used,
* otherwise Hybrid mode is used. * otherwise Hybrid mode is used.
* *
* @param task the scheduled task * @param task
* @param gen the Iris Generator * the scheduled task
* @param gen
* the Iris Generator
* @return the pregenerator job (already started) * @return the pregenerator job (already started)
*/ */
public static PregeneratorJob pregenerate(PregenTask task, PlatformChunkGenerator gen) { public static PregeneratorJob pregenerate(PregenTask task, PlatformChunkGenerator gen) {
if (gen.isHeadless()) { if(gen.isHeadless()) {
return pregenerate(task, new HeadlessPregenMethod(((HeadlessGenerator) gen).getWorld(), (HeadlessGenerator) gen), gen.getEngine()); return pregenerate(task, new HeadlessPregenMethod(((HeadlessGenerator) gen).getWorld(), (HeadlessGenerator) gen), gen.getEngine());
} }
@ -146,12 +153,14 @@ public class IrisToolbelt {
* Start a pregenerator task. If the supplied generator is headless, headless mode is used, * Start a pregenerator task. If the supplied generator is headless, headless mode is used,
* otherwise Hybrid mode is used. * otherwise Hybrid mode is used.
* *
* @param task the scheduled task * @param task
* @param world the World * the scheduled task
* @param world
* the World
* @return the pregenerator job (already started) * @return the pregenerator job (already started)
*/ */
public static PregeneratorJob pregenerate(PregenTask task, World world) { public static PregeneratorJob pregenerate(PregenTask task, World world) {
if (isIrisWorld(world)) { if(isIrisWorld(world)) {
return pregenerate(task, access(world)); return pregenerate(task, access(world));
} }
@ -162,12 +171,13 @@ public class IrisToolbelt {
* Evacuate all players from the world into literally any other world. * Evacuate all players from the world into literally any other world.
* If there are no other worlds, kick them! Not the best but what's mine is mine sometimes... * If there are no other worlds, kick them! Not the best but what's mine is mine sometimes...
* *
* @param world the world to evac * @param world
* the world to evac
*/ */
public static boolean evacuate(World world) { public static boolean evacuate(World world) {
for (World i : Bukkit.getWorlds()) { for(World i : Bukkit.getWorlds()) {
if (!i.getName().equals(world.getName())) { if(!i.getName().equals(world.getName())) {
for (Player j : world.getPlayers()) { for(Player j : world.getPlayers()) {
new VolmitSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world."); new VolmitSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world.");
j.teleport(i.getSpawnLocation()); j.teleport(i.getSpawnLocation());
} }
@ -182,14 +192,16 @@ public class IrisToolbelt {
/** /**
* Evacuate all players from the world * Evacuate all players from the world
* *
* @param world the world to leave * @param world
* @param m the message * the world to leave
* @param m
* the message
* @return true if it was evacuated. * @return true if it was evacuated.
*/ */
public static boolean evacuate(World world, String m) { public static boolean evacuate(World world, String m) {
for (World i : Bukkit.getWorlds()) { for(World i : Bukkit.getWorlds()) {
if (!i.getName().equals(world.getName())) { if(!i.getName().equals(world.getName())) {
for (Player j : world.getPlayers()) { for(Player j : world.getPlayers()) {
new VolmitSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world. " + m); new VolmitSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world. " + m);
j.teleport(i.getSpawnLocation()); j.teleport(i.getSpawnLocation());
} }

View File

@ -33,8 +33,6 @@ public class IrisWorldCreator {
private boolean studio = false; private boolean studio = false;
private String dimensionName = null; private String dimensionName = null;
private long seed = 1337; private long seed = 1337;
private int maxHeight = 256;
private int minHeight = 0;
public IrisWorldCreator() { public IrisWorldCreator() {
@ -45,18 +43,6 @@ public class IrisWorldCreator {
return this; return this;
} }
public IrisWorldCreator height(int maxHeight) {
this.maxHeight = maxHeight;
this.minHeight = 0;
return this;
}
public IrisWorldCreator height(int minHeight, int maxHeight) {
this.maxHeight = maxHeight;
this.minHeight = minHeight;
return this;
}
public IrisWorldCreator name(String name) { public IrisWorldCreator name(String name) {
this.name = name; this.name = name;
return this; return this;
@ -78,16 +64,18 @@ public class IrisWorldCreator {
} }
public WorldCreator create() { public WorldCreator create() {
IrisDimension dim = IrisData.loadAnyDimension(dimensionName);
IrisWorld w = IrisWorld.builder() IrisWorld w = IrisWorld.builder()
.name(name) .name(name)
.minHeight(minHeight) .minHeight(dim.getMinHeight())
.maxHeight(maxHeight) .maxHeight(dim.getMaxHeight())
.seed(seed) .seed(seed)
.worldFolder(new File(name)) .worldFolder(new File(name))
.environment(findEnvironment()) .environment(findEnvironment())
.build(); .build();
ChunkGenerator g = new BukkitChunkGenerator(w, studio, studio ChunkGenerator g = new BukkitChunkGenerator(w, studio, studio
? IrisData.loadAnyDimension(dimensionName).getLoader().getDataFolder() : ? dim.getLoader().getDataFolder() :
new File(w.worldFolder(), "iris/pack"), dimensionName); new File(w.worldFolder(), "iris/pack"), dimensionName);
return new WorldCreator(name) return new WorldCreator(name)
@ -98,7 +86,7 @@ public class IrisWorldCreator {
private World.Environment findEnvironment() { private World.Environment findEnvironment() {
IrisDimension dim = IrisData.loadAnyDimension(dimensionName); IrisDimension dim = IrisData.loadAnyDimension(dimensionName);
if (dim == null || dim.getEnvironment() == null) { if(dim == null || dim.getEnvironment() == null) {
return World.Environment.NORMAL; return World.Environment.NORMAL;
} else { } else {
return dim.getEnvironment(); return dim.getEnvironment();

View File

@ -41,37 +41,37 @@ public class WandSelection {
double accuracy = M.lerpInverse(0, 64 * 64, p.getLocation().distanceSquared(c.getCenter())); double accuracy = M.lerpInverse(0, 64 * 64, p.getLocation().distanceSquared(c.getCenter()));
double dist = M.lerp(0.125, 3.5, accuracy); double dist = M.lerp(0.125, 3.5, accuracy);
for (double i = c.getLowerX() - 1; i < c.getUpperX() + 1; i += 0.25) { for(double i = c.getLowerX() - 1; i < c.getUpperX() + 1; i += 0.25) {
for (double j = c.getLowerY() - 1; j < c.getUpperY() + 1; j += 0.25) { for(double j = c.getLowerY() - 1; j < c.getUpperY() + 1; j += 0.25) {
for (double k = c.getLowerZ() - 1; k < c.getUpperZ() + 1; k += 0.25) { for(double k = c.getLowerZ() - 1; k < c.getUpperZ() + 1; k += 0.25) {
boolean ii = i == c.getLowerX() || i == c.getUpperX(); boolean ii = i == c.getLowerX() || i == c.getUpperX();
boolean jj = j == c.getLowerY() || j == c.getUpperY(); boolean jj = j == c.getLowerY() || j == c.getUpperY();
boolean kk = k == c.getLowerZ() || k == c.getUpperZ(); boolean kk = k == c.getLowerZ() || k == c.getUpperZ();
if ((ii && jj) || (ii && kk) || (kk && jj)) { if((ii && jj) || (ii && kk) || (kk && jj)) {
Vector push = new Vector(0, 0, 0); Vector push = new Vector(0, 0, 0);
if (i == c.getLowerX()) { if(i == c.getLowerX()) {
push.add(new Vector(-0.55, 0, 0)); push.add(new Vector(-0.55, 0, 0));
} }
if (j == c.getLowerY()) { if(j == c.getLowerY()) {
push.add(new Vector(0, -0.55, 0)); push.add(new Vector(0, -0.55, 0));
} }
if (k == c.getLowerZ()) { if(k == c.getLowerZ()) {
push.add(new Vector(0, 0, -0.55)); push.add(new Vector(0, 0, -0.55));
} }
if (i == c.getUpperX()) { if(i == c.getUpperX()) {
push.add(new Vector(0.55, 0, 0)); push.add(new Vector(0.55, 0, 0));
} }
if (j == c.getUpperY()) { if(j == c.getUpperY()) {
push.add(new Vector(0, 0.55, 0)); push.add(new Vector(0, 0.55, 0));
} }
if (k == c.getUpperZ()) { if(k == c.getUpperZ()) {
push.add(new Vector(0, 0, 0.55)); push.add(new Vector(0, 0, 0.55));
} }
@ -79,23 +79,23 @@ public class WandSelection {
accuracy = M.lerpInverse(0, 64 * 64, p.getLocation().distanceSquared(a)); accuracy = M.lerpInverse(0, 64 * 64, p.getLocation().distanceSquared(a));
dist = M.lerp(0.125, 3.5, accuracy); dist = M.lerp(0.125, 3.5, accuracy);
if (M.r(M.min(dist * 5, 0.9D) * 0.995)) { if(M.r(M.min(dist * 5, 0.9D) * 0.995)) {
continue; continue;
} }
if (ii && jj) { if(ii && jj) {
a.add(0, 0, RNG.r.d(-0.3, 0.3)); a.add(0, 0, RNG.r.d(-0.3, 0.3));
} }
if (kk && jj) { if(kk && jj) {
a.add(RNG.r.d(-0.3, 0.3), 0, 0); a.add(RNG.r.d(-0.3, 0.3), 0, 0);
} }
if (ii && kk) { if(ii && kk) {
a.add(0, RNG.r.d(-0.3, 0.3), 0); a.add(0, RNG.r.d(-0.3, 0.3), 0);
} }
if (p.getLocation().distanceSquared(a) < 256 * 256) { if(p.getLocation().distanceSquared(a) < 256 * 256) {
Color color = Color.getHSBColor((float) (0.5f + (Math.sin((i + j + k + (p.getTicksLived() / 2f)) / (20f)) / 2)), 1, 1); Color color = Color.getHSBColor((float) (0.5f + (Math.sin((i + j + k + (p.getTicksLived() / 2f)) / (20f)) / 2)), 1, 1);
int r = color.getRed(); int r = color.getRed();
int g = color.getGreen(); int g = color.getGreen();

View File

@ -25,29 +25,23 @@ public class EnginePanic {
private static final KMap<String, String> stuff = new KMap<>(); private static final KMap<String, String> stuff = new KMap<>();
private static KMap<String, String> last = new KMap<>(); private static KMap<String, String> last = new KMap<>();
public static void add(String key, String value) public static void add(String key, String value) {
{
stuff.put(key, value); stuff.put(key, value);
} }
public static void saveLast() public static void saveLast() {
{
last = stuff.copy(); last = stuff.copy();
} }
public static void lastPanic() public static void lastPanic() {
{ for(String i : last.keySet()) {
for(String i : last.keySet())
{
Iris.error("Last Panic " + i + ": " + stuff.get(i)); Iris.error("Last Panic " + i + ": " + stuff.get(i));
} }
} }
public static void panic() public static void panic() {
{
lastPanic(); lastPanic();
for(String i : stuff.keySet()) for(String i : stuff.keySet()) {
{
Iris.error("Engine Panic " + i + ": " + stuff.get(i)); Iris.error("Engine Panic " + i + ": " + stuff.get(i));
} }
} }

View File

@ -102,7 +102,7 @@ public class IrisComplex implements DataProvider {
focusRegion = engine.getFocusRegion(); focusRegion = engine.getFocusRegion();
KMap<InferredType, ProceduralStream<IrisBiome>> inferredStreams = new KMap<>(); KMap<InferredType, ProceduralStream<IrisBiome>> inferredStreams = new KMap<>();
if (focusBiome != null) { if(focusBiome != null) {
focusBiome.setInferredType(InferredType.LAND); focusBiome.setInferredType(InferredType.LAND);
focusRegion = findRegion(focusBiome, engine); focusRegion = findRegion(focusBiome, engine);
} }
@ -206,7 +206,7 @@ public class IrisComplex implements DataProvider {
} }
public ProceduralStream<IrisBiome> getBiomeStream(InferredType type) { public ProceduralStream<IrisBiome> getBiomeStream(InferredType type) {
switch (type) { switch(type) {
case CAVE: case CAVE:
return caveBiomeStream; return caveBiomeStream;
case LAND: case LAND:
@ -224,8 +224,8 @@ public class IrisComplex implements DataProvider {
} }
private IrisRegion findRegion(IrisBiome focus, Engine engine) { private IrisRegion findRegion(IrisBiome focus, Engine engine) {
for (IrisRegion i : engine.getDimension().getAllRegions(engine)) { for(IrisRegion i : engine.getDimension().getAllRegions(engine)) {
if (i.getAllBiomeIds().contains(focus.getLoadKey())) { if(i.getAllBiomeIds().contains(focus.getLoadKey())) {
return i; return i;
} }
} }
@ -236,14 +236,14 @@ public class IrisComplex implements DataProvider {
private IrisDecorator decorateFor(IrisBiome b, double x, double z, IrisDecorationPart part) { private IrisDecorator decorateFor(IrisBiome b, double x, double z, IrisDecorationPart part) {
RNG rngc = new RNG(Cache.key(((int) x), ((int) z))); RNG rngc = new RNG(Cache.key(((int) x), ((int) z)));
for (IrisDecorator i : b.getDecorators()) { for(IrisDecorator i : b.getDecorators()) {
if (!i.getPartOf().equals(part)) { if(!i.getPartOf().equals(part)) {
continue; continue;
} }
BlockData block = i.getBlockData(b, rngc, x, z, data); BlockData block = i.getBlockData(b, rngc, x, z, data);
if (block != null) { if(block != null) {
return i; return i;
} }
} }
@ -254,19 +254,19 @@ public class IrisComplex implements DataProvider {
private IrisBiome fixBiomeType(Double height, IrisBiome biome, IrisRegion region, Double x, Double z, double fluidHeight) { private IrisBiome fixBiomeType(Double height, IrisBiome biome, IrisRegion region, Double x, Double z, double fluidHeight) {
double sh = region.getShoreHeight(x, z); double sh = region.getShoreHeight(x, z);
if (height >= fluidHeight - 1 && height <= fluidHeight + sh && !biome.isShore()) { if(height >= fluidHeight - 1 && height <= fluidHeight + sh && !biome.isShore()) {
return shoreBiomeStream.get(x, z); return shoreBiomeStream.get(x, z);
} }
if (height > fluidHeight + sh && !biome.isLand()) { if(height > fluidHeight + sh && !biome.isLand()) {
return landBiomeStream.get(x, z); return landBiomeStream.get(x, z);
} }
if (height < fluidHeight && !biome.isAquatic()) { if(height < fluidHeight && !biome.isAquatic()) {
return seaBiomeStream.get(x, z); return seaBiomeStream.get(x, z);
} }
if (height == fluidHeight && !biome.isShore()) { if(height == fluidHeight && !biome.isShore()) {
return shoreBiomeStream.get(x, z); return shoreBiomeStream.get(x, z);
} }
@ -274,7 +274,7 @@ public class IrisComplex implements DataProvider {
} }
private double interpolateGenerators(Engine engine, IrisInterpolator interpolator, KSet<IrisGenerator> generators, double x, double z, long seed) { private double interpolateGenerators(Engine engine, IrisInterpolator interpolator, KSet<IrisGenerator> generators, double x, double z, long seed) {
if (generators.isEmpty()) { if(generators.isEmpty()) {
return 0; return 0;
} }
@ -283,12 +283,12 @@ public class IrisComplex implements DataProvider {
IrisBiome bx = baseBiomeStream.get(xx, zz); IrisBiome bx = baseBiomeStream.get(xx, zz);
double b = 0; double b = 0;
for (IrisGenerator gen : generators) { for(IrisGenerator gen : generators) {
b += bx.getGenLinkMax(gen.getLoadKey()); b += bx.getGenLinkMax(gen.getLoadKey());
} }
return b; return b;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
Iris.error("Failed to sample hi biome at " + xx + " " + zz + "..."); Iris.error("Failed to sample hi biome at " + xx + " " + zz + "...");
@ -302,12 +302,12 @@ public class IrisComplex implements DataProvider {
IrisBiome bx = baseBiomeStream.get(xx, zz); IrisBiome bx = baseBiomeStream.get(xx, zz);
double b = 0; double b = 0;
for (IrisGenerator gen : generators) { for(IrisGenerator gen : generators) {
b += bx.getGenLinkMin(gen.getLoadKey()); b += bx.getGenLinkMin(gen.getLoadKey());
} }
return b; return b;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
Iris.error("Failed to sample lo biome at " + xx + " " + zz + "..."); Iris.error("Failed to sample lo biome at " + xx + " " + zz + "...");
@ -318,7 +318,7 @@ public class IrisComplex implements DataProvider {
double d = 0; double d = 0;
for (IrisGenerator i : generators) { for(IrisGenerator i : generators) {
d += M.lerp(lo, hi, i.getHeight(x, z, seed + 239945)); d += M.lerp(lo, hi, i.getHeight(x, z, seed + 239945));
} }
@ -328,7 +328,7 @@ public class IrisComplex implements DataProvider {
private double getInterpolatedHeight(Engine engine, double x, double z, long seed) { private double getInterpolatedHeight(Engine engine, double x, double z, long seed) {
double h = 0; double h = 0;
for (IrisInterpolator i : generators.keySet()) { for(IrisInterpolator i : generators.keySet()) {
h += interpolateGenerators(engine, i, generators.get(i), x, z, seed); h += interpolateGenerators(engine, i, generators.get(i), x, z, seed);
} }
@ -345,7 +345,7 @@ public class IrisComplex implements DataProvider {
} }
private IrisBiome implode(IrisBiome b, Double x, Double z) { private IrisBiome implode(IrisBiome b, Double x, Double z) {
if (b.getChildren().isEmpty()) { if(b.getChildren().isEmpty()) {
return b; return b;
} }
@ -353,11 +353,11 @@ public class IrisComplex implements DataProvider {
} }
private IrisBiome implode(IrisBiome b, Double x, Double z, int max) { private IrisBiome implode(IrisBiome b, Double x, Double z, int max) {
if (max < 0) { if(max < 0) {
return b; return b;
} }
if (b.getChildren().isEmpty()) { if(b.getChildren().isEmpty()) {
return b; return b;
} }

View File

@ -35,7 +35,13 @@ import com.volmit.iris.engine.framework.EngineWorldManager;
import com.volmit.iris.engine.framework.SeedManager; import com.volmit.iris.engine.framework.SeedManager;
import com.volmit.iris.engine.framework.WrongEngineBroException; import com.volmit.iris.engine.framework.WrongEngineBroException;
import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.engine.mantle.EngineMantle;
import com.volmit.iris.engine.object.*; import com.volmit.iris.engine.object.IrisBiome;
import com.volmit.iris.engine.object.IrisBiomePaletteLayer;
import com.volmit.iris.engine.object.IrisDecorator;
import com.volmit.iris.engine.object.IrisEngineData;
import com.volmit.iris.engine.object.IrisJigsawStructure;
import com.volmit.iris.engine.object.IrisObjectPlacement;
import com.volmit.iris.engine.object.IrisRegion;
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment; import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
import com.volmit.iris.util.atomics.AtomicRollingSequence; import com.volmit.iris.util.atomics.AtomicRollingSequence;
import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KMap;
@ -132,18 +138,18 @@ public class IrisEngine implements Engine {
} }
private void verifySeed() { private void verifySeed() {
if (getEngineData().getSeed() != null && getEngineData().getSeed() != target.getWorld().getRawWorldSeed()) { if(getEngineData().getSeed() != null && getEngineData().getSeed() != target.getWorld().getRawWorldSeed()) {
target.getWorld().setRawWorldSeed(getEngineData().getSeed()); target.getWorld().setRawWorldSeed(getEngineData().getSeed());
} }
} }
private void tickRandomPlayer() { private void tickRandomPlayer() {
if (perSecondBudLatch.flip()) { if(perSecondBudLatch.flip()) {
buds.set(bud.get()); buds.set(bud.get());
bud.set(0); bud.set(0);
} }
if (effects != null) { if(effects != null) {
effects.tickRandomPlayer(); effects.tickRandomPlayer();
} }
} }
@ -168,7 +174,7 @@ public class IrisEngine implements Engine {
effects = new IrisEngineEffects(this); effects = new IrisEngineEffects(this);
setupMode(); setupMode();
J.a(this::computeBiomeMaxes); J.a(this::computeBiomeMaxes);
} catch (Throwable e) { } catch(Throwable e) {
Iris.error("FAILED TO SETUP ENGINE!"); Iris.error("FAILED TO SETUP ENGINE!");
e.printStackTrace(); e.printStackTrace();
} }
@ -177,7 +183,7 @@ public class IrisEngine implements Engine {
} }
private void setupMode() { private void setupMode() {
if (mode != null) { if(mode != null) {
mode.close(); mode.close();
} }
@ -200,8 +206,8 @@ public class IrisEngine implements Engine {
} }
private void warmupChunk(int x, int z) { private void warmupChunk(int x, int z) {
for (int i = 0; i < 16; i++) { for(int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) { for(int j = 0; j < 16; j++) {
int xx = x + (i << 4); int xx = x + (i << 4);
int zz = z + (z << 4); int zz = z + (z << 4);
getComplex().getTrueBiomeStream().get(xx, zz); getComplex().getTrueBiomeStream().get(xx, zz);
@ -237,18 +243,18 @@ public class IrisEngine implements Engine {
//TODO: Method this file //TODO: Method this file
File f = new File(getWorld().worldFolder(), "iris/engine-data/" + getDimension().getLoadKey() + ".json"); File f = new File(getWorld().worldFolder(), "iris/engine-data/" + getDimension().getLoadKey() + ".json");
if (!f.exists()) { if(!f.exists()) {
try { try {
f.getParentFile().mkdirs(); f.getParentFile().mkdirs();
IO.writeAll(f, new Gson().toJson(new IrisEngineData())); IO.writeAll(f, new Gson().toJson(new IrisEngineData()));
} catch (IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
try { try {
return new Gson().fromJson(IO.readAll(f), IrisEngineData.class); return new Gson().fromJson(IO.readAll(f), IrisEngineData.class);
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -263,11 +269,11 @@ public class IrisEngine implements Engine {
@Override @Override
public double getGeneratedPerSecond() { public double getGeneratedPerSecond() {
if (perSecondLatch.flip()) { if(perSecondLatch.flip()) {
double g = generated.get() - generatedLast.get(); double g = generated.get() - generatedLast.get();
generatedLast.set(generated.get()); generatedLast.set(generated.get());
if (g == 0) { if(g == 0) {
return 0; return 0;
} }
@ -285,24 +291,24 @@ public class IrisEngine implements Engine {
} }
private void computeBiomeMaxes() { private void computeBiomeMaxes() {
for (IrisBiome i : getDimension().getAllBiomes(this)) { for(IrisBiome i : getDimension().getAllBiomes(this)) {
double density = 0; double density = 0;
for (IrisObjectPlacement j : i.getObjects()) { for(IrisObjectPlacement j : i.getObjects()) {
density += j.getDensity() * j.getChance(); density += j.getDensity() * j.getChance();
} }
maxBiomeObjectDensity = Math.max(maxBiomeObjectDensity, density); maxBiomeObjectDensity = Math.max(maxBiomeObjectDensity, density);
density = 0; density = 0;
for (IrisDecorator j : i.getDecorators()) { for(IrisDecorator j : i.getDecorators()) {
density += Math.max(j.getStackMax(), 1) * j.getChance(); density += Math.max(j.getStackMax(), 1) * j.getChance();
} }
maxBiomeDecoratorDensity = Math.max(maxBiomeDecoratorDensity, density); maxBiomeDecoratorDensity = Math.max(maxBiomeDecoratorDensity, density);
density = 0; density = 0;
for (IrisBiomePaletteLayer j : i.getLayers()) { for(IrisBiomePaletteLayer j : i.getLayers()) {
density++; density++;
} }
@ -323,11 +329,11 @@ public class IrisEngine implements Engine {
double totalWeight = 0; double totalWeight = 0;
double wallClock = getMetrics().getTotal().getAverage(); double wallClock = getMetrics().getTotal().getAverage();
for (double j : timings.values()) { for(double j : timings.values()) {
totalWeight += j; totalWeight += j;
} }
for (String j : timings.k()) { for(String j : timings.k()) {
weights.put(getName() + "." + j, (wallClock / totalWeight) * timings.get(j)); weights.put(getName() + "." + j, (wallClock / totalWeight) * timings.get(j));
} }
@ -335,33 +341,33 @@ public class IrisEngine implements Engine {
double mtotals = 0; double mtotals = 0;
for (double i : totals.values()) { for(double i : totals.values()) {
mtotals += i; mtotals += i;
} }
for (String i : totals.k()) { for(String i : totals.k()) {
totals.put(i, (masterWallClock / mtotals) * totals.get(i)); totals.put(i, (masterWallClock / mtotals) * totals.get(i));
} }
double v = 0; double v = 0;
for (double i : weights.values()) { for(double i : weights.values()) {
v += i; v += i;
} }
for (String i : weights.k()) { for(String i : weights.k()) {
weights.put(i, weights.get(i) / v); weights.put(i, weights.get(i) / v);
} }
sender.sendMessage("Total: " + C.BOLD + C.WHITE + Form.duration(masterWallClock, 0)); sender.sendMessage("Total: " + C.BOLD + C.WHITE + Form.duration(masterWallClock, 0));
for (String i : totals.k()) { for(String i : totals.k()) {
sender.sendMessage(" Engine " + C.UNDERLINE + C.GREEN + i + C.RESET + ": " + C.BOLD + C.WHITE + Form.duration(totals.get(i), 0)); sender.sendMessage(" Engine " + C.UNDERLINE + C.GREEN + i + C.RESET + ": " + C.BOLD + C.WHITE + Form.duration(totals.get(i), 0));
} }
sender.sendMessage("Details: "); sender.sendMessage("Details: ");
for (String i : weights.sortKNumber().reverse()) { for(String i : weights.sortKNumber().reverse()) {
String befb = C.UNDERLINE + "" + C.GREEN + "" + i.split("\\Q[\\E")[0] + C.RESET + C.GRAY + "["; String befb = C.UNDERLINE + "" + C.GREEN + "" + i.split("\\Q[\\E")[0] + C.RESET + C.GRAY + "[";
String num = C.GOLD + i.split("\\Q[\\E")[1].split("]")[0] + C.RESET + C.GRAY + "]."; String num = C.GOLD + i.split("\\Q[\\E")[1].split("]")[0] + C.RESET + C.GRAY + "].";
String afb = C.ITALIC + "" + C.AQUA + i.split("\\Q]\\E")[1].substring(1) + C.RESET + C.GRAY; String afb = C.ITALIC + "" + C.AQUA + i.split("\\Q]\\E")[1].substring(1) + C.RESET + C.GRAY;
@ -395,11 +401,11 @@ public class IrisEngine implements Engine {
@Override @Override
public void recycle() { public void recycle() {
if (!cleanLatch.flip()) { if(!cleanLatch.flip()) {
return; return;
} }
if (cleaning.get()) { if(cleaning.get()) {
cleanLatch.flipDown(); cleanLatch.flipDown();
return; return;
} }
@ -410,7 +416,7 @@ public class IrisEngine implements Engine {
try { try {
getMantle().trim(); getMantle().trim();
getData().getObjectLoader().clean(); getData().getObjectLoader().clean();
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.error("Cleanup failed! Enable debug to see stacktrace."); Iris.error("Cleanup failed! Enable debug to see stacktrace.");
} }
@ -422,7 +428,7 @@ public class IrisEngine implements Engine {
@BlockCoordinates @BlockCoordinates
@Override @Override
public void generate(int x, int z, Hunk<BlockData> vblocks, Hunk<Biome> vbiomes, boolean multicore) throws WrongEngineBroException { public void generate(int x, int z, Hunk<BlockData> vblocks, Hunk<Biome> vbiomes, boolean multicore) throws WrongEngineBroException {
if (closed) { if(closed) {
throw new WrongEngineBroException(); throw new WrongEngineBroException();
} }
@ -432,9 +438,9 @@ public class IrisEngine implements Engine {
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
Hunk<BlockData> blocks = vblocks.listen((xx, y, zz, t) -> catchBlockUpdates(x + xx, y + getMinHeight(), z + zz, t)); Hunk<BlockData> blocks = vblocks.listen((xx, y, zz, t) -> catchBlockUpdates(x + xx, y + getMinHeight(), z + zz, t));
if (getDimension().isDebugChunkCrossSections() && ((x >> 4) % getDimension().getDebugCrossSectionsMod() == 0 || (z >> 4) % getDimension().getDebugCrossSectionsMod() == 0)) { if(getDimension().isDebugChunkCrossSections() && ((x >> 4) % getDimension().getDebugCrossSectionsMod() == 0 || (z >> 4) % getDimension().getDebugCrossSectionsMod() == 0)) {
for (int i = 0; i < 16; i++) { for(int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) { for(int j = 0; j < 16; j++) {
blocks.set(i, 0, j, Material.CRYING_OBSIDIAN.createBlockData()); blocks.set(i, 0, j, Material.CRYING_OBSIDIAN.createBlockData());
} }
} }
@ -446,7 +452,7 @@ public class IrisEngine implements Engine {
getMetrics().getTotal().put(p.getMilliseconds()); getMetrics().getTotal().put(p.getMilliseconds());
generated.incrementAndGet(); generated.incrementAndGet();
recycle(); recycle();
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
fail("Failed to generate " + x + ", " + z, e); fail("Failed to generate " + x + ", " + z, e);
} }
@ -460,7 +466,7 @@ public class IrisEngine implements Engine {
try { try {
IO.writeAll(f, new Gson().toJson(getEngineData())); IO.writeAll(f, new Gson().toJson(getEngineData()));
Iris.debug("Saved Engine Data"); Iris.debug("Saved Engine Data");
} catch (IOException e) { } catch(IOException e) {
Iris.error("Failed to save Engine Data"); Iris.error("Failed to save Engine Data");
e.printStackTrace(); e.printStackTrace();
} }
@ -473,7 +479,7 @@ public class IrisEngine implements Engine {
@Override @Override
public IrisBiome getFocus() { public IrisBiome getFocus() {
if (getDimension().getFocus() == null || getDimension().getFocus().trim().isEmpty()) { if(getDimension().getFocus() == null || getDimension().getFocus().trim().isEmpty()) {
return null; return null;
} }
@ -482,12 +488,13 @@ public class IrisEngine implements Engine {
@Override @Override
public IrisRegion getFocusRegion() { public IrisRegion getFocusRegion() {
if (getDimension().getFocusRegion() == null || getDimension().getFocusRegion().trim().isEmpty()) { if(getDimension().getFocusRegion() == null || getDimension().getFocusRegion().trim().isEmpty()) {
return null; return null;
} }
return getData().getRegionLoader().load(getDimension().getFocusRegion()); return getData().getRegionLoader().load(getDimension().getFocusRegion());
} }
@Override @Override
public void fail(String error, Throwable e) { public void fail(String error, Throwable e) {
failing = true; failing = true;

View File

@ -45,19 +45,19 @@ public class IrisEngineEffects extends EngineAssignedComponent implements Engine
public void updatePlayerMap() { public void updatePlayerMap() {
List<Player> pr = getEngine().getWorld().getPlayers(); List<Player> pr = getEngine().getWorld().getPlayers();
if (pr == null) { if(pr == null) {
return; return;
} }
for (Player i : pr) { for(Player i : pr) {
boolean pcc = players.containsKey(i.getUniqueId()); boolean pcc = players.containsKey(i.getUniqueId());
if (!pcc) { if(!pcc) {
players.put(i.getUniqueId(), new EnginePlayer(getEngine(), i)); players.put(i.getUniqueId(), new EnginePlayer(getEngine(), i));
} }
} }
for (UUID i : players.k()) { for(UUID i : players.k()) {
if (!pr.contains(players.get(i).getPlayer())) { if(!pr.contains(players.get(i).getPlayer())) {
players.remove(i); players.remove(i);
} }
} }
@ -65,14 +65,14 @@ public class IrisEngineEffects extends EngineAssignedComponent implements Engine
@Override @Override
public void tickRandomPlayer() { public void tickRandomPlayer() {
if (limit.tryAcquire()) { if(limit.tryAcquire()) {
if (M.r(0.02)) { if(M.r(0.02)) {
updatePlayerMap(); updatePlayerMap();
limit.release(); limit.release();
return; return;
} }
if (players.isEmpty()) { if(players.isEmpty()) {
limit.release(); limit.release();
return; return;
} }
@ -81,7 +81,7 @@ public class IrisEngineEffects extends EngineAssignedComponent implements Engine
int max = players.size(); int max = players.size();
PrecisionStopwatch p = new PrecisionStopwatch(); PrecisionStopwatch p = new PrecisionStopwatch();
while (max-- > 0 && M.ms() - p.getMilliseconds() < limitms) { while(max-- > 0 && M.ms() - p.getMilliseconds() < limitms) {
players.v().getRandom().tick(); players.v().getRandom().tick();
} }

View File

@ -89,7 +89,7 @@ public class IrisEngineMantle implements EngineMantle {
private KList<IrisRegion> getAllRegions() { private KList<IrisRegion> getAllRegions() {
KList<IrisRegion> r = new KList<>(); KList<IrisRegion> r = new KList<>();
for (String i : getEngine().getDimension().getRegions()) { for(String i : getEngine().getDimension().getRegions()) {
r.add(getEngine().getData().getRegionLoader().load(i)); r.add(getEngine().getData().getRegionLoader().load(i));
} }
@ -99,7 +99,7 @@ public class IrisEngineMantle implements EngineMantle {
private KList<IrisBiome> getAllBiomes() { private KList<IrisBiome> getAllBiomes() {
KList<IrisBiome> r = new KList<>(); KList<IrisBiome> r = new KList<>();
for (IrisRegion i : getAllRegions()) { for(IrisRegion i : getAllRegions()) {
r.addAll(i.getAllBiomes(getEngine())); r.addAll(i.getAllBiomes(getEngine()));
} }
@ -107,13 +107,13 @@ public class IrisEngineMantle implements EngineMantle {
} }
private void warn(String ob, BlockVector bv) { private void warn(String ob, BlockVector bv) {
if (Math.max(bv.getBlockX(), bv.getBlockZ()) > 128) { if(Math.max(bv.getBlockX(), bv.getBlockZ()) > 128) {
Iris.warn("Object " + ob + " has a large size (" + bv + ") and may increase memory usage!"); Iris.warn("Object " + ob + " has a large size (" + bv + ") and may increase memory usage!");
} }
} }
private void warnScaled(String ob, BlockVector bv, double ms) { private void warnScaled(String ob, BlockVector bv, double ms) {
if (Math.max(bv.getBlockX(), bv.getBlockZ()) > 128) { if(Math.max(bv.getBlockX(), bv.getBlockZ()) > 128) {
Iris.warn("Object " + ob + " has a large size (" + bv + ") and may increase memory usage! (Object scaled up to " + Form.pc(ms, 2) + ")"); Iris.warn("Object " + ob + " has a large size (" + bv + ") and may increase memory usage! (Object scaled up to " + Form.pc(ms, 2) + ")");
} }
} }
@ -130,46 +130,46 @@ public class IrisEngineMantle implements EngineMantle {
int x = xg.get(); int x = xg.get();
int z = zg.get(); int z = zg.get();
if (getEngine().getDimension().isUseMantle()) { if(getEngine().getDimension().isUseMantle()) {
KList<IrisRegion> r = getAllRegions(); KList<IrisRegion> r = getAllRegions();
KList<IrisBiome> b = getAllBiomes(); KList<IrisBiome> b = getAllBiomes();
for (IrisBiome i : b) { for(IrisBiome i : b) {
for (IrisObjectPlacement j : i.getObjects()) { for(IrisObjectPlacement j : i.getObjects()) {
if (j.getScale().canScaleBeyond()) { if(j.getScale().canScaleBeyond()) {
scalars.put(j.getScale(), j.getPlace()); scalars.put(j.getScale(), j.getPlace());
} else { } else {
objects.addAll(j.getPlace()); objects.addAll(j.getPlace());
} }
} }
for (IrisJigsawStructurePlacement j : i.getJigsawStructures()) { for(IrisJigsawStructurePlacement j : i.getJigsawStructures()) {
jig = Math.max(jig, getData().getJigsawStructureLoader().load(j.getStructure()).getMaxDimension()); jig = Math.max(jig, getData().getJigsawStructureLoader().load(j.getStructure()).getMaxDimension());
} }
} }
for (IrisRegion i : r) { for(IrisRegion i : r) {
for (IrisObjectPlacement j : i.getObjects()) { for(IrisObjectPlacement j : i.getObjects()) {
if (j.getScale().canScaleBeyond()) { if(j.getScale().canScaleBeyond()) {
scalars.put(j.getScale(), j.getPlace()); scalars.put(j.getScale(), j.getPlace());
} else { } else {
objects.addAll(j.getPlace()); objects.addAll(j.getPlace());
} }
} }
for (IrisJigsawStructurePlacement j : i.getJigsawStructures()) { for(IrisJigsawStructurePlacement j : i.getJigsawStructures()) {
jig = Math.max(jig, getData().getJigsawStructureLoader().load(j.getStructure()).getMaxDimension()); jig = Math.max(jig, getData().getJigsawStructureLoader().load(j.getStructure()).getMaxDimension());
} }
} }
for (IrisJigsawStructurePlacement j : getEngine().getDimension().getJigsawStructures()) { for(IrisJigsawStructurePlacement j : getEngine().getDimension().getJigsawStructures()) {
jig = Math.max(jig, getData().getJigsawStructureLoader().load(j.getStructure()).getMaxDimension()); jig = Math.max(jig, getData().getJigsawStructureLoader().load(j.getStructure()).getMaxDimension());
} }
if (getEngine().getDimension().getStronghold() != null) { if(getEngine().getDimension().getStronghold() != null) {
try { try {
jig = Math.max(jig, getData().getJigsawStructureLoader().load(getEngine().getDimension().getStronghold()).getMaxDimension()); jig = Math.max(jig, getData().getJigsawStructureLoader().load(getEngine().getDimension().getStronghold()).getMaxDimension());
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
@ -178,13 +178,13 @@ public class IrisEngineMantle implements EngineMantle {
Iris.verbose("Checking sizes for " + Form.f(objects.size()) + " referenced objects."); Iris.verbose("Checking sizes for " + Form.f(objects.size()) + " referenced objects.");
BurstExecutor e = getEngine().getTarget().getBurster().burst(objects.size()); BurstExecutor e = getEngine().getTarget().getBurster().burst(objects.size());
KMap<String, BlockVector> sizeCache = new KMap<>(); KMap<String, BlockVector> sizeCache = new KMap<>();
for (String i : objects) { for(String i : objects) {
e.queue(() -> { e.queue(() -> {
try { try {
BlockVector bv = sizeCache.computeIfAbsent(i, (k) -> { BlockVector bv = sizeCache.computeIfAbsent(i, (k) -> {
try { try {
return IrisObject.sampleSize(getData().getObjectLoader().findFile(i)); return IrisObject.sampleSize(getData().getObjectLoader().findFile(i));
} catch (IOException ex) { } catch(IOException ex) {
Iris.reportError(ex); Iris.reportError(ex);
ex.printStackTrace(); ex.printStackTrace();
} }
@ -192,35 +192,35 @@ public class IrisEngineMantle implements EngineMantle {
return null; return null;
}); });
if (bv == null) { if(bv == null) {
throw new RuntimeException(); throw new RuntimeException();
} }
warn(i, bv); warn(i, bv);
synchronized (xg) { synchronized(xg) {
xg.getAndSet(Math.max(bv.getBlockX(), xg.get())); xg.getAndSet(Math.max(bv.getBlockX(), xg.get()));
} }
synchronized (zg) { synchronized(zg) {
zg.getAndSet(Math.max(bv.getBlockZ(), zg.get())); zg.getAndSet(Math.max(bv.getBlockZ(), zg.get()));
} }
} catch (Throwable ed) { } catch(Throwable ed) {
Iris.reportError(ed); Iris.reportError(ed);
} }
}); });
} }
for (Map.Entry<IrisObjectScale, KList<String>> entry : scalars.entrySet()) { for(Map.Entry<IrisObjectScale, KList<String>> entry : scalars.entrySet()) {
double ms = entry.getKey().getMaximumScale(); double ms = entry.getKey().getMaximumScale();
for (String j : entry.getValue()) { for(String j : entry.getValue()) {
e.queue(() -> { e.queue(() -> {
try { try {
BlockVector bv = sizeCache.computeIfAbsent(j, (k) -> { BlockVector bv = sizeCache.computeIfAbsent(j, (k) -> {
try { try {
return IrisObject.sampleSize(getData().getObjectLoader().findFile(j)); return IrisObject.sampleSize(getData().getObjectLoader().findFile(j));
} catch (IOException ioException) { } catch(IOException ioException) {
Iris.reportError(ioException); Iris.reportError(ioException);
ioException.printStackTrace(); ioException.printStackTrace();
} }
@ -228,20 +228,20 @@ public class IrisEngineMantle implements EngineMantle {
return null; return null;
}); });
if (bv == null) { if(bv == null) {
throw new RuntimeException(); throw new RuntimeException();
} }
warnScaled(j, bv, ms); warnScaled(j, bv, ms);
synchronized (xg) { synchronized(xg) {
xg.getAndSet((int) Math.max(Math.ceil(bv.getBlockX() * ms), xg.get())); xg.getAndSet((int) Math.max(Math.ceil(bv.getBlockX() * ms), xg.get()));
} }
synchronized (zg) { synchronized(zg) {
zg.getAndSet((int) Math.max(Math.ceil(bv.getBlockZ() * ms), zg.get())); zg.getAndSet((int) Math.max(Math.ceil(bv.getBlockZ() * ms), zg.get()));
} }
} catch (Throwable ee) { } catch(Throwable ee) {
Iris.reportError(ee); Iris.reportError(ee);
} }
@ -254,22 +254,22 @@ public class IrisEngineMantle implements EngineMantle {
x = xg.get(); x = xg.get();
z = zg.get(); z = zg.get();
for (IrisDepositGenerator i : getEngine().getDimension().getDeposits()) { for(IrisDepositGenerator i : getEngine().getDimension().getDeposits()) {
int max = i.getMaxDimension(); int max = i.getMaxDimension();
x = Math.max(max, x); x = Math.max(max, x);
z = Math.max(max, z); z = Math.max(max, z);
} }
for (IrisRegion v : r) { for(IrisRegion v : r) {
for (IrisDepositGenerator i : v.getDeposits()) { for(IrisDepositGenerator i : v.getDeposits()) {
int max = i.getMaxDimension(); int max = i.getMaxDimension();
x = Math.max(max, x); x = Math.max(max, x);
z = Math.max(max, z); z = Math.max(max, z);
} }
} }
for (IrisBiome v : b) { for(IrisBiome v : b) {
for (IrisDepositGenerator i : v.getDeposits()) { for(IrisDepositGenerator i : v.getDeposits()) {
int max = i.getMaxDimension(); int max = i.getMaxDimension();
x = Math.max(max, x); x = Math.max(max, x);
z = Math.max(max, z); z = Math.max(max, z);
@ -299,11 +299,11 @@ public class IrisEngineMantle implements EngineMantle {
m = Math.max(m, getDimension().getFluidBodies().getMaxRange(getData())); m = Math.max(m, getDimension().getFluidBodies().getMaxRange(getData()));
for (IrisRegion i : getDimension().getAllRegions(getEngine())) { for(IrisRegion i : getDimension().getAllRegions(getEngine())) {
m = Math.max(m, i.getFluidBodies().getMaxRange(getData())); m = Math.max(m, i.getFluidBodies().getMaxRange(getData()));
} }
for (IrisBiome i : getDimension().getAllBiomes(getEngine())) { for(IrisBiome i : getDimension().getAllBiomes(getEngine())) {
m = Math.max(m, i.getFluidBodies().getMaxRange(getData())); m = Math.max(m, i.getFluidBodies().getMaxRange(getData()));
} }
@ -315,11 +315,11 @@ public class IrisEngineMantle implements EngineMantle {
m = Math.max(m, getDimension().getCarving().getMaxRange(getData())); m = Math.max(m, getDimension().getCarving().getMaxRange(getData()));
for (IrisRegion i : getDimension().getAllRegions(getEngine())) { for(IrisRegion i : getDimension().getAllRegions(getEngine())) {
m = Math.max(m, i.getCarving().getMaxRange(getData())); m = Math.max(m, i.getCarving().getMaxRange(getData()));
} }
for (IrisBiome i : getDimension().getAllBiomes(getEngine())) { for(IrisBiome i : getDimension().getAllBiomes(getEngine())) {
m = Math.max(m, i.getCarving().getMaxRange(getData())); m = Math.max(m, i.getCarving().getMaxRange(getData()));
} }

View File

@ -44,7 +44,7 @@ public class IrisExecutionEnvironment implements EngineExecutionEnvironment {
try { try {
this.manager.declareBean("Iris", api, api.getClass()); this.manager.declareBean("Iris", api, api.getClass());
this.javaScriptEngine = (JavaScriptEngine) this.manager.loadScriptingEngine("javascript"); this.javaScriptEngine = (JavaScriptEngine) this.manager.loadScriptingEngine("javascript");
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -62,7 +62,7 @@ public class IrisExecutionEnvironment implements EngineExecutionEnvironment {
Iris.debug("Execute Script (void) " + C.DARK_GREEN + script.getLoadKey()); Iris.debug("Execute Script (void) " + C.DARK_GREEN + script.getLoadKey());
try { try {
javaScriptEngine.exec("", 0, 0, script); javaScriptEngine.exec("", 0, 0, script);
} catch (BSFException e) { } catch(BSFException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -71,7 +71,7 @@ public class IrisExecutionEnvironment implements EngineExecutionEnvironment {
Iris.debug("Execute Script (for result) " + C.DARK_GREEN + script); Iris.debug("Execute Script (for result) " + C.DARK_GREEN + script);
try { try {
return javaScriptEngine.eval("", 0, 0, getEngine().getData().getScriptLoader().load(script)); return javaScriptEngine.eval("", 0, 0, getEngine().getData().getScriptLoader().load(script));
} catch (BSFException e) { } catch(BSFException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -118,47 +118,47 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
looper = new Looper() { looper = new Looper() {
@Override @Override
protected long loop() { protected long loop() {
if (getEngine().isClosed() || getEngine().getCacheID() != id) { if(getEngine().isClosed() || getEngine().getCacheID() != id) {
interrupt(); interrupt();
} }
if (!getEngine().getWorld().hasRealWorld() && clw.flip()) { if(!getEngine().getWorld().hasRealWorld() && clw.flip()) {
getEngine().getWorld().tryGetRealWorld(); getEngine().getWorld().tryGetRealWorld();
} }
if (!IrisSettings.get().getWorld().isMarkerEntitySpawningSystem() && !IrisSettings.get().getWorld().isAnbientEntitySpawningSystem()) { if(!IrisSettings.get().getWorld().isMarkerEntitySpawningSystem() && !IrisSettings.get().getWorld().isAnbientEntitySpawningSystem()) {
return 3000; return 3000;
} }
if (getEngine().getWorld().hasRealWorld()) { if(getEngine().getWorld().hasRealWorld()) {
if (getEngine().getWorld().getPlayers().isEmpty()) { if(getEngine().getWorld().getPlayers().isEmpty()) {
return 5000; return 5000;
} }
if (chunkUpdater.flip()) { if(chunkUpdater.flip()) {
updateChunks(); updateChunks();
} }
if (getDimension().isInfiniteEnergy()) { if(getDimension().isInfiniteEnergy()) {
energy += 1000; energy += 1000;
fixEnergy(); fixEnergy();
} }
if (M.ms() < charge) { if(M.ms() < charge) {
energy += 70; energy += 70;
fixEnergy(); fixEnergy();
} }
if (cln.flip()) { if(cln.flip()) {
engine.getEngineData().cleanup(getEngine()); engine.getEngineData().cleanup(getEngine());
} }
if (precount != null) { if(precount != null) {
entityCount = 0; entityCount = 0;
for (Entity i : precount) { for(Entity i : precount) {
if (i instanceof LivingEntity) { if(i instanceof LivingEntity) {
if (!i.isDead()) { if(!i.isDead()) {
entityCount++; entityCount++;
} }
} }
@ -167,8 +167,8 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
precount = null; precount = null;
} }
if (energy < 650) { if(energy < 650) {
if (ecl.flip()) { if(ecl.flip()) {
energy *= 1 + (0.02 * M.clip((1D - getEntitySaturation()), 0D, 1D)); energy *= 1 + (0.02 * M.clip((1D - getEntitySaturation()), 0D, 1D));
fixEnergy(); fixEnergy();
} }
@ -186,19 +186,19 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
} }
private void updateChunks() { private void updateChunks() {
for (Player i : getEngine().getWorld().realWorld().getPlayers()) { for(Player i : getEngine().getWorld().realWorld().getPlayers()) {
int r = 1; int r = 1;
Chunk c = i.getLocation().getChunk(); Chunk c = i.getLocation().getChunk();
for (int x = -r; x <= r; x++) { for(int x = -r; x <= r; x++) {
for (int z = -r; z <= r; z++) { for(int z = -r; z <= r; z++) {
if (c.getWorld().isChunkLoaded(c.getX() + x, c.getZ() + z) && Chunks.isSafe(getEngine().getWorld().realWorld(), c.getX() + x, c.getZ() + z)) { if(c.getWorld().isChunkLoaded(c.getX() + x, c.getZ() + z) && Chunks.isSafe(getEngine().getWorld().realWorld(), c.getX() + x, c.getZ() + z)) {
if (IrisSettings.get().getWorld().isPostLoadBlockUpdates()) { if(IrisSettings.get().getWorld().isPostLoadBlockUpdates()) {
getEngine().updateChunk(c.getWorld().getChunkAt(c.getX() + x, c.getZ() + z)); getEngine().updateChunk(c.getWorld().getChunkAt(c.getX() + x, c.getZ() + z));
} }
if (IrisSettings.get().getWorld().isMarkerEntitySpawningSystem()) { if(IrisSettings.get().getWorld().isMarkerEntitySpawningSystem()) {
Chunk cx = getEngine().getWorld().realWorld().getChunkAt(c.getX() + x, c.getZ() + z); Chunk cx = getEngine().getWorld().realWorld().getChunkAt(c.getX() + x, c.getZ() + z);
int finalX = c.getX() + x; int finalX = c.getX() + x;
int finalZ = c.getZ() + z; int finalZ = c.getZ() + z;
@ -206,7 +206,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
() -> { () -> {
J.a(() -> spawnIn(cx, true), RNG.r.i(5, 200)); J.a(() -> spawnIn(cx, true), RNG.r.i(5, 200));
getSpawnersFromMarkers(cx).forEach((block, spawners) -> { getSpawnersFromMarkers(cx).forEach((block, spawners) -> {
if (spawners.isEmpty()) { if(spawners.isEmpty()) {
return; return;
} }
@ -222,42 +222,42 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
} }
private boolean onAsyncTick() { private boolean onAsyncTick() {
if (getEngine().isClosed()) { if(getEngine().isClosed()) {
return false; return false;
} }
actuallySpawned = 0; actuallySpawned = 0;
if (energy < 100) { if(energy < 100) {
J.sleep(200); J.sleep(200);
return false; return false;
} }
if (!getEngine().getWorld().hasRealWorld()) { if(!getEngine().getWorld().hasRealWorld()) {
Iris.debug("Can't spawn. No real world"); Iris.debug("Can't spawn. No real world");
J.sleep(5000); J.sleep(5000);
return false; return false;
} }
double epx = getEntitySaturation(); double epx = getEntitySaturation();
if (epx > IrisSettings.get().getWorld().getTargetSpawnEntitiesPerChunk()) { if(epx > IrisSettings.get().getWorld().getTargetSpawnEntitiesPerChunk()) {
Iris.debug("Can't spawn. The entity per chunk ratio is at " + Form.pc(epx, 2) + " > 100% (total entities " + entityCount + ")"); Iris.debug("Can't spawn. The entity per chunk ratio is at " + Form.pc(epx, 2) + " > 100% (total entities " + entityCount + ")");
J.sleep(5000); J.sleep(5000);
return false; return false;
} }
if (cl.flip()) { if(cl.flip()) {
try { try {
J.s(() -> precount = getEngine().getWorld().realWorld().getEntities()); J.s(() -> precount = getEngine().getWorld().realWorld().getEntities());
} catch (Throwable e) { } catch(Throwable e) {
close(); close();
} }
} }
int chunkCooldownSeconds = 60; int chunkCooldownSeconds = 60;
for (Long i : chunkCooldowns.k()) { for(Long i : chunkCooldowns.k()) {
if (M.ms() - chunkCooldowns.get(i) > TimeUnit.SECONDS.toMillis(chunkCooldownSeconds)) { if(M.ms() - chunkCooldowns.get(i) > TimeUnit.SECONDS.toMillis(chunkCooldownSeconds)) {
chunkCooldowns.remove(i); chunkCooldowns.remove(i);
} }
} }
@ -265,15 +265,15 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
int spawnBuffer = RNG.r.i(2, 12); int spawnBuffer = RNG.r.i(2, 12);
Chunk[] cc = getEngine().getWorld().realWorld().getLoadedChunks(); Chunk[] cc = getEngine().getWorld().realWorld().getLoadedChunks();
while (spawnBuffer-- > 0) { while(spawnBuffer-- > 0) {
if (cc.length == 0) { if(cc.length == 0) {
Iris.debug("Can't spawn. No chunks!"); Iris.debug("Can't spawn. No chunks!");
return false; return false;
} }
Chunk c = cc[RNG.r.nextInt(cc.length)]; Chunk c = cc[RNG.r.nextInt(cc.length)];
if (!c.isLoaded() || !Chunks.isSafe(c.getWorld(), c.getX(), c.getZ())) { if(!c.isLoaded() || !Chunks.isSafe(c.getWorld(), c.getX(), c.getZ())) {
continue; continue;
} }
@ -290,11 +290,11 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
} }
private void spawnIn(Chunk c, boolean initial) { private void spawnIn(Chunk c, boolean initial) {
if (getEngine().isClosed()) { if(getEngine().isClosed()) {
return; return;
} }
if (initial) { if(initial) {
energy += 1.2; energy += 1.2;
} }
@ -320,9 +320,9 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
.popRandom(RNG.r) : null; .popRandom(RNG.r) : null;
//@done //@done
if (IrisSettings.get().getWorld().isMarkerEntitySpawningSystem()) { if(IrisSettings.get().getWorld().isMarkerEntitySpawningSystem()) {
getSpawnersFromMarkers(c).forEach((block, spawners) -> { getSpawnersFromMarkers(c).forEach((block, spawners) -> {
if (spawners.isEmpty()) { if(spawners.isEmpty()) {
return; return;
} }
@ -333,12 +333,12 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
}); });
} }
if (v != null && v.getReferenceSpawner() != null) { if(v != null && v.getReferenceSpawner() != null) {
int maxEntCount = v.getReferenceSpawner().getMaxEntitiesPerChunk(); int maxEntCount = v.getReferenceSpawner().getMaxEntitiesPerChunk();
for (Entity i : c.getEntities()) { for(Entity i : c.getEntities()) {
if (i instanceof LivingEntity) { if(i instanceof LivingEntity) {
if (-maxEntCount <= 0) { if(-maxEntCount <= 0) {
return; return;
} }
} }
@ -346,7 +346,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
try { try {
spawn(c, v); spawn(c, v);
} catch (Throwable e) { } catch(Throwable e) {
J.s(() -> spawn(c, v)); J.s(() -> spawn(c, v));
} }
} }
@ -355,33 +355,33 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
private void spawn(Chunk c, IrisEntitySpawn i) { private void spawn(Chunk c, IrisEntitySpawn i) {
boolean allow = true; boolean allow = true;
if (!i.getReferenceSpawner().getMaximumRatePerChunk().isInfinite()) { if(!i.getReferenceSpawner().getMaximumRatePerChunk().isInfinite()) {
allow = false; allow = false;
IrisEngineChunkData cd = getEngine().getEngineData().getChunk(c.getX(), c.getZ()); IrisEngineChunkData cd = getEngine().getEngineData().getChunk(c.getX(), c.getZ());
IrisEngineSpawnerCooldown sc = null; IrisEngineSpawnerCooldown sc = null;
for (IrisEngineSpawnerCooldown j : cd.getCooldowns()) { for(IrisEngineSpawnerCooldown j : cd.getCooldowns()) {
if (j.getSpawner().equals(i.getReferenceSpawner().getLoadKey())) { if(j.getSpawner().equals(i.getReferenceSpawner().getLoadKey())) {
sc = j; sc = j;
break; break;
} }
} }
if (sc == null) { if(sc == null) {
sc = new IrisEngineSpawnerCooldown(); sc = new IrisEngineSpawnerCooldown();
sc.setSpawner(i.getReferenceSpawner().getLoadKey()); sc.setSpawner(i.getReferenceSpawner().getLoadKey());
cd.getCooldowns().add(sc); cd.getCooldowns().add(sc);
} }
if (sc.canSpawn(i.getReferenceSpawner().getMaximumRatePerChunk())) { if(sc.canSpawn(i.getReferenceSpawner().getMaximumRatePerChunk())) {
sc.spawn(getEngine()); sc.spawn(getEngine());
allow = true; allow = true;
} }
} }
if (allow) { if(allow) {
int s = i.spawn(getEngine(), c, RNG.r); int s = i.spawn(getEngine(), c, RNG.r);
actuallySpawned += s; actuallySpawned += s;
if (s > 0) { if(s > 0) {
getCooldown(i.getReferenceSpawner()).spawn(getEngine()); getCooldown(i.getReferenceSpawner()).spawn(getEngine());
energy -= s * ((i.getEnergyMultiplier() * i.getReferenceSpawner().getEnergyMultiplier() * 1)); energy -= s * ((i.getEnergyMultiplier() * i.getReferenceSpawner().getEnergyMultiplier() * 1));
} }
@ -391,33 +391,33 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
private void spawn(IrisPosition c, IrisEntitySpawn i) { private void spawn(IrisPosition c, IrisEntitySpawn i) {
boolean allow = true; boolean allow = true;
if (!i.getReferenceSpawner().getMaximumRatePerChunk().isInfinite()) { if(!i.getReferenceSpawner().getMaximumRatePerChunk().isInfinite()) {
allow = false; allow = false;
IrisEngineChunkData cd = getEngine().getEngineData().getChunk(c.getX() >> 4, c.getZ() >> 4); IrisEngineChunkData cd = getEngine().getEngineData().getChunk(c.getX() >> 4, c.getZ() >> 4);
IrisEngineSpawnerCooldown sc = null; IrisEngineSpawnerCooldown sc = null;
for (IrisEngineSpawnerCooldown j : cd.getCooldowns()) { for(IrisEngineSpawnerCooldown j : cd.getCooldowns()) {
if (j.getSpawner().equals(i.getReferenceSpawner().getLoadKey())) { if(j.getSpawner().equals(i.getReferenceSpawner().getLoadKey())) {
sc = j; sc = j;
break; break;
} }
} }
if (sc == null) { if(sc == null) {
sc = new IrisEngineSpawnerCooldown(); sc = new IrisEngineSpawnerCooldown();
sc.setSpawner(i.getReferenceSpawner().getLoadKey()); sc.setSpawner(i.getReferenceSpawner().getLoadKey());
cd.getCooldowns().add(sc); cd.getCooldowns().add(sc);
} }
if (sc.canSpawn(i.getReferenceSpawner().getMaximumRatePerChunk())) { if(sc.canSpawn(i.getReferenceSpawner().getMaximumRatePerChunk())) {
sc.spawn(getEngine()); sc.spawn(getEngine());
allow = true; allow = true;
} }
} }
if (allow) { if(allow) {
int s = i.spawn(getEngine(), c, RNG.r); int s = i.spawn(getEngine(), c, RNG.r);
actuallySpawned += s; actuallySpawned += s;
if (s > 0) { if(s > 0) {
getCooldown(i.getReferenceSpawner()).spawn(getEngine()); getCooldown(i.getReferenceSpawner()).spawn(getEngine());
energy -= s * ((i.getEnergyMultiplier() * i.getReferenceSpawner().getEnergyMultiplier() * 1)); energy -= s * ((i.getEnergyMultiplier() * i.getReferenceSpawner().getEnergyMultiplier() * 1));
} }
@ -425,7 +425,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
} }
private Stream<IrisEntitySpawn> stream(IrisSpawner s, boolean initial) { private Stream<IrisEntitySpawn> stream(IrisSpawner s, boolean initial) {
for (IrisEntitySpawn i : initial ? s.getInitialSpawns() : s.getSpawns()) { for(IrisEntitySpawn i : initial ? s.getInitialSpawns() : s.getSpawns()) {
i.setReferenceSpawner(s); i.setReferenceSpawner(s);
i.setReferenceMarker(s.getReferenceMarker()); i.setReferenceMarker(s.getReferenceMarker());
} }
@ -437,11 +437,11 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
KList<IrisEntitySpawn> rarityTypes = new KList<>(); KList<IrisEntitySpawn> rarityTypes = new KList<>();
int totalRarity = 0; int totalRarity = 0;
for (IrisEntitySpawn i : types) { for(IrisEntitySpawn i : types) {
totalRarity += IRare.get(i); totalRarity += IRare.get(i);
} }
for (IrisEntitySpawn i : types) { for(IrisEntitySpawn i : types) {
rarityTypes.addMultiple(i, totalRarity / IRare.get(i)); rarityTypes.addMultiple(i, totalRarity / IRare.get(i));
} }
@ -457,13 +457,13 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
IrisEngineData ed = getEngine().getEngineData(); IrisEngineData ed = getEngine().getEngineData();
IrisEngineSpawnerCooldown cd = null; IrisEngineSpawnerCooldown cd = null;
for (IrisEngineSpawnerCooldown j : ed.getSpawnerCooldowns()) { for(IrisEngineSpawnerCooldown j : ed.getSpawnerCooldowns()) {
if (j.getSpawner().equals(i.getLoadKey())) { if(j.getSpawner().equals(i.getLoadKey())) {
cd = j; cd = j;
} }
} }
if (cd == null) { if(cd == null) {
cd = new IrisEngineSpawnerCooldown(); cd = new IrisEngineSpawnerCooldown();
cd.setSpawner(i.getLoadKey()); cd.setSpawner(i.getLoadKey());
cd.setLastSpawn(M.ms() - i.getMaximumRate().getInterval()); cd.setLastSpawn(M.ms() - i.getMaximumRate().getInterval());
@ -485,7 +485,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
@Override @Override
public void onChunkLoad(Chunk e, boolean generated) { public void onChunkLoad(Chunk e, boolean generated) {
if (getEngine().isClosed()) { if(getEngine().isClosed()) {
return; return;
} }
@ -495,16 +495,16 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
} }
private void spawn(IrisPosition block, IrisSpawner spawner, boolean initial) { private void spawn(IrisPosition block, IrisSpawner spawner, boolean initial) {
if (getEngine().isClosed()) { if(getEngine().isClosed()) {
return; return;
} }
if (spawner == null) { if(spawner == null) {
return; return;
} }
KList<IrisEntitySpawn> s = initial ? spawner.getInitialSpawns() : spawner.getSpawns(); KList<IrisEntitySpawn> s = initial ? spawner.getInitialSpawns() : spawner.getSpawns();
if (s.isEmpty()) { if(s.isEmpty()) {
return; return;
} }
@ -525,7 +525,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
@Override @Override
public void teleportAsync(PlayerTeleportEvent e) { public void teleportAsync(PlayerTeleportEvent e) {
if (IrisSettings.get().getWorld().getAsyncTeleport().isEnabled()) { if(IrisSettings.get().getWorld().getAsyncTeleport().isEnabled()) {
e.setCancelled(true); e.setCancelled(true);
warmupAreaAsync(e.getPlayer(), e.getTo(), () -> J.s(() -> { warmupAreaAsync(e.getPlayer(), e.getTo(), () -> J.s(() -> {
ignoreTP.set(true); ignoreTP.set(true);
@ -539,12 +539,12 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
J.a(() -> { J.a(() -> {
int viewDistance = IrisSettings.get().getWorld().getAsyncTeleport().getLoadViewDistance(); int viewDistance = IrisSettings.get().getWorld().getAsyncTeleport().getLoadViewDistance();
KList<Future<Chunk>> futures = new KList<>(); KList<Future<Chunk>> futures = new KList<>();
for (int i = -viewDistance; i <= viewDistance; i++) { for(int i = -viewDistance; i <= viewDistance; i++) {
for (int j = -viewDistance; j <= viewDistance; j++) { for(int j = -viewDistance; j <= viewDistance; j++) {
int finalJ = j; int finalJ = j;
int finalI = i; int finalI = i;
if (to.getWorld().isChunkLoaded((to.getBlockX() >> 4) + i, (to.getBlockZ() >> 4) + j)) { if(to.getWorld().isChunkLoaded((to.getBlockX() >> 4) + i, (to.getBlockZ() >> 4) + j)) {
futures.add(CompletableFuture.completedFuture(null)); futures.add(CompletableFuture.completedFuture(null));
continue; continue;
} }
@ -562,7 +562,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
public void execute(Future<Chunk> chunkFuture) { public void execute(Future<Chunk> chunkFuture) {
try { try {
chunkFuture.get(); chunkFuture.get();
} catch (InterruptedException | ExecutionException e) { } catch(InterruptedException | ExecutionException e) {
} }
} }
@ -579,45 +579,45 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
Map<IrisPosition, KSet<IrisSpawner>> p = new KMap<>(); Map<IrisPosition, KSet<IrisSpawner>> p = new KMap<>();
Set<IrisPosition> b = new KSet<>(); Set<IrisPosition> b = new KSet<>();
getMantle().iterateChunk(c.getX(), c.getZ(), MatterMarker.class, (x, y, z, t) -> { getMantle().iterateChunk(c.getX(), c.getZ(), MatterMarker.class, (x, y, z, t) -> {
if (t.getTag().equals("cave_floor") || t.getTag().equals("cave_ceiling")) { if(t.getTag().equals("cave_floor") || t.getTag().equals("cave_ceiling")) {
return; return;
} }
IrisMarker mark = getData().getMarkerLoader().load(t.getTag()); IrisMarker mark = getData().getMarkerLoader().load(t.getTag());
IrisPosition pos = new IrisPosition((c.getX() << 4) + x, y, (c.getZ() << 4) + z); IrisPosition pos = new IrisPosition((c.getX() << 4) + x, y, (c.getZ() << 4) + z);
if (mark.isEmptyAbove()) { if(mark.isEmptyAbove()) {
AtomicBoolean remove = new AtomicBoolean(false); AtomicBoolean remove = new AtomicBoolean(false);
try { try {
J.sfut(() -> { J.sfut(() -> {
if (c.getBlock(x, y + 1, z).getBlockData().getMaterial().isSolid() || c.getBlock(x, y + 2, z).getBlockData().getMaterial().isSolid()) { if(c.getBlock(x, y + 1, z).getBlockData().getMaterial().isSolid() || c.getBlock(x, y + 2, z).getBlockData().getMaterial().isSolid()) {
remove.set(true); remove.set(true);
} }
}).get(); }).get();
} catch (InterruptedException | ExecutionException e) { } catch(InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
} }
if (remove.get()) { if(remove.get()) {
b.add(pos); b.add(pos);
return; return;
} }
} }
for (String i : mark.getSpawners()) { for(String i : mark.getSpawners()) {
IrisSpawner m = getData().getSpawnerLoader().load(i); IrisSpawner m = getData().getSpawnerLoader().load(i);
m.setReferenceMarker(mark); m.setReferenceMarker(mark);
// This is so fucking incorrect its a joke // This is so fucking incorrect its a joke
//noinspection ConstantConditions //noinspection ConstantConditions
if (m != null) { if(m != null) {
p.computeIfAbsent(pos, (k) -> new KSet<>()).add(m); p.computeIfAbsent(pos, (k) -> new KSet<>()).add(m);
} }
} }
}); });
for (IrisPosition i : b) { for(IrisPosition i : b) {
getEngine().getMantle().getMantle().remove(i.getX(), i.getY(), i.getZ(), MatterMarker.class); getEngine().getMantle().getMantle().remove(i.getX(), i.getY(), i.getZ(), MatterMarker.class);
} }
@ -626,19 +626,19 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
@Override @Override
public void onBlockBreak(BlockBreakEvent e) { public void onBlockBreak(BlockBreakEvent e) {
if (e.getBlock().getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getBlock().getWorld().equals(getTarget().getWorld().realWorld())) {
J.a(() -> { J.a(() -> {
MatterMarker marker = getMantle().get(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ(), MatterMarker.class); MatterMarker marker = getMantle().get(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ(), MatterMarker.class);
if (marker != null) { if(marker != null) {
if (marker.getTag().equals("cave_floor") || marker.getTag().equals("cave_ceiling")) { if(marker.getTag().equals("cave_floor") || marker.getTag().equals("cave_ceiling")) {
return; return;
} }
IrisMarker mark = getData().getMarkerLoader().load(marker.getTag()); IrisMarker mark = getData().getMarkerLoader().load(marker.getTag());
if (mark == null || mark.isRemoveOnChange()) { if(mark == null || mark.isRemoveOnChange()) {
getMantle().remove(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ(), MatterMarker.class); getMantle().remove(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ(), MatterMarker.class);
} }
} }
@ -648,25 +648,25 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
Runnable drop = () -> J.s(() -> d.forEach((i) -> e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation().clone().add(0.5, 0.5, 0.5), i))); Runnable drop = () -> J.s(() -> d.forEach((i) -> e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation().clone().add(0.5, 0.5, 0.5), i)));
IrisBiome b = getEngine().getBiome(e.getBlock().getLocation()); IrisBiome b = getEngine().getBiome(e.getBlock().getLocation());
if (dropItems(e, d, drop, b.getBlockDrops(), b)) { if(dropItems(e, d, drop, b.getBlockDrops(), b)) {
return; return;
} }
IrisRegion r = getEngine().getRegion(e.getBlock().getLocation()); IrisRegion r = getEngine().getRegion(e.getBlock().getLocation());
if (dropItems(e, d, drop, r.getBlockDrops(), b)) { if(dropItems(e, d, drop, r.getBlockDrops(), b)) {
return; return;
} }
for (IrisBlockDrops i : getEngine().getDimension().getBlockDrops()) { for(IrisBlockDrops i : getEngine().getDimension().getBlockDrops()) {
if (i.shouldDropFor(e.getBlock().getBlockData(), getData())) { if(i.shouldDropFor(e.getBlock().getBlockData(), getData())) {
if (i.isReplaceVanillaDrops()) { if(i.isReplaceVanillaDrops()) {
e.setDropItems(false); e.setDropItems(false);
} }
i.fillDrops(false, d); i.fillDrops(false, d);
if (i.isSkipParents()) { if(i.isSkipParents()) {
drop.run(); drop.run();
return; return;
} }
@ -676,15 +676,15 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
} }
private boolean dropItems(BlockBreakEvent e, KList<ItemStack> d, Runnable drop, KList<IrisBlockDrops> blockDrops, IrisBiome b) { private boolean dropItems(BlockBreakEvent e, KList<ItemStack> d, Runnable drop, KList<IrisBlockDrops> blockDrops, IrisBiome b) {
for (IrisBlockDrops i : blockDrops) { for(IrisBlockDrops i : blockDrops) {
if (i.shouldDropFor(e.getBlock().getBlockData(), getData())) { if(i.shouldDropFor(e.getBlock().getBlockData(), getData())) {
if (i.isReplaceVanillaDrops()) { if(i.isReplaceVanillaDrops()) {
e.setDropItems(false); e.setDropItems(false);
} }
i.fillDrops(false, d); i.fillDrops(false, d);
if (i.isSkipParents()) { if(i.isSkipParents()) {
drop.run(); drop.run();
return true; return true;
} }
@ -711,7 +711,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
@Override @Override
public double getEntitySaturation() { public double getEntitySaturation() {
if (!getEngine().getWorld().hasRealWorld()) { if(!getEngine().getWorld().hasRealWorld()) {
return 1; return 1;
} }

View File

@ -30,12 +30,14 @@ import com.volmit.iris.util.hunk.Hunk;
import com.volmit.iris.util.hunk.view.BiomeGridHunkView; import com.volmit.iris.util.hunk.view.BiomeGridHunkView;
import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.BurstExecutor;
import com.volmit.iris.util.scheduling.ChronoLatch;
import com.volmit.iris.util.scheduling.PrecisionStopwatch; import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
public class IrisBiomeActuator extends EngineAssignedActuator<Biome> { public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
private final RNG rng; private final RNG rng;
private final ChronoLatch cl = new ChronoLatch(5000);
public IrisBiomeActuator(Engine engine) { public IrisBiomeActuator(Engine engine) {
super(engine, "Biome"); super(engine, "Biome");
@ -45,16 +47,16 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
@BlockCoordinates @BlockCoordinates
private boolean injectBiome(Hunk<Biome> h, int x, int y, int z, Object bb) { private boolean injectBiome(Hunk<Biome> h, int x, int y, int z, Object bb) {
try { try {
if (h instanceof BiomeGridHunkView hh) { if(h instanceof BiomeGridHunkView hh) {
ChunkGenerator.BiomeGrid g = hh.getChunk(); ChunkGenerator.BiomeGrid g = hh.getChunk();
if (g instanceof TerrainChunk) { if(g instanceof TerrainChunk) {
((TerrainChunk) g).getBiomeBaseInjector().setBiome(x, y, z, bb); ((TerrainChunk) g).getBiomeBaseInjector().setBiome(x, y, z, bb);
} else { } else {
hh.forceBiomeBaseInto(x, y, z, bb); hh.forceBiomeBaseInto(x, y, z, bb);
} }
return true; return true;
} }
} catch (Throwable e) { } catch(Throwable e) {
} }
@ -67,37 +69,51 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
BurstExecutor burst = burst().burst(multicore); BurstExecutor burst = burst().burst(multicore);
for (int xf = 0; xf < h.getWidth(); xf++) { for(int xf = 0; xf < h.getWidth(); xf++) {
int finalXf = xf; int finalXf = xf;
burst.queue(() -> { burst.queue(() -> {
IrisBiome ib; IrisBiome ib;
for (int zf = 0; zf < h.getDepth(); zf++) { for(int zf = 0; zf < h.getDepth(); zf++) {
ib = getComplex().getTrueBiomeStream().get(finalXf + x, zf + z); ib = getComplex().getTrueBiomeStream().get(finalXf + x, zf + z);
int maxHeight = (int) (getComplex().getFluidHeight() + ib.getMaxWithObjectHeight(getData())); int maxHeight = (int) (getComplex().getFluidHeight() + ib.getMaxWithObjectHeight(getData()));
if (ib.isCustom()) { if(ib.isCustom()) {
try { try {
IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z); IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z);
Object biomeBase = INMS.get().getCustomBiomeBaseFor(getDimension().getLoadKey() + ":" + custom.getId()); Object biomeBase = INMS.get().getCustomBiomeBaseFor(getDimension().getLoadKey() + ":" + custom.getId());
//
// int m = hits.size();
// String str = ib.getLoadKey() + ":custom:" + custom.getId();
// hits.add(str);
//
// if(m != hits.size())
// {
// Iris.info("Added " + str);
// }
if (biomeBase == null || !injectBiome(h, x, 0, z, biomeBase)) { if(biomeBase == null || !injectBiome(h, x, 0, z, biomeBase)) {
throw new RuntimeException("Cant inject biome!"); throw new RuntimeException("Cant inject biome!");
} }
for (int i = 0; i < maxHeight; i++) { for(int i = 0; i < maxHeight; i++) {
injectBiome(h, finalXf, i, zf, biomeBase); injectBiome(h, finalXf, i, zf, biomeBase);
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Biome v = ib.getSkyBiome(rng, x, 0, z); Biome v = ib.getSkyBiome(rng, x, 0, z);
for (int i = 0; i < maxHeight; i++) { for(int i = 0; i < maxHeight; i++) {
h.set(finalXf, i, zf, v); h.set(finalXf, i, zf, v);
} }
} }
} else { } else {
Biome v = ib.getSkyBiome(rng, x, 0, z); Biome v = ib.getSkyBiome(rng, x, 0, z);
for (int i = 0; i < maxHeight; i++) {
if(v != null) {
for(int i = 0; i < maxHeight; i++) {
h.set(finalXf, i, zf, v); h.set(finalXf, i, zf, v);
} }
} else if(cl.flip()) {
Iris.error("No biome provided for " + ib.getLoadKey());
}
} }
} }
}); });

View File

@ -67,21 +67,21 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData> {
@BlockCoordinates @BlockCoordinates
@Override @Override
public void onActuate(int x, int z, Hunk<BlockData> output, boolean multicore) { public void onActuate(int x, int z, Hunk<BlockData> output, boolean multicore) {
if (!getEngine().getDimension().isDecorate()) { if(!getEngine().getDimension().isDecorate()) {
return; return;
} }
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
BurstExecutor burst = burst().burst(multicore); BurstExecutor burst = burst().burst(multicore);
for (int i = 0; i < output.getWidth(); i++) { for(int i = 0; i < output.getWidth(); i++) {
int finalI = i; int finalI = i;
burst.queue(() -> { burst.queue(() -> {
int height; int height;
int realX = Math.round(x + finalI); int realX = Math.round(x + finalI);
int realZ; int realZ;
IrisBiome biome, cave; IrisBiome biome, cave;
for (int j = 0; j < output.getDepth(); j++) { for(int j = 0; j < output.getDepth(); j++) {
boolean solid; boolean solid;
int emptyFor = 0; int emptyFor = 0;
int lastSolid = 0; int lastSolid = 0;
@ -90,11 +90,11 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData> {
biome = getComplex().getTrueBiomeStream().get(realX, realZ); biome = getComplex().getTrueBiomeStream().get(realX, realZ);
cave = shouldRay ? getComplex().getCaveBiomeStream().get(realX, realZ) : null; cave = shouldRay ? getComplex().getCaveBiomeStream().get(realX, realZ) : null;
if (biome.getDecorators().isEmpty() && (cave == null || cave.getDecorators().isEmpty())) { if(biome.getDecorators().isEmpty() && (cave == null || cave.getDecorators().isEmpty())) {
continue; continue;
} }
if (height < getDimension().getFluidHeight()) { if(height < getDimension().getFluidHeight()) {
getSeaSurfaceDecorator().decorate(finalI, j, getSeaSurfaceDecorator().decorate(finalI, j,
realX, Math.round(+finalI + 1), Math.round(x + finalI - 1), realX, Math.round(+finalI + 1), Math.round(x + finalI - 1),
realZ, Math.round(z + j + 1), Math.round(z + j - 1), realZ, Math.round(z + j + 1), Math.round(z + j - 1),
@ -104,7 +104,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData> {
getDimension().getFluidHeight() + 1); getDimension().getFluidHeight() + 1);
} }
if (height == getDimension().getFluidHeight()) { if(height == getDimension().getFluidHeight()) {
getShoreLineDecorator().decorate(finalI, j, getShoreLineDecorator().decorate(finalI, j,
realX, Math.round(x + finalI + 1), Math.round(x + finalI - 1), realX, Math.round(x + finalI + 1), Math.round(x + finalI - 1),
realZ, Math.round(z + j + 1), Math.round(z + j - 1), realZ, Math.round(z + j + 1), Math.round(z + j - 1),
@ -114,12 +114,12 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData> {
getSurfaceDecorator().decorate(finalI, j, realX, realZ, output, biome, height, getEngine().getHeight() - height); getSurfaceDecorator().decorate(finalI, j, realX, realZ, output, biome, height, getEngine().getHeight() - height);
if (cave != null && cave.getDecorators().isNotEmpty()) { if(cave != null && cave.getDecorators().isNotEmpty()) {
for (int k = height; k > 0; k--) { for(int k = height; k > 0; k--) {
solid = PREDICATE_SOLID.test(output.get(finalI, k, j)); solid = PREDICATE_SOLID.test(output.get(finalI, k, j));
if (solid) { if(solid) {
if (emptyFor > 0) { if(emptyFor > 0) {
getSurfaceDecorator().decorate(finalI, j, realX, realZ, output, cave, k, lastSolid); getSurfaceDecorator().decorate(finalI, j, realX, realZ, output, cave, k, lastSolid);
getCeilingDecorator().decorate(finalI, j, realX, realZ, output, cave, lastSolid - 1, emptyFor); getCeilingDecorator().decorate(finalI, j, realX, realZ, output, cave, lastSolid - 1, emptyFor);
emptyFor = 0; emptyFor = 0;

View File

@ -21,7 +21,6 @@ package com.volmit.iris.engine.actuator;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.framework.EngineAssignedActuator; import com.volmit.iris.engine.framework.EngineAssignedActuator;
import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiome;
import com.volmit.iris.engine.object.IrisDimension;
import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.engine.object.IrisRegion;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.BlockCoordinates;
@ -54,7 +53,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
BurstExecutor e = burst().burst(multicore); BurstExecutor e = burst().burst(multicore);
for (int xf = 0; xf < h.getWidth(); xf++) { for(int xf = 0; xf < h.getWidth(); xf++) {
int finalXf = xf; int finalXf = xf;
e.queue(() -> terrainSliver(x, z, finalXf, h)); e.queue(() -> terrainSliver(x, z, finalXf, h));
} }
@ -71,10 +70,14 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
/** /**
* This is calling 1/16th of a chunk x/z slice. It is a plane from sky to bedrock 1 thick in the x direction. * This is calling 1/16th of a chunk x/z slice. It is a plane from sky to bedrock 1 thick in the x direction.
* *
* @param x the chunk x in blocks * @param x
* @param z the chunk z in blocks * the chunk x in blocks
* @param xf the current x slice * @param z
* @param h the blockdata * the chunk z in blocks
* @param xf
* the current x slice
* @param h
* the blockdata
*/ */
@BlockCoordinates @BlockCoordinates
public void terrainSliver(int x, int z, int xf, Hunk<BlockData> h) { public void terrainSliver(int x, int z, int xf, Hunk<BlockData> h) {
@ -83,7 +86,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
IrisBiome biome; IrisBiome biome;
IrisRegion region; IrisRegion region;
for (zf = 0; zf < h.getDepth(); zf++) { for(zf = 0; zf < h.getDepth(); zf++) {
realX = xf + x; realX = xf + x;
realZ = zf + z; realZ = zf + z;
biome = getComplex().getTrueBiomeStream().get(realX, realZ); biome = getComplex().getTrueBiomeStream().get(realX, realZ);
@ -92,7 +95,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
hf = Math.round(Math.max(Math.min(h.getHeight(), getDimension().getFluidHeight()), he)); hf = Math.round(Math.max(Math.min(h.getHeight(), getDimension().getFluidHeight()), he));
// this 0 is where we are going to need to modify the world base height, the Zero, not this instance... // this 0 is where we are going to need to modify the world base height, the Zero, not this instance...
if (hf < 0) { if(hf < 0) {
continue; continue;
} }
@ -101,28 +104,28 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
int depth, fdepth; int depth, fdepth;
// Fluid height and lower // Fluid height and lower
for (int i = hf; i >= 0; i--) { for(int i = hf; i >= 0; i--) {
if (i >= h.getHeight()) { // h.getheight is terrain height if(i >= h.getHeight()) { // h.getheight is terrain height
continue; continue;
} }
// will need to change // will need to change
if (i == 0) { if(i == 0) {
if (getDimension().isBedrock()) { if(getDimension().isBedrock()) {
h.set(xf, i, zf, BEDROCK); h.set(xf, i, zf, BEDROCK);
lastBedrock = i; lastBedrock = i;
continue; continue;
} }
} }
if (i > he && i <= hf) { if(i > he && i <= hf) {
fdepth = hf - i; fdepth = hf - i;
if (fblocks == null) { if(fblocks == null) {
fblocks = biome.generateSeaLayers(realX, realZ, rng, hf - he, getData()); fblocks = biome.generateSeaLayers(realX, realZ, rng, hf - he, getData());
} }
if (fblocks.hasIndex(fdepth)) { if(fblocks.hasIndex(fdepth)) {
h.set(xf, i, zf, fblocks.get(fdepth)); h.set(xf, i, zf, fblocks.get(fdepth));
continue; continue;
} }
@ -132,9 +135,9 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
} }
// top of surface // top of surface
if (i <= he) { if(i <= he) {
depth = he - i; depth = he - i;
if (blocks == null) { if(blocks == null) {
blocks = biome.generateLayers(getDimension(), realX, realZ, rng, blocks = biome.generateLayers(getDimension(), realX, realZ, rng,
he, he,
he, he,
@ -143,7 +146,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
} }
if (blocks.hasIndex(depth)) { if(blocks.hasIndex(depth)) {
h.set(xf, i, zf, blocks.get(depth)); h.set(xf, i, zf, blocks.get(depth));
continue; continue;
} }
@ -152,7 +155,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
ore = ore == null ? region.generateOres(realX, i, realZ, rng, getData()) : ore; ore = ore == null ? region.generateOres(realX, i, realZ, rng, getData()) : ore;
ore = ore == null ? getDimension().generateOres(realX, i, realZ, rng, getData()) : ore; ore = ore == null ? getDimension().generateOres(realX, i, realZ, rng, getData()) : ore;
if (ore != null) { if(ore != null) {
h.set(xf, i, zf, ore); h.set(xf, i, zf, ore);
} else { } else {
h.set(xf, i, zf, getComplex().getRockStream().get(realX, realZ)); h.set(xf, i, zf, getComplex().getRockStream().get(realX, realZ));

View File

@ -46,7 +46,7 @@ public class AtomicCache<T> {
public void reset() { public void reset() {
t.set(null); t.set(null);
if (nullSupport) { if(nullSupport) {
set.set(false); set.set(false);
} }
} }
@ -55,7 +55,7 @@ public class AtomicCache<T> {
return aquire(() -> { return aquire(() -> {
try { try {
return t.get(); return t.get();
} catch (Throwable e) { } catch(Throwable e) {
return null; return null;
} }
}); });
@ -65,7 +65,7 @@ public class AtomicCache<T> {
return aquire(() -> { return aquire(() -> {
try { try {
return t.get(); return t.get();
} catch (Throwable e) { } catch(Throwable e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
@ -73,18 +73,18 @@ public class AtomicCache<T> {
} }
public T aquire(Supplier<T> t) { public T aquire(Supplier<T> t) {
if (this.t.get() != null) { if(this.t.get() != null) {
return this.t.get(); return this.t.get();
} else if (nullSupport && set.get()) { } else if(nullSupport && set.get()) {
return null; return null;
} }
lock.lock(); lock.lock();
if (this.t.get() != null) { if(this.t.get() != null) {
lock.unlock(); lock.unlock();
return this.t.get(); return this.t.get();
} else if (nullSupport && set.get()) { } else if(nullSupport && set.get()) {
lock.unlock(); lock.unlock();
return null; return null;
} }
@ -92,10 +92,10 @@ public class AtomicCache<T> {
try { try {
this.t.set(t.get()); this.t.set(t.get());
if (nullSupport) { if(nullSupport) {
set.set(true); set.set(true);
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.error("Atomic cache failure!"); Iris.error("Atomic cache failure!");
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -46,7 +46,7 @@ public interface Cache<V> {
idx -= (z * w * h); idx -= (z * w * h);
final int y = idx / w; final int y = idx / w;
final int x = idx % w; final int x = idx % w;
return new int[]{x, y, z}; return new int[] {x, y, z};
} }
int getId(); int getId();

View File

@ -56,7 +56,7 @@ public class LinkedTerrainChunk implements TerrainChunk {
@Override @Override
public BiomeBaseInjector getBiomeBaseInjector() { public BiomeBaseInjector getBiomeBaseInjector() {
if (unsafe) { if(unsafe) {
return (a, b, c, d) -> { return (a, b, c, d) -> {
}; };
} }
@ -67,7 +67,7 @@ public class LinkedTerrainChunk implements TerrainChunk {
@Override @Override
public Biome getBiome(int x, int z) { public Biome getBiome(int x, int z) {
if (storage != null) { if(storage != null) {
return storage.getBiome(x, z); return storage.getBiome(x, z);
} }
@ -77,7 +77,7 @@ public class LinkedTerrainChunk implements TerrainChunk {
@Override @Override
public Biome getBiome(int x, int y, int z) { public Biome getBiome(int x, int y, int z) {
if (storage != null) { if(storage != null) {
return storage.getBiome(x, y, z); return storage.getBiome(x, y, z);
} }
@ -86,7 +86,7 @@ public class LinkedTerrainChunk implements TerrainChunk {
@Override @Override
public void setBiome(int x, int z, Biome bio) { public void setBiome(int x, int z, Biome bio) {
if (storage != null) { if(storage != null) {
storage.setBiome(x, z, bio); storage.setBiome(x, z, bio);
return; return;
} }
@ -100,7 +100,7 @@ public class LinkedTerrainChunk implements TerrainChunk {
@Override @Override
public void setBiome(int x, int y, int z, Biome bio) { public void setBiome(int x, int y, int z, Biome bio) {
if (storage != null) { if(storage != null) {
storage.setBiome(x, y, z, bio); storage.setBiome(x, y, z, bio);
return; return;
} }
@ -190,7 +190,7 @@ public class LinkedTerrainChunk implements TerrainChunk {
@Override @Override
public void inject(BiomeGrid biome) { public void inject(BiomeGrid biome) {
if (biome3D != null) { if(biome3D != null) {
biome3D.inject(biome); biome3D.inject(biome);
} }
} }

View File

@ -81,11 +81,11 @@ public class MCATerrainChunk implements TerrainChunk {
int xx = (x + ox) & 15; int xx = (x + ox) & 15;
int zz = (z + oz) & 15; int zz = (z + oz) & 15;
if (y > 255 || y < 0) { if(y > getMaxHeight() || y < getMinHeight()) {
return; return;
} }
if (blockData == null) { if(blockData == null) {
Iris.error("NULL BD"); Iris.error("NULL BD");
} }
@ -94,12 +94,12 @@ public class MCATerrainChunk implements TerrainChunk {
@Override @Override
public org.bukkit.block.data.BlockData getBlockData(int x, int y, int z) { public org.bukkit.block.data.BlockData getBlockData(int x, int y, int z) {
if (y > getMaxHeight()) { if(y > getMaxHeight()) {
y = getMaxHeight(); y = getMaxHeight();
} }
if (y < 0) { if(y < getMinHeight()) {
y = 0; y = getMinHeight();
} }
return NBTWorld.getBlockData(mcaChunk.getBlockStateAt((x + ox) & 15, y, (z + oz) & 15)); return NBTWorld.getBlockData(mcaChunk.getBlockStateAt((x + ox) & 15, y, (z + oz) & 15));

View File

@ -49,8 +49,10 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
/** /**
* Get biome at x, z within chunk being generated * Get biome at x, z within chunk being generated
* *
* @param x - 0-15 * @param x
* @param z - 0-15 * - 0-15
* @param z
* - 0-15
* @return Biome value * @return Biome value
* @deprecated biomes are now 3-dimensional * @deprecated biomes are now 3-dimensional
*/ */
@ -61,9 +63,12 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
/** /**
* Get biome at x, z within chunk being generated * Get biome at x, z within chunk being generated
* *
* @param x - 0-15 * @param x
* @param y - 0-255 * - 0-15
* @param z - 0-15 * @param y
* - 0-255
* @param z
* - 0-15
* @return Biome value * @return Biome value
*/ */
Biome getBiome(int x, int y, int z); Biome getBiome(int x, int y, int z);
@ -71,9 +76,12 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
/** /**
* Set biome at x, z within chunk being generated * Set biome at x, z within chunk being generated
* *
* @param x - 0-15 * @param x
* @param z - 0-15 * - 0-15
* @param bio - Biome value * @param z
* - 0-15
* @param bio
* - Biome value
* @deprecated biomes are now 3-dimensional * @deprecated biomes are now 3-dimensional
*/ */
@Deprecated @Deprecated
@ -82,10 +90,14 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
/** /**
* Set biome at x, z within chunk being generated * Set biome at x, z within chunk being generated
* *
* @param x - 0-15 * @param x
* @param y - 0-255 * - 0-15
* @param z - 0-15 * @param y
* @param bio - Biome value * - 0-255
* @param z
* - 0-15
* @param bio
* - Biome value
*/ */
void setBiome(int x, int y, int z, Biome bio); void setBiome(int x, int y, int z, Biome bio);
@ -103,11 +115,15 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
* <p> * <p>
* Setting blocks outside the chunk's bounds does nothing. * Setting blocks outside the chunk's bounds does nothing.
* *
* @param x the x location in the chunk from 0-15 inclusive * @param x
* @param y the y location in the chunk from 0 (inclusive) - maxHeight * the x location in the chunk from 0-15 inclusive
* @param y
* the y location in the chunk from 0 (inclusive) - maxHeight
* (exclusive) * (exclusive)
* @param z the z location in the chunk from 0-15 inclusive * @param z
* @param blockData the type to set the block to * the z location in the chunk from 0-15 inclusive
* @param blockData
* the type to set the block to
*/ */
void setBlock(int x, int y, int z, BlockData blockData); void setBlock(int x, int y, int z, BlockData blockData);
@ -116,10 +132,13 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
* <p> * <p>
* Getting blocks outside the chunk's bounds returns air. * Getting blocks outside the chunk's bounds returns air.
* *
* @param x the x location in the chunk from 0-15 inclusive * @param x
* @param y the y location in the chunk from 0 (inclusive) - maxHeight * the x location in the chunk from 0-15 inclusive
* @param y
* the y location in the chunk from 0 (inclusive) - maxHeight
* (exclusive) * (exclusive)
* @param z the z location in the chunk from 0-15 inclusive * @param z
* the z location in the chunk from 0-15 inclusive
* @return the data of the block or the BlockData for air if x, y or z are * @return the data of the block or the BlockData for air if x, y or z are
* outside the chunk's bounds * outside the chunk's bounds
*/ */

View File

@ -31,7 +31,7 @@ public interface Deserializer<T> {
T fromStream(InputStream stream) throws IOException; T fromStream(InputStream stream) throws IOException;
default T fromFile(File file) throws IOException { default T fromFile(File file) throws IOException {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) { try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
return fromStream(bis); return fromStream(bis);
} }
} }
@ -42,8 +42,8 @@ public interface Deserializer<T> {
} }
default T fromResource(Class<?> clazz, String path) throws IOException { default T fromResource(Class<?> clazz, String path) throws IOException {
try (InputStream stream = clazz.getClassLoader().getResourceAsStream(path)) { try(InputStream stream = clazz.getClassLoader().getResourceAsStream(path)) {
if (stream == null) { if(stream == null) {
throw new IOException("resource \"" + path + "\" not found"); throw new IOException("resource \"" + path + "\" not found");
} }
return fromStream(stream); return fromStream(stream);
@ -51,7 +51,7 @@ public interface Deserializer<T> {
} }
default T fromURL(URL url) throws IOException { default T fromURL(URL url) throws IOException {
try (InputStream stream = url.openStream()) { try(InputStream stream = url.openStream()) {
return fromStream(stream); return fromStream(stream);
} }
} }

View File

@ -21,9 +21,9 @@ package com.volmit.iris.engine.data.io;
public interface MaxDepthIO { public interface MaxDepthIO {
default int decrementMaxDepth(int maxDepth) { default int decrementMaxDepth(int maxDepth) {
if (maxDepth < 0) { if(maxDepth < 0) {
throw new IllegalArgumentException("negative maximum depth is not allowed"); throw new IllegalArgumentException("negative maximum depth is not allowed");
} else if (maxDepth == 0) { } else if(maxDepth == 0) {
throw new MaxDepthReachedException("reached maximum depth of NBT structure"); throw new MaxDepthReachedException("reached maximum depth of NBT structure");
} }
return --maxDepth; return --maxDepth;

View File

@ -30,7 +30,7 @@ public interface Serializer<T> {
void toStream(T object, OutputStream out) throws IOException; void toStream(T object, OutputStream out) throws IOException;
default void toFile(T object, File file) throws IOException { default void toFile(T object, File file) throws IOException {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) { try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
toStream(object, bos); toStream(object, bos);
} }
} }

View File

@ -36,14 +36,14 @@ public interface StringDeserializer<T> extends Deserializer<T> {
@Override @Override
default T fromStream(InputStream stream) throws IOException { default T fromStream(InputStream stream) throws IOException {
try (Reader reader = new InputStreamReader(stream)) { try(Reader reader = new InputStreamReader(stream)) {
return fromReader(reader); return fromReader(reader);
} }
} }
@Override @Override
default T fromFile(File file) throws IOException { default T fromFile(File file) throws IOException {
try (Reader reader = new FileReader(file)) { try(Reader reader = new FileReader(file)) {
return fromReader(reader); return fromReader(reader);
} }
} }

View File

@ -46,7 +46,7 @@ public interface StringSerializer<T> extends Serializer<T> {
@Override @Override
default void toFile(T object, File file) throws IOException { default void toFile(T object, File file) throws IOException {
try (Writer writer = new FileWriter(file)) { try(Writer writer = new FileWriter(file)) {
toWriter(object, writer); toWriter(object, writer);
} }
} }

View File

@ -40,27 +40,27 @@ public class IrisCeilingDecorator extends IrisEngineDecorator {
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) { public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
IrisDecorator decorator = getDecorator(biome, realX, realZ); IrisDecorator decorator = getDecorator(biome, realX, realZ);
if (decorator != null) { if(decorator != null) {
if (!decorator.isStacking()) { if(!decorator.isStacking()) {
if (height >= 0 || height < getEngine().getHeight()) { if(height >= 0 || height < getEngine().getHeight()) {
data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData())); data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()));
} }
} else { } else {
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
if (decorator.isScaleStack()) { if(decorator.isScaleStack()) {
stack = Math.min((int) Math.ceil((double) max * ((double) stack / 100)), decorator.getAbsoluteMaxStack()); stack = Math.min((int) Math.ceil((double) max * ((double) stack / 100)), decorator.getAbsoluteMaxStack());
} else { } else {
stack = Math.min(max, stack); stack = Math.min(max, stack);
} }
if (stack == 1) { if(stack == 1) {
data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData())); data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData()));
return; return;
} }
for (int i = 0; i < stack; i++) { for(int i = 0; i < stack; i++) {
int h = height - i; int h = height - i;
if (h < getEngine().getMinHeight()) { if(h < getEngine().getMinHeight()) {
continue; continue;
} }
@ -70,19 +70,19 @@ public class IrisCeilingDecorator extends IrisEngineDecorator {
decorator.getBlockDataForTop(biome, getRng(), realX, h, realZ, getData()) : decorator.getBlockDataForTop(biome, getRng(), realX, h, realZ, getData()) :
decorator.getBlockData100(biome, getRng(), realX, h, realZ, getData()); decorator.getBlockData100(biome, getRng(), realX, h, realZ, getData());
if (bd instanceof PointedDripstone) { if(bd instanceof PointedDripstone) {
PointedDripstone.Thickness th = PointedDripstone.Thickness.BASE; PointedDripstone.Thickness th = PointedDripstone.Thickness.BASE;
if (stack == 2) { if(stack == 2) {
th = PointedDripstone.Thickness.FRUSTUM; th = PointedDripstone.Thickness.FRUSTUM;
if (i == stack - 1) { if(i == stack - 1) {
th = PointedDripstone.Thickness.TIP; th = PointedDripstone.Thickness.TIP;
} }
} else { } else {
if (i == stack - 1) { if(i == stack - 1) {
th = PointedDripstone.Thickness.TIP; th = PointedDripstone.Thickness.TIP;
} else if (i == stack - 2) { } else if(i == stack - 2) {
th = PointedDripstone.Thickness.FRUSTUM; th = PointedDripstone.Thickness.FRUSTUM;
} }
} }

View File

@ -48,18 +48,18 @@ public abstract class IrisEngineDecorator extends EngineAssignedComponent implem
KList<IrisDecorator> v = new KList<>(); KList<IrisDecorator> v = new KList<>();
RNG rng = new RNG(Cache.key((int) realX, (int) realZ)); RNG rng = new RNG(Cache.key((int) realX, (int) realZ));
for (IrisDecorator i : biome.getDecorators()) { for(IrisDecorator i : biome.getDecorators()) {
try { try {
if (i.getPartOf().equals(part) && i.getBlockData(biome, this.rng, realX, realZ, getData()) != null) { if(i.getPartOf().equals(part) && i.getBlockData(biome, this.rng, realX, realZ, getData()) != null) {
v.add(i); v.add(i);
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
Iris.error("PART OF: " + biome.getLoadFile().getAbsolutePath() + " HAS AN INVALID DECORATOR near 'partOf'!!!"); Iris.error("PART OF: " + biome.getLoadFile().getAbsolutePath() + " HAS AN INVALID DECORATOR near 'partOf'!!!");
} }
} }
if (v.isNotEmpty()) { if(v.isNotEmpty()) {
return v.get(rng.nextInt(v.size())); return v.get(rng.nextInt(v.size()));
} }

View File

@ -37,26 +37,26 @@ public class IrisSeaFloorDecorator extends IrisEngineDecorator {
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) { public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
IrisDecorator decorator = getDecorator(biome, realX, realZ); IrisDecorator decorator = getDecorator(biome, realX, realZ);
if (decorator != null) { if(decorator != null) {
if (!decorator.isStacking()) { if(!decorator.isStacking()) {
if (height >= 0 || height < getEngine().getHeight()) { if(height >= 0 || height < getEngine().getHeight()) {
data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData())); data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()));
} }
} else { } else {
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
if (decorator.isScaleStack()) { if(decorator.isScaleStack()) {
int maxStack = max - height; int maxStack = max - height;
stack = (int) Math.ceil((double) maxStack * ((double) stack / 100)); stack = (int) Math.ceil((double) maxStack * ((double) stack / 100));
} else stack = Math.min(stack, max - height); } else stack = Math.min(stack, max - height);
if (stack == 1) { if(stack == 1) {
data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData())); data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData()));
return; return;
} }
for (int i = 0; i < stack; i++) { for(int i = 0; i < stack; i++) {
int h = height + i; int h = height + i;
if (h > max || h > getEngine().getHeight()) { if(h > max || h > getEngine().getHeight()) {
continue; continue;
} }

View File

@ -37,26 +37,26 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator {
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) { public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
IrisDecorator decorator = getDecorator(biome, realX, realZ); IrisDecorator decorator = getDecorator(biome, realX, realZ);
if (decorator != null) { if(decorator != null) {
if (!decorator.isStacking()) { if(!decorator.isStacking()) {
if (height >= 0 || height < getEngine().getHeight()) { if(height >= 0 || height < getEngine().getHeight()) {
data.set(x, height + 1, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData())); data.set(x, height + 1, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()));
} }
} else { } else {
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
if (decorator.isScaleStack()) { if(decorator.isScaleStack()) {
int maxStack = max - height; int maxStack = max - height;
stack = (int) Math.ceil((double) maxStack * ((double) stack / 100)); stack = (int) Math.ceil((double) maxStack * ((double) stack / 100));
} }
if (stack == 1) { if(stack == 1) {
data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData())); data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData()));
return; return;
} }
for (int i = 0; i < stack; i++) { for(int i = 0; i < stack; i++) {
int h = height + i; int h = height + i;
if (h >= max || h >= getEngine().getHeight()) { if(h >= max || h >= getEngine().getHeight()) {
continue; continue;
} }

View File

@ -36,30 +36,30 @@ public class IrisShoreLineDecorator extends IrisEngineDecorator {
@Override @Override
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) { public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
if (height == getDimension().getFluidHeight()) { if(height == getDimension().getFluidHeight()) {
if (Math.round(getComplex().getHeightStream().get(realX1, realZ)) < getComplex().getFluidHeight() || if(Math.round(getComplex().getHeightStream().get(realX1, realZ)) < getComplex().getFluidHeight() ||
Math.round(getComplex().getHeightStream().get(realX_1, realZ)) < getComplex().getFluidHeight() || Math.round(getComplex().getHeightStream().get(realX_1, realZ)) < getComplex().getFluidHeight() ||
Math.round(getComplex().getHeightStream().get(realX, realZ1)) < getComplex().getFluidHeight() || Math.round(getComplex().getHeightStream().get(realX, realZ1)) < getComplex().getFluidHeight() ||
Math.round(getComplex().getHeightStream().get(realX, realZ_1)) < getComplex().getFluidHeight() Math.round(getComplex().getHeightStream().get(realX, realZ_1)) < getComplex().getFluidHeight()
) { ) {
IrisDecorator decorator = getDecorator(biome, realX, realZ); IrisDecorator decorator = getDecorator(biome, realX, realZ);
if (decorator != null) { if(decorator != null) {
if (!decorator.isStacking()) { if(!decorator.isStacking()) {
data.set(x, height + 1, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData())); data.set(x, height + 1, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()));
} else { } else {
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
if (decorator.isScaleStack()) { if(decorator.isScaleStack()) {
int maxStack = max - height; int maxStack = max - height;
stack = (int) Math.ceil((double) maxStack * ((double) stack / 100)); stack = (int) Math.ceil((double) maxStack * ((double) stack / 100));
} else stack = Math.min(max - height, stack); } else stack = Math.min(max - height, stack);
if (stack == 1) { if(stack == 1) {
data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData())); data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData()));
return; return;
} }
for (int i = 0; i < stack; i++) { for(int i = 0; i < stack; i++) {
int h = height + i; int h = height + i;
double threshold = ((double) i) / (stack - 1); double threshold = ((double) i) / (stack - 1);
data.set(x, h + 1, z, threshold >= decorator.getTopThreshold() ? data.set(x, h + 1, z, threshold >= decorator.getTopThreshold() ?

View File

@ -41,7 +41,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
@BlockCoordinates @BlockCoordinates
@Override @Override
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) { public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
if (biome.getInferredType().equals(InferredType.SHORE) && height < getDimension().getFluidHeight()) { if(biome.getInferredType().equals(InferredType.SHORE) && height < getDimension().getFluidHeight()) {
return; return;
} }
@ -50,22 +50,22 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
bdx = data.get(x, height, z); bdx = data.get(x, height, z);
boolean underwater = height < getDimension().getFluidHeight(); boolean underwater = height < getDimension().getFluidHeight();
if (decorator != null) { if(decorator != null) {
if (!decorator.isStacking()) { if(!decorator.isStacking()) {
bd = decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()); bd = decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData());
if (!underwater) { if(!underwater) {
if (!canGoOn(bd, bdx)) { if(!canGoOn(bd, bdx)) {
return; return;
} }
} }
if (bd instanceof Bisected) { if(bd instanceof Bisected) {
bd = bd.clone(); bd = bd.clone();
((Bisected) bd).setHalf(Bisected.Half.TOP); ((Bisected) bd).setHalf(Bisected.Half.TOP);
try { try {
data.set(x, height + 2, z, bd); data.set(x, height + 2, z, bd);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
bd = bd.clone(); bd = bd.clone();
@ -75,55 +75,55 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
data.set(x, height + 1, z, bd); data.set(x, height + 1, z, bd);
} else { } else {
if (height < getDimension().getFluidHeight()) { if(height < getDimension().getFluidHeight()) {
max = getDimension().getFluidHeight(); max = getDimension().getFluidHeight();
} }
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
if (decorator.isScaleStack()) { if(decorator.isScaleStack()) {
stack = Math.min((int) Math.ceil((double) max * ((double) stack / 100)), decorator.getAbsoluteMaxStack()); stack = Math.min((int) Math.ceil((double) max * ((double) stack / 100)), decorator.getAbsoluteMaxStack());
} else { } else {
stack = Math.min(max, stack); stack = Math.min(max, stack);
} }
if (stack == 1) { if(stack == 1) {
data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData())); data.set(x, height, z, decorator.getBlockDataForTop(biome, getRng(), realX, height, realZ, getData()));
return; return;
} }
for (int i = 0; i < stack; i++) { for(int i = 0; i < stack; i++) {
int h = height + i; int h = height + i;
double threshold = ((double) i) / (stack - 1); double threshold = ((double) i) / (stack - 1);
bd = threshold >= decorator.getTopThreshold() ? bd = threshold >= decorator.getTopThreshold() ?
decorator.getBlockDataForTop(biome, getRng(), realX, h, realZ, getData()) : decorator.getBlockDataForTop(biome, getRng(), realX, h, realZ, getData()) :
decorator.getBlockData100(biome, getRng(), realX, h, realZ, getData()); decorator.getBlockData100(biome, getRng(), realX, h, realZ, getData());
if (bd == null) { if(bd == null) {
break; break;
} }
if (i == 0 && !underwater && !canGoOn(bd, bdx)) { if(i == 0 && !underwater && !canGoOn(bd, bdx)) {
break; break;
} }
if (underwater && height + 1 + i > getDimension().getFluidHeight()) { if(underwater && height + 1 + i > getDimension().getFluidHeight()) {
break; break;
} }
if (bd instanceof PointedDripstone) { if(bd instanceof PointedDripstone) {
PointedDripstone.Thickness th = PointedDripstone.Thickness.BASE; PointedDripstone.Thickness th = PointedDripstone.Thickness.BASE;
if (stack == 2) { if(stack == 2) {
th = PointedDripstone.Thickness.FRUSTUM; th = PointedDripstone.Thickness.FRUSTUM;
if (i == stack - 1) { if(i == stack - 1) {
th = PointedDripstone.Thickness.TIP; th = PointedDripstone.Thickness.TIP;
} }
} else { } else {
if (i == stack - 1) { if(i == stack - 1) {
th = PointedDripstone.Thickness.TIP; th = PointedDripstone.Thickness.TIP;
} else if (i == stack - 2) { } else if(i == stack - 2) {
th = PointedDripstone.Thickness.FRUSTUM; th = PointedDripstone.Thickness.FRUSTUM;
} }
} }

View File

@ -78,7 +78,6 @@ import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -145,7 +144,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
@BlockCoordinates @BlockCoordinates
default void generate(int x, int z, TerrainChunk tc, boolean multicore) throws WrongEngineBroException { default void generate(int x, int z, TerrainChunk tc, boolean multicore) throws WrongEngineBroException {
generate(x, z, Hunk.view((ChunkGenerator.ChunkData) tc), Hunk.view((ChunkGenerator.BiomeGrid) tc), multicore); generate(x, z, Hunk.view(tc), Hunk.view(tc, tc.getMinHeight(), tc.getMaxHeight()), multicore);
} }
@BlockCoordinates @BlockCoordinates
@ -210,10 +209,10 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
default IrisBiome getCaveOrMantleBiome(int x, int y, int z) { default IrisBiome getCaveOrMantleBiome(int x, int y, int z) {
MatterCavern m = getMantle().getMantle().get(x, y, z, MatterCavern.class); MatterCavern m = getMantle().getMantle().get(x, y, z, MatterCavern.class);
if (m != null && m.getCustomBiome() != null && !m.getCustomBiome().isEmpty()) { if(m != null && m.getCustomBiome() != null && !m.getCustomBiome().isEmpty()) {
IrisBiome biome = getData().getBiomeLoader().load(m.getCustomBiome()); IrisBiome biome = getData().getBiomeLoader().load(m.getCustomBiome());
if (biome != null) { if(biome != null) {
return biome; return biome;
} }
} }
@ -250,11 +249,11 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
@BlockCoordinates @BlockCoordinates
@Override @Override
default void catchBlockUpdates(int x, int y, int z, BlockData data) { default void catchBlockUpdates(int x, int y, int z, BlockData data) {
if (data == null) { if(data == null) {
return; return;
} }
if (B.isUpdatable(data)) { if(B.isUpdatable(data)) {
getMantle().updateBlock(x, y, z); getMantle().updateBlock(x, y, z);
} }
} }
@ -269,7 +268,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
@ChunkCoordinates @ChunkCoordinates
@Override @Override
default void updateChunk(Chunk c) { default void updateChunk(Chunk c) {
if (c.getWorld().isChunkLoaded(c.getX() + 1, c.getZ() + 1) if(c.getWorld().isChunkLoaded(c.getX() + 1, c.getZ() + 1)
&& c.getWorld().isChunkLoaded(c.getX(), c.getZ() + 1) && c.getWorld().isChunkLoaded(c.getX(), c.getZ() + 1)
&& c.getWorld().isChunkLoaded(c.getX() + 1, c.getZ()) && c.getWorld().isChunkLoaded(c.getX() + 1, c.getZ())
&& c.getWorld().isChunkLoaded(c.getX() - 1, c.getZ() - 1) && c.getWorld().isChunkLoaded(c.getX() - 1, c.getZ() - 1)
@ -282,25 +281,25 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
KMap<Long, Integer> updates = new KMap<>(); KMap<Long, Integer> updates = new KMap<>();
RNG r = new RNG(Cache.key(c.getX(), c.getZ())); RNG r = new RNG(Cache.key(c.getX(), c.getZ()));
getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterCavern.class, (x, y, z, v) -> { getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterCavern.class, (x, y, z, v) -> {
if (!B.isFluid(c.getBlock(x & 15, y, z & 15).getBlockData())) { if(!B.isFluid(c.getBlock(x & 15, y, z & 15).getBlockData())) {
return; return;
} }
boolean u = false; boolean u = false;
if (B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.DOWN).getBlockData())) { if(B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.DOWN).getBlockData())) {
u = true; u = true;
} else if (B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.WEST).getBlockData())) { } else if(B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.WEST).getBlockData())) {
u = true; u = true;
} else if (B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.EAST).getBlockData())) { } else if(B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.EAST).getBlockData())) {
u = true; u = true;
} else if (B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.SOUTH).getBlockData())) { } else if(B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.SOUTH).getBlockData())) {
u = true; u = true;
} else if (B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.NORTH).getBlockData())) { } else if(B.isAir(c.getBlock(x & 15, y, z & 15).getRelative(BlockFace.NORTH).getBlockData())) {
u = true; u = true;
} }
if (u) { if(u) {
updates.compute(Cache.key(x & 15, z & 15), (k, vv) -> { updates.compute(Cache.key(x & 15, z & 15), (k, vv) -> {
if (vv != null) { if(vv != null) {
return Math.max(vv, y); return Math.max(vv, y);
} }
@ -311,11 +310,11 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
updates.forEach((k, v) -> update(Cache.keyX(k), v, Cache.keyZ(k), c, r)); updates.forEach((k, v) -> update(Cache.keyX(k), v, Cache.keyZ(k), c, r));
getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterUpdate.class, (x, y, z, v) -> { getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterUpdate.class, (x, y, z, v) -> {
if (v != null && v.isUpdate()) { if(v != null && v.isUpdate()) {
int vx = x & 15; int vx = x & 15;
int vz = z & 15; int vz = z & 15;
update(x, y, z, c, new RNG(Cache.key(c.getX(), c.getZ()))); update(x, y, z, c, new RNG(Cache.key(c.getX(), c.getZ())));
if (vx > 0 && vx < 15 && vz > 0 && vz < 15) { if(vx > 0 && vx < 15 && vz > 0 && vz < 15) {
updateLighting(x, y, z, c); updateLighting(x, y, z, c);
} }
} }
@ -331,11 +330,11 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
Block block = c.getBlock(x, y, z); Block block = c.getBlock(x, y, z);
BlockData data = block.getBlockData(); BlockData data = block.getBlockData();
if (B.isLit(data)) { if(B.isLit(data)) {
try { try {
block.setType(Material.AIR, false); block.setType(Material.AIR, false);
block.setBlockData(data, true); block.setBlockData(data, true);
} catch (Exception e) { } catch(Exception e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
@ -347,21 +346,21 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
Block block = c.getBlock(x, y, z); Block block = c.getBlock(x, y, z);
BlockData data = block.getBlockData(); BlockData data = block.getBlockData();
blockUpdatedMetric(); blockUpdatedMetric();
if (B.isStorage(data)) { if(B.isStorage(data)) {
RNG rx = rf.nextParallelRNG(BlockPosition.toLong(x, y, z)); RNG rx = rf.nextParallelRNG(BlockPosition.toLong(x, y, z));
InventorySlotType slot = null; InventorySlotType slot = null;
if (B.isStorageChest(data)) { if(B.isStorageChest(data)) {
slot = InventorySlotType.STORAGE; slot = InventorySlotType.STORAGE;
} }
if (slot != null) { if(slot != null) {
KList<IrisLootTable> tables = getLootTables(rx, block); KList<IrisLootTable> tables = getLootTables(rx, block);
try { try {
InventoryHolder m = (InventoryHolder) block.getState(); InventoryHolder m = (InventoryHolder) block.getState();
addItems(false, m.getInventory(), rx, tables, slot, x, y, z, 15); addItems(false, m.getInventory(), rx, tables, slot, x, y, z, 15);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
@ -379,12 +378,12 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
boolean packedFull = false; boolean packedFull = false;
splitting: splitting:
for (int i = 0; i < nitems.length; i++) { for(int i = 0; i < nitems.length; i++) {
ItemStack is = nitems[i]; ItemStack is = nitems[i];
if (is != null && is.getAmount() > 1 && !packedFull) { if(is != null && is.getAmount() > 1 && !packedFull) {
for (int j = 0; j < nitems.length; j++) { for(int j = 0; j < nitems.length; j++) {
if (nitems[j] == null) { if(nitems[j] == null) {
int take = rng.nextInt(is.getAmount()); int take = rng.nextInt(is.getAmount());
take = take == 0 ? 1 : take; take = take == 0 ? 1 : take;
is.setAmount(is.getAmount() - take); is.setAmount(is.getAmount() - take);
@ -398,11 +397,11 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
} }
} }
for (int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
try { try {
Arrays.parallelSort(nitems, (a, b) -> rng.nextInt()); Arrays.parallelSort(nitems, (a, b) -> rng.nextInt());
break; break;
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -413,7 +412,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
@Override @Override
default void injectTables(KList<IrisLootTable> list, IrisLootReference r) { default void injectTables(KList<IrisLootTable> list, IrisLootReference r) {
if (r.getMode().equals(IrisLootMode.CLEAR) || r.getMode().equals(IrisLootMode.REPLACE)) { if(r.getMode().equals(IrisLootMode.CLEAR) || r.getMode().equals(IrisLootMode.REPLACE)) {
list.clear(); list.clear();
} }
@ -427,11 +426,11 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
int rz = b.getZ(); int rz = b.getZ();
double he = getComplex().getHeightStream().get(rx, rz); double he = getComplex().getHeightStream().get(rx, rz);
PlacedObject po = getObjectPlacement(rx, b.getY(), rz); PlacedObject po = getObjectPlacement(rx, b.getY(), rz);
if (po != null && po.getPlacement() != null) { if(po != null && po.getPlacement() != null) {
if (B.isStorageChest(b.getBlockData())) { if(B.isStorageChest(b.getBlockData())) {
IrisLootTable table = po.getPlacement().getTable(b.getBlockData(), getData()); IrisLootTable table = po.getPlacement().getTable(b.getBlockData(), getData());
if (table != null) { if(table != null) {
return new KList<>(table); return new KList<>(table);
} }
} }
@ -446,14 +445,14 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
injectTables(tables, biomeSurface.getLoot()); injectTables(tables, biomeSurface.getLoot());
injectTables(tables, biomeUnder.getLoot()); injectTables(tables, biomeUnder.getLoot());
if (tables.isNotEmpty()) { if(tables.isNotEmpty()) {
int target = (int) Math.round(tables.size() * multiplier); int target = (int) Math.round(tables.size() * multiplier);
while (tables.size() < target && tables.isNotEmpty()) { while(tables.size() < target && tables.isNotEmpty()) {
tables.add(tables.get(rng.i(tables.size() - 1))); tables.add(tables.get(rng.i(tables.size() - 1)));
} }
while (tables.size() > target && tables.isNotEmpty()) { while(tables.size() > target && tables.isNotEmpty()) {
tables.remove(rng.i(tables.size() - 1)); tables.remove(rng.i(tables.size() - 1));
} }
} }
@ -466,29 +465,29 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
KList<ItemStack> items = new KList<>(); KList<ItemStack> items = new KList<>();
int b = 4; int b = 4;
for (IrisLootTable i : tables) { for(IrisLootTable i : tables) {
b++; b++;
items.addAll(i.getLoot(debug, items.isEmpty(), rng, slot, x, y, z, b + b, mgf + b)); items.addAll(i.getLoot(debug, items.isEmpty(), rng, slot, x, y, z, b + b, mgf + b));
} }
if (PaperLib.isPaper() && getWorld().hasRealWorld()) { if(PaperLib.isPaper() && getWorld().hasRealWorld()) {
PaperLib.getChunkAtAsync(getWorld().realWorld(), x >> 4, z >> 4).thenAccept((c) -> { PaperLib.getChunkAtAsync(getWorld().realWorld(), x >> 4, z >> 4).thenAccept((c) -> {
Runnable r = () -> { Runnable r = () -> {
for (ItemStack i : items) { for(ItemStack i : items) {
inv.addItem(i); inv.addItem(i);
} }
scramble(inv, rng); scramble(inv, rng);
}; };
if (Bukkit.isPrimaryThread()) { if(Bukkit.isPrimaryThread()) {
r.run(); r.run();
} else { } else {
J.s(r); J.s(r);
} }
}); });
} else { } else {
for (ItemStack i : items) { for(ItemStack i : items) {
inv.addItem(i); inv.addItem(i);
} }
@ -548,17 +547,17 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
AtomicReference<IrisPosition> r = new AtomicReference<>(); AtomicReference<IrisPosition> r = new AtomicReference<>();
BurstExecutor b = burst().burst(); BurstExecutor b = burst().burst();
while (M.ms() - time.get() < timeout && r.get() == null) { while(M.ms() - time.get() < timeout && r.get() == null) {
b.queue(() -> { b.queue(() -> {
for (int i = 0; i < 1000; i++) { for(int i = 0; i < 1000; i++) {
if (M.ms() - time.get() > timeout) { if(M.ms() - time.get() > timeout) {
return; return;
} }
int x = RNG.r.i(-29999970, 29999970); int x = RNG.r.i(-29999970, 29999970);
int z = RNG.r.i(-29999970, 29999970); int z = RNG.r.i(-29999970, 29999970);
checked.incrementAndGet(); checked.incrementAndGet();
if (matcher.apply(stream.get(x, z), find)) { if(matcher.apply(stream.get(x, z), find)) {
r.set(new IrisPosition(x, 120, z)); r.set(new IrisPosition(x, 120, z));
time.set(0); time.set(0);
} }
@ -570,7 +569,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
} }
default IrisPosition lookForBiome(IrisBiome biome, long timeout, Consumer<Integer> triesc) { default IrisPosition lookForBiome(IrisBiome biome, long timeout, Consumer<Integer> triesc) {
if (!getWorld().hasRealWorld()) { if(!getWorld().hasRealWorld()) {
Iris.error("Cannot GOTO without a bound world (headless mode)"); Iris.error("Cannot GOTO without a bound world (headless mode)");
return null; return null;
} }
@ -579,7 +578,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
long s = M.ms(); long s = M.ms();
int cpus = (Runtime.getRuntime().availableProcessors()); int cpus = (Runtime.getRuntime().availableProcessors());
if (!getDimension().getAllBiomes(this).contains(biome)) { if(!getDimension().getAllBiomes(this).contains(biome)) {
return null; return null;
} }
@ -587,50 +586,50 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
AtomicBoolean found = new AtomicBoolean(false); AtomicBoolean found = new AtomicBoolean(false);
AtomicBoolean running = new AtomicBoolean(true); AtomicBoolean running = new AtomicBoolean(true);
AtomicReference<IrisPosition> location = new AtomicReference<>(); AtomicReference<IrisPosition> location = new AtomicReference<>();
for (int i = 0; i < cpus; i++) { for(int i = 0; i < cpus; i++) {
J.a(() -> { J.a(() -> {
try { try {
Engine e; Engine e;
IrisBiome b; IrisBiome b;
int x, z; int x, z;
while (!found.get() && running.get()) { while(!found.get() && running.get()) {
try { try {
x = RNG.r.i(-29999970, 29999970); x = RNG.r.i(-29999970, 29999970);
z = RNG.r.i(-29999970, 29999970); z = RNG.r.i(-29999970, 29999970);
b = getSurfaceBiome(x, z); b = getSurfaceBiome(x, z);
if (b != null && b.getLoadKey() == null) { if(b != null && b.getLoadKey() == null) {
continue; continue;
} }
if (b != null && b.getLoadKey().equals(biome.getLoadKey())) { if(b != null && b.getLoadKey().equals(biome.getLoadKey())) {
found.lazySet(true); found.lazySet(true);
location.lazySet(new IrisPosition(x, getHeight(x, z), z)); location.lazySet(new IrisPosition(x, getHeight(x, z), z));
} }
tries.getAndIncrement(); tries.getAndIncrement();
} catch (Throwable ex) { } catch(Throwable ex) {
Iris.reportError(ex); Iris.reportError(ex);
ex.printStackTrace(); ex.printStackTrace();
return; return;
} }
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
}); });
} }
while (!found.get() || location.get() == null) { while(!found.get() || location.get() == null) {
J.sleep(50); J.sleep(50);
if (cl.flip()) { if(cl.flip()) {
triesc.accept(tries.get()); triesc.accept(tries.get());
} }
if (M.ms() - s > timeout) { if(M.ms() - s > timeout) {
running.set(false); running.set(false);
return null; return null;
} }
@ -641,7 +640,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
} }
default IrisPosition lookForRegion(IrisRegion reg, long timeout, Consumer<Integer> triesc) { default IrisPosition lookForRegion(IrisRegion reg, long timeout, Consumer<Integer> triesc) {
if (getWorld().hasRealWorld()) { if(getWorld().hasRealWorld()) {
Iris.error("Cannot GOTO without a bound world (headless mode)"); Iris.error("Cannot GOTO without a bound world (headless mode)");
return null; return null;
} }
@ -650,7 +649,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
long s = M.ms(); long s = M.ms();
int cpus = (Runtime.getRuntime().availableProcessors()); int cpus = (Runtime.getRuntime().availableProcessors());
if (!getDimension().getRegions().contains(reg.getLoadKey())) { if(!getDimension().getRegions().contains(reg.getLoadKey())) {
return null; return null;
} }
@ -659,25 +658,25 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
AtomicBoolean running = new AtomicBoolean(true); AtomicBoolean running = new AtomicBoolean(true);
AtomicReference<IrisPosition> location = new AtomicReference<>(); AtomicReference<IrisPosition> location = new AtomicReference<>();
for (int i = 0; i < cpus; i++) { for(int i = 0; i < cpus; i++) {
J.a(() -> { J.a(() -> {
Engine e; Engine e;
IrisRegion b; IrisRegion b;
int x, z; int x, z;
while (!found.get() && running.get()) { while(!found.get() && running.get()) {
try { try {
x = RNG.r.i(-29999970, 29999970); x = RNG.r.i(-29999970, 29999970);
z = RNG.r.i(-29999970, 29999970); z = RNG.r.i(-29999970, 29999970);
b = getRegion(x, z); b = getRegion(x, z);
if (b != null && b.getLoadKey() != null && b.getLoadKey().equals(reg.getLoadKey())) { if(b != null && b.getLoadKey() != null && b.getLoadKey().equals(reg.getLoadKey())) {
found.lazySet(true); found.lazySet(true);
location.lazySet(new IrisPosition(x, getHeight(x, z), z)); location.lazySet(new IrisPosition(x, getHeight(x, z), z));
} }
tries.getAndIncrement(); tries.getAndIncrement();
} catch (Throwable xe) { } catch(Throwable xe) {
Iris.reportError(xe); Iris.reportError(xe);
xe.printStackTrace(); xe.printStackTrace();
return; return;
@ -686,14 +685,14 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
}); });
} }
while (!found.get() || location.get() != null) { while(!found.get() || location.get() != null) {
J.sleep(50); J.sleep(50);
if (cl.flip()) { if(cl.flip()) {
triesc.accept(tries.get()); triesc.accept(tries.get());
} }
if (M.ms() - s > timeout) { if(M.ms() - s > timeout) {
triesc.accept(tries.get()); triesc.accept(tries.get());
running.set(false); running.set(false);
return null; return null;
@ -714,7 +713,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
boolean isStudio(); boolean isStudio();
default IrisBiome getBiome(int x, int y, int z) { default IrisBiome getBiome(int x, int y, int z) {
if (y <= getHeight(x, z) - 2) { if(y <= getHeight(x, z) - 2) {
return getCaveBiome(x, z); return getCaveBiome(x, z);
} }
@ -722,7 +721,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
} }
default IrisBiome getBiomeOrMantle(int x, int y, int z) { default IrisBiome getBiomeOrMantle(int x, int y, int z) {
if (y <= getHeight(x, z) - 2) { if(y <= getHeight(x, z) - 2) {
return getCaveOrMantleBiome(x, y, z); return getCaveOrMantleBiome(x, y, z);
} }
@ -732,7 +731,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
default String getObjectPlacementKey(int x, int y, int z) { default String getObjectPlacementKey(int x, int y, int z) {
PlacedObject o = getObjectPlacement(x, y, z); PlacedObject o = getObjectPlacement(x, y, z);
if (o != null && o.getObject() != null) { if(o != null && o.getObject() != null) {
return o.getObject().getLoadKey() + "@" + o.getId(); return o.getObject().getLoadKey() + "@" + o.getId();
} }
@ -742,7 +741,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
default PlacedObject getObjectPlacement(int x, int y, int z) { default PlacedObject getObjectPlacement(int x, int y, int z) {
String objectAt = getMantle().getMantle().get(x, y, z, String.class); String objectAt = getMantle().getMantle().get(x, y, z, String.class);
if (objectAt == null || objectAt.isEmpty()) { if(objectAt == null || objectAt.isEmpty()) {
return null; return null;
} }
@ -751,16 +750,16 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
int id = Integer.parseInt(v[1]); int id = Integer.parseInt(v[1]);
IrisRegion region = getRegion(x, z); IrisRegion region = getRegion(x, z);
for (IrisObjectPlacement i : region.getObjects()) { for(IrisObjectPlacement i : region.getObjects()) {
if (i.getPlace().contains(object)) { if(i.getPlace().contains(object)) {
return new PlacedObject(i, getData().getObjectLoader().load(object), id, x, z); return new PlacedObject(i, getData().getObjectLoader().load(object), id, x, z);
} }
} }
IrisBiome biome = getBiome(x, y, z); IrisBiome biome = getBiome(x, y, z);
for (IrisObjectPlacement i : biome.getObjects()) { for(IrisObjectPlacement i : biome.getObjects()) {
if (i.getPlace().contains(object)) { if(i.getPlace().contains(object)) {
return new PlacedObject(i, getData().getObjectLoader().load(object), id, x, z); return new PlacedObject(i, getData().getObjectLoader().load(object), id, x, z);
} }
} }
@ -786,7 +785,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
-> regionKeys.contains(getRegion((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey()) -> regionKeys.contains(getRegion((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())
&& lb.matches(engine, chunk); && lb.matches(engine, chunk);
if (!regionKeys.isEmpty()) { if(!regionKeys.isEmpty()) {
locator.find(player); locator.find(player);
} else { } else {
player.sendMessage(C.RED + biome.getName() + " is not in any defined regions!"); player.sendMessage(C.RED + biome.getName() + " is not in any defined regions!");
@ -794,10 +793,10 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
} }
default void gotoJigsaw(IrisJigsawStructure s, Player player) { default void gotoJigsaw(IrisJigsawStructure s, Player player) {
if (s.getLoadKey().equals(getDimension().getStronghold())) { if(s.getLoadKey().equals(getDimension().getStronghold())) {
KList<Position2> p = getDimension().getStrongholds(getSeedManager().getSpawn()); KList<Position2> p = getDimension().getStrongholds(getSeedManager().getSpawn());
if (p.isEmpty()) { if(p.isEmpty()) {
player.sendMessage(C.GOLD + "No strongholds in world."); player.sendMessage(C.GOLD + "No strongholds in world.");
} }
@ -807,19 +806,19 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
Iris.debug("Ps: " + p.size()); Iris.debug("Ps: " + p.size());
for (Position2 i : p) { for(Position2 i : p) {
Iris.debug("- " + i.getX() + " " + i.getZ()); Iris.debug("- " + i.getX() + " " + i.getZ());
} }
for (Position2 i : p) { for(Position2 i : p) {
double dx = i.distance(px); double dx = i.distance(px);
if (dx < d) { if(dx < d) {
d = dx; d = dx;
pr = i; pr = i;
} }
} }
if (pr != null) { if(pr != null) {
Location ll = new Location(player.getWorld(), pr.getX(), 40, pr.getZ()); Location ll = new Location(player.getWorld(), pr.getX(), 40, pr.getZ());
J.s(() -> player.teleport(ll)); J.s(() -> player.teleport(ll));
} }
@ -827,7 +826,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
return; return;
} }
if (getDimension().getJigsawStructures().stream() if(getDimension().getJigsawStructures().stream()
.map(IrisJigsawStructurePlacement::getStructure) .map(IrisJigsawStructurePlacement::getStructure)
.collect(Collectors.toSet()).contains(s.getLoadKey())) { .collect(Collectors.toSet()).contains(s.getLoadKey())) {
Locator.jigsawStructure(s.getLoadKey()).find(player); Locator.jigsawStructure(s.getLoadKey()).find(player);
@ -848,15 +847,15 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
Locator<IrisJigsawStructure> sl = Locator.jigsawStructure(s.getLoadKey()); Locator<IrisJigsawStructure> sl = Locator.jigsawStructure(s.getLoadKey());
Locator<IrisBiome> locator = (engine, chunk) -> { Locator<IrisBiome> locator = (engine, chunk) -> {
if (biomeKeys.contains(getSurfaceBiome((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) { if(biomeKeys.contains(getSurfaceBiome((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) {
return sl.matches(engine, chunk); return sl.matches(engine, chunk);
} else if (regionKeys.contains(getRegion((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) { } else if(regionKeys.contains(getRegion((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) {
return sl.matches(engine, chunk); return sl.matches(engine, chunk);
} }
return false; return false;
}; };
if (!regionKeys.isEmpty()) { if(!regionKeys.isEmpty()) {
locator.find(player); locator.find(player);
} else { } else {
player.sendMessage(C.RED + s.getLoadKey() + " is not in any defined regions, biomes or dimensions!"); player.sendMessage(C.RED + s.getLoadKey() + " is not in any defined regions, biomes or dimensions!");
@ -878,16 +877,16 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
Locator<IrisObject> sl = Locator.object(s); Locator<IrisObject> sl = Locator.object(s);
Locator<IrisBiome> locator = (engine, chunk) -> { Locator<IrisBiome> locator = (engine, chunk) -> {
if (biomeKeys.contains(getSurfaceBiome((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) { if(biomeKeys.contains(getSurfaceBiome((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) {
return sl.matches(engine, chunk); return sl.matches(engine, chunk);
} else if (regionKeys.contains(getRegion((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) { } else if(regionKeys.contains(getRegion((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8).getLoadKey())) {
return sl.matches(engine, chunk); return sl.matches(engine, chunk);
} }
return false; return false;
}; };
if (!regionKeys.isEmpty()) { if(!regionKeys.isEmpty()) {
locator.find(player); locator.find(player);
} else { } else {
player.sendMessage(C.RED + s + " is not in any defined regions or biomes!"); player.sendMessage(C.RED + s + " is not in any defined regions or biomes!");
@ -895,7 +894,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
} }
default void gotoRegion(IrisRegion r, Player player) { default void gotoRegion(IrisRegion r, Player player) {
if (!getDimension().getAllRegions(this).contains(r)) { if(!getDimension().getAllRegions(this).contains(r)) {
player.sendMessage(C.RED + r.getName() + " is not defined in the dimension!"); player.sendMessage(C.RED + r.getName() + " is not defined in the dimension!");
return; return;
} }
@ -904,7 +903,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
} }
default void cleanupMantleChunk(int x, int z) { default void cleanupMantleChunk(int x, int z) {
if (IrisSettings.get().getPerformance().isTrimMantleInStudio() || !isStudio()) { if(IrisSettings.get().getPerformance().isTrimMantleInStudio() || !isStudio()) {
J.a(() -> getMantle().cleanupChunk(x, z)); J.a(() -> getMantle().cleanupChunk(x, z));
} }
} }

View File

@ -35,7 +35,7 @@ public abstract class EngineAssignedModifier<T> extends EngineAssignedComponent
public void modify(int x, int z, Hunk<T> output, boolean multicore) { public void modify(int x, int z, Hunk<T> output, boolean multicore) {
try { try {
onModify(x, z, output, multicore); onModify(x, z, output, multicore);
} catch (Throwable e) { } catch(Throwable e) {
Iris.error("Modifier Failure: " + getName()); Iris.error("Modifier Failure: " + getName());
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -60,7 +60,7 @@ public abstract class EngineAssignedWorldManager extends EngineAssignedComponent
@EventHandler @EventHandler
public void on(IrisEngineHotloadEvent e) { public void on(IrisEngineHotloadEvent e) {
for (Player i : e.getEngine().getWorld().getPlayers()) { for(Player i : e.getEngine().getWorld().getPlayers()) {
i.playSound(i.getLocation(), Sound.BLOCK_AMETHYST_BLOCK_BREAK, 1f, 1.8f); i.playSound(i.getLocation(), Sound.BLOCK_AMETHYST_BLOCK_BREAK, 1f, 1.8f);
VolmitSender s = new VolmitSender(i); VolmitSender s = new VolmitSender(i);
s.sendTitle(C.IRIS + "Engine " + C.AQUA + "<font:minecraft:uniform>Hotloaded", 70, 60, 410); s.sendTitle(C.IRIS + "Engine " + C.AQUA + "<font:minecraft:uniform>Hotloaded", 70, 60, 410);
@ -71,34 +71,34 @@ public abstract class EngineAssignedWorldManager extends EngineAssignedComponent
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(PlayerTeleportEvent e) { public void on(PlayerTeleportEvent e) {
if (ignoreTP.get()) { if(ignoreTP.get()) {
return; return;
} }
if (!PaperLib.isPaper() || e.getTo() == null) { if(!PaperLib.isPaper() || e.getTo() == null) {
return; return;
} }
try { try {
if (e.getTo().getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getTo().getWorld().equals(getTarget().getWorld().realWorld())) {
getEngine().getWorldManager().teleportAsync(e); getEngine().getWorldManager().teleportAsync(e);
} }
} catch (Throwable ex) { } catch(Throwable ex) {
} }
} }
@EventHandler @EventHandler
public void on(WorldSaveEvent e) { public void on(WorldSaveEvent e) {
if (e.getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getWorld().equals(getTarget().getWorld().realWorld())) {
getEngine().save(); getEngine().save();
} }
} }
@EventHandler @EventHandler
public void on(EntitySpawnEvent e) { public void on(EntitySpawnEvent e) {
if (e.getEntity().getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getEntity().getWorld().equals(getTarget().getWorld().realWorld())) {
if (e.getEntityType().equals(EntityType.ENDER_SIGNAL)) { if(e.getEntityType().equals(EntityType.ENDER_SIGNAL)) {
KList<Position2> p = getEngine().getDimension().getStrongholds(getEngine().getSeedManager().getSpawn()); KList<Position2> p = getEngine().getDimension().getStrongholds(getEngine().getSeedManager().getSpawn());
Position2 px = new Position2(e.getEntity().getLocation().getBlockX(), e.getEntity().getLocation().getBlockZ()); Position2 px = new Position2(e.getEntity().getLocation().getBlockX(), e.getEntity().getLocation().getBlockZ());
Position2 pr = null; Position2 pr = null;
@ -106,19 +106,19 @@ public abstract class EngineAssignedWorldManager extends EngineAssignedComponent
Iris.debug("Ps: " + p.size()); Iris.debug("Ps: " + p.size());
for (Position2 i : p) { for(Position2 i : p) {
Iris.debug("- " + i.getX() + " " + i.getZ()); Iris.debug("- " + i.getX() + " " + i.getZ());
} }
for (Position2 i : p) { for(Position2 i : p) {
double dx = i.distance(px); double dx = i.distance(px);
if (dx < d) { if(dx < d) {
d = dx; d = dx;
pr = i; pr = i;
} }
} }
if (pr != null) { if(pr != null) {
e.getEntity().getWorld().playSound(e.getEntity().getLocation(), Sound.ITEM_TRIDENT_THROW, 1f, 1.6f); e.getEntity().getWorld().playSound(e.getEntity().getLocation(), Sound.ITEM_TRIDENT_THROW, 1f, 1.6f);
Location ll = new Location(e.getEntity().getWorld(), pr.getX(), 40, pr.getZ()); Location ll = new Location(e.getEntity().getWorld(), pr.getX(), 40, pr.getZ());
Iris.debug("ESignal: " + ll.getBlockX() + " " + ll.getBlockZ()); Iris.debug("ESignal: " + ll.getBlockX() + " " + ll.getBlockZ());
@ -130,28 +130,28 @@ public abstract class EngineAssignedWorldManager extends EngineAssignedComponent
@EventHandler @EventHandler
public void on(WorldUnloadEvent e) { public void on(WorldUnloadEvent e) {
if (e.getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getWorld().equals(getTarget().getWorld().realWorld())) {
getEngine().close(); getEngine().close();
} }
} }
@EventHandler @EventHandler
public void on(BlockBreakEvent e) { public void on(BlockBreakEvent e) {
if (e.getPlayer().getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getPlayer().getWorld().equals(getTarget().getWorld().realWorld())) {
onBlockBreak(e); onBlockBreak(e);
} }
} }
@EventHandler @EventHandler
public void on(BlockPlaceEvent e) { public void on(BlockPlaceEvent e) {
if (e.getPlayer().getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getPlayer().getWorld().equals(getTarget().getWorld().realWorld())) {
onBlockPlace(e); onBlockPlace(e);
} }
} }
@EventHandler @EventHandler
public void on(ChunkLoadEvent e) { public void on(ChunkLoadEvent e) {
if (e.getChunk().getWorld().equals(getTarget().getWorld().realWorld())) { if(e.getChunk().getWorld().equals(getTarget().getWorld().realWorld())) {
onChunkLoad(e.getChunk(), e.isNewChunk()); onChunkLoad(e.getChunk(), e.isNewChunk());
} }
} }

View File

@ -39,10 +39,10 @@ public interface EngineComponent {
default void close() { default void close() {
try { try {
if (this instanceof Listener) { if(this instanceof Listener) {
Iris.instance.unregisterListener((Listener) this); Iris.instance.unregisterListener((Listener) this);
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }

View File

@ -38,7 +38,7 @@ public class EngineData {
try { try {
f.getParentFile().mkdirs(); f.getParentFile().mkdirs();
return new Gson().fromJson(IO.readAll(f), EngineData.class); return new Gson().fromJson(IO.readAll(f), EngineData.class);
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -50,7 +50,7 @@ public class EngineData {
try { try {
f.getParentFile().mkdirs(); f.getParentFile().mkdirs();
IO.writeAll(f, new Gson().toJson(this)); IO.writeAll(f, new Gson().toJson(this));
} catch (IOException e) { } catch(IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -36,7 +36,7 @@ public interface EngineDecorator extends EngineComponent {
@SuppressWarnings("BooleanMethodIsAlwaysInverted") @SuppressWarnings("BooleanMethodIsAlwaysInverted")
default boolean canGoOn(BlockData decorant, BlockData atop) { default boolean canGoOn(BlockData decorant, BlockData atop) {
if (atop == null || B.isAir(atop)) { if(atop == null || B.isAir(atop)) {
return false; return false;
} }

View File

@ -41,7 +41,7 @@ public interface EngineMode extends Staged {
BurstExecutor e = burst().burst(stages.length); BurstExecutor e = burst().burst(stages.length);
e.setMulticore(multicore); e.setMulticore(multicore);
for (EngineStage i : stages) { for(EngineStage i : stages) {
e.queue(() -> i.generate(x, z, blocks, biomes, multicore)); e.queue(() -> i.generate(x, z, blocks, biomes, multicore));
} }
@ -63,7 +63,7 @@ public interface EngineMode extends Staged {
@BlockCoordinates @BlockCoordinates
default void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore) { default void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore) {
for (EngineStage i : getStages()) { for(EngineStage i : getStages()) {
i.generate(x, z, blocks, biomes, multicore); i.generate(x, z, blocks, biomes, multicore);
} }
} }

View File

@ -49,22 +49,22 @@ public class EnginePlayer {
sample(); sample();
J.a(() -> { J.a(() -> {
if (region != null) { if(region != null) {
for (IrisEffect j : region.getEffects()) { for(IrisEffect j : region.getEffects()) {
try { try {
j.apply(player, getEngine()); j.apply(player, getEngine());
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
} }
} }
if (biome != null) { if(biome != null) {
for (IrisEffect j : biome.getEffects()) { for(IrisEffect j : biome.getEffects()) {
try { try {
j.apply(player, getEngine()); j.apply(player, getEngine());
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }
@ -79,12 +79,12 @@ public class EnginePlayer {
public void sample() { public void sample() {
try { try {
if (ticksSinceLastSample() > 55 && player.getLocation().distanceSquared(lastLocation) > 9 * 9) { if(ticksSinceLastSample() > 55 && player.getLocation().distanceSquared(lastLocation) > 9 * 9) {
lastLocation = player.getLocation().clone(); lastLocation = player.getLocation().clone();
lastSample = M.ms(); lastSample = M.ms();
sampleBiomeRegion(); sampleBiomeRegion();
} }
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
} }

View File

@ -28,7 +28,7 @@ public interface EngineStage {
void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore); void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore);
default void close() { default void close() {
if (this instanceof EngineComponent c) { if(this instanceof EngineComponent c) {
c.close(); c.close();
} }
} }

View File

@ -24,7 +24,7 @@ public interface Fallible {
default void fail(String error) { default void fail(String error) {
try { try {
throw new RuntimeException(); throw new RuntimeException();
} catch (Throwable e) { } catch(Throwable e) {
Iris.reportError(e); Iris.reportError(e);
fail(error, e); fail(error, e);
} }

Some files were not shown because too many files have changed in this diff Show More