From c7af5d198f6a57851368a42f221154fbf7ffb3f2 Mon Sep 17 00:00:00 2001 From: LB2345 <163643124+LovelyBunny11@users.noreply.github.com> Date: Wed, 21 May 2025 07:56:41 +0300 Subject: [PATCH] Added Config and made the distance players no longer render configurable. --- .../stachel/zombiesutils/ZombiesUtils.java | 2 + .../zombiesutils/config/AbstractConfig.java | 45 ++++++++++++++++ .../stachel/zombiesutils/config/Config.java | 53 +++++++++++++++++++ .../zombiesutils/config/IntConfig.java | 39 ++++++++++++++ .../mixin/OtherClientPlayerEntityMixin.java | 5 +- 5 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 src/main/java/xyz/stachel/zombiesutils/config/AbstractConfig.java create mode 100644 src/main/java/xyz/stachel/zombiesutils/config/Config.java create mode 100644 src/main/java/xyz/stachel/zombiesutils/config/IntConfig.java diff --git a/src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java b/src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java index fa9cc87..67ae4ff 100644 --- a/src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java +++ b/src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java @@ -6,6 +6,7 @@ import net.hypixel.modapi.HypixelModAPI; import net.hypixel.modapi.packet.impl.clientbound.event.ClientboundLocationPacket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import xyz.stachel.zombiesutils.config.Config; import xyz.stachel.zombiesutils.handlers.Location; import xyz.stachel.zombiesutils.handlers.Renderer; @@ -20,5 +21,6 @@ public class ZombiesUtils implements ModInitializer { HypixelModAPI.getInstance().createHandler(ClientboundLocationPacket.class, Location::onLocation); ZombiesUtils.LOGGER.info("initializing..."); HudLayerRegistrationCallback.EVENT.register(new Renderer()); + Config.readFile(); } } diff --git a/src/main/java/xyz/stachel/zombiesutils/config/AbstractConfig.java b/src/main/java/xyz/stachel/zombiesutils/config/AbstractConfig.java new file mode 100644 index 0000000..8d97cec --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/config/AbstractConfig.java @@ -0,0 +1,45 @@ +package xyz.stachel.zombiesutils.config; + +import com.google.common.base.CaseFormat; +import net.minecraft.client.gui.tooltip.Tooltip; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.text.Text; + +public abstract class AbstractConfig { + private final Text message; + private final Tooltip tooltip; + private T value; + + public AbstractConfig(String key, T defaultValue) { + value = defaultValue; + message = Text.translatable(String.format("hardcover.config.%s", toSnakeCase(key))); + tooltip = Tooltip.of(Text.translatable(String.format("hardcover.config.tooltip.%s", toSnakeCase(key)))); + } + + private static String toSnakeCase(String text) { + return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, text); + } + + public abstract ClickableWidget createWidget(Runnable callback); + + public ClickableWidget createWidget() { + return createWidget(() -> {}); + } + + public Text getMessage() { + return message; + } + + public Tooltip getTooltip() { + return tooltip; + } + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + Config.writeFile(); + } +} \ No newline at end of file diff --git a/src/main/java/xyz/stachel/zombiesutils/config/Config.java b/src/main/java/xyz/stachel/zombiesutils/config/Config.java new file mode 100644 index 0000000..ef298f6 --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/config/Config.java @@ -0,0 +1,53 @@ +package xyz.stachel.zombiesutils.config; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonParser; +import net.fabricmc.loader.api.FabricLoader; +import xyz.stachel.zombiesutils.ZombiesUtils; + +import java.lang.reflect.Modifier; +import java.nio.file.Files; +import java.nio.file.Path; + +public final class Config { + private static final Gson GSON = new GsonBuilder() + .registerTypeAdapter(IntConfig.class, new IntConfig.Serializer()) + .excludeFieldsWithModifiers(Modifier.TRANSIENT) + .setPrettyPrinting() + .create(); + private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve(String.format("%s.json", ZombiesUtils.MOD_ID)); + + public static void readFile() { + if (Files.exists(PATH)) { + try (var reader = Files.newBufferedReader(PATH)) { + var jsonElement = JsonParser.parseReader(reader); + + for (var field : Configs.class.getDeclaredFields()) { + var value = jsonElement.getAsJsonObject().get(field.getName()); + + if (value != null) { + var fieldType = field.getType(); + + if (IntConfig.class.isAssignableFrom(fieldType)) { + var intValue = value.getAsInt(); + ((IntConfig) field.get(null)).setValue(intValue); + } + } + } + } catch (Exception exception) { + ZombiesUtils.LOGGER.error("Failed to load configs at '{}'. Using default values.", PATH, exception); + } + } else { + writeFile(); + } + } + + public static void writeFile() { + try (var writer = Files.newBufferedWriter(PATH)) { + GSON.toJson(new Configs(), writer); + } catch (Exception exception) { + ZombiesUtils.LOGGER.error("Failed to save configs to '{}'.", PATH, exception); + } + } +} \ No newline at end of file diff --git a/src/main/java/xyz/stachel/zombiesutils/config/IntConfig.java b/src/main/java/xyz/stachel/zombiesutils/config/IntConfig.java new file mode 100644 index 0000000..60534a0 --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/config/IntConfig.java @@ -0,0 +1,39 @@ +package xyz.stachel.zombiesutils.config; + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.CyclingButtonWidget; +import net.minecraft.text.Text; + +import java.lang.reflect.Type; + +public class IntConfig extends AbstractConfig { + + public IntConfig(String key, Integer defaultValue) { + super(key, defaultValue); + } + + public static IntConfig of(String key, int defaultValue) { + return new IntConfig(key, defaultValue); + } + + @Override + public ClickableWidget createWidget(Runnable callback) { + return CyclingButtonWidget.builder((value) -> Text.of(getValue().toString())).initially(getValue()) + .tooltip(value -> getTooltip()) + .build(getMessage(), (button, value) -> { + setValue(value); + callback.run(); + }); + } + + public static class Serializer implements JsonSerializer { + @Override + public JsonElement serialize(IntConfig value, Type type, JsonSerializationContext context) { + return new JsonPrimitive(value.getValue()); + } + } +} diff --git a/src/main/java/xyz/stachel/zombiesutils/mixin/OtherClientPlayerEntityMixin.java b/src/main/java/xyz/stachel/zombiesutils/mixin/OtherClientPlayerEntityMixin.java index 8fb5962..556d837 100644 --- a/src/main/java/xyz/stachel/zombiesutils/mixin/OtherClientPlayerEntityMixin.java +++ b/src/main/java/xyz/stachel/zombiesutils/mixin/OtherClientPlayerEntityMixin.java @@ -7,6 +7,7 @@ import net.minecraft.client.network.OtherClientPlayerEntity; import net.minecraft.client.world.ClientWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import xyz.stachel.zombiesutils.config.Configs; @Mixin(OtherClientPlayerEntity.class) public abstract class OtherClientPlayerEntityMixin extends AbstractClientPlayerEntity { @@ -17,8 +18,8 @@ public abstract class OtherClientPlayerEntityMixin extends AbstractClientPlayerE @ModifyReturnValue(method = "shouldRender", at = @At(value = "RETURN")) public boolean shouldRender(boolean original, double distance) { - int dist = 1; - double d = this.getBoundingBox().getAverageSideLength() * 1.75 + ((double) dist * 2.5D); + int dist = Configs.playerVisibleDistance.getValue(); + double d = this.getBoundingBox().getAverageSideLength() * 1.75 + (double) dist; if (Double.isNaN(d)) { d = 1.0; }