From 393cb362db5cdf5ddfc2dfd2fbb3bb76c06bfa3d Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 28 Apr 2024 11:22:10 +0200 Subject: [PATCH] - "Hey stop that! Its my World not yours." - Safeguard displays itself before the worlds now. - TODO: Minimize jar 7.5 MB > Under Spigots limit --- build.gradle | 5 ++ core/src/main/java/com/volmit/iris/Iris.java | 60 ++++++++++--------- .../iris/core/commands/CommandIris.java | 4 +- .../com/volmit/iris/core/nms/INMSBinding.java | 5 +- .../iris/core/nms/v1X/NMSBinding1X.java | 42 +++++++++++++ .../iris/core/safeguard/IrisSafeguard.java | 60 +++++++++++++++++-- .../volmit/iris/core/safeguard/ModesSFG.java | 25 ++++---- .../iris/core/safeguard/ServerBootSFG.java | 6 +- .../volmit/iris/core/safeguard/UtilsSFG.java | 4 +- .../volmit/iris/core/tools/IrisCreator.java | 1 - .../engine/platform/BukkitChunkGenerator.java | 11 ++++ .../iris/core/nms/v1_19_R1/NMSBinding.java | 41 +++++++++++++ .../iris/core/nms/v1_19_R2/NMSBinding.java | 41 +++++++++++++ .../iris/core/nms/v1_19_R3/NMSBinding.java | 41 +++++++++++++ .../iris/core/nms/v1_20_R1/NMSBinding.java | 41 +++++++++++++ .../iris/core/nms/v1_20_R2/NMSBinding.java | 41 +++++++++++++ .../iris/core/nms/v1_20_R3/NMSBinding.java | 51 +++++++++++++--- 17 files changed, 418 insertions(+), 61 deletions(-) diff --git a/build.gradle b/build.gradle index 77c48256c..5fa43d0c1 100644 --- a/build.gradle +++ b/build.gradle @@ -186,6 +186,8 @@ shadowJar { //minimize() append("plugin.yml") relocate 'com.dfsek.paralithic', 'com.volmit.iris.util.paralithic' + relocate 'net.bytebuddy:byte-buddy:1.14.14', 'com.volmit.iris.util.bytecodeModifications' + relocate 'net.bytebuddy:byte-buddy-agent:1.12.8', 'com.volmit.iris.util.bytecodeModifications' relocate 'io.papermc.lib', 'com.volmit.iris.util.paper' relocate 'net.kyori', 'com.volmit.iris.util.kyori' archiveFileName.set("Iris-${project.version}.jar") @@ -237,6 +239,9 @@ allprojects { implementation "net.kyori:adventure-text-minimessage:4.13.1" implementation 'net.kyori:adventure-platform-bukkit:4.3.2' implementation 'net.kyori:adventure-api:4.13.1' + + implementation 'net.bytebuddy:byte-buddy:1.14.14' + implementation 'net.bytebuddy:byte-buddy-agent:1.12.8' //implementation 'org.bytedeco:javacpp:1.5.10' //implementation 'org.bytedeco:cuda-platform:12.3-8.9-1.5.10' compileOnly 'io.lumine:Mythic-Dist:5.2.1' diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 9fc6ecfd8..dbe796d4f 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -64,6 +64,7 @@ import com.volmit.iris.util.scheduling.Queue; import com.volmit.iris.util.scheduling.ShurikenQueue; import io.papermc.lib.PaperLib; import lombok.Getter; +import net.bytebuddy.agent.ByteBuddyAgent; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.serializer.ComponentSerializer; import org.bukkit.*; @@ -122,10 +123,6 @@ public class Iris extends VolmitPlugin implements Listener { } } - public Iris() { - System.out.println("Hello!"); - } - private final KList postShutdown = new KList<>(); private KMap, IrisService> services; @@ -458,14 +455,18 @@ public class Iris extends VolmitPlugin implements Listener { } private void enable() { instance = this; + InitializeSafeguard(); + ByteBuddyAgent.install(); boolean configured; services = new KMap<>(); setupAudience(); initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class) i.getClass(), (IrisService) i)); INMS.get(); IO.delete(new File("iris")); - IrisSafeguardSystem(); + IrisSafeguard.instance.IrisSafeguardSystem(); getSender().setTag(getTag()); + INMS.get().injectBukkit(); + if (IrisSafeguard.instance.unstablemode && !IrisSafeguard.instance.acceptUnstable) IrisSafeguard.instance.earlySplash(); compat = IrisCompat.configured(getDataFile("compat.json")); linkMultiverseCore = new MultiverseCoreLink(); linkMythicMobs = new MythicMobsLink(); @@ -473,22 +474,27 @@ public class Iris extends VolmitPlugin implements Listener { services.values().forEach(IrisService::onEnable); services.values().forEach(this::registerListener); configured = ServerConfigurator.postConfigure(); - J.s(() -> { - J.a(() -> PaperLib.suggestPaper(this)); - J.a(() -> IO.delete(getTemp())); - J.a(LazyPregenerator::loadLazyGenerators, 100); - J.a(this::bstats); - J.ar(this::checkConfigHotload, 60); - J.sr(this::tickQueue, 0); - J.s(this::setupPapi); - if (!configured) J.a(ServerConfigurator::configure, 20); - splash(); - UtilsSFG.splash(); - autoStartStudio(); - checkForBukkitWorlds(); - IrisToolbelt.retainMantleDataForSlice(String.class.getCanonicalName()); - IrisToolbelt.retainMantleDataForSlice(BlockData.class.getCanonicalName()); - }); + if (!IrisSafeguard.instance.acceptUnstable && IrisSafeguard.instance.unstablemode) { + Iris.info(C.RED + "World loading has been disabled until the incompatibility is resolved."); + Iris.info(C.DARK_RED + "Alternatively, go to plugins/iris/settings.json and set ignoreBootMode to true."); + } else { + J.s(() -> { + J.a(() -> PaperLib.suggestPaper(this)); + J.a(() -> IO.delete(getTemp())); + J.a(LazyPregenerator::loadLazyGenerators, 100); + J.a(this::bstats); + J.ar(this::checkConfigHotload, 60); + J.sr(this::tickQueue, 0); + J.s(this::setupPapi); + if (!configured) J.a(ServerConfigurator::configure, 20); + splash(); + UtilsSFG.splash(); + autoStartStudio(); + checkForBukkitWorlds(); + IrisToolbelt.retainMantleDataForSlice(String.class.getCanonicalName()); + IrisToolbelt.retainMantleDataForSlice(BlockData.class.getCanonicalName()); + }); + } } private void checkForBukkitWorlds() { @@ -602,10 +608,10 @@ public class Iris extends VolmitPlugin implements Listener { @Override public String getTag(String subTag) { - if (unstablemode) { + if (IrisSafeguard.instance.unstablemode) { return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.RED + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": "; } - if (warningmode) { + if (IrisSafeguard.instance.warningmode) { return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.GOLD + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": "; } return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.IRIS + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": "; @@ -753,10 +759,10 @@ public class Iris extends VolmitPlugin implements Listener { String padd = Form.repeat(" ", 8); String padd2 = Form.repeat(" ", 4); String[] info = {"", "", "", "", "", padd2 + C.IRIS + " Iris", padd2 + C.GRAY + " by " + "Volmit Software", padd2 + C.GRAY + " v" + C.IRIS + getDescription().getVersion()}; - if (unstablemode) { + if (IrisSafeguard.instance.unstablemode) { info = new String[]{"", "", "", "", "", padd2 + C.RED + " Iris", padd2 + C.GRAY + " by " + C.DARK_RED + "Volmit Software", padd2 + C.GRAY + " v" + C.RED + getDescription().getVersion()}; } - if (warningmode) { + if (IrisSafeguard.instance.warningmode) { info = new String[]{"", "", "", "", "", padd2 + C.GOLD + " Iris", padd2 + C.GRAY + " by " + C.GOLD + "Volmit Software", padd2 + C.GRAY + " v" + C.GOLD + getDescription().getVersion()}; } @@ -801,9 +807,9 @@ public class Iris extends VolmitPlugin implements Listener { padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@" }; String[] splash; - if (unstablemode) { + if (IrisSafeguard.instance.unstablemode) { splash = splashunstable; - } else if (warningmode) { + } else if (IrisSafeguard.instance.warningmode) { splash = splashwarning; } else { splash = splashstable; diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java index ad77d9268..6e282777b 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -22,6 +22,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.pregenerator.ChunkUpdater; +import com.volmit.iris.core.safeguard.IrisSafeguard; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisBenchmarking; import com.volmit.iris.core.tools.IrisToolbelt; @@ -63,7 +64,6 @@ import java.util.List; import static com.volmit.iris.Iris.service; import static com.volmit.iris.core.service.EditSVC.deletingWorld; import static com.volmit.iris.core.tools.IrisBenchmarking.inProgress; -import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; import static com.volmit.iris.core.safeguard.ServerBootSFG.incompatibilities; import static org.bukkit.Bukkit.getServer; @@ -105,7 +105,7 @@ public class CommandIris implements DecreeExecutor { sender().sendMessage(C.RED + UtilsSFG.MSGIncompatibleWarnings()); sender().sendMessage(C.RED + "----------------------------------------------------------------"); } - if (unstablemode && !incompatibilities.get("Multiverse-Core")) { + if (IrisSafeguard.instance.unstablemode && !incompatibilities.get("Multiverse-Core")) { sender().sendMessage(C.RED + "Your server is experiencing an incompatibility with the Iris plugin."); sender().sendMessage(C.RED + "Please rectify this problem to avoid further complications."); sender().sendMessage(C.RED + "----------------------------------------------------------------"); diff --git a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index a5979c290..53c71a833 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -19,10 +19,8 @@ package com.volmit.iris.core.nms; import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.IrisEntity; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer; @@ -37,7 +35,6 @@ import org.bukkit.entity.Dolphin; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.generator.ChunkGenerator; import org.bukkit.inventory.ItemStack; @@ -117,4 +114,6 @@ public interface INMSBinding { Entity spawnEntity(Location location, EntityType type, CreatureSpawnEvent.SpawnReason reason); boolean loadDatapack(File datapackFolder); + + void injectBukkit(); } diff --git a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java index 467e2e6e3..77e8e18de 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java +++ b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java @@ -18,20 +18,27 @@ package com.volmit.iris.core.nms.v1X; +import com.google.common.base.Preconditions; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BlockPos; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer; import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess; import com.volmit.iris.util.nbt.tag.CompoundTag; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import net.bytebuddy.matcher.ElementMatchers; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.WorldCreator; import org.bukkit.block.Biome; import org.bukkit.entity.Dolphin; import org.bukkit.entity.Entity; @@ -232,4 +239,39 @@ public class NMSBinding1X implements INMSBinding { Iris.error("Cannot use the global data palette! Iris is incapable of using MCA generation on this version of minecraft!"); return null; } + + public void injectBukkit() { + try { + Iris.info("Injecting Bukkit"); + new ByteBuddy() + .redefine(WorldCreator.class) + .visit(Advice.to(WorldCreatorAdvice.class).on(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(String.class)))) + .make() + .load(WorldCreator.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + Iris.info("Injected Bukkit Successfully!"); + } catch (Exception e) { + Iris.info(C.RED + "Failed to Inject Bukkit!"); + e.printStackTrace(); + Iris.reportError(e); + } + + } + + private static class WorldCreatorAdvice { + @Advice.OnMethodEnter + static void enter(@Advice.Argument(0) String name) { + File isIrisWorld = new File(name, "iris"); + boolean isFromIris = false; + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : stackTrace) { + if (stack.getClassName().contains("Iris")) { + isFromIris = true; + break; + } + } + if (!isFromIris) { + Preconditions.checkArgument(!isIrisWorld.exists(), "Only Iris can load Iris Worlds!"); + } + } + } } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index 4fb25371a..88f773778 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -1,15 +1,67 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.nms.INMS; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.misc.getHardware; public class IrisSafeguard { - public static boolean unstablemode = false; - public static boolean warningmode = false; - public static boolean stablemode = false; + public static IrisSafeguard instance; + public boolean acceptUnstable = false; + public boolean unstablemode = false; + public boolean warningmode = false; + public boolean stablemode = false; - public static void IrisSafeguardSystem() { + public static void InitializeSafeguard() { + instance = new IrisSafeguard(); + } + + public void IrisSafeguardSystem() { + acceptUnstable = IrisSettings.get().getGeneral().ignoreBootMode; Iris.info("Enabled Iris SafeGuard"); ServerBootSFG.BootCheck(); } + + public void earlySplash() { + String padd = Form.repeat(" ", 8); + String padd2 = Form.repeat(" ", 4); + String[] info = new String[]{"", "", "", "", "", padd2 + C.RED + " Iris", padd2 + C.GRAY + " by " + C.DARK_RED + "Volmit Software", padd2 + C.GRAY + " v" + C.RED + Iris.instance.getDescription().getVersion()}; + String[] splashunstable = { + padd + C.GRAY + " @@@@@@@@@@@@@@" + C.DARK_GRAY + "@@@", + padd + C.GRAY + " @@&&&&&&&&&" + C.DARK_GRAY + "&&&&&&" + C.RED + " .(((()))). ", + padd + C.GRAY + "@@@&&&&&&&&" + C.DARK_GRAY + "&&&&&" + C.RED + " .((((((())))))). ", + padd + C.GRAY + "@@@&&&&&" + C.DARK_GRAY + "&&&&&&&" + C.RED + " ((((((((())))))))) " + C.GRAY + " @", + padd + C.GRAY + "@@@&&&&" + C.DARK_GRAY + "@@@@@&" + C.RED + " ((((((((-))))))))) " + C.GRAY + " @@", + padd + C.GRAY + "@@@&&" + C.RED + " ((((((({ })))))))) " + C.GRAY + " &&@@@", + padd + C.GRAY + "@@" + C.RED + " ((((((((-))))))))) " + C.DARK_GRAY + "&@@@@@" + C.GRAY + "&&&&@@@", + padd + C.GRAY + "@" + C.RED + " ((((((((())))))))) " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&@@@", + padd + C.GRAY + "" + C.RED + " '((((((()))))))' " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&&@@@", + padd + C.GRAY + "" + C.RED + " '(((())))' " + C.DARK_GRAY + "&&&&&&&&" + C.GRAY + "&&&&&&&@@", + padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@" + }; + + for (int i = 0; i < info.length; i++) { + splashunstable[i] += info[i]; + } + Iris.info("Java: " + Iris.instance.getJava()); + if (!Iris.instance.getServer().getVersion().contains("Purpur")) { + if (Iris.instance.getServer().getVersion().contains("Spigot") && Iris.instance.getServer().getVersion().contains("Bukkit")) { + Iris.info(C.RED + " Iris requires paper or above to function properly.."); + } else { + Iris.info(C.YELLOW + "Purpur is recommended to use with iris."); + } + } + if (getHardware.getProcessMemory() < 5999) { + Iris.warn("6GB+ Ram is recommended"); + Iris.warn("Process Memory: " + getHardware.getProcessMemory() + " MB"); + } + Iris.info("Custom Biomes: " + INMS.get().countCustomBiomes()); + Iris.info("\n\n " + new KList<>(splashunstable).toString("\n") + "\n"); + UtilsSFG.splash(); + + } } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java index e9774ceff..5feb5868c 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java @@ -3,18 +3,20 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitScheduler; public class ModesSFG { public static void selectMode() { - if (IrisSafeguard.unstablemode) { + if (IrisSafeguard.instance.unstablemode) { Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); unstable(); } - if (IrisSafeguard.warningmode) { + if (IrisSafeguard.instance.warningmode) { Iris.safeguard(C.GOLD + "Iris is running in Warning Mode"); warning(); } - if (IrisSafeguard.stablemode) { + if (IrisSafeguard.instance.stablemode) { stable(); } } @@ -27,7 +29,7 @@ public class ModesSFG { UtilsSFG.printIncompatibleWarnings(); - if (IrisSafeguard.unstablemode) { + if (IrisSafeguard.instance.unstablemode) { Iris.info(""); Iris.info(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--"); Iris.info(C.RED + "Iris is running in unstable mode which may cause the following issues:"); @@ -48,23 +50,22 @@ public class ModesSFG { Iris.info(C.DARK_RED + "Boot Unstable is set to true, continuing with the startup process."); } else { Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreBootMode to true if you wish to proceed."); - while (true) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // no - } + Iris.info(C.DARK_RED + "Shutting down server in " + C.UNDERLINE + "" + C.DARK_RED + "50 Seconds"); + try { + Thread.sleep(50000); + Bukkit.shutdown(); + } catch (Exception ignored) { } } - Iris.info(""); } + Iris.info(""); } public static void warning() { UtilsSFG.printIncompatibleWarnings(); - if (IrisSafeguard.warningmode) { + if (IrisSafeguard.instance.warningmode) { Iris.info(""); Iris.info(C.DARK_GRAY + "--==<" + C.GOLD + " IMPORTANT " + C.DARK_GRAY + ">==--"); Iris.info(C.GOLD + "Iris is running in warning mode which may cause the following issues:"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 754744e41..853ca91ba 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -110,16 +110,16 @@ public class ServerBootSFG { safeguardPassed = (severityHigh == 0 && severityMedium == 0 && severityLow == 0); count = severityHigh + severityMedium + severityLow; if (safeguardPassed) { - stablemode = true; + IrisSafeguard.instance.stablemode = true; Iris.safeguard("Stable mode has been activated."); } if (!safeguardPassed) { if (severityMedium >= 1 && severityHigh == 0) { - warningmode = true; + IrisSafeguard.instance.warningmode = true; Iris.safeguard("Warning mode has been activated."); } if (severityHigh >= 1) { - unstablemode = true; + IrisSafeguard.instance.unstablemode = true; Iris.safeguard("Unstable mode has been activated."); } } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index 11516c028..bacb71e2e 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -14,10 +14,10 @@ public class UtilsSFG { if (ServerBootSFG.safeguardPassed) { Iris.safeguard(C.BLUE + "0 Conflicts found"); } else { - if (IrisSafeguard.unstablemode) { + if (IrisSafeguard.instance.unstablemode) { Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found"); } - if (IrisSafeguard.warningmode) { + if (IrisSafeguard.instance.warningmode) { Iris.safeguard(C.YELLOW + "" + ServerBootSFG.count + " Conflicts found"); } diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java index 6096582d2..73ce06bb5 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java @@ -46,7 +46,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; -import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; /** * Makes it a lot easier to setup an engine, world, studio or whatever diff --git a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java index ce0bebd74..ad0f5c86a 100644 --- a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java +++ b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java @@ -21,6 +21,7 @@ package com.volmit.iris.engine.platform; import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.nms.INMS; +import com.volmit.iris.core.safeguard.IrisSafeguard; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.engine.IrisEngine; import com.volmit.iris.engine.data.chunk.TerrainChunk; @@ -32,6 +33,7 @@ import com.volmit.iris.engine.object.StudioMode; import com.volmit.iris.engine.platform.studio.StudioGenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.data.IrisBiomeStorage; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.hunk.view.BiomeGridHunkHolder; import com.volmit.iris.util.hunk.view.ChunkDataHunkHolder; @@ -263,6 +265,15 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun } private Engine getEngine(WorldInfo world) { +// if (!IrisSafeguard.instance.acceptUnstable && IrisSafeguard.instance.unstablemode) { +// Iris.info(C.RED + "------------------------------------------------------------"); +// Iris.info(C.DARK_RED + "Cancelled World Loading of " + world.getName() + "!"); +// Iris.info(C.RED + "World loading has been disabled until the incompatibility is resolved."); +// Iris.info(C.DARK_RED + "Alternatively, go to plugins/iris/settings.json and set ignoreBootMode to true."); +// Iris.info(C.RED + "------------------------------------------------------------"); +// return null; +// } + if (setup.get()) { return getEngine(); } diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java index 2ee995365..ca74aad02 100644 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java +++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java @@ -16,11 +16,17 @@ import java.util.Map; import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; +import com.google.common.base.Preconditions; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; import com.mojang.serialization.Lifecycle; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.io.IO; import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import net.bytebuddy.matcher.ElementMatchers; import net.minecraft.core.MappedRegistry; import net.minecraft.resources.ResourceKey; import net.minecraft.util.GsonHelper; @@ -700,4 +706,39 @@ public class NMSBinding implements INMSBinding { } } } + + public void injectBukkit() { + try { + Iris.info("Injecting Bukkit"); + new ByteBuddy() + .redefine(WorldCreator.class) + .visit(Advice.to(WorldCreatorAdvice.class).on(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(String.class)))) + .make() + .load(WorldCreator.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + Iris.info("Injected Bukkit Successfully!"); + } catch (Exception e) { + Iris.info(C.RED + "Failed to Inject Bukkit!"); + e.printStackTrace(); + Iris.reportError(e); + } + + } + + private static class WorldCreatorAdvice { + @Advice.OnMethodEnter + static void enter(@Advice.Argument(0) String name) { + File isIrisWorld = new File(name, "iris"); + boolean isFromIris = false; + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : stackTrace) { + if (stack.getClassName().contains("Iris")) { + isFromIris = true; + break; + } + } + if (!isFromIris) { + Preconditions.checkArgument(!isIrisWorld.exists(), "Only Iris can load Iris Worlds!"); + } + } + } } diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java index d778e3f7f..c58eb3143 100644 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java @@ -16,11 +16,17 @@ import java.util.Map; import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; +import com.google.common.base.Preconditions; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; import com.mojang.serialization.Lifecycle; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.io.IO; import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import net.bytebuddy.matcher.ElementMatchers; import net.minecraft.core.MappedRegistry; import net.minecraft.resources.ResourceKey; import net.minecraft.util.GsonHelper; @@ -701,4 +707,39 @@ public class NMSBinding implements INMSBinding { } } } + + public void injectBukkit() { + try { + Iris.info("Injecting Bukkit"); + new ByteBuddy() + .redefine(WorldCreator.class) + .visit(Advice.to(WorldCreatorAdvice.class).on(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(String.class)))) + .make() + .load(WorldCreator.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + Iris.info("Injected Bukkit Successfully!"); + } catch (Exception e) { + Iris.info(C.RED + "Failed to Inject Bukkit!"); + e.printStackTrace(); + Iris.reportError(e); + } + + } + + private static class WorldCreatorAdvice { + @Advice.OnMethodEnter + static void enter(@Advice.Argument(0) String name) { + File isIrisWorld = new File(name, "iris"); + boolean isFromIris = false; + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : stackTrace) { + if (stack.getClassName().contains("Iris")) { + isFromIris = true; + break; + } + } + if (!isFromIris) { + Preconditions.checkArgument(!isIrisWorld.exists(), "Only Iris can load Iris Worlds!"); + } + } + } } diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java index 8477866d9..bf1f82c6e 100644 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java @@ -16,11 +16,17 @@ import java.util.Map; import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; +import com.google.common.base.Preconditions; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; import com.mojang.serialization.Lifecycle; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.io.IO; import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import net.bytebuddy.matcher.ElementMatchers; import net.minecraft.core.MappedRegistry; import net.minecraft.resources.ResourceKey; import net.minecraft.util.GsonHelper; @@ -705,4 +711,39 @@ public class NMSBinding implements INMSBinding { } } } + + public void injectBukkit() { + try { + Iris.info("Injecting Bukkit"); + new ByteBuddy() + .redefine(WorldCreator.class) + .visit(Advice.to(WorldCreatorAdvice.class).on(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(String.class)))) + .make() + .load(WorldCreator.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + Iris.info("Injected Bukkit Successfully!"); + } catch (Exception e) { + Iris.info(C.RED + "Failed to Inject Bukkit!"); + e.printStackTrace(); + Iris.reportError(e); + } + + } + + private static class WorldCreatorAdvice { + @Advice.OnMethodEnter + static void enter(@Advice.Argument(0) String name) { + File isIrisWorld = new File(name, "iris"); + boolean isFromIris = false; + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : stackTrace) { + if (stack.getClassName().contains("Iris")) { + isFromIris = true; + break; + } + } + if (!isFromIris) { + Preconditions.checkArgument(!isIrisWorld.exists(), "Only Iris can load Iris Worlds!"); + } + } + } } diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java index bc3176c7f..eb4fb4162 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java @@ -1,5 +1,6 @@ package com.volmit.iris.core.nms.v1_20_R1; +import com.google.common.base.Preconditions; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; @@ -10,6 +11,7 @@ import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.json.JSONObject; @@ -22,6 +24,10 @@ import com.volmit.iris.util.nbt.mca.palette.*; import com.volmit.iris.util.nbt.tag.CompoundTag; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import net.bytebuddy.matcher.ElementMatchers; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.MappedRegistry; @@ -704,4 +710,39 @@ public class NMSBinding implements INMSBinding { } } } + + public void injectBukkit() { + try { + Iris.info("Injecting Bukkit"); + new ByteBuddy() + .redefine(WorldCreator.class) + .visit(Advice.to(WorldCreatorAdvice.class).on(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(String.class)))) + .make() + .load(WorldCreator.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + Iris.info("Injected Bukkit Successfully!"); + } catch (Exception e) { + Iris.info(C.RED + "Failed to Inject Bukkit!"); + e.printStackTrace(); + Iris.reportError(e); + } + + } + + private static class WorldCreatorAdvice { + @Advice.OnMethodEnter + static void enter(@Advice.Argument(0) String name) { + File isIrisWorld = new File(name, "iris"); + boolean isFromIris = false; + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : stackTrace) { + if (stack.getClassName().contains("Iris")) { + isFromIris = true; + break; + } + } + if (!isFromIris) { + Preconditions.checkArgument(!isIrisWorld.exists(), "Only Iris can load Iris Worlds!"); + } + } + } } diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java index 02eccb0be..2e9720472 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java @@ -16,11 +16,17 @@ import java.util.Map; import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; +import com.google.common.base.Preconditions; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; import com.mojang.serialization.Lifecycle; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.io.IO; import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import net.bytebuddy.matcher.ElementMatchers; import net.minecraft.core.MappedRegistry; import net.minecraft.util.GsonHelper; import net.minecraft.world.level.Level; @@ -706,4 +712,39 @@ public class NMSBinding implements INMSBinding { public static Holder biomeToBiomeBase(Registry registry, Biome biome) { return registry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(biome.getKey()))); } + + public void injectBukkit() { + try { + Iris.info("Injecting Bukkit"); + new ByteBuddy() + .redefine(WorldCreator.class) + .visit(Advice.to(WorldCreatorAdvice.class).on(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(String.class)))) + .make() + .load(WorldCreator.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + Iris.info("Injected Bukkit Successfully!"); + } catch (Exception e) { + Iris.info(C.RED + "Failed to Inject Bukkit!"); + e.printStackTrace(); + Iris.reportError(e); + } + + } + + private static class WorldCreatorAdvice { + @Advice.OnMethodEnter + static void enter(@Advice.Argument(0) String name) { + File isIrisWorld = new File(name, "iris"); + boolean isFromIris = false; + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : stackTrace) { + if (stack.getClassName().contains("Iris")) { + isFromIris = true; + break; + } + } + if (!isFromIris) { + Preconditions.checkArgument(!isIrisWorld.exists(), "Only Iris can load Iris Worlds!"); + } + } + } } diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index da0916120..14403b714 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -9,19 +9,20 @@ import java.io.FilenameFilter; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.IdentityHashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import com.google.common.base.Preconditions; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; import com.mojang.serialization.Lifecycle; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.io.IO; import it.unimi.dsi.fastutil.objects.Reference2IntMap; -import net.minecraft.core.IdMapper; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import net.bytebuddy.matcher.ElementMatchers; import net.minecraft.core.MappedRegistry; import net.minecraft.util.GsonHelper; import net.minecraft.world.level.Level; @@ -81,6 +82,8 @@ import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; import sun.misc.Unsafe; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + public class NMSBinding implements INMSBinding { private final KMap baseBiomeCache = new KMap<>(); private final BlockData AIR = Material.AIR.createBlockData(); @@ -542,7 +545,6 @@ public class NMSBinding implements INMSBinding { return null; } - @Override public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); @@ -707,4 +709,39 @@ public class NMSBinding implements INMSBinding { public static Holder biomeToBiomeBase(Registry registry, Biome biome) { return registry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(biome.getKey()))); } + + public void injectBukkit() { + try { + Iris.info("Injecting Bukkit"); + new ByteBuddy() + .redefine(WorldCreator.class) + .visit(Advice.to(WorldCreatorAdvice.class).on(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(String.class)))) + .make() + .load(WorldCreator.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + Iris.info("Injected Bukkit Successfully!"); + } catch (Exception e) { + Iris.info(C.RED + "Failed to Inject Bukkit!"); + e.printStackTrace(); + Iris.reportError(e); + } + + } + + private static class WorldCreatorAdvice { + @Advice.OnMethodEnter + static void enter(@Advice.Argument(0) String name) { + File isIrisWorld = new File(name, "iris"); + boolean isFromIris = false; + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : stackTrace) { + if (stack.getClassName().contains("Iris")) { + isFromIris = true; + break; + } + } + if (!isFromIris) { + Preconditions.checkArgument(!isIrisWorld.exists(), "Only Iris can load Iris Worlds!"); + } + } + } }