From b231e9e1fc4c61f38ec290a8fc1727954f53a9a6 Mon Sep 17 00:00:00 2001 From: Integer Limit <103940576+IntegerLimit@users.noreply.github.com> Date: Thu, 4 Jul 2024 21:33:25 +1000 Subject: [PATCH] Difficulty Lock + Lang Config Update --- build.gradle | 9 +- .../nomiceu/nomilabs/config/LabsConfig.java | 35 ++++++++ .../{ => config}/LabsVersionConfig.java | 3 +- .../nomiceu/nomilabs/event/CommonProxy.java | 12 +++ .../mixin/CommandDifficultyMixin.java | 53 +++++++++++ .../nomilabs/mixin/DedicatedServerMixin.java | 87 +++++++++++++++++++ .../nomilabs/mixin/GuiOptionsMixin.java | 30 +++++++ .../nomilabs/mixin/IntegratedServerMixin.java | 38 ++++++++ .../nomilabs/mixin/MinecraftMixin.java | 4 +- .../mixinhelper/DifficultySettableServer.java | 8 ++ .../network/LabsDifficultyChangeMessage.java | 60 +++++++++++++ .../nomilabs/network/LabsNetworkHandler.java | 1 + .../nomilabs/util/LabsDifficultyHelper.java | 28 ++++++ .../nomiceu/nomilabs/util/LabsModeHelper.java | 67 +++++++++++--- .../resources/assets/nomilabs/lang/en_us.lang | 22 ++++- src/main/resources/mixins.nomilabs.json | 7 +- 16 files changed, 444 insertions(+), 20 deletions(-) rename src/main/java/com/nomiceu/nomilabs/{ => config}/LabsVersionConfig.java (89%) create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/CommandDifficultyMixin.java create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/DedicatedServerMixin.java create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/GuiOptionsMixin.java create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/IntegratedServerMixin.java create mode 100644 src/main/java/com/nomiceu/nomilabs/mixinhelper/DifficultySettableServer.java create mode 100644 src/main/java/com/nomiceu/nomilabs/network/LabsDifficultyChangeMessage.java create mode 100644 src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java diff --git a/build.gradle b/build.gradle index d0eaec1..9708a8f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1718246243 +//version: 1719793363 /* * DO NOT CHANGE THIS FILE! * Also, you may replace this file at any time if there is an update available. @@ -69,6 +69,7 @@ propertyDefaultIfUnset("includeMCVersionJar", false) propertyDefaultIfUnset("autoUpdateBuildScript", false) propertyDefaultIfUnset("modArchivesBaseName", project.modId) propertyDefaultIfUnsetWithEnvVar("developmentEnvironmentUserName", "Developer", "DEV_USERNAME") +propertyDefaultIfUnset("additionalJavaArguments", "") propertyDefaultIfUnset("enableJava17RunTasks", false) propertyDefaultIfUnset("generateGradleTokenClass", "") propertyDefaultIfUnset("gradleTokenModId", "") @@ -119,7 +120,7 @@ if (!getFile(targetPackageJava).exists() && !getFile(targetPackageScala).exists( if (apiPackage) { final String endApiPath = modGroupPath + '/' + apiPackagePath - if (useSrcApiPath) { + if (useSrcApiPath.toBoolean()) { targetPackageJava = 'src/api/java/' + endApiPath targetPackageScala = 'src/api/scala/' + endApiPath targetPackageKotlin = 'src/api/kotlin/' + endApiPath @@ -382,6 +383,10 @@ minecraft { ]) } + if (additionalJavaArguments.size() != 0) { + extraRunJvmArguments.addAll(additionalJavaArguments.split(';')) + } + if (enableJava17RunTasks.toBoolean()) { lwjgl3Version = "3.3.2" } diff --git a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java index cd24516..6d990af 100644 --- a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java +++ b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java @@ -1,5 +1,6 @@ package com.nomiceu.nomilabs.config; +import net.minecraft.world.EnumDifficulty; import net.minecraftforge.common.config.Config; import com.cleanroommc.configanytime.ConfigAnytime; @@ -387,6 +388,11 @@ public static class Advanced { @Config.Name("minecraft window overrides") public final WindowOverrides windowOverrides = new WindowOverrides(); + @Config.Comment({ "Overrides for the Minecraft Difficulty." }) + @Config.LangKey("config.nomilabs.advanced.difficulty") + @Config.Name("minecraft difficulty overrides") + public final DifficultyOverrides difficultyOverrides = new DifficultyOverrides(); + @Config.Comment({ "List of Regex Patterns to ignore if they are included in the ITEM missing registry list.", "Do not change unless you know what you are doing!", "This can be very inefficient with lots of patterns and lots of missing registries. Try to condense it into one pattern!", @@ -582,6 +588,35 @@ public static class ControlMenuTooltipSettings { @Config.LangKey("config.nomilabs.advanced.controls_tooltips.show_class") public boolean showClass = false; } + + public static class DifficultyOverrides { + + @Config.Comment({ "Whether to Override Difficulty in Normal Mode.", + "[default: false]" }) + @Config.LangKey("config.nomilabs.advanced.difficulty.enable_normal") + @Config.RequiresWorldRestart + public boolean overrideDifficultyNormal = false; + + @Config.Comment({ "Whether to Override Difficulty in Expert Mode.", + "[default: false]" }) + @Config.LangKey("config.nomilabs.advanced.difficulty.enable_expert") + @Config.RequiresWorldRestart + public boolean overrideDifficultyExpert = false; + + @Config.Comment({ + "Difficulty (Locked) Override in Normal Mode. Does Not Apply if overrideDifficultyNormal is set to false!", + "[default: NORMAL]" }) + @Config.LangKey("config.nomilabs.advanced.difficulty.normal_override") + @Config.RequiresWorldRestart + public EnumDifficulty difficultyNormal = EnumDifficulty.NORMAL; + + @Config.Comment({ + "Difficulty (Locked) Override in Expert Mode. Does Not Apply if overrideDifficultyExpert is set to false!", + "[default: NORMAL]" }) + @Config.LangKey("config.nomilabs.advanced.difficulty.expert_override") + @Config.RequiresWorldRestart + public EnumDifficulty difficultyExpert = EnumDifficulty.NORMAL; + } } static { diff --git a/src/main/java/com/nomiceu/nomilabs/LabsVersionConfig.java b/src/main/java/com/nomiceu/nomilabs/config/LabsVersionConfig.java similarity index 89% rename from src/main/java/com/nomiceu/nomilabs/LabsVersionConfig.java rename to src/main/java/com/nomiceu/nomilabs/config/LabsVersionConfig.java index 06cdf87..dd189e5 100644 --- a/src/main/java/com/nomiceu/nomilabs/LabsVersionConfig.java +++ b/src/main/java/com/nomiceu/nomilabs/config/LabsVersionConfig.java @@ -1,8 +1,9 @@ -package com.nomiceu.nomilabs; +package com.nomiceu.nomilabs.config; import net.minecraftforge.common.config.Config; import com.cleanroommc.configanytime.ConfigAnytime; +import com.nomiceu.nomilabs.LabsValues; @SuppressWarnings({ "CanBeFinal", "unused" }) @Config(modid = LabsValues.LABS_MODID, name = LabsValues.LABS_MODID + "-version") diff --git a/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java b/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java index 489e8bf..48acf14 100644 --- a/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java +++ b/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java @@ -9,6 +9,7 @@ import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent.MissingMappings; import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent; +import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; @@ -44,6 +45,7 @@ import com.nomiceu.nomilabs.remap.LabsRemappers; import com.nomiceu.nomilabs.remap.Remapper; import com.nomiceu.nomilabs.remap.datafixer.DataFixerHandler; +import com.nomiceu.nomilabs.util.LabsDifficultyHelper; import com.nomiceu.nomilabs.util.LabsModeHelper; import com.nomiceu.nomilabs.util.LabsNames; @@ -141,6 +143,16 @@ public static void registerRecipes(RegistryEvent.Register event) { // com.nomiceu.nomilabs.recipe.LabsTestRecipes.initRecipes(); } + @SubscribeEvent + public static void onWorldLoad(WorldEvent.Load event) { + var toLock = LabsDifficultyHelper.getLockedDifficulty(); + if (toLock == null) return; + + // Lock Difficulty + event.getWorld().getWorldInfo().setDifficulty(toLock); + event.getWorld().getWorldInfo().setDifficultyLocked(true); + } + @SubscribeEvent public static void onEquipmentChangeEvent(LivingEquipmentChangeEvent event) { ItemExcitationCoil.onEquipmentChange(event); diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/CommandDifficultyMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/CommandDifficultyMixin.java new file mode 100644 index 0000000..68e61b0 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/CommandDifficultyMixin.java @@ -0,0 +1,53 @@ +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/mixin/DedicatedServerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/DedicatedServerMixin.java new file mode 100644 index 0000000..a7d752e --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/DedicatedServerMixin.java @@ -0,0 +1,87 @@ +package com.nomiceu.nomilabs.mixin; + +import java.io.File; +import java.net.Proxy; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.dedicated.PropertyManager; +import net.minecraft.server.management.PlayerProfileCache; +import net.minecraft.util.datafix.DataFixer; +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.CallbackInfoReturnable; + +import com.mojang.authlib.GameProfileRepository; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.nomiceu.nomilabs.NomiLabs; +import com.nomiceu.nomilabs.mixinhelper.DifficultySettableServer; +import com.nomiceu.nomilabs.util.LabsDifficultyHelper; +import com.nomiceu.nomilabs.util.LabsModeHelper; +import com.nomiceu.nomilabs.util.LabsTranslate; + +/** + * Gets the Locked Difficulty on Servers, Locking the Difficulty there as well. + *

