diff --git a/build.forge.gradle.kts b/build.forge.gradle.kts index 8061b4c..b85dde2 100644 --- a/build.forge.gradle.kts +++ b/build.forge.gradle.kts @@ -66,14 +66,11 @@ legacyForge { } } -// No mixins exist yet (cat_vision.mixins.json has empty "mixins"/"client"). -// moddev's reobfJar (ART) hard-fails looking for the refmap's .mappings.tsrg, -// which the Mixin AP only emits when there is at least one mixin. Re-enable this -// block as soon as the first @Mixin is added. -//mixin { -// add(sourceSets.main.get(), "${prop("mod.id")}.mixins.refmap.json") -// config("${prop("mod.id")}.mixins.json") -//} +// These Forge versions run on SRG names, so the mixins need a refmap to find their targets. +mixin { + add(sourceSets.main.get(), "${prop("mod.id")}.mixins.refmap.json") + config("${prop("mod.id")}.mixins.json") +} repositories { mavenCentral() diff --git a/src/main/java/net/marios271/cat_vision/config/ConfigData.java b/src/main/java/net/marios271/cat_vision/config/ConfigData.java index a10004c..b20a97e 100644 --- a/src/main/java/net/marios271/cat_vision/config/ConfigData.java +++ b/src/main/java/net/marios271/cat_vision/config/ConfigData.java @@ -8,20 +8,28 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; -public class ConfigData { +public class ConfigData extends VisionSettings { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private transient File file; public boolean remember_nv = true; - public boolean auto_nv = true; public boolean blindness_immunity = true; public boolean nausea_immunity = true; public boolean darkness_immunity = true; public boolean has_nv = false; + public Map dimension_overrides = new LinkedHashMap<>(); + + public VisionSettings forDimension(String dimension) { + VisionSettings override = dimension == null ? null : dimension_overrides.get(dimension); + return override != null ? override : this; + } + public void save() { try (FileWriter writer = new FileWriter(file)) { GSON.toJson(this, writer); @@ -43,6 +51,7 @@ public static ConfigData load(File configDir) { } } if (result == null) result = new ConfigData(); + if (result.dimension_overrides == null) result.dimension_overrides = new LinkedHashMap<>(); result.file = file; return result; } diff --git a/src/main/java/net/marios271/cat_vision/config/ConfigScreen.java b/src/main/java/net/marios271/cat_vision/config/ConfigScreen.java index b29d85d..0f5f4bb 100644 --- a/src/main/java/net/marios271/cat_vision/config/ConfigScreen.java +++ b/src/main/java/net/marios271/cat_vision/config/ConfigScreen.java @@ -1,106 +1,220 @@ package net.marios271.cat_vision.config; +import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.marios271.cat_vision.handler.VisionHandler; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; -//? < 1.19 { -/*import net.minecraft.network.chat.TranslatableComponent; -*///?} >= 1.19 { import net.minecraft.network.chat.Component; -//?} +//? < 1.19 { +/*import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +*///?} + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.function.DoubleConsumer; +import java.util.function.Function; public class ConfigScreen { - public static Screen create(Screen parent, ConfigData config) { - ConfigBuilder builder = ConfigBuilder.create() - .setParentScreen(parent) - .setTitle( - //? < 1.19 { - /*new TranslatableComponent("text.cat_vision.config.title") - *///?} >= 1.19 { - Component.translatable("text.cat_vision.config.title") - //?} - ); - - ConfigCategory category = builder.getOrCreateCategory( - //? < 1.19 { - /*new TranslatableComponent("text.cat_vision.config.category") - *///?} >= 1.19 { - Component.translatable("text.cat_vision.config.category") - //?} - ); - ConfigEntryBuilder entryBuilder = builder.entryBuilder(); - - category.addEntry(entryBuilder.startBooleanToggle( - //? < 1.19 { - /*new TranslatableComponent("text.cat_vision.config.option.remember_nv"), - *///?} >= 1.19 { - Component.translatable("text.cat_vision.config.option.remember_nv"), - //?} - config.remember_nv - ) - .setDefaultValue(true) - .setSaveConsumer(v -> config.remember_nv = v) - .build()); - - category.addEntry(entryBuilder.startBooleanToggle( - //? < 1.19 { - /*new TranslatableComponent("text.cat_vision.config.option.auto_nv"), - *///?} >= 1.19 { - Component.translatable("text.cat_vision.config.option.auto_nv"), - //?} - config.auto_nv - ) - .setDefaultValue(true) - .setSaveConsumer(v -> config.auto_nv = v) - .build()); - - category.addEntry(entryBuilder.startBooleanToggle( - //? < 1.19 { - /*new TranslatableComponent("text.cat_vision.config.option.blindness_immunity"), - *///?} >= 1.19 { - Component.translatable("text.cat_vision.config.option.blindness_immunity"), - //?} - config.blindness_immunity - ) - .setDefaultValue(true) - .setSaveConsumer(v -> config.blindness_immunity = v) - .setTooltip( - //? < 1.19 { - /*new TranslatableComponent("text.cat_vision.config.tooltip.blindness_disclaimer.1"), - new TranslatableComponent("text.cat_vision.config.tooltip.blindness_disclaimer.2"), - new TranslatableComponent("text.cat_vision.config.tooltip.blindness_disclaimer.3"), - new TranslatableComponent("text.cat_vision.config.tooltip.blindness_disclaimer.4") - *///?} >= 1.19 { - Component.translatable("text.cat_vision.config.tooltip.blindness_disclaimer.1"), - Component.translatable("text.cat_vision.config.tooltip.blindness_disclaimer.2"), - Component.translatable("text.cat_vision.config.tooltip.blindness_disclaimer.3"), - Component.translatable("text.cat_vision.config.tooltip.blindness_disclaimer.4") - //?} - ) - .build()); - - category.addEntry(entryBuilder.startBooleanToggle( - //? < 1.19 { - /*new TranslatableComponent("text.cat_vision.config.option.nausea_immunity"), - *///?} >= 1.19 { - Component.translatable("text.cat_vision.config.option.nausea_immunity"), - //?} - config.nausea_immunity - ) - .setDefaultValue(true) - .setSaveConsumer(v -> config.nausea_immunity = v) - .build()); + private static final String PREFIX = "text.cat_vision.config."; + + public static Screen create(Screen parent, ConfigData config) { + ConfigBuilder builder = ConfigBuilder.create() + .setParentScreen(parent) + .setTitle(text(PREFIX + "title")); + + ConfigCategory category = builder.getOrCreateCategory(text(PREFIX + "category")); + ConfigEntryBuilder entryBuilder = builder.entryBuilder(); + + category.addEntry(entryBuilder.startBooleanToggle(text(PREFIX + "option.remember_nv"), config.remember_nv) + .setDefaultValue(true) + .setSaveConsumer(v -> config.remember_nv = v) + .build()); + + category.addEntry(autoNvEntry(entryBuilder, config)); + + category.addEntry(entryBuilder.startBooleanToggle(text(PREFIX + "option.blindness_immunity"), config.blindness_immunity) + .setDefaultValue(true) + .setSaveConsumer(v -> config.blindness_immunity = v) + .setTooltip( + text(PREFIX + "tooltip.blindness_disclaimer.1"), + text(PREFIX + "tooltip.blindness_disclaimer.2"), + text(PREFIX + "tooltip.blindness_disclaimer.3"), + text(PREFIX + "tooltip.blindness_disclaimer.4") + ) + .build()); + + category.addEntry(entryBuilder.startBooleanToggle(text(PREFIX + "option.nausea_immunity"), config.nausea_immunity) + .setDefaultValue(true) + .setSaveConsumer(v -> config.nausea_immunity = v) + .build()); //? >= 1.19 { - category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("text.cat_vision.config.option.darkness_immunity"), config.darkness_immunity) + category.addEntry(entryBuilder.startBooleanToggle(text(PREFIX + "option.darkness_immunity"), config.darkness_immunity) .setDefaultValue(true) .setSaveConsumer(v -> config.darkness_immunity = v) .build()); //?} - builder.setSavingRunnable(config::save); + for (AbstractConfigListEntry entry : curveEntries(entryBuilder, config)) + category.addEntry(entry); + + List afterSave = new ArrayList<>(); + addDimensionEntries(category, entryBuilder, config, afterSave); + + builder.setSavingRunnable(() -> { + for (Runnable task : afterSave) + task.run(); + config.save(); + }); + return builder.build(); + } + + private static void addDimensionEntries(ConfigCategory category, ConfigEntryBuilder entryBuilder, + ConfigData config, List afterSave) { + Set dimensions = new LinkedHashSet<>(Arrays.asList( + "minecraft:overworld", + "minecraft:the_nether", + "minecraft:the_end" + )); + dimensions.addAll(config.dimension_overrides.keySet()); + + String current = VisionHandler.dimensionOf(Minecraft.getInstance()); + if (current != null) + dimensions.add(current); + + for (String dimension : dimensions) { + VisionSettings existing = config.dimension_overrides.get(dimension); + VisionSettings settings = existing != null ? existing : config.copy(); + VisionSettings asShown = settings.copy(); - return builder.build(); - } + if (existing == null) + afterSave.add(() -> { + if (config.dimension_overrides.get(dimension) == settings && settings.sameAs(asShown)) + settings.copyFrom(config); + }); + + List entries = new ArrayList<>(); + entries.add(entryBuilder.startBooleanToggle(text(PREFIX + "option.dimension_override"), existing != null) + .setDefaultValue(false) + .setTooltip( + text(PREFIX + "tooltip.dimension_override.1"), + text(PREFIX + "tooltip.dimension_override.2"), + text(PREFIX + "tooltip.dimension_override.3") + ) + .setSaveConsumer(v -> { + if (v) config.dimension_overrides.put(dimension, settings); + else config.dimension_overrides.remove(dimension); + }) + .build()); + entries.add(autoNvEntry(entryBuilder, settings)); + entries.addAll(curveEntries(entryBuilder, settings)); + + category.addEntry(entryBuilder.startSubCategory(dimensionName(dimension), entries).build()); + } + } + + private static Component dimensionName(String dimension) { + switch (dimension) { + case "minecraft:overworld": + return text(PREFIX + "dimension.overworld"); + case "minecraft:the_nether": + return text(PREFIX + "dimension.the_nether"); + case "minecraft:the_end": + return text(PREFIX + "dimension.the_end"); + default: + return literal(dimension); + } + } + + private static AbstractConfigListEntry autoNvEntry(ConfigEntryBuilder entryBuilder, VisionSettings settings) { + return entryBuilder.startBooleanToggle(text(PREFIX + "option.auto_nv"), settings.auto_nv) + .setDefaultValue(true) + .setSaveConsumer(v -> settings.auto_nv = v) + .build(); + } + + private static List curveEntries(ConfigEntryBuilder entryBuilder, VisionSettings settings) { + List entries = new ArrayList<>(); + + entries.add(entryBuilder.startBooleanToggle(text(PREFIX + "option.nv_curve"), settings.nv_curve) + .setDefaultValue(false) + .setTooltip( + text(PREFIX + "tooltip.nv_curve.1"), + text(PREFIX + "tooltip.nv_curve.2"), + text(PREFIX + "tooltip.nv_curve.3"), + text(PREFIX + "tooltip.nv_curve.4") + ) + .setSaveConsumer(v -> settings.nv_curve = v) + .build()); + + entries.add(slider(entryBuilder, "nv_lit", percent(settings.nv_lit), 0, 100, 0, + v -> literal(v + "%"), + v -> settings.nv_lit = v / 100.0, + text(PREFIX + "tooltip.nv_lit.1"), + text(PREFIX + "tooltip.nv_lit.2"))); + + entries.add(slider(entryBuilder, "nv_dark", percent(settings.nv_dark), 0, 100, 100, + v -> literal(v + "%"), + v -> settings.nv_dark = v / 100.0, + text(PREFIX + "tooltip.nv_dark.1"), + text(PREFIX + "tooltip.nv_dark.2"), + text(PREFIX + "tooltip.nv_dark.3"))); + + entries.add(slider(entryBuilder, "nv_lit_light", settings.nv_lit_light, 0, 15, 12, + v -> literal(String.valueOf(v)), + v -> settings.nv_lit_light = (int) v, + text(PREFIX + "tooltip.nv_lit_light"))); + + entries.add(slider(entryBuilder, "nv_shape", (int) Math.round(settings.nv_shape * 10), 1, 50, 10, + v -> literal(String.format(Locale.ROOT, "%.1f", v / 10.0)), + v -> settings.nv_shape = v / 10.0, + text(PREFIX + "tooltip.nv_shape.1"), + text(PREFIX + "tooltip.nv_shape.2"))); + + entries.add(slider(entryBuilder, "nv_speed", (int) Math.round(settings.nv_speed * 100), 1, 100, 1, + v -> literal(String.format(Locale.ROOT, "%.2f", v / 100.0)), + v -> settings.nv_speed = v / 100.0, + text(PREFIX + "tooltip.nv_speed"))); + + return entries; + } + + private static AbstractConfigListEntry slider(ConfigEntryBuilder entryBuilder, String key, int value, + int min, int max, int defaultValue, Function textGetter, + DoubleConsumer save, Component... tooltip) { + return entryBuilder.startIntSlider(text(PREFIX + "option." + key), value, min, max) + .setDefaultValue(defaultValue) + .setTextGetter(textGetter) + .setTooltip(tooltip) + .setSaveConsumer(v -> save.accept(v)) + .build(); + } + + private static int percent(double value) { + return (int) Math.round(value * 100); + } + + private static Component text(String key) { + //? < 1.19 { + /*return new TranslatableComponent(key); + *///?} >= 1.19 { + return Component.translatable(key); + //?} + } + + private static Component literal(String value) { + //? < 1.19 { + /*return new TextComponent(value); + *///?} >= 1.19 { + return Component.literal(value); + //?} + } } diff --git a/src/main/java/net/marios271/cat_vision/config/VisionSettings.java b/src/main/java/net/marios271/cat_vision/config/VisionSettings.java new file mode 100644 index 0000000..5d9cf66 --- /dev/null +++ b/src/main/java/net/marios271/cat_vision/config/VisionSettings.java @@ -0,0 +1,55 @@ +package net.marios271.cat_vision.config; + +public class VisionSettings { + public boolean auto_nv = true; + + public boolean nv_curve = false; + public double nv_lit = 0.0; + public double nv_dark = 1.0; + public double nv_shape = 1.0; + public int nv_lit_light = 12; + public double nv_speed = 0.01; + + public double strengthFor(int light) { + int litLight = (int) clamp(nv_lit_light, 0, 15); + double shape = clamp(nv_shape, 0.01, 10.0); + + double darkness = litLight <= 0 + ? (light <= 0 ? 1.0 : 0.0) + : clamp((litLight - light) / (double) litLight, 0.0, 1.0); + return clamp(nv_lit + (nv_dark - nv_lit) * Math.pow(darkness, shape), 0.0, 1.0); + } + + public boolean sameAs(VisionSettings other) { + return auto_nv == other.auto_nv && sameCurveAs(other); + } + + public boolean sameCurveAs(VisionSettings other) { + return nv_curve == other.nv_curve + && nv_lit == other.nv_lit + && nv_dark == other.nv_dark + && nv_lit_light == other.nv_lit_light + && nv_shape == other.nv_shape + && nv_speed == other.nv_speed; + } + + public VisionSettings copy() { + VisionSettings copy = new VisionSettings(); + copy.copyFrom(this); + return copy; + } + + public void copyFrom(VisionSettings other) { + auto_nv = other.auto_nv; + nv_curve = other.nv_curve; + nv_lit = other.nv_lit; + nv_dark = other.nv_dark; + nv_shape = other.nv_shape; + nv_lit_light = other.nv_lit_light; + nv_speed = other.nv_speed; + } + + public static double clamp(double value, double min, double max) { + return value < min ? min : Math.min(value, max); + } +} diff --git a/src/main/java/net/marios271/cat_vision/event/DisconnectListener.java b/src/main/java/net/marios271/cat_vision/event/DisconnectListener.java index d809685..abc15a1 100644 --- a/src/main/java/net/marios271/cat_vision/event/DisconnectListener.java +++ b/src/main/java/net/marios271/cat_vision/event/DisconnectListener.java @@ -1,9 +1,11 @@ package net.marios271.cat_vision.event; import net.marios271.cat_vision.CatVision; +import net.marios271.cat_vision.handler.VisionHandler; public class DisconnectListener { public static void onDisconnect() { + VisionHandler.reset(); CatVision.CONFIG.save(); } } diff --git a/src/main/java/net/marios271/cat_vision/event/EndTickListener.java b/src/main/java/net/marios271/cat_vision/event/EndTickListener.java index 990acb4..97068ee 100644 --- a/src/main/java/net/marios271/cat_vision/event/EndTickListener.java +++ b/src/main/java/net/marios271/cat_vision/event/EndTickListener.java @@ -2,6 +2,7 @@ import net.marios271.cat_vision.CatVision; import net.marios271.cat_vision.config.ConfigData; +import net.marios271.cat_vision.handler.VisionHandler; import net.minecraft.client.Minecraft; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; @@ -13,6 +14,8 @@ public static void onEndTick(Minecraft client) { ConfigData config = CatVision.CONFIG; + VisionHandler.tick(client); + boolean isSingleplayer = client.getSingleplayerServer() != null && !client.getSingleplayerServer().isPublished(); diff --git a/src/main/java/net/marios271/cat_vision/event/JoinListener.java b/src/main/java/net/marios271/cat_vision/event/JoinListener.java index 9f17fc6..6c1ebe7 100644 --- a/src/main/java/net/marios271/cat_vision/event/JoinListener.java +++ b/src/main/java/net/marios271/cat_vision/event/JoinListener.java @@ -1,24 +1,13 @@ package net.marios271.cat_vision.event; -import net.marios271.cat_vision.CatVision; -import net.marios271.cat_vision.config.ConfigData; +import net.marios271.cat_vision.handler.VisionHandler; import net.minecraft.client.Minecraft; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; public class JoinListener { public static void onJoin(Minecraft client) { if (client.player == null) return; - ConfigData config = CatVision.CONFIG; - - if (config.auto_nv || (config.remember_nv && config.has_nv)) - config.has_nv = true; - else - config.has_nv = false; - - if (config.has_nv) - client.player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, Integer.MAX_VALUE)); + VisionHandler.applyNightVision(client, VisionHandler.dimensionOf(client)); } } diff --git a/src/main/java/net/marios271/cat_vision/handler/VisionHandler.java b/src/main/java/net/marios271/cat_vision/handler/VisionHandler.java new file mode 100644 index 0000000..773623c --- /dev/null +++ b/src/main/java/net/marios271/cat_vision/handler/VisionHandler.java @@ -0,0 +1,100 @@ +package net.marios271.cat_vision.handler; + +import net.marios271.cat_vision.CatVision; +import net.marios271.cat_vision.config.ConfigData; +import net.marios271.cat_vision.config.VisionSettings; +import net.minecraft.client.Minecraft; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; + +public class VisionHandler { + + private static String lastDimension = null; + + private static volatile boolean curveActive = false; + private static volatile float strength = 0.0F; + + private static final int OUR_EFFECT = 20 * 60 * 60; + + public static boolean curveActive() { + return curveActive; + } + + public static float strength() { + return strength; + } + + public static String dimensionOf(Minecraft client) { + return client.level == null ? null : client.level.dimension().identifier().toString(); + } + + public static void tick(Minecraft client) { + String dimension = dimensionOf(client); + + if (dimension != null && !dimension.equals(lastDimension)) { + lastDimension = dimension; + applyNightVision(client, dimension); + } + + applyCurve(client, CatVision.CONFIG.forDimension(dimension)); + } + + public static void reset() { + lastDimension = null; + curveActive = false; + strength = 0.0F; + } + + public static void applyNightVision(Minecraft client, String dimension) { + ConfigData config = CatVision.CONFIG; + VisionSettings settings = config.forDimension(dimension); + VisionSettings override = dimension == null ? null : config.dimension_overrides.get(dimension); + boolean had_nv = config.has_nv; + + if (override != null) + config.has_nv = override.auto_nv; + else + config.has_nv = config.auto_nv || (config.remember_nv && config.has_nv); + + if (client.player == null) + return; + + if (config.has_nv && !hasRealNightVision(client.player)) + client.player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, Integer.MAX_VALUE)); + else if (!config.has_nv && had_nv && !settings.nv_curve && !hasRealNightVision(client.player)) + client.player.removeEffect(MobEffects.NIGHT_VISION); + } + + private static boolean hasRealNightVision(LivingEntity player) { + MobEffectInstance effect = player.getEffect(MobEffects.NIGHT_VISION); + return effect != null && effect.getDuration() <= OUR_EFFECT; + } + + private static void applyCurve(Minecraft client, VisionSettings settings) { + ConfigData config = CatVision.CONFIG; + + if (!settings.nv_curve || !config.has_nv || client.player == null || client.level == null + || hasRealNightVision(client.player)) { + if (curveActive) { + curveActive = false; + strength = 0.0F; + if (client.player != null && !config.has_nv && !hasRealNightVision(client.player)) + client.player.removeEffect(MobEffects.NIGHT_VISION); + } + return; + } + + if (!client.player.hasEffect(MobEffects.NIGHT_VISION)) + client.player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, Integer.MAX_VALUE)); + + int light = client.level.getMaxLocalRawBrightness(client.player.blockPosition()); + double target = settings.strengthFor(light); + double speed = VisionSettings.clamp(settings.nv_speed, 0.01, 1.0); + + strength += (float) ((target - strength) * speed); + if (Math.abs(target - strength) < 0.001) + strength = (float) target; + curveActive = true; + } +} diff --git a/src/main/java/net/marios271/cat_vision/mixin/GameRendererMixin.java b/src/main/java/net/marios271/cat_vision/mixin/GameRendererMixin.java new file mode 100644 index 0000000..7681247 --- /dev/null +++ b/src/main/java/net/marios271/cat_vision/mixin/GameRendererMixin.java @@ -0,0 +1,24 @@ +package net.marios271.cat_vision.mixin; + +import net.marios271.cat_vision.handler.VisionHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.entity.LivingEntity; +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.CallbackInfoReturnable; + +@Mixin(GameRenderer.class) +public class GameRendererMixin { + + //? >= 26.2 { + @Inject(method = "nightVisionScale", at = @At("HEAD"), cancellable = true) + //?} else { + /*@Inject(method = "getNightVisionScale", at = @At("HEAD"), cancellable = true) + *///?} + private static void cat_vision$nightVisionCurve(LivingEntity entity, float partialTick, CallbackInfoReturnable cir) { + if (VisionHandler.curveActive() && entity == Minecraft.getInstance().player) + cir.setReturnValue(VisionHandler.strength()); + } +} diff --git a/src/main/resources/assets/cat_vision/lang/de_at.json b/src/main/resources/assets/cat_vision/lang/de_at.json index 81b9ee2..2ab135c 100644 --- a/src/main/resources/assets/cat_vision/lang/de_at.json +++ b/src/main/resources/assets/cat_vision/lang/de_at.json @@ -14,9 +14,35 @@ "text.cat_vision.config.option.blindness_immunity": "Immunität gegn Blindheit", "text.cat_vision.config.option.nausea_immunity": "Immunität gegn Üblkeit", "text.cat_vision.config.option.darkness_immunity": "Immunität gegn Dunklheit", + "text.cat_vision.config.option.nv_curve": "Automatische Nochtsicht-Kurvn", + "text.cat_vision.config.option.nv_lit": "Nochtsicht an hölle Ortn", + "text.cat_vision.config.option.nv_dark": "Nochtsicht im Dunkln", + "text.cat_vision.config.option.nv_lit_light": "Ois hö gütends Lichtlevel", + "text.cat_vision.config.option.nv_shape": "Form vo da Kurvn", + "text.cat_vision.config.option.nv_speed": "Übagaungsgschwindigkeit", + "text.cat_vision.config.option.dimension_override": "Eigane Eistöllungen do", + "text.cat_vision.config.dimension.overworld": "Obawöt", + "text.cat_vision.config.dimension.the_nether": "Nether", + "text.cat_vision.config.dimension.the_end": "Des End", "text.cat_vision.config.tooltip.blindness_disclaimer.1": "[!] Immunität gegn Blindheit funktioniat nua in Oanzlspüla", "text.cat_vision.config.tooltip.blindness_disclaimer.2": "und ned in LAN-Wöltn oder Measpüla, weil die Untadrückung", "text.cat_vision.config.tooltip.blindness_disclaimer.3": "von Blindheit Spülan erlaubt, zu sprintn, was ma mit dem", - "text.cat_vision.config.tooltip.blindness_disclaimer.4": "Blindheit-Effekt ned mochn kenna soit." + "text.cat_vision.config.tooltip.blindness_disclaimer.4": "Blindheit-Effekt ned mochn kenna soit.", + "text.cat_vision.config.tooltip.nv_curve.1": "Blendt Nochtsicht ei, je dunkla's um di wiad,", + "text.cat_vision.config.tooltip.nv_curve.2": "damitst vo hölle af dunkle Ortn gehn kaunst,", + "text.cat_vision.config.tooltip.nv_curve.3": "ohne's ständig söwa umzschoitn.", + "text.cat_vision.config.tooltip.nv_curve.4": "De Umschoittastn schoit daun de Kurvn au und aus.", + "text.cat_vision.config.tooltip.nv_lit_light": "Ab dem Lichtlevel wiad da hölle Wert gnumma.", + "text.cat_vision.config.tooltip.nv_lit.1": "Wia vü Nochtsicht, waunns um di umadum hö is.", + "text.cat_vision.config.tooltip.nv_lit.2": "0 = dei normale Sicht, 1 = da voi Trank.", + "text.cat_vision.config.tooltip.nv_dark.1": "Wia vü Nochtsicht bei Lichtlevel 0, stockfinsta.", + "text.cat_vision.config.tooltip.nv_dark.2": "1 is genau des, wos a Nochtsichttrank mocht.", + "text.cat_vision.config.tooltip.nv_dark.3": "Da söbe Wert wia obn haaßt, de Kurvn mocht nix.", + "text.cat_vision.config.tooltip.nv_shape.1": "Unta 1.0 wiad frua eiblendt, üba 1.0 woat's,", + "text.cat_vision.config.tooltip.nv_shape.2": "bis wiaklich finsta is. 1.0 is a grode Linie.", + "text.cat_vision.config.tooltip.nv_speed": "Wia schnö übablendt wiad. 1.0 is sofuat.", + "text.cat_vision.config.tooltip.dimension_override.1": "Ersetzt de Eistöllungen obn, solangst in dera", + "text.cat_vision.config.tooltip.dimension_override.2": "Dimension bist. Nochtsicht folgt beim Einegehn daun", + "text.cat_vision.config.tooltip.dimension_override.3": "dem Abschnitt und ignoriat \"Nochtsicht merkn\"." } diff --git a/src/main/resources/assets/cat_vision/lang/de_de.json b/src/main/resources/assets/cat_vision/lang/de_de.json index 14e9eea..3144ea1 100644 --- a/src/main/resources/assets/cat_vision/lang/de_de.json +++ b/src/main/resources/assets/cat_vision/lang/de_de.json @@ -14,9 +14,35 @@ "text.cat_vision.config.option.blindness_immunity": "Immunität gegen Blindheit", "text.cat_vision.config.option.nausea_immunity": "Immunität gegen Übelkeit", "text.cat_vision.config.option.darkness_immunity": "Immunität gegen Dunkelheit", + "text.cat_vision.config.option.nv_curve": "Automatische Nachtsicht-Kurve", + "text.cat_vision.config.option.nv_lit": "Nachtsicht an hellen Orten", + "text.cat_vision.config.option.nv_dark": "Nachtsicht im Dunkeln", + "text.cat_vision.config.option.nv_lit_light": "Als hell geltendes Lichtlevel", + "text.cat_vision.config.option.nv_shape": "Form der Kurve", + "text.cat_vision.config.option.nv_speed": "Übergangsgeschwindigkeit", + "text.cat_vision.config.option.dimension_override": "Eigene Einstellungen hier", + "text.cat_vision.config.dimension.overworld": "Oberwelt", + "text.cat_vision.config.dimension.the_nether": "Nether", + "text.cat_vision.config.dimension.the_end": "Das Ende", "text.cat_vision.config.tooltip.blindness_disclaimer.1": "[!] Immunität gegen Blindheit funktioniert nur in Einzelspieler", "text.cat_vision.config.tooltip.blindness_disclaimer.2": "und nicht in LAN-Welten oder Mehrspieler, da die Unterdrückung", "text.cat_vision.config.tooltip.blindness_disclaimer.3": "von Blindheit Spielern erlaubt, zu sprinten, was man mit dem", - "text.cat_vision.config.tooltip.blindness_disclaimer.4": "Blindheit-Effekt nicht machen können sollte." + "text.cat_vision.config.tooltip.blindness_disclaimer.4": "Blindheit-Effekt nicht machen können sollte.", + "text.cat_vision.config.tooltip.nv_curve.1": "Blendet Nachtsicht ein, je dunkler es um dich wird,", + "text.cat_vision.config.tooltip.nv_curve.2": "damit du von hellen an dunkle Orte gehen kannst,", + "text.cat_vision.config.tooltip.nv_curve.3": "ohne sie ständig selbst umzuschalten.", + "text.cat_vision.config.tooltip.nv_curve.4": "Die Umschalttaste schaltet dann die Kurve an und aus.", + "text.cat_vision.config.tooltip.nv_lit_light": "Ab diesem Lichtlevel wird der helle Wert verwendet.", + "text.cat_vision.config.tooltip.nv_lit.1": "Wie viel Nachtsicht, wenn es um dich herum hell ist.", + "text.cat_vision.config.tooltip.nv_lit.2": "0 = deine normale Sicht, 1 = der volle Trank.", + "text.cat_vision.config.tooltip.nv_dark.1": "Wie viel Nachtsicht bei Lichtlevel 0, stockdunkel.", + "text.cat_vision.config.tooltip.nv_dark.2": "1 ist genau das, was ein Nachtsichttrank macht.", + "text.cat_vision.config.tooltip.nv_dark.3": "Derselbe Wert wie oben heißt, die Kurve macht nichts.", + "text.cat_vision.config.tooltip.nv_shape.1": "Unter 1.0 wird früh eingeblendet, über 1.0 wartet es,", + "text.cat_vision.config.tooltip.nv_shape.2": "bis es wirklich dunkel ist. 1.0 ist eine Gerade.", + "text.cat_vision.config.tooltip.nv_speed": "Wie schnell übergeblendet wird. 1.0 ist sofort.", + "text.cat_vision.config.tooltip.dimension_override.1": "Ersetzt die Einstellungen oben, solange du in dieser", + "text.cat_vision.config.tooltip.dimension_override.2": "Dimension bist. Nachtsicht folgt beim Betreten dann", + "text.cat_vision.config.tooltip.dimension_override.3": "diesem Abschnitt und ignoriert \"Nachtsicht merken\"." } diff --git a/src/main/resources/assets/cat_vision/lang/en_us.json b/src/main/resources/assets/cat_vision/lang/en_us.json index 7923ae1..069fd05 100644 --- a/src/main/resources/assets/cat_vision/lang/en_us.json +++ b/src/main/resources/assets/cat_vision/lang/en_us.json @@ -14,9 +14,35 @@ "text.cat_vision.config.option.blindness_immunity": "Blindness Immunity", "text.cat_vision.config.option.nausea_immunity": "Nausea Immunity", "text.cat_vision.config.option.darkness_immunity": "Darkness Immunity", + "text.cat_vision.config.option.nv_curve": "Automatic Night Vision Curve", + "text.cat_vision.config.option.nv_lit": "Night Vision in lit places", + "text.cat_vision.config.option.nv_dark": "Night Vision in the dark", + "text.cat_vision.config.option.nv_lit_light": "Light level counted as lit", + "text.cat_vision.config.option.nv_shape": "Curve shape", + "text.cat_vision.config.option.nv_speed": "Fade speed", + "text.cat_vision.config.option.dimension_override": "Use own settings here", + "text.cat_vision.config.dimension.overworld": "Overworld", + "text.cat_vision.config.dimension.the_nether": "The Nether", + "text.cat_vision.config.dimension.the_end": "The End", "text.cat_vision.config.tooltip.blindness_disclaimer.1": "[!] Blindness Suppression only works on Singleplayer", "text.cat_vision.config.tooltip.blindness_disclaimer.2": "and not on LAN or multiplayer worlds, as suppressing", "text.cat_vision.config.tooltip.blindness_disclaimer.3": "blindness allows players to sprint, which they should", - "text.cat_vision.config.tooltip.blindness_disclaimer.4": "not be able to do with the blindness effect." + "text.cat_vision.config.tooltip.blindness_disclaimer.4": "not be able to do with the blindness effect.", + "text.cat_vision.config.tooltip.nv_curve.1": "Fades night vision in as it gets darker around you,", + "text.cat_vision.config.tooltip.nv_curve.2": "so you can walk from bright places into dark ones", + "text.cat_vision.config.tooltip.nv_curve.3": "without toggling it yourself.", + "text.cat_vision.config.tooltip.nv_curve.4": "The toggle key then switches the curve on and off.", + "text.cat_vision.config.tooltip.nv_lit_light": "At this light level and above, the lit value is used.", + "text.cat_vision.config.tooltip.nv_lit.1": "How much night vision when it is bright around you.", + "text.cat_vision.config.tooltip.nv_lit.2": "0 = your normal view, 1 = the full potion.", + "text.cat_vision.config.tooltip.nv_dark.1": "How much night vision at light level 0, pitch black.", + "text.cat_vision.config.tooltip.nv_dark.2": "1 is exactly what a night vision potion looks like.", + "text.cat_vision.config.tooltip.nv_dark.3": "The same value as above means the curve does nothing.", + "text.cat_vision.config.tooltip.nv_shape.1": "Below 1.0 fades in early, above 1.0 waits until it", + "text.cat_vision.config.tooltip.nv_shape.2": "really is dark. 1.0 is a straight line.", + "text.cat_vision.config.tooltip.nv_speed": "How fast it fades between the two. 1.0 is instant.", + "text.cat_vision.config.tooltip.dimension_override.1": "Replaces the settings above while you are in this", + "text.cat_vision.config.tooltip.dimension_override.2": "dimension. Night Vision then follows this section when", + "text.cat_vision.config.tooltip.dimension_override.3": "you enter it, ignoring \"Remember Night Vision\"." } diff --git a/src/main/resources/cat_vision.mixins.json b/src/main/resources/cat_vision.mixins.json index de07b1c..f7cde2c 100644 --- a/src/main/resources/cat_vision.mixins.json +++ b/src/main/resources/cat_vision.mixins.json @@ -7,5 +7,7 @@ "defaultRequire": 1 }, "mixins": [], - "client": [] + "client": [ + "GameRendererMixin" + ] }