Minion Config²

This commit is contained in:
skippyall
2026-02-07 23:44:50 +01:00
parent 0382798a5d
commit 9b61dba4c7
12 changed files with 240 additions and 24 deletions
@@ -13,6 +13,8 @@ import com.electronwill.nightconfig.toml.TomlFormat;
import com.electronwill.nightconfig.toml.TomlParser; import com.electronwill.nightconfig.toml.TomlParser;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import static com.electronwill.nightconfig.core.serde.annotations.SerdeSkipDeserializingIf.SkipDeIf.IS_MISSING; import static com.electronwill.nightconfig.core.serde.annotations.SerdeSkipDeserializingIf.SkipDeIf.IS_MISSING;
@@ -44,7 +46,15 @@ public class MinionsConfig {
} }
private static Path getPath() { private static Path getPath() {
return FabricLoader.getInstance().getConfigDir().resolve(Minions.MOD_ID + ".toml"); Path minionsDir = FabricLoader.getInstance().getConfigDir().resolve("minions");
if(!Files.isDirectory(minionsDir)) {
try {
Files.createDirectory(minionsDir);
} catch (IOException e) {
Minions.LOGGER.error("Could not create config dir", e);
}
}
return minionsDir.resolve(Minions.MOD_ID + ".toml");
} }
public static MinionsConfig get() { public static MinionsConfig get() {
@@ -55,7 +65,6 @@ public class MinionsConfig {
} }
public static void loadConfig() { public static void loadConfig() {
System.out.println("loading");
try { try {
CommentedConfig config = new TomlParser().parse(getPath(), (file, configFormat) -> { CommentedConfig config = new TomlParser().parse(getPath(), (file, configFormat) -> {
CommentedConfig defaultConfig = ObjectSerializer.standard().serializeFields(new MinionsConfig(), TomlFormat::newConfig); CommentedConfig defaultConfig = ObjectSerializer.standard().serializeFields(new MinionsConfig(), TomlFormat::newConfig);
@@ -65,8 +74,7 @@ public class MinionsConfig {
INSTANCE = ObjectDeserializer.standard().deserializeFields(config, MinionsConfig::new); INSTANCE = ObjectDeserializer.standard().deserializeFields(config, MinionsConfig::new);
} catch (SerdeException | ParsingException | WritingException e) { } catch (SerdeException | ParsingException | WritingException e) {
System.out.println("[minions] Error while reading config"); Minions.LOGGER.error("Error while reading config", e);
e.printStackTrace();
INSTANCE = new MinionsConfig(); INSTANCE = new MinionsConfig();
} }
} }
@@ -0,0 +1,63 @@
package io.github.skippyall.minions.minion;
import com.mojang.serialization.Codec;
import io.github.skippyall.minions.registration.MinionRegistries;
import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class MinionConfig {
public static final Codec<MinionConfig> CODEC = Codec.<Option<?>, Object>dispatchedMap(
MinionRegistries.MINION_CONFIG_OPTIONS.getCodec(),
Option::codec
).xmap(MinionConfig::new, config -> config.values);
private final Map<Option<?>, Object> values;
public MinionConfig() {
values = new HashMap<>();
}
private MinionConfig(Map<Option<?>, Object> values) {
this.values = new HashMap<>(values);
}
public <T> T getOption(Option<T> option) {
if(values.containsKey(option)) {
//noinspection unchecked
return (T) values.get(option);
} else {
return option.defaultValue();
}
}
@Override
public boolean equals(Object o) {
if (!(o instanceof MinionConfig that)) return false;
return Objects.equals(values, that.values);
}
@Override
public int hashCode() {
return Objects.hashCode(values);
}
public static Option<Boolean> booleanOption(Identifier key, boolean defaultValue) {
return new Option<>(key, defaultValue, Codec.BOOL);
}
public record Option<T>(Identifier key, T defaultValue, Codec<T> codec) {
@Override
public boolean equals(Object o) {
if (!(o instanceof Option<?> option)) return false;
return Objects.equals(key, option.key);
}
@Override
public int hashCode() {
return Objects.hashCode(key);
}
}
}
@@ -12,7 +12,14 @@ import net.minecraft.util.dynamic.Codecs;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
public record MinionData(UUID uuid, String name, Optional<PropertyMap> skin, boolean isSpawned, SerializableListenerManager<MinionListener> listeners) { public record MinionData(
UUID uuid,
String name,
Optional<PropertyMap> skin,
boolean isSpawned,
SerializableListenerManager<MinionListener> listeners,
MinionConfig config
) {
public static final Codec<MinionData> CODEC = RecordCodecBuilder.create(instance -> public static final Codec<MinionData> CODEC = RecordCodecBuilder.create(instance ->
instance.group( instance.group(
Uuids.CODEC.fieldOf("uuid").forGetter(MinionData::uuid), Uuids.CODEC.fieldOf("uuid").forGetter(MinionData::uuid),
@@ -22,23 +29,31 @@ public record MinionData(UUID uuid, String name, Optional<PropertyMap> skin, boo
SerializableListenerManager.getCodec(MinionRegistries.MINION_LISTENER_CODECS).optionalFieldOf("listeners").xmap( SerializableListenerManager.getCodec(MinionRegistries.MINION_LISTENER_CODECS).optionalFieldOf("listeners").xmap(
optional -> optional.orElseGet(() -> new SerializableListenerManager<>(MinionRegistries.MINION_LISTENER_CODECS)), optional -> optional.orElseGet(() -> new SerializableListenerManager<>(MinionRegistries.MINION_LISTENER_CODECS)),
Optional::of Optional::of
).forGetter(MinionData::listeners) ).forGetter(MinionData::listeners),
MinionConfig.CODEC.optionalFieldOf("config", new MinionConfig()).forGetter(MinionData::config)
).apply(instance, MinionData::new) ).apply(instance, MinionData::new)
); );
public static MinionData createDefault(MinecraftServer server) { public static MinionData createDefault(MinecraftServer server) {
return new MinionData(UUID.randomUUID(), MinionProfileUtils.newDefaultMinionName(server), Optional.empty(), false, new SerializableListenerManager<>(MinionRegistries.MINION_LISTENER_CODECS)); return new MinionData(
UUID.randomUUID(),
MinionProfileUtils.newDefaultMinionName(server),
Optional.empty(),
false,
new SerializableListenerManager<>(MinionRegistries.MINION_LISTENER_CODECS),
new MinionConfig()
);
} }
public MinionData withName(String name) { public MinionData withName(String name) {
return new MinionData(uuid, name, skin, isSpawned, listeners); return new MinionData(uuid, name, skin, isSpawned, listeners, config);
} }
public MinionData withSkin(Optional<PropertyMap> skin) { public MinionData withSkin(Optional<PropertyMap> skin) {
return new MinionData(uuid, name, skin, isSpawned, listeners); return new MinionData(uuid, name, skin, isSpawned, listeners, config);
} }
public MinionData withSpawned(boolean isSpawned) { public MinionData withSpawned(boolean isSpawned) {
return new MinionData(uuid, name, skin, isSpawned, listeners); return new MinionData(uuid, name, skin, isSpawned, listeners, config);
} }
} }
@@ -3,6 +3,7 @@ package io.github.skippyall.minions.minion.fakeplayer;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.PropertyMap; import com.mojang.authlib.properties.PropertyMap;
import io.github.skippyall.minions.registration.MinionConfigOptions;
import io.github.skippyall.minions.registration.MinionItems; import io.github.skippyall.minions.registration.MinionItems;
import io.github.skippyall.minions.minion.MinionListener; import io.github.skippyall.minions.minion.MinionListener;
import io.github.skippyall.minions.minion.MinionData; import io.github.skippyall.minions.minion.MinionData;
@@ -143,11 +144,11 @@ public class MinionFakePlayer extends ServerPlayerEntity {
} }
public boolean canSpawnMobs() { public boolean canSpawnMobs() {
return moduleInventory.hasAbility(SpecialAbilities.MOB_SPAWNING); return moduleInventory.hasAbility(SpecialAbilities.MOB_SPAWNING) || getData().config().getOption(MinionConfigOptions.spawnAndDespawnMobs);
} }
public boolean canDespawnMobs() { public boolean canDespawnMobs() {
return moduleInventory.hasAbility(SpecialAbilities.MOB_SPAWNING); return canSpawnMobs();
} }
@Override @Override
@@ -2,22 +2,102 @@ package io.github.skippyall.minions.minion.skin;
import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.Property;
import com.mojang.authlib.properties.PropertyMap; import com.mojang.authlib.properties.PropertyMap;
import io.github.skippyall.minions.gui.input.TextInput; import io.github.skippyall.minions.Minions;
import net.minecraft.dialog.AfterAction;
import net.minecraft.dialog.DialogActionButtonData;
import net.minecraft.dialog.DialogButtonData;
import net.minecraft.dialog.DialogCommonData;
import net.minecraft.dialog.action.DynamicCustomDialogAction;
import net.minecraft.dialog.input.TextInputControl;
import net.minecraft.dialog.type.Dialog;
import net.minecraft.dialog.type.DialogInput;
import net.minecraft.dialog.type.NoticeDialog;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.registry.RegistryKey;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class Base64SkinProvider implements SkinProvider { public class Base64SkinProvider implements SkinProvider {
public static final RegistryKey<Dialog> DIALOG = RegistryKey.of(RegistryKeys.DIALOG, Identifier.of(Minions.MOD_ID, "base_64_input"));
public static final Identifier CUSTOM_DIALOG_ACTION = Identifier.of(Minions.MOD_ID, "base_64_submit");
private static long dialogIdCounter = 0;
private static Map<Long, CompletableFuture<Optional<PropertyMap>>> futures = new HashMap<>();
@Override @Override
public CompletableFuture<Optional<PropertyMap>> openSkinMenu(ServerPlayerEntity player) { public CompletableFuture<Optional<PropertyMap>> openSkinMenu(ServerPlayerEntity player) {
return TextInput.inputString(player, Text.translatable("minions.gui.look.skin.base64.title"), "") dialogIdCounter++;
.thenApply(base64String -> { player.openDialog(getDialog());
CompletableFuture<Optional<PropertyMap>> future = new CompletableFuture<>();
futures.put(dialogIdCounter, future);
return future;
}
public static void onCustomDialogAction(Optional<NbtElement> element) {
if(element.isPresent() && element.get() instanceof NbtCompound compound) {
Optional<Long> id = compound.getLong("dialog_id");
Optional<String> base64 = compound.getString("base_64");
if(id.isPresent() && base64.isPresent() && !base64.get().isBlank()) {
if(futures.containsKey(id.get())) {
PropertyMap map = new PropertyMap(); PropertyMap map = new PropertyMap();
map.put("textures", new Property("textures", base64String)); map.put("textures", new Property("textures", base64.get().strip()));
return Optional.of(map);
}); futures.get(id.get()).complete(Optional.of(map));
futures.remove(id.get());
}
}
}
}
private static RegistryEntry<Dialog> getDialog() {
NbtCompound additionalData = new NbtCompound();
additionalData.putLong("dialog_id", dialogIdCounter);
return RegistryEntry.of(
new NoticeDialog(
new DialogCommonData(
Text.translatable("minions.gui.look.skin.base64.title"),
Optional.empty(),
true,
false,
AfterAction.CLOSE,
List.of(),
List.of(
new DialogInput("base_64", new TextInputControl(
200,
Text.empty(),
false,
"",
2000,
Optional.empty()
))
)
),
new DialogActionButtonData(
new DialogButtonData(
Text.translatable("gui.ok"),
150
),
Optional.of(
new DynamicCustomDialogAction(
CUSTOM_DIALOG_ACTION,
Optional.of(
additionalData
)
)
)
)
)
);
} }
@Override @Override
@@ -2,21 +2,38 @@ package io.github.skippyall.minions.mixins;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.minion.skin.Base64SkinProvider;
import io.github.skippyall.minions.registration.MinionConfigOptions;
import net.minecraft.nbt.NbtElement;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Mixin(MinecraftServer.class) @Mixin(MinecraftServer.class)
public class MinecraftServerMixin { public class MinecraftServerMixin {
@ModifyExpressionValue(method = "createMetadataPlayers", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;getPlayerList()Ljava/util/List;")) @ModifyExpressionValue(method = "createMetadataPlayers", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;getPlayerList()Ljava/util/List;"))
public List<ServerPlayerEntity> ignoreFakePlayers(List<ServerPlayerEntity> original) { public List<ServerPlayerEntity> ignoreFakePlayers(List<ServerPlayerEntity> original) {
return original.stream() return original.stream()
.filter(player -> !(player instanceof MinionFakePlayer)) .filter(player -> !(player instanceof MinionFakePlayer minion
&& !minion.getData().config().getOption(MinionConfigOptions.showInServerList)))
.collect(Collectors.toCollection(ArrayList::new)); .collect(Collectors.toCollection(ArrayList::new));
} }
@Inject(method = "handleCustomClickAction", at = @At("HEAD"), cancellable = true)
private void onCustomClickAction(Identifier id, Optional<NbtElement> payload, CallbackInfo ci) {
if(id.equals(Base64SkinProvider.CUSTOM_DIALOG_ACTION)) {
Base64SkinProvider.onCustomDialogAction(payload);
ci.cancel();
}
}
} }
@@ -2,6 +2,7 @@ package io.github.skippyall.minions.mixins;
import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Local;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.registration.MinionConfigOptions;
import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -12,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg;
public class PlayerListEntryS2CPacket$EntryMixin { public class PlayerListEntryS2CPacket$EntryMixin {
@ModifyArg(method = "<init>(Lnet/minecraft/server/network/ServerPlayerEntity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/PlayerListS2CPacket$Entry;<init>(Ljava/util/UUID;Lcom/mojang/authlib/GameProfile;ZILnet/minecraft/world/GameMode;Lnet/minecraft/text/Text;ZILnet/minecraft/network/encryption/PublicPlayerSession$Serialized;)V"), index = 2) @ModifyArg(method = "<init>(Lnet/minecraft/server/network/ServerPlayerEntity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/PlayerListS2CPacket$Entry;<init>(Ljava/util/UUID;Lcom/mojang/authlib/GameProfile;ZILnet/minecraft/world/GameMode;Lnet/minecraft/text/Text;ZILnet/minecraft/network/encryption/PublicPlayerSession$Serialized;)V"), index = 2)
private static boolean removeMinionFromTabList(boolean original, @Local(argsOnly = true) ServerPlayerEntity player) { private static boolean removeMinionFromTabList(boolean original, @Local(argsOnly = true) ServerPlayerEntity player) {
if(player instanceof MinionFakePlayer) { if(player instanceof MinionFakePlayer minion && !minion.getData().config().getOption(MinionConfigOptions.showInTabList)) {
return false; return false;
} }
@@ -8,6 +8,7 @@ import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.minion.fakeplayer.NetHandlerPlayServerFake; import io.github.skippyall.minions.minion.fakeplayer.NetHandlerPlayServerFake;
import io.github.skippyall.minions.registration.MinionConfigOptions;
import net.minecraft.network.ClientConnection; import net.minecraft.network.ClientConnection;
import net.minecraft.network.packet.c2s.common.SyncedClientOptions; import net.minecraft.network.packet.c2s.common.SyncedClientOptions;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
@@ -61,7 +62,7 @@ public class PlayerListMixin {
@WrapOperation(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V")) @WrapOperation(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V"))
public void noLoginMessage(PlayerManager instance, Text message, boolean overlay, Operation<Void> original, @Local(argsOnly = true) ServerPlayerEntity player) { public void noLoginMessage(PlayerManager instance, Text message, boolean overlay, Operation<Void> original, @Local(argsOnly = true) ServerPlayerEntity player) {
if(!(player instanceof MinionFakePlayer)) { if(!(player instanceof MinionFakePlayer minion && !minion.getData().config().getOption(MinionConfigOptions.sendLoginMessage))) {
original.call(instance, message, overlay); original.call(instance, message, overlay);
} }
} }
@@ -69,7 +70,7 @@ public class PlayerListMixin {
@ModifyReceiver(method = "checkCanJoin", at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")) @ModifyReceiver(method = "checkCanJoin", at = @At(value = "INVOKE", target = "Ljava/util/List;size()I"))
public List<ServerPlayerEntity> noMinionCounting(List<ServerPlayerEntity> instance) { public List<ServerPlayerEntity> noMinionCounting(List<ServerPlayerEntity> instance) {
return instance.stream() return instance.stream()
.filter(player -> !(player instanceof MinionFakePlayer)) .filter(player -> !(player instanceof MinionFakePlayer minion && !minion.getData().config().getOption(MinionConfigOptions.countForPlayerLimit)))
.collect(Collectors.toCollection(ArrayList::new)); .collect(Collectors.toCollection(ArrayList::new));
} }
} }
@@ -3,6 +3,7 @@ package io.github.skippyall.minions.mixins;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.registration.MinionConfigOptions;
import net.minecraft.server.PlayerManager; import net.minecraft.server.PlayerManager;
import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
@@ -18,7 +19,7 @@ public class ServerPlayNetworkHandlerMixin {
@WrapOperation(method = "cleanUp", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V")) @WrapOperation(method = "cleanUp", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V"))
public void noLogoutMessage(PlayerManager instance, Text message, boolean overlay, Operation<Void> original) { public void noLogoutMessage(PlayerManager instance, Text message, boolean overlay, Operation<Void> original) {
if(!(player instanceof MinionFakePlayer)) { if(!(player instanceof MinionFakePlayer minion && !minion.getData().config().getOption(MinionConfigOptions.sendLogoutMessage))) {
original.call(instance, message, overlay); original.call(instance, message, overlay);
} }
} }
@@ -3,6 +3,7 @@ package io.github.skippyall.minions.mixins;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.registration.MinionConfigOptions;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.SleepManager; import net.minecraft.server.world.SleepManager;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -12,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.At;
public class SleepManagerMixin { public class SleepManagerMixin {
@WrapOperation(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;isSpectator()Z")) @WrapOperation(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;isSpectator()Z"))
public boolean excludeMinions(ServerPlayerEntity instance, Operation<Boolean> original) { public boolean excludeMinions(ServerPlayerEntity instance, Operation<Boolean> original) {
if (instance instanceof MinionFakePlayer) { if (instance instanceof MinionFakePlayer minion && !minion.getData().config().getOption(MinionConfigOptions.countForSleeping)) {
return true; return true;
} else { } else {
return original.call(instance); return original.call(instance);
@@ -0,0 +1,26 @@
package io.github.skippyall.minions.registration;
import io.github.skippyall.minions.Minions;
import io.github.skippyall.minions.minion.MinionConfig;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
import static io.github.skippyall.minions.minion.MinionConfig.booleanOption;
public class MinionConfigOptions {
public static final MinionConfig.Option<Boolean> showInServerList = register(booleanOption(id("showInServerList"), false));
public static final MinionConfig.Option<Boolean> showInTabList = register(booleanOption(id("showInTabList"), false));
public static final MinionConfig.Option<Boolean> sendLoginMessage = register(booleanOption(id("sendLoginMessage"), false));
public static final MinionConfig.Option<Boolean> sendLogoutMessage = register(booleanOption(id("sendLogoutMessage"), false));
public static final MinionConfig.Option<Boolean> countForSleeping = register(booleanOption(id("countForSleeping"), false));
public static final MinionConfig.Option<Boolean> countForPlayerLimit = register(booleanOption(id("countForPlayerLimit"), false));
public static final MinionConfig.Option<Boolean> spawnAndDespawnMobs = register(booleanOption(id("spawnAndDespawnMobs"), false));
private static <T> MinionConfig.Option<T> register(MinionConfig.Option<T> option) {
return Registry.register(MinionRegistries.MINION_CONFIG_OPTIONS, option.key(), option);
}
private static Identifier id(String name) {
return Identifier.of(Minions.MOD_ID, name);
}
}
@@ -5,6 +5,7 @@ import com.mojang.serialization.MapCodec;
import io.github.skippyall.minions.Minions; import io.github.skippyall.minions.Minions;
import io.github.skippyall.minions.docs.ReferenceEntry; import io.github.skippyall.minions.docs.ReferenceEntry;
import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.gui.GuiDisplay;
import io.github.skippyall.minions.minion.MinionConfig;
import io.github.skippyall.minions.minion.MinionListener; import io.github.skippyall.minions.minion.MinionListener;
import io.github.skippyall.minions.minion.MinionRuntime; import io.github.skippyall.minions.minion.MinionRuntime;
import io.github.skippyall.minions.minion.skin.SkinProvider; import io.github.skippyall.minions.minion.skin.SkinProvider;
@@ -33,6 +34,7 @@ public class MinionRegistries {
public static final Registry<Codec<? extends MinionListener>> MINION_LISTENER_CODECS = registry("minion_listener_codec"); public static final Registry<Codec<? extends MinionListener>> MINION_LISTENER_CODECS = registry("minion_listener_codec");
public static final Registry<MapCodec<? extends Clipboard>> CLIPBOARD_TYPES = registry("clipboard_type"); public static final Registry<MapCodec<? extends Clipboard>> CLIPBOARD_TYPES = registry("clipboard_type");
public static final Registry<SpecialAbility> SPECIAL_ABILITIES = registry("special_ability"); public static final Registry<SpecialAbility> SPECIAL_ABILITIES = registry("special_ability");
public static final Registry<MinionConfig.Option<?>> MINION_CONFIG_OPTIONS = registry("minion_config_option");
public static final RegistryKey<Registry<GuiDisplay>> GUI_DISPLAY = key("gui_display"); public static final RegistryKey<Registry<GuiDisplay>> GUI_DISPLAY = key("gui_display");
public static final RegistryKey<Registry<ReferenceEntry>> REFERENCE_ENTRY = key("reference_entry"); public static final RegistryKey<Registry<ReferenceEntry>> REFERENCE_ENTRY = key("reference_entry");