+ * This is because servers select difficulty from the 'server.properties' file. + *

+ * Also overrides the difficulty in server.properties for consistency. + *

+ * Allows for support of calling `setDifficultyForAllWorldsAndSave`, changing difficulty and saving to + * `server.properties` on the fly. + */ +@Mixin(DedicatedServer.class) +public abstract class DedicatedServerMixin extends MinecraftServer implements DifficultySettableServer { + + /** + * Mandatory Ignored Constructor + */ + public DedicatedServerMixin(File anvilFileIn, Proxy proxyIn, DataFixer dataFixerIn, + YggdrasilAuthenticationService authServiceIn, MinecraftSessionService sessionServiceIn, + GameProfileRepository profileRepoIn, PlayerProfileCache profileCacheIn) { + super(anvilFileIn, proxyIn, dataFixerIn, authServiceIn, sessionServiceIn, profileRepoIn, profileCacheIn); + } + + @Shadow + private PropertyManager settings; + + @Inject(method = "getDifficulty", at = @At("HEAD"), cancellable = true) + public void getLockedDifficulty(CallbackInfoReturnable cir) { + var locked = LabsDifficultyHelper.getLockedDifficulty(); + if (locked != null) cir.setReturnValue(locked); + } + + @SuppressWarnings("LoggingSimilarMessage") + @Inject(method = "init", at = @At("RETURN")) + public void changeInitDifficulty(CallbackInfoReturnable cir) { + var locked = LabsDifficultyHelper.getLockedDifficulty(); + var savedDifficulty = this.settings.getIntProperty("difficulty", 1); + if (locked != null && savedDifficulty != locked.getId()) { + NomiLabs.LOGGER.warn("==============================================="); + NomiLabs.LOGGER.warn("============ LABS DIFFICULTY LOCK: ============"); + NomiLabs.LOGGER.warn("-----------------------------------------------"); + + NomiLabs.LOGGER.warn("Server Difficulty was set to {}, it has now been overrided to {}!", + LabsTranslate.translate(EnumDifficulty.byId(savedDifficulty).getTranslationKey()), + LabsTranslate.translate(locked.getTranslationKey())); + + NomiLabs.LOGGER.warn("This is because you are on {} mode!", LabsModeHelper.getFormattedMode()); + + NomiLabs.LOGGER.warn("-----------------------------------------------"); + NomiLabs.LOGGER.warn("==============================================="); + + } + } + + @Override + public void setDifficultyForAllWorldsAndSave(EnumDifficulty difficulty) { + setDifficultyForAllWorlds(difficulty); + settings.setProperty("difficulty", difficulty.getId()); + settings.saveProperties(); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiOptionsMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/GuiOptionsMixin.java new file mode 100644 index 0000000..0828d5b --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/GuiOptionsMixin.java @@ -0,0 +1,30 @@ +package com.nomiceu.nomilabs.mixin; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiOptions; +import net.minecraft.client.gui.GuiScreen; + +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.callback.CallbackInfo; + +import com.nomiceu.nomilabs.network.LabsDifficultyChangeMessage; +import com.nomiceu.nomilabs.network.LabsNetworkHandler; + +/** + * Fixes Difficulty Button not setting difficulty for all worlds and saving to server.properties. + */ +@Mixin(GuiOptions.class) +public abstract class GuiOptionsMixin extends GuiScreen { + + @Inject(method = "actionPerformed", at = @At("HEAD")) + public void handleProperDifficultyChange(GuiButton button, CallbackInfo ci) { + if (!button.enabled || button.id != 108) return; + + // Set difficulty properly, but do not cancel + // Let operation set difficulty of world as well, to provide instantaneous change + LabsNetworkHandler.NETWORK_HANDLER + .sendToServer(new LabsDifficultyChangeMessage(mc.world.getDifficulty().getId() + 1)); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/IntegratedServerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/IntegratedServerMixin.java new file mode 100644 index 0000000..93ea089 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/IntegratedServerMixin.java @@ -0,0 +1,38 @@ +package com.nomiceu.nomilabs.mixin; + +import java.io.File; +import java.net.Proxy; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.server.management.PlayerProfileCache; +import net.minecraft.util.datafix.DataFixer; +import net.minecraft.world.EnumDifficulty; + +import org.spongepowered.asm.mixin.Mixin; + +import com.mojang.authlib.GameProfileRepository; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.nomiceu.nomilabs.mixinhelper.DifficultySettableServer; + +/** + * Allows for support of calling `setDifficultyForAllWorldsAndSave`. + */ +@Mixin(IntegratedServer.class) +public abstract class IntegratedServerMixin extends MinecraftServer implements DifficultySettableServer { + + /** + * Default Ignored Constructor + */ + public IntegratedServerMixin(File anvilFileIn, Proxy proxyIn, DataFixer dataFixerIn, + YggdrasilAuthenticationService authServiceIn, MinecraftSessionService sessionServiceIn, + GameProfileRepository profileRepoIn, PlayerProfileCache profileCacheIn) { + super(anvilFileIn, proxyIn, dataFixerIn, authServiceIn, sessionServiceIn, profileRepoIn, profileCacheIn); + } + + @Override + public void setDifficultyForAllWorldsAndSave(EnumDifficulty difficulty) { + setDifficultyForAllWorlds(difficulty); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/MinecraftMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/MinecraftMixin.java index cb03811..899a5f5 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/MinecraftMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/MinecraftMixin.java @@ -21,9 +21,9 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.nomiceu.nomilabs.LabsVersionConfig; import com.nomiceu.nomilabs.NomiLabs; import com.nomiceu.nomilabs.config.LabsConfig; +import com.nomiceu.nomilabs.config.LabsVersionConfig; import com.nomiceu.nomilabs.util.LabsModeHelper; /** @@ -41,7 +41,7 @@ private void setCustomTitle(String title) { if (LabsConfig.advanced.windowOverrides.windowTitleOverride.isEmpty()) Display.setTitle(title); else Display.setTitle(LabsConfig.advanced.windowOverrides.windowTitleOverride .replace("{version}", LabsVersionConfig.formattedVersion) - .replace("{mode}", LabsModeHelper.getFormattedModePre())); + .replace("{mode}", LabsModeHelper.getFormattedMode())); } @Inject(method = "setWindowIcon", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/com/nomiceu/nomilabs/mixinhelper/DifficultySettableServer.java b/src/main/java/com/nomiceu/nomilabs/mixinhelper/DifficultySettableServer.java new file mode 100644 index 0000000..fb8157f --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixinhelper/DifficultySettableServer.java @@ -0,0 +1,8 @@ +package com.nomiceu.nomilabs.mixinhelper; + +import net.minecraft.world.EnumDifficulty; + +public interface DifficultySettableServer { + + void setDifficultyForAllWorldsAndSave(EnumDifficulty difficulty); +} diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsDifficultyChangeMessage.java b/src/main/java/com/nomiceu/nomilabs/network/LabsDifficultyChangeMessage.java new file mode 100644 index 0000000..ca4b56e --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/network/LabsDifficultyChangeMessage.java @@ -0,0 +1,60 @@ +package com.nomiceu.nomilabs.network; + +import net.minecraft.world.EnumDifficulty; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; + +import com.nomiceu.nomilabs.NomiLabs; +import com.nomiceu.nomilabs.mixinhelper.DifficultySettableServer; + +import io.netty.buffer.ByteBuf; + +/** + * Allows for the Gui Options to properly change and save difficulty changes to all worlds. + */ +public class LabsDifficultyChangeMessage implements IMessage { + + private int difficultyId; + + public LabsDifficultyChangeMessage() { + difficultyId = EnumDifficulty.NORMAL.getId(); + } + + public LabsDifficultyChangeMessage(int difficultyId) { + this.difficultyId = difficultyId; + } + + public EnumDifficulty getDifficulty() { + return EnumDifficulty.byId(difficultyId); + } + + @Override + public void fromBytes(ByteBuf buf) { + difficultyId = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(difficultyId); + } + + public static class MessageHandler implements IMessageHandler { + + @Override + public IMessage onMessage(LabsDifficultyChangeMessage message, MessageContext ctx) { + if (!ctx.side.isServer()) return null; + + NomiLabs.LOGGER.debug( + "[Difficulty Change Handler] Received LabsDifficultyChangeMessage with difficulty {}", + message.getDifficulty().getId()); + + var server = ctx.getServerHandler().server; + if (server instanceof DifficultySettableServer diff) + diff.setDifficultyForAllWorldsAndSave(message.getDifficulty()); + else server.setDifficultyForAllWorlds(message.getDifficulty()); + + return null; + } + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java b/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java index c4ab772..c484d86 100644 --- a/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java +++ b/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java @@ -20,6 +20,7 @@ public static void onConstruction() { public static void preInit() { CURRENT_ID = 0; registerMessage(CanEditChunkDataMessage.MessageHandler.class, CanEditChunkDataMessage.class); + registerMessage(LabsDifficultyChangeMessage.MessageHandler.class, LabsDifficultyChangeMessage.class); } @SuppressWarnings("SameParameterValue") diff --git a/src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java b/src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java new file mode 100644 index 0000000..ba5789a --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/util/LabsDifficultyHelper.java @@ -0,0 +1,28 @@ +package com.nomiceu.nomilabs.util; + +import net.minecraft.world.EnumDifficulty; + +import org.jetbrains.annotations.Nullable; + +import com.nomiceu.nomilabs.config.LabsConfig; + +public class LabsDifficultyHelper { + + /** + * Get the Difficulty to lock worlds in. Returns null if none. + */ + @Nullable + public static EnumDifficulty getLockedDifficulty() { + if (LabsModeHelper.isNormal()) { + if (LabsConfig.advanced.difficultyOverrides.overrideDifficultyNormal) + return LabsConfig.advanced.difficultyOverrides.difficultyNormal; + else return null; + } + if (LabsModeHelper.isExpert()) { + if (LabsConfig.advanced.difficultyOverrides.overrideDifficultyExpert) + return LabsConfig.advanced.difficultyOverrides.difficultyExpert; + else return null; + } + return null; + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/util/LabsModeHelper.java b/src/main/java/com/nomiceu/nomilabs/util/LabsModeHelper.java index 0244888..411eae3 100644 --- a/src/main/java/com/nomiceu/nomilabs/util/LabsModeHelper.java +++ b/src/main/java/com/nomiceu/nomilabs/util/LabsModeHelper.java @@ -1,31 +1,34 @@ package com.nomiceu.nomilabs.util; import java.io.File; +import java.lang.reflect.InvocationTargetException; import net.minecraft.launchwrapper.Launch; import net.minecraftforge.common.config.Configuration; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.core.util.Loader; +import org.jetbrains.annotations.Nullable; import com.nomiceu.nomilabs.LabsValues; import com.nomiceu.nomilabs.config.LabsConfig; -import io.sommers.packmode.PMConfig; - public class LabsModeHelper { private static boolean checked = false; + @Nullable + private static String modePreCache = null; public static boolean isNormal() { if (!checked) throw new IllegalStateException("Cannot access Pack Mode before Post Init or Labs Config Load!"); - return PMConfig.getPackMode().equals(LabsValues.NORMAL_MODE); + return getMode().equals(LabsValues.NORMAL_MODE); } public static boolean isExpert() { if (!checked) throw new IllegalStateException("Cannot access Pack Mode before Post Init or Labs Config Load!"); - return PMConfig.getPackMode().equals(LabsValues.EXPERT_MODE); + return getMode().equals(LabsValues.EXPERT_MODE); } /** @@ -33,13 +36,44 @@ public static boolean isExpert() { */ @SuppressWarnings("unused") public static String getFormattedMode() { - return getFormattedModeFromString(PMConfig.getPackMode()); + return StringUtils.capitalize(getMode()); } /** - * Used by Window Title Override. Doesn't Access PM Class Because of a ClassNorFoundException. + * Get the Mode (at all times) */ - public static String getFormattedModePre() { + public static String getMode() { + // Reflection: + // ClassNotFound Exception Thrown if PMConfig not loaded + try { + // Prevent loading Static Init, use MC Mod Loader + var pmCfgClass = Class.forName("io.sommers.packmode.PMConfig", false, + Loader.getClassLoader()); + + var getPackModeMethod = pmCfgClass.getDeclaredMethod("getPackMode"); + var getCfgMethod = pmCfgClass.getDeclaredMethod("getConfiguration"); + + if (getCfgMethod.invoke(null) == null) + // If no config + return getModePre(); + + // Get Mode Normally (Pack Mode can change in-game) + String mode = (String) getPackModeMethod.invoke(null); + if (!checked) check(mode); + return mode; + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | + InvocationTargetException e) { + // PackMode not loaded + return getModePre(); + } + } + + /** + * Get the mode, specifically pre-loading pack mode or pre-loading pack mode cfg. + */ + private static String getModePre() { + if (modePreCache != null) return modePreCache; + File configDir = new File(Launch.minecraftHome, "config"); File packModeCfgFile = new File(configDir, LabsValues.PACK_MODE_MODID + ".cfg"); @@ -48,19 +82,26 @@ public static String getFormattedModePre() { var configuration = new Configuration(packModeCfgFile); configuration.load(); - return getFormattedModeFromString(configuration.get("general", "packMode", LabsValues.NORMAL_MODE).getString()); - } + modePreCache = configuration.get("general", "packMode", LabsValues.NORMAL_MODE).getString(); + + if (!checked) check(modePreCache); - private static String getFormattedModeFromString(String mode) { - return StringUtils.capitalize(mode); + return modePreCache; } + /** + * Public Interface to Check + */ public static void check() { + if (!checked) getMode(); // Will check, whether it uses getModePre or PMConfig.getPackMode + } + + private static void check(String mode) { checked = true; if (LabsConfig.advanced.allowOtherPackModes) return; - if (!(PMConfig.getPackMode().equals(LabsValues.NORMAL_MODE) || - PMConfig.getPackMode().equals(LabsValues.EXPERT_MODE))) { + if (!(mode.equals(LabsValues.NORMAL_MODE) || + mode.equals(LabsValues.EXPERT_MODE))) { throw new IllegalArgumentException("[Nomi Labs]: Pack Mode must be either 'normal' or 'expert'." + "If you are sure of what you are doing, you can allow other pack modes in the Nomi Labs Config, but beware: many mode specific behaviours will break."); } diff --git a/src/main/resources/assets/nomilabs/lang/en_us.lang b/src/main/resources/assets/nomilabs/lang/en_us.lang index f45f84f..54434e0 100644 --- a/src/main/resources/assets/nomilabs/lang/en_us.lang +++ b/src/main/resources/assets/nomilabs/lang/en_us.lang @@ -9,6 +9,11 @@ tile.unique_casing.air_vent.name=Air Vent nomilabs.subtitle.tick.microverse=Projecting Microverse # Config +nomilabs.tooltip=Normal Nomi Labs Configs +nomilabs-version.tooltip=Nomi Labs Modpack Version Config + +config.nomilabs.version.formatted-version=Formatted Modpack Version + config.nomilabs.content=Content Settings config.nomilabs.content.tooltip=Content Settings @@ -77,7 +82,8 @@ config.nomilabs.advanced.ignore_blocks=BLOCK Missing Registry Ignore List config.nomilabs.advanced.ignore_entities=ENTITY Missing Registry Ignore List config.nomilabs.advanced.ignore_biomes=BIOME Missing Registry Ignore List config.nomilabs.advanced.language_modify_option=Language Tab Modifier Mode -config.nomilabs.advanced.window_title=Minecraft Window Title Override +config.nomilabs.advanced.window=Minecraft Window Title Overrides +config.nomilabs.advanced.difficulty=Difficulty Overrides config.nomilabs.advanced.tiers=Quest Tier Detector Settings config.nomilabs.advanced.tiers.normal_qb_ids=Normal Mode Quest IDs @@ -99,6 +105,16 @@ config.nomilabs.advanced.controls_tooltips=Controls Menu Tooltips Settings config.nomilabs.advanced.controls_tooltips.show_id=Show ID Tooltip config.nomilabs.advanced.controls_tooltips.show_class=Show Class Tooltip +config.nomilabs.advanced.window.window_title=Window Title Override +config.nomilabs.advanced.window.window_logo_16x=Window Logo 16x Override +config.nomilabs.advanced.window.window_logo_32x=Window Logo 32x Override +config.nomilabs.advanced.window.window_logo_256x=Window Logo 256x Override + +config.nomilabs.advanced.difficulty.enable_normal=Enable Difficulty Override Normal +config.nomilabs.advanced.difficulty.enable_expert=Enable Difficulty Override Expert +config.nomilabs.advanced.difficulty.normal_override=Difficulty Override Normal +config.nomilabs.advanced.difficulty.expert_override=Difficulty Override Expert + # GUI gui.nomilabs.recipes.tooltip.ct_recipe=CraftTweaker Recipe. gui.nomilabs.recipes.tooltip.gs_recipe=GroovyScript Recipe. @@ -499,6 +515,10 @@ item.nomilabs.hand_framing_tool.desc6=When right clicking any wood-type drawers item.nomilabs.pulsatingdust.name=Pulsating Dust item.nomilabs.pulsatingmesh.name=Pulsating Mesh +#-----------------Commands-----------------# + +command.nomilabs.difficulty.labs_locked_1=§cThe difficulty of this world is locked to %s§c! +command.nomilabs.difficulty.labs_locked_2=§cThis is because you are playing on %s §6Mode§c! #----------------Multiblocks----------------# diff --git a/src/main/resources/mixins.nomilabs.json b/src/main/resources/mixins.nomilabs.json index acda300..f1a97a6 100644 --- a/src/main/resources/mixins.nomilabs.json +++ b/src/main/resources/mixins.nomilabs.json @@ -6,6 +6,7 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "AccessibleFluidRegistry", + "CommandDifficultyMixin", "FluidRegistryMixin", "ItemStackMixin", "NarratorMixin", @@ -17,9 +18,13 @@ "GuiKeyBindingListKeyEntryMixin", "GuiLanguageListMixin", "GuiLanguageMixin", + "GuiOptionsMixin", + "IntegratedServerMixin", "KeyBindingAccessor", "KeyBindingMixin", "MinecraftMixin" ], - "server": [] + "server": [ + "DedicatedServerMixin" + ] }