Configured

This commit is contained in:
skippyall
2026-01-31 15:46:40 +01:00
parent 1e430ef506
commit 0382798a5d
16 changed files with 131 additions and 39 deletions
@@ -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<String> myTargets, Set<String> otherTargets) {
}
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {}
@Override
public List<String> 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) {}
}
@@ -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) {
@@ -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();
}
}*/
}
@@ -24,7 +24,7 @@ public class MinionArgument {
public static MinionData parse(MinecraftServer server, String argument) throws CommandSyntaxException {
Optional<MinionData> data = Optional.empty();
if(argument.startsWith(MinionProfileUtils.PREFIX)) {
if(argument.startsWith(MinionProfileUtils.getPrefix())) {
data = MinionPersistentState.get(server).getMinionWithName(argument);
} else {
try {
@@ -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<ServerCommandSource> dispatcher) {
public static void register(CommandDispatcher<ServerCommandSource> dispatcher, CommandRegistryAccess access, CommandManager.RegistrationEnvironment environment) {
LiteralArgumentBuilder<ServerCommandSource> 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
);
}
}
@@ -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;
@@ -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();
});
}
@@ -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"));
}
@@ -1,4 +1,4 @@
package io.github.skippyall.minions.mixinhelper;
package io.github.skippyall.minions.mixinhelper.antimobcap;
public interface ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor {
void minions$markAsMinionless();
@@ -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;
@@ -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;
@@ -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;
@@ -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;