diff --git a/src/main/java/com/nomiceu/nomilabs/NomiLabs.java b/src/main/java/com/nomiceu/nomilabs/NomiLabs.java index fa7c9734..527e4a49 100644 --- a/src/main/java/com/nomiceu/nomilabs/NomiLabs.java +++ b/src/main/java/com/nomiceu/nomilabs/NomiLabs.java @@ -36,6 +36,10 @@ public class NomiLabs { public static final Logger LOGGER = LogManager.getLogger(LabsValues.LABS_MODID); + public NomiLabs() { + FluidRegistry.enableUniversalBucket(); + } + @EventHandler public void onConstruction(FMLConstructionEvent event) { CommonProxy.onConstruction(); @@ -74,8 +78,4 @@ public void loadComplete(FMLLoadCompleteEvent event) { public void serverStopped(FMLServerStoppedEvent event) { DataFixerHandler.close(); } - - static { - FluidRegistry.enableUniversalBucket(); - } } diff --git a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java index eaf5051e..bea94a8e 100644 --- a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java +++ b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java @@ -1,6 +1,5 @@ package com.nomiceu.nomilabs.config; -import net.minecraft.world.EnumDifficulty; import net.minecraftforge.common.config.Config; import com.cleanroommc.configanytime.ConfigAnytime; @@ -491,6 +490,8 @@ public static class Advanced { public String[] ignoreBiomes = new String[0]; @Config.Comment({ "List of Fields to be client side only, acting as @SideOnly(Side.CLIENT).", + "DOES NOT WORK WITH CLASSES FROM MINECRAFT OR FORGE!", + "Does not work with classes loaded before Nomi Labs' Static Init!", "Do not change unless you know what you are doing!", "Helps with fixing GrS errors Server Side.", "Format: @", @@ -503,6 +504,8 @@ public static class Advanced { public String[] clientSideFields = new String[0]; @Config.Comment({ "List of Methods to be client side only, acting as @SideOnly(Side.CLIENT).", + "DOES NOT WORK WITH CLASSES FROM MINECRAFT OR FORGE!", + "Does not work with classes loaded before Nomi Labs' Static Init!", "Do not change unless you know what you are doing!", "Helps with fixing GrS errors Server Side.", "Format: @@", @@ -515,6 +518,8 @@ public static class Advanced { public String[] clientSideMethods = new String[0]; @Config.Comment({ "List of Fields to be server side only, acting as @SideOnly(Side.SERVER).", + "DOES NOT WORK WITH CLASSES FROM MINECRAFT OR FORGE!", + "Does not work with classes loaded before Nomi Labs' Static Init!", "Do not change unless you know what you are doing!", "Helps with fixing GrS errors Client Side.", "Format: @", @@ -527,6 +532,8 @@ public static class Advanced { public String[] serverSideFields = new String[0]; @Config.Comment({ "List of Methods to be server side only, acting as @SideOnly(Side.SERVER).", + "DOES NOT WORK WITH CLASSES FROM MINECRAFT OR FORGE!", + "Does not work with classes loaded before Nomi Labs' Static Init!", "Do not change unless you know what you are doing!", "Helps with fixing GrS errors Client Side.", "Format: @@", @@ -714,17 +721,21 @@ public static class DifficultyOverrides { @Config.Comment({ "Difficulty (Locked) Override in Normal Mode. Does Not Apply if overrideDifficultyNormal is set to false!", - "[default: NORMAL]" }) + "Ordinal of Difficulty. Peaceful = 0, Easy = 1, Normal = 2, Hard = 3.", + "[default: 2]" }) @Config.LangKey("config.nomilabs.advanced.difficulty.normal_override") @Config.RequiresWorldRestart - public EnumDifficulty difficultyNormal = EnumDifficulty.NORMAL; + @Config.RangeInt(min = 0, max = 3) + public int difficultyNormal = 2; @Config.Comment({ "Difficulty (Locked) Override in Expert Mode. Does Not Apply if overrideDifficultyExpert is set to false!", - "[default: NORMAL]" }) + "Ordinal of Difficulty. Peaceful = 0, Easy = 1, Normal = 2, Hard = 3.", + "[default: 2]" }) @Config.LangKey("config.nomilabs.advanced.difficulty.expert_override") @Config.RequiresWorldRestart - public EnumDifficulty difficultyExpert = EnumDifficulty.NORMAL; + @Config.RangeInt(min = 0, max = 3) + public int difficultyExpert = 2; } } diff --git a/src/main/java/com/nomiceu/nomilabs/core/LabsCore.java b/src/main/java/com/nomiceu/nomilabs/core/LabsCore.java index 26e140f2..57efb572 100644 --- a/src/main/java/com/nomiceu/nomilabs/core/LabsCore.java +++ b/src/main/java/com/nomiceu/nomilabs/core/LabsCore.java @@ -14,7 +14,8 @@ @IFMLLoadingPlugin.Name("LabsCore") @IFMLLoadingPlugin.MCVersion(ForgeVersion.mcVersion) -@IFMLLoadingPlugin.SortingIndex(1001) +@IFMLLoadingPlugin.TransformerExclusions("com.nomiceu.nomilabs.core.") +@IFMLLoadingPlugin.SortingIndex(-1001) public class LabsCore implements IFMLLoadingPlugin, IEarlyMixinLoader { @Override diff --git a/src/main/java/com/nomiceu/nomilabs/core/LabsTransformer.java b/src/main/java/com/nomiceu/nomilabs/core/LabsTransformer.java index fe6c1086..0995ee57 100644 --- a/src/main/java/com/nomiceu/nomilabs/core/LabsTransformer.java +++ b/src/main/java/com/nomiceu/nomilabs/core/LabsTransformer.java @@ -3,41 +3,28 @@ import java.util.*; import net.minecraft.launchwrapper.IClassTransformer; -import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.relauncher.FMLLaunchHandler; import net.minecraftforge.fml.relauncher.Side; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.logging.log4j.Level; import org.objectweb.asm.*; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.FieldNode; -import org.objectweb.asm.tree.MethodNode; import com.nomiceu.nomilabs.config.LabsConfig; -/** - * @apiNote Inspired by net.minecraftforge.fml.common.asm.transformers.SideTransformer - *

- * Allows for Client/Server Only Methods to be specified via Config. - */ -@SuppressWarnings({ "unused", "deprecation" }) +@SuppressWarnings({ "unused" }) public class LabsTransformer implements IClassTransformer, Opcodes { - // Map of Class -> Pair Of Obf Mapping Lists, Left is Fields, Right is Methods - private static Map, List>> toRemove; + private static final Set excludedTwoLongPackages; + private static final Set transformableClasses; - /** - * Must setup here so FMLCommonHandler has time to load. - */ - private static void setupToRemove() { - if (toRemove != null) return; + static { + excludedTwoLongPackages = new HashSet<>(); + excludedTwoLongPackages.add("net/minecraft"); + excludedTwoLongPackages.add("net/minecraftforge"); - // Can't use Object2ObjectOpenHashMap as in ASM stage - toRemove = new HashMap<>(); + // Seperated from To Remove, to not load ObfMapping too early. + transformableClasses = new HashSet<>(); String[] methodsRemove; String[] fieldsRemove; - if (FMLLaunchHandler.side() == Side.SERVER) { // Remove CLIENT side methods & fields fieldsRemove = LabsConfig.advanced.clientSideFields; @@ -54,8 +41,7 @@ private static void setupToRemove() { throw new IllegalStateException("Invalid Field Remove: " + field + "! Must have Two Parts, Seperated by '@', Got " + parts.length + "!"); - toRemove.computeIfAbsent(parts[0], (k) -> Pair.of(new ArrayList<>(), new ArrayList<>())) - .getLeft().add(new ObfMapping(parts[0], parts[1])); + transformableClasses.add(parts[0]); } for (var method : methodsRemove) { @@ -64,71 +50,25 @@ private static void setupToRemove() { throw new IllegalStateException("Invalid Method Remove: " + method + "! Must have Three Parts, Seperated by '@', Got " + parts.length + "!"); - toRemove.computeIfAbsent(parts[0], (k) -> Pair.of(new ArrayList<>(), new ArrayList<>())) - .getRight().add(new ObfMapping(parts[0], parts[1], parts[2])); + transformableClasses.add(parts[0]); } - - FMLLog.log("LabsASM", Level.DEBUG, "Computed To Remove: %s", toRemove); } @Override public byte[] transform(String name, String transformedName, byte[] basicClass) { - setupToRemove(); - String internalName = transformedName.replace('.', '/'); - if (!toRemove.containsKey(internalName)) return basicClass; - - var pair = toRemove.get(internalName); - var fieldsRemove = pair.getLeft(); - var methodsRemove = pair.getRight(); - - ClassNode classNode = new ClassNode(); - ClassReader classReader = new ClassReader(basicClass); - classReader.accept(classNode, 0); - - for (var toRemove : fieldsRemove) { - Iterator fields = classNode.fields.iterator(); - boolean found = false; - while (fields.hasNext()) { - FieldNode field = fields.next(); - if (!toRemove.s_name.equals(field.name)) continue; - - FMLLog.log("LabsASM", Level.WARN, "Removing Field: %s.%s", classNode.name, field.name); - fields.remove(); - found = true; - break; - } - - if (!found) - throw new IllegalStateException("Could not find Field " + classNode.name + "." + toRemove.s_name + "!"); + String[] parts = internalName.split("/"); + + // Check the first two parts against the excluded packages + // Don't transform Minecraft or Forge classes, causes errors due to late loading + // Late loading required for compat with SpongeForge + if (parts.length >= 2) { + if (excludedTwoLongPackages.add(parts[0] + "/" + parts[1])) + return basicClass; } - var gatherer = new LambdaGatherer(); - for (var toRemove : methodsRemove) { - Iterator methods = classNode.methods.iterator(); - boolean found = false; - while (methods.hasNext()) { - MethodNode method = methods.next(); - if (!toRemove.matches(method)) continue; - - FMLLog.log("LabsASM", Level.WARN, "Removing Method: %s.%s%s", classNode.name, method.name, - method.desc); - methods.remove(); - gatherer.accept(method); - found = true; - break; - } - - if (!found) - throw new IllegalStateException( - "Could not find Method " + classNode.name + "." + toRemove.s_name + toRemove.s_desc + "!"); - } - - LambdaGatherer.removeDynamicLambdaMethods(gatherer, classNode); - - ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); - classNode.accept(writer); + if (!transformableClasses.contains(internalName)) return basicClass; - return writer.toByteArray(); + return SideSpecificRemover.handleTransform(internalName, basicClass); } } diff --git a/src/main/java/com/nomiceu/nomilabs/core/LambdaGatherer.java b/src/main/java/com/nomiceu/nomilabs/core/LambdaGatherer.java index d495faff..3acab56e 100644 --- a/src/main/java/com/nomiceu/nomilabs/core/LambdaGatherer.java +++ b/src/main/java/com/nomiceu/nomilabs/core/LambdaGatherer.java @@ -4,9 +4,7 @@ import java.util.List; import java.util.ListIterator; -import net.minecraftforge.fml.common.FMLLog; - -import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -17,7 +15,6 @@ /** * @apiNote net.minecraftforge.fml.common.asm.transformers.SideTransformer.LambdaGatherer */ -@SuppressWarnings("deprecation") public class LambdaGatherer extends MethodVisitor { private static final Handle META_FACTORY = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", @@ -68,7 +65,7 @@ public static void removeDynamicLambdaMethods(LambdaGatherer gatherer, ClassNode if (method.name.equals(dynamicLambdaHandle.getName()) && method.desc.equals(dynamicLambdaHandle.getDesc())) { - FMLLog.log("LabsASM", Level.WARN, "Removing Method: %s.%s%s", classNode.name, method.name, + LogManager.getLogger("LabsASM").warn("Removing Method: {}.{}{}", classNode.name, method.name, method.desc); methods.remove(); diff --git a/src/main/java/com/nomiceu/nomilabs/core/ObfMapping.java b/src/main/java/com/nomiceu/nomilabs/core/ObfMapping.java index 61f9c75d..5ec62066 100644 --- a/src/main/java/com/nomiceu/nomilabs/core/ObfMapping.java +++ b/src/main/java/com/nomiceu/nomilabs/core/ObfMapping.java @@ -8,9 +8,9 @@ import java.util.Map.Entry; import net.minecraft.launchwrapper.Launch; -import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; +import org.apache.logging.log4j.LogManager; import org.jetbrains.annotations.NotNull; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; @@ -318,7 +318,7 @@ public MCPRemapper() { Resources.readLines(mappings[1].toURI().toURL(), Charsets.UTF_8, this); Resources.readLines(mappings[2].toURI().toURL(), Charsets.UTF_8, this); } catch (IOException e) { - FMLLog.log.error("Could not instantiate Nomi Labs MCPRemapper", e); + LogManager.getLogger("LabsASM").error("Could not instantiate Nomi Labs MCPRemapper", e); } } diff --git a/src/main/java/com/nomiceu/nomilabs/core/SideSpecificRemover.java b/src/main/java/com/nomiceu/nomilabs/core/SideSpecificRemover.java new file mode 100644 index 00000000..3e9a3280 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/core/SideSpecificRemover.java @@ -0,0 +1,131 @@ +package com.nomiceu.nomilabs.core; + +import java.util.*; + +import net.minecraftforge.fml.relauncher.FMLLaunchHandler; +import net.minecraftforge.fml.relauncher.Side; + +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.LogManager; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.MethodNode; + +import com.nomiceu.nomilabs.config.LabsConfig; + +/** + * @apiNote Inspired by net.minecraftforge.fml.common.asm.transformers.SideTransformer + *

+ * Allows for Client/Server Only Methods to be specified via Config. + */ +public class SideSpecificRemover { + + // Map of Class -> Pair Of Obf Mapping Lists, Left is Fields, Right is Methods + private static Map, List>> toRemove; + + /** + * Set up here to ensure ObfMapping is not loaded too early. + */ + private static void setupToRemove() { + if (toRemove != null) return; + + // Can't use Object2ObjectOpenHashMap as in ASM stage + toRemove = new HashMap<>(); + String[] methodsRemove; + String[] fieldsRemove; + + if (FMLLaunchHandler.side() == Side.SERVER) { + // Remove CLIENT side methods & fields + fieldsRemove = LabsConfig.advanced.clientSideFields; + methodsRemove = LabsConfig.advanced.clientSideMethods; + } else { + // Remove SERVER side methods & fields + fieldsRemove = LabsConfig.advanced.serverSideFields; + methodsRemove = LabsConfig.advanced.serverSideMethods; + } + + for (var field : fieldsRemove) { + var parts = field.split("@"); + if (parts.length != 2) + throw new IllegalStateException("Invalid Field Remove: " + field + + "! Must have Two Parts, Seperated by '@', Got " + parts.length + "!"); + + toRemove.computeIfAbsent(parts[0], (k) -> Pair.of(new ArrayList<>(), new ArrayList<>())) + .getLeft().add(new ObfMapping(parts[0], parts[1])); + } + + for (var method : methodsRemove) { + var parts = method.split("@"); + if (parts.length != 3) + throw new IllegalStateException("Invalid Method Remove: " + method + + "! Must have Three Parts, Seperated by '@', Got " + parts.length + "!"); + + toRemove.computeIfAbsent(parts[0], (k) -> Pair.of(new ArrayList<>(), new ArrayList<>())) + .getRight().add(new ObfMapping(parts[0], parts[1], parts[2])); + } + + LogManager.getLogger("LabsASM").debug("Computed To Remove: {}", toRemove); + } + + public static byte[] handleTransform(String internalName, byte[] basicClass) { + setupToRemove(); + + // Sanity + if (!toRemove.containsKey(internalName)) return basicClass; + + var pair = toRemove.get(internalName); + var fieldsRemove = pair.getLeft(); + var methodsRemove = pair.getRight(); + + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(basicClass); + classReader.accept(classNode, 0); + + for (var toRemove : fieldsRemove) { + Iterator fields = classNode.fields.iterator(); + boolean found = false; + while (fields.hasNext()) { + FieldNode field = fields.next(); + if (!toRemove.s_name.equals(field.name)) continue; + + LogManager.getLogger("LabsASM").warn("Removing Field: {}.{}", classNode.name, field.name); + fields.remove(); + found = true; + break; + } + + if (!found) + throw new IllegalStateException("Could not find Field " + classNode.name + "." + toRemove.s_name + "!"); + } + + var gatherer = new LambdaGatherer(); + for (var toRemove : methodsRemove) { + Iterator methods = classNode.methods.iterator(); + boolean found = false; + while (methods.hasNext()) { + MethodNode method = methods.next(); + if (!toRemove.matches(method)) continue; + + LogManager.getLogger("LabsASM").warn("Removing Method: {}.{}{}", classNode.name, method.name, + method.desc); + methods.remove(); + gatherer.accept(method); + found = true; + break; + } + + if (!found) + throw new IllegalStateException( + "Could not find Method " + classNode.name + "." + toRemove.s_name + toRemove.s_desc + "!"); + } + + LambdaGatherer.removeDynamicLambdaMethods(gatherer, classNode); + + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); + classNode.accept(writer); + + return writer.toByteArray(); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/fluid/FluidRegistryMixinHelper.java b/src/main/java/com/nomiceu/nomilabs/fluid/FluidRegistryMixinHelper.java index 5ea7542b..e8934781 100644 --- a/src/main/java/com/nomiceu/nomilabs/fluid/FluidRegistryMixinHelper.java +++ b/src/main/java/com/nomiceu/nomilabs/fluid/FluidRegistryMixinHelper.java @@ -13,7 +13,7 @@ import com.nomiceu.nomilabs.NomiLabs; import com.nomiceu.nomilabs.config.LabsConfig; -import com.nomiceu.nomilabs.mixin.AccessibleFluidRegistry; +import com.nomiceu.nomilabs.mixin.vanilla.AccessibleFluidRegistry; public class FluidRegistryMixinHelper { diff --git a/src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java b/src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java index 13c47c56..c10ee524 100644 --- a/src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java +++ b/src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java @@ -9,7 +9,7 @@ import com.nomiceu.nomilabs.NomiLabs; import com.nomiceu.nomilabs.config.LabsConfig; import com.nomiceu.nomilabs.groovy.mixinhelper.AccessibleKeyBinding; -import com.nomiceu.nomilabs.mixin.KeyBindingAccessor; +import com.nomiceu.nomilabs.mixin.vanilla.KeyBindingAccessor; import com.nomiceu.nomilabs.tooltip.LabsTooltipHelper; import com.nomiceu.nomilabs.util.LabsGroovyHelper; import com.nomiceu.nomilabs.util.LabsTranslate; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/CommandDifficultyMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/CommandDifficultyMixin.java deleted file mode 100644 index 68e61b04..00000000 --- a/src/main/java/com/nomiceu/nomilabs/mixin/CommandDifficultyMixin.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.nomiceu.nomilabs.mixin; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.CommandDifficulty; -import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.Style; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.world.EnumDifficulty; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.nomiceu.nomilabs.mixinhelper.DifficultySettableServer; -import com.nomiceu.nomilabs.util.LabsDifficultyHelper; -import com.nomiceu.nomilabs.util.LabsModeHelper; - -/** - * Prevents Changing Difficulty when Labs Locked, and saves changed difficulties to server.properties on Dedicated - * Servers. - */ -@Mixin(CommandDifficulty.class) -public abstract class CommandDifficultyMixin extends CommandBase { - - @Inject(method = "execute", at = @At("HEAD"), cancellable = true) - public void executeIfNotLocked(MinecraftServer server, ICommandSender sender, String[] args, CallbackInfo ci) { - var locked = LabsDifficultyHelper.getLockedDifficulty(); - if (locked == null) return; - - notifyCommandListener(sender, this, "command.nomilabs.difficulty.labs_locked_1", - new TextComponentTranslation(locked.getTranslationKey()) - .setStyle(new Style().setColor(TextFormatting.DARK_AQUA))); - notifyCommandListener(sender, this, "command.nomilabs.difficulty.labs_locked_2", - new TextComponentString(LabsModeHelper.getFormattedMode()) - .setStyle(new Style().setColor(TextFormatting.GOLD))); - ci.cancel(); - } - - @Redirect(method = "execute", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/server/MinecraftServer;setDifficultyForAllWorlds(Lnet/minecraft/world/EnumDifficulty;)V")) - public void setDifficultyAndSave(MinecraftServer instance, EnumDifficulty newDifficulty) { - if (instance instanceof DifficultySettableServer diff) - diff.setDifficultyForAllWorldsAndSave(newDifficulty); - else - instance.setDifficultyForAllWorlds(newDifficulty); - } -} diff --git a/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/LabsLateMixinLoader.java similarity index 97% rename from src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/LabsLateMixinLoader.java index 212ff604..41e74c38 100644 --- a/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/LabsLateMixinLoader.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.core; +package com.nomiceu.nomilabs.mixin; import static com.nomiceu.nomilabs.NomiLabs.LOGGER; @@ -17,7 +17,7 @@ import zone.rong.mixinbooter.ILateMixinLoader; @SuppressWarnings("unused") -public class LabsLateMixin implements ILateMixinLoader { +public class LabsLateMixinLoader implements ILateMixinLoader { public static final Map modMixinsConfig = Stream.of( new AbstractMap.SimpleImmutableEntry<>(LabsValues.DRACONIC_MODID, diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/AccessibleFluidRegistry.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/AccessibleFluidRegistry.java similarity index 92% rename from src/main/java/com/nomiceu/nomilabs/mixin/AccessibleFluidRegistry.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/AccessibleFluidRegistry.java index a4fc7836..a3e5708d 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/AccessibleFluidRegistry.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/AccessibleFluidRegistry.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/CommandDifficultyMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/CommandDifficultyMixin.java new file mode 100644 index 00000000..bcce9c79 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/CommandDifficultyMixin.java @@ -0,0 +1,64 @@ +package com.nomiceu.nomilabs.mixin.vanilla; + +import net.minecraft.command.*; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.EnumDifficulty; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.nomiceu.nomilabs.mixinhelper.DifficultySettableServer; +import com.nomiceu.nomilabs.util.LabsDifficultyHelper; +import com.nomiceu.nomilabs.util.LabsModeHelper; + +/** + * Prevents Changing Difficulty when Labs Locked, and saves changed difficulties to server.properties on Dedicated + * Servers. + */ +@Mixin(CommandDifficulty.class) +public abstract class CommandDifficultyMixin extends CommandBase { + + @Shadow + protected abstract EnumDifficulty getDifficultyFromCommand(String difficultyString) throws CommandException; + + /** + * Overrides entire function, fixes conflict with SpongeForge. + */ + @Inject(method = "execute", at = @At("HEAD"), cancellable = true) + public void executeIfNotLocked(MinecraftServer server, ICommandSender sender, String[] args, + CallbackInfo ci) throws CommandException { + var locked = LabsDifficultyHelper.getLockedDifficulty(); + + if (locked != null) { + notifyCommandListener(sender, this, "command.nomilabs.difficulty.labs_locked_1", + new TextComponentTranslation(locked.getTranslationKey()) + .setStyle(new Style().setColor(TextFormatting.DARK_AQUA))); + notifyCommandListener(sender, this, "command.nomilabs.difficulty.labs_locked_2", + new TextComponentString(LabsModeHelper.getFormattedMode()) + .setStyle(new Style().setColor(TextFormatting.GOLD))); + ci.cancel(); + return; + } + + if (args.length == 0) { + throw new WrongUsageException("commands.difficulty.usage"); + } + + EnumDifficulty newDifficulty = getDifficultyFromCommand(args[0]); + if (server instanceof DifficultySettableServer diff) + diff.setDifficultyForAllWorldsAndSave(newDifficulty); + else + server.setDifficultyForAllWorlds(newDifficulty); + + notifyCommandListener(sender, this, "commands.difficulty.success", + new TextComponentTranslation(newDifficulty.getTranslationKey())); + ci.cancel(); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/DedicatedServerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/DedicatedServerMixin.java similarity index 99% rename from src/main/java/com/nomiceu/nomilabs/mixin/DedicatedServerMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/DedicatedServerMixin.java index 83120f60..afbf5a4b 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/DedicatedServerMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/DedicatedServerMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.io.File; import java.net.Proxy; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/EntityPlayerSPMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/EntityPlayerSPMixin.java similarity index 92% rename from src/main/java/com/nomiceu/nomilabs/mixin/EntityPlayerSPMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/EntityPlayerSPMixin.java index e4e9acd4..4785a095 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/EntityPlayerSPMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/EntityPlayerSPMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/FluidRegistryMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/FluidRegistryMixin.java similarity index 98% rename from src/main/java/com/nomiceu/nomilabs/mixin/FluidRegistryMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/FluidRegistryMixin.java index eb355b9d..5d184227 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/FluidRegistryMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/FluidRegistryMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.util.Set; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/ForgeRegistryMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/ForgeRegistryMixin.java similarity index 99% rename from src/main/java/com/nomiceu/nomilabs/mixin/ForgeRegistryMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/ForgeRegistryMixin.java index c1c2f55a..9cd60b64 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/ForgeRegistryMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/ForgeRegistryMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.util.Collection; import java.util.List; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GameDataMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GameDataMixin.java similarity index 97% rename from src/main/java/com/nomiceu/nomilabs/mixin/GameDataMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GameDataMixin.java index a0868838..125856e3 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/GameDataMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GameDataMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.util.Map; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListAccessor.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiKeyBindingListAccessor.java similarity index 87% rename from src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListAccessor.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiKeyBindingListAccessor.java index 37c7f920..e4543e02 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListAccessor.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiKeyBindingListAccessor.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiKeyBindingList; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListKeyEntryMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiKeyBindingListKeyEntryMixin.java similarity index 96% rename from src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListKeyEntryMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiKeyBindingListKeyEntryMixin.java index 4a097b7f..65288108 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListKeyEntryMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiKeyBindingListKeyEntryMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.client.gui.GuiKeyBindingList; import net.minecraft.client.settings.KeyBinding; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiLanguageListMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiLanguageListMixin.java similarity index 97% rename from src/main/java/com/nomiceu/nomilabs/mixin/GuiLanguageListMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiLanguageListMixin.java index e3a86fbc..82a1e348 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/GuiLanguageListMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiLanguageListMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiLanguageMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiLanguageMixin.java similarity index 99% rename from src/main/java/com/nomiceu/nomilabs/mixin/GuiLanguageMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiLanguageMixin.java index ea5737c8..a834fc21 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/GuiLanguageMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiLanguageMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.lang.reflect.InvocationTargetException; import java.net.URI; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiOptionsMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiOptionsMixin.java similarity index 96% rename from src/main/java/com/nomiceu/nomilabs/mixin/GuiOptionsMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiOptionsMixin.java index 0828d5b3..80a61516 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/GuiOptionsMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/GuiOptionsMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiOptions; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/IntegratedServerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/IntegratedServerMixin.java similarity index 97% rename from src/main/java/com/nomiceu/nomilabs/mixin/IntegratedServerMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/IntegratedServerMixin.java index 93ea089a..c1933c37 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/IntegratedServerMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/IntegratedServerMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.io.File; import java.net.Proxy; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/ItemStackMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/ItemStackMixin.java similarity index 97% rename from src/main/java/com/nomiceu/nomilabs/mixin/ItemStackMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/ItemStackMixin.java index a35c1691..88569783 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/ItemStackMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/ItemStackMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingAccessor.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/KeyBindingAccessor.java similarity index 91% rename from src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingAccessor.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/KeyBindingAccessor.java index d0844c62..88696fb6 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingAccessor.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/KeyBindingAccessor.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.util.Map; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/KeyBindingMixin.java similarity index 95% rename from src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/KeyBindingMixin.java index 9b40719e..116ed8b2 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/KeyBindingMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.client.settings.KeyBinding; import net.minecraftforge.client.settings.KeyModifier; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/MinecraftMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/MinecraftMixin.java similarity index 99% rename from src/main/java/com/nomiceu/nomilabs/mixin/MinecraftMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/MinecraftMixin.java index 5ed2b6aa..eb4eb2bd 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/MinecraftMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/MinecraftMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.awt.*; import java.awt.image.BufferedImage; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/NarratorMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/NarratorMixin.java similarity index 94% rename from src/main/java/com/nomiceu/nomilabs/mixin/NarratorMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/NarratorMixin.java index 4c613538..a8266629 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/NarratorMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/NarratorMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/PotionEffectClientMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/PotionEffectClientMixin.java similarity index 93% rename from src/main/java/com/nomiceu/nomilabs/mixin/PotionEffectClientMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/PotionEffectClientMixin.java index d5964cc7..4c3839e2 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/PotionEffectClientMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/PotionEffectClientMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.potion.PotionEffect; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/PotionEffectMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/PotionEffectMixin.java similarity index 98% rename from src/main/java/com/nomiceu/nomilabs/mixin/PotionEffectMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/PotionEffectMixin.java index 2952db9e..085dd22d 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/PotionEffectMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/PotionEffectMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/SnapshotMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/SnapshotMixin.java similarity index 98% rename from src/main/java/com/nomiceu/nomilabs/mixin/SnapshotMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/SnapshotMixin.java index 6fbaca01..332ff34e 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/SnapshotMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/SnapshotMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.util.Map; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/WorldLoadHandler.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/WorldLoadHandler.java similarity index 97% rename from src/main/java/com/nomiceu/nomilabs/mixin/WorldLoadHandler.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/WorldLoadHandler.java index 72b5989b..3e9fdedb 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/WorldLoadHandler.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/WorldLoadHandler.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import java.io.File; diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/WorldServerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/WorldServerMixin.java similarity index 97% rename from src/main/java/com/nomiceu/nomilabs/mixin/WorldServerMixin.java rename to src/main/java/com/nomiceu/nomilabs/mixin/vanilla/WorldServerMixin.java index 0cc470ed..3116e4fd 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/WorldServerMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/vanilla/WorldServerMixin.java @@ -1,4 +1,4 @@ -package com.nomiceu.nomilabs.mixin; +package com.nomiceu.nomilabs.mixin.vanilla; import net.minecraft.server.MinecraftServer; import net.minecraft.world.WorldServer; diff --git a/src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java b/src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java index ba5789ae..b4281363 100644 --- a/src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java +++ b/src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java @@ -15,12 +15,12 @@ public class LabsDifficultyHelper { public static EnumDifficulty getLockedDifficulty() { if (LabsModeHelper.isNormal()) { if (LabsConfig.advanced.difficultyOverrides.overrideDifficultyNormal) - return LabsConfig.advanced.difficultyOverrides.difficultyNormal; + return EnumDifficulty.byId(LabsConfig.advanced.difficultyOverrides.difficultyNormal); else return null; } if (LabsModeHelper.isExpert()) { if (LabsConfig.advanced.difficultyOverrides.overrideDifficultyExpert) - return LabsConfig.advanced.difficultyOverrides.difficultyExpert; + return EnumDifficulty.byId(LabsConfig.advanced.difficultyOverrides.difficultyExpert); else return null; } return null; diff --git a/src/main/resources/mixins.nomilabs.json b/src/main/resources/mixins.nomilabs.json index a1127296..b67a8906 100644 --- a/src/main/resources/mixins.nomilabs.json +++ b/src/main/resources/mixins.nomilabs.json @@ -1,5 +1,5 @@ { - "package": "com.nomiceu.nomilabs.mixin", + "package": "com.nomiceu.nomilabs.mixin.vanilla", "refmap": "mixins.nomilabs.refmap.json", "target": "@env(DEFAULT)", "minVersion": "0.8",