From 0382798a5d0227d2cadfacfbe6cd966e2c03394d Mon Sep 17 00:00:00 2001 From: skippyall <121978267+skippyall@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:46:40 +0100 Subject: [PATCH] Configured --- build.gradle | 2 + gradle.properties | 2 + .../minions/MinionMixinConfigPlugin.java | 17 ++-- .../io/github/skippyall/minions/Minions.java | 6 +- .../skippyall/minions/MinionsConfig.java | 83 +++++++++++++++++++ .../minions/command/MinionArgument.java | 2 +- .../minions/command/MinionsCommand.java | 21 +++-- .../command/MobCapDebugSubcommand.java | 4 +- .../skippyall/minions/gui/MinionLookGui.java | 2 +- .../minions/minion/MinionProfileUtils.java | 11 ++- ...tanceFromNearestPlayerTrackerAccessor.java | 2 +- .../ChunkLevelManagerAccessor.java | 2 +- ...DistanceFromNearestPlayerTrackerMixin.java | 5 +- .../antimobcap/ChunkLevelManagerMixin.java | 4 +- .../antimobcap/ServerChunkManagerMixin.java | 5 +- .../resources/data/minions/lang/en_us.json | 2 +- 16 files changed, 131 insertions(+), 39 deletions(-) create mode 100644 src/main/java/io/github/skippyall/minions/MinionsConfig.java rename src/main/java/io/github/skippyall/minions/mixinhelper/{ => antimobcap}/ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor.java (80%) rename src/main/java/io/github/skippyall/minions/mixinhelper/{ => antimobcap}/ChunkLevelManagerAccessor.java (85%) diff --git a/build.gradle b/build.gradle index 473a5de..d64efcb 100644 --- a/build.gradle +++ b/build.gradle @@ -63,6 +63,8 @@ dependencies { modImplementation include("eu.pb4:sgui:${project.sgui_version}") modImplementation include("xyz.nucleoid:server-translations-api:${project.server_translations_version}") + implementation include("com.electronwill.night-config:toml:${project.night_config_version}") + modCompileOnly "maven.modrinth:universal-graves:${project.universal_graves_version}" } diff --git a/gradle.properties b/gradle.properties index e44fdc0..c2d996d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,6 @@ org.gradle.jvmargs=-Xmx1G sgui_version=1.10.0+1.21.6 server_translations_version=2.5.1+1.21.5 + night_config_version=3.8.3 + universal_graves_version=3.8.0+1.21.6 diff --git a/src/main/java/io/github/skippyall/minions/MinionMixinConfigPlugin.java b/src/main/java/io/github/skippyall/minions/MinionMixinConfigPlugin.java index a065f2e..bba6579 100644 --- a/src/main/java/io/github/skippyall/minions/MinionMixinConfigPlugin.java +++ b/src/main/java/io/github/skippyall/minions/MinionMixinConfigPlugin.java @@ -22,15 +22,16 @@ public class MinionMixinConfigPlugin implements IMixinConfigPlugin { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { if(mixinClassName.startsWith("io.github.skippyall.mixins.compat.universal_graves.")) { - return FabricLoader.getInstance().isModLoaded("universal-graves"); + return MinionsConfig.get().compat.enableGravesCompat && FabricLoader.getInstance().isModLoaded("universal-graves"); + } + if(mixinClassName.startsWith("io.github.skippyall.mixins.antimobcap.")) { + return MinionsConfig.get().minion.enableMobCapHacks; } return true; } @Override - public void acceptTargets(Set myTargets, Set otherTargets) { - - } + public void acceptTargets(Set myTargets, Set otherTargets) {} @Override public List getMixins() { @@ -38,12 +39,8 @@ public class MinionMixinConfigPlugin implements IMixinConfigPlugin { } @Override - public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} @Override - public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} } diff --git a/src/main/java/io/github/skippyall/minions/Minions.java b/src/main/java/io/github/skippyall/minions/Minions.java index 56f885d..183aaf5 100644 --- a/src/main/java/io/github/skippyall/minions/Minions.java +++ b/src/main/java/io/github/skippyall/minions/Minions.java @@ -19,6 +19,8 @@ public class Minions implements ModInitializer { @Override public void onInitialize() { + MinionsConfig.get(); + MinionRegistration.register(); PolymerUtil.register(); @@ -31,9 +33,7 @@ public class Minions implements ModInitializer { }); }); - CommandRegistrationCallback.EVENT.register((commandDispatcher, commandRegistryAccess, registrationEnvironment) -> { - MinionsCommand.register(commandDispatcher); - }); + CommandRegistrationCallback.EVENT.register(MinionsCommand::register); /*ServerBlockEntityEvents.BLOCK_ENTITY_LOAD.register((blockEntity, world) -> { if(blockEntity instanceof MinionTriggerBlockEntity) { diff --git a/src/main/java/io/github/skippyall/minions/MinionsConfig.java b/src/main/java/io/github/skippyall/minions/MinionsConfig.java new file mode 100644 index 0000000..f0acab1 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/MinionsConfig.java @@ -0,0 +1,83 @@ +package io.github.skippyall.minions; + +import com.electronwill.nightconfig.core.CommentedConfig; +import com.electronwill.nightconfig.core.io.ParsingException; +import com.electronwill.nightconfig.core.io.WritingException; +import com.electronwill.nightconfig.core.io.WritingMode; +import com.electronwill.nightconfig.core.serde.ObjectDeserializer; +import com.electronwill.nightconfig.core.serde.ObjectSerializer; +import com.electronwill.nightconfig.core.serde.SerdeException; +import com.electronwill.nightconfig.core.serde.annotations.SerdeComment; +import com.electronwill.nightconfig.core.serde.annotations.SerdeSkipDeserializingIf; +import com.electronwill.nightconfig.toml.TomlFormat; +import com.electronwill.nightconfig.toml.TomlParser; +import net.fabricmc.loader.api.FabricLoader; + +import java.nio.file.Path; + +import static com.electronwill.nightconfig.core.serde.annotations.SerdeSkipDeserializingIf.SkipDeIf.IS_MISSING; + +public class MinionsConfig { + private static MinionsConfig INSTANCE; + + @SerdeSkipDeserializingIf(IS_MISSING) + public Minion minion = new Minion(); + + public static class Minion { + @SerdeComment("The prefix for all minion names") + @SerdeSkipDeserializingIf(IS_MISSING) + public String minionPrefix = "+"; + + @SerdeComment("Makes minions not raise the mob cap if they can't spawn mobs.") + @SerdeComment("Might cause incompatibilities.") + @SerdeSkipDeserializingIf(IS_MISSING) + public boolean enableMobCapHacks = true; + } + + @SerdeSkipDeserializingIf(IS_MISSING) + public Compat compat = new Compat(); + + public static class Compat { + @SerdeComment("Enables compat with Universal Graves, which allows everyone to pick up graves from minions") + @SerdeSkipDeserializingIf(IS_MISSING) + public boolean enableGravesCompat = true; + } + + private static Path getPath() { + return FabricLoader.getInstance().getConfigDir().resolve(Minions.MOD_ID + ".toml"); + } + + public static MinionsConfig get() { + if(INSTANCE == null) { + loadConfig(); + } + return INSTANCE; + } + + public static void loadConfig() { + System.out.println("loading"); + try { + CommentedConfig config = new TomlParser().parse(getPath(), (file, configFormat) -> { + CommentedConfig defaultConfig = ObjectSerializer.standard().serializeFields(new MinionsConfig(), TomlFormat::newConfig); + configFormat.createWriter().write(defaultConfig, file, WritingMode.REPLACE); + return true; + }); + + INSTANCE = ObjectDeserializer.standard().deserializeFields(config, MinionsConfig::new); + } catch (SerdeException | ParsingException | WritingException e) { + System.out.println("[minions] Error while reading config"); + e.printStackTrace(); + INSTANCE = new MinionsConfig(); + } + } + + /*public static void saveConfig() { + try { + CommentedConfig config = ObjectSerializer.standard().serializeFields(INSTANCE, TomlFormat::newConfig); + new TomlWriter().write(config, getPath(), WritingMode.REPLACE); + } catch (SerdeException | ParsingException | WritingException e) { + System.out.println("[minions] Error while writing config"); + e.printStackTrace(); + } + }*/ +} diff --git a/src/main/java/io/github/skippyall/minions/command/MinionArgument.java b/src/main/java/io/github/skippyall/minions/command/MinionArgument.java index 33cc5cc..9bd3a06 100644 --- a/src/main/java/io/github/skippyall/minions/command/MinionArgument.java +++ b/src/main/java/io/github/skippyall/minions/command/MinionArgument.java @@ -24,7 +24,7 @@ public class MinionArgument { public static MinionData parse(MinecraftServer server, String argument) throws CommandSyntaxException { Optional data = Optional.empty(); - if(argument.startsWith(MinionProfileUtils.PREFIX)) { + if(argument.startsWith(MinionProfileUtils.getPrefix())) { data = MinionPersistentState.get(server).getMinionWithName(argument); } else { try { diff --git a/src/main/java/io/github/skippyall/minions/command/MinionsCommand.java b/src/main/java/io/github/skippyall/minions/command/MinionsCommand.java index e8beb02..7f6daf8 100644 --- a/src/main/java/io/github/skippyall/minions/command/MinionsCommand.java +++ b/src/main/java/io/github/skippyall/minions/command/MinionsCommand.java @@ -1,19 +1,26 @@ package io.github.skippyall.minions.command; import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import io.github.skippyall.minions.MinionsConfig; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import static net.minecraft.server.command.CommandManager.literal; public class MinionsCommand { - public static void register(CommandDispatcher dispatcher) { + public static void register(CommandDispatcher dispatcher, CommandRegistryAccess access, CommandManager.RegistrationEnvironment environment) { + LiteralArgumentBuilder builder = literal("minions") + .then(SpawnSubcommand.SPAWN) + .then(ListSubcommand.LIST); + + if(MinionsConfig.get().minion.enableMobCapHacks) { + builder.then(MobCapDebugSubcommand.MOB_CAP_DEBUG); + } + dispatcher.register( - literal("minions") - .then(SpawnSubcommand.SPAWN) - .then(MobCapDebugSubcommand.MOB_CAP_DEBUG) - .then(ListSubcommand.LIST) + builder ); } - - } diff --git a/src/main/java/io/github/skippyall/minions/command/MobCapDebugSubcommand.java b/src/main/java/io/github/skippyall/minions/command/MobCapDebugSubcommand.java index 7babd1d..aa3f93e 100644 --- a/src/main/java/io/github/skippyall/minions/command/MobCapDebugSubcommand.java +++ b/src/main/java/io/github/skippyall/minions/command/MobCapDebugSubcommand.java @@ -2,8 +2,8 @@ package io.github.skippyall.minions.command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManagerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManagerAccessor; import io.github.skippyall.minions.mixins.antimobcap.ServerChunkManagerAccessor; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.world.ChunkLevelManager; diff --git a/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java b/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java index 5526426..c4f5938 100644 --- a/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java +++ b/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java @@ -89,7 +89,7 @@ public class MinionLookGui extends SimpleGui { public void openRenameGui(ServerPlayerEntity player, ItemStack minionItem) { TextInput.inputSync(player, Text.translatable("minions.gui.look.rename.title"), "Minion", name -> MinionProfileUtils.checkMinionNameWithoutPrefix(player.getServer(), name)) .thenAccept(name -> { - MinionItem.setData(player.getServer(), getData().withName(MinionProfileUtils.PREFIX + name), minionItem); + MinionItem.setData(player.getServer(), getData().withName(MinionProfileUtils.getPrefix() + name), minionItem); open(); }); } diff --git a/src/main/java/io/github/skippyall/minions/minion/MinionProfileUtils.java b/src/main/java/io/github/skippyall/minions/minion/MinionProfileUtils.java index 9542a99..08e4d19 100644 --- a/src/main/java/io/github/skippyall/minions/minion/MinionProfileUtils.java +++ b/src/main/java/io/github/skippyall/minions/minion/MinionProfileUtils.java @@ -3,6 +3,7 @@ package io.github.skippyall.minions.minion; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.PropertyMap; import com.mojang.brigadier.StringReader; +import io.github.skippyall.minions.MinionsConfig; import io.github.skippyall.minions.gui.input.Result; import net.minecraft.server.MinecraftServer; import net.minecraft.text.Text; @@ -13,7 +14,9 @@ import java.util.UUID; import static io.github.skippyall.minions.Minions.LOGGER; public class MinionProfileUtils { - public static final String PREFIX = "+"; + public static String getPrefix() { + return MinionsConfig.get().minion.minionPrefix; + } public static GameProfile makeNewMinionProfile(UUID uuidMinion, String username, PropertyMap skin) { if(uuidMinion == null) { @@ -35,15 +38,15 @@ public class MinionProfileUtils { } } - if((PREFIX + name).length() > 16) { + if((getPrefix() + name).length() > 16) { return new Result.Error<>(Text.translatable("minions.generic.name.too_long")); } - if(!StringHelper.isValidPlayerName(PREFIX + name)) { + if(!StringHelper.isValidPlayerName(getPrefix() + name)) { return new Result.Error<>(Text.translatable("minions.generic.name.invalid")); } - if(MinionPersistentState.get(server).isMinionNameTaken(PREFIX + name)) { + if(MinionPersistentState.get(server).isMinionNameTaken(getPrefix() + name)) { return new Result.Error<>(Text.translatable("minions.generic.name.taken")); } diff --git a/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor.java b/src/main/java/io/github/skippyall/minions/mixinhelper/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor.java similarity index 80% rename from src/main/java/io/github/skippyall/minions/mixinhelper/ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor.java rename to src/main/java/io/github/skippyall/minions/mixinhelper/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor.java index 6497c80..550405a 100644 --- a/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor.java +++ b/src/main/java/io/github/skippyall/minions/mixinhelper/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor.java @@ -1,4 +1,4 @@ -package io.github.skippyall.minions.mixinhelper; +package io.github.skippyall.minions.mixinhelper.antimobcap; public interface ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor { void minions$markAsMinionless(); diff --git a/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkLevelManagerAccessor.java b/src/main/java/io/github/skippyall/minions/mixinhelper/antimobcap/ChunkLevelManagerAccessor.java similarity index 85% rename from src/main/java/io/github/skippyall/minions/mixinhelper/ChunkLevelManagerAccessor.java rename to src/main/java/io/github/skippyall/minions/mixinhelper/antimobcap/ChunkLevelManagerAccessor.java index 97fb8a0..d09336e 100644 --- a/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkLevelManagerAccessor.java +++ b/src/main/java/io/github/skippyall/minions/mixinhelper/antimobcap/ChunkLevelManagerAccessor.java @@ -1,4 +1,4 @@ -package io.github.skippyall.minions.mixinhelper; +package io.github.skippyall.minions.mixinhelper.antimobcap; import it.unimi.dsi.fastutil.objects.ObjectSet; import net.minecraft.server.network.ServerPlayerEntity; diff --git a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java index 4af3981..4aae2d3 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java @@ -1,13 +1,12 @@ package io.github.skippyall.minions.mixins.antimobcap; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManagerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManagerAccessor; import it.unimi.dsi.fastutil.longs.Long2ByteMap; import it.unimi.dsi.fastutil.objects.ObjectSet; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ChunkLevelManager; -import net.minecraft.server.world.ChunkTicketManager; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManagerMixin.java b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManagerMixin.java index bd54b7e..6462587 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManagerMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManagerMixin.java @@ -1,8 +1,8 @@ package io.github.skippyall.minions.mixins.antimobcap; import com.llamalad7.mixinextras.sugar.Local; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManagerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManagerAccessor; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectSet; import net.minecraft.server.network.ServerPlayerEntity; diff --git a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ServerChunkManagerMixin.java b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ServerChunkManagerMixin.java index 85dc7e7..c55bc60 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ServerChunkManagerMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ServerChunkManagerMixin.java @@ -1,9 +1,8 @@ package io.github.skippyall.minions.mixins.antimobcap; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; -import io.github.skippyall.minions.mixinhelper.ChunkLevelManagerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; +import io.github.skippyall.minions.mixinhelper.antimobcap.ChunkLevelManagerAccessor; import net.minecraft.server.world.ChunkLevelManager; -import net.minecraft.server.world.ChunkTicketManager; import net.minecraft.server.world.ServerChunkManager; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/resources/data/minions/lang/en_us.json b/src/main/resources/data/minions/lang/en_us.json index 80aa310..7ac216a 100644 --- a/src/main/resources/data/minions/lang/en_us.json +++ b/src/main/resources/data/minions/lang/en_us.json @@ -81,7 +81,7 @@ "item.minions.minion": "Minion", "item.minions.basic_upgrade_base": "Basic Upgrade Base", "item.minions.advanced_upgrade_base": "Advanced Upgrade Base", - "item.minions.reference": "Reference", + "item.minions.clipboard": "Clipboard", "block.minions.minion_trigger": "Minion Trigger",