From 0b8669547958ac2cc43a49ad53cd92f490bf81ba Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Tue, 28 Oct 2025 12:41:29 +0800 Subject: [PATCH 01/34] Add configuration index support (#175) --- .../java/com/xtracr/realcamera/KeyMappings.java | 3 +++ .../com/xtracr/realcamera/RealCameraCore.java | 7 +++---- .../com/xtracr/realcamera/compat/YSMCompat.java | 10 ++++------ .../xtracr/realcamera/config/ConfigScreen.java | 7 +++++++ .../com/xtracr/realcamera/config/ModConfig.java | 15 ++++++++++++++- .../resources/assets/realcamera/lang/en_us.json | 5 +++++ .../resources/assets/realcamera/lang/zh_cn.json | 5 +++++ gradle.properties | 2 +- 8 files changed, 42 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java index a2e3d9d9..e455c979 100644 --- a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java +++ b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java @@ -31,6 +31,9 @@ public final class KeyMappings { createKeyMapping("adjustDOWN", client -> ConfigFile.config().adjustOffsetY(-1)); createKeyMapping("adjustLEFT", client -> ConfigFile.config().adjustOffsetZ(1)); createKeyMapping("adjustRIGHT", client -> ConfigFile.config().adjustOffsetZ(-1)); + createKeyMapping("activeConfigIndexNEXT", client -> ConfigFile.config().setActiveConfigIndex(1)); + createKeyMapping("activeConfigIndexPREV", client -> ConfigFile.config().setActiveConfigIndex(-1)); + createKeyMapping("activeConfigIndexRESET", client -> ConfigFile.config().setActiveConfigIndex(0)); } private static KeyMapping createKeyMapping(String id, Consumer whenPressed) { diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 9bc44394..62137bd6 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -152,10 +152,9 @@ public static void renderCameraEntity(Minecraft client, float deltaTick, MultiBu private static void computeBindResult(BuiltIterableBuffer builtBuffer) { if (newResult.available()) return; targetFor: - for (BindTarget target : ConfigFile.config().getBindTargetList()) { + for (BindTarget target : ConfigFile.config().getTargetList(builtBuffer.textureId())) { BindResult result = new BindResult(target, false); - if (!builtBuffer.textureId().contains(result.target.textureId())) continue; - BindTarget.TargetConfig config = result.target.targetConfig(); + BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV[] uvs = {new VertexData.UV(config.posU(), config.posV()), new VertexData.UV(config.forwardU(), config.forwardV()), new VertexData.UV(config.upwardU(), config.upwardV())}; VertexData[][] primitives = builtBuffer.findPrimitivesInCache(uvs); if (builtBuffer.anyNotCached(uvs)) { @@ -176,4 +175,4 @@ private static void computeBindResult(BuiltIterableBuffer builtBuffer) { return; } } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java index 7f1788ed..a87dfa79 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java @@ -78,10 +78,9 @@ public TransformedVertexRecorder setRotation(float pitch, float yaw) { public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; - for (BindTarget target : ConfigFile.config().getBindTargetList()) { + for (BindTarget target : ConfigFile.config().getTargetList(builtBuffer.textureId())) { BindResult result = resultMap.computeIfAbsent(target, k -> new BindResult(target, false)); - if (!builtBuffer.textureId().contains(result.target.textureId())) continue; - BindTarget.TargetConfig config = result.target.targetConfig(); + BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = new VertexData.UV(config.posU(), config.posV()); VertexData.UV forwardUV = new VertexData.UV(config.forwardU(), config.forwardV()); VertexData.UV upwardUV = new VertexData.UV(config.upwardU(), config.upwardV()); @@ -101,10 +100,9 @@ public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { public void computeBindResult(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; - for (BindTarget target : ConfigFile.config().getBindTargetList()) { + for (BindTarget target : ConfigFile.config().getTargetList(builtBuffer.textureId())) { BindResult result = resultMap.computeIfAbsent(target, k -> new BindResult(target, false)); - if (!builtBuffer.textureId().contains(result.target.textureId())) continue; - BindTarget.TargetConfig config = result.target.targetConfig(); + BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = result.getPosition() == Vec3.ZERO ? new VertexData.UV(config.posU(), config.posV()) : null; VertexData.UV forwardUV = result.getForward() == Vec3.ZERO ? new VertexData.UV(config.forwardU(), config.forwardV()) : null; VertexData.UV upwardUV = result.getUpward() == Vec3.ZERO ? new VertexData.UV(config.upwardU(), config.upwardV()) : null; diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 64375c20..050f25e0 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -200,6 +200,13 @@ public static Screen create(Screen parent) { .setTooltip(LocUtil.CONFIG_TOOLTIP("rotationSmoothFactor")) .setSaveConsumer(d -> config.binding.rotationSmoothFactor = d) .build()); + binding.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("activeConfigIndex"), config.binding.activeConfigIndex) + .setDefaultValue(0) + .setMin(0) + .setMax(Integer.MAX_VALUE) + .setTooltip(LocUtil.CONFIG_TOOLTIP("activeConfigIndex")) + .setSaveConsumer(i -> config.binding.activeConfigIndex = i) + .build()); binding.addEntry(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) .setDefaultValue(List.of()) .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index 6f53b1ae..2b9f22a2 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -110,6 +110,10 @@ public void adjustOffsetZ(int count) { } } + public void setActiveConfigIndex(int value) { + binding.activeConfigIndex = value == 0 ? 0 : Mth.clamp(binding.activeConfigIndex += value, 0, Integer.MAX_VALUE); + } + // classic public boolean classicDisableWhenSneaking() { return classic.disableWhenSneaking; @@ -217,6 +221,14 @@ public List getBindTargetList() { return binding.targetList; } + public List getTargetList(String textureId) { + binding.clamp(); + int activeConfigIndex = binding.activeConfigIndex; + List matchedTargets = binding.targetList.stream().filter(target -> textureId.contains(target.textureId())).toList(); + if (activeConfigIndex == 0 || matchedTargets.isEmpty()) return matchedTargets; + return List.of(matchedTargets.get(Math.min(activeConfigIndex - 1, matchedTargets.size() - 1))); + } + public void putBindTarget(BindTarget target) { if (target.isEmpty()) return; List fixedList = binding.fixedTargetList; @@ -289,6 +301,7 @@ public static class Binding { public int bindResultRetentionFrames = 2; public double displacementSmoothFactor = 0.4; public double rotationSmoothFactor = 0.4; + public int activeConfigIndex = 0; public List disableMainFeatureItems = List.of(); public List disableRenderItems = defaultDisableRenderItems; public List fixedTargetList = new ArrayList<>(); @@ -315,4 +328,4 @@ private void clamp() { } } } -} +} \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index 33202989..0e3c127d 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Open Model View Screen", "key.xtracr_realcamera.togglePerspective": "Enable/Disable", + "key.xtracr_realcamera.activeConfigIndexPREV": "Switch to previous configuration", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Switch to next configuration", + "key.xtracr_realcamera.activeConfigIndexRESET": "Reset configuration index", "key.xtracr_realcamera.toggleAdjustMode": "Toggle Adjust Mode", "key.xtracr_realcamera.toggleCameraMode": "Toggle Camera Mode", "key.xtracr_realcamera.adjustUP": "Adjust UP", @@ -49,6 +52,7 @@ "config.option.xtracr_realcamera.bindResultRetentionFrames": "Bind Result Retention Frames", "config.option.xtracr_realcamera.displacementSmoothFactor": "Displacement Smooth Factor", "config.option.xtracr_realcamera.rotationSmoothFactor": "Rotation Smooth Factor", + "config.option.xtracr_realcamera.activeConfigIndex": "Active Configuration Index", "config.option.xtracr_realcamera.disableMainFeatureItems": "Disable main feature when holding", "config.option.xtracr_realcamera.disableRenderItems": "Disable rendering when holding", "config.tooltip.xtracr_realcamera.isClassic": "Classic mode only makes simple changes to the position and rotation of camera", @@ -65,6 +69,7 @@ "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "For several frames after the binding failure, continue to use the previous successful binding result", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Smooth factor of camera displacement, the higher the value, the smoother the movement", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Smooth factor of camera rotation, the higher the value, the smoother the movement", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Currently bound configuration index, 0 means allowing binding to any valid configuration", "config.tooltip.xtracr_realcamera.disableRenderItems": "Three matching methods are supported:\n1. Wildcard `*` matching (e.g., `minecraft:*sword`)\n2. Tag matching (starts with `#`, e.g., `#minecraft:swords`)\n3. Direct item ID (e.g., `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Binding failed, please go to the %s screen and configure manually (Key: %s)", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 8777e54a..282edaa1 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "打开模型视图界面", "key.xtracr_realcamera.togglePerspective": "开启/关闭", + "key.xtracr_realcamera.activeConfigIndexPREV": "切换到上一个配置", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切换到下一个配置", + "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", "key.xtracr_realcamera.toggleAdjustMode": "切换调整模式", "key.xtracr_realcamera.toggleCameraMode": "切换摄像头模式", "key.xtracr_realcamera.adjustUP": "向上调整", @@ -49,6 +52,7 @@ "config.option.xtracr_realcamera.bindResultRetentionFrames": "绑定结果保留帧数", "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑系数", "config.option.xtracr_realcamera.rotationSmoothFactor": "旋转平滑系数", + "config.option.xtracr_realcamera.activeConfigIndex": "当前配置索引", "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...时禁用主要功能", "config.option.xtracr_realcamera.disableRenderItems": "在手持...时禁用渲染", "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", @@ -65,6 +69,7 @@ "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在绑定失败后的数帧内,沿用上个成功的绑定结果", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相机位移平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相机旋转平滑系数,值越大越平滑", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "当前绑定的配置索引,0表示允许绑定任何有效配置", "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三种匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 标签匹配以`#`开头(如`#minecraft:swords`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: 绑定失败,请前往%s界面手动设置(键位:%s)", diff --git a/gradle.properties b/gradle.properties index f72ce668..556d4a35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ fabric_loader_version=0.17.2 neoforge_version=21.1.194 #yarn_mappings=1.21.1+build.3 # Mod Properties -mod_version=0.7.4-beta +mod_version=0.7.5-beta maven_group=com.xtracr.realcamera archives_base_name=realcamera # Dependencies From 5ecd7a781e2c4c4bf7343fb68fb72a5a4133b528 Mon Sep 17 00:00:00 2001 From: xTracr Date: Sun, 2 Nov 2025 11:38:07 +0800 Subject: [PATCH 02/34] Exchanged the order of "Disable" and "Preview" in the screen --- .../com/xtracr/realcamera/KeyMappings.java | 6 +- .../com/xtracr/realcamera/RealCameraCore.java | 2 +- .../xtracr/realcamera/compat/YSMCompat.java | 4 +- .../realcamera/config/ConfigScreen.java | 13 +- .../xtracr/realcamera/config/ModConfig.java | 10 +- .../realcamera/gui/ModelViewScreen.java | 270 ++++++++++-------- fabric/src/main/resources/fabric.mod.json | 2 +- 7 files changed, 163 insertions(+), 144 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java index e455c979..a951ab39 100644 --- a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java +++ b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java @@ -31,9 +31,9 @@ public final class KeyMappings { createKeyMapping("adjustDOWN", client -> ConfigFile.config().adjustOffsetY(-1)); createKeyMapping("adjustLEFT", client -> ConfigFile.config().adjustOffsetZ(1)); createKeyMapping("adjustRIGHT", client -> ConfigFile.config().adjustOffsetZ(-1)); - createKeyMapping("activeConfigIndexNEXT", client -> ConfigFile.config().setActiveConfigIndex(1)); - createKeyMapping("activeConfigIndexPREV", client -> ConfigFile.config().setActiveConfigIndex(-1)); - createKeyMapping("activeConfigIndexRESET", client -> ConfigFile.config().setActiveConfigIndex(0)); + createKeyMapping("activeConfigIndexNEXT", client -> ConfigFile.config().binding.activeConfigIndex += 1); + createKeyMapping("activeConfigIndexPREV", client -> ConfigFile.config().binding.activeConfigIndex -= 1); + createKeyMapping("activeConfigIndexRESET", client -> ConfigFile.config().binding.activeConfigIndex = 0); } private static KeyMapping createKeyMapping(String id, Consumer whenPressed) { diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 62137bd6..62506e21 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -152,7 +152,7 @@ public static void renderCameraEntity(Minecraft client, float deltaTick, MultiBu private static void computeBindResult(BuiltIterableBuffer builtBuffer) { if (newResult.available()) return; targetFor: - for (BindTarget target : ConfigFile.config().getTargetList(builtBuffer.textureId())) { + for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { BindResult result = new BindResult(target, false); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV[] uvs = {new VertexData.UV(config.posU(), config.posV()), new VertexData.UV(config.forwardU(), config.forwardV()), new VertexData.UV(config.upwardU(), config.upwardV())}; diff --git a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java index a87dfa79..4a9822dc 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java @@ -78,7 +78,7 @@ public TransformedVertexRecorder setRotation(float pitch, float yaw) { public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; - for (BindTarget target : ConfigFile.config().getTargetList(builtBuffer.textureId())) { + for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { BindResult result = resultMap.computeIfAbsent(target, k -> new BindResult(target, false)); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = new VertexData.UV(config.posU(), config.posV()); @@ -100,7 +100,7 @@ public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { public void computeBindResult(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; - for (BindTarget target : ConfigFile.config().getTargetList(builtBuffer.textureId())) { + for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { BindResult result = resultMap.computeIfAbsent(target, k -> new BindResult(target, false)); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = result.getPosition() == Vec3.ZERO ? new VertexData.UV(config.posU(), config.posV()) : null; diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 050f25e0..873926cb 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -186,6 +186,12 @@ public static Screen create(Screen parent) { .setTooltip(LocUtil.CONFIG_TOOLTIP("bindResultRetentionFrames")) .setSaveConsumer(i -> config.binding.bindResultRetentionFrames = i) .build()); + binding.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("activeConfigIndex"), config.binding.activeConfigIndex) + .setDefaultValue(0) + .setMin(0) + .setTooltip(LocUtil.CONFIG_TOOLTIP("activeConfigIndex")) + .setSaveConsumer(i -> config.binding.activeConfigIndex = i) + .build()); binding.addEntry(entryBuilder.startDoubleField(LocUtil.CONFIG_OPTION("displacementSmoothFactor"), config.binding.displacementSmoothFactor) .setDefaultValue(0.4) .setMin(0.0) @@ -200,13 +206,6 @@ public static Screen create(Screen parent) { .setTooltip(LocUtil.CONFIG_TOOLTIP("rotationSmoothFactor")) .setSaveConsumer(d -> config.binding.rotationSmoothFactor = d) .build()); - binding.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("activeConfigIndex"), config.binding.activeConfigIndex) - .setDefaultValue(0) - .setMin(0) - .setMax(Integer.MAX_VALUE) - .setTooltip(LocUtil.CONFIG_TOOLTIP("activeConfigIndex")) - .setSaveConsumer(i -> config.binding.activeConfigIndex = i) - .build()); binding.addEntry(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) .setDefaultValue(List.of()) .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index 2b9f22a2..a84bb5b7 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -110,10 +110,6 @@ public void adjustOffsetZ(int count) { } } - public void setActiveConfigIndex(int value) { - binding.activeConfigIndex = value == 0 ? 0 : Mth.clamp(binding.activeConfigIndex += value, 0, Integer.MAX_VALUE); - } - // classic public boolean classicDisableWhenSneaking() { return classic.disableWhenSneaking; @@ -221,12 +217,12 @@ public List getBindTargetList() { return binding.targetList; } - public List getTargetList(String textureId) { + public List getBindTargetList(String textureId) { binding.clamp(); int activeConfigIndex = binding.activeConfigIndex; List matchedTargets = binding.targetList.stream().filter(target -> textureId.contains(target.textureId())).toList(); if (activeConfigIndex == 0 || matchedTargets.isEmpty()) return matchedTargets; - return List.of(matchedTargets.get(Math.min(activeConfigIndex - 1, matchedTargets.size() - 1))); + return List.of(matchedTargets.get(Math.clamp(activeConfigIndex - 1, 0, matchedTargets.size() - 1))); } public void putBindTarget(BindTarget target) { @@ -299,9 +295,9 @@ public static class Binding { public boolean disableWhenSwimming = false; public int swimOutTick = 13; public int bindResultRetentionFrames = 2; + public int activeConfigIndex = 0; public double displacementSmoothFactor = 0.4; public double rotationSmoothFactor = 0.4; - public int activeConfigIndex = 0; public List disableMainFeatureItems = List.of(); public List disableRenderItems = defaultDisableRenderItems; public List fixedTargetList = new ArrayList<>(); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index a61d5ecd..2c118263 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -1,5 +1,6 @@ package com.xtracr.realcamera.gui; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedMap; import com.mojang.blaze3d.platform.InputConstants; import com.xtracr.realcamera.RealCameraCore; @@ -14,7 +15,6 @@ import com.xtracr.realcamera.util.VertexData; import io.netty.buffer.Unpooled; import net.minecraft.ChatFormatting; -import net.minecraft.client.OptionInstance; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.*; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -68,7 +68,6 @@ public class ModelViewScreen extends Screen { private final List disableConfigs = new ArrayList<>(); private final List rectWidgets = new ArrayList<>(); private final Map> hiddenNameMap = new HashMap<>(); - private final Map toggleConfigMap = Map.of(0, "disable", 1, "preview", 2, "configs"); private final CyclingTexturedButton showTextureButton = new CyclingTexturedButton(48, 16, 0, 2).setOnValueChange(i -> initWidgets(page)); private final CyclingTexturedButton pauseButton = new CyclingTexturedButton(0, 16, 0, 2); private final CyclingTexturedButton bindXButton = new CyclingTexturedButton(16, 16, 1, 2); @@ -83,24 +82,33 @@ public class ModelViewScreen extends Screen { private final DoubleSlider offsetPitchSlider = createSlider("pitch", widgetWidth * 2 - 18, -180.0, 180.0); private final DoubleSlider offsetYawSlider = createSlider("yaw", widgetWidth * 2 - 18, -180.0, 180.0); private final DoubleSlider offsetRollSlider = createSlider("roll", widgetWidth * 2 - 18, -180.0, 180.0); - private final CycleButton selectingButton = createCyclingButton(ImmutableSortedMap.of( + private final CycleButton selectingButton = createCyclingButtonBuilder(ImmutableSortedMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("forwardVector").withStyle(ChatFormatting.GREEN), 1, LocUtil.MODEL_VIEW_WIDGET("upwardVector").withStyle(ChatFormatting.RED), - 2, LocUtil.MODEL_VIEW_WIDGET("position").withStyle(ChatFormatting.BLUE)), - widgetWidth * 2 + 4, LocUtil.MODEL_VIEW_WIDGET("selecting"), i -> createTooltip("selecting", modifierKey.getDisplayName(), modifierKey.getDisplayName())); - private final CycleButton disableModeButton = createCyclingButton(ImmutableSortedMap.of( + 2, LocUtil.MODEL_VIEW_WIDGET("position").withStyle(ChatFormatting.BLUE))) + .withInitialValue(0) + .withTooltip(i -> createTooltip("selecting", modifierKey.getDisplayName(), modifierKey.getDisplayName())) + .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selecting")); + private final CycleButton disableModeButton = createCyclingButtonBuilder(ImmutableMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("all").withStyle(ChatFormatting.GREEN), - 1, LocUtil.MODEL_VIEW_WIDGET("part").withStyle(ChatFormatting.BLUE)), - widgetWidth * 2 + 4, LocUtil.MODEL_VIEW_WIDGET("disableMode"), i -> createTooltip("disableMode", modifierKey.getDisplayName())); - private final CycleButton selectionModeButton = createCyclingButton(ImmutableSortedMap.of( + 1, LocUtil.MODEL_VIEW_WIDGET("part").withStyle(ChatFormatting.BLUE))) + .withInitialValue(0) + .withTooltip(i -> createTooltip("disableMode", modifierKey.getDisplayName())) + .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("disableMode")); + private final CycleButton selectionModeButton = createCyclingButtonBuilder(ImmutableSortedMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("single"), 1, LocUtil.MODEL_VIEW_WIDGET("multiple"), - 2, LocUtil.MODEL_VIEW_WIDGET("range").withStyle(ChatFormatting.BLUE)), - widgetWidth * 2 + 4, LocUtil.MODEL_VIEW_WIDGET("selectionMode"), i -> createTooltip("selectionMode", modifierKey.getDisplayName(), modifierKey.getDisplayName())); - private final CycleButton toggleSliderButton = createCyclingButton(ImmutableSortedMap.of( + 2, LocUtil.MODEL_VIEW_WIDGET("range").withStyle(ChatFormatting.BLUE))) + .withInitialValue(0) + .withTooltip(i -> createTooltip("selectionMode", modifierKey.getDisplayName(), modifierKey.getDisplayName())) + .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selectionMode")); + private final CycleButton toggleSliderButton = createCyclingButtonBuilder(ImmutableMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("toggleSliderToField"), - 1, LocUtil.MODEL_VIEW_WIDGET("toggleFieldToSlider")), - widgetWidth * 2 + 4, i -> null, (button, i) -> { + 1, LocUtil.MODEL_VIEW_WIDGET("toggleFieldToSlider"))) + .withInitialValue(0) + .withTooltip(i -> createTooltip("toggleSlider")) + .displayOnlyValue() + .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("toggleSlider"), (button, i) -> { if (i == 1) { offsetXField.setNumber((float) offsetXSlider.getValue()); offsetYField.setNumber((float) offsetYSlider.getValue()); @@ -118,11 +126,14 @@ public class ModelViewScreen extends Screen { } initWidgets(page); }); - private final CycleButton toggleCategoryButton = createCyclingButton(ImmutableSortedMap.of( - 0, LocUtil.MODEL_VIEW_WIDGET(toggleConfigMap.get(0)), - 1, LocUtil.MODEL_VIEW_WIDGET(toggleConfigMap.get(1)), - 2, LocUtil.MODEL_VIEW_WIDGET(toggleConfigMap.get(2))), - widgetWidth * 2 - 18, i -> createTooltip(toggleConfigMap.get(i)), (button, i) -> initWidgets(0)); + private final CycleButton toggleCategoryButton = createCyclingButtonBuilder(ImmutableSortedMap.of( + Category.CONFIGS, LocUtil.MODEL_VIEW_WIDGET(Category.CONFIGS.next().id), + Category.PREVIEW, LocUtil.MODEL_VIEW_WIDGET(Category.PREVIEW.next().id), + Category.DISABLE, LocUtil.MODEL_VIEW_WIDGET(Category.DISABLE.next().id))) + .withInitialValue(Category.CONFIGS) + .withTooltip(category -> createTooltip(category.next().id)) + .displayOnlyValue() + .create(0, 0, widgetWidth * 2 - 18, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("toggleCategory"), (button, i) -> initWidgets(0)); public ModelViewScreen() { super(LocUtil.MODEL_VIEW_TITLE()); @@ -141,7 +152,7 @@ protected void init() { private void initWidgets(int page) { this.page = page; - if (toggleCategoryButton.getValue() == 1 && showTextureButton.getValue() == 0) { + if (toggleCategoryButton.getValue() == Category.DISABLE && showTextureButton.getValue() == 0) { modelViewArea = new ScreenRectangle(x + xSize / 2, y, middleWidth / 2, ySize); textureViewArea = new ScreenRectangle(x + (xSize - middleWidth) / 2, y, middleWidth / 2, ySize); } else { @@ -153,7 +164,7 @@ private void initWidgets(int page) { clearWidgets(); initLeftWidgets(); if (textureViewArea != null) rectWidgets.forEach(this::addRenderableWidget); - if (toggleCategoryButton.getValue() == 1) addRenderableWidget(showTextureButton).setPosition(x + (xSize - middleWidth) / 2 + 4, y + 4); + if (toggleCategoryButton.getValue() == Category.DISABLE) addRenderableWidget(showTextureButton).setPosition(x + (xSize - middleWidth) / 2 + 4, y + 4); addRenderableWidget(pauseButton).setPosition(x + (xSize + middleWidth) / 2 - 38, y + 4); addRenderableWidget(new TexturedButton(x + (xSize + middleWidth) / 2 - 20, y + 4, 16, 16, 0, 0, button -> { modelScale = textureScale = 80; @@ -193,91 +204,96 @@ private void initLeftWidgets() { grid.defaultCellSetting().padding(4, 2, 0, 0); LayoutSettings smallSettings = grid.newCellSettings().padding(5, 3, 1, 1); GridLayout.RowHelper rows = grid.createRowHelper(2); - if (toggleCategoryButton.getValue() == 0) { - rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("import"), widgetWidth, this::importBindTarget)).setTooltip(createTooltip("import")); - rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("export"), widgetWidth, this::exportBindTarget)).setTooltip(createTooltip("export")); - rows.addChild(entityPitchSlider, 2); - rows.addChild(entityYawSlider, 2); - rows.addChild(selectingButton, 2); - rows.addChild(forwardUField, smallSettings); - rows.addChild(forwardVField, smallSettings); - rows.addChild(upwardUField, smallSettings); - rows.addChild(upwardVField, smallSettings); - rows.addChild(posUField, smallSettings); - rows.addChild(posVField, smallSettings); - rows.addChild(textureIdField, 2, smallSettings).setTooltip(createTooltip("textureId")); - } else if (toggleCategoryButton.getValue() == 1) { - LayoutSettings offsetXSettings = grid.newCellSettings().padding(-13, 3, 1, 1); - rows.addChild(disableModeButton, 2); - rows.addChild(disabledIdField, 2, smallSettings).setTooltip(createTooltip("textureId")); - rows.addChild(selectionModeButton, 2); - rows.addChild(focusedRectWidgetNumberField, smallSettings).setOnValueChange(index -> { - if (index == 0) focusedRectWidget = null; - else if (index > 0 && index <= rectWidgets.size()) { - focusedRectWidget = rectWidgets.get(index - 1); - uMinField.setNumber(focusedRectWidget.uMin); - vMinField.setNumber(focusedRectWidget.vMin); - uMaxField.setNumber(focusedRectWidget.uMax); - vMaxField.setNumber(focusedRectWidget.vMax); - } - }).setTooltip(createTooltip("focusedRectangleNumber")); - addRenderableWidget(new StringWidget(x + 4 + widgetWidth + 3, y + 4 + (widgetHeight + 2) * 3, 6, widgetHeight, LocUtil.literal("/"), font)); - addRenderableWidget(rectWidgetsSizeWidget); - rows.addChild(new TexturedButton(48, 0, button -> deleteFocusedRectWidget()), grid.newCellSettings().padding(5 + widgetWidth - 18, 3, 1, 1)) - .setTooltip(createTooltip("deleteSelectedRectangle")); - rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("uMin:"), font)); - rows.addChild(uMinField, offsetXSettings).setOnValueChange(f -> { - if (focusedRectWidget != null) focusedRectWidget.uMin = f; - }); - rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("vMin:"), font)); - rows.addChild(vMinField, offsetXSettings).setOnValueChange(f -> { - if (focusedRectWidget != null) focusedRectWidget.vMin = f; - }); - rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("uMax:"), font)); - rows.addChild(uMaxField, offsetXSettings).setOnValueChange(f -> { - if (focusedRectWidget != null) focusedRectWidget.uMax = f; - }); - rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("vMax:"), font)); - rows.addChild(vMaxField, offsetXSettings).setOnValueChange(f -> { - if (focusedRectWidget != null) focusedRectWidget.vMax = f; - }); - } else { - boolean useSliderOffset = toggleSliderButton.getValue() == 0; - rows.addChild(toggleSliderButton, 2); - LayoutSettings sliderSettings = grid.newCellSettings().padding(-20, 2, 0, 0); - LayoutSettings fieldSettings = grid.newCellSettings().padding(-17, 3, 1, 1); - rows.addChild(bindXButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetXSlider, sliderSettings); - else rows.addChild(offsetXField, fieldSettings); - rows.addChild(bindYButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetYSlider, sliderSettings); - else rows.addChild(offsetYField, fieldSettings); - rows.addChild(bindZButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetZSlider, sliderSettings); - else rows.addChild(offsetZField, fieldSettings); - rows.addChild(bindRotButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetPitchSlider, sliderSettings); - else rows.addChild(offsetPitchField, fieldSettings); - if (useSliderOffset) rows.addChild(offsetYawSlider, 2, grid.newCellSettings().padding(26, 2, 0, 0)); - else rows.addChild(offsetYawField, 2, grid.newCellSettings().padding(29, 3, 1, 1)); - rows.addChild(new TexturedButton(0, 0, button -> { - offsetXField.setNumber(0f); - offsetYField.setNumber(0f); - offsetZField.setNumber(0f); - offsetPitchField.setNumber(0f); - offsetYawField.setNumber(0f); - offsetRollField.setNumber(0f); - offsetXSlider.setValue(0); - offsetYSlider.setValue(0); - offsetZSlider.setValue(0); - offsetPitchSlider.setValue(0); - offsetYawSlider.setValue(0); - offsetRollSlider.setValue(0); - }), smallSettings); - if (useSliderOffset) rows.addChild(offsetRollSlider, sliderSettings); - else rows.addChild(offsetRollField, fieldSettings); - rows.addChild(scaleField, smallSettings).setTooltip(createTooltip("scale")); - rows.addChild(depthField, smallSettings).setTooltip(createTooltip("depth")); + switch (toggleCategoryButton.getValue()) { + case CONFIGS -> { + rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("import"), widgetWidth, this::importBindTarget)).setTooltip(createTooltip("import")); + rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("export"), widgetWidth, this::exportBindTarget)).setTooltip(createTooltip("export")); + rows.addChild(entityPitchSlider, 2); + rows.addChild(entityYawSlider, 2); + rows.addChild(selectingButton, 2); + rows.addChild(forwardUField, smallSettings); + rows.addChild(forwardVField, smallSettings); + rows.addChild(upwardUField, smallSettings); + rows.addChild(upwardVField, smallSettings); + rows.addChild(posUField, smallSettings); + rows.addChild(posVField, smallSettings); + rows.addChild(textureIdField, 2, smallSettings).setTooltip(createTooltip("textureId")); + } + case PREVIEW -> { + boolean useSliderOffset = toggleSliderButton.getValue() == 0; + rows.addChild(toggleSliderButton, 2); + LayoutSettings sliderSettings = grid.newCellSettings().padding(-20, 2, 0, 0); + LayoutSettings fieldSettings = grid.newCellSettings().padding(-17, 3, 1, 1); + rows.addChild(bindXButton, smallSettings).setTooltip(createTooltip("bindButtons")); + if (useSliderOffset) rows.addChild(offsetXSlider, sliderSettings); + else rows.addChild(offsetXField, fieldSettings); + rows.addChild(bindYButton, smallSettings).setTooltip(createTooltip("bindButtons")); + if (useSliderOffset) rows.addChild(offsetYSlider, sliderSettings); + else rows.addChild(offsetYField, fieldSettings); + rows.addChild(bindZButton, smallSettings).setTooltip(createTooltip("bindButtons")); + if (useSliderOffset) rows.addChild(offsetZSlider, sliderSettings); + else rows.addChild(offsetZField, fieldSettings); + rows.addChild(bindRotButton, smallSettings).setTooltip(createTooltip("bindButtons")); + if (useSliderOffset) rows.addChild(offsetPitchSlider, sliderSettings); + else rows.addChild(offsetPitchField, fieldSettings); + if (useSliderOffset) rows.addChild(offsetYawSlider, 2, grid.newCellSettings().padding(26, 2, 0, 0)); + else rows.addChild(offsetYawField, 2, grid.newCellSettings().padding(29, 3, 1, 1)); + rows.addChild(new TexturedButton(0, 0, button -> { + offsetXField.setNumber(0f); + offsetYField.setNumber(0f); + offsetZField.setNumber(0f); + offsetPitchField.setNumber(0f); + offsetYawField.setNumber(0f); + offsetRollField.setNumber(0f); + offsetXSlider.setValue(0); + offsetYSlider.setValue(0); + offsetZSlider.setValue(0); + offsetPitchSlider.setValue(0); + offsetYawSlider.setValue(0); + offsetRollSlider.setValue(0); + }), smallSettings); + if (useSliderOffset) rows.addChild(offsetRollSlider, sliderSettings); + else rows.addChild(offsetRollField, fieldSettings); + rows.addChild(scaleField, smallSettings).setTooltip(createTooltip("scale")); + rows.addChild(depthField, smallSettings).setTooltip(createTooltip("depth")); + } + case DISABLE -> { + LayoutSettings offsetXSettings = grid.newCellSettings().padding(-13, 3, 1, 1); + rows.addChild(disableModeButton, 2); + rows.addChild(disabledIdField, 2, smallSettings).setTooltip(createTooltip("textureId")); + rows.addChild(selectionModeButton, 2); + rows.addChild(focusedRectWidgetNumberField, smallSettings).setOnValueChange(index -> { + if (index == 0) focusedRectWidget = null; + else if (index > 0 && index <= rectWidgets.size()) { + focusedRectWidget = rectWidgets.get(index - 1); + uMinField.setNumber(focusedRectWidget.uMin); + vMinField.setNumber(focusedRectWidget.vMin); + uMaxField.setNumber(focusedRectWidget.uMax); + vMaxField.setNumber(focusedRectWidget.vMax); + } + }).setTooltip(createTooltip("focusedRectangleNumber")); + addRenderableWidget(new StringWidget(x + 4 + widgetWidth + 3, y + 4 + (widgetHeight + 2) * 3, 6, widgetHeight, LocUtil.literal("/"), font)); + addRenderableWidget(rectWidgetsSizeWidget); + rows.addChild(new TexturedButton(48, 0, button -> deleteFocusedRectWidget()), grid.newCellSettings().padding(5 + widgetWidth - 18, 3, 1, 1)) + .setTooltip(createTooltip("deleteSelectedRectangle")); + rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("uMin:"), font)); + rows.addChild(uMinField, offsetXSettings).setOnValueChange(f -> { + if (focusedRectWidget != null) focusedRectWidget.uMin = f; + }); + rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("vMin:"), font)); + rows.addChild(vMinField, offsetXSettings).setOnValueChange(f -> { + if (focusedRectWidget != null) focusedRectWidget.vMin = f; + }); + rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("uMax:"), font)); + rows.addChild(uMaxField, offsetXSettings).setOnValueChange(f -> { + if (focusedRectWidget != null) focusedRectWidget.uMax = f; + }); + rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("vMax:"), font)); + rows.addChild(vMaxField, offsetXSettings).setOnValueChange(f -> { + if (focusedRectWidget != null) focusedRectWidget.vMax = f; + }); + } + default -> throw new IllegalStateException("Unexpected value: " + toggleCategoryButton.getValue()); } rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("save"), widgetWidth, button -> { if (nameField.getValue().isBlank()) { @@ -309,7 +325,7 @@ private void initRightWidgets() { if (CompatibilityHelper.isModLoaded("cloth-config")) minecraft.setScreen(ConfigScreen.create(this)); }), smallSettings).setTooltip(createTooltip("toConfigScreen")); final int widgetsPerPage, size; - if (toggleCategoryButton.getValue() == 1) { + if (toggleCategoryButton.getValue() == Category.DISABLE) { widgetsPerPage = 6; size = disableConfigs.size(); rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("copy"), widgetWidth, button -> configsInClipBoard = List.copyOf(disableConfigs)), 2).setTooltip(createTooltip("copy")); @@ -414,7 +430,7 @@ public boolean deleteFocusedRectWidget() { @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick) { super.render(graphics, mouseX, mouseY, deltaTick); - if (toggleCategoryButton.getValue() == 1 && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) { + if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) { GUIHelper.enableScissor(graphics, modelViewArea); graphics.fill(mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius, 400, 0x4F3333CC); graphics.disableScissor(); @@ -442,20 +458,20 @@ public void renderBackground(GuiGraphics graphics, int mouseX, int mouseY, float } protected void applyAnalyser(GuiGraphics graphics, int mouseX, int mouseY) { - String textureId = toggleCategoryButton.getValue() == 0 ? "" : disabledIdField.getValue(); + String textureId = toggleCategoryButton.getValue() == Category.DISABLE ? disabledIdField.getValue() : ""; Set hiddenNames = hiddenNameMap.getOrDefault(nameField.getValue(), Set.of()); analyser.applyDisableConfigs(textureId, hiddenNames); - if (toggleCategoryButton.getValue() == 1 && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) + if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) analyser.computeFocusedOnModel(mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius); if (inTextureViewArea(mouseX, mouseY)) analyser.computeFocusedOnTexture(mouseX, mouseY); if (inModelViewArea(mouseX, mouseY)) analyser.computeFocusedOnModel(mouseX, mouseY, layers); - if (toggleCategoryButton.getValue() == 0 || selectionModeButton.getValue() == 1) analyser.computeFocusedPolyhedron(); + if (toggleCategoryButton.getValue() == Category.CONFIGS || selectionModeButton.getValue() == 1) analyser.computeFocusedPolyhedron(); focusedPolyhedron = analyser.focusedPolyhedron.toArray(new VertexData[0][]); focusedTextureId = analyser.getFocusedTextureId(); GUIHelper.enableScissor(graphics, modelViewArea); analyser.drawModel(graphics, analyser.modelPose); - if (toggleCategoryButton.getValue() != 2) analyser.drawFocusedInModelArea(graphics); - if (toggleCategoryButton.getValue() == 0) analyser.drawBindTarget(graphics); + if (toggleCategoryButton.getValue() != Category.PREVIEW) analyser.drawFocusedInModelArea(graphics); + if (toggleCategoryButton.getValue() == Category.CONFIGS) analyser.drawBindTarget(graphics); else analyser.drawCameraDirections(graphics); graphics.disableScissor(); if (textureViewArea != null) { @@ -622,12 +638,8 @@ protected Button createButton(Component message, int width, Button.OnPress onPre return Button.builder(message, onPress).size(width, widgetHeight).build(); } - protected CycleButton createCyclingButton(SequencedMap messages, int width, Component optionText, OptionInstance.TooltipSupplier tooltipSupplier) { - return new CycleButton.Builder(messages::get).withValues(messages.sequencedKeySet()).withInitialValue(0).withTooltip(tooltipSupplier).create(0, 0, width, widgetHeight, optionText); - } - - protected CycleButton createCyclingButton(SequencedMap messages, int width, OptionInstance.TooltipSupplier tooltipSupplier, CycleButton.OnValueChange onValueChange) { - return new CycleButton.Builder(messages::get).withValues(messages.sequencedKeySet()).withInitialValue(0).withTooltip(tooltipSupplier).displayOnlyValue().create(0, 0, width, widgetHeight, Component.empty(), onValueChange); + protected CycleButton.Builder createCyclingButtonBuilder(Map messages) { + return new CycleButton.Builder(messages::get).withValues(messages.keySet()); } protected DoubleSlider createSlider(String key, int width, double min, double max) { @@ -655,7 +667,7 @@ protected boolean inTextureViewArea(double x, double y) { public boolean leftClickedWithModifier(double mouseX, double mouseY) { if (focusedPolyhedron.length == 0) return false; - if (inModelViewArea(mouseX, mouseY) && toggleCategoryButton.getValue() == 0) { + if (inModelViewArea(mouseX, mouseY) && toggleCategoryButton.getValue() == Category.CONFIGS) { float u = 0, v = 0; for (VertexData vertex : focusedPolyhedron[0]) { u += vertex.u(); @@ -675,7 +687,7 @@ public boolean leftClickedWithModifier(double mouseX, double mouseY) { } textureIdField.setValue(focusedTextureId); return true; - } else if ((inModelViewArea(mouseX, mouseY) || inTextureViewArea(mouseX, mouseY)) && toggleCategoryButton.getValue() == 1) { + } else if ((inModelViewArea(mouseX, mouseY) || inTextureViewArea(mouseX, mouseY)) && toggleCategoryButton.getValue() == Category.DISABLE) { String disabledId = disabledIdField.getValue(); if (disabledId.isBlank() || !focusedTextureId.contains(disabledId)) { disabledIdField.setValue(focusedTextureId); @@ -730,7 +742,7 @@ public boolean leftClickedWithModifier(double mouseX, double mouseY) { public boolean mouseClicked(double mouseX, double mouseY, int button) { double storedX = clickedX, storedY = clickedY; clickedX = clickedY = -1; - if (button == InputConstants.MOUSE_BUTTON_LEFT && toggleCategoryButton.getValue() != 2) { + if (button == InputConstants.MOUSE_BUTTON_LEFT && toggleCategoryButton.getValue() != Category.PREVIEW) { if (InputConstants.isKeyDown(minecraft.getWindow().getWindow(), modifierKey.getValue())) { if (leftClickedWithModifier(mouseX, mouseY)) return true; } else if (inTextureViewArea(mouseX, mouseY)) { @@ -775,7 +787,7 @@ public boolean mouseDragged(double mouseX, double mouseY, int button, double del public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { if (inModelViewArea(mouseX, mouseY)) { if (InputConstants.isKeyDown(minecraft.getWindow().getWindow(), modifierKey.getValue())) { - if (toggleCategoryButton.getValue() == 1 && selectionModeButton.getValue() == 2) + if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2) selectionRadius = Mth.clamp(selectionRadius + (int) verticalAmount * 2, 2, 48); else layers = Math.max(0, layers + (int) verticalAmount); } else { @@ -906,4 +918,16 @@ public void setFocused(boolean focused) { @Override protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { } } + + private enum Category { + CONFIGS, + PREVIEW, + DISABLE; + + public final String id = name().toLowerCase(); + + public Category next() { + return values()[(ordinal() + 1) % values().length]; + } + } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 46562cf6..39d04c4d 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -30,7 +30,7 @@ "depends": { "fabricloader": "*", "fabric-api": "*", - "minecraft": "~1.21.1", + "minecraft": "1.21.1", "java": ">=21" }, "recommends": { From 331ffc9a16feb1d484add5b233c42012dc4259c2 Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Sat, 22 Nov 2025 12:02:18 +0800 Subject: [PATCH 03/34] Added issues templates (#185) --- .github/ISSUE_TEMPLATE/bug_report_cn.yml | 79 ++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/bug_report_en.yml | 79 ++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report_cn.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report_en.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.yml b/.github/ISSUE_TEMPLATE/bug_report_cn.yml new file mode 100644 index 00000000..6816f0ff --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.yml @@ -0,0 +1,79 @@ +name: Bug反馈 +description: 中文Bug反馈模板 +title: "[Bug]: " +labels: [ "bug" ] + +body: + - type: markdown + attributes: + value: | + 请确保您使用的是最新版的RC,您反馈的bug很可能已经在更新版本中修复 + (查看尾缀是否与最新工件相同) + 在反馈bug前,请先尝试搜索是否已有相似的问题,请不要重复打开相同的issue + + 所有有关YSM的问题,请您优先寻求他人的帮助,或者观看配置模型教程 + 而不是直接在issue中提问。 + + - type: checkboxes + id: preliminary + attributes: + label: 我已确认 ... + options: + - label: 我正在使用最新版的RC + required: true + - label: 无法在关闭主要功能时复现 + required: true + + - type: input + id: minecraft-version + attributes: + label: Minecraft版本 + description: | + 你所使用的Minecraft的版本. + + 你可以在游戏主界面作下角或者游戏启动时的日志开头等地方找到. + validations: + required: true + + - type: textarea + id: incompatible-mods + attributes: + label: 不兼容的mod + description: >- + 和bug相关的模组 +
请在反馈问题前尝试尽可能移除不相干的模组的情况下复现bug + placeholder: 'Mods list here' + render: 'raw' + validations: + required: true + + - type: textarea + id: description + attributes: + label: 错误描述 + description: >- + 请尽可能详细的描述遇到的问题. +
越清晰和详尽的描述会使该bug的处理优先级更高 + validations: + required: true + + - type: textarea + id: step + attributes: + label: 复现步骤 + placeholder: | + 1. Join the game... + + 2. Change some settings... + + 3. ... + + - type: textarea + id: logs + attributes: + label: 日志和崩溃报告 + description: >- + 你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能 +
你可以日志上传到类似 https://paste.ubuntu.com/ 或者 https://mclo.gs/ 的网站并在此贴出链接 +
**请不要在此此处直接粘贴大段的日志文本!!** + placeholder: '把日志文件往这丢或者使用外部链接' diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml new file mode 100644 index 00000000..e7b93934 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml @@ -0,0 +1,79 @@ +name: Bug Report +description: English template for reporting a bug +title: "[Bug]: " +labels: [ "bug" ] + +body: + - type: markdown + attributes: + value: | + Make sure you're using the latest version of RealCamera, the bug you're reporting has most likely been fixed in the latest update + (Check if the suffix matches the latest artifact) + Before reporting a bug, please search for similar issues first and avoid opening duplicate issues + + For all YSM-related questions, please seek help from others or watch configuration model tutorials first + instead of asking directly in the issue. + + - type: checkboxes + id: preliminary + attributes: + label: I have confirmed that ... + options: + - label: I am using the latest version of RealCamera + required: true + - label: Unable to reproduce when main feature is disabled + required: true + + - type: input + id: minecraft-version + attributes: + label: Minecraft Version + description: | + The Minecraft version you are using. + + You can find them at the corner of main menu or in the log while startup. + validations: + required: true + + - type: textarea + id: incompatible-mods + attributes: + label: Incompatible Mods + description: >- + The mods related to the bug. +
Try to remove unrelated plugins and mods before reporting + placeholder: 'Mods list here' + render: 'raw' + validations: + required: true + + - type: textarea + id: description + attributes: + label: Bug Description + description: >- + Please describe the issue you encountered in as much detail as possible. +
Clearer and more detailed descriptions will receive higher processing priority + validations: + required: true + + - type: textarea + id: step + attributes: + label: Reproduction Steps + placeholder: | + 1. Join the game... + + 2. Change some settings... + + 3. ... + + - type: textarea + id: logs + attributes: + label: Logs & Crash Reports + description: >- + You can find error reports in /logs/latest.log and /crash-reports, or use the launcher's export function +
You can upload logs to sites like https://paste.ubuntu.com/ or https://mclo.gs/ and post the link here +
**DO NOT PASTE LARGE LOGS DIRECTLY HERE!!** + placeholder: 'Drag log file here or use external link' \ No newline at end of file From 34db664907d8af8b62d856d0c4d0ed28bd96d753 Mon Sep 17 00:00:00 2001 From: xTracr Date: Fri, 28 Nov 2025 00:30:26 +0800 Subject: [PATCH 04/34] Added cache for DisableConfig --- .../com/xtracr/realcamera/RealCameraCore.java | 2 +- .../xtracr/realcamera/config/BindTarget.java | 108 +++++++++++++++++- .../xtracr/realcamera/config/ModConfig.java | 3 +- .../realcamera/gui/CyclingTexturedButton.java | 4 +- .../xtracr/realcamera/gui/ModelAnalyser.java | 2 +- .../realcamera/gui/ModelViewScreen.java | 11 +- .../xtracr/realcamera/gui/NumberField.java | 4 +- .../xtracr/realcamera/gui/TexturedButton.java | 4 +- 8 files changed, 119 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 62506e21..a860ecf3 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -140,7 +140,7 @@ public static void renderCameraEntity(Minecraft client, float deltaTick, MultiBu for (VertexData vertex : primitive) { if (Math.fma(m02, vertex.x(), Math.fma(m12, vertex.y(), Math.fma(m22, vertex.z(), m32))) > -depth) continue; for (DisableConfig config : disableConfigs) { - if (config.test(vertex)) continue primitiveFor; + if (config.disable(vertex)) continue primitiveFor; } for (VertexData vertexData : primitive) vertexData.render(buffer); break; diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index c92c009c..290bae3f 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -1,9 +1,17 @@ package com.xtracr.realcamera.config; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import com.xtracr.realcamera.util.VertexData; +import it.unimi.dsi.fastutil.floats.Float2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.floats.FloatOpenHashSet; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; +import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @@ -14,9 +22,9 @@ public record BindTarget( BindConfig bindConfig, OffsetConfig offsets, DisableConfig[] disableConfigs) { - private static final short serialVersion = 703; public static final List defaultTargets; public static final BindTarget EMPTY = blank(null, null); + private static final short serialVersion = 703; static { defaultTargets = List.of( @@ -200,7 +208,22 @@ public void write(FriendlyByteBuf byteBuf) { } } - public record DisableConfig(String name, String textureId, boolean disableAll, UVRectangle[] rectangles) implements Predicate { + @JsonAdapter(DisableConfig.Adapter.class) + public static class DisableConfig { + private final Float2ObjectOpenHashMap disableCacheMap = new Float2ObjectOpenHashMap<>(); + private final String name; + private final String textureId; + private final boolean disableAll; + private final UVRectangle[] rectangles; + + public DisableConfig(String name, String textureId, boolean disableAll, UVRectangle[] rectangles) { + this.name = name; + this.textureId = textureId; + this.disableAll = disableAll; + this.rectangles = rectangles; + disableCacheMap.defaultReturnValue(FloatOpenHashSet.of()); + } + public static DisableConfig read(FriendlyByteBuf byteBuf) { String name = byteBuf.readUtf(); String textureId = byteBuf.readUtf(); @@ -212,6 +235,22 @@ public static DisableConfig read(FriendlyByteBuf byteBuf) { return new DisableConfig(name, textureId, disableAll, rectangles); } + public String name() { + return name; + } + + public String textureId() { + return textureId; + } + + public boolean disableAll() { + return disableAll; + } + + public UVRectangle[] rectangles() { + return rectangles; + } + public void write(FriendlyByteBuf byteBuf) { byteBuf.writeUtf(name); byteBuf.writeUtf(textureId); @@ -222,14 +261,73 @@ public void write(FriendlyByteBuf byteBuf) { } } - @Override - public boolean test(VertexData vertex) { + public boolean disable(VertexData vertex) { final float u = vertex.u(), v = vertex.v(); + final FloatOpenHashSet cachedVs = disableCacheMap.get(u); + if (!cachedVs.isEmpty()) { + if (cachedVs.contains(v)) return true; + if (cachedVs.contains(-v)) return false; + } for (UVRectangle rect : rectangles) { - if (rect.contains(u, v)) return true; + if (!rect.contains(u, v)) continue; + disableCacheMap.computeIfAbsent(u, k -> new FloatOpenHashSet()).add(v); + return true; } + disableCacheMap.computeIfAbsent(u, k -> new FloatOpenHashSet()).add(-v); return false; } + + public static class Adapter extends TypeAdapter { + @Override + public void write(JsonWriter out, DisableConfig value) throws IOException { + out.beginObject(); + out.name("name").value(value.name()); + out.name("textureId").value(value.textureId()); + out.name("disableAll").value(value.disableAll()); + out.name("rectangles"); + out.beginArray(); + for (UVRectangle rect : value.rectangles()) { + out.beginObject(); + out.name("uMin").value(rect.uMin()); + out.name("vMin").value(rect.vMin()); + out.name("uMax").value(rect.uMax()); + out.name("vMax").value(rect.vMax()); + out.endObject(); + } + out.endArray(); + out.endObject(); + } + + @Override + public DisableConfig read(JsonReader in) throws IOException { + in.beginObject(); + in.nextName(); + String name = in.nextString(); + in.nextName(); + String textureId = in.nextString(); + in.nextName(); + boolean disableAll = in.nextBoolean(); + in.nextName(); + in.beginArray(); + ArrayList rectangles = new ArrayList<>(); + while (in.hasNext()) { + in.beginObject(); + in.nextName(); + float uMin = (float) in.nextDouble(); + in.nextName(); + float vMin = (float) in.nextDouble(); + in.nextName(); + float uMax = (float) in.nextDouble(); + in.nextName(); + float vMax = (float) in.nextDouble(); + in.endObject(); + rectangles.add(new UVRectangle(uMin, vMin, uMax, vMax)); + } + in.endArray(); + in.endObject(); + return new DisableConfig(name, textureId, disableAll, rectangles.toArray(UVRectangle[]::new)); + } + } } public record UVRectangle(float uMin, float vMin, float uMax, float vMax) { diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index a84bb5b7..8a4e186e 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -221,7 +221,7 @@ public List getBindTargetList(String textureId) { binding.clamp(); int activeConfigIndex = binding.activeConfigIndex; List matchedTargets = binding.targetList.stream().filter(target -> textureId.contains(target.textureId())).toList(); - if (activeConfigIndex == 0 || matchedTargets.isEmpty()) return matchedTargets; + if (activeConfigIndex <= 0 || matchedTargets.isEmpty()) return matchedTargets; return List.of(matchedTargets.get(Math.clamp(activeConfigIndex - 1, 0, matchedTargets.size() - 1))); } @@ -311,6 +311,7 @@ private void clamp() { } swimOutTick = Mth.clamp(swimOutTick, 0, 40); bindResultRetentionFrames = Math.max(bindResultRetentionFrames, 0); + activeConfigIndex = Math.max(activeConfigIndex, 0); displacementSmoothFactor = Mth.clamp(displacementSmoothFactor, 0.0, 1.0); rotationSmoothFactor = Mth.clamp(rotationSmoothFactor, 0.0, 1.0); if (disableMainFeatureItems == null) disableMainFeatureItems = List.of(); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java b/common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java index f75d7be7..a10c17bf 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java @@ -4,7 +4,7 @@ import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; @@ -26,7 +26,7 @@ public CyclingTexturedButton(int x, int y, int width, int height, int u, int v, } public CyclingTexturedButton(int x, int y, int width, int height, int u, int v, int vOffset, int value, int size, ResourceLocation texture, int textureWidth, int textureHeight) { - super(x, y, width, height, Component.empty()); + super(x, y, width, height, CommonComponents.EMPTY); this.u = u; this.v = v; this.vOffset = vOffset; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index 1c804ceb..151d8bec 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -98,7 +98,7 @@ public void applyDisableConfigs(String textureId, Set hiddenNames) { primitiveFor: for (VertexData vertex : primitive) { for (DisableConfig config : disableConfigs) { - if (config.test(vertex)) continue primitiveFor; + if (config.disable(vertex)) continue primitiveFor; } primitives.add(primitive); break; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 2c118263..b5a21cb6 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -26,6 +26,7 @@ import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; @@ -108,7 +109,7 @@ public class ModelViewScreen extends Screen { .withInitialValue(0) .withTooltip(i -> createTooltip("toggleSlider")) .displayOnlyValue() - .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("toggleSlider"), (button, i) -> { + .create(0, 0, widgetWidth * 2 + 4, widgetHeight, CommonComponents.EMPTY, (button, i) -> { if (i == 1) { offsetXField.setNumber((float) offsetXSlider.getValue()); offsetYField.setNumber((float) offsetYSlider.getValue()); @@ -133,7 +134,7 @@ public class ModelViewScreen extends Screen { .withInitialValue(Category.CONFIGS) .withTooltip(category -> createTooltip(category.next().id)) .displayOnlyValue() - .create(0, 0, widgetWidth * 2 - 18, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("toggleCategory"), (button, i) -> initWidgets(0)); + .create(0, 0, widgetWidth * 2 - 18, widgetHeight, CommonComponents.EMPTY, (button, i) -> initWidgets(0)); public ModelViewScreen() { super(LocUtil.MODEL_VIEW_TITLE()); @@ -651,7 +652,7 @@ protected NumberField createFloatField(int width, float defaultValue, @Nu } protected EditBox createTextField(int width, int maxLength, @Nullable EditBox copyFrom) { - EditBox editBox = new EditBox(font, 0, 0, width - 2, widgetHeight - 2, Component.empty()); + EditBox editBox = new EditBox(font, 0, 0, width - 2, widgetHeight - 2, CommonComponents.EMPTY); editBox.setMaxLength(maxLength); if (copyFrom != null) editBox.setValue(copyFrom.getValue()); return editBox; @@ -818,7 +819,7 @@ public class UVRectangleWidget extends AbstractWidget { protected float uMin, vMin, uMax, vMax; public UVRectangleWidget(float uMin, float vMin, float uMax, float vMax) { - super(0, 0, 16, 16, Component.empty()); + super(0, 0, 16, 16, CommonComponents.EMPTY); this.uMin = uMin; this.vMin = vMin; this.uMax = uMax; @@ -826,7 +827,7 @@ public UVRectangleWidget(float uMin, float vMin, float uMax, float vMax) { } public UVRectangleWidget(float xMin, float yMin, float xMax, float yMax, @NotNull ScreenRectangle screenArea) { - super((int) xMin, (int) yMin, (int) (xMax - xMin), (int) (yMax - yMin), Component.empty()); + super((int) xMin, (int) yMin, (int) (xMax - xMin), (int) (yMax - yMin), CommonComponents.EMPTY); Vec2 minUV = translateXYToUV(xMin, yMin, screenArea), maxUV = translateXYToUV(xMax, yMax, screenArea); this.uMin = minUV.x; this.vMin = minUV.y; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/NumberField.java b/common/src/main/java/com/xtracr/realcamera/gui/NumberField.java index 93ffba2f..7a5534ee 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/NumberField.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/NumberField.java @@ -7,7 +7,7 @@ import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.navigation.CommonInputs; -import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Style; import net.minecraft.util.FormattedCharSequence; import org.jetbrains.annotations.Nullable; @@ -20,7 +20,7 @@ public abstract class NumberField> extends EditBox { private Tooltip tooltip; NumberField(Font font, int width, int height, T defaultValue, T maximum, T minimum, @Nullable NumberField copyFrom) { - super(font, 0, 0, width, height, Component.empty()); + super(font, 0, 0, width, height, CommonComponents.EMPTY); this.defaultValue = defaultValue; this.maximum = maximum; this.minimum = minimum; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java b/common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java index b4882678..ec0a6447 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java @@ -4,7 +4,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.resources.ResourceLocation; import java.util.function.Consumer; @@ -24,7 +24,7 @@ public TexturedButton(int x, int y, int width, int height, int u, int v, Consume } public TexturedButton(int x, int y, int width, int height, int u, int v, ResourceLocation texture, int textureWidth, int textureHeight, Consumer onPress) { - super(x, y, width, height, Component.empty()); + super(x, y, width, height, CommonComponents.EMPTY); this.textureWidth = textureWidth; this.textureHeight = textureHeight; this.onPress = onPress; From 3805e0d1b5563f18c9582abf4a143861129cc2d8 Mon Sep 17 00:00:00 2001 From: xTracr Date: Fri, 26 Dec 2025 16:00:21 +0800 Subject: [PATCH 05/34] Update dependencies --- build.gradle | 7 +++---- fabric/build.gradle | 6 ++++-- gradle.properties | 17 ++++++++--------- gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 ++----- gradlew.bat | 3 +-- neoforge/build.gradle | 6 ++++-- 8 files changed, 23 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index 9dc142f3..cd909ce2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.11-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.13-SNAPSHOT" apply false } architectury { @@ -18,7 +18,6 @@ subprojects { dependencies { minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" mappings loom.officialMojangMappings() - //mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" } } @@ -28,11 +27,11 @@ allprojects { apply plugin: "maven-publish" base { - archivesName = rootProject.archives_base_name + archivesName = rootProject.mod_id } version = rootProject.mod_version + (findProperty("commitSHA") ? "-${(commitSHA as String).substring(0,7)}" : "") - group = rootProject.maven_group + group = rootProject.mod_group_id repositories { maven { url "https://maven.shedaniel.me/" } diff --git a/fabric/build.gradle b/fabric/build.gradle index 6e67a066..d3fa27df 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,8 +1,10 @@ plugins { - id "com.github.johnrengelman.shadow" version "8.1.1" + id "com.gradleup.shadow" version "9.3.0" } -archivesBaseName = rootProject.archives_base_name + "-" + rootProject.minecraft_version + "-fabric" +base { + archivesName = rootProject.mod_id + "-" + rootProject.minecraft_version + "-fabric" +} architectury { platformSetupLoomIde() diff --git a/gradle.properties b/gradle.properties index 556d4a35..8adf3338 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,17 +2,16 @@ org.gradle.jvmargs=-Xmx4G -XX:+UseG1GC org.gradle.parallel=true org.gradle.caching=true -# Loader Properties +## Environment Properties minecraft_version=1.21.1 enabled_platforms=fabric,neoforge -fabric_loader_version=0.17.2 -neoforge_version=21.1.194 -#yarn_mappings=1.21.1+build.3 -# Mod Properties +fabric_loader_version=0.18.4 +neoforge_version=21.1.217 +## Mod Properties +mod_id=realcamera mod_version=0.7.5-beta -maven_group=com.xtracr.realcamera -archives_base_name=realcamera -# Dependencies -fabric_api_version=0.116.5+1.21.1 +mod_group_id=com.xtracr.realcamera +## Dependencies +fabric_api_version=0.116.7+1.21.1 cloth_config_version=15.0.140 modmenu_version=11.0.3 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37435 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 delta 35540 zcmXt;V|-nG^Yzo1jhhoUwr$(CZ5t;%vDLV-Z8x@UyRrTBzW$%*{eJbEnYGt^*YqBM zw=II#+I*M4lbaZqm7$}bMUtVTo|>3$P-a|U**UzOpc|2zl$)fHqWuPc1~N@ODAcBE z#Ud*{D5MU-BKv_+_~XX;#`znVq6`eIT^&E4AQ%{!09aC8GF}ojvJg-jf(a#OWo=2D zAqXputL(zvYOr1vweX~@RpZq;r z0$_%)Fo^oi>sq%1Si;q_MZObGwQ`Zy6xw4rs;UEDIu7f)HUoH$%hfq+}iE&UwOBzM)*Qks+P9QFb`A>77k|+m} zfcD=^W^ycw(mYF$m`}|02gjlo3~6IxDbkzzic~UO_tmUsFf>h2m@6{m&JZ#N=mn`UN-LMS z!{YaSCllPSe1m?g5s1ZE#4q)O_}{yM_d#wGe**(^{PyqNXp(AZk(2a_F@a{vItu7Y zD4*XkQk!WMf5YlKbu|^4(ZQ-ScB3$mszsBbL^G6hgk1!7v3BU>Gu;Z@BR`jmlUf@4 zK6*U!EUbpEq3KU$rQc0HO{S+C0J}fH7^BEQPd+}=G!Bj29PS}D)=?RCMVM^;E*W!2 zdG{NM`{_Y@-L+82kbLZ(ia=(Zz7;ra`QLQ*PCO`LRaPl@TePF$1>LoZ?B>UC=NfA- zI&|yBf-^fs%x!&5g)|`ydQtfueaMngdnxH{>C&SZ9c$~~7(uF&HZLGgO1oah!&|9&~<9-E`54LIS~igTU|rqedJE?Yzc^ zVP4AxQOOv^Hiss>U64&pCTU8UyJo5#0VJeUCNZNg_8nuiE0ML)J!%js-L?%Ihv|yp zNe_h{_7+92Zkn+g^scghb{t<4M zkQ8WO?Wh5UdWs}_0LZ1Qm=J02*IHHoIEQhH`%a^a{>u=?X!Qa zDRE#i_7!%=#Af;p_aTxOf&nCqk^JYdK z&FP!@10%uDh@Uf%WU~V>*Ll$%>u4w$te5027DqWQSLr++{$DRQ2!Fug5p!c>_0{XF6;`Ix$x?t65c zh#}&u`HX6+=cRX0FJiKaJ4OqiQZsK$C(bi}ntKXy*A6v?wRaH#T+?iLXc*2bwlp7= zT?6)wq$L1oDye0G0$t!uB#2<2i_kE^_&ktef1hkbzKol*ZG19ab=WdDldzO$#2G_G zngkF`H5xb$V-s>#UEqi5_pELoM)q9YpQCaRcbZJS<3a2Xe1~b7hguHxQrbIAY=p?6 zLCn5!QdqKSV+i)RMbql%3_dBYvZ(Tw;bW-Ro09_KqqmAb0Y)AKbC!;@T5vuMJV9mp zL2MhwBjHa8do*KKufpO)n+7~?EY4lGk;?D2XP{YU91lm1i1lB_fOGH}Lq^h8I|Ivr zn6;c*V(S3bVy1$9egZ|2syP~yks;!xOnBh8X_(g78h0SU3LInAo;7=rdfuIR5Am|8|mQmSw$aPpg_6pL74s^vWW8 z-yk4}j!ANJJ2^mT#;a!mDKv()TzTQMb)0pVHSY7ee_X-i^ae7qNmW53^$4YErLb)11MEBc$BV>^<6LgVfWG@z4#3|mrab7#;j;yISA#0aRGLeL2oCwV{h)AjR zJoOVXVGa>r3*V#QUyq|FLJT6bV=*BRKt!MHb_RztDa(*N3Rc}aBo@D5pA;?qNh;2e z{tM1<5=6bsW->ezOL~M{BSXGfok0oVCn~v2QF!^E#%Rcschavap3_vD)Y^}VIJa5JT}qMTZL@esP+mB)EsgPwioS0v zQaaLD&l|JMaFTe)VAP$ zZyP?j+aH^B+g~q-%V6yLUx*BZeC;(Ck2AkB_y^?Z76_z~LxIG3jVY6-ptG}7>`84L zind9lYVNG>VQLf^1V^VL^8Du^YhkMWy9tW)=#%AbrS!gt_Up}5T`$aYP3w`5B3}JJ z16eA?Ic6z1SlUP1sxq+?V;$G?IwZH2+KZa#%5M^85^xwnhI3=R1dfH#6Dy0Svih#Go!isiX;Q*t%$|20ZM=T?$6!Puh zG$OSAf&RY1-$5_k5TKduU$5+idTBYR>WnwlGt!8og=?sW*xD9h>S$Sl?D;remyEO# zgsKt?np=x8nk9A>CQh49p?&U~3!C_e!?~1i;meKC4R$Sk?>s%e2{mK_N-a zzS>e@U9?mtRkoMN7$MqWcx(hEgDC6DM5SQun@0w0p@j$zF;H~WfR5x4xGwD$eco8( zggj5uwDY{#iS;cut11gRjp7XNvMXhS6M0_5nG)T`8b@kD;c}YphFxjwJP}EBsx~W0 zU#;O$EpU5|4X#R5*}(cr9y<-b2*A!n%Zt?>LYM3l?7e{hSh_~H&uoieOhaGdpf+D> zDot{U&pR@2FLCFOt?^q=acvh>6!id+-uiB?m}`z`e|rU$w7kaDlB>sz35o}~#4E61 zs)6`6PwK>cWy^}1H`8S}nK*Q;^o){g9cPxU8b~FQT7}WhU>)x;=%8!1?`>gXgXE4z zQJAPkwXLB#@`Qv5OSPO>hp-G!?vdMXRA=2;zkx1_wTGzFJ{>GEOM6LKd`MmG9Zplu zg^x~jkv9+}uWHv4M(7?v0xjj?9=X!xtDN&0>_@C11+r^6BFp3XZgdwF--!v@e_%~u z0D97AZI%-c1^#@!F$l`oy=*FHnU}pGI43lf#9rJq65E$wTjI0ops4OeLL8qeYNM&a z#c3hi01U`!3YoMF#OLKHZ`lV@w_C@L2~Hkb>M)DaG=F%}lVIVrwmO984K+pLnmMTq zGGl}2U6JSLTyVP35SiLxZGM=)C{p1z0MVQgvED?v^-RQ6qomcr%`7@(;9_DMkS8c=FK@$VvTY}*ZmZC!cCt5HE@Do{f-=6-N@U!7L(^%A;p@C+mrwH zNKgGK?8$tIT5rBF?l>C_S0>YHaG*BNjTD?$S2keOVg?9N|4Tc|iM*G`%^MJA1&rr@ zwbLCcFlMG7HfiDvQX5P-*Lqz)k^%U z0-sOb4uXp1=6mGnS{Q!24v%%5Z}(O(e#TsWzn*9!se;GF>Bzuma(l_ znp38c6f;LX=Z|ly>V>aceR;z7f#70DYQZhZlwuZM4EE*doY(`4o@uQuUQ0Mc+}l_P z2b}yr$^8@1gf{l8p@f1 z+Z3Q{E(3o3@irpjwfi#^^r2LrBQgE4>r{y^anEAw52K?)KI@M7u)Dy?l|JwoD5dLm z#@eo2*krD-L!+A=sS%olwA|<$dtMy>T->MSa1-6h;w#>R1UrN4B*Yp@Wm0~QOvf#n{Uoyq`QnxwD|-( z=~tK>{w!_bA1xkv30#AK)ERi$tz!{De^(fIqjLU4=Q0pT5<{mMj}&2*;8E&{BK=q( z=wJ8=U398$9nae|+_mr%IsV9G;peonPp6=jPv+QP$fn_8&1i!<$Q~uX_gJ%Mi1Af; z*80UpA)l^}@{=X6(pQB4dC04P%d8D(FfilqVE_J!5Re#PNo~m(Nv}l8q!92r34!th z9F0Nl44WGZZ2_~Cvje6Du<<5N%$u4M)OC1ie~8(sgQUVkjB_Jj9g z51|#Y{=C;bY-!iKE(H}mVsO#{-SB19@ zzgO|e7g%BZ(s>acdAgF~Htp7C%OQ2j^#rlYAkYvTK+4gfbcXC_LvxU)$T+3Qo#kqBS z(xHP+&~N|N^n>*IOb5?g4Ltg)F?GPAJ6%uzZ{P`XP^S{T{4VRwXDHcAn<1FK?P zzzgft9$tSm#aH4sHjx1F&S<0>55G*WSO&5JTH|?m{Ly~#C*dseu$mLLjFoO5Cg!md z5q14g{LKM~BCO}bQdKPui(Edbxb7GpySz0vh4Ki=T0H9`{zbDHTiJW#*{z)ou_3{y z0C?OS@|DKJh&2g*L2j8V4q774{t@2?Se4y%JHwU7>>+-`o@J4^@&(r> zmV{J}yt9DTdO_X-T!o_(^S~GCJEFds{PI$RV*2QcFokT0zq1&@8twWlJ9CHKKtLA*3`>bYOtM*t0vt zVQQtEyid-PSMHPZ*5gwyVGmfeQQ+>~=&1HEq&DT5|) zk&d}_o#pxlRb{+#tc=D;;39;;@dOM#LxNkJkFZcYk=Ei12q=Ls68xFl_q%!njdC7g z+0-2StW$3uAJ7)&N0Bw1!-7AbY2k@pAzwql|4ARjh$CDohAzU`{1*bXF(mINju4-4 zcUer{;L)&`P^fgx93v=pWsE@JfGUbd+)ya-iDGuhqBQyVZCMElm zCBX(PK|V_~0q|b=JW{^-L^q4FB$sV=s;2-$R@XL}(3Uz82qp0iy*N{ zR{nLoG}M2a0|cc6uvZ?J2?akXeg-Ts^@luO`x%iCt&TFLm?F_Pw0vdA(lSoRJ8ufy z;N_0`E+sNm{z70cTv?bu7-1+N?5DTL^UkrC!;zQy<>l8WM8Nk-#%CA5j{+ae0bSjE z`Jf9y#GnVk11%y<59Vc~R0_#Xq0kND2oZY`CQ&D=@d@a4AVf87HH;XJc_(bqQ+P`= zyVxjvKQATyjo$|7kFjnUmupR8LAw z=92^R80CKS&;&(h?vaM*^Fj&vk_}DPTzUBIJChlY4I}(=#2*aL;S!POtlSX{imluW zfQ4=;x=s3Epmc>FI}FQp@i#Y1#?t2QmT4Tui|t9>q&TPH=kbg5FSc3{ zmV*rGal|H*+U+wwk9iOOZ#*^bw#6s0t$yxBs8hp)N@jU8v-RaLjh@g5TL-NZ#;gKf zm9?)4&=tV~Y=-{U?E;GTsqv`tHJg2ZW0tYHcsUX@nBYptZ#&blX%%=+Jp|KU0toil5z zZxz4uX{2@9SqJ}-I)2GLbX0I?75x!ck9NIZA0vO88N@%sKED~T1twbVAzw>iUp15Y zH<~A|@>pDQxm>Nj?H?~+fh`#^`ttIuJ9N(LZ17^{6gixk>(rbTUqQznB<%Zu&UJzu z$qIM!evf}gMrt6L0M6H*gI>)u#}!o{{;=y30OTuY*H%h1&!;Ih*s7l|s*@o@@a-2) zDS6j#LKI^y(AUtZ3tM0vD*5zm0I4UZS1g8zs}MaEvNvN1LA}>0dJUK@g{A3pWp;1X z<9s$@$&an@q1szWdl|_2njA5t{S$CkHyH;xdh2%Cuq@Ifz`^*PF>}hl@7;LH%>d<3 z!Jwey*ke%!fV%X)*S_RSys6Bg2-30>NffKS^@yQ2&N5>G5l=KcV)_UnGvG-2PzqBP zTO7LOllr4PZ{1W9;Dj0KkX_o(D3I59n*f5MHFtvXz>fUd>iNq(hejRq_LYas?HNCa zMvw@{3u{Ra9C?*0GntX}mFXv;9Y%{|n=s;!RR;hb)XXLA=S3M0_O>6}&znQM`*oCm z%R?7g(U-)>WfxEqzOf4e77J&)rAx#}Ex)x%H+V&CoI%|#B24&ygU0Z7NNx=y6%#CQ zj`hu38SX;Xd^5@(uy@u?;R=>mH0myx^Rc>{4 zQfFZ!Fy{yP@`d7!$`ly*`IDtT26b!%mb8VUMZTVB8KF~Ru{8q)iiDx% zOp+Muc+~;$Wc?6H#k#|G%G|r`A|0=Y*;&UYLJ>k2iO621t@3^QCum}qLg_+Y8rJDo zOq9SS+~Ye&1VZW^p-`c+&k85~Kx~U;Wq*7ksnz$^EAC#ywyn>a<2u-Lm3PcXkaJbXDPXYWj2X^f0yHSi}5%_@c1k&HGtfY$`GFF&WJ(r2kg zTN4Gij=@5eU0112o`DM=L5Gpya~>TfeJF(|DP>zfN&gz^lD_H_iJw!ZPXgr`+wis5 zq$4I!!p+ENDx*iHsopneyV{2UDj(l|Vpa(<78jOi^H1JMcRcDtzGs_ji7LBoT@CQ; zo5@IJn449^a5V+sGHi|sf7DLlSL$&FP2SbrpK6qO7kUz+5(6k7p=Wx{3aZoLx`$uG z#Q!GSSK=AF)gGi;s0&gqA`!xMjUehR>SqLMt{%Q^+TMLr1B(&GXLE6{v)(MfYPj!dTV&xny{hm-3u!n4uZPOi}(i)Ia5MjtVSkq z7r04~U6yjRQm{9_(A~0J>9HTf9NETBjO5>#Wmn~gHkX=G}QA=Zi7tMUhOH#%(NrX zK)a3Rm*ru7m2SCXh>d~HDV45+j7PS-!l&3a$sjzR`pSl_;k{Nc2AkvC1#0v%QZx-% z@M?1WZzoGv{xigO;5m0s??_K3i|sxbLM7FnGJ!8hgp)6M9{fFE2YTQUZ8Y$QK=1uIG1Vk zST;!>dB-$gX|#=T(71(c9!sqbqMZ9;i@r9kCo@E!{jEz%$03t`3PG#Y+Eca8U8>*o z*zyzOUp@;>kVhawL^6igpy_z^6zX9+5jr4ej)!NU3X40h(p z42;SkfJhX*Za=EGIo)&6a974Tp$ARS(=5&qDqhUbXur8bC(zQsMU=sIHUG#j^{QJ( zYro`-?j&2}T?kNr$4udl2z1dFz3OjOV^@+wZjRuK4rRPvDPN2sxJEG`if{p9arQ}B z(zqizQ&UpQrqAyw#+z=12D&)hR373V*x&8Gmv5m4Cq`hjleSrvTTzExezD4butIe$ z1Xd5@Pj^{)9@2F$2@@NX%wi2uWf3t`ZxpQWGTz${nU8N!g?F$SSsBAf51nO(CpG}$ zlMyffyiiN_zC4(0z|xNagY^GUAl}66gXC0_ThpDSn<8sF^WHM9N0l5SjHt)y#vfIy z&#kjF6&CM1o4@6P2As)~n=C?nZ`0m-`M5VHzc%#eFmTn`+$mqB*FJToYR#NPl_iObc6 zdb)_oJj9x{(NRQTBO|BeSN{4k=7cifUS}lYO&`*%@lpg1T4aV8qQ6)4?J1yOsMyF2t;<6ZWhIrzW1(P~HJhf%6^W0KL!Wd}V)S-vn6{ zH`S5$`59`#(ibWMOLD1KVJ2`&?b-lC5yCHxM?V)?mvikEzgyZJ?*bdPdtg`75spxx zze$sEts&&oLh>uTkTpj~_=pOp2d?(m;nO$Nmg$)$c~A1^4_eW%L>hqp(20Z2-!{F! z`?!x0#!i)zCQ!KyCTC>DX+Onz{D<)RRq&+d!W*AGvc{AQ%cjUUIdXemI_`XOnc}vL z#$I)B1a2CT=+3?o`wAx1u1a zsPsA>&iWjVH`uy1WJaT8GEQmO=!87?g(>-zY`bBb=?hqQKqpvBtGeAE+7ucF-R^+2 z?(m0gEK3yEOi>q~>o{xw9X|Q4=W?rxNXZzap)bisqp@eE3?fM_ZnnlkbZLd`BGiSoC8vDpx0}OJ6_Cpva5c{iTPt z-%1n5oKrgHNUR2t%GWQup}LvfsI6@Xpyk>)Ol{E$^XOyVKxYiYy6~&+2|~IJ%PFAe z33X1$A7$D=Yx&E0R*<|KInpiG&)jK)STfXMn$tSGgPYr0vI78_O2RTDy4_Rl7DgKZ zAu%Cmw&V1(E(MjC;VewEFe$Miz#odii|o6^T->Y_ge8Z>P;a22p)Tz}0lQ8T54IAn zyt8w+RUn{HFC~4HvzfK+)B+D^%?{S7`p9O<8*4c;zqQ($*#L6JyD_mtQv z<{ov(>yi%&!3K?gktLA3s}E(Z=(Yj>{4+uu?1o9`P*S=nPEdDtd*$bneZ-Th)bp^T zH&bxje0sy3p!1-aCqOd8c=K=?-AA*XCgOY*vDQ>uA=9KzlU&kX>2b5|14z=if} zXL?;;iA=oO-Rix!N9DG>;LY==3EX;e^%hLO@v`4DFp@;umy}J}5-Y`ZaR5s(l-wC{ z_eXR1OOQ4DlhH-q5N;58jyUkFNZ6#{QgfufD}L&3A%GuSP(Qpw=BX*lTmm{wNWv-Q z(pq-*Qs(|^XE?r9e*^~&OVUmahei*X4RW)BQ+}Gy`z;xH5wpUp@o#59!*sVAyW)wEs?HYcgdJjd8-QACdJ&(xXR211}+YSu!K&}%Ei1EaC zyq6%|5~Q7cLuPayBIFskU79Zt=m~p%Kp@5)<$$Ktl~{knH)yrT?dQ} z+65n^kaQC`dlr+1W^)9hgGIjsA^1j52nabAdQpAs?ymf57(sB$X+pt7MRoEKmGUO$ z5~ldm#@%he)@?*$oR?`c*uXJ6bxpCfwfH~k=KGAz%*+_n1^qTw_+nUEi6gAmF8UUn zTC4q)f6jvOMrTG?zw>OuD7S@q1->M(LU9GgJgPD{+x5BF9Gd8KyoVqem2fY9V> zTy59gN2I(}cvN0?=Y7J#KvV((u`8A88gCs7>qN4xAm#Z^@3O)9@+6mBVVOJ!MC;D zUPeZ{?Y9Cz>;U6#qP6(krN`9El*eP%$JN6)5RCTsDC5RjyBct>(d$~W5Z_`Iu6-&C z-Bd~-vMsj0G1U}bs1>7bM;aJkH>^f?60wtjLpr8)d8--0RYJIgwpAm>CE;Ub#jnXJ z)?NQe-^~+l08?xLbR-=C&?si-TH>7A~27w(;qeKg^ zPDlJuyp^YYr(6^+=6&oiy>)Qh?4a|S>faZqmzRVv1AQRBa6g&kfPkOV7h%LR&_mee zkse|MF4+_VKE}mu7fW+(r75cldB`hU#?aJ=;)P3z-CL%VlM`Dt`H_5>e~0v;k1|&j z#3(0=)O$qRhaDYDOfk%M1qmLw#P}GQMj4O1$h%D$gJ~Cer7`>So=kB0=ymp50wp1o z7=2?zxcZIeZhpq`NdxN^7Kj}%A9X&d>b(ifo@ zAb-?}MswSk;|jA|PBi=6c0YaRE6a~%@zNVF^d^z!Sp_lIjRALTJM?2rP;Z~}5n&=E zAJ+B-@9$>W9bJw9+$1d$6QC zPCA;0>3^=hdmgwi`N75LKAGj~#LP+NzU9ug>I`DOEB1Q5k0{#D*cq=Z7mmC5#W#j_ zPOjHcDi~oQ9srU1A!WU>t7k8f`-V??4r6N_!v8e!UDJn5ZB89U84b>r-gpzH&U z*P3Eub`a~%w6}lk{P^$4|u1IeOvGREdVi=1fRM=D3-u!nUa$vc2dXq z4p#YWJnYCOx)Cj_Jtmd9(Z%Gdy*R9~Wc}%LkV(9US&g!yx{T z=R%3d0+sasBe^7@gZ0#~gICB)X+fLShNMVr-G;KVj5s)~ep&JkEf5V2nX9YafES`q z_#A2Ch#K-w%6(cWHp@NIq)|SXDZZx(->;iPngFCqMqhs34Ld(XZ(Y3jOBkI%0A!3{ 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 D0|+Ag diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca025c83..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf93008..adff685a 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,8 +210,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..c4bdd3ab 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/neoforge/build.gradle b/neoforge/build.gradle index cd74fd10..1a5e1213 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,8 +1,10 @@ plugins { - id "com.github.johnrengelman.shadow" version "8.1.1" + id "com.gradleup.shadow" version "9.3.0" } -archivesBaseName = rootProject.archives_base_name + "-" + rootProject.minecraft_version + "-neoforge" +base { + archivesName = rootProject.mod_id + "-" + rootProject.minecraft_version + "-neoforge" +} architectury { platformSetupLoomIde() From 312c8a8e18cc044f0ea2ca0084fdef60c302fe2b Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Mon, 2 Mar 2026 22:57:45 +0800 Subject: [PATCH 06/34] Allowed to disable the main feature when crawling (#198) --- .github/ISSUE_TEMPLATE/bug_report_cn.yml | 8 +-- .github/ISSUE_TEMPLATE/bug_report_en.yml | 6 +- .../realcamera/compat/DisableHelper.java | 3 +- .../realcamera/config/ConfigScreen.java | 59 ++++++++++--------- .../xtracr/realcamera/config/ModConfig.java | 5 ++ .../realcamera/gui/ModelViewScreen.java | 7 ++- .../assets/realcamera/lang/en_us.json | 11 ++-- .../assets/realcamera/lang/zh_cn.json | 9 ++- 8 files changed, 64 insertions(+), 44 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.yml b/.github/ISSUE_TEMPLATE/bug_report_cn.yml index 6816f0ff..02018ff9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_cn.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.yml @@ -25,11 +25,11 @@ body: required: true - type: input - id: minecraft-version + id: minecraft-version-loader attributes: - label: Minecraft版本 + label: Minecraft版本和加载器 description: | - 你所使用的Minecraft的版本. + 请填写游戏版本与所使用的加载器. 你可以在游戏主界面作下角或者游戏启动时的日志开头等地方找到. validations: @@ -76,4 +76,4 @@ body: 你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能
你可以日志上传到类似 https://paste.ubuntu.com/ 或者 https://mclo.gs/ 的网站并在此贴出链接
**请不要在此此处直接粘贴大段的日志文本!!** - placeholder: '把日志文件往这丢或者使用外部链接' + placeholder: '把日志文件往这丢或者使用外部链接' \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml index e7b93934..2be682d9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_en.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml @@ -25,11 +25,11 @@ body: required: true - type: input - id: minecraft-version + id: minecraft-version-loader attributes: - label: Minecraft Version + label: Minecraft Version and Loader description: | - The Minecraft version you are using. + Please specify the game version and your mod loader. You can find them at the corner of main menu or in the log while startup. validations: diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index d38b0d69..e0953e03 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -27,6 +27,7 @@ public class DisableHelper { MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSneaking() && player.isCrouching()); MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSwimming() && swimmingRecently(player, ConfigFile.config().getBindingSwimOutTick())); MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSwimming() && swimmingRecently(player, ConfigFile.config().getClassicSwimOutTick())); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenCrawling() && player.isVisuallyCrawling()); MAIN_FEATURE.registerOrInBinding(player -> { Item mainHand = player.getMainHandItem().getItem(); Item offHand = player.getOffhandItem().getItem(); @@ -133,4 +134,4 @@ public boolean disabled(Entity cameraEntity) { return ConfigFile.config().isClassic() ? predicateInClassic.test(player) : predicateInBinding.test(player); } } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 873926cb..632e5e4c 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -165,21 +165,6 @@ public static Screen create(Screen parent) { .setTooltip(LocUtil.CONFIG_TOOLTIP("renderStuckObjects")) .setSaveConsumer(b -> config.binding.renderStuckObjects = b) .build()); - binding.addEntry(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSneaking"), config.binding.disableWhenSneaking) - .setDefaultValue(false) - .setSaveConsumer(b -> config.binding.disableWhenSneaking = b) - .build()); - binding.addEntry(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSwimming"), config.binding.disableWhenSwimming) - .setDefaultValue(false) - .setSaveConsumer(b -> config.binding.disableWhenSwimming = b) - .build()); - binding.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("swimOutTick"), config.binding.swimOutTick) - .setDefaultValue(13) - .setMin(0) - .setMax(40) - .setTooltip(LocUtil.CONFIG_TOOLTIP("swimOutTick")) - .setSaveConsumer(i -> config.binding.swimOutTick = i) - .build()); binding.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("bindResultRetentionFrames"), config.binding.bindResultRetentionFrames) .setDefaultValue(2) .setMin(0) @@ -206,17 +191,37 @@ public static Screen create(Screen parent) { .setTooltip(LocUtil.CONFIG_TOOLTIP("rotationSmoothFactor")) .setSaveConsumer(d -> config.binding.rotationSmoothFactor = d) .build()); - binding.addEntry(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) - .setDefaultValue(List.of()) - .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) - .setSaveConsumer(l -> config.binding.disableMainFeatureItems = l) - .build()); - binding.addEntry(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableRenderItems"), config.binding.disableRenderItems) - .setDefaultValue(ModConfig.Binding.defaultDisableRenderItems) - .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) - .setSaveConsumer(l -> config.binding.disableRenderItems = l) - .build()); - + SubCategoryBuilder disableConfig = entryBuilder.startSubCategory(LocUtil.CONFIG_OPTION("disableConfig")); + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenCrawling"), config.binding.disableWhenCrawling) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenCrawling = b) + .build()); + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSneaking"), config.binding.disableWhenSneaking) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenSneaking = b) + .build()); + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSwimming"), config.binding.disableWhenSwimming) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenSwimming = b) + .build()); + disableConfig.add(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("swimOutTick"), config.binding.swimOutTick) + .setDefaultValue(13) + .setMin(0) + .setMax(40) + .setTooltip(LocUtil.CONFIG_TOOLTIP("swimOutTick")) + .setSaveConsumer(i -> config.binding.swimOutTick = i) + .build()); + disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) + .setDefaultValue(List.of()) + .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) + .setSaveConsumer(l -> config.binding.disableMainFeatureItems = l) + .build()); + disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableRenderItems"), config.binding.disableRenderItems) + .setDefaultValue(ModConfig.Binding.defaultDisableRenderItems) + .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) + .setSaveConsumer(l -> config.binding.disableRenderItems = l) + .build()); + binding.addEntry(disableConfig.build()); return builder.build(); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index 8a4e186e..da03938e 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -176,6 +176,10 @@ public boolean hideBindingFailureMessage() { return binding.hideFailureMessage; } + public boolean bindingDisableWhenCrawling() { + return binding.disableWhenCrawling; + } + public boolean bindingDisableWhenSneaking() { return binding.disableWhenSneaking; } @@ -291,6 +295,7 @@ public static class Binding { public boolean adjustOffset = true; public boolean hideFailureMessage = false; public boolean renderStuckObjects = true; + public boolean disableWhenCrawling = false; public boolean disableWhenSneaking = false; public boolean disableWhenSwimming = false; public int swimOutTick = 13; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index b5a21cb6..0d49c730 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -388,7 +388,10 @@ private void initRightWidgets() { for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { BindTarget target = i < fixedTargetCount ? fixedTargetList.get(i) : targetList.get(i - fixedTargetCount); String name = target.name(); - rows.addChild(createButton(LocUtil.literal(name), widgetWidth * 2 - 18, button -> loadBindTarget(target)), 3).setTooltip(Tooltip.create(LocUtil.literal(name))); + Button configButton = createButton(LocUtil.literal(name), widgetWidth * 2 - 18, button -> loadBindTarget(target)); + if (name.equals(RealCameraCore.currentTarget().name())) configButton.setTooltip(Tooltip.create(LocUtil.literal(name + "\n").append(LocUtil.MODEL_VIEW_WIDGET("currentConfig")))); + else configButton.setTooltip(Tooltip.create(LocUtil.literal(name))); + rows.addChild(configButton, 3); if (i < fixedTargetCount) continue; rows.addChild(new TexturedButton(48, 0, button -> { targetList.remove(target); @@ -931,4 +934,4 @@ public Category next() { return values()[(ordinal() + 1) % values().length]; } } -} +} \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index 0e3c127d..7fdb6d57 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -46,13 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Hide Binding Failure Message", "config.option.xtracr_realcamera.renderStuckObjects": "Render Stuck Objects", "config.option.xtracr_realcamera.rerenderModel": "Rerender Model", - "config.option.xtracr_realcamera.disableWhenSneaking": "Disable main feature when sneaking", - "config.option.xtracr_realcamera.disableWhenSwimming": "Disable main feature when swimming", - "config.option.xtracr_realcamera.swimOutTick": "Exiting swimming state delay (in ticks)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Bind Result Retention Frames", "config.option.xtracr_realcamera.displacementSmoothFactor": "Displacement Smooth Factor", "config.option.xtracr_realcamera.rotationSmoothFactor": "Rotation Smooth Factor", "config.option.xtracr_realcamera.activeConfigIndex": "Active Configuration Index", + "config.option.xtracr_realcamera.disableConfig": "Disable Config", + "config.option.xtracr_realcamera.disableWhenCrawling": "Disable main feature when crawling", + "config.option.xtracr_realcamera.disableWhenSneaking": "Disable main feature when sneaking", + "config.option.xtracr_realcamera.disableWhenSwimming": "Disable main feature when swimming", + "config.option.xtracr_realcamera.swimOutTick": "Exiting swimming state delay (in ticks)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Disable main feature when holding", "config.option.xtracr_realcamera.disableRenderItems": "Disable rendering when holding", "config.tooltip.xtracr_realcamera.isClassic": "Classic mode only makes simple changes to the position and rotation of camera", @@ -65,11 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "When pressing the adjustment key, adjust the offset or rotation of camera", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Arrows, bee stings and other objects that can be stuck in the player's body", "config.tooltip.xtracr_realcamera.rerenderModel": "Render the model again at the original rendering time to avoid some visual problems caused by rendering early", - "config.tooltip.xtracr_realcamera.swimOutTick": "The time before enabling main feature after exiting swimming state (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "For several frames after the binding failure, continue to use the previous successful binding result", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Smooth factor of camera displacement, the higher the value, the smoother the movement", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Smooth factor of camera rotation, the higher the value, the smoother the movement", "config.tooltip.xtracr_realcamera.activeConfigIndex": "Currently bound configuration index, 0 means allowing binding to any valid configuration", + "config.tooltip.xtracr_realcamera.swimOutTick": "The time before enabling main feature after exiting swimming state (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Three matching methods are supported:\n1. Wildcard `*` matching (e.g., `minecraft:*sword`)\n2. Tag matching (starts with `#`, e.g., `#minecraft:swords`)\n3. Direct item ID (e.g., `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Binding failed, please go to the %s screen and configure manually (Key: %s)", @@ -102,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Configs", "screen.widget.xtracr_realcamera.modelView_copy": "Copy", "screen.widget.xtracr_realcamera.modelView_paste": "Paste", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Current Config", "screen.tooltip.xtracr_realcamera.modelView_import": "Import the config from the clipboard", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s succeeded!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import failed: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 282edaa1..7e5c9f9f 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -46,13 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "隐藏绑定失败消息", "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物体", "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", - "config.option.xtracr_realcamera.disableWhenSneaking": "潜行时禁用主要功能", - "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", - "config.option.xtracr_realcamera.swimOutTick": "游泳状态退出延迟(单位:tick)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "绑定结果保留帧数", "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑系数", "config.option.xtracr_realcamera.rotationSmoothFactor": "旋转平滑系数", "config.option.xtracr_realcamera.activeConfigIndex": "当前配置索引", + "config.option.xtracr_realcamera.disableConfig": "禁用配置", + "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSneaking": "潜行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", + "config.option.xtracr_realcamera.swimOutTick": "游泳状态退出延迟(单位:tick)", "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...时禁用主要功能", "config.option.xtracr_realcamera.disableRenderItems": "在手持...时禁用渲染", "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", @@ -102,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "配置", "screen.widget.xtracr_realcamera.modelView_copy": "复制", "screen.widget.xtracr_realcamera.modelView_paste": "粘贴", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "当前配置", "screen.tooltip.xtracr_realcamera.modelView_import": "从剪贴板导入配置", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "导入失败:\n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "导入%s成功!", From 250109e90e0cae212351e983daebe8a6f8225cb4 Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Mon, 9 Mar 2026 18:23:31 +0800 Subject: [PATCH 07/34] Add delay to main feature disable logic during crawling (#199) --- .../realcamera/compat/DisableHelper.java | 14 ++++++------- .../realcamera/config/ConfigScreen.java | 20 +++++++++---------- .../xtracr/realcamera/config/ModConfig.java | 16 +++++++-------- .../assets/realcamera/lang/en_us.json | 6 +++--- .../assets/realcamera/lang/zh_cn.json | 8 ++++---- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index e0953e03..dd189ced 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -25,9 +25,9 @@ public class DisableHelper { static { MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSneaking() && player.isCrouching()); MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSneaking() && player.isCrouching()); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSwimming() && swimmingRecently(player, ConfigFile.config().getBindingSwimOutTick())); - MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSwimming() && swimmingRecently(player, ConfigFile.config().getClassicSwimOutTick())); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenCrawling() && player.isVisuallyCrawling()); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSwimming() && checkCondition(player, player.isSwimming(), ConfigFile.config().getBindingOutTick())); + MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSwimming() && checkCondition(player, player.isSwimming(), ConfigFile.config().getClassicOutTick())); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenCrawling() && checkCondition(player, player.isVisuallyCrawling(), ConfigFile.config().getBindingOutTick())); MAIN_FEATURE.registerOrInBinding(player -> { Item mainHand = player.getMainHandItem().getItem(); Item offHand = player.getOffhandItem().getItem(); @@ -46,14 +46,14 @@ public class DisableHelper { }); } - private static boolean swimmingRecently(Player player, int swimOutTick) { - if (player.isSwimming()) { + private static boolean checkCondition(Player player, boolean condition, int outTick) { + if (condition) { exitTick = player.tickCount; return true; } - if (exitTick > 0 && !player.isSwimming()) { + if (exitTick > 0) { int elapsedTicks = player.tickCount - exitTick; - if (elapsedTicks <= swimOutTick) { + if (elapsedTicks <= outTick) { return true; } exitTick = 0; diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 632e5e4c..5c5a5859 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -60,12 +60,12 @@ public static Screen create(Screen parent) { .setDefaultValue(false) .setSaveConsumer(b -> config.classic.disableWhenSwimming = b) .build()); - classic.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("swimOutTick"), config.classic.swimOutTick) + classic.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("outTick"), config.classic.outTick) .setDefaultValue(13) .setMin(0) .setMax(40) - .setTooltip(LocUtil.CONFIG_TOOLTIP("swimOutTick")) - .setSaveConsumer(i -> config.classic.swimOutTick = i) + .setTooltip(LocUtil.CONFIG_TOOLTIP("outTick")) + .setSaveConsumer(i -> config.classic.outTick = i) .build()); classic.addEntry(entryBuilder.startDoubleField(LocUtil.CONFIG_OPTION("scale"), config.classic.scale) .setDefaultValue(8.0) @@ -192,24 +192,24 @@ public static Screen create(Screen parent) { .setSaveConsumer(d -> config.binding.rotationSmoothFactor = d) .build()); SubCategoryBuilder disableConfig = entryBuilder.startSubCategory(LocUtil.CONFIG_OPTION("disableConfig")); - disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenCrawling"), config.binding.disableWhenCrawling) - .setDefaultValue(false) - .setSaveConsumer(b -> config.binding.disableWhenCrawling = b) - .build()); disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSneaking"), config.binding.disableWhenSneaking) .setDefaultValue(false) .setSaveConsumer(b -> config.binding.disableWhenSneaking = b) .build()); + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenCrawling"), config.binding.disableWhenCrawling) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenCrawling = b) + .build()); disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSwimming"), config.binding.disableWhenSwimming) .setDefaultValue(false) .setSaveConsumer(b -> config.binding.disableWhenSwimming = b) .build()); - disableConfig.add(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("swimOutTick"), config.binding.swimOutTick) + disableConfig.add(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("outTick"), config.binding.outTick) .setDefaultValue(13) .setMin(0) .setMax(40) - .setTooltip(LocUtil.CONFIG_TOOLTIP("swimOutTick")) - .setSaveConsumer(i -> config.binding.swimOutTick = i) + .setTooltip(LocUtil.CONFIG_TOOLTIP("outTick")) + .setSaveConsumer(i -> config.binding.outTick = i) .build()); disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) .setDefaultValue(List.of()) diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index da03938e..c6b2f490 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -119,8 +119,8 @@ public boolean classicDisableWhenSwimming() { return classic.disableWhenSwimming; } - public int getClassicSwimOutTick() { - return classic.swimOutTick; + public int getClassicOutTick() { + return classic.outTick; } public double getClassicX() { @@ -188,8 +188,8 @@ public boolean bindingDisableWhenSwimming() { return binding.disableWhenSwimming; } - public int getBindingSwimOutTick() { - return binding.swimOutTick; + public int getBindingOutTick() { + return binding.outTick; } public int getBindResultRetentionFrames() { @@ -250,7 +250,7 @@ public static class Classic { public AdjustMode adjustMode = AdjustMode.CAMERA; public boolean disableWhenSneaking = false; public boolean disableWhenSwimming = false; - public int swimOutTick = 13; + public int outTick = 13; public double scale = 8.0; public double cameraX = -0.5; public double cameraY = 0.04; @@ -264,7 +264,7 @@ public static class Classic { private void clamp() { if (adjustMode == null) adjustMode = AdjustMode.CAMERA; - swimOutTick = Mth.clamp(swimOutTick, 0, 40); + outTick = Mth.clamp(outTick, 0, 40); scale = Mth.clamp(scale, 0.0, 64.0); cameraX = Mth.clamp(cameraX, MIN_OFFSET_D, MAX_OFFSET_D); cameraY = Mth.clamp(cameraY, MIN_OFFSET_D, MAX_OFFSET_D); @@ -298,7 +298,7 @@ public static class Binding { public boolean disableWhenCrawling = false; public boolean disableWhenSneaking = false; public boolean disableWhenSwimming = false; - public int swimOutTick = 13; + public int outTick = 13; public int bindResultRetentionFrames = 2; public int activeConfigIndex = 0; public double displacementSmoothFactor = 0.4; @@ -314,7 +314,7 @@ private void clamp() { } catch (Exception e) { screenModifierKey = InputConstants.Type.KEYSYM.getOrCreate(InputConstants.KEY_LALT).getName(); } - swimOutTick = Mth.clamp(swimOutTick, 0, 40); + outTick = Mth.clamp(outTick, 0, 40); bindResultRetentionFrames = Math.max(bindResultRetentionFrames, 0); activeConfigIndex = Math.max(activeConfigIndex, 0); displacementSmoothFactor = Mth.clamp(displacementSmoothFactor, 0.0, 1.0); diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index 7fdb6d57..1b9be4a3 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -51,10 +51,10 @@ "config.option.xtracr_realcamera.rotationSmoothFactor": "Rotation Smooth Factor", "config.option.xtracr_realcamera.activeConfigIndex": "Active Configuration Index", "config.option.xtracr_realcamera.disableConfig": "Disable Config", - "config.option.xtracr_realcamera.disableWhenCrawling": "Disable main feature when crawling", "config.option.xtracr_realcamera.disableWhenSneaking": "Disable main feature when sneaking", + "config.option.xtracr_realcamera.disableWhenCrawling": "Disable main feature when crawling", "config.option.xtracr_realcamera.disableWhenSwimming": "Disable main feature when swimming", - "config.option.xtracr_realcamera.swimOutTick": "Exiting swimming state delay (in ticks)", + "config.option.xtracr_realcamera.outTick": "Restriction exit delay (in ticks)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Disable main feature when holding", "config.option.xtracr_realcamera.disableRenderItems": "Disable rendering when holding", "config.tooltip.xtracr_realcamera.isClassic": "Classic mode only makes simple changes to the position and rotation of camera", @@ -71,7 +71,7 @@ "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Smooth factor of camera displacement, the higher the value, the smoother the movement", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Smooth factor of camera rotation, the higher the value, the smoother the movement", "config.tooltip.xtracr_realcamera.activeConfigIndex": "Currently bound configuration index, 0 means allowing binding to any valid configuration", - "config.tooltip.xtracr_realcamera.swimOutTick": "The time before enabling main feature after exiting swimming state (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.outTick": "The time before re-enabling main feature after exiting restricted states (e.g., swimming, crawling) (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Three matching methods are supported:\n1. Wildcard `*` matching (e.g., `minecraft:*sword`)\n2. Tag matching (starts with `#`, e.g., `#minecraft:swords`)\n3. Direct item ID (e.g., `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Binding failed, please go to the %s screen and configure manually (Key: %s)", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 7e5c9f9f..d81515cb 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -51,10 +51,10 @@ "config.option.xtracr_realcamera.rotationSmoothFactor": "旋转平滑系数", "config.option.xtracr_realcamera.activeConfigIndex": "当前配置索引", "config.option.xtracr_realcamera.disableConfig": "禁用配置", - "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", "config.option.xtracr_realcamera.disableWhenSneaking": "潜行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", - "config.option.xtracr_realcamera.swimOutTick": "游泳状态退出延迟(单位:tick)", + "config.option.xtracr_realcamera.outTick": "禁用状态退出延迟(单位:tick)", "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...时禁用主要功能", "config.option.xtracr_realcamera.disableRenderItems": "在手持...时禁用渲染", "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", @@ -67,11 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "当前按下调整键时是调整摄像头的偏移还是旋转", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它会卡在玩家身体里的物体", "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染时机重新渲染模型,以避免一些因提前渲染导致的视觉问题", - "config.tooltip.xtracr_realcamera.swimOutTick": "玩家停止游泳状态后重启主要功能的时间(1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在绑定失败后的数帧内,沿用上个成功的绑定结果", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相机位移平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相机旋转平滑系数,值越大越平滑", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "当前绑定的配置索引,0表示允许绑定任何有效配置", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "当前绑定的配置索引,0表示允许绑定任何有效配置", + "config.tooltip.xtracr_realcamera.outTick": "玩家停止某些状态(如游泳、爬行)后重启主要功能的时间(1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三种匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 标签匹配以`#`开头(如`#minecraft:swords`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: 绑定失败,请前往%s界面手动设置(键位:%s)", From 192611abd1cff209afa9633a165b820e4bf79d8d Mon Sep 17 00:00:00 2001 From: dqsk_zze <1935752350@qq.com> Date: Sun, 15 Mar 2026 00:05:09 +0800 Subject: [PATCH 08/34] languages updated (#201) Signed-off-by: dqsk_zze <1935752350@qq.com> --- .../assets/realcamera/lang/be_by.json | 20 ++++++++---- .../assets/realcamera/lang/es_es.json | 16 +++++++--- .../assets/realcamera/lang/fr_fr.json | 16 +++++++--- .../assets/realcamera/lang/ja_jp.json | 16 +++++++--- .../assets/realcamera/lang/ko_kr.json | 16 +++++++--- .../resources/assets/realcamera/lang/lzh.json | 32 ++++++++++++------- .../assets/realcamera/lang/pl_pl.json | 16 +++++++--- .../assets/realcamera/lang/pt_br.json | 16 +++++++--- .../assets/realcamera/lang/pt_pt.json | 16 +++++++--- .../assets/realcamera/lang/ru_ru.json | 16 +++++++--- .../assets/realcamera/lang/tr_tr.json | 16 +++++++--- .../assets/realcamera/lang/uk_ua.json | 16 +++++++--- .../assets/realcamera/lang/zh_hk.json | 22 +++++++++---- .../assets/realcamera/lang/zh_tw.json | 22 +++++++++---- 14 files changed, 184 insertions(+), 72 deletions(-) diff --git a/common/src/main/resources/assets/realcamera/lang/be_by.json b/common/src/main/resources/assets/realcamera/lang/be_by.json index 66e64585..283e40c5 100644 --- a/common/src/main/resources/assets/realcamera/lang/be_by.json +++ b/common/src/main/resources/assets/realcamera/lang/be_by.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Адкрыць экран прагляду мадэлі", "key.xtracr_realcamera.togglePerspective": "Уключыць/Выключыць", + "key.xtracr_realcamera.activeConfigIndexPREV": "Пераключыцца на папярэднюю канфігурацыю", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Пераключыцца на наступную канфігурацыю", + "key.xtracr_realcamera.activeConfigIndexRESET": "Скінуць індэкс канфігурацыі", "key.xtracr_realcamera.toggleAdjustMode": "Пераключыць рэжым налады", "key.xtracr_realcamera.toggleCameraMode": "Пераключыць рэжым камеры", "key.xtracr_realcamera.adjustUP": "Наладзіць УВЕРХ", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Хаваць паведамленні пра няўдалую прывязку", "config.option.xtracr_realcamera.renderStuckObjects": "Адлюстроўваць застряўшыя аб'екты", "config.option.xtracr_realcamera.rerenderModel": "Перамаляваць мадэль", - "config.option.xtracr_realcamera.disableWhenSneaking": "Адключыць асноўную функцыю пры крадзяжы", - "config.option.xtracr_realcamera.disableWhenSwimming": "Адключыць асноўную функцыю пры плаванні", - "config.option.xtracr_realcamera.swimOutTick": "Затрымка выхаду з стану плавання (у тіках)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадры захавання выніку прывязкі", "config.option.xtracr_realcamera.displacementSmoothFactor": "Каэфіцыент згладжвання зруху", "config.option.xtracr_realcamera.rotationSmoothFactor": "Каэфіцыент згладжвання павароту", + "config.option.xtracr_realcamera.activeConfigIndex": "Актыўны індэкс канфігурацыі", + "config.option.xtracr_realcamera.disableConfig": "Адключыць Канфігурацыю", + "config.option.xtracr_realcamera.disableWhenSneaking": "Адключыць асноўную функцыю пры крадзяжы", + "config.option.xtracr_realcamera.disableWhenCrawling": "Адключыць асноўную функцыю пры поўзанні", + "config.option.xtracr_realcamera.disableWhenSwimming": "Адключыць асноўную функцыю пры плаванні", + "config.option.xtracr_realcamera.outTick": "Затрымка выхаду з стану плавання (у тіках)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Адключыць асноўную функцыю пры трыманні...", "config.option.xtracr_realcamera.disableRenderItems": "Адключыць адлюстраванне пры трыманні...", "config.tooltip.xtracr_realcamera.isClassic": "Класічны рэжым уносіць толькі простыя змены ў становішча і паварот камеры", @@ -57,14 +63,15 @@ "config.tooltip.xtracr_realcamera.adjustStep": "Даўжыня або 1/100 вугла налады за крок", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Вызначае, што наладжваць пры націсканні клавішы налады", "config.tooltip.xtracr_realcamera.scale": "Кантраляваць памер зрухаў", - "config.tooltip.xtracr_realcamera.legacyBindingMode": "Выкарыстоўвае рэжым прывязкі састарэлай версіі (v0.5), падтрымліваюцца толькі стандартныя мадэлі і дзеянні на іх аснове\nПасля ўключэння ўласцівасці можна наладзіць у раздзеле 'LEGACY_MODE' экрана %s", + "config.tooltip.xtracr_realcamera.legacyBindingMode": "Выкарыстоўвае рэжым прывязкі састарэлай версіі (v0.5), падтрымліваюцца толькі стандартныя мадэлі і дзеянні на іх аснове\nПасля ўключэння ўласцівасціў выладывае дакладней прывязацца да мэтавай пазіцыі", "config.tooltip.xtracr_realcamera.adjustOffset": "Пры націсканні клавішы налады, рэгуляваць зрух або паварот камеры", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Стрэлы, джалы пчол і іншыя аб'екты, якія могуць застряць у целе гульца", "config.tooltip.xtracr_realcamera.rerenderModel": "Перамалёўваць мадэль у зыходны час рэндэрынгу, каб пазбегнуць візуальных праблем", - "config.tooltip.xtracr_realcamera.swimOutTick": "Затрымка ўключэння асноўнай функцыі пасля выхаду з стану плавання (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "На працягу некалькіх кадраў пасля няўдалай прывязкі працягваць выкарыстоўваць папярэдні паспяховы вынік прывязкі", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Каэфіцыент згладжвання зруху камеры, чым вышэй значэнне, тым больш плаўным будзе рух", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Каэфіцыент згладжвання павароту камеры, чым вышэй значэнне, тым больш плаўным будзе рух", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Текущий индекс привязанной конфигурации, 0 означает разрешение привязки к любой допустимой конфигурации", + "config.tooltip.xtracr_realcamera.outTick": "Затрымка ўключэння асноўнай функцыі пасля выхаду з стану плавання (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Падтрымліваюцца тры метады супадзення:\n1. Сімвал падстаноўкі `*` (напрыклад, `minecraft:*sword`)\n2. Супадзенне па тэгах (пачынаецца з `#`, напрыклад, `#minecraft:swords`)\n3. Прамы ID прадмета (напрыклад, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Памылка прывязкі, калі ласка, перайдзіце на экран %s і наладзьце ўручную (ключ: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Канфігурацыі", "screen.widget.xtracr_realcamera.modelView_copy": "Капіяваць", "screen.widget.xtracr_realcamera.modelView_paste": "Уставіць", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Бягучая Канфігурацыя", "screen.tooltip.xtracr_realcamera.modelView_import": "Імпартаваць канфіг з буфера абмену", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпарт %s паспяховы!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Імпарт не ўдаўся: \n%s", @@ -111,7 +119,7 @@ "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Выдаліць абраную прастакутную вобласць\n(Ці выкарыстайце клавішу Delete)", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Калі адключана, адноснае становішча камеры да мадэлі не мяняецца, але адпаведныя атрыбуты камеры не будуць зменены гэтым модам", "screen.tooltip.xtracr_realcamera.modelView_scale": "Маштаб, які кіруе памерам зрухаў", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскасці, адлегласць ад усіх вяршынь да экрана ў якіх меншая за гэта значэнне, не будуць адлюстроўвацца", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскасці, адлеглась ад усіх вяршынь да экрана ў якіх меншая за гэта значэнне, не будуць адлюстроўвацца", "screen.tooltip.xtracr_realcamera.modelView_priority": "Прыярытэт пры прывязцы, чым больш значэнне, тым вышэй прыярытэт і размяшчэнне справей у спісе", "screen.tooltip.xtracr_realcamera.modelView_targetName": "Назва канфігурацыі", "screen.tooltip.xtracr_realcamera.modelView_disable": "Налады адключэння\nГлабальныя налады адключэння знаходзяцца на экране канфігурацыі", diff --git a/common/src/main/resources/assets/realcamera/lang/es_es.json b/common/src/main/resources/assets/realcamera/lang/es_es.json index 17439863..580e31fa 100644 --- a/common/src/main/resources/assets/realcamera/lang/es_es.json +++ b/common/src/main/resources/assets/realcamera/lang/es_es.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Abrir Pantalla de Vista de Modelo", "key.xtracr_realcamera.togglePerspective": "Activar/Desactivar", + "key.xtracr_realcamera.activeConfigIndexPREV": "Cambiar a la configuración anterior", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Cambiar a la siguiente configuración", + "key.xtracr_realcamera.activeConfigIndexRESET": "Restablecer índice de configuración", "key.xtracr_realcamera.toggleAdjustMode": "Cambiar Modo de Ajuste", "key.xtracr_realcamera.toggleCameraMode": "Cambiar Modo de Cámara", "key.xtracr_realcamera.adjustUP": "Ajustar ARRIBA", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensajes de fallo de vinculación", "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Atascados", "config.option.xtracr_realcamera.rerenderModel": "Re-renderizar Modelo", - "config.option.xtracr_realcamera.disableWhenSneaking": "Desactivar función principal al agacharse", - "config.option.xtracr_realcamera.disableWhenSwimming": "Desactivar función principal al nadar", - "config.option.xtracr_realcamera.swimOutTick": "Retraso al salir del estado de natación (en ticks)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Marcos de retención de resultado de vinculación", "config.option.xtracr_realcamera.displacementSmoothFactor": "Factor de suavizado de desplazamiento", "config.option.xtracr_realcamera.rotationSmoothFactor": "Factor de suavizado de rotación", + "config.option.xtracr_realcamera.activeConfigIndex": "Índice de configuración activa", + "config.option.xtracr_realcamera.disableConfig": "Configuración Desactivada", + "config.option.xtracr_realcamera.disableWhenSneaking": "Desactivar función principal al agacharse", + "config.option.xtracr_realcamera.disableWhenCrawling": "Desactivar función principal al gatear", + "config.option.xtracr_realcamera.disableWhenSwimming": "Desactivar función principal al nadar", + "config.option.xtracr_realcamera.outTick": "Retraso al salir del estado de natación (en ticks)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Desactivar función principal al sostener...", "config.option.xtracr_realcamera.disableRenderItems": "Desactivar renderizado al sostener...", "config.tooltip.xtracr_realcamera.isClassic": "El modo clásico solo hace cambios simples a la posición y rotación de la cámara", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "Al presionar la tecla de ajuste, ajusta el desplazamiento o rotación de la cámara", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flechas, picaduras de abeja y otros objetos que pueden quedar atascados en el cuerpo del jugador", "config.tooltip.xtracr_realcamera.rerenderModel": "Renderizar el modelo nuevamente en el momento original de renderizado para evitar problemas visuales causados por renderizado temprano", - "config.tooltip.xtracr_realcamera.swimOutTick": "Tiempo antes de activar la función principal después de salir del estado de natación (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Durante varios fotogramas después del fallo de vinculación, continuar utilizando el resultado de vinculación exitoso anterior", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Factor de suavizado del desplazamiento de la cámara, cuanto mayor sea el valor, más suave será el movimiento", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Factor de suavizado de la rotación de la cámara, cuanto mayor sea el valor, más suave será el movimiento", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuración actualmente vinculada, 0 significa permitir la vinculación a cualquier configuración válida", + "config.tooltip.xtracr_realcamera.outTick": "Tiempo antes de activar la función principal después de salir del estado de natación (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Se admiten tres métodos de coincidencia:\n1. Coincidencia con comodín `*` (por ejemplo, `minecraft:*sword`)\n2. Coincidencia de etiquetas (comienza con `#`, por ejemplo, `#minecraft:swords`)\n3. ID de objeto directo (por ejemplo, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Vinculación fallida, por favor vaya a la pantalla %s y configure manualmente (tecla: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Configuraciones", "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", "screen.widget.xtracr_realcamera.modelView_paste": "Pegar", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuración Actual", "screen.tooltip.xtracr_realcamera.modelView_import": "Importar la configuración desde el portapapeles", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "¡Importación %s exitosa!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Importación fallida: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/fr_fr.json b/common/src/main/resources/assets/realcamera/lang/fr_fr.json index 51c25c84..581ef6b6 100644 --- a/common/src/main/resources/assets/realcamera/lang/fr_fr.json +++ b/common/src/main/resources/assets/realcamera/lang/fr_fr.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Ouvrir l'écran de visualisation du modèle", "key.xtracr_realcamera.togglePerspective": "Activer/Désactiver", + "key.xtracr_realcamera.activeConfigIndexPREV": "Passer à la configuration précédente", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Passer à la configuration suivante", + "key.xtracr_realcamera.activeConfigIndexRESET": "Réinitialiser l'index de configuration", "key.xtracr_realcamera.toggleAdjustMode": "Basculer le mode d'ajustement", "key.xtracr_realcamera.toggleCameraMode": "Basculer le mode caméra", "key.xtracr_realcamera.adjustUP": "Ajuster vers le HAUT", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Masquer les messages d'échec de liaison", "config.option.xtracr_realcamera.renderStuckObjects": "Afficher les Objets Coincés", "config.option.xtracr_realcamera.rerenderModel": "Réafficher le Modèle", - "config.option.xtracr_realcamera.disableWhenSneaking": "Désactiver la fonctionnalité principale en se faufilant", - "config.option.xtracr_realcamera.disableWhenSwimming": "Désactiver la fonctionnalité principale en nageant", - "config.option.xtracr_realcamera.swimOutTick": "Délai de sortie de l'état de nage (en ticks)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Images de rétention des résultats de liaison", "config.option.xtracr_realcamera.displacementSmoothFactor": "Facteur de lissage du déplacement", "config.option.xtracr_realcamera.rotationSmoothFactor": "Facteur de lissage de la rotation", + "config.option.xtracr_realcamera.activeConfigIndex": "Index de configuration actif", + "config.option.xtracr_realcamera.disableConfig": "Config Désactivée", + "config.option.xtracr_realcamera.disableWhenSneaking": "Désactiver la fonctionnalité principale en se faufilant", + "config.option.xtracr_realcamera.disableWhenCrawling": "Désactiver la fonctionnalité principale en rampant", + "config.option.xtracr_realcamera.disableWhenSwimming": "Désactiver la fonctionnalité principale en nageant", + "config.option.xtracr_realcamera.outTick": "Délai de sortie de l'état de nage (en ticks)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Désactiver la fonctionnalité principale en tenant...", "config.option.xtracr_realcamera.disableRenderItems": "Désactiver le rendu en tenant...", "config.tooltip.xtracr_realcamera.isClassic": "Le mode classique ne fait que des changements simples à la position et à la rotation de la caméra", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "Lors de l'appui sur la touche d'ajustement, ajuster le décalage ou la rotation de la caméra", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flèches, piqûres d'abeille et autres objets pouvant être coincés dans le corps du joueur", "config.tooltip.xtracr_realcamera.rerenderModel": "Afficher à nouveau le modèle au moment du rendu original pour éviter certains problèmes visuels causés par un rendu précoce", - "config.tooltip.xtracr_realcamera.swimOutTick": "Le délai d'activation de la fonction principale après la sortie de l'état de nage (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Pendant plusieurs images après l'échec de la liaison, continuer à utiliser le résultat de liaison réussi précédent", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Facteur de lissage du déplacement de la caméra, plus la valeur est élevée, plus le mouvement est fluide", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Facteur de lissage de la rotation de la caméra, plus la valeur est élevée, plus le mouvement est fluide", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Index de configuration actuellement lié, 0 signifie autoriser la liaison à toute configuration valide", + "config.tooltip.xtracr_realcamera.outTick": "Le délai d'activation de la fonction principale après la sortie de l'état de nage (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Trois méthodes de correspondance sont prises en charge :\n1. Correspondance avec joker `*` (par exemple, `minecraft:*sword`)\n2. Correspondance d'étiquette (commence par `#`, par exemple, `#minecraft:swords`)\n3. ID d'objet direct (par exemple, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Échec de la liaison, veuillez aller à l'écran %s et configurer manuellement (touche: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Configurations", "screen.widget.xtracr_realcamera.modelView_copy": "Copier", "screen.widget.xtracr_realcamera.modelView_paste": "Coller", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Config Actuelle", "screen.tooltip.xtracr_realcamera.modelView_import": "Importer la configuration depuis le presse-papiers", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importation %s réussie !", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Échec de l'importation : \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/ja_jp.json b/common/src/main/resources/assets/realcamera/lang/ja_jp.json index 0e430c04..83d42b51 100644 --- a/common/src/main/resources/assets/realcamera/lang/ja_jp.json +++ b/common/src/main/resources/assets/realcamera/lang/ja_jp.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "モデルビュー画面を開く", "key.xtracr_realcamera.togglePerspective": "オン/オフ", + "key.xtracr_realcamera.activeConfigIndexPREV": "前の設定に切り替え", + "key.xtracr_realcamera.activeConfigIndexNEXT": "次の設定に切り替え", + "key.xtracr_realcamera.activeConfigIndexRESET": "設定インデックスをリセット", "key.xtracr_realcamera.toggleAdjustMode": "調整モードを切り替え", "key.xtracr_realcamera.toggleCameraMode": "カメラモードを切り替え", "key.xtracr_realcamera.adjustUP": "上に調整", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "バインディング失敗メッセージを非表示", "config.option.xtracr_realcamera.renderStuckObjects": "体に刺さったオブジェクトをレンダリング", "config.option.xtracr_realcamera.rerenderModel": "モデルを再レンダリング", - "config.option.xtracr_realcamera.disableWhenSneaking": "スニーク時にメイン機能を無効化", - "config.option.xtracr_realcamera.disableWhenSwimming": "泳いでいる時にメイン機能を無効化", - "config.option.xtracr_realcamera.swimOutTick": "泳ぎ状態退出遅延(単位:TICK)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "バインディング結果保持フレーム数", "config.option.xtracr_realcamera.displacementSmoothFactor": "変位平滑化係数", "config.option.xtracr_realcamera.rotationSmoothFactor": "回転平滑化係数", + "config.option.xtracr_realcamera.activeConfigIndex": "現在の設定インデックス", + "config.option.xtracr_realcamera.disableConfig": "無効設定", + "config.option.xtracr_realcamera.disableWhenSneaking": "スニーク時にメイン機能を無効化", + "config.option.xtracr_realcamera.disableWhenCrawling": "這行時にメイン機能を無効化", + "config.option.xtracr_realcamera.disableWhenSwimming": "泳いでいる時にメイン機能を無効化", + "config.option.xtracr_realcamera.outTick": "無効状態退出遅延(単位:TICK)", "config.option.xtracr_realcamera.disableMainFeatureItems": "...を持っている時にメイン機能を無効化", "config.option.xtracr_realcamera.disableRenderItems": "...を持っている時にレンダリングを無効化", "config.tooltip.xtracr_realcamera.isClassic": "クラシックモードではカメラの位置と回転に簡単な変更のみを行います", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "現在の調整キーでカメラのオフセットまたは回転を調整", "config.tooltip.xtracr_realcamera.renderStuckObjects": "矢、蜂の針などプレイヤーの体に刺さるオブジェクト", "config.tooltip.xtracr_realcamera.rerenderModel": "元のレンダリングタイミングでモデルを再レンダリングし、早期レンダリングによる視覚的問題を回避", - "config.tooltip.xtracr_realcamera.swimOutTick": "プレイヤーが泳ぎ状態を停止した後、主機能を再開するまでの時間(1 tick = 0.05秒)", + "config.tooltip.xtracr_realcamera.outTick": "プレイヤーが特定の状態を停止した後、主機能を再開するまでの時間(1 tick = 0.05秒)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "バインディング失敗後の数フレーム間、前回成功したバインディング結果を継続使用", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "カメラ変位平滑化係数、値が大きいほどスムーズ", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "カメラ回転平滑化係数、値が大きいほどスムーズ", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "現在バインドされている設定のインデックス、0は有効な設定をバインド可能", "config.tooltip.xtracr_realcamera.disableRenderItems": "3つのマッチング方法をサポート:\n1. ワイルドカード`*`マッチング(例: `minecraft:*sword`)\n2. タグマッチング(`#`で始まる、例: `#minecraft:swords`)\n3. 直接アイテムID(例: `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: バインディングに失敗しました。%s画面で手動設定してください(キー: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "設定", "screen.widget.xtracr_realcamera.modelView_copy": "コピー", "screen.widget.xtracr_realcamera.modelView_paste": "貼り付け", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "現在の設定", "screen.tooltip.xtracr_realcamera.modelView_import": "クリップボードから設定をインポート", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%sのインポートに成功しました!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "インポートに失敗しました: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/ko_kr.json b/common/src/main/resources/assets/realcamera/lang/ko_kr.json index c629c5a3..a7b1587e 100644 --- a/common/src/main/resources/assets/realcamera/lang/ko_kr.json +++ b/common/src/main/resources/assets/realcamera/lang/ko_kr.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "모델 뷰 화면 열기", "key.xtracr_realcamera.togglePerspective": "활성화/비활성화", + "key.xtracr_realcamera.activeConfigIndexPREV": "이전 설정으로 전환", + "key.xtracr_realcamera.activeConfigIndexNEXT": "다음 설정으로 전환", + "key.xtracr_realcamera.activeConfigIndexRESET": "설정 인덱스 초기화", "key.xtracr_realcamera.toggleAdjustMode": "조정 모드 전환", "key.xtracr_realcamera.toggleCameraMode": "카메라 모드 전환", "key.xtracr_realcamera.adjustUP": "위로 조정", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "바인딩 실패 메시지 숨기기", "config.option.xtracr_realcamera.renderStuckObjects": "박힌 물체 렌더링", "config.option.xtracr_realcamera.rerenderModel": "모델 재렌더링", - "config.option.xtracr_realcamera.disableWhenSneaking": "숨어 있을 때 주요 기능 비활성화", - "config.option.xtracr_realcamera.disableWhenSwimming": "수영할 때 주요 기능 비활성화", - "config.option.xtracr_realcamera.swimOutTick": "수영 상태 종료 지연 (틱 단위)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "바인딩 결과 유지 프레임", "config.option.xtracr_realcamera.displacementSmoothFactor": "변위 평활화 계수", "config.option.xtracr_realcamera.rotationSmoothFactor": "회전 평활화 계수", + "config.option.xtracr_realcamera.activeConfigIndex": "현재 설정 인덱스", + "config.option.xtracr_realcamera.disableConfig": "비활성화 설정", + "config.option.xtracr_realcamera.disableWhenSneaking": "숨어 있을 때 주요 기능 비활성화", + "config.option.xtracr_realcamera.disableWhenCrawling": "기어다닐 때 주요 기능 비활성화", + "config.option.xtracr_realcamera.disableWhenSwimming": "수영할 때 주요 기능 비활성화", + "config.option.xtracr_realcamera.outTick": "비활성화 상태 종료 지연 (틱 단위)", "config.option.xtracr_realcamera.disableMainFeatureItems": "...을(를) 들고 있을 때 주요 기능 비활성화", "config.option.xtracr_realcamera.disableRenderItems": "...을(를) 들고 있을 때 렌더링 비활성화", "config.tooltip.xtracr_realcamera.isClassic": "클래식 모드는 카메라의 위치와 회전에 간단한 변경만 적용합니다", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "조정 키 누를 때 카메라 오프셋 또는 회전 조정", "config.tooltip.xtracr_realcamera.renderStuckObjects": "화살, 벌 침 등 플레이어 몸에 박힐 수 있는 물체들", "config.tooltip.xtracr_realcamera.rerenderModel": "원본 렌더링 시간에 모델을 다시 렌더링하여 조기 렌더링으로 인한 시각적 문제 방지", - "config.tooltip.xtracr_realcamera.swimOutTick": "수영 상태 종료 후 주요 기능 재활성화까지의 시간 (1 틱 = 0.05초)", + "config.tooltip.xtracr_realcamera.outTick": "비활성화 상태 종료 후 주요 기능 재활성화까지의 시간 (1 틱 = 0.05초)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "바인딩 실패 후 몇 프레임 동안 이전 성공한 바인딩 결과 사용 유지", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "카메라 변위 평활화 계수, 값이 클수록 이동이 부드러워집니다", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "카메라 회전 평활화 계수, 값이 클수록 이동이 부드러워집니다", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "현재 바인딩된 설정의 인덱스, 0은 유효한 설정을 바인딩할 수 있음을 의미", "config.tooltip.xtracr_realcamera.disableRenderItems": "세 가지 매칭 방식 지원:\n1. 와일드카드 `*` 매칭 (예: `minecraft:*sword`)\n2. 태그 매칭 (`#`으로 시작, 예: `#minecraft:swords`)\n3. 직접 아이템 ID (예: `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: 바인딩 실패, %s 화면에서 수동으로 설정하세요 (키: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "설정", "screen.widget.xtracr_realcamera.modelView_copy": "복사", "screen.widget.xtracr_realcamera.modelView_paste": "붙여넣기", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "현재 설정", "screen.tooltip.xtracr_realcamera.modelView_import": "클립보드에서 설정 가져오기", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s 가져오기 성공!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "가져오기 실패: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/lzh.json b/common/src/main/resources/assets/realcamera/lang/lzh.json index a807ab4c..3481b108 100644 --- a/common/src/main/resources/assets/realcamera/lang/lzh.json +++ b/common/src/main/resources/assets/realcamera/lang/lzh.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "啟模型觀象之窗", "key.xtracr_realcamera.togglePerspective": "開/闔", + "key.xtracr_realcamera.activeConfigIndexPREV": "切上配", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切下配", + "key.xtracr_realcamera.activeConfigIndexRESET": "改配之引", "key.xtracr_realcamera.toggleAdjustMode": "易調校之法", "key.xtracr_realcamera.toggleCameraMode": "易鏡觀之道", "key.xtracr_realcamera.adjustUP": "上移", @@ -21,8 +24,8 @@ "config.tooltip.xtracr_realcamera.classicOffset": "鏡觀相對樞軸之移值", "config.tooltip.xtracr_realcamera.classicOffset_n": "註: 戯者之前、上、左分別為X、Y、Z軸", "config.tooltip.xtracr_realcamera.centerOffset": "樞軸相對首部之移值", - "config.tooltip.xtracr_realcamera.cameraRotation": "額外之鏡觀旋轉角度", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "註: 俯仰、偏航、翻滾乃以左、上、前為軸之旋轉", + "config.tooltip.xtracr_realcamera.cameraRotation": "額外之鏡觀轉角度", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "註: 俯仰、偏航、翻滾乃以左、上、前為軸之轉", "config.option.xtracr_realcamera.enabled": "啟其能", "config.option.xtracr_realcamera.isClassic": "古法", @@ -41,14 +44,17 @@ "config.option.xtracr_realcamera.legacyBindingMode": "古版系定之法", "config.option.xtracr_realcamera.adjustOffset": "調鏡觀移", "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱系定敗之訊", - "config.option.xtracr_realcamera.renderStuckObjects": "顯附身之物", + "config.option.xtracr_realcamera.renderStuckObjects": "示附身之物", "config.option.xtracr_realcamera.rerenderModel": "重顯其形", - "config.option.xtracr_realcamera.disableWhenSneaking": "潛伏時禁其能", - "config.option.xtracr_realcamera.disableWhenSwimming": "游水時禁其能", - "config.option.xtracr_realcamera.swimOutTick": "出游水之延(單位:tick)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "系定果存之幀數", "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑之係", "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑之係", + "config.option.xtracr_realcamera.activeConfigIndex": "現綁配之引", + "config.option.xtracr_realcamera.disableConfig": "禁配", + "config.option.xtracr_realcamera.disableWhenSneaking": "潛伏時禁其能", + "config.option.xtracr_realcamera.disableWhenCrawling": "爬攀時禁其能", + "config.option.xtracr_realcamera.disableWhenSwimming": "游水時禁其能", + "config.option.xtracr_realcamera.outTick": "出禁之延(單位:tick)", "config.option.xtracr_realcamera.disableMainFeatureItems": "持...時禁其能", "config.option.xtracr_realcamera.disableRenderItems": "持...時禁其顯", "config.tooltip.xtracr_realcamera.isClassic": "古法唯簡調鏡觀之位與旋", @@ -56,18 +62,19 @@ "config.tooltip.xtracr_realcamera.renderModel": "第一人稱顯戯者之形", "config.tooltip.xtracr_realcamera.adjustStep": "每步調校角度之百分一或長度", "config.tooltip.xtracr_realcamera.classicAdjustMode": "定當前按調校鍵時調何者", - "config.tooltip.xtracr_realcamera.scale": "控偏移量之大小", + "config.tooltip.xtracr_realcamera.scale": "控偏移大小", "config.tooltip.xtracr_realcamera.legacyBindingMode": "用古版(v0.5)系定之法,惟原模及原模所出之動可受\n啟之則可於%s窗'LEGACY_MODE'中設其性", "config.tooltip.xtracr_realcamera.adjustOffset": "當前按調校鍵時乃調鏡觀之偏移或旋轉", "config.tooltip.xtracr_realcamera.renderStuckObjects": "矢,蜂針等附身之物", "config.tooltip.xtracr_realcamera.rerenderModel": "於原顯時重顯其形,免早顯致視誤", - "config.tooltip.xtracr_realcamera.swimOutTick": "止游,即復其能所之延時(1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.outTick": "止禁,即復其能所之延時(1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "系定敗後數幀內,沿用前次成之果", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "鏡觀位移平滑之係,值愈大愈平", - "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "鏡觀旋轉平滑之係,值愈大愈平", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "鏡觀移滑係,值愈大愈平", + "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "鏡觀轉滑係,值愈大愈平", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "現配之引,零意奏許定諸配", "config.tooltip.xtracr_realcamera.disableRenderItems": "三法可配:\n1. 通配符`*`配(如`minecraft:*sword`)\n2. 標籤配以`#`始(如`#minecraft:swords`)\n3. 直物ID(如`minecraft:diamond_sword`)", - "message.xtracr_realcamera.bindingFailed": "[%s]: 系定敗,請往%s窗手設之(鍵:%s)", + "message.xtracr_realcamera.bindingFailed": "[%s]: 系定敗,往%s窗親設之(鍵:%s)", "screen.xtracr_realcamera.modelView_title": "模型觀象", "screen.widget.xtracr_realcamera.modelView_import": "入", @@ -97,7 +104,8 @@ "screen.widget.xtracr_realcamera.modelView_configs": "設", "screen.widget.xtracr_realcamera.modelView_copy": "抄", "screen.widget.xtracr_realcamera.modelView_paste": "貼", - "screen.tooltip.xtracr_realcamera.modelView_import": "自剪貼板入設", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "現綁配", + "screen.tooltip.xtracr_realcamera.modelView_import": "从剪貼板入設", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "入%s成!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "入敗:\n%s", "screen.tooltip.xtracr_realcamera.modelView_export": "出今設至剪貼板", diff --git a/common/src/main/resources/assets/realcamera/lang/pl_pl.json b/common/src/main/resources/assets/realcamera/lang/pl_pl.json index 15943bc2..29672052 100644 --- a/common/src/main/resources/assets/realcamera/lang/pl_pl.json +++ b/common/src/main/resources/assets/realcamera/lang/pl_pl.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Prawdziwa Kamera", "key.xtracr_realcamera.modelViewScreen": "Otwórz Ekran Podglądu Modelu", "key.xtracr_realcamera.togglePerspective": "Włącz/Wyłącz", + "key.xtracr_realcamera.activeConfigIndexPREV": "Przełącz na poprzednią konfigurację", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Przełącz na następną konfigurację", + "key.xtracr_realcamera.activeConfigIndexRESET": "Zresetuj indeks konfiguracji", "key.xtracr_realcamera.toggleAdjustMode": "Przełącz Tryb Dostosowania", "key.xtracr_realcamera.toggleCameraMode": "Przełącz Tryb Kamery", "key.xtracr_realcamera.adjustUP": "Dostosuj W GÓRĘ", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ukryj komunikaty o niepowodzeniu wiązania", "config.option.xtracr_realcamera.renderStuckObjects": "Wyświetl Zatkane Obiekty", "config.option.xtracr_realcamera.rerenderModel": "Ponownie Wyrenderuj Model", - "config.option.xtracr_realcamera.disableWhenSneaking": "Wyłącz główną funkcję podczas skradania", - "config.option.xtracr_realcamera.disableWhenSwimming": "Wyłącz główną funkcję podczas pływania", - "config.option.xtracr_realcamera.swimOutTick": "Opóźnienie wyjścia ze stanu pływania (w tickach)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Klatki przechowywania wyniku wiązania", "config.option.xtracr_realcamera.displacementSmoothFactor": "Współczynnik wygładzania przemieszczenia", "config.option.xtracr_realcamera.rotationSmoothFactor": "Współczynnik wygładzania obrotu", + "config.option.xtracr_realcamera.activeConfigIndex": "Aktywny Indeks Konfiguracji", + "config.option.xtracr_realcamera.disableConfig": "Wyłącz Konfigurację", + "config.option.xtracr_realcamera.disableWhenSneaking": "Wyłącz główną funkcję podczas skradania", + "config.option.xtracr_realcamera.disableWhenCrawling": "Wyłącz główną funkcję podczas czołgania", + "config.option.xtracr_realcamera.disableWhenSwimming": "Wyłącz główną funkcję podczas pływania", + "config.option.xtracr_realcamera.outTick": "Opóźnienie wyjścia ze stanu pływania (w tickach)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Wyłącz główną funkcję podczas trzymania...", "config.option.xtracr_realcamera.disableRenderItems": "Wyłącz renderowanie podczas trzymania...", "config.tooltip.xtracr_realcamera.isClassic": "Tryb klasyczny wprowadza tylko proste zmiany w pozycji i obrocie kamery", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "Po naciśnięciu klawisza dostosowania, reguluj przesunięcie lub obrót kamery", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Strzały, żądła pszczół i inne obiekty, które mogą utknąć w ciele gracza", "config.tooltip.xtracr_realcamera.rerenderModel": "Ponownie renderuj model w oryginalnym czasie renderowania, aby uniknąć problemów wizualnych spowodowanych wczesnym renderowaniem", - "config.tooltip.xtracr_realcamera.swimOutTick": "Opóźnienie włączenia głównej funkcji po wyjściu ze stanu pływania (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Przez kilka klatek po niepowodzeniu wiązania kontynuuj używanie poprzedniego udanego wyniku wiązania", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Współczynnik wygładzania przemieszczenia kamery, im wyższa wartość, tym płynniejszy ruch", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Współczynnik wygładzania obrotu kamery, im wyższa wartość, tym płynniejszy ruch", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Aktualnie powiązany indeks konfiguracji, 0 oznacza pozwolenie na powiązanie z dowolną prawidłową konfiguracją", + "config.tooltip.xtracr_realcamera.outTick": "Opóźnienie włączenia głównej funkcji po wyjściu ze stanu pływania (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Obsługiwane są trzy metody dopasowania:\n1. Dopasowanie wildcard `*` (np. `minecraft:*sword`)\n2. Dopasowanie tagów (zaczyna się od `#`, np. `#minecraft:swords`)\n3. Bezpośrednie ID przedmiotu (np. `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Błąd powiązania, przejdź do ekranu %s i skonfiguruj ręcznie (Klawisz: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Konfiguracje", "screen.widget.xtracr_realcamera.modelView_copy": "Kopiuj", "screen.widget.xtracr_realcamera.modelView_paste": "Wklej", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Bieżąca Konfiguracja", "screen.tooltip.xtracr_realcamera.modelView_import": "Importuj konfigurację ze schowka", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s powiódł się!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import nie powiódł się: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/pt_br.json b/common/src/main/resources/assets/realcamera/lang/pt_br.json index a8f696f2..dc1188e5 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_br.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_br.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Abrir Tela de Visualização do Modelo", "key.xtracr_realcamera.togglePerspective": "Ativar/Desativar", + "key.xtracr_realcamera.activeConfigIndexPREV": "Mudar para configuração anterior", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Mudar para próxima configuração", + "key.xtracr_realcamera.activeConfigIndexRESET": "Redefinir índice de configuração", "key.xtracr_realcamera.toggleAdjustMode": "Alternar Modo de Ajuste", "key.xtracr_realcamera.toggleCameraMode": "Alternar Modo de Câmera", "key.xtracr_realcamera.adjustUP": "Ajustar PARA CIMA", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensagens de falha de vinculação", "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Presos", "config.option.xtracr_realcamera.rerenderModel": "Renderizar Modelo Novamente", - "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", - "config.option.xtracr_realcamera.disableWhenSwimming": "Desativar função principal ao nadar", - "config.option.xtracr_realcamera.swimOutTick": "Atraso para sair do estado de natação (em ticks)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Quadros de retenção de resultado de vinculação", "config.option.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização de deslocamento", "config.option.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização de rotação", + "config.option.xtracr_realcamera.activeConfigIndex": "Índice de Configuração Ativa", + "config.option.xtracr_realcamera.disableConfig": "Desativar Configuração", + "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", + "config.option.xtracr_realcamera.disableWhenCrawling": "Desativar função principal ao rastejar", + "config.option.xtracr_realcamera.disableWhenSwimming": "Desativar função principal ao nadar", + "config.option.xtracr_realcamera.outTick": "Atraso na saída do estado de natação (em ticks)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Desativar função principal ao segurar...", "config.option.xtracr_realcamera.disableRenderItems": "Desativar renderização ao segurar...", "config.tooltip.xtracr_realcamera.isClassic": "O modo clássico apenas faz alterações simples na posição e rotação da câmera", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "Ao pressionar a tecla de ajuste, ajusta o deslocamento ou rotação da câmera", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flechas, ferrões de abelha e outros objetos que podem ficar presos no corpo do jogador", "config.tooltip.xtracr_realcamera.rerenderModel": "Renderizar o modelo novamente no momento original de renderização para evitar alguns problemas visuais causados pela renderização antecipada", - "config.tooltip.xtracr_realcamera.swimOutTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Por vários quadros após a falha de vinculação, continue usando o resultado de vinculação bem-sucedido anterior", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização do deslocamento da câmera, quanto maior o valor, mais suave o movimento", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização da rotação da câmera, quanto maior o valor, mais suave o movimento", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuração atualmente vinculada, 0 significa permitir vinculação a qualquer configuração válida", + "config.tooltip.xtracr_realcamera.outTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Três métodos de correspondência são suportados:\n1. Correspondência com curinga `*` (por exemplo, `minecraft:*sword`)\n2. Correspondência de tag (começa com `#`, por exemplo, `#minecraft:swords`)\n3. ID de item direto (por exemplo, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Vinculação falhou, por favor vá para a tela %s e configure manualmente (Tecla: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", "screen.widget.xtracr_realcamera.modelView_paste": "Colar", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/pt_pt.json b/common/src/main/resources/assets/realcamera/lang/pt_pt.json index 068d511b..49f8ba17 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_pt.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_pt.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Abrir Tela de Visualização de Modelo", "key.xtracr_realcamera.togglePerspective": "Ativar/Desativar", + "key.xtracr_realcamera.activeConfigIndexPREV": "Mudar para configuração anterior", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Mudar para próxima configuração", + "key.xtracr_realcamera.activeConfigIndexRESET": "Redefinir índice de configuração", "key.xtracr_realcamera.toggleAdjustMode": "Alternar Modo de Ajuste", "key.xtracr_realcamera.toggleCameraMode": "Alternar Modo de Câmera", "key.xtracr_realcamera.adjustUP": "Ajustar PARA CIMA", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensagens de falha de vinculação", "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Presos", "config.option.xtracr_realcamera.rerenderModel": "Renderizar Modelo Novamente", - "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", - "config.option.xtracr_realcamera.disableWhenSwimming": "Desativar função principal ao nadar", - "config.option.xtracr_realcamera.swimOutTick": "Atraso na saída do estado de natação (em ticks)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Quadros de retenção de resultado de vinculação", "config.option.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização de deslocamento", "config.option.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização de rotação", + "config.option.xtracr_realcamera.activeConfigIndex": "Índice de Configuração Ativa", + "config.option.xtracr_realcamera.disableConfig": "Desativar Configuração", + "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", + "config.option.xtracr_realcamera.disableWhenCrawling": "Desativar função principal ao rastejar", + "config.option.xtracr_realcamera.disableWhenSwimming": "Desativar função principal ao nadar", + "config.option.xtracr_realcamera.outTick": "Atraso na saída do estado de natação (em ticks)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Desativar função principal ao segurar...", "config.option.xtracr_realcamera.disableRenderItems": "Desativar renderização ao segurar...", "config.tooltip.xtracr_realcamera.isClassic": "O modo clássico apenas faz alterações simples na posição e rotação da câmera", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "Ao pressionar a tecla de ajuste, ajusta o deslocamento ou rotação da câmera", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flechas, ferrões de abelha e outros objetos que podem ficar presos no corpo do jogador", "config.tooltip.xtracr_realcamera.rerenderModel": "Renderizar o modelo novamente no momento original de renderização para evitar alguns problemas visuais causados pela renderização antecipada", - "config.tooltip.xtracr_realcamera.swimOutTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Por vários quadros após a falha de vinculação, continue usando o resultado de vinculação bem-sucedido anterior", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização do deslocamento da câmera, quanto maior o valor, mais suave o movimento", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização da rotação da câmera, quanto maior o valor, mais suave o movimento", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuração atualmente vinculada, 0 significa permitir vinculação a qualquer configuração válida", + "config.tooltip.xtracr_realcamera.outTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Três métodos de correspondência são suportados:\n1. Correspondência com curinga `*` (por exemplo, `minecraft:*sword`)\n2. Correspondência de tag (começa com `#`, por exemplo, `#minecraft:swords`)\n3. ID de item direto (por exemplo, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Vinculação falhou, por favor vá para a tela %s e configure manualmente (Tecla: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", "screen.widget.xtracr_realcamera.modelView_paste": "Colar", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/ru_ru.json b/common/src/main/resources/assets/realcamera/lang/ru_ru.json index 67d197f3..7b9505af 100644 --- a/common/src/main/resources/assets/realcamera/lang/ru_ru.json +++ b/common/src/main/resources/assets/realcamera/lang/ru_ru.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Открыть Экран Просмотра Модели", "key.xtracr_realcamera.togglePerspective": "Включить/Выключить", + "key.xtracr_realcamera.activeConfigIndexPREV": "Переключиться на предыдущую конфигурацию", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Переключиться на следующую конфигурацию", + "key.xtracr_realcamera.activeConfigIndexRESET": "Сбросить индекс конфигурации", "key.xtracr_realcamera.toggleAdjustMode": "Переключить Режим Настройки", "key.xtracr_realcamera.toggleCameraMode": "Переключить Режим Камеры", "key.xtracr_realcamera.adjustUP": "Настроить ВВЕРХ", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Скрывать сообщения о неудачной привязке", "config.option.xtracr_realcamera.renderStuckObjects": "Отображать Застрявшие Объекты", "config.option.xtracr_realcamera.rerenderModel": "Перерисовать Модель", - "config.option.xtracr_realcamera.disableWhenSneaking": "Отключить основную функцию при краже", - "config.option.xtracr_realcamera.disableWhenSwimming": "Отключить основную функцию при плавании", - "config.option.xtracr_realcamera.swimOutTick": "Задержка выхода из состояния плавания (в тиках)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадры сохранения результата привязки", "config.option.xtracr_realcamera.displacementSmoothFactor": "Коэффициент сглаживания смещения", "config.option.xtracr_realcamera.rotationSmoothFactor": "Коэффициент сглаживания вращения", + "config.option.xtracr_realcamera.activeConfigIndex": "Активный индекс конфигурации", + "config.option.xtracr_realcamera.disableConfig": "Отключить Конфигурацию", + "config.option.xtracr_realcamera.disableWhenSneaking": "Отключить основную функцию при краже", + "config.option.xtracr_realcamera.disableWhenCrawling": "Отключить основную функцию при ползании", + "config.option.xtracr_realcamera.disableWhenSwimming": "Отключить основную функцию при плавании", + "config.option.xtracr_realcamera.outTick": "Задержка выхода из состояния плавания (в тиках)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Отключить основную функцию при держании...", "config.option.xtracr_realcamera.disableRenderItems": "Отключить отображение при держании...", "config.tooltip.xtracr_realcamera.isClassic": "Классический режим вносит только простые изменения в положение и вращение камеры", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "При нажатии клавиши настройки, регулировать смещение или вращение камеры", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Стрелы, жала пчел и другие объекты, которые могут застрять в теле игрока", "config.tooltip.xtracr_realcamera.rerenderModel": "Перерисовывать модель в исходное время рендеринга, чтобы избежать визуальных проблем, вызванных ранним рендерингом", - "config.tooltip.xtracr_realcamera.swimOutTick": "Время перед включением основной функции после выхода из состояния плавания (1 тик = 0.05с)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "В течение нескольких кадров после неудачной привязки продолжать использовать предыдущий успешный результат привязки", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Коэффициент сглаживания смещения камеры, чем выше значение, тем плавнее движение", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Коэффициент сглаживания вращения камеры, чем выше значение, тем плавнее движение", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Текущий индекс привязанной конфигурации, 0 означает разрешение привязки к любой допустимой конфигурации", + "config.tooltip.xtracr_realcamera.outTick": "Время перед включением основной функции после выхода из состояния плавания (1 тик = 0.05с)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Поддерживаются три метода сопоставления:\n1. Сопоставление с подстановочным знаком `*` (например, `minecraft:*sword`)\n2. Сопоставление по тегам (начинается с `#`, например, `#minecraft:swords`)\n3. Прямой ID предмета (например, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Ошибка привязки, пожалуйста, перейдите на экран %s и настройте вручную (Клавиша: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Конфигурации", "screen.widget.xtracr_realcamera.modelView_copy": "Копировать", "screen.widget.xtracr_realcamera.modelView_paste": "Вставить", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Текущая Конфигурация", "screen.tooltip.xtracr_realcamera.modelView_import": "Импортировать конфигурацию из буфера обмена", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Импорт %s успешен!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Ошибка импорта: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/tr_tr.json b/common/src/main/resources/assets/realcamera/lang/tr_tr.json index 7a64a552..79eb9211 100644 --- a/common/src/main/resources/assets/realcamera/lang/tr_tr.json +++ b/common/src/main/resources/assets/realcamera/lang/tr_tr.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Model Görünüm Ekranını Aç", "key.xtracr_realcamera.togglePerspective": "Etkinleştir/Devre Dışı Bırak", + "key.xtracr_realcamera.activeConfigIndexPREV": "Önceki yapılandırmaya geç", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Sonraki yapılandırmaya geç", + "key.xtracr_realcamera.activeConfigIndexRESET": "Yapılandırma indeksini sıfırla", "key.xtracr_realcamera.toggleAdjustMode": "Ayarlama Modunu Değiştir", "key.xtracr_realcamera.toggleCameraMode": "Kamera Modunu Değiştir", "key.xtracr_realcamera.adjustUP": "YUKARI Ayarla", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Bağlama Başarısız Mesajını Gizle", "config.option.xtracr_realcamera.renderStuckObjects": "Sıkışmış Nesneleri Renderla", "config.option.xtracr_realcamera.rerenderModel": "Modeli Yeniden Renderla", - "config.option.xtracr_realcamera.disableWhenSneaking": "Eğilirken ana özelliği devre dışı bırak", - "config.option.xtracr_realcamera.disableWhenSwimming": "Yüzerken ana özelliği devre dışı bırak", - "config.option.xtracr_realcamera.swimOutTick": "Yüzme durumundan çıkma gecikmesi (tik cinsinden)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Bağlama Sonucu Saklama Kareleri", "config.option.xtracr_realcamera.displacementSmoothFactor": "Yer Değiştirme Düzgünleştirme Faktörü", "config.option.xtracr_realcamera.rotationSmoothFactor": "Dönüş Düzgünleştirme Faktörü", + "config.option.xtracr_realcamera.activeConfigIndex": "Aktif Yapılandırma İndeksi", + "config.option.xtracr_realcamera.disableConfig": "Yapılandırmayı Devre Dışı Bırak", + "config.option.xtracr_realcamera.disableWhenSneaking": "Eğilirken ana özelliği devre dışı bırak", + "config.option.xtracr_realcamera.disableWhenCrawling": "Sürünürken ana özelliği devre dışı bırak", + "config.option.xtracr_realcamera.disableWhenSwimming": "Yüzerken ana özelliği devre dışı bırak", + "config.option.xtracr_realcamera.outTick": "Yüzme durumundan çıkma gecikmesi (tik cinsinden)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Tutarken ana özelliği devre dışı bırak...", "config.option.xtracr_realcamera.disableRenderItems": "Tutarken renderlamayı devre dışı bırak...", "config.tooltip.xtracr_realcamera.isClassic": "Klasik mod yalnızca kameranın konumuna ve dönüşüne basit değişiklikler yapar", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "Ayarlama tuşuna basıldığında, kameranın ofsetini veya dönüşünü ayarlar", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Oyuncunun vücuduna saplanabilen oklar, arı sokmaları ve diğer nesneler", "config.tooltip.xtracr_realcamera.rerenderModel": "Modeli orijinal render zamanında yeniden renderlayarak erken renderlamadan kaynaklanan görsel sorunları önler", - "config.tooltip.xtracr_realcamera.swimOutTick": "Yüzme durumundan çıktıktan sonra ana özelliği etkinleştirmeden önce geçen süre (1 tik = 0.05s)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Bağlama başarısızlığından sonraki birkaç kare boyunca önceki başarılı bağlama sonucunu kullanmaya devam edin", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Kamera yer değiştirme düzgünleştirme faktörü, değer ne kadar yüksekse hareket o kadar pürüzsüz olur", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Kamera dönüş düzgünleştirme faktörü, değer ne kadar yüksekse hareket o kadar pürüzsüz olur", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Şu anda bağlı yapılandırma indeksi, 0 herhangi bir geçerli yapılandırmaya bağlanmaya izin verir", + "config.tooltip.xtracr_realcamera.outTick": "Yüzme durumundan çıktıktan sonra ana özelliği etkinleştirmeden önce geçen süre (1 tik = 0.05s)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Üç eşleştirme yöntemi desteklenir:\n1. Joker karakter `*` eşleştirmesi (örneğin, `minecraft:*sword`)\n2. Etiket eşleştirmesi (`#` ile başlar, örneğin `#minecraft:swords`)\n3. Doğrudan öğe kimliği (örneğin, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Bağlama başarısız oldu, lütfen %s ekranına gidin ve manuel olarak yapılandırın (Tuş: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Yapılandırmalar", "screen.widget.xtracr_realcamera.modelView_copy": "Kopyala", "screen.widget.xtracr_realcamera.modelView_paste": "Yapıştır", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Mevcut Yapılandırma", "screen.tooltip.xtracr_realcamera.modelView_import": "Panodan yapılandırmayı içe aktar", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s içe aktarma başarılı!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "İçe aktarma başarısız: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/uk_ua.json b/common/src/main/resources/assets/realcamera/lang/uk_ua.json index d85e8c1d..764b0716 100644 --- a/common/src/main/resources/assets/realcamera/lang/uk_ua.json +++ b/common/src/main/resources/assets/realcamera/lang/uk_ua.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "Відкрити Екран Перегляду Моделі", "key.xtracr_realcamera.togglePerspective": "Увімкнути/Вимкнути", + "key.xtracr_realcamera.activeConfigIndexPREV": "Переключитися на попередню конфігурацію", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Переключитися на наступну конфігурацію", + "key.xtracr_realcamera.activeConfigIndexRESET": "Скинути індекс конфігурації", "key.xtracr_realcamera.toggleAdjustMode": "Переключити Режим Налаштування", "key.xtracr_realcamera.toggleCameraMode": "Переключити Режим Камери", "key.xtracr_realcamera.adjustUP": "Налаштувати ВГОРУ", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "Приховувати повідомлення про невдалу прив'язку", "config.option.xtracr_realcamera.renderStuckObjects": "Відображати Застряглі Об'єкти", "config.option.xtracr_realcamera.rerenderModel": "Перемалювати Модель", - "config.option.xtracr_realcamera.disableWhenSneaking": "Вимкнути основну функцію при крадіжці", - "config.option.xtracr_realcamera.disableWhenSwimming": "Вимкнути основну функцію при плаванні", - "config.option.xtracr_realcamera.swimOutTick": "Затримка виходу зі стану плавання (у тіках)", "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадри збереження результату прив'язки", "config.option.xtracr_realcamera.displacementSmoothFactor": "Коефіцієнт згладжування зміщення", "config.option.xtracr_realcamera.rotationSmoothFactor": "Коефіцієнт згладжування обертання", + "config.option.xtracr_realcamera.activeConfigIndex": "Активний індекс конфігурації", + "config.option.xtracr_realcamera.disableConfig": "Вимкнути Конфігурацію", + "config.option.xtracr_realcamera.disableWhenSneaking": "Вимкнути основну функцію при крадіжці", + "config.option.xtracr_realcamera.disableWhenCrawling": "Вимкнути основну функцію при повзанні", + "config.option.xtracr_realcamera.disableWhenSwimming": "Вимкнути основну функцію при плаванні", + "config.option.xtracr_realcamera.outTick": "Затримка виходу зі стану плавання (у тіках)", "config.option.xtracr_realcamera.disableMainFeatureItems": "Вимкнути основну функцію при триманні...", "config.option.xtracr_realcamera.disableRenderItems": "Вимкнути відображення при триманні...", "config.tooltip.xtracr_realcamera.isClassic": "Класичний режим вносить лише прості зміни в положення та обертання камери", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "При натисканні клавіші налаштування, регулювати зміщення або обертання камери", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Стріли, жала бджіл та інші об'єкти, які можуть застрягти в тілі гравця", "config.tooltip.xtracr_realcamera.rerenderModel": "Перемальовувати модель у вихідний час рендерингу, щоб уникнути візуальних проблем, викликаних раннім рендерингом", - "config.tooltip.xtracr_realcamera.swimOutTick": "Час перед ввімкненням основної функції після виходу зі стану плавання (1 тік = 0.05с)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Протягом кількох кадрів після невдалої прив'язки продовжувати використовувати попередній успішний результат прив'язки", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Коефіцієнт згладжування зміщення камери, чим вище значення, тим плавніший рух", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Коефіцієнт згладжування обертання камери, чим вище значення, тим плавніший рух", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Поточний індекс прив'язаної конфігурації, 0 означає дозвіл прив'язки до будь-якої допустимої конфігурації", + "config.tooltip.xtracr_realcamera.outTick": "Час перед ввімкненням основної функції після виходу зі стану плавання (1 тік = 0.05с)", "config.tooltip.xtracr_realcamera.disableRenderItems": "Підтримуються три методи співставлення:\n1. Співставлення з підстановковим знаком `*` (наприклад, `minecraft:*sword`)\n2. Співставлення за тегами (починається з `#`, наприклад, `#minecraft:swords`)\n3. Прямий ID предмета (наприклад, `minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: Помилка прив'язки, будь ласка, перейдіть на екран %s та налаштуйте вручну (Клавіша: %s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "Конфігурації", "screen.widget.xtracr_realcamera.modelView_copy": "Копіювати", "screen.widget.xtracr_realcamera.modelView_paste": "Вставити", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Поточна Конфігурація", "screen.tooltip.xtracr_realcamera.modelView_import": "Імпортувати конфігурацію з буфера обміну", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпорт %s успішний!", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Помилка імпорту: \n%s", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_hk.json b/common/src/main/resources/assets/realcamera/lang/zh_hk.json index 81052770..0b23af1c 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_hk.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_hk.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "打開模型視圖界面", "key.xtracr_realcamera.togglePerspective": "開啟/關閉", + "key.xtracr_realcamera.activeConfigIndexPREV": "切換到上一個配置", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切換到下一個配置", + "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", "key.xtracr_realcamera.toggleAdjustMode": "切換調整模式", "key.xtracr_realcamera.toggleCameraMode": "切換攝像頭模式", "key.xtracr_realcamera.adjustUP": "向上調整", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱藏綁定失敗消息", "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物體", "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", - "config.option.xtracr_realcamera.disableWhenSneaking": "潛行時禁用主要功能", - "config.option.xtracr_realcamera.disableWhenSwimming": "游泳時禁用主要功能", - "config.option.xtracr_realcamera.swimOutTick": "游泳狀態退出延遲(單位:tick)", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留幀數", - "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑系数", - "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑系数", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留帧数", + "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑係數", + "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑係數", + "config.option.xtracr_realcamera.activeConfigIndex": "當前配置索引", + "config.option.xtracr_realcamera.disableConfig": "禁用配置", + "config.option.xtracr_realcamera.disableWhenSneaking": "潛行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", + "config.option.xtracr_realcamera.outTick": "禁用状态退出延迟(单位:tick)", "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...時禁用主要功能", "config.option.xtracr_realcamera.disableRenderItems": "在手持...時禁用渲染", "config.tooltip.xtracr_realcamera.isClassic": "經典模式只對攝像頭的位置和旋轉做簡單的修改", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "當前按下調整鍵時是調整攝像頭的偏移還是旋轉", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它會卡在玩家身體裡的物體", "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染時機重新渲染模型,以避免一些因提前渲染導致的視覺問題", - "config.tooltip.xtracr_realcamera.swimOutTick": "玩家停止游泳狀態後重啟主要功能的時間(1 tick = 0.05秒)", + "config.tooltip.xtracr_realcamera.outTick": "玩家停止特定狀態後重啟主要功能的時間(1 tick = 0.05秒)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在綁定失敗的數帧内,沿用上个成功的綁定結果", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相機位移平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相機旋轉平滑系数,值越大越平滑", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "當前綁定的配置索引,0表示允許綁定任何有效配置", "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三種匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 標簽匹配`#`開頭(如`#minecraft:tools`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: 綁定失敗,請前往%s界面手動設置(鍵位:%s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "配置", "screen.widget.xtracr_realcamera.modelView_copy": "複製", "screen.widget.xtracr_realcamera.modelView_paste": "貼上", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_tw.json b/common/src/main/resources/assets/realcamera/lang/zh_tw.json index 81052770..0b23af1c 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_tw.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_tw.json @@ -2,6 +2,9 @@ "general.xtracr_realcamera.modName": "Real Camera", "key.xtracr_realcamera.modelViewScreen": "打開模型視圖界面", "key.xtracr_realcamera.togglePerspective": "開啟/關閉", + "key.xtracr_realcamera.activeConfigIndexPREV": "切換到上一個配置", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切換到下一個配置", + "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", "key.xtracr_realcamera.toggleAdjustMode": "切換調整模式", "key.xtracr_realcamera.toggleCameraMode": "切換攝像頭模式", "key.xtracr_realcamera.adjustUP": "向上調整", @@ -43,12 +46,15 @@ "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱藏綁定失敗消息", "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物體", "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", - "config.option.xtracr_realcamera.disableWhenSneaking": "潛行時禁用主要功能", - "config.option.xtracr_realcamera.disableWhenSwimming": "游泳時禁用主要功能", - "config.option.xtracr_realcamera.swimOutTick": "游泳狀態退出延遲(單位:tick)", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留幀數", - "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑系数", - "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑系数", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留帧数", + "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑係數", + "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑係數", + "config.option.xtracr_realcamera.activeConfigIndex": "當前配置索引", + "config.option.xtracr_realcamera.disableConfig": "禁用配置", + "config.option.xtracr_realcamera.disableWhenSneaking": "潛行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", + "config.option.xtracr_realcamera.outTick": "禁用状态退出延迟(单位:tick)", "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...時禁用主要功能", "config.option.xtracr_realcamera.disableRenderItems": "在手持...時禁用渲染", "config.tooltip.xtracr_realcamera.isClassic": "經典模式只對攝像頭的位置和旋轉做簡單的修改", @@ -61,10 +67,11 @@ "config.tooltip.xtracr_realcamera.adjustOffset": "當前按下調整鍵時是調整攝像頭的偏移還是旋轉", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它會卡在玩家身體裡的物體", "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染時機重新渲染模型,以避免一些因提前渲染導致的視覺問題", - "config.tooltip.xtracr_realcamera.swimOutTick": "玩家停止游泳狀態後重啟主要功能的時間(1 tick = 0.05秒)", + "config.tooltip.xtracr_realcamera.outTick": "玩家停止特定狀態後重啟主要功能的時間(1 tick = 0.05秒)", "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在綁定失敗的數帧内,沿用上个成功的綁定結果", "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相機位移平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相機旋轉平滑系数,值越大越平滑", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "當前綁定的配置索引,0表示允許綁定任何有效配置", "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三種匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 標簽匹配`#`開頭(如`#minecraft:tools`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", "message.xtracr_realcamera.bindingFailed": "[%s]: 綁定失敗,請前往%s界面手動設置(鍵位:%s)", @@ -97,6 +104,7 @@ "screen.widget.xtracr_realcamera.modelView_configs": "配置", "screen.widget.xtracr_realcamera.modelView_copy": "複製", "screen.widget.xtracr_realcamera.modelView_paste": "貼上", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", From e60f60ce8af1564c424d35310bcddce33d62c86a Mon Sep 17 00:00:00 2001 From: xTracr <57320980+xTracr@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:24:06 +0800 Subject: [PATCH 09/34] Upgrade to 26.1.1 (#204) * Try to adapt to 26.1-snapshot environment * Update workflows to use Java 25 * Replace `deltaTick` with `partialTicks` * Upgrade to 26.1.1 * Reformat the code * Optimize `IterableVertexBuffer` and add `RoutingSubmitCollector` to fix shadow rendering * Add back commitSHA * Add solid feature rendering and refactor icon buttons * Fix DoubleSlider, raycast * Fix neoforge, improve build.gradle.kts --- .github/ISSUE_TEMPLATE/bug_report_cn.yml | 2 +- .github/workflows/build.yml | 8 +- .github/workflows/publish.yml | 6 +- .gitignore | 3 + README.md | 90 ++--- README_ZH.md | 90 ++--- build.gradle | 52 --- build.gradle.kts | 18 + common/build.gradle | 12 - common/build.gradle.kts | 53 +++ .../com/xtracr/realcamera/KeyMappings.java | 31 +- .../com/xtracr/realcamera/RealCameraCore.java | 116 +++--- .../com/xtracr/realcamera/api/BindResult.java | 29 +- .../xtracr/realcamera/api/RealCameraAPI.java | 4 +- .../compat/CompatibilityHelper.java | 18 +- .../realcamera/compat/DisableHelper.java | 21 +- .../realcamera/compat/LegacyBindingMode.java | 87 +---- .../xtracr/realcamera/compat/YSMCompat.java | 27 +- .../xtracr/realcamera/config/BindTarget.java | 13 +- .../realcamera/config/ConfigScreen.java | 59 +-- .../xtracr/realcamera/config/ModConfig.java | 2 +- .../realcamera/gui/CyclingTexturedButton.java | 71 ---- .../com/xtracr/realcamera/gui/GUIHelper.java | 90 +++-- .../xtracr/realcamera/gui/ModelAnalyser.java | 143 +++----- .../realcamera/gui/ModelViewScreen.java | 342 +++++++++--------- .../xtracr/realcamera/gui/TexturedButton.java | 52 --- .../gui/components/CycleIconButton.java | 73 ++++ .../gui/{ => components}/DoubleSlider.java | 11 +- .../gui/{ => components}/NumberField.java | 56 +-- .../gui/components/SimpleIconButton.java | 38 ++ .../xtracr/realcamera/mixin/MixinCamera.java | 83 +++-- .../mixin/MixinFishingHookRenderer.java | 11 +- .../realcamera/mixin/MixinGameRenderer.java | 55 +-- .../com/xtracr/realcamera/mixin/MixinGui.java | 16 +- .../xtracr/realcamera/mixin/MixinItem.java | 7 +- .../mixin/MixinItemInHandRenderer.java | 6 +- .../realcamera/mixin/MixinLevelRenderer.java | 49 ++- .../realcamera/mixin/MixinLocalPlayer.java | 43 ++- .../realcamera/mixin/MixinPlayerRenderer.java | 15 - .../mixin/MixinStuckInBodyLayer.java | 14 +- .../accessor/AvatarRendererAccessor.java | 16 + .../mixin/accessor/CameraAccessor.java | 12 - ...CustomFeatureRenderer$StorageAccessor.java | 19 + .../mixin/accessor/GameRendererAccessor.java | 14 - .../GuiGraphicsExtractorAccessor.java | 15 + .../ModelFeatureRenderer$StorageAccessor.java | 19 + ...elPartFeatureRenderer$StorageAccessor.java | 19 + .../accessor/PlayerRendererAccessor.java | 19 - .../BuiltIterableBuffer.java | 12 +- .../IterableVertexBuffer.java | 99 ++--- .../renderer/MultiVertexCatcher.java | 195 ++++++++++ .../renderer/RoutingSubmitCollector.java | 182 ++++++++++ .../renderer/gui/GuiCulledModelsRenderer.java | 58 +++ .../gui/GuiFlattenedModelsRenderer.java | 49 +++ .../renderer/state/BuiltModelRecord.java | 14 + .../{util => renderer/state}/VertexData.java | 2 +- .../gui/ColoredFloatLineRenderState.java | 63 ++++ .../gui/ColoredFloatQuadRenderState.java | 64 ++++ .../gui/ColoredFloatRectangleRenderState.java | 48 +++ .../state/gui/GuiCulledModelsRenderState.java | 34 ++ .../gui/GuiFlattenedModelsRenderState.java | 34 ++ .../realcamera/util/CameraTransform.java | 40 ++ .../xtracr/realcamera/util/CrosshairUtil.java | 13 +- .../com/xtracr/realcamera/util/MathUtil.java | 22 +- .../realcamera/util/MultiVertexCatcher.java | 96 ----- .../xtracr/realcamera/util/RaycastUtil.java | 45 +-- .../xtracr/realcamera/util/SmoothUtil.java | 25 -- .../main/resources/architectury.common.json | 3 - .../assets/realcamera/lang/be_by.json | 213 ++++++----- .../assets/realcamera/lang/en_us.json | 213 ++++++----- .../assets/realcamera/lang/es_es.json | 213 ++++++----- .../assets/realcamera/lang/fr_fr.json | 213 ++++++----- .../assets/realcamera/lang/ja_jp.json | 213 ++++++----- .../assets/realcamera/lang/ko_kr.json | 213 ++++++----- .../resources/assets/realcamera/lang/lzh.json | 213 ++++++----- .../assets/realcamera/lang/pl_pl.json | 213 ++++++----- .../assets/realcamera/lang/pt_br.json | 213 ++++++----- .../assets/realcamera/lang/pt_pt.json | 213 ++++++----- .../assets/realcamera/lang/ru_ru.json | 213 ++++++----- .../assets/realcamera/lang/tr_tr.json | 213 ++++++----- .../assets/realcamera/lang/uk_ua.json | 213 ++++++----- .../assets/realcamera/lang/zh_cn.json | 213 ++++++----- .../assets/realcamera/lang/zh_hk.json | 213 ++++++----- .../assets/realcamera/lang/zh_tw.json | 213 ++++++----- .../resources/realcamera-common.mixins.json | 11 +- .../main/resources/realcamera.accesswidener | 5 +- fabric/build.gradle | 72 ---- fabric/build.gradle.kts | 102 ++++++ .../com/xtracr/realcamera/EventHandler.java | 14 - .../xtracr/realcamera/RealCameraFabric.java | 18 +- fabric/src/main/resources/fabric.mod.json | 7 +- .../src/main/resources/realcamera.mixins.json | 2 +- gradle.properties | 19 +- gradle/wrapper/gradle-wrapper.jar | Bin 45633 -> 48966 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- neoforge/build.gradle | 69 ---- neoforge/build.gradle.kts | 99 +++++ neoforge/gradle.properties | 1 - .../com/xtracr/realcamera/EventHandler.java | 16 +- .../xtracr/realcamera/RealCameraNeoForge.java | 25 +- .../resources/META-INF/accesstransformer.cfg | 1 + .../resources/META-INF/neoforge.mods.toml | 14 +- .../src/main/resources/realcamera.mixins.json | 2 +- settings.gradle | 14 - settings.gradle.kts | 24 ++ 106 files changed, 3877 insertions(+), 3197 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 common/build.gradle create mode 100644 common/build.gradle.kts delete mode 100644 common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java delete mode 100644 common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java create mode 100644 common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java rename common/src/main/java/com/xtracr/realcamera/gui/{ => components}/DoubleSlider.java (77%) rename common/src/main/java/com/xtracr/realcamera/gui/{ => components}/NumberField.java (67%) create mode 100644 common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java delete mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/MixinPlayerRenderer.java create mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/AvatarRendererAccessor.java delete mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/CameraAccessor.java create mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/CustomFeatureRenderer$StorageAccessor.java delete mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/GameRendererAccessor.java create mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/GuiGraphicsExtractorAccessor.java create mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelFeatureRenderer$StorageAccessor.java create mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelPartFeatureRenderer$StorageAccessor.java delete mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/PlayerRendererAccessor.java rename common/src/main/java/com/xtracr/realcamera/{util => renderer}/BuiltIterableBuffer.java (93%) rename common/src/main/java/com/xtracr/realcamera/{util => renderer}/IterableVertexBuffer.java (86%) create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/state/BuiltModelRecord.java rename common/src/main/java/com/xtracr/realcamera/{util => renderer/state}/VertexData.java (99%) create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatQuadRenderState.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatRectangleRenderState.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiCulledModelsRenderState.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiFlattenedModelsRenderState.java create mode 100644 common/src/main/java/com/xtracr/realcamera/util/CameraTransform.java delete mode 100644 common/src/main/java/com/xtracr/realcamera/util/MultiVertexCatcher.java delete mode 100644 common/src/main/java/com/xtracr/realcamera/util/SmoothUtil.java delete mode 100644 common/src/main/resources/architectury.common.json delete mode 100644 fabric/build.gradle create mode 100644 fabric/build.gradle.kts delete mode 100644 fabric/src/main/java/com/xtracr/realcamera/EventHandler.java delete mode 100644 neoforge/build.gradle create mode 100644 neoforge/build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.yml b/.github/ISSUE_TEMPLATE/bug_report_cn.yml index 02018ff9..6e50b14e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_cn.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.yml @@ -73,7 +73,7 @@ body: attributes: label: 日志和崩溃报告 description: >- - 你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能 + 你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能
你可以日志上传到类似 https://paste.ubuntu.com/ 或者 https://mclo.gs/ 的网站并在此贴出链接
**请不要在此此处直接粘贴大段的日志文本!!** placeholder: '把日志文件往这丢或者使用外部链接' \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7b790e02..7414c951 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,15 +19,15 @@ jobs: run: env - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: submodules: true - name: Setup JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 21 + java-version: 25 - name: Make Gradle Wrapper Executable if: ${{ runner.os != 'Windows' }} @@ -37,7 +37,7 @@ jobs: run: ./gradlew clean build -PcommitSHA=${{ github.sha }} - name: Capture Build Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: Artifacts path: | diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c1efbf9c..62670d51 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,15 +18,15 @@ jobs: run: env - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: submodules: true - name: Setup JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 21 + java-version: 25 - name: Make Gradle Wrapper Executable if: ${{ runner.os != 'Windows' }} diff --git a/.gitignore b/.gitignore index 6b72fc32..36d81e47 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ hs_err_*.log replay_*.log *.hprof *.jfr + +# claude +CLAUDE.md \ No newline at end of file diff --git a/README.md b/README.md index ea1e7342..82d22a72 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### [中文](README_ZH.md) Make the camera more realistic in the first-person view. -Supported versions: 1.18.2-1.20.4 Forge, 1.18.2-1.21.8 Fabric, 1.21-1.21.8 NeoForge. +Supported versions: 1.18.2 - 1.20.4 Forge, 1.18.2 - 26.1 Fabric, 1.21 - 26.1 NeoForge. Download the mod from [Releases](https://github.com/xTracr/RealCamera/releases), [Modrinth](https://modrinth.com/mod/real-camera) or [CurseForge](https://curseforge.com/minecraft/mc-mods/real-camera) Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/build.yml) @@ -19,11 +19,11 @@ Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/buil * Theoretically, most mod models are supported, but need to be configured manually: * First, set the key binding for `Open Model View Screen`. - * ![gui_configs](https://cdn.modrinth.com/data/fYYSAh4R/images/4625282a5683cd38eba2947be1ca82e595e18bad.png) + * ![gui_configs](https://cdn.modrinth.com/data/fYYSAh4R/images/4625282a5683cd38eba2947be1ca82e595e18bad.png) * Open the model view screen and left click with left Alt held to select the corresponding face of the model, scroll with left Alt held to switch between the different layers of the model. * By clicking the `Selecting` button on the left, switch between the three to select the `Forward Vector`, `Upward Vector`, and `Target Plane`. * From the top right button, enter the `Preview` section, where you can see the relative relationship between the camera and the model and make certain adjustments (you can also adjust through key bindings). - * ![gui_preview](https://cdn.modrinth.com/data/fYYSAh4R/images/44c87a6f1750f8d1b03422120e6042d1098896cb.png) + * ![gui_preview](https://cdn.modrinth.com/data/fYYSAh4R/images/44c87a6f1750f8d1b03422120e6042d1098896cb.png) * Enter a name and save. #### Tips @@ -31,68 +31,68 @@ Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/buil * Configs can have their priority adjusted - higher priority configs appear higher in the right-side list * Disable depth in `Preview` section to hide models blocking the view * About `Disable` section (current version still rough, complex operations): - * When texture ID field is empty, use Left Alt+Left Click to select texture - * Model parts contained by blue boxes won't be rendered - * Left-click drag to select in texture view, other keys cancel selection - * Left Alt+Left Click quickly selects hovered parts - * In `All` mode, entire texture's model won't render (blue box containing the texture in left panel indicates this) - * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) + * When texture ID field is empty, use Left Alt+Left Click to select texture + * Model parts contained by blue boxes won't be rendered + * Left-click drag to select in texture view, other keys cancel selection + * Left Alt+Left Click quickly selects hovered parts + * In `All` mode, entire texture's model won't render (blue box containing the texture in left panel indicates this) + * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) ## Dependencies * Fabric: - * [Fabric API](https://modrinth.com/mod/fabric-api) + * [Fabric API](https://modrinth.com/mod/fabric-api) * Both: - * (Optional but recommended) [Cloth Config API](https://modrinth.com/mod/cloth-config) + * (Optional but recommended) [Cloth Config API](https://modrinth.com/mod/cloth-config) ## FAQ * A part of the model (e.g. hair) is always in the way, how to make it invisible? - * Increasing this value may help, or use `Disable` section - ![disable_depth](https://github.com/xTracr/RealCamera/assets/57320980/78c246e8-34aa-4979-89de-780ee907870b) + * Increasing this value may help, or use `Disable` section + ![disable_depth](https://github.com/xTracr/RealCamera/assets/57320980/78c246e8-34aa-4979-89de-780ee907870b) * What key to press can open Model View Screen? - * Set the key binding by yourself + * Set the key binding by yourself * Why can't i open the Config Screen? - * Please downlowd [Cloth Config API](https://modrinth.com/mod/cloth-config) + * Please downlowd [Cloth Config API](https://modrinth.com/mod/cloth-config) * Why does it show binding failed when use YSM models? - * Snapshot 0.6.15 "try" to fix problems, but it didn't fix completely - * If Minecraft version is 1.20.1, then bind upward vector to head left (or right) side, and set roll angle to 90 (or -90) in preview section + * Snapshot 0.6.15 "try" to fix problems, but it didn't fix completely + * If Minecraft version is 1.20.1, then bind upward vector to head left (or right) side, and set roll angle to 90 (or -90) in preview section * Why does the head of YSM model disappear when in the Model View Screen? - * You downloaded Better Combat, just put it away + * You downloaded Better Combat, just put it away ### Compatibility * Incompatible: - * OptiFine - * Armourer's Workshop (Mod version 0.6+) - * Armors based on GeckoLib - * Customizable Player Models - * Epic Fight (Mod version 0.6-) - * Timeless and Classics Zero,version 1.1.4+ + * OptiFine + * Armourer's Workshop (Mod version 0.6+) + * Armors based on GeckoLib + * Customizable Player Models + * Epic Fight (Mod version 0.6-) + * Timeless and Classics Zero,version 1.1.4+ * Compatible: - * most camera mods - * most player model mods - * Armourer's Workshop (Mod version 0.6-) - * Epic Fight (Mod version 0.6+) - * First-person Model - * Not Enough Animations - * ParCool! - * Pehkui - * Player Animation Lib - * Timeless and Classics Zero,version 1.0.3- - * Yes Steve Model (Not stably compatible) - * Superb Warfare + * most camera mods + * most player model mods + * Armourer's Workshop (Mod version 0.6-) + * Epic Fight (Mod version 0.6+) + * First-person Model + * Not Enough Animations + * ParCool! + * Pehkui + * Player Animation Lib + * Timeless and Classics Zero,version 1.0.3- + * Yes Steve Model (Not stably compatible) + * Superb Warfare * Model Mod Compatibility Requirements with `Real Camera` (Based on Official Mappings): * Vertex Data Acquisition - * `Real Camera` obtains vertex data by overriding the `MultiBufferSource multiBufferSource` parameter of the public method `EntityRenderDispatcher.render` - * The call timing is before the `Camera.setup` phase in the `GameRenderer.renderLevel` method - * *Therefore*, the mod needs to meet the following technical conditions: - * Use only the **provided** `multiBufferSource` parameter when rendering `Minecraft.getCameraEntity`, and avoid alternative approaches for obtaining or creating `MultiBufferSource` instances - * The overall rendering behavior remains unaffected when rendering the player model at the adjusted timing - * Ensure all vertex data ultimately passes through `VertexConsumer` gotten by `MultiBufferSource.getBuffer` + * `Real Camera` obtains vertex data by overriding the `MultiBufferSource multiBufferSource` parameter of the public method `EntityRenderDispatcher.render` + * The call timing is before the `Camera.setup` phase in the `GameRenderer.renderLevel` method + * *Therefore*, the mod needs to meet the following technical conditions: + * Use only the **provided** `multiBufferSource` parameter when rendering `Minecraft.getCameraEntity`, and avoid alternative approaches for obtaining or creating `MultiBufferSource` instances + * The overall rendering behavior remains unaffected when rendering the player model at the adjusted timing + * Ensure all vertex data ultimately passes through `VertexConsumer` gotten by `MultiBufferSource.getBuffer` * Render Times Compatibility - * `Real Camera` renders `Minecraft.getCameraEntity` by calling the public method `EntityRenderDispatcher.render` - * This is the second call to the `EntityRenderDispatcher.render` method in a frame (the first call is to solve the camera parameters). - * *Therefore*, the mod needs to meet the condition that the overall rendering behavior remains unaffected when rendering the player model **multiple times** in the same frame + * `Real Camera` renders `Minecraft.getCameraEntity` by calling the public method `EntityRenderDispatcher.render` + * This is the second call to the `EntityRenderDispatcher.render` method in a frame (the first call is to solve the camera parameters). + * *Therefore*, the mod needs to meet the condition that the overall rendering behavior remains unaffected when rendering the player model **multiple times** in the same frame diff --git a/README_ZH.md b/README_ZH.md index 1df074f4..6f2ae5d0 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -3,7 +3,7 @@ ### [English](README.md) 使第一人称视角下的摄像头更加真实。 -支持的版本: 1.18.2 - 1.20.4 Forge,1.18.2 - 1.21.8 Fabric,1.21 - 1.21.8 NeoForge +支持的版本: 1.18.2 - 1.20.4 Forge,1.18.2 - 26.1 Fabric,1.21 - 26.1 NeoForge 从[Releases](https://github.com/xTracr/RealCamera/releases)、[Modrinth](https://modrinth.com/mod/real-camera)或[CurseForge](https://curseforge.com/minecraft/mc-mods/real-camera)下载 快照版在[这里](https://github.com/xTracr/RealCamera/actions/workflows/build.yml) @@ -19,11 +19,11 @@ * 理论上支持大多数模组模型,但需要手动进行配置: * 首先设置`打开模型视图界面`的按键绑定 - * ![gui_configs](https://cdn.modrinth.com/data/fYYSAh4R/images/4625282a5683cd38eba2947be1ca82e595e18bad.png) + * ![gui_configs](https://cdn.modrinth.com/data/fYYSAh4R/images/4625282a5683cd38eba2947be1ca82e595e18bad.png) * 打开模型视图界面,左Alt+左键选择模型的对应的面,左Alt+滚轮可以在模型的不同层间切换 * 通过点击左侧的`选择`按钮,在三者间切换,选好`向前矢量`、`向上矢量`和`目标平面` * 从右上角的按钮进入`预览`界面,在这里可以看到摄像头与模型的相对关系,并进行一定的调整(也可以通过按键绑定调整) - * ![gui_preview](https://cdn.modrinth.com/data/fYYSAh4R/images/44c87a6f1750f8d1b03422120e6042d1098896cb.png) + * ![gui_preview](https://cdn.modrinth.com/data/fYYSAh4R/images/44c87a6f1750f8d1b03422120e6042d1098896cb.png) * 输入名称并保存 #### Tips @@ -31,67 +31,67 @@ * 可以更改配置的优先级,优先级越高的配置,在右侧排序越靠上 * 在`预览`界面可以更改禁用深度来禁用眼前的模型的渲染 * 关于`禁用`界面(当前版本尚不完善,操作较为繁琐): - * 在左侧材质id输入框为空时,可以使用Alt+左键选择材质 - * 被蓝框包含的部分不会被渲染。 - * 在左侧材质视图中鼠标左键框选,其它键取消选择 - * Alt+左键可快速选中被鼠标指针指向的部分 - * `全部`模式下,整个材质所对应的模型都不会被渲染(左侧会有一个包含整个材质的蓝框来表示这一点) - * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) + * 在左侧材质id输入框为空时,可以使用Alt+左键选择材质 + * 被蓝框包含的部分不会被渲染。 + * 在左侧材质视图中鼠标左键框选,其它键取消选择 + * Alt+左键可快速选中被鼠标指针指向的部分 + * `全部`模式下,整个材质所对应的模型都不会被渲染(左侧会有一个包含整个材质的蓝框来表示这一点) + * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) ## 依赖项目 * Fabric: - * [Fabric API](https://modrinth.com/mod/fabric-api) + * [Fabric API](https://modrinth.com/mod/fabric-api) * 所有平台: - * (可选但建议)[Cloth Config API](https://modrinth.com/mod/cloth-config) + * (可选但建议)[Cloth Config API](https://modrinth.com/mod/cloth-config) ## 常见问题 * 模型的一部分(如头发)始终挡在面前,怎样隐藏它? - * 增加这个值或许有所帮助,或者使用`禁用`功能 - ![disable_depth](https://github.com/xTracr/RealCamera/assets/57320980/78c246e8-34aa-4979-89de-780ee907870b) + * 增加这个值或许有所帮助,或者使用`禁用`功能 + ![disable_depth](https://github.com/xTracr/RealCamera/assets/57320980/78c246e8-34aa-4979-89de-780ee907870b) * 按什么键打开模组视图界面? - * 在按键绑定里自己设置 + * 在按键绑定里自己设置 * 为什么打不开配置界面(模组设置)? - * 没有安装[Cloth Config API](https://modrinth.com/mod/cloth-config) + * 没有安装[Cloth Config API](https://modrinth.com/mod/cloth-config) * 为什么ysm模型有时候会弹出绑定失败? - * 快照0.6.15“尝试”修复了ysm问题,但没有修复透彻 - * 如果Minecraft版本为1.20.1,那么需要将向上矢量绑定在头部的左面(或右面),并在预览界面中将翻滚角设置为90度(或-90度) + * 快照0.6.15“尝试”修复了ysm问题,但没有修复透彻 + * 如果Minecraft版本为1.20.1,那么需要将向上矢量绑定在头部的左面(或右面),并在预览界面中将翻滚角设置为90度(或-90度) * 为什么配置ysm时候,模型视图界面中ysm模型头部消失? - * 安装了Better Combat模组,去掉就可以了 + * 安装了Better Combat模组,去掉就可以了 ### 兼容性 * 不兼容: - * OptiFine - * Armourer's Workshop(时装工坊)(真实相机0.6版本以上) - * 基于GeckoLib的盔甲 - * Customizable Player Models(自定义玩家模型) - * Epic Fight(史诗战斗)(真实相机0.6版本以下) - * [TaCZ]永恒枪械工坊:零 1.1.4版本及以上 + * OptiFine + * Armourer's Workshop(时装工坊)(真实相机0.6版本以上) + * 基于GeckoLib的盔甲 + * Customizable Player Models(自定义玩家模型) + * Epic Fight(史诗战斗)(真实相机0.6版本以下) + * [TaCZ]永恒枪械工坊:零 1.1.4版本及以上 * 兼容: - * 大多数修改玩家镜头的模组 - * 多数模型模组 - * Armourer's Workshop(时装工坊)(真实相机0.6版本以下) - * Epic Fight(史诗战斗)(真实相机0.6版本以上) - * First-person Model(更真实的第一人称模型) - * Not Enough Animations(更多动画) - * Player Animation Lib - * Pehkui - * ParCool! - * [TaCZ]永恒枪械工坊:零 1.0.3版本及以下 - * Yes Steve Model(是,史蒂夫模型)(不能稳定兼容) - * Superb Warfare(卓越前线) + * 大多数修改玩家镜头的模组 + * 多数模型模组 + * Armourer's Workshop(时装工坊)(真实相机0.6版本以下) + * Epic Fight(史诗战斗)(真实相机0.6版本以上) + * First-person Model(更真实的第一人称模型) + * Not Enough Animations(更多动画) + * Player Animation Lib + * Pehkui + * ParCool! + * [TaCZ]永恒枪械工坊:零 1.0.3版本及以下 + * Yes Steve Model(是,史蒂夫模型)(不能稳定兼容) + * Superb Warfare(卓越前线) * 模型模组与`Real Camera`兼容的必要条件(基于官方映射): * 顶点数据获取 - * `Real Camera`通过替换公共方法`EntityRenderDispatcher.render`的`MultiBufferSource multiBufferSource`参数实现顶点数据获取 - * 调用时机为`GameRenderer.renderLevel`流程中的`Camera.setup`阶段之前 - * *因此*,模组需要满足以下技术条件: - * 渲染`Minecraft.getCameraEntity`时严格使用**传入的**`multiBufferSource`参数,没有通过其他途径获取或创建`MultiBufferSource`实例 - * 在调整后的时机渲染玩家模型,其整体表现不受影响 - * 所有顶点数据最终通过`MultiBufferSource.getBuffer`方法获取的`VertexConsumer`发送给GPU + * `Real Camera`通过替换公共方法`EntityRenderDispatcher.render`的`MultiBufferSource multiBufferSource`参数实现顶点数据获取 + * 调用时机为`GameRenderer.renderLevel`流程中的`Camera.setup`阶段之前 + * *因此*,模组需要满足以下技术条件: + * 渲染`Minecraft.getCameraEntity`时严格使用**传入的**`multiBufferSource`参数,没有通过其他途径获取或创建`MultiBufferSource`实例 + * 在调整后的时机渲染玩家模型,其整体表现不受影响 + * 所有顶点数据最终通过`MultiBufferSource.getBuffer`方法获取的`VertexConsumer`发送给GPU * 渲染次数兼容 - * `Real Camera`通过调用`EntityRenderDispatcher.render`公共方法进行`Minecraft.getCameraEntity`的渲染 - * 这是在一帧中第二次调用`EntityRenderDispatcher.render`方法(第一次是为了解算摄像机参数) - * *因此*,模组需要满足:同一帧内**多次**渲染玩家模型,其整体表现不受影响 + * `Real Camera`通过调用`EntityRenderDispatcher.render`公共方法进行`Minecraft.getCameraEntity`的渲染 + * 这是在一帧中第二次调用`EntityRenderDispatcher.render`方法(第一次是为了解算摄像机参数) + * *因此*,模组需要满足:同一帧内**多次**渲染玩家模型,其整体表现不受影响 diff --git a/build.gradle b/build.gradle deleted file mode 100644 index cd909ce2..00000000 --- a/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.13-SNAPSHOT" apply false -} - -architectury { - minecraft = rootProject.minecraft_version -} - -subprojects { - apply plugin: "dev.architectury.loom" - - loom { - silentMojangMappingsLicense() - accessWidenerPath = project(":common").file("src/main/resources/realcamera.accesswidener") - } - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.officialMojangMappings() - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - base { - archivesName = rootProject.mod_id - } - - version = rootProject.mod_version + (findProperty("commitSHA") ? "-${(commitSHA as String).substring(0,7)}" : "") - group = rootProject.mod_group_id - - repositories { - maven { url "https://maven.shedaniel.me/" } - maven { url "https://maven.terraformersmc.com/releases/" } - maven { url "https://api.modrinth.com/maven" } - //maven { url "https://cursemaven.com" } - //maven { url "https://www.jitpack.io" } - } - - tasks.withType(JavaCompile).configureEach { - options.encoding = "UTF-8" - options.release = 21 - } - - java { - withSourcesJar() - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..f1fa2d86 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id("java-library") + id("maven-publish") +} + +allprojects { + val commitSHA = findProperty("commitSHA")?.let { "-${it.toString().take(7)}" }.orEmpty() + group = property("mod_group_id") as String + version = "${property("mod_version")}$commitSHA" + + repositories { + mavenCentral() + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/releases/") + maven("https://maven.fabricmc.net/") + maven("https://maven.neoforged.net/releases/") + } +} diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index f4d27d6a..00000000 --- a/common/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -architectury { - common(rootProject.enabled_platforms.split(",")) -} - -dependencies { - modCompileOnly "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - - // Cloth Config - modCompileOnly("me.shedaniel.cloth:cloth-config:${rootProject.cloth_config_version}") { - exclude(group: "net.fabricmc.fabric-api") - } -} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 00000000..b282a12d --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,53 @@ +plugins { + id("net.fabricmc.fabric-loom") + id("maven-publish") +} + +val modId = project.property("mod_id") as String +val javaVersion = project.property("java_version") as String +val minecraftVersion = project.property("minecraft_version") as String +val fabricLoaderVersion = project.property("fabric_loader_version") as String + +val clothConfigVersion = project.property("cloth_config_version") as String + +base { + archivesName = "$modId-$minecraftVersion-fabric" +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersion)) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(javaVersion.toInt()) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraftVersion") + + // We depend on Fabric Loader here to use mixin and the Fabric @Environment annotations, + // compileOnly so it doesn't leak into neoforge's runtime classpath + compileOnly("net.fabricmc:fabric-loader:$fabricLoaderVersion") + + // Cloth Config + compileOnly("me.shedaniel.cloth:cloth-config:$clothConfigVersion") { + exclude(group = "net.fabricmc.fabric-api") + } +} + +loom { + accessWidenerPath.set(file("src/main/resources/realcamera.accesswidener")) +} + +publishing { + publications { + register("commonJar") { + artifactId = base.archivesName.get() + from(components["java"]) + } + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java index a951ab39..0fa37732 100644 --- a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java +++ b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java @@ -3,37 +3,38 @@ import com.mojang.blaze3d.platform.InputConstants; import com.xtracr.realcamera.config.ConfigFile; import com.xtracr.realcamera.gui.ModelViewScreen; -import com.xtracr.realcamera.util.LocUtil; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.resources.Identifier; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; public final class KeyMappings { - private static final Map> KEY_MAPPINGS = new HashMap<>(); + public static final KeyMapping.Category GENERAL = new KeyMapping.Category(Identifier.fromNamespaceAndPath(RealCamera.FULL_ID, "general")); public static final KeyMapping MODEL_VIEW_SCREEN; + private static final Map> KEY_MAPPINGS = new HashMap<>(); static { MODEL_VIEW_SCREEN = createKeyMapping("modelViewScreen", client -> client.setScreen(new ModelViewScreen())); - createKeyMapping("togglePerspective", InputConstants.KEY_F6, client -> { + createKeyMapping("togglePerspective", InputConstants.KEY_F6, _ -> { boolean enabled = ConfigFile.config().enabled(); ConfigFile.load(); ConfigFile.config().setEnabled(!enabled); RealCameraCore.reset(); }); - createKeyMapping("toggleAdjustMode", client -> ConfigFile.config().cycleAdjustMode()); - createKeyMapping("toggleCameraMode", client -> ConfigFile.config().setClassic(!ConfigFile.config().isClassic())); - createKeyMapping("adjustFRONT", client -> ConfigFile.config().adjustOffsetX(1)); - createKeyMapping("adjustBACK", client -> ConfigFile.config().adjustOffsetX(-1)); - createKeyMapping("adjustUP", client -> ConfigFile.config().adjustOffsetY(1)); - createKeyMapping("adjustDOWN", client -> ConfigFile.config().adjustOffsetY(-1)); - createKeyMapping("adjustLEFT", client -> ConfigFile.config().adjustOffsetZ(1)); - createKeyMapping("adjustRIGHT", client -> ConfigFile.config().adjustOffsetZ(-1)); - createKeyMapping("activeConfigIndexNEXT", client -> ConfigFile.config().binding.activeConfigIndex += 1); - createKeyMapping("activeConfigIndexPREV", client -> ConfigFile.config().binding.activeConfigIndex -= 1); - createKeyMapping("activeConfigIndexRESET", client -> ConfigFile.config().binding.activeConfigIndex = 0); + createKeyMapping("toggleAdjustMode", _ -> ConfigFile.config().cycleAdjustMode()); + createKeyMapping("toggleCameraMode", _ -> ConfigFile.config().setClassic(!ConfigFile.config().isClassic())); + createKeyMapping("adjustFRONT", _ -> ConfigFile.config().adjustOffsetX(1)); + createKeyMapping("adjustBACK", _ -> ConfigFile.config().adjustOffsetX(-1)); + createKeyMapping("adjustUP", _ -> ConfigFile.config().adjustOffsetY(1)); + createKeyMapping("adjustDOWN", _ -> ConfigFile.config().adjustOffsetY(-1)); + createKeyMapping("adjustLEFT", _ -> ConfigFile.config().adjustOffsetZ(1)); + createKeyMapping("adjustRIGHT", _ -> ConfigFile.config().adjustOffsetZ(-1)); + createKeyMapping("activeConfigIndexNEXT", _ -> ConfigFile.config().binding.activeConfigIndex += 1); + createKeyMapping("activeConfigIndexPREV", _ -> ConfigFile.config().binding.activeConfigIndex -= 1); + createKeyMapping("activeConfigIndexRESET", _ -> ConfigFile.config().binding.activeConfigIndex = 0); } private static KeyMapping createKeyMapping(String id, Consumer whenPressed) { @@ -41,7 +42,7 @@ private static KeyMapping createKeyMapping(String id, Consumer whenPr } private static KeyMapping createKeyMapping(String id, int code, Consumer whenPressed) { - KeyMapping keyMapping = new KeyMapping("key." + RealCamera.FULL_ID + "." + id, code, LocUtil.KEY_MOD_NAME); + KeyMapping keyMapping = new KeyMapping("key." + RealCamera.FULL_ID + "." + id, code, GENERAL); KEY_MAPPINGS.put(keyMapping, whenPressed); return keyMapping; } diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index a860ecf3..18ad5f6e 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -1,25 +1,33 @@ package com.xtracr.realcamera; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import com.xtracr.realcamera.api.BindResult; import com.xtracr.realcamera.api.RealCameraAPI; import com.xtracr.realcamera.compat.DisableHelper; import com.xtracr.realcamera.config.BindTarget; import com.xtracr.realcamera.config.BindTarget.DisableConfig; import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.util.*; +import com.xtracr.realcamera.renderer.BuiltIterableBuffer; +import com.xtracr.realcamera.renderer.MultiVertexCatcher; +import com.xtracr.realcamera.renderer.RoutingSubmitCollector; +import com.xtracr.realcamera.renderer.state.VertexData; +import com.xtracr.realcamera.util.CameraTransform; +import com.xtracr.realcamera.util.LocUtil; +import com.xtracr.realcamera.util.MathUtil; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.util.Mth; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; +import org.joml.Matrix3f; import org.joml.Matrix4f; public class RealCameraCore { + private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); + private static final CameraTransform smoothedCamera = new CameraTransform(); private static BindResult lastResult = BindResult.EMPTY, newResult = BindResult.EMPTY; - private static Vec3 cameraPos = Vec3.ZERO, eulerAngle = Vec3.ZERO; private static boolean active = false, rendering = false; private static int failureFrames = 0; @@ -35,66 +43,47 @@ public static BindTarget currentTarget() { return lastResult.target; } - public static void initialize(Minecraft client) { + public static void initialize(Minecraft client, boolean renderLevel) { Entity entity = client.getCameraEntity(); - active = ConfigFile.config().enabled() && client.options.getCameraType().isFirstPerson() && entity != null && !DisableHelper.MAIN_FEATURE.disabled(entity); + active = renderLevel && ConfigFile.config().enabled() && client.options.getCameraType().isFirstPerson() && entity != null && !DisableHelper.MAIN_FEATURE.disabled(entity); rendering = ConfigFile.config().renderModel() && !DisableHelper.RENDER_MODEL.disabled(entity); } public static void reset() { - cameraPos = eulerAngle = Vec3.ZERO; + smoothedCamera.setPosition(Vec3.ZERO); + smoothedCamera.setRotation(new Matrix3f()); failureFrames = 0; } - public static float getPitch(float f) { - if (currentTarget().bindConfig().bindRotation()) return (float) eulerAngle.x(); - return f; - } - - public static float getYaw(float f) { - if (currentTarget().bindConfig().bindRotation()) return (float) -eulerAngle.y(); - return f; - } - - public static float getRoll(float f) { - if (ConfigFile.config().isClassic()) return f + ConfigFile.config().getClassicRoll(); - if (currentTarget().bindConfig().bindRotation()) return (float) eulerAngle.z(); - return f; - } - public static Vec3 getRawPos(Vec3 cameraPos, Vec3 entityPos) { - Vec3 rawPos = SmoothUtil.smoothPosition(lastResult.getPosition()).add(entityPos); + Vec3 rawPos = smoothedCamera.getPosition().add(entityPos); BindTarget.BindConfig bindConfig = currentTarget().bindConfig(); return new Vec3(bindConfig.bindX() ? rawPos.x() : cameraPos.x(), bindConfig.bindY() ? rawPos.y() : cameraPos.y(), bindConfig.bindZ() ? rawPos.z() : cameraPos.z()); } - public static Vec3 getCameraPos(Vec3 vec) { - BindTarget.BindConfig bindConfig = currentTarget().bindConfig(); - return new Vec3(bindConfig.bindX() ? cameraPos.x() : vec.x(), bindConfig.bindY() ? cameraPos.y() : vec.y(), bindConfig.bindZ() ? cameraPos.z() : vec.z()); - } - - public static void setCameraPos(Vec3 vec) { - cameraPos = vec; + public static Vec3 getEulerAngle(float pitch, float yaw, float roll) { + if (!currentTarget().bindConfig().bindRotation()) return new Vec3(pitch, yaw, roll); + double scale = Math.toDegrees(1); + return MathUtil.getEulerAngleYXZ(smoothedCamera.getRotation()).multiply(scale, -scale, scale); } - public static void computeCamera(Minecraft client, float deltaTick) { + public static void computeCamera(Minecraft client, float partialTicks) { Entity entity = client.getCameraEntity(); boolean invisible = entity.isInvisible(); entity.setInvisible(false); - newResult = RealCameraAPI.computeBindResult(client, deltaTick); + newResult = RealCameraAPI.computeBindResult(client, partialTicks); if (!newResult.available()) { EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); - MultiVertexCatcher catcher = MultiVertexCatcher.defaultImpl(); - dispatcher.render(entity, 0, 0, 0, Mth.lerp(deltaTick, entity.yRotO, entity.getYRot()), deltaTick, new PoseStack(), catcher, dispatcher.getPackedLightCoords(entity, deltaTick)); - catcher.endCatching(RealCameraCore::computeBindResult); + dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, new PoseStack(), vertexCatcher.initCollector()); + vertexCatcher.endCatching(RealCameraCore::computeBindResult); } entity.setInvisible(invisible); if (newResult.available()) { failureFrames = 0; - lastResult = newResult.computeCamera(); + lastResult = newResult.computeCamera(false); } else { failureFrames++; - Entity player = client.player; + Player player = client.player; int retentionFrames = ConfigFile.config().getBindResultRetentionFrames(); if (!ConfigFile.config().hideBindingFailureMessage() && failureFrames == retentionFrames + 1 && player != null) { player.sendSystemMessage(LocUtil.MESSAGE("bindingFailed", LocUtil.MOD_NAME(), LocUtil.MODEL_VIEW_TITLE(), KeyMappings.MODEL_VIEW_SCREEN.getTranslatedKeyMessage())); @@ -105,10 +94,11 @@ public static void computeCamera(Minecraft client, float deltaTick) { return; } } - eulerAngle = MathUtil.getEulerAngleYXZ(SmoothUtil.smoothRotation(lastResult.getRotation())).scale(Math.toDegrees(1)); + smoothedCamera.lerpPosition(lastResult.getPosition(), 1 - ConfigFile.config().getDisplacementSmoothFactor()); + smoothedCamera.slerpRotation(lastResult.getRotation(), 1 - ConfigFile.config().getRotationSmoothFactor()); } - public static void renderCameraEntity(Minecraft client, float deltaTick, MultiBufferSource bufferSource, Matrix4f modelView) { + public static void renderCameraEntity(Minecraft client, float partialTicks, SubmitNodeCollector submitNodeCollector, Matrix4f modelView) { Vec3 targetEulerAngle = MathUtil.getEulerAngleYXZ(lastResult.getRotation()); Matrix4f invertedCameraPose = new Matrix4f() .rotateZ((float) targetEulerAngle.z()) @@ -118,33 +108,33 @@ public static void renderCameraEntity(Minecraft client, float deltaTick, MultiBu .invert() .translate(Vec3.ZERO.subtract(lastResult.getPosition()).toVector3f()); PoseStack poseStack = new PoseStack(); - poseStack.mulPose(new Matrix4f(invertedCameraPose).mulLocal(modelView.invert(new Matrix4f()))); + poseStack.mulPose(modelView.invert(new Matrix4f())); + poseStack.mulPose(invertedCameraPose); Entity entity = client.getCameraEntity(); EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); - MultiVertexCatcher catcher = MultiVertexCatcher.defaultImpl(); - dispatcher.render(entity, 0, 0, 0, Mth.lerp(deltaTick, entity.yRotO, entity.getYRot()), deltaTick, poseStack, catcher, dispatcher.getPackedLightCoords(entity, deltaTick)); + SubmitNodeCollector collector = new RoutingSubmitCollector(submitNodeCollector, vertexCatcher.initCollector()); + dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, collector); final float m02 = modelView.m02(), m12 = modelView.m12(), m22 = modelView.m22(), m32 = modelView.m32(); final float depth = currentTarget().disablingDepth(); - catcher.endCatching(builtBuffer -> { + vertexCatcher.endCatching(builtBuffer -> { DisableConfig[] disableConfigs = currentTarget().filteredDisableConfigs(config -> builtBuffer.textureId().contains(config.textureId())); - for (DisableConfig config : disableConfigs) { - if (config.disableAll()) return; - } - VertexConsumer buffer = bufferSource.getBuffer(builtBuffer.renderType()); - if (!builtBuffer.renderType().canConsolidateConsecutiveGeometry()) { - for (VertexData vertex : builtBuffer.vertexBuffer()) vertex.render(buffer); - return; - } - builtBuffer.vertexBuffer().primitiveStream().forEach(primitive -> { - primitiveFor: - for (VertexData vertex : primitive) { - if (Math.fma(m02, vertex.x(), Math.fma(m12, vertex.y(), Math.fma(m22, vertex.z(), m32))) > -depth) continue; - for (DisableConfig config : disableConfigs) { - if (config.disable(vertex)) continue primitiveFor; - } - for (VertexData vertexData : primitive) vertexData.render(buffer); - break; + for (DisableConfig config : disableConfigs) if (config.disableAll()) return; + submitNodeCollector.submitCustomGeometry(poseStack, builtBuffer.renderType(), (_, buffer) -> { + if (!builtBuffer.renderType().canConsolidateConsecutiveGeometry()) { + for (VertexData vertex : builtBuffer.vertexBuffer()) vertex.render(buffer); + return; } + builtBuffer.vertexBuffer().primitiveStream().forEach(primitive -> { + primitiveFor: + for (VertexData vertex : primitive) { + if (Math.fma(m02, vertex.x(), Math.fma(m12, vertex.y(), Math.fma(m22, vertex.z(), m32))) > -depth) continue; + for (DisableConfig config : disableConfigs) { + if (config.disable(vertex)) continue primitiveFor; + } + for (VertexData vertexData : primitive) vertexData.render(buffer); + break; + } + }); }); }); } @@ -153,7 +143,7 @@ private static void computeBindResult(BuiltIterableBuffer builtBuffer) { if (newResult.available()) return; targetFor: for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { - BindResult result = new BindResult(target, false); + BindResult result = new BindResult(target); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV[] uvs = {new VertexData.UV(config.posU(), config.posV()), new VertexData.UV(config.forwardU(), config.forwardV()), new VertexData.UV(config.upwardU(), config.upwardV())}; VertexData[][] primitives = builtBuffer.findPrimitivesInCache(uvs); diff --git a/common/src/main/java/com/xtracr/realcamera/api/BindResult.java b/common/src/main/java/com/xtracr/realcamera/api/BindResult.java index dd7bda3d..dd4051a2 100644 --- a/common/src/main/java/com/xtracr/realcamera/api/BindResult.java +++ b/common/src/main/java/com/xtracr/realcamera/api/BindResult.java @@ -2,22 +2,19 @@ import com.xtracr.realcamera.config.BindTarget; import com.xtracr.realcamera.config.ConfigFile; +import com.xtracr.realcamera.util.CameraTransform; import net.minecraft.world.phys.Vec3; -import org.joml.Matrix3f; import org.joml.Vector3f; import java.util.List; -public class BindResult { - public static final BindResult EMPTY = new BindResult(BindTarget.EMPTY, false); +public class BindResult extends CameraTransform { + public static final BindResult EMPTY = new BindResult(BindTarget.EMPTY); public final BindTarget target; - protected final Matrix3f rotation = new Matrix3f(); - protected final boolean mirrored; - private Vec3 position = Vec3.ZERO, forward = Vec3.ZERO, upward = Vec3.ZERO; + private Vec3 forward = Vec3.ZERO, upward = Vec3.ZERO; - public BindResult(BindTarget target, boolean mirrored) { + public BindResult(BindTarget target) { this.target = target; - this.mirrored = mirrored; } public static BindResult getOrCreate(String name) { @@ -30,7 +27,7 @@ public static BindResult getOrCreate(String name) { fixedTargets.add(blank); return blank; }); - return new BindResult(target, false); + return new BindResult(target); } public boolean available() { @@ -41,14 +38,6 @@ public boolean weakAvailable() { return !target.isEmpty() && (forward != Vec3.ZERO || upward != Vec3.ZERO || position != Vec3.ZERO) && Double.isFinite(position.lengthSqr()); } - public Vec3 getPosition() { - return position; - } - - public void setPosition(Vec3 vec) { - position = vec; - } - public Vec3 getForward() { return forward; } @@ -65,11 +54,7 @@ public void setUpward(Vec3 vec) { upward = vec.normalize(); } - public Matrix3f getRotation() { - return rotation; - } - - public BindResult computeCamera() { + public BindResult computeCamera(boolean mirrored) { if (!available()) return this; final int orientation = mirrored ? -1 : 1; upward = forward.cross(upward.cross(forward)).normalize(); diff --git a/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java b/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java index fb0c0ed4..c91225bb 100644 --- a/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java +++ b/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java @@ -22,9 +22,9 @@ public static void registerFunction(int priority, BiFunction PRIORITIES.get(b) - PRIORITIES.get(a)); } - public static BindResult computeBindResult(Minecraft client, float deltaTick) { + public static BindResult computeBindResult(Minecraft client, float partialTicks) { for (BiFunction function : FUNCTIONS) { - BindResult result = function.apply(client, deltaTick); + BindResult result = function.apply(client, partialTicks); if (result.available()) return result; } return BindResult.EMPTY; diff --git a/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java index ecb8512f..5f481a36 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java @@ -1,10 +1,6 @@ package com.xtracr.realcamera.compat; import com.xtracr.realcamera.RealCamera; -import com.xtracr.realcamera.RealCameraCore; -import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.mixin.accessor.CameraAccessor; -import net.minecraft.client.Camera; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -26,7 +22,7 @@ public static void initialize(PlatformHelper platformHelper) { if (isModLoaded("freecam")) try { Class FC_Freecam = Class.forName("net.xolt.freecam.Freecam"); Method FC_Freecam_isEnabled = FC_Freecam.getDeclaredMethod("isEnabled"); - DisableHelper.MAIN_FEATURE.registerOr(player -> { + DisableHelper.MAIN_FEATURE.registerOr(_ -> { try { return (boolean) FC_Freecam_isEnabled.invoke(null); } catch (Exception ignored) { @@ -49,7 +45,7 @@ public static void initialize(PlatformHelper platformHelper) { Class SBW_ClientEventHandler = Class.forName("com.atsuishio.superbwarfare.event.ClientEventHandler"); SBW_ClientEventHandler_zoomTime = SBW_ClientEventHandler.getDeclaredField("zoomTime"); SBW_VehicleEntity = Class.forName("com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity"); - DisableHelper.MAIN_FEATURE.registerOrInBinding(player -> CompatibilityHelper.SBW_gunsIsZooming()); + DisableHelper.MAIN_FEATURE.registerOrInBinding(_ -> CompatibilityHelper.SBW_gunsIsZooming()); DisableHelper.MAIN_FEATURE.registerOrInBinding(CompatibilityHelper::SBW_isDrivingVehicle); } catch (Exception e) { RealCamera.LOGGER.warn("Compatibility with SuperbWarfare is outdated: [{}] {}", e.getClass().getName(), e.getMessage()); @@ -73,21 +69,15 @@ private static boolean SBW_isDrivingVehicle(Player player) { } } - public static void NEA_setDeltaTick(float deltaTick) { + public static void NEA_setDeltaTick(float partialTicks) { if (NEA_playerTransformer_setDeltaTick != null) try { Object INSTANCE = NEA_NEAnimationsLoader_INSTANCE.get(null); Object playerTransformer = NEA_NEAnimationsLoader_playerTransformer.get(INSTANCE); - NEA_playerTransformer_setDeltaTick.invoke(playerTransformer, deltaTick); + NEA_playerTransformer_setDeltaTick.invoke(playerTransformer, partialTicks); } catch (Exception ignored) { } } - public static void forceSetCameraPos(Camera camera) { - if (RealCameraCore.isActive() && !ConfigFile.config().isClassic()) { - ((CameraAccessor) camera).invokeSetPosition(RealCameraCore.getCameraPos(camera.getPosition())); - } - } - public static boolean isModLoaded(String modId) { return platformHelper.isModLoaded(modId); } diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index dd189ced..015ea304 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -3,7 +3,7 @@ import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.config.ConfigFile; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -15,19 +15,20 @@ import java.util.function.Predicate; public class DisableHelper { - private static final Predicate FALSE = player -> false; + public static final Entry MAIN_FEATURE, RENDER_MODEL, RENDER_HANDS; + private static final Predicate FALSE = _ -> false; private static final Map entries = new HashMap<>(); - public static final Entry MAIN_FEATURE = new Entry("mainFeature", player -> player.isSleeping() || player.isSpectator()); - public static final Entry RENDER_MODEL = new Entry("renderModel", FALSE, Player::isScoping); - public static final Entry RENDER_HANDS = new Entry("renderHands", player -> RealCameraCore.isRendering()); public static int exitTick = 0; static { + MAIN_FEATURE = new Entry("mainFeature", player -> player.isSleeping() || player.isSpectator()); + RENDER_MODEL = new Entry("renderModel", FALSE, Player::isScoping); + RENDER_HANDS = new Entry("renderHands", _ -> RealCameraCore.isRendering()); MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSneaking() && player.isCrouching()); MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSneaking() && player.isCrouching()); MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSwimming() && checkCondition(player, player.isSwimming(), ConfigFile.config().getBindingOutTick())); MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSwimming() && checkCondition(player, player.isSwimming(), ConfigFile.config().getClassicOutTick())); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenCrawling() && checkCondition(player, player.isVisuallyCrawling(), ConfigFile.config().getBindingOutTick())); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenCrawling() && checkCondition(player, player.isVisuallyCrawling(), ConfigFile.config().getBindingOutTick())); MAIN_FEATURE.registerOrInBinding(player -> { Item mainHand = player.getMainHandItem().getItem(); Item offHand = player.getOffhandItem().getItem(); @@ -69,10 +70,10 @@ public static void registerOr(String name, Predicate predicate) { public static boolean matchesItemPattern(Item item, String pattern) { if (pattern.startsWith("#")) { String tagId = pattern.substring(1); - TagKey itemTag = TagKey.create(BuiltInRegistries.ITEM.key(), ResourceLocation.parse(tagId)); - return BuiltInRegistries.ITEM.getTag(itemTag) - .map(tag -> tag.contains(BuiltInRegistries.ITEM.wrapAsHolder(item))) - .orElse(false); + TagKey itemTag = TagKey.create(BuiltInRegistries.ITEM.key(), Identifier.parse(tagId)); + return BuiltInRegistries.ITEM.get(itemTag) + .map(tag -> tag.contains(BuiltInRegistries.ITEM.wrapAsHolder(item))) + .orElse(false); } return simpleWildcardMatch(BuiltInRegistries.ITEM.getKey(item).toString(), pattern); } diff --git a/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java b/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java index a0575ab8..e12c664f 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java @@ -4,15 +4,12 @@ import com.xtracr.realcamera.api.BindResult; import com.xtracr.realcamera.api.RealCameraAPI; import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.mixin.accessor.PlayerRendererAccessor; +import com.xtracr.realcamera.mixin.accessor.AvatarRendererAccessor; import net.minecraft.client.Minecraft; -import net.minecraft.client.model.PlayerModel; import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.entity.player.AvatarRenderer; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; @@ -23,79 +20,35 @@ public static void register() { RealCameraAPI.registerFunction(100, LegacyBindingMode::computeBindResult); } - private static BindResult computeBindResult(Minecraft client, float deltaTick) { + @SuppressWarnings("unchecked") + private static BindResult computeBindResult(Minecraft client, float partialTicks) { if (!ConfigFile.config().legacyBindingMode()) return BindResult.EMPTY; PoseStack poseStack = new PoseStack(); AbstractClientPlayer player = client.player; // WorldRenderer.render // EntityRenderDispatcher.render - PlayerRenderer playerRenderer = (PlayerRenderer) client.getEntityRenderDispatcher().getRenderer(player); - Vec3 renderOffset = playerRenderer.getRenderOffset(player, deltaTick); + AvatarRenderer playerRenderer = (AvatarRenderer) client.getEntityRenderDispatcher().getRenderer(player); + AvatarRenderState renderState = playerRenderer.createRenderState(player, partialTicks); + Vec3 renderOffset = playerRenderer.getRenderOffset(renderState); poseStack.translate(renderOffset.x(), renderOffset.y(), renderOffset.z()); - // PlayerEntityRenderer.render - ((PlayerRendererAccessor) playerRenderer).invokeSetModelProperties(player); // LivingEntityRenderer.render - PlayerModel playerModel = playerRenderer.getModel(); - playerModel.attackTime = player.getAttackAnim(deltaTick); - playerModel.riding = player.isPassenger(); - playerModel.young = player.isBaby(); - float h = Mth.rotLerp(deltaTick, player.yBodyRotO, player.yBodyRot); - float j = Mth.rotLerp(deltaTick, player.yHeadRotO, player.yHeadRot); - float k = j - h; - if (player.isPassenger() && player.getVehicle() instanceof LivingEntity livingEntity) { - h = Mth.rotLerp(deltaTick, livingEntity.yBodyRotO, livingEntity.yBodyRot); - k = j - h; - float l = Mth.wrapDegrees(k); - if (l < -85.0F) { - l = -85.0F; - } - if (l >= 85.0F) { - l = 85.0F; - } - h = j - l; - if (l * l > 2500.0F) { - h += l * 0.2F; - } - k = j - h; - } - float m = Mth.lerp(deltaTick, player.xRotO, player.getXRot()); - if (LivingEntityRenderer.isEntityUpsideDown(player)) { - m *= -1.0F; - k *= -1.0F; - } - k = Mth.wrapDegrees(k); - if (player.hasPose(Pose.SLEEPING)) { - Direction direction = player.getBedOrientation(); + if (renderState.hasPose(Pose.SLEEPING)) { + Direction direction = renderState.bedOrientation; if (direction != null) { - float n = player.getEyeHeight(Pose.STANDING) - 0.1F; - poseStack.translate((float)(-direction.getStepX()) * n, 0.0F, (float)(-direction.getStepZ()) * n); - } - } - float lx = player.getScale(); - poseStack.scale(lx, lx, lx); - float n = player.tickCount + deltaTick; - ((PlayerRendererAccessor) playerRenderer).invokeSetupRotations(player, poseStack, n, h, deltaTick, lx); - poseStack.scale(-1.0F, -1.0F, 1.0F); - ((PlayerRendererAccessor) playerRenderer).invokeScale(player, poseStack, deltaTick); - poseStack.translate(0.0F, -1.501F, 0.0F); - float o = 0.0F; - float p = 0.0F; - if (!player.isPassenger() && player.isAlive()) { - o = player.walkAnimation.speed(deltaTick); - p = player.walkAnimation.position(deltaTick); - if (player.isBaby()) { - p *= 3.0F; - } - - if (o > 1.0F) { - o = 1.0F; + float f = renderState.eyeHeight - 0.1f; + poseStack.translate((float) (-direction.getStepX()) * f, 0.0f, (float) (-direction.getStepZ()) * f); } } - playerModel.prepareMobModel(player, p, o, deltaTick); - playerModel.setupAnim(player, p, o, n, k, m); + float scale = renderState.scale; + poseStack.scale(scale, scale, scale); + ((AvatarRendererAccessor) playerRenderer).invokeSetupRotations(renderState, poseStack, renderState.bodyRot, scale); + poseStack.scale(-1.0f, -1.0f, 1.0f); + ((AvatarRendererAccessor) playerRenderer).invokeScale(renderState, poseStack); + poseStack.translate(0.0f, -1.501f, 0.0f); + playerRenderer.getModel().setupAnim(renderState); // AnimalModel.render // ModelPart.render - playerModel.head.translateAndRotate(poseStack); + playerRenderer.getModel().head.translateAndRotate(poseStack); Vector4f offset = poseStack.last().pose().transform(new Vector4f(0, -0.125f, -0.2f, 1.0f)); BindResult result = BindResult.getOrCreate("LEGACY_MODE"); diff --git a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java index 4a9822dc..1a2d846c 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java @@ -5,12 +5,12 @@ import com.xtracr.realcamera.api.RealCameraAPI; import com.xtracr.realcamera.config.BindTarget; import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.util.BuiltIterableBuffer; -import com.xtracr.realcamera.util.MultiVertexCatcher; -import com.xtracr.realcamera.util.VertexData; +import com.xtracr.realcamera.renderer.BuiltIterableBuffer; +import com.xtracr.realcamera.renderer.MultiVertexCatcher; +import com.xtracr.realcamera.renderer.state.VertexData; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.util.Mth; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; import org.joml.Matrix3f; @@ -20,12 +20,13 @@ import java.util.Map; public class YSMCompat { + private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); private static final Map resultMap = new HashMap<>(); private static final TransformedVertexRecorder[] transformedRecorders = new TransformedVertexRecorder[4]; private static BindResult bindResult = BindResult.EMPTY; private static boolean allCached = false; - static { + static { final float pitch = 1.9106332f, yaw = 2.0943951f; transformedRecorders[0] = new TransformedVertexRecorder(); transformedRecorders[1] = new TransformedVertexRecorder().setRotation(pitch, 0); @@ -37,7 +38,7 @@ public static void register() { RealCameraAPI.registerFunction(-100, YSMCompat::computeBindResult); } - private static BindResult computeBindResult(Minecraft client, float deltaTick) { + private static BindResult computeBindResult(Minecraft client, float partialTicks) { resultMap.clear(); bindResult = BindResult.EMPTY; allCached = true; @@ -47,9 +48,8 @@ private static BindResult computeBindResult(Minecraft client, float deltaTick) { for (TransformedVertexRecorder transformedRecorder : transformedRecorders) { poseStack.pushPose(); poseStack.mulPose(transformedRecorder.matrix4f.invert(new Matrix4f())); - MultiVertexCatcher catcher = MultiVertexCatcher.defaultImpl(); - dispatcher.render(entity, 0, 0, 0, Mth.lerp(deltaTick, entity.yRotO, entity.getYRot()), deltaTick, poseStack, catcher, dispatcher.getPackedLightCoords(entity, deltaTick)); - catcher.endCatching(transformedRecorder::computeBindResultInCache); + dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, vertexCatcher.initCollector()); + vertexCatcher.endCatching(transformedRecorder::computeBindResultInCache); poseStack.popPose(); if (bindResult.available()) return bindResult; } @@ -57,9 +57,8 @@ private static BindResult computeBindResult(Minecraft client, float deltaTick) { for (TransformedVertexRecorder transformedRecorder : transformedRecorders) { poseStack.pushPose(); poseStack.mulPose(transformedRecorder.matrix4f.invert(new Matrix4f())); - MultiVertexCatcher catcher = MultiVertexCatcher.defaultImpl(); - dispatcher.render(entity, 0, 0, 0, Mth.lerp(deltaTick, entity.yRotO, entity.getYRot()), deltaTick, poseStack, catcher, dispatcher.getPackedLightCoords(entity, deltaTick)); - catcher.endCatching(transformedRecorder::computeBindResult); + dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, vertexCatcher.initCollector()); + vertexCatcher.endCatching(transformedRecorder::computeBindResult); poseStack.popPose(); if (bindResult.available()) return bindResult; } @@ -79,7 +78,7 @@ public TransformedVertexRecorder setRotation(float pitch, float yaw) { public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { - BindResult result = resultMap.computeIfAbsent(target, k -> new BindResult(target, false)); + BindResult result = resultMap.computeIfAbsent(target, _ -> new BindResult(target)); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = new VertexData.UV(config.posU(), config.posV()); VertexData.UV forwardUV = new VertexData.UV(config.forwardU(), config.forwardV()); @@ -101,7 +100,7 @@ public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { public void computeBindResult(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { - BindResult result = resultMap.computeIfAbsent(target, k -> new BindResult(target, false)); + BindResult result = resultMap.computeIfAbsent(target, _ -> new BindResult(target)); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = result.getPosition() == Vec3.ZERO ? new VertexData.UV(config.posU(), config.posV()) : null; VertexData.UV forwardUV = result.getForward() == Vec3.ZERO ? new VertexData.UV(config.forwardU(), config.forwardV()) : null; diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index 290bae3f..3f5dc027 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -4,7 +4,7 @@ import com.google.gson.annotations.JsonAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import com.xtracr.realcamera.util.VertexData; +import com.xtracr.realcamera.renderer.state.VertexData; import it.unimi.dsi.fastutil.floats.Float2ObjectOpenHashMap; import it.unimi.dsi.fastutil.floats.FloatOpenHashSet; import net.minecraft.network.FriendlyByteBuf; @@ -24,7 +24,7 @@ public record BindTarget( DisableConfig[] disableConfigs) { public static final List defaultTargets; public static final BindTarget EMPTY = blank(null, null); - private static final short serialVersion = 703; + private static final short serialVersion = 703; // 0.7.3 static { defaultTargets = List.of( @@ -43,7 +43,8 @@ public static BindTarget blank(String name, String textureId) { public static BindTarget read(FriendlyByteBuf byteBuf) throws IllegalArgumentException { short version = byteBuf.readShort(); - if (version != serialVersion) throw new IllegalArgumentException("Invalid version: " + version + ", expected " + serialVersion); + if (version != serialVersion) + throw new IllegalArgumentException("Invalid version: " + version + ", expected " + serialVersion); String name = byteBuf.readUtf(); String textureId = byteBuf.readUtf(); int priority = byteBuf.readVarInt(); @@ -66,7 +67,7 @@ private static BindTarget vanillaTarget(String name, int priority, boolean shoul DisableConfig playerHead = new DisableConfig("player_head", textureId, false, new UVRectangle[]{new UVRectangle(0, 0, 1.0f, 0.25f)}); DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, new UVRectangle[0]); DisableConfig[] disableConfigs = new DisableConfig[]{playerHead, dragonHead}; - return new BindTarget(name, textureId, priority, 0.1f, targetConfig, bindConfig, offsets, disableConfigs); + return new BindTarget(name, textureId, priority, 0.2f, targetConfig, bindConfig, offsets, disableConfigs); } public boolean isEmpty() { @@ -270,10 +271,10 @@ public boolean disable(VertexData vertex) { } for (UVRectangle rect : rectangles) { if (!rect.contains(u, v)) continue; - disableCacheMap.computeIfAbsent(u, k -> new FloatOpenHashSet()).add(v); + disableCacheMap.computeIfAbsent(u, _ -> new FloatOpenHashSet()).add(v); return true; } - disableCacheMap.computeIfAbsent(u, k -> new FloatOpenHashSet()).add(-v); + disableCacheMap.computeIfAbsent(u, _ -> new FloatOpenHashSet()).add(-v); return false; } diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 5c5a5859..1a56ded3 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -192,36 +192,37 @@ public static Screen create(Screen parent) { .setSaveConsumer(d -> config.binding.rotationSmoothFactor = d) .build()); SubCategoryBuilder disableConfig = entryBuilder.startSubCategory(LocUtil.CONFIG_OPTION("disableConfig")); - disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSneaking"), config.binding.disableWhenSneaking) - .setDefaultValue(false) - .setSaveConsumer(b -> config.binding.disableWhenSneaking = b) - .build()); - disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenCrawling"), config.binding.disableWhenCrawling) - .setDefaultValue(false) - .setSaveConsumer(b -> config.binding.disableWhenCrawling = b) - .build()); - disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSwimming"), config.binding.disableWhenSwimming) - .setDefaultValue(false) - .setSaveConsumer(b -> config.binding.disableWhenSwimming = b) - .build()); - disableConfig.add(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("outTick"), config.binding.outTick) - .setDefaultValue(13) - .setMin(0) - .setMax(40) - .setTooltip(LocUtil.CONFIG_TOOLTIP("outTick")) - .setSaveConsumer(i -> config.binding.outTick = i) - .build()); - disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) - .setDefaultValue(List.of()) - .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) - .setSaveConsumer(l -> config.binding.disableMainFeatureItems = l) - .build()); - disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableRenderItems"), config.binding.disableRenderItems) - .setDefaultValue(ModConfig.Binding.defaultDisableRenderItems) - .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) - .setSaveConsumer(l -> config.binding.disableRenderItems = l) - .build()); + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSneaking"), config.binding.disableWhenSneaking) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenSneaking = b) + .build()); + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenCrawling"), config.binding.disableWhenCrawling) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenCrawling = b) + .build()); + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSwimming"), config.binding.disableWhenSwimming) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenSwimming = b) + .build()); + disableConfig.add(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("outTick"), config.binding.outTick) + .setDefaultValue(13) + .setMin(0) + .setMax(40) + .setTooltip(LocUtil.CONFIG_TOOLTIP("outTick")) + .setSaveConsumer(i -> config.binding.outTick = i) + .build()); + disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) + .setDefaultValue(List.of()) + .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) + .setSaveConsumer(l -> config.binding.disableMainFeatureItems = l) + .build()); + disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableRenderItems"), config.binding.disableRenderItems) + .setDefaultValue(ModConfig.Binding.defaultDisableRenderItems) + .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) + .setSaveConsumer(l -> config.binding.disableRenderItems = l) + .build()); binding.addEntry(disableConfig.build()); + return builder.build(); } } \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index c6b2f490..50c64ae3 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -177,7 +177,7 @@ public boolean hideBindingFailureMessage() { } public boolean bindingDisableWhenCrawling() { - return binding.disableWhenCrawling; + return binding.disableWhenCrawling; } public boolean bindingDisableWhenSneaking() { diff --git a/common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java b/common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java deleted file mode 100644 index a10c17bf..00000000 --- a/common/src/main/java/com/xtracr/realcamera/gui/CyclingTexturedButton.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.xtracr.realcamera.gui; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractButton; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.Nullable; - -import java.util.function.IntConsumer; - -public class CyclingTexturedButton extends AbstractButton { - protected final ResourceLocation texture; - protected final int textureWidth, textureHeight, u, v, vOffset, size; - @Nullable - private IntConsumer onValueChange; - private int value; - - public CyclingTexturedButton(int u, int v, int value, int size) { - this(0, 0, 16, 16, u, v, value, size); - } - - public CyclingTexturedButton(int x, int y, int width, int height, int u, int v, int value, int size) { - this(x, y, width, height, u, v, height, value, size, TexturedButton.ICON_TEXTURE, 256, 256); - } - - public CyclingTexturedButton(int x, int y, int width, int height, int u, int v, int vOffset, int value, int size, ResourceLocation texture, int textureWidth, int textureHeight) { - super(x, y, width, height, CommonComponents.EMPTY); - this.u = u; - this.v = v; - this.vOffset = vOffset; - this.size = size; - this.texture = texture; - this.textureWidth = textureWidth; - this.textureHeight = textureHeight; - setValue(value); - } - - public int getValue() { - return value; - } - - public void setValue(int value) { - this.value = (value % size + size) % size; - } - - public CyclingTexturedButton setOnValueChange(IntConsumer onValueChange) { - this.onValueChange = onValueChange; - return this; - } - - @Override - public void onPress() { - if (Screen.hasShiftDown()) setValue(value - 1); - else setValue(value + 1); - if (onValueChange != null) onValueChange.accept(value); - } - - @Override - public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick) { - graphics.fill(getX(), getY(), getX() + getWidth(), getY() + getHeight(), 0xFF646464); - graphics.blit(texture, getX(), getY(), u, v + value * vOffset, width, height, textureWidth, textureHeight); - if (isHoveredOrFocused()) graphics.renderOutline(getX(), getY(), getWidth(), getHeight(), 0xFFFFFFFF); - } - - @Override - protected void updateWidgetNarration(NarrationElementOutput builder) { - defaultButtonNarrationText(builder); - } -} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java b/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java index 8f7a8817..b31c9878 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java @@ -1,60 +1,76 @@ package com.xtracr.realcamera.gui; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.xtracr.realcamera.util.VertexData; -import net.minecraft.client.gui.GuiGraphics; +import com.xtracr.realcamera.mixin.accessor.GuiGraphicsExtractorAccessor; +import com.xtracr.realcamera.renderer.state.BuiltModelRecord; +import com.xtracr.realcamera.renderer.state.VertexData; +import com.xtracr.realcamera.renderer.state.gui.*; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.navigation.ScreenRectangle; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.gui.render.TextureSetup; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.world.phys.Vec3; +import org.joml.Matrix3x2f; import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; + +import java.util.List; public class GUIHelper { - public static void enableScissor(GuiGraphics graphics, ScreenRectangle rectangle) { + @Nullable + public static ScreenRectangle getBounds(int x0, int y0, int x1, int y1, Matrix3x2f pose, @Nullable ScreenRectangle scissorArea) { + ScreenRectangle scissorArea2 = new ScreenRectangle(x0, y0, x1 - x0, y1 - y0).transformMaxBounds(pose); + return scissorArea != null ? scissorArea.intersection(scissorArea2) : scissorArea2; + } + + public static void enableScissor(GuiGraphicsExtractor graphics, ScreenRectangle rectangle) { graphics.enableScissor(rectangle.left(), rectangle.top(), rectangle.right(), rectangle.bottom()); } - public static void fill(GuiGraphics graphics, float x0, float y0, float x1, float y1, int argb) { + public static void fill(GuiGraphicsExtractor graphics, float x0, float y0, float x1, float y1, int argb) { fill(graphics, x0, y0, x1, y1, 0, argb); } - public static void fill(GuiGraphics graphics, float x0, float y0, float x1, float y1, float z, int argb) { - Matrix4f matrix4f = graphics.pose().last().pose(); - if (x0 < x1) { - float o = x0; - x0 = x1; - x1 = o; - } - if (y0 < y1) { - float o = y0; - y0 = y1; - y1 = o; - } - VertexConsumer buffer = graphics.bufferSource().getBuffer(RenderType.gui()); - buffer.addVertex(matrix4f, x0, y0, z).setColor(argb); - buffer.addVertex(matrix4f, x0, y1, z).setColor(argb); - buffer.addVertex(matrix4f, x1, y1, z).setColor(argb); - buffer.addVertex(matrix4f, x1, y0, z).setColor(argb); - graphics.flush(); - } - - public static void renderOutline(GuiGraphics graphics, float x, float y, float width, float height, int argb) { + public static void fill(GuiGraphicsExtractor graphics, float x0, float y0, float x1, float y1, float z, int argb) { + ((GuiGraphicsExtractorAccessor) graphics).getGuiRenderState().addGuiElement(new ColoredFloatRectangleRenderState( + RenderPipelines.GUI, TextureSetup.noTexture(), new Matrix3x2f(graphics.pose()), + x0, y0, x1, y1, z, argb, ((GuiGraphicsExtractorAccessor) graphics).getScissorStack().peek())); + } + + public static void outline(GuiGraphicsExtractor graphics, float x, float y, float width, float height, int argb) { fill(graphics, x, y, x + width, y + 1, argb); fill(graphics, x, y + height - 1, x + width, y + height, argb); fill(graphics, x, y + 1, x + 1, y + height - 1, argb); fill(graphics, x + width - 1, y + 1, x + width, y + height - 1, argb); } - public static void renderPolygon(GuiGraphics graphics, VertexData[] polygon, float z, int argb) { - VertexConsumer buffer = graphics.bufferSource().getBuffer(RenderType.gui()); - for (VertexData vertex : polygon) buffer.addVertex(vertex.x(), vertex.y(), z).setColor(argb); - if (polygon.length == 3) buffer.addVertex(polygon[2].x(), polygon[2].y(), z).setColor(argb); - graphics.flush(); + public static void polygon(GuiGraphicsExtractor graphics, VertexData[] polygon, float z, int argb) { + if (polygon.length < 3) return; + float x0 = polygon[0].x(), y0 = polygon[0].y(); + float x1 = polygon[1].x(), y1 = polygon[1].y(); + float x2 = polygon[2].x(), y2 = polygon[2].y(); + float x3 = polygon.length > 3 ? polygon[3].x() : x2, y3 = polygon.length > 3 ? polygon[3].y() : y2; + ((GuiGraphicsExtractorAccessor) graphics).getGuiRenderState().addGuiElement(new ColoredFloatQuadRenderState( + RenderPipelines.GUI, TextureSetup.noTexture(), new Matrix3x2f(graphics.pose()), + x0, y0, z, x1, y1, z, x2, y2, z, x3, y3, z, argb, ((GuiGraphicsExtractorAccessor) graphics).getScissorStack().peek())); + } + + public static void vector(GuiGraphicsExtractor graphics, Vec3 start, Vec3 vector, float z, int argb) { + ((GuiGraphicsExtractorAccessor) graphics).getGuiRenderState().addGuiElement(new ColoredFloatLineRenderState( + RenderPipelines.GUI, TextureSetup.noTexture(), new Matrix3x2f(graphics.pose()), + (float) start.x(), (float) start.y(), z, + (float) vector.x(), (float) vector.y(), 0, argb, ((GuiGraphicsExtractorAccessor) graphics).getScissorStack().peek())); + } + + public static void culledModels(GuiGraphicsExtractor graphics, List records, float scale, Matrix4f transform, int x0, int y0, int x1, int y1) { + ((GuiGraphicsExtractorAccessor) graphics).getGuiRenderState().addPicturesInPictureState( + new GuiCulledModelsRenderState(records, transform, x0, y0, x1, y1, scale, ((GuiGraphicsExtractorAccessor) graphics).getScissorStack().peek()) + ); } - public static void renderVector(GuiGraphics graphics, Vec3 start, Vec3 vector, float z, int argb) { - VertexConsumer buffer = graphics.bufferSource().getBuffer(RenderType.lines()); - buffer.addVertex((float) start.x, (float) start.y, z).setColor(argb).setNormal((float) vector.x, (float) vector.y, 0); - buffer.addVertex((float) (start.x + vector.x), (float) (start.y + vector.y), z).setColor(argb).setNormal((float) vector.x, (float) vector.y, 0); - graphics.flush(); + public static void flattenedModels(GuiGraphicsExtractor graphics, List records, Vector3f translation, int x0, int y0, int x1, int y1, float scale) { + ((GuiGraphicsExtractorAccessor) graphics).getGuiRenderState().addPicturesInPictureState( + new GuiFlattenedModelsRenderState(records, translation, x0, y0, x1, y1, scale, ((GuiGraphicsExtractorAccessor) graphics).getScissorStack().peek()) + ); } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index 151d8bec..8d3b98f7 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -2,25 +2,27 @@ import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormat; import com.xtracr.realcamera.api.BindResult; import com.xtracr.realcamera.config.BindTarget; import com.xtracr.realcamera.config.BindTarget.DisableConfig; import com.xtracr.realcamera.config.BindTarget.TargetConfig; -import com.xtracr.realcamera.util.BuiltIterableBuffer; -import com.xtracr.realcamera.util.MultiVertexCatcher; -import com.xtracr.realcamera.util.VertexData; +import com.xtracr.realcamera.renderer.BuiltIterableBuffer; +import com.xtracr.realcamera.renderer.MultiVertexCatcher; +import com.xtracr.realcamera.renderer.state.BuiltModelRecord; +import com.xtracr.realcamera.renderer.state.VertexData; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; import org.joml.Matrix3f; import org.joml.Matrix4f; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; import java.awt.*; import java.util.ArrayList; @@ -29,23 +31,27 @@ import java.util.Set; public class ModelAnalyser { - private static final Set UNFOCUSABLE_RENDER_TYPES = Set.of(RenderType.armorEntityGlint(), RenderType.glintTranslucent(), RenderType.glint(), RenderType.entityGlint(), RenderType.entityGlintDirect()); + private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); + private static final Set UNFOCUSABLE_RENDER_TYPES = Set.of(RenderTypes.armorEntityGlint(), RenderTypes.glintTranslucent(), RenderTypes.glint(), RenderTypes.entityGlint()); private static final int planeArgb = 0x6F3333CC, forwardArgb = 0xFF00CC00, upwardArgb = 0xFFCC0000, leftArgb = 0xFF0000CC, focusedArgb = 0x4FFFFFFF; private static final int z1 = 210, z2 = z1 + 10; public final List focusedPolyhedron = new ArrayList<>(); public final PoseStack modelPose = new PoseStack(), texturePose = new PoseStack(); - private final List modelRecords = new ArrayList<>(), textureRecords = new ArrayList<>(); + protected final List modelRecords = new ArrayList<>(), textureRecords = new ArrayList<>(); private VertexData[][] targetPrimitives = new VertexData[3][]; private BindResult bindResult = BindResult.EMPTY; private BindTarget target = BindTarget.EMPTY; @Nullable - private BuiltRecord focusedRecord, currentRecord; + private BuiltModelRecord focusedRecord, currentRecord; private double modelScale; private static boolean haveCommonVertex(VertexData[] p1, List primitives) { final float precision = 1e-5f; - for (VertexData[] p2 : primitives) for (VertexData v1 : p1) for (VertexData v2 : p2) - if (Math.abs(v1.x() - v2.x()) < precision && Math.abs(v1.y() - v2.y()) < precision && Math.abs(v1.z() - v2.z()) < precision) return true; + for (VertexData[] p2 : primitives) + for (VertexData v1 : p1) + for (VertexData v2 : p2) + if (Math.abs(v1.x() - v2.x()) < precision && Math.abs(v1.y() - v2.y()) < precision && Math.abs(v1.z() - v2.z()) < precision) + return true; return false; } @@ -79,15 +85,14 @@ public String getFocusedTextureId() { } public void applyDisableConfigs(String textureId, Set hiddenNames) { - for (BuiltRecord record : modelRecords) { - if (!record.textureId().contains(textureId)) continue; - textureRecords.add(record); + for (BuiltModelRecord record : modelRecords) { + if (record.containsTextureId(textureId)) textureRecords.add(record); } for (int i = 0; i < modelRecords.size(); i++) { - BuiltRecord record = modelRecords.get(i); + BuiltModelRecord record = modelRecords.get(i); List primitives = new ArrayList<>(); - DisableConfig[] disableConfigs = target.filteredDisableConfigs(config -> record.textureId().contains(config.textureId()) && hiddenNames.contains(config.name())); - boolean disableAll = !record.textureId().contains(textureId); + DisableConfig[] disableConfigs = target.filteredDisableConfigs(config -> record.containsTextureId(config.textureId()) && hiddenNames.contains(config.name())); + boolean disableAll = !record.containsTextureId(textureId); for (DisableConfig config : disableConfigs) { if (config.disableAll()) { disableAll = true; @@ -104,7 +109,7 @@ public void applyDisableConfigs(String textureId, Set hiddenNames) { break; } } - modelRecords.set(i, new BuiltRecord(record.renderType(), record.textureId(), record.vertices(), primitives.toArray(new VertexData[0][]))); + modelRecords.set(i, new BuiltModelRecord(record.renderType(), record.textureId(), record.vertices(), primitives.toArray(new VertexData[0][]))); } } @@ -112,7 +117,7 @@ public void computeFocusedOnTexture(int mouseX, int mouseY) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; Matrix4f positionMatrix = texturePose.last().pose(); Vector3f position = new Vector3f(); - for (BuiltRecord record : textureRecords) { + for (BuiltModelRecord record : textureRecords) { int length = record.renderType().mode().primitiveLength; int[] xs = new int[length], ys = new int[length]; for (VertexData[] primitive : record.primitives()) { @@ -134,7 +139,7 @@ public void computeFocusedOnTexture(int mouseX, int mouseY) { public void computeFocusedOnModel(int mouseX, int mouseY, int layers) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; List sortByZ = new ArrayList<>(); - for (BuiltRecord record : modelRecords) { + for (BuiltModelRecord record : modelRecords) { if (UNFOCUSABLE_RENDER_TYPES.contains(record.renderType())) continue; VertexData[][] primitives = record.primitives(); for (VertexData[] primitive : primitives) { @@ -147,14 +152,14 @@ public void computeFocusedOnModel(int mouseX, int mouseY, int layers) { if (sortByZ.isEmpty()) return; sortByZ.sort(Comparator.comparingDouble(array -> -(float) array[2])); Object[] result = sortByZ.get(Math.min(sortByZ.size() - 1, layers)); - focusedRecord = (BuiltRecord) result[0]; + focusedRecord = (BuiltModelRecord) result[0]; focusedPolyhedron.add((VertexData[]) result[1]); } public void computeFocusedOnModel(int minX, int minY, int maxX, int maxY) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; List sortByZ = new ArrayList<>(); - for (BuiltRecord record : modelRecords) { + for (BuiltModelRecord record : modelRecords) { if (UNFOCUSABLE_RENDER_TYPES.contains(record.renderType())) continue; VertexData[][] primitives = record.primitives(); primitiveFor: @@ -171,7 +176,7 @@ public void computeFocusedOnModel(int minX, int minY, int maxX, int maxY) { if (sortByZ.isEmpty()) return; sortByZ.sort(Comparator.comparingDouble(array -> -(float) array[2])); List polygons = new ArrayList<>(); - focusedRecord = (BuiltRecord) sortByZ.getFirst()[0]; + focusedRecord = (BuiltModelRecord) sortByZ.getFirst()[0]; while (!sortByZ.isEmpty()) { VertexData[] first = (VertexData[]) sortByZ.getFirst()[1]; focusedPolyhedron.add(first); @@ -182,7 +187,8 @@ public void computeFocusedOnModel(int minX, int minY, int maxX, int maxY) { VertexData[] primitive = (VertexData[]) array[1]; primitiveFor: for (VertexData vertex : primitive) { - for (Polygon polygon : polygons) if (polygon.contains(vertex.x(), vertex.y())) continue primitiveFor; + for (Polygon polygon : polygons) + if (polygon.contains(vertex.x(), vertex.y())) continue primitiveFor; return false; } return true; @@ -229,34 +235,34 @@ public void computeFocusedPolyhedron() { resultIndexes.forEach(i -> focusedPolyhedron.add(primitives[i])); } - public void drawCameraDirections(GuiGraphics graphics) { + public void drawCameraDirections(GuiGraphicsExtractor graphics) { if (targetPrimitives[0] == null || targetPrimitives[1] == null || targetPrimitives[2] == null) return; Vec3 start = bindResult.getPosition(); Matrix3f normal = bindResult.getRotation(); if (normal.m00() == 0 && normal.m11() == 0 && normal.m22() == 0) return; - GUIHelper.renderVector(graphics, start, new Vec3(normal.m20(), normal.m21(), normal.m22()).scale(modelScale / 3), z2, forwardArgb); - GUIHelper.renderVector(graphics, start, new Vec3(normal.m10(), normal.m11(), normal.m12()).scale(modelScale / 6), z2, upwardArgb); - GUIHelper.renderVector(graphics, start, new Vec3(normal.m00(), normal.m01(), normal.m02()).scale(modelScale / 6), z2, leftArgb); + GUIHelper.vector(graphics, start, new Vec3(normal.m20(), normal.m21(), normal.m22()).scale(modelScale / 3), z2, forwardArgb); + GUIHelper.vector(graphics, start, new Vec3(normal.m10(), normal.m11(), normal.m12()).scale(modelScale / 6), z2, upwardArgb); + GUIHelper.vector(graphics, start, new Vec3(normal.m00(), normal.m01(), normal.m02()).scale(modelScale / 6), z2, leftArgb); } - public void drawBindTarget(GuiGraphics graphics) { + public void drawBindTarget(GuiGraphicsExtractor graphics) { if (currentRecord == null) return; TargetConfig config = target.targetConfig(); - if (targetPrimitives[0] != null) GUIHelper.renderPolygon(graphics, targetPrimitives[0], z1, planeArgb); - if (targetPrimitives[1] != null) GUIHelper.renderVector(graphics, VertexData.position(targetPrimitives[1], config.forwardU(), config.forwardV()), VertexData.normal(targetPrimitives[1]).scale(-modelScale / 2), z2, forwardArgb); - if (targetPrimitives[2] != null) GUIHelper.renderVector(graphics, VertexData.position(targetPrimitives[2], config.upwardU(), config.upwardV()), VertexData.normal(targetPrimitives[2]).scale(-modelScale / 2), z2, upwardArgb); + if (targetPrimitives[0] != null) GUIHelper.polygon(graphics, targetPrimitives[0], z1, planeArgb); + if (targetPrimitives[1] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[1], config.forwardU(), config.forwardV()), VertexData.normal(targetPrimitives[1]).scale(-modelScale / 2), z2, forwardArgb); + if (targetPrimitives[2] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[2], config.upwardU(), config.upwardV()), VertexData.normal(targetPrimitives[2]).scale(-modelScale / 2), z2, upwardArgb); } - public void drawFocusedInModelArea(GuiGraphics graphics) { + public void drawFocusedInModelArea(GuiGraphicsExtractor graphics) { if (focusedPolyhedron.isEmpty() || focusedRecord == null) return; VertexData[] focused = focusedPolyhedron.getFirst(); VertexData[] reversed = new VertexData[focused.length]; for (int i = 0; i < focused.length; i++) reversed[i] = focused[focused.length - 1 - i]; - GUIHelper.renderPolygon(graphics, reversed, z1, focusedArgb); - focusedPolyhedron.forEach(primitive -> GUIHelper.renderPolygon(graphics, primitive, z1, focusedArgb)); + GUIHelper.polygon(graphics, reversed, z1, focusedArgb); + focusedPolyhedron.forEach(primitive -> GUIHelper.polygon(graphics, primitive, z1, focusedArgb)); } - public void drawFocusedInTextureArea(GuiGraphics graphics) { + public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics) { Matrix4f positionMatrix = texturePose.last().pose(); int length = 0; VertexData[] transformed = new VertexData[0], reversed = new VertexData[0]; @@ -272,59 +278,16 @@ public void drawFocusedInTextureArea(GuiGraphics graphics) { position.set(vertex.u(), vertex.v(), 0).mulPosition(positionMatrix); transformed[i] = reversed[length - 1 - i] = VertexData.immutable(position.x(), position.y(), 0, vertex.argb(), vertex.u(), vertex.v(), vertex.overlay(), vertex.light(), 0, 0, 1); } - GUIHelper.renderPolygon(graphics, transformed, 0, focusedArgb); - GUIHelper.renderPolygon(graphics, reversed, 0, focusedArgb); + GUIHelper.polygon(graphics, transformed, 0, focusedArgb); + GUIHelper.polygon(graphics, reversed, 0, focusedArgb); } } - public void drawModel(GuiGraphics graphics, PoseStack poseStack) { - poseStack.pushPose(); - poseStack.mulPose(modelPose.last().pose().invert(new Matrix4f())); - float minEntityZ = 0f, maxEntityZ = 200f; - for (BuiltRecord record : modelRecords) { - for (VertexData vertex : record.vertices()) { - if (vertex.z() < minEntityZ) minEntityZ = vertex.z(); - if (vertex.z() > maxEntityZ) maxEntityZ = vertex.z(); - } - } - Matrix4f positionMatrix = new Matrix4f().mul(poseStack.last().pose()).scale(1, 1, 200 / (maxEntityZ - minEntityZ)).translate(0, 0, -minEntityZ); - Matrix3f normalMatrix = new Matrix3f(positionMatrix); - modelRecords.forEach(record -> { - VertexConsumer buffer = graphics.bufferSource().getBuffer(record.renderType()); - if (!record.renderType().canConsolidateConsecutiveGeometry()) { - for (VertexData vertex : record.vertices()) vertex.render(buffer, positionMatrix, normalMatrix); - return; - } - for (VertexData[] primitive : record.primitives()) { - for (VertexData vertex : primitive) vertex.render(buffer, positionMatrix, normalMatrix); - } - }); - poseStack.popPose(); - graphics.flush(); - } - - public void drawTexture(GuiGraphics graphics, PoseStack poseStack) { - Matrix4f positionMatrix = poseStack.last().pose(); - textureRecords.forEach(record -> { - VertexConsumer buffer = graphics.bufferSource().getBuffer(record.renderType()); - Vector3f position = new Vector3f(); - for (VertexData vertex : record.vertices()) { - position.set(vertex.u(), vertex.v(), 0).mulPosition(positionMatrix); - buffer.addVertex(position.x(), position.y(), 0, vertex.argb(), vertex.u(), vertex.v(), vertex.overlay(), vertex.light(), 0, 0, 1); - } - }); - graphics.flush(); - } - - public void updateModel(Minecraft client, Entity entity, float deltaTick, PoseStack poseStack) { - Lighting.setupForEntityInInventory(); + public void updateModel(Minecraft client, Entity entity, float partialTicks, PoseStack poseStack) { EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); - dispatcher.setRenderShadow(false); - MultiVertexCatcher catcher = MultiVertexCatcher.defaultImpl(); - dispatcher.render(entity, 0, 0, 0, 0, deltaTick, poseStack, catcher, 0xF000f0); - catcher.endCatching(this::computeBindResult); - dispatcher.setRenderShadow(true); - Lighting.setupFor3DItems(); + client.gameRenderer.getLighting().setupFor(Lighting.Entry.ENTITY_IN_UI); + dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, vertexCatcher.initCollector()); + vertexCatcher.endCatching(this::computeBindResult); } public void computeBindResult(BuiltIterableBuffer builtBuffer) { @@ -338,10 +301,10 @@ public void computeBindResult(BuiltIterableBuffer builtBuffer) { primitives[i][0] = vertices[startWithFirst ? 0 : k]; System.arraycopy(vertices, k + 1, primitives[i], 1, primitiveLength - 1); } - BuiltRecord record = new BuiltRecord(builtBuffer.renderType(), builtBuffer.textureId(), vertices, primitives); + BuiltModelRecord record = new BuiltModelRecord(builtBuffer.renderType(), builtBuffer.textureId(), vertices, primitives); modelRecords.add(record); if (!builtBuffer.textureId().contains(target.textureId()) || currentRecord != null) return; - BindResult result = new BindResult(target, true); + BindResult result = new BindResult(target); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV[] uvs = {new VertexData.UV(config.posU(), config.posV()), new VertexData.UV(config.forwardU(), config.forwardV()), new VertexData.UV(config.upwardU(), config.upwardV())}; targetPrimitives = builtBuffer.findPrimitivesInCache(uvs); @@ -359,9 +322,7 @@ public void computeBindResult(BuiltIterableBuffer builtBuffer) { if (targetPrimitives[2] != null) result.setUpward(VertexData.normal(targetPrimitives[2]).scale(-1)); if (result.weakAvailable()) { currentRecord = record; - bindResult = result.computeCamera(); + bindResult = result.computeCamera(true); } } - - private record BuiltRecord(RenderType renderType, String textureId, VertexData[] vertices, VertexData[][] primitives) { } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 0d49c730..83ebacfd 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -3,6 +3,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedMap; import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.vertex.PoseStack; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.compat.CompatibilityHelper; import com.xtracr.realcamera.config.BindTarget; @@ -10,31 +11,37 @@ import com.xtracr.realcamera.config.ConfigFile; import com.xtracr.realcamera.config.ConfigScreen; import com.xtracr.realcamera.config.ModConfig; +import com.xtracr.realcamera.gui.components.CycleIconButton; +import com.xtracr.realcamera.gui.components.DoubleSlider; +import com.xtracr.realcamera.gui.components.NumberField; +import com.xtracr.realcamera.gui.components.SimpleIconButton; +import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.util.LocUtil; import com.xtracr.realcamera.util.MathUtil; -import com.xtracr.realcamera.util.VertexData; import io.netty.buffer.Unpooled; import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.*; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.layouts.FrameLayout; import net.minecraft.client.gui.layouts.GridLayout; import net.minecraft.client.gui.layouts.LayoutSettings; import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.client.gui.navigation.CommonInputs; import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec2; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; import org.joml.Quaternionf; import org.joml.Vector3f; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -69,12 +76,12 @@ public class ModelViewScreen extends Screen { private final List disableConfigs = new ArrayList<>(); private final List rectWidgets = new ArrayList<>(); private final Map> hiddenNameMap = new HashMap<>(); - private final CyclingTexturedButton showTextureButton = new CyclingTexturedButton(48, 16, 0, 2).setOnValueChange(i -> initWidgets(page)); - private final CyclingTexturedButton pauseButton = new CyclingTexturedButton(0, 16, 0, 2); - private final CyclingTexturedButton bindXButton = new CyclingTexturedButton(16, 16, 1, 2); - private final CyclingTexturedButton bindYButton = new CyclingTexturedButton(16, 16, 0, 2); - private final CyclingTexturedButton bindZButton = new CyclingTexturedButton(16, 16, 1, 2); - private final CyclingTexturedButton bindRotButton = new CyclingTexturedButton(16, 16, 1, 2); + private final CycleIconButton showTextureButton = new CycleIconButton(48, 16, 0, 2).setOnValueChange(_ -> initWidgets(page)); + private final CycleIconButton pauseButton = new CycleIconButton(0, 16, 0, 2); + private final CycleIconButton bindXButton = new CycleIconButton(16, 16, 1, 2); + private final CycleIconButton bindYButton = new CycleIconButton(16, 16, 0, 2); + private final CycleIconButton bindZButton = new CycleIconButton(16, 16, 1, 2); + private final CycleIconButton bindRotButton = new CycleIconButton(16, 16, 1, 2); private final DoubleSlider entityPitchSlider = createSlider("pitch", widgetWidth * 2 + 4, -90.0, 90.0); private final DoubleSlider entityYawSlider = createSlider("yaw", widgetWidth * 2 + 4, -60.0, 60.0); private final DoubleSlider offsetXSlider = createSlider("offsetX", widgetWidth * 2 - 18, ModConfig.MIN_OFFSET_D, ModConfig.MAX_OFFSET_D); @@ -84,57 +91,52 @@ public class ModelViewScreen extends Screen { private final DoubleSlider offsetYawSlider = createSlider("yaw", widgetWidth * 2 - 18, -180.0, 180.0); private final DoubleSlider offsetRollSlider = createSlider("roll", widgetWidth * 2 - 18, -180.0, 180.0); private final CycleButton selectingButton = createCyclingButtonBuilder(ImmutableSortedMap.of( - 0, LocUtil.MODEL_VIEW_WIDGET("forwardVector").withStyle(ChatFormatting.GREEN), - 1, LocUtil.MODEL_VIEW_WIDGET("upwardVector").withStyle(ChatFormatting.RED), - 2, LocUtil.MODEL_VIEW_WIDGET("position").withStyle(ChatFormatting.BLUE))) - .withInitialValue(0) - .withTooltip(i -> createTooltip("selecting", modifierKey.getDisplayName(), modifierKey.getDisplayName())) + 0, LocUtil.MODEL_VIEW_WIDGET("forwardVector").withStyle(ChatFormatting.GREEN), + 1, LocUtil.MODEL_VIEW_WIDGET("upwardVector").withStyle(ChatFormatting.RED), + 2, LocUtil.MODEL_VIEW_WIDGET("position").withStyle(ChatFormatting.BLUE)), 0) + .withTooltip(_ -> createTooltip("selecting", modifierKey.getDisplayName(), modifierKey.getDisplayName())) .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selecting")); private final CycleButton disableModeButton = createCyclingButtonBuilder(ImmutableMap.of( - 0, LocUtil.MODEL_VIEW_WIDGET("all").withStyle(ChatFormatting.GREEN), - 1, LocUtil.MODEL_VIEW_WIDGET("part").withStyle(ChatFormatting.BLUE))) - .withInitialValue(0) - .withTooltip(i -> createTooltip("disableMode", modifierKey.getDisplayName())) + 0, LocUtil.MODEL_VIEW_WIDGET("all").withStyle(ChatFormatting.GREEN), + 1, LocUtil.MODEL_VIEW_WIDGET("part").withStyle(ChatFormatting.BLUE)), 0) + .withTooltip(_ -> createTooltip("disableMode", modifierKey.getDisplayName())) .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("disableMode")); private final CycleButton selectionModeButton = createCyclingButtonBuilder(ImmutableSortedMap.of( - 0, LocUtil.MODEL_VIEW_WIDGET("single"), - 1, LocUtil.MODEL_VIEW_WIDGET("multiple"), - 2, LocUtil.MODEL_VIEW_WIDGET("range").withStyle(ChatFormatting.BLUE))) - .withInitialValue(0) - .withTooltip(i -> createTooltip("selectionMode", modifierKey.getDisplayName(), modifierKey.getDisplayName())) + 0, LocUtil.MODEL_VIEW_WIDGET("single"), + 1, LocUtil.MODEL_VIEW_WIDGET("multiple"), + 2, LocUtil.MODEL_VIEW_WIDGET("range").withStyle(ChatFormatting.BLUE)), 0) + .withTooltip(_ -> createTooltip("selectionMode", modifierKey.getDisplayName(), modifierKey.getDisplayName())) .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selectionMode")); private final CycleButton toggleSliderButton = createCyclingButtonBuilder(ImmutableMap.of( - 0, LocUtil.MODEL_VIEW_WIDGET("toggleSliderToField"), - 1, LocUtil.MODEL_VIEW_WIDGET("toggleFieldToSlider"))) - .withInitialValue(0) - .withTooltip(i -> createTooltip("toggleSlider")) + 0, LocUtil.MODEL_VIEW_WIDGET("toggleSliderToField"), + 1, LocUtil.MODEL_VIEW_WIDGET("toggleFieldToSlider")), 0) + .withTooltip(_ -> createTooltip("toggleSlider")) .displayOnlyValue() - .create(0, 0, widgetWidth * 2 + 4, widgetHeight, CommonComponents.EMPTY, (button, i) -> { + .create(0, 0, widgetWidth * 2 + 4, widgetHeight, CommonComponents.EMPTY, (_, i) -> { if (i == 1) { - offsetXField.setNumber((float) offsetXSlider.getValue()); - offsetYField.setNumber((float) offsetYSlider.getValue()); - offsetZField.setNumber((float) offsetZSlider.getValue()); - offsetPitchField.setNumber((float) offsetPitchSlider.getValue()); - offsetYawField.setNumber((float) offsetYawSlider.getValue()); - offsetRollField.setNumber((float) offsetRollSlider.getValue()); + offsetXField.setNumber((float) offsetXSlider.getDouble()); + offsetYField.setNumber((float) offsetYSlider.getDouble()); + offsetZField.setNumber((float) offsetZSlider.getDouble()); + offsetPitchField.setNumber((float) offsetPitchSlider.getDouble()); + offsetYawField.setNumber((float) offsetYawSlider.getDouble()); + offsetRollField.setNumber((float) offsetRollSlider.getDouble()); } else { - offsetXSlider.setValue(offsetXField.getNumber()); - offsetYSlider.setValue(offsetYField.getNumber()); - offsetZSlider.setValue(offsetZField.getNumber()); - offsetPitchSlider.setValue(offsetPitchField.getNumber()); - offsetYawSlider.setValue(offsetYawField.getNumber()); - offsetRollSlider.setValue(offsetRollField.getNumber()); + offsetXSlider.setDouble(offsetXField.getNumber()); + offsetYSlider.setDouble(offsetYField.getNumber()); + offsetZSlider.setDouble(offsetZField.getNumber()); + offsetPitchSlider.setDouble(offsetPitchField.getNumber()); + offsetYawSlider.setDouble(offsetYawField.getNumber()); + offsetRollSlider.setDouble(offsetRollField.getNumber()); } initWidgets(page); }); private final CycleButton toggleCategoryButton = createCyclingButtonBuilder(ImmutableSortedMap.of( - Category.CONFIGS, LocUtil.MODEL_VIEW_WIDGET(Category.CONFIGS.next().id), - Category.PREVIEW, LocUtil.MODEL_VIEW_WIDGET(Category.PREVIEW.next().id), - Category.DISABLE, LocUtil.MODEL_VIEW_WIDGET(Category.DISABLE.next().id))) - .withInitialValue(Category.CONFIGS) + Category.CONFIGS, LocUtil.MODEL_VIEW_WIDGET(Category.CONFIGS.next().id), + Category.PREVIEW, LocUtil.MODEL_VIEW_WIDGET(Category.PREVIEW.next().id), + Category.DISABLE, LocUtil.MODEL_VIEW_WIDGET(Category.DISABLE.next().id)), Category.CONFIGS) .withTooltip(category -> createTooltip(category.next().id)) .displayOnlyValue() - .create(0, 0, widgetWidth * 2 - 18, widgetHeight, CommonComponents.EMPTY, (button, i) -> initWidgets(0)); + .create(0, 0, widgetWidth * 2 - 18, widgetHeight, CommonComponents.EMPTY, (_, _) -> initWidgets(0)); public ModelViewScreen() { super(LocUtil.MODEL_VIEW_TITLE()); @@ -165,12 +167,13 @@ private void initWidgets(int page) { clearWidgets(); initLeftWidgets(); if (textureViewArea != null) rectWidgets.forEach(this::addRenderableWidget); - if (toggleCategoryButton.getValue() == Category.DISABLE) addRenderableWidget(showTextureButton).setPosition(x + (xSize - middleWidth) / 2 + 4, y + 4); + if (toggleCategoryButton.getValue() == Category.DISABLE) + addRenderableWidget(showTextureButton).setPosition(x + (xSize - middleWidth) / 2 + 4, y + 4); addRenderableWidget(pauseButton).setPosition(x + (xSize + middleWidth) / 2 - 38, y + 4); - addRenderableWidget(new TexturedButton(x + (xSize + middleWidth) / 2 - 20, y + 4, 16, 16, 0, 0, button -> { + addRenderableWidget(new SimpleIconButton(x + (xSize + middleWidth) / 2 - 20, y + 4, 16, 16, 0, 0, _ -> { modelScale = textureScale = 80; - entityYawSlider.setValue(0); - entityPitchSlider.setValue(0); + entityYawSlider.setDouble(0); + entityPitchSlider.setDouble(0); modelX = modelY = textureX = textureY = 0; xRot = yRot = 0; layers = 0; @@ -239,19 +242,19 @@ private void initLeftWidgets() { else rows.addChild(offsetPitchField, fieldSettings); if (useSliderOffset) rows.addChild(offsetYawSlider, 2, grid.newCellSettings().padding(26, 2, 0, 0)); else rows.addChild(offsetYawField, 2, grid.newCellSettings().padding(29, 3, 1, 1)); - rows.addChild(new TexturedButton(0, 0, button -> { + rows.addChild(new SimpleIconButton(0, 0, _ -> { offsetXField.setNumber(0f); offsetYField.setNumber(0f); offsetZField.setNumber(0f); offsetPitchField.setNumber(0f); offsetYawField.setNumber(0f); offsetRollField.setNumber(0f); - offsetXSlider.setValue(0); - offsetYSlider.setValue(0); - offsetZSlider.setValue(0); - offsetPitchSlider.setValue(0); - offsetYawSlider.setValue(0); - offsetRollSlider.setValue(0); + offsetXSlider.setDouble(0); + offsetYSlider.setDouble(0); + offsetZSlider.setDouble(0); + offsetPitchSlider.setDouble(0); + offsetYawSlider.setDouble(0); + offsetRollSlider.setDouble(0); }), smallSettings); if (useSliderOffset) rows.addChild(offsetRollSlider, sliderSettings); else rows.addChild(offsetRollField, fieldSettings); @@ -275,7 +278,7 @@ else if (index > 0 && index <= rectWidgets.size()) { }).setTooltip(createTooltip("focusedRectangleNumber")); addRenderableWidget(new StringWidget(x + 4 + widgetWidth + 3, y + 4 + (widgetHeight + 2) * 3, 6, widgetHeight, LocUtil.literal("/"), font)); addRenderableWidget(rectWidgetsSizeWidget); - rows.addChild(new TexturedButton(48, 0, button -> deleteFocusedRectWidget()), grid.newCellSettings().padding(5 + widgetWidth - 18, 3, 1, 1)) + rows.addChild(new SimpleIconButton(48, 0, _ -> deleteFocusedRectWidget()), grid.newCellSettings().padding(5 + widgetWidth - 18, 3, 1, 1)) .setTooltip(createTooltip("deleteSelectedRectangle")); rows.addChild(new StringWidget(26, widgetHeight, LocUtil.literal("uMin:"), font)); rows.addChild(uMinField, offsetXSettings).setOnValueChange(f -> { @@ -322,20 +325,20 @@ private void initRightWidgets() { LayoutSettings smallSettings = grid.newCellSettings().padding(5, 3, 1, 1); GridLayout.RowHelper rows = grid.createRowHelper(4); rows.addChild(toggleCategoryButton, 3); - rows.addChild(new TexturedButton(80, 0, button -> { + rows.addChild(new SimpleIconButton(80, 0, _ -> { if (CompatibilityHelper.isModLoaded("cloth-config")) minecraft.setScreen(ConfigScreen.create(this)); }), smallSettings).setTooltip(createTooltip("toConfigScreen")); final int widgetsPerPage, size; if (toggleCategoryButton.getValue() == Category.DISABLE) { widgetsPerPage = 6; size = disableConfigs.size(); - rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("copy"), widgetWidth, button -> configsInClipBoard = List.copyOf(disableConfigs)), 2).setTooltip(createTooltip("copy")); - rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("paste"), widgetWidth, button -> { + rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("copy"), widgetWidth, _ -> configsInClipBoard = List.copyOf(disableConfigs)), 2).setTooltip(createTooltip("copy")); + rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("paste"), widgetWidth, _ -> { configsInClipBoard.stream().filter(config -> disableConfigs.stream().noneMatch(c -> c.name().equals(config.name()))).forEach(disableConfigs::add); initWidgets(0); }), 2).setTooltip(createTooltip("paste")); rows.addChild(disabledNameField, 3, smallSettings).setTooltip(createTooltip("disabledName")); - rows.addChild(new TexturedButton(64, 0, button -> { + rows.addChild(new SimpleIconButton(64, 0, button -> { String name = disabledNameField.getValue(), textureId = disabledIdField.getValue(); if (name.isBlank()) { button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyName").withStyle(ChatFormatting.RED))); @@ -358,14 +361,14 @@ private void initRightWidgets() { for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { DisableConfig config = disableConfigs.get(i); String targetName = nameField.getValue(); - Set hiddenNames = hiddenNameMap.computeIfAbsent(targetName, k -> new HashSet<>()); - addRenderableWidget(new CyclingTexturedButton(32, 16, hiddenNames.contains(config.name()) ? 1 : 0, 2)) + Set hiddenNames = hiddenNameMap.computeIfAbsent(targetName, _ -> new HashSet<>()); + addRenderableWidget(new CycleIconButton(32, 16, hiddenNames.contains(config.name()) ? 1 : 0, 2)) .setOnValueChange(value -> { if (value == 0) hiddenNames.remove(config.name()); else hiddenNames.add(config.name()); }) .setPosition(x + (xSize + middleWidth) / 2 - 20, y + 5 + (widgetHeight + 2) * (3 + i % widgetsPerPage)); - rows.addChild(createButton(LocUtil.literal(config.name()), widgetWidth * 2 - 18, button -> { + rows.addChild(createButton(LocUtil.literal(config.name()), widgetWidth * 2 - 18, _ -> { disabledNameField.setValue(config.name()); disabledIdField.setValue(config.textureId()); disableModeButton.setValue(config.disableAll() ? 0 : 1); @@ -373,7 +376,7 @@ private void initRightWidgets() { for (UVRectangle rect : config.rectangles()) rectWidgets.add(createRectWidget(rect)); initWidgets(page); }), 3).setTooltip(Tooltip.create(LocUtil.literal(config.name()))); - rows.addChild(new TexturedButton(48, 0, button -> { + rows.addChild(new SimpleIconButton(48, 0, _ -> { disableConfigs.removeIf(disableConfig -> disableConfig.name().equals(config.name())); if (disabledNameField.getValue().equals(config.name())) rectWidgets.clear(); initWidgets(page * widgetsPerPage > size - 2 && size > 1 ? page - 1 : page); @@ -388,12 +391,13 @@ private void initRightWidgets() { for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { BindTarget target = i < fixedTargetCount ? fixedTargetList.get(i) : targetList.get(i - fixedTargetCount); String name = target.name(); - Button configButton = createButton(LocUtil.literal(name), widgetWidth * 2 - 18, button -> loadBindTarget(target)); - if (name.equals(RealCameraCore.currentTarget().name())) configButton.setTooltip(Tooltip.create(LocUtil.literal(name + "\n").append(LocUtil.MODEL_VIEW_WIDGET("currentConfig")))); - else configButton.setTooltip(Tooltip.create(LocUtil.literal(name))); - rows.addChild(configButton, 3); + rows.addChild(createButton(LocUtil.literal(name), widgetWidth * 2 - 18, _ -> loadBindTarget(target)), 3) + .setTooltip(Tooltip.create(name.equals(RealCameraCore.currentTarget().name()) ? + LocUtil.literal(name + "\n").append(LocUtil.MODEL_VIEW_WIDGET("currentConfig")) : + LocUtil.literal(name)) + ); if (i < fixedTargetCount) continue; - rows.addChild(new TexturedButton(48, 0, button -> { + rows.addChild(new SimpleIconButton(48, 0, _ -> { targetList.remove(target); ConfigFile.save(); initWidgets(page * widgetsPerPage > size - 2 && size > 1 ? page - 1 : page); @@ -404,12 +408,13 @@ private void initRightWidgets() { FrameLayout.alignInRectangle(grid, x + (xSize + middleWidth) / 2 + 4, y + 2, x + xSize, y + ySize, 0, 0); grid.visitWidgets(this::addRenderableWidget); final int pages = (size - 1) / widgetsPerPage + 1; - addRenderableWidget(new TexturedButton(x + (xSize + middleWidth) / 2 + 8, y + ySize - 20, 16, 16, 16, 0, button -> initWidgets((page - 1 + pages) % pages))); - addRenderableWidget(new StringWidget(x + (xSize + middleWidth) / 2 + 30, y + ySize - 20, widgetWidth * 2 - 40, widgetHeight, LocUtil.literal((page + 1) + " / " + pages), font)); - addRenderableWidget(new TexturedButton(x + xSize - 21, y + ySize - 20, 16, 16, 32, 0, button -> initWidgets((page + 1) % pages))); + addRenderableWidget(new SimpleIconButton(x + (xSize + middleWidth) / 2 + 8, y + ySize - 20, 16, 16, 16, 0, _ -> initWidgets((page - 1 + pages) % pages))); + Component pageInfo = LocUtil.literal((page + 1) + " / " + pages); + addRenderableWidget(new StringWidget(x + (3 * xSize + middleWidth) / 4 + 2 - font.width(pageInfo) / 2, y + ySize - 20, font.width(pageInfo), widgetHeight, pageInfo, font)); + addRenderableWidget(new SimpleIconButton(x + xSize - 21, y + ySize - 20, 16, 16, 32, 0, _ -> initWidgets((page + 1) % pages))); } - public @NotNull UVRectangleWidget addRectWidget(@NotNull UVRectangleWidget rectWidget) { + public @NonNull UVRectangleWidget addRectWidget(@NonNull UVRectangleWidget rectWidget) { UVRectangleWidget foundRectWidget = rectWidgets.stream().filter(r -> r.contains(rectWidget)).findFirst().orElse(null); if (foundRectWidget == null) { rectWidgets.add(rectWidget); @@ -432,11 +437,11 @@ public boolean deleteFocusedRectWidget() { } @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick) { - super.render(graphics, mouseX, mouseY, deltaTick); + public void extractRenderState(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { + super.extractRenderState(graphics, mouseX, mouseY, partialTicks); if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) { GUIHelper.enableScissor(graphics, modelViewArea); - graphics.fill(mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius, 400, 0x4F3333CC); + GUIHelper.fill(graphics, mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius, 400, 0x4F3333CC); graphics.disableScissor(); } if (textureViewArea != null) { @@ -444,14 +449,14 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick if (clickedX >= 0 && clickedY >= 0) graphics.fill(Math.min((int) clickedX, mouseX), Math.min((int) clickedY, mouseY), Math.max((int) clickedX, mouseX), Math.max((int) clickedY, mouseY), 0x4F3333CC); if (disableModeButton.getValue() == 0) - new UVRectangleWidget(0f, 0f, 1f, 1f).renderWidget(graphics, mouseX, mouseY, deltaTick); + new UVRectangleWidget(0f, 0f, 1f, 1f).extractWidgetRenderState(graphics, mouseX, mouseY, partialTicks); graphics.disableScissor(); } } @Override - public void renderBackground(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick) { - super.renderBackground(graphics, mouseX, mouseY, deltaTick); + public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { + super.extractBackground(graphics, mouseX, mouseY, partialTicks); graphics.fill(x, y, x + (xSize - middleWidth) / 2 - 4, y + ySize, 0xFF444444); graphics.fill(x + (xSize - middleWidth) / 2, y, x + (xSize + middleWidth) / 2, y + ySize, 0xFF222222); graphics.fill(x + (xSize + middleWidth) / 2 + 4, y, x + xSize, y + ySize, 0xFF444444); @@ -461,7 +466,7 @@ public void renderBackground(GuiGraphics graphics, int mouseX, int mouseY, float applyAnalyser(graphics, mouseX, mouseY); } - protected void applyAnalyser(GuiGraphics graphics, int mouseX, int mouseY) { + protected void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mouseY) { String textureId = toggleCategoryButton.getValue() == Category.DISABLE ? disabledIdField.getValue() : ""; Set hiddenNames = hiddenNameMap.getOrDefault(nameField.getValue(), Set.of()); analyser.applyDisableConfigs(textureId, hiddenNames); @@ -473,34 +478,32 @@ protected void applyAnalyser(GuiGraphics graphics, int mouseX, int mouseY) { focusedPolyhedron = analyser.focusedPolyhedron.toArray(new VertexData[0][]); focusedTextureId = analyser.getFocusedTextureId(); GUIHelper.enableScissor(graphics, modelViewArea); - analyser.drawModel(graphics, analyser.modelPose); if (toggleCategoryButton.getValue() != Category.PREVIEW) analyser.drawFocusedInModelArea(graphics); if (toggleCategoryButton.getValue() == Category.CONFIGS) analyser.drawBindTarget(graphics); else analyser.drawCameraDirections(graphics); graphics.disableScissor(); if (textureViewArea != null) { GUIHelper.enableScissor(graphics, textureViewArea); - analyser.drawTexture(graphics, analyser.texturePose); analyser.drawFocusedInTextureArea(graphics); graphics.disableScissor(); } } - protected void renderModelViewArea(GuiGraphics graphics, LivingEntity entity) { + protected void renderModelViewArea(GuiGraphicsExtractor graphics, LivingEntity entity) { int x1 = modelViewArea.left(), y1 = modelViewArea.top(), x2 = modelViewArea.right(), y2 = modelViewArea.bottom(); - Quaternionf quaternionf = new Quaternionf().rotateX((float) Math.PI / 6 + xRot).rotateY((float) Math.PI / 6 + yRot).rotateZ((float) Math.PI); + Quaternionf rotation = new Quaternionf().rotateX((float) Math.PI / 6 + xRot).rotateY((float) Math.PI / 6 + yRot).rotateZ((float) Math.PI); float entityBodyYaw = entity.yBodyRot; float entityYaw = entity.getYRot(); float entityPitch = entity.getXRot(); float entityPrevHeadYaw = entity.yHeadRotO; float entityHeadYaw = entity.yHeadRot; entity.yBodyRot = 180.0f; - entity.setYRot(180.0f + (float) entityYawSlider.getValue()); - entity.setXRot((float) entityPitchSlider.getValue()); + entity.setYRot(180.0f + (float) entityYawSlider.getDouble()); + entity.setXRot((float) entityPitchSlider.getDouble()); entity.yHeadRot = entity.getYRot(); entity.yHeadRotO = entity.getYRot(); Vector3f offset = new Vector3f((float) modelX, (float) modelY, 0); - renderEntityWithAnalyser(graphics, x1, y1, x2, y2, modelScale, offset, quaternionf, entity); + renderEntityWithAnalyser(graphics, x1, y1, x2, y2, modelScale, offset, rotation, entity); entity.yBodyRot = entityBodyYaw; entity.setYRot(entityYaw); entity.setXRot(entityPitch); @@ -508,26 +511,34 @@ protected void renderModelViewArea(GuiGraphics graphics, LivingEntity entity) { entity.yHeadRot = entityHeadYaw; } - protected void renderEntityWithAnalyser(GuiGraphics graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset, Quaternionf quaternionf, LivingEntity entity) { - analyser.modelPose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); - analyser.modelPose.scale(scale, scale, -scale); - analyser.modelPose.translate(offset.x(), offset.y(), offset.z()); - analyser.modelPose.mulPose(quaternionf); - analyser.modelPose.translate(0, -entity.getBbHeight() / 2.0f, 0); - analyser.updateModel(minecraft, entity, 1.0f, analyser.modelPose); + protected void renderEntityWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset, Quaternionf rotation, LivingEntity entity) { + PoseStack modelPose = analyser.modelPose; + modelPose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); + modelPose.scale(scale, scale, -scale); + modelPose.translate(offset.x(), offset.y(), offset.z()); + modelPose.mulPose(rotation); + modelPose.translate(0, -entity.getBbHeight() / 2.0f, 0); + analyser.updateModel(minecraft, entity, 1.0f, modelPose); + Matrix4f transform = new Matrix4f(); + transform.translate(offset.x(), offset.y(), offset.z()); + transform.rotate(rotation); + transform.translate(0, -entity.getBbHeight() / 2.0f, 0); + transform.mul(modelPose.last().pose().invert(new Matrix4f())); + GUIHelper.culledModels(graphics, analyser.modelRecords, scale, transform, x1, y1, x2, y2); } - protected void renderTextureViewArea(GuiGraphics graphics) { + protected void renderTextureViewArea(GuiGraphicsExtractor graphics) { if (textureViewArea == null) return; int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); Vector3f offset = new Vector3f((float) textureX - 0.5f, (float) textureY - 0.5f, 0); renderTextureWithAnalyser(graphics, x1, y1, x2, y2, (float) (textureScale * textureViewArea.width()) / 80, offset); } - protected void renderTextureWithAnalyser(GuiGraphics graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset) { + protected void renderTextureWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset) { analyser.texturePose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); analyser.texturePose.scale(scale, scale, -scale); analyser.texturePose.translate(offset.x(), offset.y(), offset.z()); + GUIHelper.flattenedModels(graphics, analyser.textureRecords, offset, x1, y1, x2, y2, scale); } protected void importBindTarget(Button button) { @@ -595,37 +606,38 @@ protected void loadBindTarget(BindTarget target) { bindZButton.setValue(target.bindConfig().bindZ() ? 0 : 1); bindRotButton.setValue(target.bindConfig().bindRotation() ? 0 : 1); scaleField.setNumber(target.offsets().getScale()); - offsetXSlider.setValue(target.offsets().getX()); + offsetXSlider.setDouble(target.offsets().getX()); offsetXField.setNumber(target.offsets().getX()); - offsetYSlider.setValue(target.offsets().getY()); + offsetYSlider.setDouble(target.offsets().getY()); offsetYField.setNumber(target.offsets().getY()); - offsetZSlider.setValue(target.offsets().getZ()); + offsetZSlider.setDouble(target.offsets().getZ()); offsetZField.setNumber(target.offsets().getZ()); - offsetPitchSlider.setValue(target.offsets().getPitch()); + offsetPitchSlider.setDouble(target.offsets().getPitch()); offsetPitchField.setNumber(target.offsets().getPitch()); - offsetYawSlider.setValue(target.offsets().getYaw()); + offsetYawSlider.setDouble(target.offsets().getYaw()); offsetYawField.setNumber(target.offsets().getYaw()); - offsetRollSlider.setValue(target.offsets().getRoll()); + offsetRollSlider.setDouble(target.offsets().getRoll()); offsetRollField.setNumber(target.offsets().getRoll()); disableConfigs.clear(); disableConfigs.addAll(List.of(target.disableConfigs())); } protected BindTarget genBindTarget() { - TargetConfig targetConfig = new TargetConfig( forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); - BindConfig bindConfig = new BindConfig( bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); + TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); + BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); OffsetConfig offsets = new OffsetConfig() .setScale(scaleField.getNumber()) - .setX(toggleSliderButton.getValue() == 0 ? (float) offsetXSlider.getValue() : offsetXField.getNumber()) - .setY(toggleSliderButton.getValue() == 0 ? (float) offsetYSlider.getValue() : offsetYField.getNumber()) - .setZ(toggleSliderButton.getValue() == 0 ? (float) offsetZSlider.getValue() : offsetZField.getNumber()) - .setPitch(toggleSliderButton.getValue() == 0 ? (float) offsetPitchSlider.getValue() : offsetPitchField.getNumber()) - .setYaw(toggleSliderButton.getValue() == 0 ? (float) offsetYawSlider.getValue() : offsetYawField.getNumber()) - .setRoll(toggleSliderButton.getValue() == 0 ? (float) offsetRollSlider.getValue() : offsetRollField.getNumber()); + .setX(toggleSliderButton.getValue() == 0 ? (float) offsetXSlider.getDouble() : offsetXField.getNumber()) + .setY(toggleSliderButton.getValue() == 0 ? (float) offsetYSlider.getDouble() : offsetYField.getNumber()) + .setZ(toggleSliderButton.getValue() == 0 ? (float) offsetZSlider.getDouble() : offsetZField.getNumber()) + .setPitch(toggleSliderButton.getValue() == 0 ? (float) offsetPitchSlider.getDouble() : offsetPitchField.getNumber()) + .setYaw(toggleSliderButton.getValue() == 0 ? (float) offsetYawSlider.getDouble() : offsetYawField.getNumber()) + .setRoll(toggleSliderButton.getValue() == 0 ? (float) offsetRollSlider.getDouble() : offsetRollField.getNumber()); DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toArray(UVRectangle[]::new)); DisableConfig[] disableConfigArray = disableConfigs.toArray(new DisableConfig[0]); for (int i = 0; i < disableConfigArray.length; i++) { - if (disableConfigArray[i].name().equals(currentDisableConfig.name())) disableConfigArray[i] = currentDisableConfig; + if (disableConfigArray[i].name().equals(currentDisableConfig.name())) + disableConfigArray[i] = currentDisableConfig; } return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, disableConfigArray); } @@ -642,8 +654,8 @@ protected Button createButton(Component message, int width, Button.OnPress onPre return Button.builder(message, onPress).size(width, widgetHeight).build(); } - protected CycleButton.Builder createCyclingButtonBuilder(Map messages) { - return new CycleButton.Builder(messages::get).withValues(messages.keySet()); + protected CycleButton.Builder createCyclingButtonBuilder(Map messages, T defaultValue) { + return new CycleButton.Builder<>(messages::get, () -> defaultValue).withValues(messages.keySet()); } protected DoubleSlider createSlider(String key, int width, double min, double max) { @@ -743,54 +755,54 @@ public boolean leftClickedWithModifier(double mouseX, double mouseY) { } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { + public boolean mouseClicked(@NonNull MouseButtonEvent event, boolean doubleClick) { double storedX = clickedX, storedY = clickedY; clickedX = clickedY = -1; - if (button == InputConstants.MOUSE_BUTTON_LEFT && toggleCategoryButton.getValue() != Category.PREVIEW) { - if (InputConstants.isKeyDown(minecraft.getWindow().getWindow(), modifierKey.getValue())) { - if (leftClickedWithModifier(mouseX, mouseY)) return true; - } else if (inTextureViewArea(mouseX, mouseY)) { - if (super.mouseClicked(mouseX, mouseY, button)) return true; + if (event.input() == InputConstants.MOUSE_BUTTON_LEFT && toggleCategoryButton.getValue() != Category.PREVIEW) { + if (InputConstants.isKeyDown(minecraft.getWindow(), modifierKey.getValue())) { + if (leftClickedWithModifier(event.x(), event.y())) return true; + } else if (inTextureViewArea(event.x(), event.y())) { + if (super.mouseClicked(event, doubleClick)) return true; if (storedX >= 0 && storedY >= 0) { - float xMin = (float) Math.min(storedX, mouseX), yMin = (float) Math.min(storedY, mouseY), xMax = (float) Math.max(storedX, mouseX), yMax = (float) Math.max(storedY, mouseY); + float xMin = (float) Math.min(storedX, event.x()), yMin = (float) Math.min(storedY, event.y()), xMax = (float) Math.max(storedX, event.x()), yMax = (float) Math.max(storedY, event.y()); setFocused(addRectWidget(new UVRectangleWidget(xMin, yMin, xMax, yMax, textureViewArea))); return true; } - clickedX = (int) mouseX; - clickedY = (int) mouseY; + clickedX = (int) event.x(); + clickedY = (int) event.y(); return true; } } - return super.mouseClicked(mouseX, mouseY, button); + return super.mouseClicked(event, doubleClick); } @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - if (button == InputConstants.MOUSE_BUTTON_LEFT && !InputConstants.isKeyDown(minecraft.getWindow().getWindow(), modifierKey.getValue())) { - if (inModelViewArea(mouseX, mouseY)) { - xRot += (float) (Math.PI * deltaY / ySize); - yRot -= (float) (Math.PI * deltaX / middleWidth); + public boolean mouseDragged(@NonNull MouseButtonEvent event, double dx, double dy) { + if (event.input() == InputConstants.MOUSE_BUTTON_LEFT && !InputConstants.isKeyDown(minecraft.getWindow(), modifierKey.getValue())) { + if (inModelViewArea(event.x(), event.y())) { + xRot += (float) (Math.PI * dy / ySize); + yRot -= (float) (Math.PI * dx / middleWidth); return true; } - } else if (button == InputConstants.MOUSE_BUTTON_RIGHT) { - if (inModelViewArea(mouseX, mouseY)) { - modelX += deltaX / modelScale; - modelY += deltaY / modelScale; + } else if (event.input() == InputConstants.MOUSE_BUTTON_RIGHT) { + if (inModelViewArea(event.x(), event.y())) { + modelX += dx / modelScale; + modelY += dy / modelScale; return true; } - if (inTextureViewArea(mouseX, mouseY)) { - textureX += deltaX / textureScale; - textureY += deltaY / textureScale; + if (inTextureViewArea(event.x(), event.y())) { + textureX += dx / textureScale; + textureY += dy / textureScale; return true; } } - return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + return super.mouseDragged(event, dx, dy); } @Override public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { if (inModelViewArea(mouseX, mouseY)) { - if (InputConstants.isKeyDown(minecraft.getWindow().getWindow(), modifierKey.getValue())) { + if (InputConstants.isKeyDown(minecraft.getWindow(), modifierKey.getValue())) { if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2) selectionRadius = Mth.clamp(selectionRadius + (int) verticalAmount * 2, 2, 48); else layers = Math.max(0, layers + (int) verticalAmount); @@ -805,12 +817,12 @@ public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmou } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (CommonInputs.selected(keyCode)) { + public boolean keyPressed(@NonNull KeyEvent event) { + if (event.isSelection()) { GuiEventListener focused = getFocused(); if (focused != null && !focused.isFocused()) setFocused(focusedRectWidget); } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(event); } @Override @@ -818,6 +830,18 @@ public boolean isPauseScreen() { return pauseButton.getValue() == 1; } + private enum Category { + CONFIGS, + PREVIEW, + DISABLE; + + public final String id = name().toLowerCase(); + + public Category next() { + return values()[(ordinal() + 1) % values().length]; + } + } + public class UVRectangleWidget extends AbstractWidget { protected float uMin, vMin, uMax, vMax; @@ -829,7 +853,7 @@ public UVRectangleWidget(float uMin, float vMin, float uMax, float vMax) { this.vMax = vMax; } - public UVRectangleWidget(float xMin, float yMin, float xMax, float yMax, @NotNull ScreenRectangle screenArea) { + public UVRectangleWidget(float xMin, float yMin, float xMax, float yMax, @NonNull ScreenRectangle screenArea) { super((int) xMin, (int) yMin, (int) (xMax - xMin), (int) (yMax - yMin), CommonComponents.EMPTY); Vec2 minUV = translateXYToUV(xMin, yMin, screenArea), maxUV = translateXYToUV(xMax, yMax, screenArea); this.uMin = minUV.x; @@ -872,14 +896,14 @@ private Vec2 translateUVToXY(float u, float v, ScreenRectangle screenArea) { private Vec2 translateXYToUV(float x, float y, ScreenRectangle screenArea) { int x1 = screenArea.left(), y1 = screenArea.top(), x2 = screenArea.right(), y2 = screenArea.bottom(); Vector3f vector3f = new Vector3f(x, y, 0) - .add(- (float) (x1 + x2) / 2.0f, - (float) (y1 + y2) / 2.0f, 0) + .add(-(float) (x1 + x2) / 2.0f, -(float) (y1 + y2) / 2.0f, 0) .mul((float) 80 / (textureScale * screenArea.width())) .add((float) -textureX + 0.5f, (float) -textureY + 0.5f, 0); return new Vec2(vector3f.x(), vector3f.y()); } @Override - protected void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick) { + protected void extractWidgetRenderState(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { Vec2 minXY = translateUVToXY(uMin, vMin, textureViewArea), maxXY = translateUVToXY(uMax, vMax, textureViewArea); float x1 = minXY.x, y1 = minXY.y, x2 = maxXY.x, y2 = maxXY.y, width = x2 - x1, height = y2 - y1; setX((int) x1); @@ -889,21 +913,22 @@ protected void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float GUIHelper.enableScissor(graphics, textureViewArea); GUIHelper.fill(graphics, x1, y1, x2, y2, 0x4F3333CC); if (isHoveredOrFocused()) GUIHelper.fill(graphics, x1, y1, x2, y2, 0x2F3333CC); - if (isFocused() || this == focusedRectWidget) GUIHelper.renderOutline(graphics, x1, y1, width, height, 0xAAFFFFFF); + if (isFocused() || this == focusedRectWidget) + GUIHelper.outline(graphics, x1, y1, width, height, 0xAAFFFFFF); graphics.disableScissor(); } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + public boolean keyPressed(@NonNull KeyEvent event) { if (textureViewArea == null) return false; - if (keyCode == InputConstants.KEY_DELETE && deleteFocusedRectWidget()) return true; - if (CommonInputs.selected(keyCode) && uMin < uMax && vMin < vMax) { + if (event.input() == InputConstants.KEY_DELETE && deleteFocusedRectWidget()) return true; + if (event.isSelection() && uMin < uMax && vMin < vMax) { textureX = 0.5 * (1 - uMin - uMax); textureY = 0.5 * (1 - vMin - vMax); textureScale = (int) Mth.clamp(2560d / (textureViewArea.width() * Math.sqrt((uMax - uMin) * (vMax - vMin))), 16, 1024); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(event); } @Override @@ -920,18 +945,7 @@ public void setFocused(boolean focused) { } @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { } - } - - private enum Category { - CONFIGS, - PREVIEW, - DISABLE; - - public final String id = name().toLowerCase(); - - public Category next() { - return values()[(ordinal() + 1) % values().length]; + protected void updateWidgetNarration(@NonNull NarrationElementOutput narrationElementOutput) { } } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java b/common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java deleted file mode 100644 index ec0a6447..00000000 --- a/common/src/main/java/com/xtracr/realcamera/gui/TexturedButton.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.xtracr.realcamera.gui; - -import com.xtracr.realcamera.RealCamera; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractButton; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.resources.ResourceLocation; - -import java.util.function.Consumer; - -public class TexturedButton extends AbstractButton { - public static final ResourceLocation ICON_TEXTURE = ResourceLocation.fromNamespaceAndPath(RealCamera.MODID, "textures/gui/icon.png"); - protected final ResourceLocation texture; - protected final int textureWidth, textureHeight, u, v; - private final Consumer onPress; - - public TexturedButton(int u, int v, Consumer onPress) { - this(0, 0, 16, 16, u, v, onPress); - } - - public TexturedButton(int x, int y, int width, int height, int u, int v, Consumer onPress) { - this(x, y, width, height, u, v, ICON_TEXTURE, 256, 256, onPress); - } - - public TexturedButton(int x, int y, int width, int height, int u, int v, ResourceLocation texture, int textureWidth, int textureHeight, Consumer onPress) { - super(x, y, width, height, CommonComponents.EMPTY); - this.textureWidth = textureWidth; - this.textureHeight = textureHeight; - this.onPress = onPress; - this.u = u; - this.v = v; - this.texture = texture; - } - - @Override - public void onPress() { - onPress.accept(this); - } - - @Override - public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick) { - graphics.fill(getX(), getY(), getX() + getWidth(), getY() + getHeight(), 0xFF646464); - graphics.blit(texture, getX(), getY(), u, v, width, height, textureWidth, textureHeight); - if (isHoveredOrFocused()) graphics.renderOutline(getX(), getY(), getWidth(), getHeight(), 0xFFFFFFFF); - } - - @Override - protected void updateWidgetNarration(NarrationElementOutput builder) { - this.defaultButtonNarrationText(builder); - } -} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java b/common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java new file mode 100644 index 00000000..d251f011 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java @@ -0,0 +1,73 @@ +package com.xtracr.realcamera.gui.components; + +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.AbstractButton; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.input.InputWithModifiers; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.resources.Identifier; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.function.IntConsumer; + +public class CycleIconButton extends AbstractButton { + protected final Identifier texture; + protected final int textureWidth, textureHeight, u, v, vOffset, size; + @Nullable + private IntConsumer onValueChange; + private int value; + + public CycleIconButton(int u, int v, int value, int size) { + this(0, 0, 16, 16, u, v, value, size); + } + + public CycleIconButton(int x, int y, int width, int height, int u, int v, int value, int size) { + this(x, y, width, height, u, v, height, value, size, SimpleIconButton.ICON_TEXTURE, 256, 256); + } + + public CycleIconButton(int x, int y, int width, int height, int u, int v, int vOffset, int value, int size, Identifier texture, int textureWidth, int textureHeight) { + super(x, y, width, height, CommonComponents.EMPTY); + this.u = u; + this.v = v; + this.vOffset = vOffset; + this.size = size; + this.texture = texture; + this.textureWidth = textureWidth; + this.textureHeight = textureHeight; + setValue(value); + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = (value % size + size) % size; + } + + public CycleIconButton setOnValueChange(IntConsumer onValueChange) { + this.onValueChange = onValueChange; + return this; + } + + @Override + public void onPress(@NonNull InputWithModifiers input) { + if (input.hasShiftDown()) setValue(value - 1); + else setValue(value + 1); + if (onValueChange != null) onValueChange.accept(value); + } + + @Override + public void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { + graphics.fill(getX(), getY(), getX() + getWidth(), getY() + getHeight(), 0xFF646464); + graphics.blit(RenderPipelines.GUI_TEXTURED, texture, getX(), getY(), u, v + value * vOffset, width, height, textureWidth, textureHeight); + if (isHoveredOrFocused()) graphics.outline(getX(), getY(), getWidth(), getHeight(), 0xFFFFFFFF); + } + + @Override + protected void updateWidgetNarration(@NonNull NarrationElementOutput builder) { + defaultButtonNarrationText(builder); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/DoubleSlider.java b/common/src/main/java/com/xtracr/realcamera/gui/components/DoubleSlider.java similarity index 77% rename from common/src/main/java/com/xtracr/realcamera/gui/DoubleSlider.java rename to common/src/main/java/com/xtracr/realcamera/gui/components/DoubleSlider.java index 7089fcb9..fc319fd2 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/DoubleSlider.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/DoubleSlider.java @@ -1,4 +1,4 @@ -package com.xtracr.realcamera.gui; +package com.xtracr.realcamera.gui.components; import net.minecraft.client.gui.components.AbstractSliderButton; import net.minecraft.network.chat.Component; @@ -17,18 +17,17 @@ public DoubleSlider(int width, int height, double value, double min, double max, this.max = max; } - public double getValue() { + public double getDouble() { return min + (max - min) * value; } - public void setValue(double value) { - this.value = Mth.clamp(0, (value - min) / (max - min), 1); - applyValue(); + public void setDouble(double value) { + setValue((value - min) / (max - min)); } @Override protected void updateMessage() { - setMessage(textFactory.apply(getValue())); + setMessage(textFactory.apply(getDouble())); } @Override diff --git a/common/src/main/java/com/xtracr/realcamera/gui/NumberField.java b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java similarity index 67% rename from common/src/main/java/com/xtracr/realcamera/gui/NumberField.java rename to common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java index 7a5534ee..f9dae213 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/NumberField.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java @@ -1,16 +1,17 @@ -package com.xtracr.realcamera.gui; +package com.xtracr.realcamera.gui.components; +import com.xtracr.realcamera.RealCamera; import com.xtracr.realcamera.util.LocUtil; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Tooltip; -import net.minecraft.client.gui.navigation.CommonInputs; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.KeyEvent; import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Style; -import net.minecraft.util.FormattedCharSequence; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.function.Consumer; @@ -39,18 +40,18 @@ public static NumberField ofInt(Font font, int width, int height, int d public T getNumber() { try { return getNumberInternal(); + } catch (NumberFormatException e) { + return defaultValue; } catch (Exception e) { + RealCamera.LOGGER.warn("Unexpected error parsing number", e); return defaultValue; } } public void setNumber(T value) { - try { - if (value.compareTo(minimum) < 0) value = minimum; - else if (value.compareTo(maximum) > 0) value = maximum; - setValue(value.toString()); - } catch (Exception ignored) { - } + if (value.compareTo(minimum) < 0) value = minimum; + else if (value.compareTo(maximum) > 0) value = maximum; + setValue(value.toString()); } public NumberField setMax(T maximum) { @@ -64,23 +65,23 @@ public NumberField setMin(T minimum) { } public NumberField setOnValueChange(Consumer consumer) { - super.setResponder(str -> consumer.accept(getNumber())); + super.setResponder(_ -> consumer.accept(getNumber())); return this; } - abstract protected T getNumberInternal(); + abstract protected T getNumberInternal() throws NumberFormatException; protected void checkText() { super.setTooltip(tooltip); - setFormatter((string, firstCharacterIndex) -> FormattedCharSequence.forward(string, Style.EMPTY)); + setTextColor(EditBox.DEFAULT_TEXT_COLOR); if (getValue().isEmpty()) return; try { T value = getNumberInternal(); - if (value.compareTo(minimum) < 0) throw new Exception("< " + minimum); - if (value.compareTo(maximum) > 0) throw new Exception("> " + maximum); + if (value.compareTo(minimum) < 0) throw new RuntimeException("< " + minimum); + if (value.compareTo(maximum) > 0) throw new RuntimeException("> " + maximum); } catch (Exception e) { super.setTooltip(Tooltip.create(LocUtil.literal("Invalid number: " + e.getMessage()).withStyle(s -> s.withColor(ChatFormatting.RED)))); - setFormatter((string, firstCharacterIndex) -> FormattedCharSequence.forward(string, Style.EMPTY.withColor(ChatFormatting.RED))); + setTextColor(0xFFFF5555); } } @@ -91,24 +92,25 @@ public void setTooltip(Tooltip tooltip) { } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (CommonInputs.selected(keyCode)) { + public boolean keyPressed(@NonNull KeyEvent event) { + if (event.isSelection()) { setFocused(false); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(event); } @Override - public boolean charTyped(char chr, int modifiers) { + public boolean charTyped(CharacterEvent event) { + char chr = (char) event.codepoint(); if (chr != '-' && chr != '.' && (chr < '0' || chr > '9')) return false; - return super.charTyped(chr, modifiers); + return super.charTyped(event); } @Override - public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float deltaTick) { + public void extractWidgetRenderState(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { checkText(); - super.renderWidget(graphics, mouseX, mouseY, deltaTick); + super.extractWidgetRenderState(graphics, mouseX, mouseY, partialTicks); } private static class FloatField extends NumberField { @@ -118,7 +120,7 @@ private static class FloatField extends NumberField { } @Override - protected Float getNumberInternal() { + protected Float getNumberInternal() throws NumberFormatException { return Float.parseFloat(getValue()); } } @@ -130,7 +132,7 @@ private static class IntField extends NumberField { } @Override - protected Integer getNumberInternal() { + protected Integer getNumberInternal() throws NumberFormatException { return Integer.parseInt(getValue()); } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java b/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java new file mode 100644 index 00000000..e3de55a2 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java @@ -0,0 +1,38 @@ +package com.xtracr.realcamera.gui.components; + +import com.xtracr.realcamera.RealCamera; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.resources.Identifier; + +public class SimpleIconButton extends Button { + public static final Identifier ICON_TEXTURE = Identifier.fromNamespaceAndPath(RealCamera.MODID, "textures/gui/icon.png"); + protected final Identifier texture; + protected final int textureWidth, textureHeight, u, v; + + public SimpleIconButton(int u, int v, Button.OnPress onPress) { + this(0, 0, 16, 16, u, v, onPress); + } + + public SimpleIconButton(int x, int y, int width, int height, int u, int v, Button.OnPress onPress) { + this(x, y, width, height, u, v, ICON_TEXTURE, 256, 256, onPress); + } + + public SimpleIconButton(int x, int y, int width, int height, int u, int v, Identifier texture, int textureWidth, int textureHeight, Button.OnPress onPress) { + super(x, y, width, height, CommonComponents.EMPTY, onPress, DEFAULT_NARRATION); + this.textureWidth = textureWidth; + this.textureHeight = textureHeight; + this.u = u; + this.v = v; + this.texture = texture; + } + + @Override + public void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { + graphics.fill(getX(), getY(), getX() + getWidth(), getY() + getHeight(), 0xFF646464); + graphics.blit(RenderPipelines.GUI_TEXTURED, texture, getX(), getY(), u, v, width, height, textureWidth, textureHeight); + if (isHoveredOrFocused()) graphics.outline(getX(), getY(), getWidth(), getHeight(), 0xFFFFFFFF); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java index 79f7a0f4..dae4e34b 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java @@ -3,17 +3,19 @@ import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.config.ConfigFile; import com.xtracr.realcamera.config.ModConfig; -import com.xtracr.realcamera.mixin.accessor.GameRendererAccessor; import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -23,21 +25,42 @@ @Mixin(Camera.class) public abstract class MixinCamera { + @Unique + private static final Vector3f FORWARDS = new Vector3f(0.0F, 0.0F, -1.0F); + @Unique + private static final Vector3f UP = new Vector3f(0.0F, 1.0F, 0.0F); + @Unique + private static final Vector3f LEFT = new Vector3f(-1.0F, 0.0F, 0.0F); + @Shadow + @Nullable + private Level level; @Shadow - private BlockGetter level; + @Nullable + private Entity entity; @Shadow private Vec3 position; @Shadow + @Final + private Vector3f forwards; + @Shadow + @Final + private Vector3f up; + @Shadow + @Final + private Vector3f left; + @Shadow private float xRot; @Shadow private float yRot; + @Shadow + @Final + private Quaternionf rotation; - @Inject(method = "setup", at = @At("RETURN")) - private void realcamera$setupCamera(BlockGetter area, Entity entity, boolean thirdPerson, boolean inverseView, float deltaTick, CallbackInfo ci) { + @Inject(method = "alignWithEntity", at = @At("RETURN")) + private void realcamera$setupCamera(float partialTicks, CallbackInfo ci) { if (!RealCameraCore.isActive()) return; ModConfig config = ConfigFile.config(); Vec3 startVec = position; - AABB box = entity.getBoundingBox(); if (config.isClassic()) { double scale = entity instanceof LivingEntity livingEntity ? livingEntity.getScale() : 1; Vec3 offset = new Vec3(config.getClassicX(), config.getClassicY(), -config.getClassicZ()).scale(scale); @@ -48,16 +71,28 @@ public abstract class MixinCamera { move((float) center.x(), (float) center.y(), (float) center.z()); setRotation(newYaw, newPitch); move((float) offset.x(), (float) offset.y(), (float) offset.z()); + realcamera$setRotation(newYaw, newPitch, ConfigFile.config().getClassicRoll()); } else { - Vec3 entityPos = entity.position().add(entity.position().subtract(entity.xOld, entity.yOld, entity.zOld).scale(entity.tickCount == 0 ? 0 : deltaTick - 1)); + Vec3 entityPos = entity.position().add(entity.position().subtract(entity.xOld, entity.yOld, entity.zOld).scale(entity.tickCount == 0 ? 0 : partialTicks - 1)); Vec3 rawPos = RealCameraCore.getRawPos(position, entityPos); + AABB box = entity.getBoundingBox(); double restrictedY = Mth.clamp(rawPos.y(), box.minY + 0.1D, box.maxY - 0.1D); startVec = new Vec3(position.x(), restrictedY, position.z()); setPosition(rawPos); - setRotation(RealCameraCore.getYaw(yRot), RealCameraCore.getPitch(xRot)); + Vec3 eulerAngle = RealCameraCore.getEulerAngle(xRot, yRot, 0); + realcamera$setRotation((float) eulerAngle.y(), (float) eulerAngle.x(), (float) eulerAngle.z()); } - realcamera$clipToSpace(startVec, entity, realcamera$getFov(deltaTick)); - RealCameraCore.setCameraPos(position); + realcamera$clipToSpace(startVec, entity, calculateFov(partialTicks)); + } + + @Unique + private void realcamera$setRotation(float yRot, float xRot, float roll) { + this.xRot = xRot; + this.yRot = yRot; + rotation.rotationYXZ((float) (Math.PI - Math.toRadians(yRot)), (float) -Math.toRadians(xRot), (float) -Math.toRadians(roll)); + FORWARDS.rotate(rotation, forwards); + UP.rotate(rotation, up); + LEFT.rotate(rotation, left); } @Unique @@ -65,25 +100,23 @@ public abstract class MixinCamera { Vec3 offset = position.subtract(startVec); final float depth = 0.05f + (float) (fov * (0.0001 + 0.000005 * fov)); for (int i = 0; i < 8; ++i) { - float f = depth * ((i & 1) * 2 - 1); - float g = depth * ((i >> 1 & 1) * 2 - 1); - float h = depth * ((i >> 2 & 1) * 2 - 1); - Vec3 start = startVec.add(f, g, h); - Vec3 end = startVec.add(offset).add(f, g, h); + float offsetX = depth * ((i & 1) * 2 - 1); + float offsetY = depth * ((i >> 1 & 1) * 2 - 1); + float offsetZ = depth * ((i >> 2 & 1) * 2 - 1); + Vec3 start = startVec.add(offsetX, offsetY, offsetZ); + Vec3 end = startVec.add(offset).add(offsetX, offsetY, offsetZ); HitResult hitResult = level.clip(new ClipContext(start, end, ClipContext.Block.VISUAL, ClipContext.Fluid.NONE, entity)); - double l = hitResult.getLocation().distanceTo(start); - if (hitResult.getType() == HitResult.Type.MISS || l >= offset.length()) continue; - offset = offset.scale(l / offset.length()); + if (hitResult.getType() == HitResult.Type.MISS) continue; + double sqDistance = hitResult.getLocation().distanceToSqr(start); + double sqOffsetL = offset.lengthSqr(); + if (sqDistance >= sqOffsetL) continue; + offset = offset.scale(Math.sqrt(sqDistance / sqOffsetL)); } setPosition(startVec.add(offset)); } - @Unique - private static float realcamera$getFov(float deltaTick) { - Minecraft client = Minecraft.getInstance(); - float fovModifier = Mth.lerp(deltaTick, ((GameRendererAccessor) client.gameRenderer).getOldFov(), ((GameRendererAccessor) client.gameRenderer).getFov()); - return client.options.fov().get() * fovModifier; - } + @Shadow + protected abstract float calculateFov(float partialTicks); @Shadow protected abstract void move(float x, float y, float z); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinFishingHookRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinFishingHookRenderer.java index 9237dc16..65dc9ab5 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinFishingHookRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinFishingHookRenderer.java @@ -1,18 +1,19 @@ package com.xtracr.realcamera.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.xtracr.realcamera.compat.DisableHelper; import net.minecraft.client.CameraType; import net.minecraft.client.renderer.entity.FishingHookRenderer; import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(FishingHookRenderer.class) public abstract class MixinFishingHookRenderer { - @Redirect(method = "getPlayerHandPos", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/CameraType;isFirstPerson()Z")) - private boolean realcamera$redirectIsFirstPerson(CameraType cameraType, Player player) { - if (DisableHelper.RENDER_HANDS.disabled(player)) return false; - return cameraType.isFirstPerson(); + @WrapOperation(method = "getPlayerHandPos", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/CameraType;isFirstPerson()Z")) + private boolean realcamera$redirectIsFirstPerson(CameraType instance, Operation original, Player owner) { + if (DisableHelper.RENDER_HANDS.disabled(owner)) return false; + return original.call(instance); } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java index 6e5a1a85..feafd99b 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java @@ -1,69 +1,36 @@ package com.xtracr.realcamera.mixin; -import com.llamalad7.mixinextras.sugar.Local; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.compat.CompatibilityHelper; import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.util.CrosshairUtil; -import com.xtracr.realcamera.util.RaycastUtil; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.phys.Vec3; -import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GameRenderer.class) public abstract class MixinGameRenderer { @Shadow - @Final Minecraft minecraft; + @Final + private Minecraft minecraft; @Shadow - @Final private Camera mainCamera; + @Final + private Camera mainCamera; - @ModifyVariable(method = "pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult;", at = @At("STORE"), ordinal = 0) - private EntityHitResult realcamera$modifyEntityHitResult(EntityHitResult entityHitResult) { - CrosshairUtil.capturedEntityHitResult = entityHitResult; - if (!ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { - Vec3 startVec = RaycastUtil.getStartVec(); - Vec3 endVec = RaycastUtil.getEndVec(); - double sqDistance = (minecraft.hitResult != null ? minecraft.hitResult.getLocation().distanceToSqr(startVec) : endVec.distanceToSqr(startVec)); - Entity cameraEntity = minecraft.getCameraEntity(); - double interactionRange = Math.max(minecraft.player.blockInteractionRange(), minecraft.player.entityInteractionRange()); - AABB box = cameraEntity.getBoundingBox().expandTowards(cameraEntity.getViewVector(minecraft.getTimer().getGameTimeDeltaPartialTick(true)).scale(interactionRange)).inflate(1.0, 1.0, 1.0); - CrosshairUtil.capturedEntityHitResult = ProjectileUtil.getEntityHitResult(cameraEntity, startVec, endVec, box, entity -> !entity.isSpectator() && entity.isPickable(), sqDistance); - } - return CrosshairUtil.capturedEntityHitResult; - } - - @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setup(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/entity/Entity;ZZF)V")) - private void realcamera$atCameraSetup(DeltaTracker deltaTracker, CallbackInfo ci) { - final float deltaTick = deltaTracker.getGameTimeDeltaPartialTick(true); - CompatibilityHelper.NEA_setDeltaTick(deltaTick); - RealCameraCore.initialize(minecraft); + @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;update(Lnet/minecraft/client/DeltaTracker;)V")) + private void realcamera$atCameraUpdate(DeltaTracker deltaTracker, boolean renderLevel, CallbackInfo ci) { + float partialTicks = deltaTracker.getGameTimeDeltaPartialTick(true); + CompatibilityHelper.NEA_setDeltaTick(partialTicks); + RealCameraCore.initialize(minecraft, renderLevel); if (RealCameraCore.isActive() && !ConfigFile.config().isClassic()) { - EntityRenderDispatcher dispatcher = minecraft.getEntityRenderDispatcher(); - dispatcher.prepare(minecraft.level, mainCamera, minecraft.crosshairPickEntity); - RealCameraCore.computeCamera(minecraft, deltaTick); - } - } - - @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;prepareCullFrustum(Lnet/minecraft/world/phys/Vec3;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V")) - private void realcamera$atPrepareCullFrustum(DeltaTracker deltaTracker, CallbackInfo ci, @Local(ordinal = 1) Matrix4f modelView) { - if (RealCameraCore.isActive()) { - modelView.rotateLocalZ(RealCameraCore.getRoll(0) * (float) (Math.PI / 180.0)); + minecraft.getEntityRenderDispatcher().prepare(mainCamera, minecraft.crosshairPickEntity); + RealCameraCore.computeCamera(minecraft, partialTicks); } - CompatibilityHelper.forceSetCameraPos(mainCamera); } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java index 3ad8d270..d5a25a84 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java @@ -5,7 +5,7 @@ import com.xtracr.realcamera.util.CrosshairUtil; import net.minecraft.client.DeltaTracker; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,18 +13,18 @@ @Mixin(Gui.class) public abstract class MixinGui { - @Inject(method = "renderCrosshair", at = @At("HEAD")) - private void realcamera$atRenderCrosshairHEAD(GuiGraphics guiGraphics, DeltaTracker deltaTracker, CallbackInfo ci) { + @Inject(method = "extractCrosshair", at = @At("HEAD")) + private void realcamera$atRenderCrosshairHEAD(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { - guiGraphics.pose().pushPose(); - CrosshairUtil.translateMatrices(guiGraphics.pose()); + graphics.pose().pushMatrix(); + CrosshairUtil.translateMatrices(graphics.pose()); } } - @Inject(method = "renderCrosshair", at = @At("RETURN")) - private void realcamera$atRenderCrosshairRETURN(GuiGraphics guiGraphics, DeltaTracker deltaTracker, CallbackInfo ci) { + @Inject(method = "extractCrosshair", at = @At("RETURN")) + private void realcamera$atRenderCrosshairRETURN(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { - guiGraphics.pose().popPose(); + graphics.pose().popMatrix(); } } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java index a94ee2ae..2d99dcb1 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java @@ -1,5 +1,6 @@ package com.xtracr.realcamera.mixin; +import com.mojang.datafixers.util.Pair; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.config.ConfigFile; import com.xtracr.realcamera.util.RaycastUtil; @@ -8,6 +9,7 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -18,8 +20,9 @@ public abstract class MixinItem { @Inject(method = "getPlayerPOVHitResult", at = @At("HEAD"), cancellable = true) private static void realcamera$coverHitResult(Level level, Player player, ClipContext.Fluid fluid, CallbackInfoReturnable cir) { if (!ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { - RaycastUtil.update(player, 25.0d, 1.0f); - cir.setReturnValue(level.clip(RaycastUtil.getClipContext(ClipContext.Block.OUTLINE, fluid, player))); + double interactionRange = player.blockInteractionRange(); + Pair fromAndTo = RaycastUtil.getFromAndTo(player, interactionRange * interactionRange, 1.0f); + cir.setReturnValue(level.clip(new ClipContext(fromAndTo.getFirst(), fromAndTo.getSecond(), ClipContext.Block.OUTLINE, fluid, player))); } } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItemInHandRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItemInHandRenderer.java index f735ceeb..d83e0209 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItemInHandRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItemInHandRenderer.java @@ -4,7 +4,7 @@ import com.xtracr.realcamera.compat.DisableHelper; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.ItemInHandRenderer; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,7 +13,7 @@ @Mixin(ItemInHandRenderer.class) public abstract class MixinItemInHandRenderer { @Inject(method = "renderHandsWithItems", at = @At("HEAD"), cancellable = true) - private void realcamera$cancelRender(float f, PoseStack poseStack, MultiBufferSource.BufferSource bufferSource, LocalPlayer localPlayer, int i, CallbackInfo ci) { - if (DisableHelper.RENDER_HANDS.disabled(localPlayer)) ci.cancel(); + private void realcamera$cancelRender(float frameInterp, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, LocalPlayer player, int lightCoords, CallbackInfo ci) { + if (DisableHelper.RENDER_HANDS.disabled(player)) ci.cancel(); } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java index 215e8a0d..c293afb3 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java @@ -1,16 +1,25 @@ package com.xtracr.realcamera.mixin; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.mojang.blaze3d.vertex.PoseStack; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.config.ConfigFile; -import net.minecraft.client.Camera; +import com.xtracr.realcamera.util.CrosshairUtil; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.world.TickRateManager; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; -import org.joml.Matrix4f; +import org.joml.Matrix4fc; +import org.joml.Vector4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,24 +30,32 @@ @Mixin(LevelRenderer.class) public abstract class MixinLevelRenderer { @Shadow - @Final private Minecraft minecraft; + @Final + private Minecraft minecraft; @Shadow - @Final private RenderBuffers renderBuffers; + @Final + private EntityRenderDispatcher entityRenderDispatcher; - @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endLastBatch()V", ordinal = 0)) - private void realcamera$renderCameraEntity(DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f modelView, Matrix4f projection, CallbackInfo ci) { + @Inject(method = "renderLevel", at = @At("HEAD")) + private void realcamera$atRenderLevelHead(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { + if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + CrosshairUtil.update(minecraft, cameraState.pos, modelViewMatrix, cameraState.projectionMatrix); + } + } + + @Inject(method = "submitEntities", at = @At(value = "RETURN")) + private void realcamera$submitCameraEntity(PoseStack poseStack, LevelRenderState levelRenderState, SubmitNodeCollector output, CallbackInfo ci) { if (!RealCameraCore.isRendering()) return; - MultiBufferSource.BufferSource bufferSource = renderBuffers.bufferSource(); - Entity entity = camera.getEntity(); + Entity entity = minecraft.getCameraEntity(); TickRateManager tickManager = minecraft.level.tickRateManager(); - float deltaTick = deltaTracker.getGameTimeDeltaPartialTick(!tickManager.isEntityFrozen(entity)); - if (!ConfigFile.config().isClassic()) RealCameraCore.renderCameraEntity(minecraft, deltaTick, bufferSource, modelView); + float partialTicks = minecraft.getDeltaTracker().getGameTimeDeltaPartialTick(!tickManager.isEntityFrozen(entity)); + CameraRenderState cameraState = levelRenderState.cameraRenderState; + if (!ConfigFile.config().isClassic()) + RealCameraCore.renderCameraEntity(minecraft, partialTicks, output, cameraState.viewRotationMatrix); else { - Vec3 cameraPos = camera.getPosition(); - renderEntity(entity, cameraPos.x(), cameraPos.y(), cameraPos.z(), deltaTick, new PoseStack(), bufferSource); + Vec3 cameraPos = cameraState.pos; + EntityRenderState state = entityRenderDispatcher.extractEntity(entity, partialTicks); + entityRenderDispatcher.submit(state, cameraState, state.x - cameraPos.x, state.y - cameraPos.y, state.z - cameraPos.z, poseStack, output); } } - - @Shadow - protected abstract void renderEntity(Entity entity, double cameraX, double cameraY, double cameraZ, float deltaTick, PoseStack poseStack, MultiBufferSource bufferSource); } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java index ca966092..307d0788 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java @@ -1,40 +1,67 @@ package com.xtracr.realcamera.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.authlib.GameProfile; +import com.mojang.datafixers.util.Pair; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.compat.DisableHelper; import com.xtracr.realcamera.config.ConfigFile; +import com.xtracr.realcamera.util.CrosshairUtil; import com.xtracr.realcamera.util.RaycastUtil; +import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.level.ClipContext; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; 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; +import java.util.function.Predicate; + @Mixin(LocalPlayer.class) public abstract class MixinLocalPlayer extends AbstractClientPlayer { public MixinLocalPlayer(ClientLevel world, GameProfile profile) { super(world, profile); } + @WrapOperation(method = "pick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ProjectileUtil;getEntityHitResult(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;D)Lnet/minecraft/world/phys/EntityHitResult;")) + private static @Nullable EntityHitResult realcamera$wrapGetEntityHitResult(Entity except, Vec3 from, Vec3 to, AABB box, Predicate matching, double maxValue, Operation original, Entity cameraEntity, double blockInteractionRange, double entityInteractionRange, float partialTicks) { + if (!ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + double interactionRange = Math.max(blockInteractionRange, entityInteractionRange); + Pair fromAndTo = RaycastUtil.getFromAndTo(cameraEntity, interactionRange * interactionRange, partialTicks); + Vec3 newFrom = fromAndTo.getFirst(); + Vec3 newTo = fromAndTo.getSecond(); + Minecraft client = Minecraft.getInstance(); + double sqDistance = client.hitResult != null ? client.hitResult.getLocation().distanceToSqr(newFrom) : newTo.distanceToSqr(newFrom); + AABB newBox = cameraEntity.getBoundingBox().expandTowards(cameraEntity.getViewVector(partialTicks).scale(interactionRange)).inflate(1.0, 1.0, 1.0); + CrosshairUtil.capturedEntityHitResult = ProjectileUtil.getEntityHitResult(except, newFrom, newTo, newBox, matching, sqDistance); + return CrosshairUtil.capturedEntityHitResult; + } + return original.call(except, from, to, box, matching, maxValue); + } + @Inject(method = "getRopeHoldPosition", at = @At("HEAD"), cancellable = true) - private void realcamera$atGetRopePosHEAD(float deltaTick, CallbackInfoReturnable cir) { - if (DisableHelper.RENDER_HANDS.disabled(this)) cir.setReturnValue(super.getRopeHoldPosition(deltaTick)); + private void realcamera$atGetRopePosHEAD(float partialTickTime, CallbackInfoReturnable cir) { + if (DisableHelper.RENDER_HANDS.disabled(this)) cir.setReturnValue(super.getRopeHoldPosition(partialTickTime)); } @Override - public @NotNull HitResult pick(double maxDistance, float deltaTick, boolean includeFluids) { + public @NonNull HitResult pick(double maxDistance, float partialTicks, boolean includeFluids) { if (!ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { - RaycastUtil.update(this, maxDistance * maxDistance, deltaTick); - return level().clip(RaycastUtil.getClipContext(ClipContext.Block.OUTLINE, - includeFluids ? ClipContext.Fluid.ANY : ClipContext.Fluid.NONE, this)); + Pair fromAndTo = RaycastUtil.getFromAndTo(this, maxDistance * maxDistance, partialTicks); + return level().clip(new ClipContext(fromAndTo.getFirst(), fromAndTo.getSecond(), ClipContext.Block.OUTLINE, includeFluids ? ClipContext.Fluid.ANY : ClipContext.Fluid.NONE, this)); } - return super.pick(maxDistance, deltaTick, includeFluids); + return super.pick(maxDistance, partialTicks, includeFluids); } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinPlayerRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinPlayerRenderer.java deleted file mode 100644 index 684b8f56..00000000 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinPlayerRenderer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.xtracr.realcamera.mixin; - -import net.minecraft.client.renderer.entity.player.PlayerRenderer; -import net.minecraft.util.Mth; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(PlayerRenderer.class) -public abstract class MixinPlayerRenderer { - @Redirect(method = "setupRotations(Lnet/minecraft/client/player/AbstractClientPlayer;Lcom/mojang/blaze3d/vertex/PoseStack;FFFF)V", at = @At(value = "INVOKE", target = "Ljava/lang/Math;acos(D)D")) - private double realcamera$fixVanillaFallFlying(double n) { - return Math.acos(Mth.clamp(n, -1.0, 1.0)); - } -} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java index 61bd985f..c0cba4bd 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java @@ -3,20 +3,20 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.config.ConfigFile; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.entity.layers.StuckInBodyLayer; -import net.minecraft.world.entity.LivingEntity; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; 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.CallbackInfo; @Mixin(StuckInBodyLayer.class) -public abstract class MixinStuckInBodyLayer { - @Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/world/entity/LivingEntity;FFFFFF)V", at = @At("HEAD"), cancellable = true) - private void realcamera$cancelRender(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { - if (livingEntity instanceof LocalPlayer && RealCameraCore.isRendering() && !ConfigFile.config().isClassic() && !ConfigFile.config().renderStuckObjects()) { +public abstract class MixinStuckInBodyLayer { + @Inject(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/AvatarRenderState;FF)V", at = @At("HEAD"), cancellable = true) + private void realcamera$cancelRender(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, AvatarRenderState state, float yRot, float xRot, CallbackInfo ci) { + if (RealCameraCore.isRendering() && state.id == Minecraft.getInstance().getCameraEntity().getId() && !ConfigFile.config().isClassic() && !ConfigFile.config().renderStuckObjects()) { ci.cancel(); } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/AvatarRendererAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/AvatarRendererAccessor.java new file mode 100644 index 00000000..e59c811d --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/AvatarRendererAccessor.java @@ -0,0 +1,16 @@ +package com.xtracr.realcamera.mixin.accessor; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.player.AvatarRenderer; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(AvatarRenderer.class) +public interface AvatarRendererAccessor { + @Invoker + void invokeSetupRotations(AvatarRenderState renderState, PoseStack poseStack, float bodyRot, float entityScale); + + @Invoker + void invokeScale(AvatarRenderState renderState, PoseStack poseStack); +} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/CameraAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/CameraAccessor.java deleted file mode 100644 index c536cc0e..00000000 --- a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/CameraAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.xtracr.realcamera.mixin.accessor; - -import net.minecraft.client.Camera; -import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(Camera.class) -public interface CameraAccessor { - @Invoker - void invokeSetPosition(Vec3 position); -} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/CustomFeatureRenderer$StorageAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/CustomFeatureRenderer$StorageAccessor.java new file mode 100644 index 00000000..c428ad24 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/CustomFeatureRenderer$StorageAccessor.java @@ -0,0 +1,19 @@ +package com.xtracr.realcamera.mixin.accessor; + +import net.minecraft.client.renderer.SubmitNodeStorage; +import net.minecraft.client.renderer.feature.CustomFeatureRenderer; +import net.minecraft.client.renderer.rendertype.RenderType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.Map; + +@Mixin(CustomFeatureRenderer.Storage.class) +public interface CustomFeatureRenderer$StorageAccessor { + @Accessor + Map> getSolidCustomGeometrySubmits(); + + @Accessor + Map> getTranslucentCustomGeometrySubmits(); +} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/GameRendererAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/GameRendererAccessor.java deleted file mode 100644 index 5f622e32..00000000 --- a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/GameRendererAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.xtracr.realcamera.mixin.accessor; - -import net.minecraft.client.renderer.GameRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(GameRenderer.class) -public interface GameRendererAccessor { - @Accessor - float getFov(); - - @Accessor - float getOldFov(); -} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/GuiGraphicsExtractorAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/GuiGraphicsExtractorAccessor.java new file mode 100644 index 00000000..f1ac30ef --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/GuiGraphicsExtractorAccessor.java @@ -0,0 +1,15 @@ +package com.xtracr.realcamera.mixin.accessor; + +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.state.gui.GuiRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GuiGraphicsExtractor.class) +public interface GuiGraphicsExtractorAccessor { + @Accessor + GuiGraphicsExtractor.ScissorStack getScissorStack(); + + @Accessor + GuiRenderState getGuiRenderState(); +} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelFeatureRenderer$StorageAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelFeatureRenderer$StorageAccessor.java new file mode 100644 index 00000000..938325c9 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelFeatureRenderer$StorageAccessor.java @@ -0,0 +1,19 @@ +package com.xtracr.realcamera.mixin.accessor; + +import net.minecraft.client.renderer.SubmitNodeStorage; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.client.renderer.rendertype.RenderType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.Map; + +@Mixin(ModelFeatureRenderer.Storage.class) +public interface ModelFeatureRenderer$StorageAccessor { + @Accessor + Map>> getSolidModelSubmits(); + + @Accessor + List> getTranslucentModelSubmits(); +} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelPartFeatureRenderer$StorageAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelPartFeatureRenderer$StorageAccessor.java new file mode 100644 index 00000000..77141613 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/ModelPartFeatureRenderer$StorageAccessor.java @@ -0,0 +1,19 @@ +package com.xtracr.realcamera.mixin.accessor; + +import net.minecraft.client.renderer.SubmitNodeStorage; +import net.minecraft.client.renderer.feature.ModelPartFeatureRenderer; +import net.minecraft.client.renderer.rendertype.RenderType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.Map; + +@Mixin(ModelPartFeatureRenderer.Storage.class) +public interface ModelPartFeatureRenderer$StorageAccessor { + @Accessor + Map> getSolidModelPartSubmits(); + + @Accessor + Map> getTranslucentModelPartSubmits(); +} diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/PlayerRendererAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/PlayerRendererAccessor.java deleted file mode 100644 index 4f3bb757..00000000 --- a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/PlayerRendererAccessor.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.xtracr.realcamera.mixin.accessor; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.entity.player.PlayerRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(PlayerRenderer.class) -public interface PlayerRendererAccessor { - @Invoker - void invokeSetModelProperties(AbstractClientPlayer abstractClientPlayer); - - @Invoker - void invokeSetupRotations(AbstractClientPlayer livingEntity, PoseStack poseStack, float f, float g, float deltaTick, float i); - - @Invoker - void invokeScale(AbstractClientPlayer livingEntity, PoseStack poseStack, float deltaTick); -} diff --git a/common/src/main/java/com/xtracr/realcamera/util/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java similarity index 93% rename from common/src/main/java/com/xtracr/realcamera/util/BuiltIterableBuffer.java rename to common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index 5f5e7f25..c3f0869b 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -1,10 +1,10 @@ -package com.xtracr.realcamera.util; - +package com.xtracr.realcamera.renderer; import com.mojang.blaze3d.vertex.MeshData; -import com.xtracr.realcamera.util.VertexData.UV; -import net.minecraft.client.renderer.RenderType; -import org.jetbrains.annotations.Nullable; +import com.xtracr.realcamera.renderer.state.VertexData; +import com.xtracr.realcamera.renderer.state.VertexData.UV; +import net.minecraft.client.renderer.rendertype.RenderType; +import org.jspecify.annotations.Nullable; import java.awt.*; import java.util.HashMap; @@ -93,7 +93,7 @@ public boolean anyNotCached(UV[] uvs) { uvCache[j * 2] = primitive[j].u(); uvCache[j * 2 + 1] = primitive[j].v(); } - FIND_PRIMITIVE_CACHE.computeIfAbsent(renderType, k -> new HashMap<>()).put(uv, uvCache); + FIND_PRIMITIVE_CACHE.computeIfAbsent(renderType, _ -> new HashMap<>()).put(uv, uvCache); primitives[i] = VertexData.asImmutable(primitive); } return allFound; diff --git a/common/src/main/java/com/xtracr/realcamera/util/IterableVertexBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java similarity index 86% rename from common/src/main/java/com/xtracr/realcamera/util/IterableVertexBuffer.java rename to common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java index 8c67957b..d080fa59 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/IterableVertexBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java @@ -1,13 +1,13 @@ -package com.xtracr.realcamera.util; +package com.xtracr.realcamera.renderer; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.MeshData; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormatElement; -import com.xtracr.realcamera.util.VertexData.MutableVertex; -import net.minecraft.util.FastColor; +import com.xtracr.realcamera.renderer.state.VertexData; +import com.xtracr.realcamera.renderer.state.VertexData.MutableVertex; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -20,12 +20,13 @@ public class IterableVertexBuffer implements Iterable { private static final boolean IS_LITTLE_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN; + private static final float NORMAL_SCALE = 1.0f / 127.0f; public final int vertexCount, vertexSize; private final MutableVertex reusableVertex = VertexData.mutable(); private final Iterable primitives; private final ByteBuffer buffer; private final int positionOffset, colorOffset, uvOffset, overlayOffset, lightOffset, normalOffset; - private final boolean hasPosition, hasColor, hasUV, hasOverlay, hasLight, hasNormal, fastFormat; + private final boolean hasPosition, hasColor, hasUV, hasOverlay, hasLight, hasNormal, fullFormat; public IterableVertexBuffer(MeshData meshData) { buffer = meshData.vertexBuffer(); @@ -45,9 +46,9 @@ public IterableVertexBuffer(MeshData meshData) { hasOverlay = overlayOffset != -1; hasLight = lightOffset != -1; hasNormal = normalOffset != -1; - fastFormat = format == DefaultVertexFormat.NEW_ENTITY; + fullFormat = vertexSize == DefaultVertexFormat.ENTITY.getVertexSize(); boolean isQuad = drawState.mode() == VertexFormat.Mode.QUADS; - primitives = fastFormat && isQuad ? new FastQuadReader() : new PrimitiveReader(drawState.mode()); + primitives = fullFormat && isQuad ? new FastQuadReader() : new PrimitiveReader(drawState.mode()); } public Iterable primitives() { @@ -63,13 +64,29 @@ public Stream primitiveStream() { } public VertexData readVertexAt(int index) { + Objects.checkIndex(index, vertexCount); return readVertexAt(index, reusableVertex); } - public MutableVertex readVertexAt(int index, MutableVertex mutable) { - Objects.checkIndex(index, vertexCount); + @Override + public @NonNull Iterator iterator() { + return new VertexIterator(); + } + + @Override + public Spliterator spliterator() { + return new VertexSpliterator(0, vertexCount); + } + + private int readColor(int offset) { + // net.minecraft.util.ARGB.fromABGR(abgr) + int abgr = IS_LITTLE_ENDIAN ? buffer.getInt(offset) : Integer.reverseBytes(buffer.getInt(offset)); + return (abgr & 0xFF00FF00) | (abgr & 0xFF0000) >> 16 | (abgr & 0xFF) << 16; + } + + private MutableVertex readVertexAt(int index, MutableVertex mutable) { int vertexOffset = index * vertexSize; - if (fastFormat) { + if (fullFormat) { mutable.x = buffer.getFloat(vertexOffset); mutable.y = buffer.getFloat(vertexOffset + 4); mutable.z = buffer.getFloat(vertexOffset + 8); @@ -78,9 +95,9 @@ public MutableVertex readVertexAt(int index, MutableVertex mutable) { mutable.v = buffer.getFloat(vertexOffset + 20); mutable.overlay = buffer.getInt(vertexOffset + 24); mutable.light = buffer.getInt(vertexOffset + 28); - mutable.normalX = buffer.get(vertexOffset + 32) / 127.0f; - mutable.normalY = buffer.get(vertexOffset + 33) / 127.0f; - mutable.normalZ = buffer.get(vertexOffset + 34) / 127.0f; + mutable.normalX = buffer.get(vertexOffset + 32) * NORMAL_SCALE; + mutable.normalY = buffer.get(vertexOffset + 33) * NORMAL_SCALE; + mutable.normalZ = buffer.get(vertexOffset + 34) * NORMAL_SCALE; return mutable; } if (hasPosition) { @@ -105,28 +122,13 @@ public MutableVertex readVertexAt(int index, MutableVertex mutable) { } if (hasNormal) { int offset = vertexOffset + normalOffset; - mutable.normalX = buffer.get(offset) / 127.0f; - mutable.normalY = buffer.get(offset + 1) / 127.0f; - mutable.normalZ = buffer.get(offset + 2) / 127.0f; + mutable.normalX = buffer.get(offset) * NORMAL_SCALE; + mutable.normalY = buffer.get(offset + 1) * NORMAL_SCALE; + mutable.normalZ = buffer.get(offset + 2) * NORMAL_SCALE; } return mutable; } - @Override - public @NotNull Iterator iterator() { - return new VertexIterator(); - } - - @Override - public Spliterator spliterator() { - return new VertexSpliterator(0, vertexCount); - } - - private int readColor(int offset) { - // ABGR2ARGB is the same as ARGB2ABGR - return FastColor.ABGR32.fromArgb32(IS_LITTLE_ENDIAN ? buffer.getInt(offset) : Integer.reverseBytes(buffer.getInt(offset))); - } - private class VertexPointer implements VertexData { protected int bytePointer = 0; @@ -150,7 +152,8 @@ public float z() { @Override public Vec3 position() { - if (hasPosition) return new Vec3(buffer.getFloat(bytePointer + positionOffset), buffer.getFloat(bytePointer + positionOffset + 4), buffer.getFloat(bytePointer + positionOffset + 8)); + if (hasPosition) + return new Vec3(buffer.getFloat(bytePointer + positionOffset), buffer.getFloat(bytePointer + positionOffset + 4), buffer.getFloat(bytePointer + positionOffset + 8)); return Vec3.ZERO; } @@ -174,7 +177,8 @@ public float v() { @Override public UV uv() { - if (hasUV) return new UV(buffer.getFloat(bytePointer + uvOffset), buffer.getFloat(bytePointer + uvOffset + 4)); + if (hasUV) + return new UV(buffer.getFloat(bytePointer + uvOffset), buffer.getFloat(bytePointer + uvOffset + 4)); return new UV(0, 0); } @@ -192,31 +196,32 @@ public int light() { @Override public float normalX() { - if (hasNormal) return buffer.get(bytePointer + normalOffset) / 127.0f; + if (hasNormal) return buffer.get(bytePointer + normalOffset) * NORMAL_SCALE; return 0; } @Override public float normalY() { - if (hasNormal) return buffer.get(bytePointer + normalOffset + 1) / 127.0f; + if (hasNormal) return buffer.get(bytePointer + normalOffset + 1) * NORMAL_SCALE; return 0; } @Override public float normalZ() { - if (hasNormal) return buffer.get(bytePointer + normalOffset + 2) / 127.0f; + if (hasNormal) return buffer.get(bytePointer + normalOffset + 2) * NORMAL_SCALE; return 0; } @Override public Vec3 normal() { - if (hasNormal) return new Vec3(buffer.get(bytePointer + normalOffset) / 127.0f, buffer.get(bytePointer + normalOffset + 1) / 127.0f, buffer.get(bytePointer + normalOffset + 2) / 127.0f); + if (hasNormal) + return new Vec3(buffer.get(bytePointer + normalOffset) * NORMAL_SCALE, buffer.get(bytePointer + normalOffset + 1) * NORMAL_SCALE, buffer.get(bytePointer + normalOffset + 2) * NORMAL_SCALE); return Vec3.ZERO; } @Override public VertexData asImmutable() { - if (fastFormat) { + if (fullFormat) { return new ImmutableVertex(buffer.getFloat(bytePointer), buffer.getFloat(bytePointer + 4), buffer.getFloat(bytePointer + 8), @@ -225,9 +230,9 @@ public VertexData asImmutable() { buffer.getFloat(bytePointer + 20), buffer.getInt(bytePointer + 24), buffer.getInt(bytePointer + 28), - buffer.get(bytePointer + 32) / 127.0f, - buffer.get(bytePointer + 33) / 127.0f, - buffer.get(bytePointer + 34) / 127.0f); + buffer.get(bytePointer + 32) * NORMAL_SCALE, + buffer.get(bytePointer + 33) * NORMAL_SCALE, + buffer.get(bytePointer + 34) * NORMAL_SCALE); } return VertexData.super.asImmutable(); } @@ -242,7 +247,7 @@ public boolean hasNext() { } @Override - public @NotNull VertexData next() { + public @NonNull VertexData next() { bytePointer += vertexSize; return this; } @@ -303,7 +308,7 @@ public PrimitiveReader(VertexFormat.Mode drawMode) { } @Override - public @NotNull Iterator iterator() { + public @NonNull Iterator iterator() { return new PrimitiveIterator(); } @@ -397,7 +402,7 @@ private class FastQuadReader implements Iterable { private final int quadCount = vertexCount / 4; @Override - public @NotNull Iterator iterator() { + public @NonNull Iterator iterator() { return new FastQuadIterator(); } @@ -418,9 +423,9 @@ private void fastReadQuadAt(int index, MutableVertex[] quad) { mutable.v = buffer.getFloat(vertexOffset + 20); mutable.overlay = buffer.getInt(vertexOffset + 24); mutable.light = buffer.getInt(vertexOffset + 28); - mutable.normalX = buffer.get(vertexOffset + 32) / 127.0f; - mutable.normalY = buffer.get(vertexOffset + 33) / 127.0f; - mutable.normalZ = buffer.get(vertexOffset + 34) / 127.0f; + mutable.normalX = buffer.get(vertexOffset + 32) * NORMAL_SCALE; + mutable.normalY = buffer.get(vertexOffset + 33) * NORMAL_SCALE; + mutable.normalZ = buffer.get(vertexOffset + 34) * NORMAL_SCALE; } } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java new file mode 100644 index 00000000..43ff4b47 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java @@ -0,0 +1,195 @@ +package com.xtracr.realcamera.renderer; + +import com.mojang.blaze3d.vertex.*; +import com.xtracr.realcamera.mixin.accessor.CustomFeatureRenderer$StorageAccessor; +import com.xtracr.realcamera.mixin.accessor.ModelFeatureRenderer$StorageAccessor; +import com.xtracr.realcamera.mixin.accessor.ModelPartFeatureRenderer$StorageAccessor; +import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMaps; +import net.minecraft.client.model.Model; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollection; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.SubmitNodeStorage; +import net.minecraft.client.renderer.feature.FeatureRenderDispatcher; +import net.minecraft.client.renderer.rendertype.RenderType; +import org.jspecify.annotations.NonNull; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.SequencedMap; +import java.util.function.Consumer; + +public class MultiVertexCatcher { + private final SubmitNodeStorage storage = new SubmitNodeStorage(); + private final MeshCatcher meshCatcher = new MeshCatcher(); + + private MultiVertexCatcher() { } + + public static MultiVertexCatcher create() { + return new MultiVertexCatcher(); + } + + private static void renderModel(PoseStack poseStack, SubmitNodeStorage.ModelSubmit submit, VertexConsumer buffer) { + poseStack.pushPose(); + poseStack.last().set(submit.pose()); + Model model = submit.model(); + //noinspection resource + VertexConsumer wrappedBuffer = submit.sprite() == null ? buffer : submit.sprite().wrap(buffer); + model.setupAnim(submit.state()); + model.renderToBuffer(poseStack, wrappedBuffer, submit.lightCoords(), submit.overlayCoords(), submit.tintedColor()); + poseStack.popPose(); + } + + private static void renderModelParts(PoseStack poseStack, Map> modelPartSubmitsMap, MultiBufferSource.BufferSource bufferSource) { + poseStack.pushPose(); + for (Map.Entry> entry : modelPartSubmitsMap.entrySet()) { + RenderType renderType = entry.getKey(); + List modelPartSubmits = entry.getValue(); + VertexConsumer buffer = bufferSource.getBuffer(renderType); + + for (SubmitNodeStorage.ModelPartSubmit submit : modelPartSubmits) { + //noinspection resource + VertexConsumer wrappedBuffer = submit.sprite() == null ? buffer : submit.sprite().wrap(buffer); + poseStack.last().set(submit.pose()); + submit.modelPart().render(poseStack, wrappedBuffer, submit.lightCoords(), submit.overlayCoords(), submit.tintedColor()); + } + } + poseStack.popPose(); + } + + private static void renderCustomGeometry(Map> customGeometrySubmits, MultiBufferSource.BufferSource bufferSource) { + for (Map.Entry> entry : customGeometrySubmits.entrySet()) { + VertexConsumer buffer = bufferSource.getBuffer(entry.getKey()); + for (SubmitNodeStorage.CustomGeometrySubmit customGeometrySubmit : entry.getValue()) { + customGeometrySubmit.customGeometryRenderer().render(customGeometrySubmit.pose(), buffer); + } + } + } + + /** @see FeatureRenderDispatcher#renderSolidFeatures() */ + private void renderSolidFeatures() { + for (SubmitNodeCollection collection : storage.getSubmitsPerOrder().values()) { + PoseStack poseStack = new PoseStack(); + for (Map.Entry>> entry : ((ModelFeatureRenderer$StorageAccessor) collection.getModelSubmits()).getSolidModelSubmits().entrySet()) { + VertexConsumer buffer = meshCatcher.getBuffer(entry.getKey()); + for (SubmitNodeStorage.ModelSubmit submit : entry.getValue()) { + renderModel(poseStack, submit, buffer); + } + } + renderModelParts(poseStack, ((ModelPartFeatureRenderer$StorageAccessor) collection.getModelPartSubmits()).getSolidModelPartSubmits(), meshCatcher); + renderCustomGeometry(((CustomFeatureRenderer$StorageAccessor) collection.getCustomGeometrySubmits()).getSolidCustomGeometrySubmits(), meshCatcher); + } + } + + /** @see FeatureRenderDispatcher#renderTranslucentFeatures() */ + private void renderTranslucentFeatures() { + for (SubmitNodeCollection collection : storage.getSubmitsPerOrder().values()) { + PoseStack poseStack = new PoseStack(); + for (SubmitNodeStorage.TranslucentModelSubmit submit : ((ModelFeatureRenderer$StorageAccessor) collection.getModelSubmits()).getTranslucentModelSubmits()) { + renderModel(poseStack, submit.modelSubmit(), meshCatcher.getBuffer(submit.renderType())); + } + renderModelParts(poseStack, ((ModelPartFeatureRenderer$StorageAccessor) collection.getModelPartSubmits()).getTranslucentModelPartSubmits(), meshCatcher); + renderCustomGeometry(((CustomFeatureRenderer$StorageAccessor) collection.getCustomGeometrySubmits()).getTranslucentCustomGeometrySubmits(), meshCatcher); + } + } + + public SubmitNodeCollector initCollector() { + meshCatcher.initialize(); + return storage; + } + + public void endCatching(Consumer consumer) { + if (storage.getSubmitsPerOrder().isEmpty()) return; + renderSolidFeatures(); + renderTranslucentFeatures(); + storage.clear(); + meshCatcher.endCatching(consumer); + } + + static class MeshCatcher extends MultiBufferSource.BufferSource { + private final SequencedMap bufferPools = new Object2ObjectLinkedOpenHashMap<>(); + private final SequencedMap caughtMeshes = new Object2ObjectLinkedOpenHashMap<>(); + + protected MeshCatcher() { + super(new ByteBufferBuilder(0), Object2ObjectSortedMaps.emptyMap()); + } + + @Override + public @NonNull VertexConsumer getBuffer(@NonNull RenderType renderType) { + BufferBuilder bufferBuilder = startedBuilders.get(renderType); + if (bufferBuilder != null) { + endBatch(renderType, bufferBuilder); + } + ByteBufferBuilderPool bufferPool = bufferPools.computeIfAbsent(renderType, type -> new ByteBufferBuilderPool(type.bufferSize())); + bufferBuilder = new BufferBuilder(bufferPool.getBuffer(), renderType.mode(), renderType.format()); + startedBuilders.put(renderType, bufferBuilder); + return bufferBuilder; + } + + public void initialize() { + for (MeshData meshData : caughtMeshes.keySet()) { + meshData.close(); + } + caughtMeshes.clear(); + bufferPools.values().forEach(ByteBufferBuilderPool::release); + } + + public void endCatching(Consumer consumer) { + endBatch(); + for (Map.Entry entry : caughtMeshes.entrySet()) { + MeshData meshData = entry.getKey(); + consumer.accept(BuiltIterableBuffer.buildFrom(entry.getValue(), meshData)); + } + } + + @Override + public void endBatch() { + for (RenderType renderType : bufferPools.keySet()) { + endBatch(renderType); + } + } + + @Override + public void endBatch(@NonNull RenderType type) { + BufferBuilder builder = this.startedBuilders.remove(type); + if (builder != null) { + endBatch(type, builder); + } + } + + @Override + protected void endBatch(@NonNull RenderType renderType, BufferBuilder bufferBuilder) { + MeshData meshData = bufferBuilder.build(); + if (meshData != null) { + caughtMeshes.put(meshData, renderType); + } + } + + private static class ByteBufferBuilderPool { + private final int bufferSize; + private ByteBufferBuilder[] pool = new ByteBufferBuilder[0]; + private int next = 0; + + public ByteBufferBuilderPool(int bufferSize) { + this.bufferSize = bufferSize; + } + + public ByteBufferBuilder getBuffer() { + ByteBufferBuilder byteBufferBuilder; + if (next < pool.length) { + byteBufferBuilder = pool[next++]; + } else { + pool = Arrays.copyOf(pool, pool.length + 1); + pool[next++] = byteBufferBuilder = new ByteBufferBuilder(bufferSize); + } + return byteBufferBuilder; + } + + public void release() { + next = 0; + } + } + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java b/common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java new file mode 100644 index 00000000..fcd8c0cf --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java @@ -0,0 +1,182 @@ +package com.xtracr.realcamera.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.Font; +import net.minecraft.client.model.Model; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.OrderedSubmitNodeCollector; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.block.MovingBlockRenderState; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.geometry.BakedQuad; +import net.minecraft.network.chat.Component; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.phys.Vec3; +import org.joml.Quaternionf; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +public class RoutingSubmitCollector implements SubmitNodeCollector { + private final SubmitNodeCollector defaultCollector; + private final SubmitNodeCollector modelCollector; + + public RoutingSubmitCollector(SubmitNodeCollector defaultCollector, SubmitNodeCollector modelCollector) { + this.defaultCollector = defaultCollector; + this.modelCollector = modelCollector; + } + + @Override + public @NonNull OrderedSubmitNodeCollector order(int order) { + return new RoutingOrderedCollector(order); + } + + @Override + public void submitShadow(@NonNull PoseStack poseStack, float radius, @NonNull List pieces) { + defaultCollector.submitShadow(poseStack, radius, pieces); + } + + @Override + public void submitNameTag(@NonNull PoseStack poseStack, @Nullable Vec3 nameTagAttachment, int offset, @NonNull Component name, boolean seeThrough, int lightCoords, double distanceToCameraSq, @NonNull CameraRenderState camera) { + defaultCollector.submitNameTag(poseStack, nameTagAttachment, offset, name, seeThrough, lightCoords, distanceToCameraSq, camera); + } + + @Override + public void submitText(@NonNull PoseStack poseStack, float x, float y, @NonNull FormattedCharSequence string, boolean dropShadow, Font.@NonNull DisplayMode displayMode, int lightCoords, int color, int backgroundColor, int outlineColor) { + defaultCollector.submitText(poseStack, x, y, string, dropShadow, displayMode, lightCoords, color, backgroundColor, outlineColor); + } + + @Override + public void submitFlame(@NonNull PoseStack poseStack, @NonNull EntityRenderState renderState, @NonNull Quaternionf rotation) { + defaultCollector.submitFlame(poseStack, renderState, rotation); + } + + @Override + public void submitLeash(@NonNull PoseStack poseStack, EntityRenderState.@NonNull LeashState leashState) { + defaultCollector.submitLeash(poseStack, leashState); + } + + @Override + public void submitModel(@NonNull Model model, @NonNull S state, @NonNull PoseStack poseStack, @NonNull RenderType renderType, int lightCoords, int overlayCoords, int tintedColor, @Nullable TextureAtlasSprite sprite, int outlineColor, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay) { + modelCollector.submitModel(model, state, poseStack, renderType, lightCoords, overlayCoords, tintedColor, sprite, outlineColor, crumblingOverlay); + } + + @Override + public void submitModelPart(@NonNull ModelPart modelPart, @NonNull PoseStack poseStack, @NonNull RenderType renderType, int lightCoords, int overlayCoords, @Nullable TextureAtlasSprite sprite, boolean sheeted, boolean hasFoil, int tintedColor, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay, int outlineColor) { + modelCollector.submitModelPart(modelPart, poseStack, renderType, lightCoords, overlayCoords, sprite, sheeted, hasFoil, tintedColor, crumblingOverlay, outlineColor); + } + + @Override + public void submitMovingBlock(@NonNull PoseStack poseStack, @NonNull MovingBlockRenderState movingBlockRenderState) { + defaultCollector.submitMovingBlock(poseStack, movingBlockRenderState); + } + + @Override + public void submitBlockModel(@NonNull PoseStack poseStack, @NonNull RenderType renderType, @NonNull List parts, int @NonNull [] tintLayers, int lightCoords, int overlayCoords, int outlineColor) { + defaultCollector.submitBlockModel(poseStack, renderType, parts, tintLayers, lightCoords, overlayCoords, outlineColor); + } + + @Override + public void submitBreakingBlockModel(@NonNull PoseStack poseStack, @NonNull BlockStateModel model, long seed, int progress) { + defaultCollector.submitBreakingBlockModel(poseStack, model, seed, progress); + } + + @Override + public void submitItem(@NonNull PoseStack poseStack, @NonNull ItemDisplayContext displayContext, int lightCoords, int overlayCoords, int outlineColor, int @NonNull [] tintLayers, @NonNull List quads, ItemStackRenderState.@NonNull FoilType foilType) { + defaultCollector.submitItem(poseStack, displayContext, lightCoords, overlayCoords, outlineColor, tintLayers, quads, foilType); + } + + @Override + public void submitCustomGeometry(@NonNull PoseStack poseStack, @NonNull RenderType renderType, @NonNull CustomGeometryRenderer customGeometryRenderer) { + modelCollector.submitCustomGeometry(poseStack, renderType, customGeometryRenderer); + } + + @Override + public void submitParticleGroup(@NonNull ParticleGroupRenderer particleGroupRenderer) { + defaultCollector.submitParticleGroup(particleGroupRenderer); + } + + private class RoutingOrderedCollector implements OrderedSubmitNodeCollector { + private final OrderedSubmitNodeCollector defaultDelegate; + private final OrderedSubmitNodeCollector modelDelegate; + + RoutingOrderedCollector(int order) { + this.defaultDelegate = defaultCollector.order(order); + this.modelDelegate = modelCollector.order(order); + } + + @Override + public void submitShadow(@NonNull PoseStack poseStack, float radius, @NonNull List pieces) { + defaultDelegate.submitShadow(poseStack, radius, pieces); + } + + @Override + public void submitNameTag(@NonNull PoseStack poseStack, @Nullable Vec3 nameTagAttachment, int offset, @NonNull Component name, boolean seeThrough, int lightCoords, double distanceToCameraSq, @NonNull CameraRenderState camera) { + defaultDelegate.submitNameTag(poseStack, nameTagAttachment, offset, name, seeThrough, lightCoords, distanceToCameraSq, camera); + } + + @Override + public void submitText(@NonNull PoseStack poseStack, float x, float y, @NonNull FormattedCharSequence string, boolean dropShadow, Font.@NonNull DisplayMode displayMode, int lightCoords, int color, int backgroundColor, int outlineColor) { + defaultDelegate.submitText(poseStack, x, y, string, dropShadow, displayMode, lightCoords, color, backgroundColor, outlineColor); + } + + @Override + public void submitFlame(@NonNull PoseStack poseStack, @NonNull EntityRenderState renderState, @NonNull Quaternionf rotation) { + defaultDelegate.submitFlame(poseStack, renderState, rotation); + } + + @Override + public void submitLeash(@NonNull PoseStack poseStack, EntityRenderState.@NonNull LeashState leashState) { + defaultDelegate.submitLeash(poseStack, leashState); + } + + @Override + public void submitModel(@NonNull Model model, @NonNull S state, @NonNull PoseStack poseStack, @NonNull RenderType renderType, int lightCoords, int overlayCoords, int tintedColor, @Nullable TextureAtlasSprite sprite, int outlineColor, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay) { + modelDelegate.submitModel(model, state, poseStack, renderType, lightCoords, overlayCoords, tintedColor, sprite, outlineColor, crumblingOverlay); + } + + @Override + public void submitModelPart(@NonNull ModelPart modelPart, @NonNull PoseStack poseStack, @NonNull RenderType renderType, int lightCoords, int overlayCoords, @Nullable TextureAtlasSprite sprite, boolean sheeted, boolean hasFoil, int tintedColor, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay, int outlineColor) { + modelDelegate.submitModelPart(modelPart, poseStack, renderType, lightCoords, overlayCoords, sprite, sheeted, hasFoil, tintedColor, crumblingOverlay, outlineColor); + } + + @Override + public void submitMovingBlock(@NonNull PoseStack poseStack, @NonNull MovingBlockRenderState movingBlockRenderState) { + defaultDelegate.submitMovingBlock(poseStack, movingBlockRenderState); + } + + @Override + public void submitBlockModel(@NonNull PoseStack poseStack, @NonNull RenderType renderType, @NonNull List parts, int @NonNull [] tintLayers, int lightCoords, int overlayCoords, int outlineColor) { + defaultDelegate.submitBlockModel(poseStack, renderType, parts, tintLayers, lightCoords, overlayCoords, outlineColor); + } + + @Override + public void submitBreakingBlockModel(@NonNull PoseStack poseStack, @NonNull BlockStateModel model, long seed, int progress) { + defaultDelegate.submitBreakingBlockModel(poseStack, model, seed, progress); + } + + @Override + public void submitItem(@NonNull PoseStack poseStack, @NonNull ItemDisplayContext displayContext, int lightCoords, int overlayCoords, int outlineColor, int @NonNull [] tintLayers, @NonNull List quads, ItemStackRenderState.@NonNull FoilType foilType) { + defaultDelegate.submitItem(poseStack, displayContext, lightCoords, overlayCoords, outlineColor, tintLayers, quads, foilType); + } + + @Override + public void submitCustomGeometry(@NonNull PoseStack poseStack, @NonNull RenderType renderType, @NonNull CustomGeometryRenderer customGeometryRenderer) { + modelDelegate.submitCustomGeometry(poseStack, renderType, customGeometryRenderer); + } + + @Override + public void submitParticleGroup(@NonNull ParticleGroupRenderer particleGroupRenderer) { + defaultDelegate.submitParticleGroup(particleGroupRenderer); + } + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java new file mode 100644 index 00000000..25c39b35 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java @@ -0,0 +1,58 @@ +package com.xtracr.realcamera.renderer.gui; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.xtracr.realcamera.renderer.state.BuiltModelRecord; +import com.xtracr.realcamera.renderer.state.VertexData; +import com.xtracr.realcamera.renderer.state.gui.GuiCulledModelsRenderState; +import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import org.joml.Matrix3f; +import org.joml.Matrix4f; +import org.jspecify.annotations.NonNull; + +public class GuiCulledModelsRenderer extends PictureInPictureRenderer { + public GuiCulledModelsRenderer(MultiBufferSource.BufferSource bufferSource) { + super(bufferSource); + } + + @Override + public @NonNull Class getRenderStateClass() { + return GuiCulledModelsRenderState.class; + } + + @Override + protected void renderToTexture(@NonNull GuiCulledModelsRenderState renderState, @NonNull PoseStack poseStack) { + poseStack.mulPose(renderState.transform()); + + float minEntityZ = 0f, maxEntityZ = 200f; + for (BuiltModelRecord record : renderState.records()) { + for (VertexData vertex : record.vertices()) { + if (vertex.z() < minEntityZ) minEntityZ = vertex.z(); + if (vertex.z() > maxEntityZ) maxEntityZ = vertex.z(); + } + } + Matrix4f positionMatrix = poseStack.last().pose().scale(1, 1, 200 / (maxEntityZ - minEntityZ)).translate(0, 0, -minEntityZ); + Matrix3f normalMatrix = new Matrix3f(positionMatrix); + for (BuiltModelRecord record : renderState.records()) { + VertexConsumer buffer = bufferSource.getBuffer(record.renderType()); + if (!record.renderType().canConsolidateConsecutiveGeometry()) { + for (VertexData vertex : record.vertices()) vertex.render(buffer, positionMatrix, normalMatrix); + return; + } + for (VertexData[] primitive : record.primitives()) { + for (VertexData vertex : primitive) vertex.render(buffer, positionMatrix, normalMatrix); + } + } + } + + @Override + protected float getTranslateY(final int height, final int guiScale) { + return height / 2.0f; + } + + @Override + protected @NonNull String getTextureLabel() { + return "realcamera.culled_model"; + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java new file mode 100644 index 00000000..2513538e --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java @@ -0,0 +1,49 @@ +package com.xtracr.realcamera.renderer.gui; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.xtracr.realcamera.renderer.state.BuiltModelRecord; +import com.xtracr.realcamera.renderer.state.VertexData; +import com.xtracr.realcamera.renderer.state.gui.GuiFlattenedModelsRenderState; +import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.jspecify.annotations.NonNull; + +public class GuiFlattenedModelsRenderer extends PictureInPictureRenderer { + public GuiFlattenedModelsRenderer(MultiBufferSource.BufferSource bufferSource) { + super(bufferSource); + } + + @Override + public @NonNull Class getRenderStateClass() { + return GuiFlattenedModelsRenderState.class; + } + + @Override + protected void renderToTexture(@NonNull GuiFlattenedModelsRenderState renderState, @NonNull PoseStack poseStack) { + Vector3f translation = renderState.translation(); + poseStack.translate(translation.x, translation.y, translation.z); + + Matrix4f positionMatrix = poseStack.last().pose(); + for (BuiltModelRecord record : renderState.records()) { + VertexConsumer buffer = bufferSource.getBuffer(record.renderType()); + Vector3f position = new Vector3f(); + for (VertexData vertex : record.vertices()) { + position.set(vertex.u(), vertex.v(), 0).mulPosition(positionMatrix); + buffer.addVertex(position.x(), position.y(), 0, vertex.argb(), vertex.u(), vertex.v(), vertex.overlay(), vertex.light(), 0, 0, 1); + } + } + } + + @Override + protected float getTranslateY(final int height, final int guiScale) { + return height / 2.0f; + } + + @Override + protected @NonNull String getTextureLabel() { + return "realcamera.texture"; + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/BuiltModelRecord.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/BuiltModelRecord.java new file mode 100644 index 00000000..14ed4d49 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/BuiltModelRecord.java @@ -0,0 +1,14 @@ +package com.xtracr.realcamera.renderer.state; + +import net.minecraft.client.renderer.rendertype.RenderType; + +public record BuiltModelRecord( + RenderType renderType, + String textureId, + VertexData[] vertices, + VertexData[][] primitives +) { + public boolean containsTextureId(String textureId) { + return this.textureId.contains(textureId); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/util/VertexData.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java similarity index 99% rename from common/src/main/java/com/xtracr/realcamera/util/VertexData.java rename to common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java index 36b4427d..63e97959 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/VertexData.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java @@ -1,4 +1,4 @@ -package com.xtracr.realcamera.util; +package com.xtracr.realcamera.renderer.state; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.world.phys.Vec3; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java new file mode 100644 index 00000000..565a5289 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java @@ -0,0 +1,63 @@ +package com.xtracr.realcamera.renderer.state.gui; + +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.xtracr.realcamera.gui.GUIHelper; +import com.xtracr.realcamera.util.MathUtil; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.gui.render.TextureSetup; +import net.minecraft.client.renderer.state.gui.GuiElementRenderState; +import org.joml.Matrix3x2f; +import org.joml.Vector2f; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +public record ColoredFloatLineRenderState( + RenderPipeline pipeline, + TextureSetup textureSetup, + Matrix3x2f pose, + float x, + float y, + float z, + float vectorX, + float vectorY, + float vectorZ, + int argb, + @Nullable ScreenRectangle scissorArea, + @Nullable ScreenRectangle bounds +) implements GuiElementRenderState { + public ColoredFloatLineRenderState( + RenderPipeline pipeline, + TextureSetup textureSetup, + Matrix3x2f pose, + float x, + float y, + float z, + float vectorX, + float vectorY, + float vectorZ, + int argb, + @Nullable ScreenRectangle scissorArea + ) { + this(pipeline, textureSetup, pose, x, y, z, vectorX, vectorY, vectorZ, argb, scissorArea, + GUIHelper.getBounds((int) MathUtil.floor(x, x + vectorX), (int) MathUtil.floor(y, y + vectorY), + (int) MathUtil.ceil(x, x + vectorX), (int) MathUtil.ceil(x, x + vectorX), pose, scissorArea)); + } + + @Override + public void buildVertices(@NonNull VertexConsumer vertexConsumer) { + Vector2f vec = pose.transformPosition(vectorX, vectorY, new Vector2f()); + if (pipeline.getVertexFormatMode().primitiveLength == 2) { + vertexConsumer.addVertexWith2DPose(pose, x, y).setColor(argb).setNormal(vec.x(), vec.y(), vectorZ); + vertexConsumer.addVertexWith2DPose(pose, x + vectorX, y + vectorY).setColor(argb).setNormal(vec.x(), vec.y(), vectorZ); + } else { + Vector2f start = pose.transformPosition(x, y, new Vector2f()); + Vector2f end = start.add(vec, new Vector2f()); + Vector2f normal = vec.normalize(new Vector2f()).mul(0.5f); + vertexConsumer.addVertex(start.x() - normal.y(), start.y() + normal.x(), z).setColor(argb); + vertexConsumer.addVertex(end.x() - normal.y(), end.y() + normal.x(), z + vectorZ).setColor(argb); + vertexConsumer.addVertex(end.x() + normal.y(), end.y() - normal.x(), z + vectorZ).setColor(argb); + vertexConsumer.addVertex(start.x() + normal.y(), start.y() - normal.x(), z).setColor(argb); + } + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatQuadRenderState.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatQuadRenderState.java new file mode 100644 index 00000000..ed4382ed --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatQuadRenderState.java @@ -0,0 +1,64 @@ +package com.xtracr.realcamera.renderer.state.gui; + +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.xtracr.realcamera.gui.GUIHelper; +import com.xtracr.realcamera.util.MathUtil; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.gui.render.TextureSetup; +import net.minecraft.client.renderer.state.gui.GuiElementRenderState; +import org.joml.Matrix3x2f; +import org.jspecify.annotations.Nullable; + +public record ColoredFloatQuadRenderState( + RenderPipeline pipeline, + TextureSetup textureSetup, + Matrix3x2f pose, + float x0, + float y0, + float z0, + float x1, + float y1, + float z1, + float x2, + float y2, + float z2, + float x3, + float y3, + float z3, + int argb, + @Nullable ScreenRectangle scissorArea, + @Nullable ScreenRectangle bounds +) implements GuiElementRenderState { + public ColoredFloatQuadRenderState( + RenderPipeline pipeline, + TextureSetup textureSetup, + Matrix3x2f pose, + float x0, + float y0, + float z0, + float x1, + float y1, + float z1, + float x2, + float y2, + float z2, + float x3, + float y3, + float z3, + int argb, + @Nullable ScreenRectangle scissorArea + ) { + this(pipeline, textureSetup, pose, x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3, argb, scissorArea, + GUIHelper.getBounds((int) MathUtil.floor(x0, x1, x2, x3), (int) MathUtil.floor(y0, y1, y2, y3), + (int) MathUtil.ceil(x0, x1, x2, x3), (int) MathUtil.ceil(y0, y1, y2, y3), pose, scissorArea)); + } + + @Override + public void buildVertices(VertexConsumer vertexConsumer) { + vertexConsumer.addVertexWith2DPose(pose, x0, y0).setColor(argb); + vertexConsumer.addVertexWith2DPose(pose, x1, y1).setColor(argb); + vertexConsumer.addVertexWith2DPose(pose, x2, y2).setColor(argb); + vertexConsumer.addVertexWith2DPose(pose, x3, y3).setColor(argb); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatRectangleRenderState.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatRectangleRenderState.java new file mode 100644 index 00000000..4ef2c7d7 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatRectangleRenderState.java @@ -0,0 +1,48 @@ +package com.xtracr.realcamera.renderer.state.gui; + +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.xtracr.realcamera.gui.GUIHelper; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.gui.render.TextureSetup; +import net.minecraft.client.renderer.state.gui.GuiElementRenderState; +import org.joml.Matrix3x2f; +import org.jspecify.annotations.Nullable; + +public record ColoredFloatRectangleRenderState( + RenderPipeline pipeline, + TextureSetup textureSetup, + Matrix3x2f pose, + float x0, + float y0, + float x1, + float y1, + float z, + int argb, + @Nullable ScreenRectangle scissorArea, + @Nullable ScreenRectangle bounds +) implements GuiElementRenderState { + public ColoredFloatRectangleRenderState( + RenderPipeline pipeline, + TextureSetup textureSetup, + Matrix3x2f pose, + float x0, + float y0, + float x1, + float y1, + float z, + int argb, + @Nullable ScreenRectangle scissorArea + ) { + this(pipeline, textureSetup, pose, x0, y0, x1, y1, z, argb, scissorArea, + GUIHelper.getBounds((int) Math.floor(x0), (int) Math.floor(y0), (int) Math.ceil(x1), (int) Math.ceil(y1), pose, scissorArea)); + } + + @Override + public void buildVertices(VertexConsumer vertexConsumer) { + vertexConsumer.addVertexWith2DPose(pose, x0, y0).setColor(argb); + vertexConsumer.addVertexWith2DPose(pose, x0, y1).setColor(argb); + vertexConsumer.addVertexWith2DPose(pose, x1, y1).setColor(argb); + vertexConsumer.addVertexWith2DPose(pose, x1, y0).setColor(argb); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiCulledModelsRenderState.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiCulledModelsRenderState.java new file mode 100644 index 00000000..8aec1f5a --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiCulledModelsRenderState.java @@ -0,0 +1,34 @@ +package com.xtracr.realcamera.renderer.state.gui; + +import com.xtracr.realcamera.renderer.state.BuiltModelRecord; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState; +import org.joml.Matrix4f; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +public record GuiCulledModelsRenderState( + List records, + Matrix4f transform, + int x0, + int y0, + int x1, + int y1, + float scale, + @Nullable ScreenRectangle scissorArea, + @Nullable ScreenRectangle bounds +) implements PictureInPictureRenderState { + public GuiCulledModelsRenderState( + List records, + Matrix4f transform, + int x0, + int y0, + int x1, + int y1, + float scale, + @Nullable ScreenRectangle scissorArea + ) { + this(records, transform, x0, y0, x1, y1, scale, scissorArea, PictureInPictureRenderState.getBounds(x0, y0, x1, y1, scissorArea)); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiFlattenedModelsRenderState.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiFlattenedModelsRenderState.java new file mode 100644 index 00000000..009477c4 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/GuiFlattenedModelsRenderState.java @@ -0,0 +1,34 @@ +package com.xtracr.realcamera.renderer.state.gui; + +import com.xtracr.realcamera.renderer.state.BuiltModelRecord; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState; +import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +public record GuiFlattenedModelsRenderState( + List records, + Vector3f translation, + int x0, + int y0, + int x1, + int y1, + float scale, + @Nullable ScreenRectangle scissorArea, + @Nullable ScreenRectangle bounds +) implements PictureInPictureRenderState { + public GuiFlattenedModelsRenderState( + List records, + Vector3f translation, + int x0, + int y0, + int x1, + int y1, + float scale, + @Nullable ScreenRectangle scissorArea + ) { + this(records, translation, x0, y0, x1, y1, scale, scissorArea, PictureInPictureRenderState.getBounds(x0, y0, x1, y1, scissorArea)); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/util/CameraTransform.java b/common/src/main/java/com/xtracr/realcamera/util/CameraTransform.java new file mode 100644 index 00000000..8009ce19 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/util/CameraTransform.java @@ -0,0 +1,40 @@ +package com.xtracr.realcamera.util; + +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix3f; +import org.joml.Matrix3fc; +import org.joml.Quaterniond; +import org.joml.Quaterniondc; + +public class CameraTransform { + protected final Matrix3f rotation = new Matrix3f(); + protected Vec3 position = Vec3.ZERO; + + public final Vec3 getPosition() { + return position; + } + + public final void setPosition(Vec3 vec) { + position = vec; + } + + public final Matrix3f getRotation() { + return rotation; + } + + public final void setRotation(Matrix3fc mat) { + rotation.set(mat); + } + + public final void lerpPosition(Vec3 vec, double a) { + position = position.lerp(vec, a); + } + + public final void slerpRotation(Matrix3fc mat, double alpha) { + slerpRotation(new Quaterniond().setFromNormalized(mat), alpha); + } + + public final void slerpRotation(Quaterniondc quat, double alpha) { + new Quaterniond().setFromNormalized(rotation).slerp(quat, alpha).get(rotation); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java b/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java index 7a322261..557c7dcb 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java @@ -1,29 +1,28 @@ package com.xtracr.realcamera.util; import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import org.joml.Matrix4f; +import org.joml.Matrix3x2fStack; +import org.joml.Matrix4fc; public class CrosshairUtil { public static EntityHitResult capturedEntityHitResult; public static Vec3 offset = Vec3.ZERO; - public static void translateMatrices(PoseStack poseStack) { - poseStack.translate(offset.x(), -offset.y(), 0.0d); + public static void translateMatrices(Matrix3x2fStack poseStack) { + poseStack.translate((float) offset.x, (float) -offset.y); } - public static void update(Minecraft client, Camera camera, Matrix4f... projectionMatrices) { + public static void update(Minecraft client, Vec3 cameraPos, Matrix4fc... projectionMatrices) { HitResult hitResult = client.hitResult; offset = Vec3.ZERO; if (client.crosshairPickEntity != null) hitResult = capturedEntityHitResult; if (hitResult == null) return; Window window = client.getWindow(); - offset = MathUtil.projectToVec2(hitResult.getLocation().subtract(camera.getPosition()), projectionMatrices) + offset = MathUtil.projectToVec2(hitResult.getLocation().subtract(cameraPos), projectionMatrices) .multiply(0.5 * window.getGuiScaledWidth(), 0.5 * window.getGuiScaledHeight(), 0.0d); } } diff --git a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java index 6b369f72..ab939a6a 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java @@ -2,7 +2,7 @@ import net.minecraft.world.phys.Vec3; import org.joml.Matrix3f; -import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.joml.Vector4f; public class MathUtil { @@ -10,6 +10,22 @@ public static double round(double d, int digits) { return Math.round(d * Math.pow(10, digits)) / Math.pow(10, digits); } + public static double floor(double... ds) { + double d = ds[0]; + for (int i = 1; i < ds.length; i++) { + d = Math.min(d, ds[i]); + } + return Math.floor(d); + } + + public static double ceil(double... ds) { + double d = ds[0]; + for (int i = 1; i < ds.length; i++) { + d = Math.max(d, ds[i]); + } + return Math.ceil(d); + } + public static Vec3 getEulerAngleYXZ(Matrix3f normal) { if (normal.m21 <= -1.0) return new Vec3(Math.PI / 2, Math.atan2(normal.m10, normal.m00), 0.0); else if (normal.m21 >= 1.0) return new Vec3(-Math.PI / 2, -Math.atan2(normal.m10, normal.m00), 0.0); @@ -24,9 +40,9 @@ public static Vec3 getIntersectionPoint(Vec3 planePoint, Vec3 planeNormal, Vec3 return linePoint.add(lineNormal.scale(distance)); } - public static Vec3 projectToVec2(Vec3 vec3, Matrix4f... projectionMatrices) { + public static Vec3 projectToVec2(Vec3 vec3, Matrix4fc... projectionMatrices) { Vector4f vector4f = new Vector4f((float) vec3.x(), (float) vec3.y(), (float) vec3.z(), 1.0f); - for (Matrix4f matrix4f : projectionMatrices) vector4f.mul(matrix4f); + for (Matrix4fc matrix4f : projectionMatrices) vector4f.mul(matrix4f); if (vector4f.w() == 0.0) return Vec3.ZERO; return new Vec3(vector4f.x(), vector4f.y(), 0).scale(1 / (double) vector4f.w()); } diff --git a/common/src/main/java/com/xtracr/realcamera/util/MultiVertexCatcher.java b/common/src/main/java/com/xtracr/realcamera/util/MultiVertexCatcher.java deleted file mode 100644 index 5e456621..00000000 --- a/common/src/main/java/com/xtracr/realcamera/util/MultiVertexCatcher.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.xtracr.realcamera.util; - -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.ByteBufferBuilder; -import com.mojang.blaze3d.vertex.MeshData; -import com.mojang.blaze3d.vertex.VertexConsumer; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMaps; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.SequencedMap; -import java.util.function.Consumer; - -public interface MultiVertexCatcher extends MultiBufferSource { - static MultiVertexCatcher defaultImpl() { - return MeshCatcher.INSTANCE; - } - - void endCatching(Consumer consumer); - - class MeshCatcher extends MultiBufferSource.BufferSource implements MultiVertexCatcher { - private static final MeshCatcher INSTANCE = new MeshCatcher(); - private final SequencedMap bufferPools = new Object2ObjectLinkedOpenHashMap<>(); - private final SequencedMap caughtMeshes = new Object2ObjectLinkedOpenHashMap<>(); - - protected MeshCatcher() { - super(new ByteBufferBuilder(0), Object2ObjectSortedMaps.emptyMap()); - } - - @Override - public @NotNull VertexConsumer getBuffer(RenderType renderType) { - BufferBuilder bufferBuilder = startedBuilders.get(renderType); - if (bufferBuilder != null) { - endBatch(renderType, bufferBuilder); - } - ByteBufferBuilderPool bufferPool = bufferPools.computeIfAbsent(renderType, type -> new ByteBufferBuilderPool(type.bufferSize())); - bufferBuilder = new BufferBuilder(bufferPool.getBuffer(), renderType.mode(), renderType.format()); - startedBuilders.put(renderType, bufferBuilder); - return bufferBuilder; - } - - @Override - public void endCatching(Consumer consumer) { - endBatch(); - caughtMeshes.forEach((meshData, renderType) -> { - consumer.accept(BuiltIterableBuffer.buildFrom(renderType, meshData)); - meshData.close(); - }); - caughtMeshes.clear(); - bufferPools.values().forEach(ByteBufferBuilderPool::release); - } - - @Override - public void endBatch() { - for(RenderType renderType : bufferPools.keySet()) { - endBatch(renderType); - } - } - - @Override - protected void endBatch(RenderType renderType, BufferBuilder bufferBuilder) { - MeshData meshData = bufferBuilder.build(); - if (meshData != null) { - caughtMeshes.put(meshData, renderType); - } - } - - private static class ByteBufferBuilderPool { - private final int bufferSize; - private ByteBufferBuilder[] pool = new ByteBufferBuilder[0]; - private int next = 0; - - public ByteBufferBuilderPool(int bufferSize) { - this.bufferSize = bufferSize; - } - - public ByteBufferBuilder getBuffer() { - ByteBufferBuilder byteBufferBuilder; - if (next < pool.length) { - byteBufferBuilder = pool[next++]; - } else { - pool = Arrays.copyOf(pool, pool.length + 1); - pool[next++] = byteBufferBuilder = new ByteBufferBuilder(bufferSize); - } - return byteBufferBuilder; - } - - public void release() { - next = 0; - } - } - } -} diff --git a/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java b/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java index ad853d6c..e2de0b92 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java @@ -1,44 +1,31 @@ package com.xtracr.realcamera.util; +import com.mojang.datafixers.util.Pair; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.level.ClipContext.Block; -import net.minecraft.world.level.ClipContext.Fluid; import net.minecraft.world.phys.Vec3; public class RaycastUtil { - private static Vec3 startVec = Vec3.ZERO; - private static Vec3 endVec = Vec3.ZERO; - - public static Vec3 getStartVec() { - return startVec; - } - - public static Vec3 getEndVec() { - return endVec; - } - - public static ClipContext getClipContext(Block shapeType, Fluid fluidHandling, Entity entity) { - return new ClipContext(startVec, endVec, shapeType, fluidHandling, entity); - } - - public static void update(Entity entity, double sqDistance, float deltaTick) { + /** + * Updates raycast start and end points ensuring: + *
  • End point is on camera's viewing direction + *
  • Square distance from entity's eye to end point ≤ sqDistance + */ + public static Pair getFromAndTo(Entity entity, double sqDistance, float partialTicks) { Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); - Vec3 eyePos = entity.getEyePosition(deltaTick); - startVec = camera.getPosition(); - Vec3 direction = Vec3.directionFromRotation(camera.getXRot(), camera.getYRot()); - Vec3 offset = startVec.subtract(eyePos); + Vec3 eyePos = entity.getEyePosition(partialTicks); + Vec3 from = camera.position(); + Vec3 direction = Vec3.directionFromRotation(camera.xRot(), camera.yRot()); + Vec3 offset = from.subtract(eyePos); Vec3 footPoint = MathUtil.getIntersectionPoint(Vec3.ZERO, direction, offset, direction); if (footPoint.lengthSqr() > sqDistance) { - startVec = eyePos; - direction = entity.getViewVector(deltaTick); - endVec = startVec.add(direction.scale(Math.sqrt(sqDistance))); - return; + from = eyePos; + direction = entity.getViewVector(partialTicks); + return Pair.of(from, from.add(direction.scale(Math.sqrt(sqDistance)))); } else if (offset.lengthSqr() > sqDistance) { - startVec = startVec.add(direction.scale(offset.distanceTo(footPoint) - Math.sqrt(sqDistance - footPoint.lengthSqr()))); + from = from.add(direction.scale(offset.distanceTo(footPoint) - Math.sqrt(sqDistance - footPoint.lengthSqr()))); } - endVec = eyePos.add(footPoint.add(direction.scale(Math.sqrt(sqDistance - footPoint.lengthSqr())))); + return Pair.of(from, eyePos.add(footPoint.add(direction.scale(Math.sqrt(sqDistance - footPoint.lengthSqr()))))); } } diff --git a/common/src/main/java/com/xtracr/realcamera/util/SmoothUtil.java b/common/src/main/java/com/xtracr/realcamera/util/SmoothUtil.java deleted file mode 100644 index 63c7ec67..00000000 --- a/common/src/main/java/com/xtracr/realcamera/util/SmoothUtil.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.xtracr.realcamera.util; - -import com.xtracr.realcamera.config.ConfigFile; -import net.minecraft.world.phys.Vec3; -import org.joml.Matrix3f; -import org.joml.Quaterniond; - -public class SmoothUtil { - private static final Quaterniond lastRotation = new Quaterniond(); - private static Vec3 lastPosition = Vec3.ZERO; - - public static Vec3 smoothPosition(Vec3 position) { - lastPosition = position.add(lastPosition.subtract(position).scale(ConfigFile.config().getDisplacementSmoothFactor())); - return lastPosition; - } - - public static Matrix3f smoothRotation(Matrix3f rotation) { - return smoothRotation(new Quaterniond().setFromNormalized(rotation)).get(new Matrix3f()); - } - - public static Quaterniond smoothRotation(Quaterniond rotation) { - lastRotation.slerp(rotation, 1 - ConfigFile.config().getRotationSmoothFactor()); - return lastRotation; - } -} diff --git a/common/src/main/resources/architectury.common.json b/common/src/main/resources/architectury.common.json deleted file mode 100644 index 6587691f..00000000 --- a/common/src/main/resources/architectury.common.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "accessWidener": "realcamera.accesswidener" -} \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/be_by.json b/common/src/main/resources/assets/realcamera/lang/be_by.json index 283e40c5..8024873c 100644 --- a/common/src/main/resources/assets/realcamera/lang/be_by.json +++ b/common/src/main/resources/assets/realcamera/lang/be_by.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Адкрыць экран прагляду мадэлі", - "key.xtracr_realcamera.togglePerspective": "Уключыць/Выключыць", - "key.xtracr_realcamera.activeConfigIndexPREV": "Пераключыцца на папярэднюю канфігурацыю", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Пераключыцца на наступную канфігурацыю", - "key.xtracr_realcamera.activeConfigIndexRESET": "Скінуць індэкс канфігурацыі", - "key.xtracr_realcamera.toggleAdjustMode": "Пераключыць рэжым налады", - "key.xtracr_realcamera.toggleCameraMode": "Пераключыць рэжым камеры", - "key.xtracr_realcamera.adjustUP": "Наладзіць УВЕРХ", - "key.xtracr_realcamera.adjustDOWN": "Наладзіць УНІЗ", - "key.xtracr_realcamera.adjustFRONT": "Наладзіць УПЕРАД", - "key.xtracr_realcamera.adjustBACK": "Наладзіць НАЗАД", - "key.xtracr_realcamera.adjustLEFT": "Наладзіць УЛЕВА", - "key.xtracr_realcamera.adjustRIGHT": "Наладзіць УПРАВА", - "modmenu.descriptionTranslation.realcamera": "Зрабіць камеру больш рэалістычнай у рэжыме ад першай асобы.", - - "config.category.xtracr_realcamera.general": "Асноўныя", "config.category.xtracr_realcamera.binding": "Рэжым прывязкі", - "config.category.xtracr_realcamera.classic": "Класічны рэжым", "config.category.xtracr_realcamera.cameraOffset": "Зрух камеры", - "config.category.xtracr_realcamera.centerOffset": "Зрух цэнтра кручэння", "config.category.xtracr_realcamera.cameraRotation": "Паварот камеры", - "config.tooltip.xtracr_realcamera.classicOffset": "Зрух камеры ад цэнтра кручэння", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Заўвага: пярэдняя, верхняя і левая бакі гульца адпавядаюць восям X, Y і Z", - "config.tooltip.xtracr_realcamera.centerOffset": "Зрух цэнтра кручэння ад галавы", - "config.tooltip.xtracr_realcamera.cameraRotation": "Дадатковы паварот камеры ў градусах", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Заўвага: тангаж, рысканне і крэн - гэта павароты вакол левай, верхняй і пярэдняй восей адпаведна", - - "config.option.xtracr_realcamera.enabled": "Мод уключаны", - "config.option.xtracr_realcamera.isClassic": "Класічны рэжым", - "config.option.xtracr_realcamera.dynamicCrosshair": "Дынамічны прыцэл", - "config.option.xtracr_realcamera.renderModel": "Адлюстроўваць мадэль гульца", + "config.category.xtracr_realcamera.centerOffset": "Зрух цэнтра кручэння", + "config.category.xtracr_realcamera.classic": "Класічны рэжым", + "config.category.xtracr_realcamera.general": "Асноўныя", + "config.option.xtracr_realcamera.activeConfigIndex": "Актыўны індэкс канфігурацыі", + "config.option.xtracr_realcamera.adjustOffset": "Наладзіць зрух камеры", "config.option.xtracr_realcamera.adjustStep": "Крок налады", - "config.option.xtracr_realcamera.classicAdjustMode": "Рэжым налады", - "config.option.xtracr_realcamera.scale": "Маштаб", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадры захавання выніку прывязкі", "config.option.xtracr_realcamera.cameraOffset": "Зрух камеры %s", "config.option.xtracr_realcamera.centerOffset": "Зрух цэнтра кручэння %s", - "config.option.xtracr_realcamera.pitch": "Тангаж", - "config.option.xtracr_realcamera.yaw": "Рысканне", - "config.option.xtracr_realcamera.roll": "Крэн", - "config.option.xtracr_realcamera.toModelViewScreen": "Для падрабязных налад перайдзіце на экран %s (неабходна прызначыць клавішу для адкрыцця)", - "config.option.xtracr_realcamera.screenModifierKey": "Клавіша-мадыфікатар для экрана %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Рэжым састарэлай прывязкі", - "config.option.xtracr_realcamera.adjustOffset": "Наладзіць зрух камеры", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Хаваць паведамленні пра няўдалую прывязку", - "config.option.xtracr_realcamera.renderStuckObjects": "Адлюстроўваць застряўшыя аб'екты", - "config.option.xtracr_realcamera.rerenderModel": "Перамаляваць мадэль", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадры захавання выніку прывязкі", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Каэфіцыент згладжвання зруху", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Каэфіцыент згладжвання павароту", - "config.option.xtracr_realcamera.activeConfigIndex": "Актыўны індэкс канфігурацыі", + "config.option.xtracr_realcamera.classicAdjustMode": "Рэжым налады", "config.option.xtracr_realcamera.disableConfig": "Адключыць Канфігурацыю", - "config.option.xtracr_realcamera.disableWhenSneaking": "Адключыць асноўную функцыю пры крадзяжы", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Адключыць асноўную функцыю пры трыманні...", + "config.option.xtracr_realcamera.disableRenderItems": "Адключыць адлюстраванне пры трыманні...", "config.option.xtracr_realcamera.disableWhenCrawling": "Адключыць асноўную функцыю пры поўзанні", + "config.option.xtracr_realcamera.disableWhenSneaking": "Адключыць асноўную функцыю пры крадзяжы", "config.option.xtracr_realcamera.disableWhenSwimming": "Адключыць асноўную функцыю пры плаванні", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Каэфіцыент згладжвання зруху", + "config.option.xtracr_realcamera.dynamicCrosshair": "Дынамічны прыцэл", + "config.option.xtracr_realcamera.enabled": "Мод уключаны", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Хаваць паведамленні пра няўдалую прывязку", + "config.option.xtracr_realcamera.isClassic": "Класічны рэжым", + "config.option.xtracr_realcamera.legacyBindingMode": "Рэжым састарэлай прывязкі", "config.option.xtracr_realcamera.outTick": "Затрымка выхаду з стану плавання (у тіках)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Адключыць асноўную функцыю пры трыманні...", - "config.option.xtracr_realcamera.disableRenderItems": "Адключыць адлюстраванне пры трыманні...", - "config.tooltip.xtracr_realcamera.isClassic": "Класічны рэжым уносіць толькі простыя змены ў становішча і паварот камеры", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Пры ўключэнні прыцэл будзе сачыць за поглядам гульца, забяспечваючы дакладнае трапленне\nРэкамендуецца ўключыць пры ўсталёўцы Jade, WTHIT ці падобных модаў", - "config.tooltip.xtracr_realcamera.renderModel": "Адлюстроўваць мадэль гульца ў рэжыме ад першай асобы", + "config.option.xtracr_realcamera.pitch": "Тангаж", + "config.option.xtracr_realcamera.renderModel": "Адлюстроўваць мадэль гульца", + "config.option.xtracr_realcamera.renderStuckObjects": "Адлюстроўваць застряўшыя аб'екты", + "config.option.xtracr_realcamera.rerenderModel": "Перамаляваць мадэль", + "config.option.xtracr_realcamera.roll": "Крэн", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Каэфіцыент згладжвання павароту", + "config.option.xtracr_realcamera.scale": "Маштаб", + "config.option.xtracr_realcamera.screenModifierKey": "Клавіша-мадыфікатар для экрана %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Для падрабязных налад перайдзіце на экран %s (неабходна прызначыць клавішу для адкрыцця)", + "config.option.xtracr_realcamera.yaw": "Рысканне", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Текущий индекс привязанной конфигурации, 0 означает разрешение привязки к любой допустимой конфигурации", + "config.tooltip.xtracr_realcamera.adjustOffset": "Пры націсканні клавішы налады, рэгуляваць зрух або паварот камеры", "config.tooltip.xtracr_realcamera.adjustStep": "Даўжыня або 1/100 вугла налады за крок", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "На працягу некалькіх кадраў пасля няўдалай прывязкі працягваць выкарыстоўваць папярэдні паспяховы вынік прывязкі", + "config.tooltip.xtracr_realcamera.cameraRotation": "Дадатковы паварот камеры ў градусах", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Заўвага: тангаж, рысканне і крэн - гэта павароты вакол левай, верхняй і пярэдняй восей адпаведна", + "config.tooltip.xtracr_realcamera.centerOffset": "Зрух цэнтра кручэння ад галавы", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Вызначае, што наладжваць пры націсканні клавішы налады", - "config.tooltip.xtracr_realcamera.scale": "Кантраляваць памер зрухаў", + "config.tooltip.xtracr_realcamera.classicOffset": "Зрух камеры ад цэнтра кручэння", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Заўвага: пярэдняя, верхняя і левая бакі гульца адпавядаюць восям X, Y і Z", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Падтрымліваюцца тры метады супадзення:\n1. Сімвал падстаноўкі `*` (напрыклад, `minecraft:*sword`)\n2. Супадзенне па тэгах (пачынаецца з `#`, напрыклад, `#minecraft:swords`)\n3. Прамы ID прадмета (напрыклад, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Каэфіцыент згладжвання зруху камеры, чым вышэй значэнне, тым больш плаўным будзе рух", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Пры ўключэнні прыцэл будзе сачыць за поглядам гульца, забяспечваючы дакладнае трапленне\nРэкамендуецца ўключыць пры ўсталёўцы Jade, WTHIT ці падобных модаў", + "config.tooltip.xtracr_realcamera.isClassic": "Класічны рэжым уносіць толькі простыя змены ў становішча і паварот камеры", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Выкарыстоўвае рэжым прывязкі састарэлай версіі (v0.5), падтрымліваюцца толькі стандартныя мадэлі і дзеянні на іх аснове\nПасля ўключэння ўласцівасціў выладывае дакладней прывязацца да мэтавай пазіцыі", - "config.tooltip.xtracr_realcamera.adjustOffset": "Пры націсканні клавішы налады, рэгуляваць зрух або паварот камеры", + "config.tooltip.xtracr_realcamera.outTick": "Затрымка ўключэння асноўнай функцыі пасля выхаду з стану плавання (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Адлюстроўваць мадэль гульца ў рэжыме ад першай асобы", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Стрэлы, джалы пчол і іншыя аб'екты, якія могуць застряць у целе гульца", "config.tooltip.xtracr_realcamera.rerenderModel": "Перамалёўваць мадэль у зыходны час рэндэрынгу, каб пазбегнуць візуальных праблем", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "На працягу некалькіх кадраў пасля няўдалай прывязкі працягваць выкарыстоўваць папярэдні паспяховы вынік прывязкі", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Каэфіцыент згладжвання зруху камеры, чым вышэй значэнне, тым больш плаўным будзе рух", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Каэфіцыент згладжвання павароту камеры, чым вышэй значэнне, тым больш плаўным будзе рух", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Текущий индекс привязанной конфигурации, 0 означает разрешение привязки к любой допустимой конфигурации", - "config.tooltip.xtracr_realcamera.outTick": "Затрымка ўключэння асноўнай функцыі пасля выхаду з стану плавання (1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Падтрымліваюцца тры метады супадзення:\n1. Сімвал падстаноўкі `*` (напрыклад, `minecraft:*sword`)\n2. Супадзенне па тэгах (пачынаецца з `#`, напрыклад, `#minecraft:swords`)\n3. Прамы ID прадмета (напрыклад, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Кантраляваць памер зрухаў", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Пераключыцца на наступную канфігурацыю", + "key.xtracr_realcamera.activeConfigIndexPREV": "Пераключыцца на папярэднюю канфігурацыю", + "key.xtracr_realcamera.activeConfigIndexRESET": "Скінуць індэкс канфігурацыі", + "key.xtracr_realcamera.adjustBACK": "Наладзіць НАЗАД", + "key.xtracr_realcamera.adjustDOWN": "Наладзіць УНІЗ", + "key.xtracr_realcamera.adjustFRONT": "Наладзіць УПЕРАД", + "key.xtracr_realcamera.adjustLEFT": "Наладзіць УЛЕВА", + "key.xtracr_realcamera.adjustRIGHT": "Наладзіць УПРАВА", + "key.xtracr_realcamera.adjustUP": "Наладзіць УВЕРХ", + "key.xtracr_realcamera.modelViewScreen": "Адкрыць экран прагляду мадэлі", + "key.xtracr_realcamera.toggleAdjustMode": "Пераключыць рэжым налады", + "key.xtracr_realcamera.toggleCameraMode": "Пераключыць рэжым камеры", + "key.xtracr_realcamera.togglePerspective": "Уключыць/Выключыць", "message.xtracr_realcamera.bindingFailed": "[%s]: Памылка прывязкі, калі ласка, перайдзіце на экран %s і наладзьце ўручную (ключ: %s)", - - "screen.xtracr_realcamera.modelView_title": "Прагляд мадэлі", - "screen.widget.xtracr_realcamera.modelView_import": "Імпартаваць", + "modmenu.descriptionTranslation.realcamera": "Зрабіць камеру больш рэалістычнай у рэжыме ад першай асобы.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Калі адключана, адноснае становішча камеры да мадэлі не мяняецца, але адпаведныя атрыбуты камеры не будуць зменены гэтым модам", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Захаваныя канфігурацыі", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Капіяваць усе налады адключэння", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Выдаліць абраную прастакутную вобласць\n(Ці выкарыстайце клавішу Delete)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскасці, адлеглась ад усіх вяршынь да экрана ў якіх меншая за гэта значэнне, не будуць адлюстроўвацца", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Налады адключэння\nГлабальныя налады адключэння знаходзяцца на экране канфігурацыі", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Часткі, уключаныя ў сінія рамкі, будуць адключаны\nЛевы клік для выбару, іншыя клавішы для скасавання выбару\n%s+Левы клік каб хутка выбраць частку, на якую наведзены паказальнік мышы", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Назва налады адключэння", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Назва не можа быць пустой!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "ID тэкстуры не можа быць пустым!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Экспартаваць бягучы канфіг у буфер абмену", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Экспарт не ўдаўся: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Экспарт паспяховы!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Нумар абранай прастакутнай вобласці\n(0 азначае адсутнасць выбару)\nНацісніце Прабел ці Enter каб знайсці бягучую абраную вобласць (Калі друкуеце, націсніце двойчы каб знайсці)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Імпартаваць канфіг з буфера абмену", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Імпарт не ўдаўся: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпарт %s паспяховы!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Уставіць усе налады адключэння з буфера абмену ў бягучы канфіг\n(Не перазапіша існуючыя налады з такой жа назвай)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "У рэжыме прадпрагляду вы можаце наладжваць зрух і паварот камеры", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Прыярытэт пры прывязцы, чым больш значэнне, тым вышэй прыярытэт і размяшчэнне справей у спісе", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Захаваць як\n(Калі існуе канфігурацыя з такой жа назвай, вы таксама можаце націснуць кнопку захавання злева)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Маштаб, які кіруе памерам зрухаў", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Левы клік каб атрымаць UV-каардынаты пад паказальнікам мышы\nТры наборы UV-каардынат ніжэй, зверху ўніз, гэта UV-каардынаты вектара наперад, вектара уверх і пункту прывязкі на мэтавай плоскасці\nЗаўвага: %s+Пракрутка каб пераключацца паміж рознымі слаямі мадэлі. Увод UV-каардынат уручную дазваляе дакладней прывязацца да мэтавай пазіцыі", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Вызначае рэжым хуткага выбару %s+Левы клік\n(%s+Пракрутка каб змяніць дыяпазон выбару ў рэжыме дыяпазону)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Назва канфігурацыі", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "ID тэкстуры выбранай мадэлі (не абавязковы поўны ID), можа быць скарочаны пры захаванні для лягчэйшага распазнання.\nНапрыклад, скараціць minecraft:textures/entity/player/slim/alex.png да minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Адкрыць глабальны экран канфігурацыі\n(Патрабуецца Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "Усё", + "screen.widget.xtracr_realcamera.modelView_configs": "Канфігурацыі", + "screen.widget.xtracr_realcamera.modelView_copy": "Капіяваць", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Бягучая Канфігурацыя", + "screen.widget.xtracr_realcamera.modelView_disable": "Адключыць", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Рэжым адключэння", "screen.widget.xtracr_realcamera.modelView_export": "Экспартаваць", - "screen.widget.xtracr_realcamera.modelView_selecting": "Выбар", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Вектар напрамку", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектар уверх", - "screen.widget.xtracr_realcamera.modelView_position": "Мэтавая плоскасць", - "screen.widget.xtracr_realcamera.modelView_save": "Захаваць", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Рэжым адключэння", - "screen.widget.xtracr_realcamera.modelView_all": "Усё", - "screen.widget.xtracr_realcamera.modelView_part": "Частка", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Рэжым выбару", - "screen.widget.xtracr_realcamera.modelView_single": "Адзіночны", + "screen.widget.xtracr_realcamera.modelView_import": "Імпартаваць", "screen.widget.xtracr_realcamera.modelView_multiple": "Множны", - "screen.widget.xtracr_realcamera.modelView_range": "Дыяпазон", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Пераключыць паўзунок у поле", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Пераключыць поле ў паўзунок", "screen.widget.xtracr_realcamera.modelView_offsetX": "Зрух X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Зрух Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Зрух Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Частка", + "screen.widget.xtracr_realcamera.modelView_paste": "Уставіць", "screen.widget.xtracr_realcamera.modelView_pitch": "Тангаж = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Рысканне = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Крэн = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Адключыць", + "screen.widget.xtracr_realcamera.modelView_position": "Мэтавая плоскасць", "screen.widget.xtracr_realcamera.modelView_preview": "Прадпрагляд", - "screen.widget.xtracr_realcamera.modelView_configs": "Канфігурацыі", - "screen.widget.xtracr_realcamera.modelView_copy": "Капіяваць", - "screen.widget.xtracr_realcamera.modelView_paste": "Уставіць", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Бягучая Канфігурацыя", - "screen.tooltip.xtracr_realcamera.modelView_import": "Імпартаваць канфіг з буфера абмену", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпарт %s паспяховы!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Імпарт не ўдаўся: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Экспартаваць бягучы канфіг у буфер абмену", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Экспарт паспяховы!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Экспарт не ўдаўся: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Левы клік каб атрымаць UV-каардынаты пад паказальнікам мышы\nТры наборы UV-каардынат ніжэй, зверху ўніз, гэта UV-каардынаты вектара наперад, вектара уверх і пункту прывязкі на мэтавай плоскасці\nЗаўвага: %s+Пракрутка каб пераключацца паміж рознымі слаямі мадэлі. Увод UV-каардынат уручную дазваляе дакладней прывязацца да мэтавай пазіцыі", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "ID тэкстуры выбранай мадэлі (не абавязковы поўны ID), можа быць скарочаны пры захаванні для лягчэйшага распазнання.\nНапрыклад, скараціць minecraft:textures/entity/player/slim/alex.png да minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Часткі, уключаныя ў сінія рамкі, будуць адключаны\nЛевы клік для выбару, іншыя клавішы для скасавання выбару\n%s+Левы клік каб хутка выбраць частку, на якую наведзены паказальнік мышы", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Вызначае рэжым хуткага выбару %s+Левы клік\n(%s+Пракрутка каб змяніць дыяпазон выбару ў рэжыме дыяпазону)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Нумар абранай прастакутнай вобласці\n(0 азначае адсутнасць выбару)\nНацісніце Прабел ці Enter каб знайсці бягучую абраную вобласць (Калі друкуеце, націсніце двойчы каб знайсці)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Выдаліць абраную прастакутную вобласць\n(Ці выкарыстайце клавішу Delete)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Калі адключана, адноснае становішча камеры да мадэлі не мяняецца, але адпаведныя атрыбуты камеры не будуць зменены гэтым модам", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Маштаб, які кіруе памерам зрухаў", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскасці, адлеглась ад усіх вяршынь да экрана ў якіх меншая за гэта значэнне, не будуць адлюстроўвацца", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Прыярытэт пры прывязцы, чым больш значэнне, тым вышэй прыярытэт і размяшчэнне справей у спісе", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Назва канфігурацыі", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Налады адключэння\nГлабальныя налады адключэння знаходзяцца на экране канфігурацыі", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Захаваныя канфігурацыі", - "screen.tooltip.xtracr_realcamera.modelView_preview": "У рэжыме прадпрагляду вы можаце наладжваць зрух і паварот камеры", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Адкрыць глабальны экран канфігурацыі\n(Патрабуецца Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Капіяваць усе налады адключэння", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Уставіць усе налады адключэння з буфера абмену ў бягучы канфіг\n(Не перазапіша існуючыя налады з такой жа назвай)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Назва не можа быць пустой!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "ID тэкстуры не можа быць пустым!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Захаваць як\n(Калі існуе канфігурацыя з такой жа назвай, вы таксама можаце націснуць кнопку захавання злева)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Назва налады адключэння" + "screen.widget.xtracr_realcamera.modelView_range": "Дыяпазон", + "screen.widget.xtracr_realcamera.modelView_roll": "Крэн = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Захаваць", + "screen.widget.xtracr_realcamera.modelView_selecting": "Выбар", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Рэжым выбару", + "screen.widget.xtracr_realcamera.modelView_single": "Адзіночны", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Пераключыць поле ў паўзунок", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Пераключыць паўзунок у поле", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектар уверх", + "screen.widget.xtracr_realcamera.modelView_yaw": "Рысканне = %s", + "screen.xtracr_realcamera.modelView_title": "Прагляд мадэлі" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index 1b9be4a3..0e7afd4e 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Open Model View Screen", - "key.xtracr_realcamera.togglePerspective": "Enable/Disable", - "key.xtracr_realcamera.activeConfigIndexPREV": "Switch to previous configuration", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Switch to next configuration", - "key.xtracr_realcamera.activeConfigIndexRESET": "Reset configuration index", - "key.xtracr_realcamera.toggleAdjustMode": "Toggle Adjust Mode", - "key.xtracr_realcamera.toggleCameraMode": "Toggle Camera Mode", - "key.xtracr_realcamera.adjustUP": "Adjust UP", - "key.xtracr_realcamera.adjustDOWN": "Adjust DOWN", - "key.xtracr_realcamera.adjustFRONT": "Adjust FRONT", - "key.xtracr_realcamera.adjustBACK": "Adjust BACK", - "key.xtracr_realcamera.adjustLEFT": "Adjust LEFT", - "key.xtracr_realcamera.adjustRIGHT": "Adjust RIGHT", - "modmenu.descriptionTranslation.realcamera": "Make the camera more realistic in the first-person view.", - - "config.category.xtracr_realcamera.general": "General", "config.category.xtracr_realcamera.binding": "Binding Mode", - "config.category.xtracr_realcamera.classic": "Classic Mode", "config.category.xtracr_realcamera.cameraOffset": "Camera Offset", - "config.category.xtracr_realcamera.centerOffset": "Rotation Center Offset", "config.category.xtracr_realcamera.cameraRotation": "Camera Rotation", - "config.tooltip.xtracr_realcamera.classicOffset": "Camera's offset from its rotation center", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Note: player's front, up and left are the X, Y and Z axes respectively", - "config.tooltip.xtracr_realcamera.centerOffset": "Rotation center's offset from head", - "config.tooltip.xtracr_realcamera.cameraRotation": "Additional camera rotation in degrees", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Note: Pitch, yaw and roll are rotations on the left, up and front axes respectively", - - "config.option.xtracr_realcamera.enabled": "Mod Enabled", - "config.option.xtracr_realcamera.isClassic": "Classic Mode", - "config.option.xtracr_realcamera.dynamicCrosshair": "Dynamic Crosshair", - "config.option.xtracr_realcamera.renderModel": "Render Player Model", + "config.category.xtracr_realcamera.centerOffset": "Rotation Center Offset", + "config.category.xtracr_realcamera.classic": "Classic Mode", + "config.category.xtracr_realcamera.general": "General", + "config.option.xtracr_realcamera.activeConfigIndex": "Active Configuration Index", + "config.option.xtracr_realcamera.adjustOffset": "Adjust Camera Offset", "config.option.xtracr_realcamera.adjustStep": "Adjust Step", - "config.option.xtracr_realcamera.classicAdjustMode": "Adjust Mode", - "config.option.xtracr_realcamera.scale": "Scale", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Bind Result Retention Frames", "config.option.xtracr_realcamera.cameraOffset": "Camera %s Offset", "config.option.xtracr_realcamera.centerOffset": "Rotation Center %s Offset", - "config.option.xtracr_realcamera.pitch": "Pitch", - "config.option.xtracr_realcamera.yaw": "Yaw", - "config.option.xtracr_realcamera.roll": "Roll", - "config.option.xtracr_realcamera.toModelViewScreen": "For detailed settings, please go to the %s screen (key bind need to be set to open it)", - "config.option.xtracr_realcamera.screenModifierKey": "%s Screen Modifier Key", - "config.option.xtracr_realcamera.legacyBindingMode": "Legacy Binding Mode", - "config.option.xtracr_realcamera.adjustOffset": "Adjust Camera Offset", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Hide Binding Failure Message", - "config.option.xtracr_realcamera.renderStuckObjects": "Render Stuck Objects", - "config.option.xtracr_realcamera.rerenderModel": "Rerender Model", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Bind Result Retention Frames", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Displacement Smooth Factor", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Rotation Smooth Factor", - "config.option.xtracr_realcamera.activeConfigIndex": "Active Configuration Index", + "config.option.xtracr_realcamera.classicAdjustMode": "Adjust Mode", "config.option.xtracr_realcamera.disableConfig": "Disable Config", - "config.option.xtracr_realcamera.disableWhenSneaking": "Disable main feature when sneaking", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Disable main feature when holding", + "config.option.xtracr_realcamera.disableRenderItems": "Disable rendering when holding", "config.option.xtracr_realcamera.disableWhenCrawling": "Disable main feature when crawling", + "config.option.xtracr_realcamera.disableWhenSneaking": "Disable main feature when sneaking", "config.option.xtracr_realcamera.disableWhenSwimming": "Disable main feature when swimming", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Displacement Smooth Factor", + "config.option.xtracr_realcamera.dynamicCrosshair": "Dynamic Crosshair", + "config.option.xtracr_realcamera.enabled": "Mod Enabled", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Hide Binding Failure Message", + "config.option.xtracr_realcamera.isClassic": "Classic Mode", + "config.option.xtracr_realcamera.legacyBindingMode": "Legacy Binding Mode", "config.option.xtracr_realcamera.outTick": "Restriction exit delay (in ticks)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Disable main feature when holding", - "config.option.xtracr_realcamera.disableRenderItems": "Disable rendering when holding", - "config.tooltip.xtracr_realcamera.isClassic": "Classic mode only makes simple changes to the position and rotation of camera", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "When enabled, the crosshair will follow the player's view, ensuring consistent hit result\nRecommended to enable when Jade, WTHIT or similar mods are installed", - "config.tooltip.xtracr_realcamera.renderModel": "Render player model in first-person perspective", + "config.option.xtracr_realcamera.pitch": "Pitch", + "config.option.xtracr_realcamera.renderModel": "Render Player Model", + "config.option.xtracr_realcamera.renderStuckObjects": "Render Stuck Objects", + "config.option.xtracr_realcamera.rerenderModel": "Rerender Model", + "config.option.xtracr_realcamera.roll": "Roll", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Rotation Smooth Factor", + "config.option.xtracr_realcamera.scale": "Scale", + "config.option.xtracr_realcamera.screenModifierKey": "%s Screen Modifier Key", + "config.option.xtracr_realcamera.toModelViewScreen": "For detailed settings, please go to the %s screen (key bind need to be set to open it)", + "config.option.xtracr_realcamera.yaw": "Yaw", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Currently bound configuration index, 0 means allowing binding to any valid configuration", + "config.tooltip.xtracr_realcamera.adjustOffset": "When pressing the adjustment key, adjust the offset or rotation of camera", "config.tooltip.xtracr_realcamera.adjustStep": "Length or 1/100 of the angle of the adjustment per step", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "For several frames after the binding failure, continue to use the previous successful binding result", + "config.tooltip.xtracr_realcamera.cameraRotation": "Additional camera rotation in degrees", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Note: Pitch, yaw and roll are rotations on the left, up and front axes respectively", + "config.tooltip.xtracr_realcamera.centerOffset": "Rotation center's offset from head", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Determine which to adjust when pressing the adjustment key", - "config.tooltip.xtracr_realcamera.scale": "Control the size of the offsets", + "config.tooltip.xtracr_realcamera.classicOffset": "Camera's offset from its rotation center", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Note: player's front, up and left are the X, Y and Z axes respectively", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Three matching methods are supported:\n1. Wildcard `*` matching (e.g., `minecraft:*sword`)\n2. Tag matching (starts with `#`, e.g., `#minecraft:swords`)\n3. Direct item ID (e.g., `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Smooth factor of camera displacement, the higher the value, the smoother the movement", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "When enabled, the crosshair will follow the player's view, ensuring consistent hit result\nRecommended to enable when Jade, WTHIT or similar mods are installed", + "config.tooltip.xtracr_realcamera.isClassic": "Classic mode only makes simple changes to the position and rotation of camera", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Using the binding mode of legacy version (v0.5), only vanilla model and actions based on vanilla model are supported\nIts properties can be set in 'LEGACY_MODE' of the %s screen when enabled", - "config.tooltip.xtracr_realcamera.adjustOffset": "When pressing the adjustment key, adjust the offset or rotation of camera", + "config.tooltip.xtracr_realcamera.outTick": "The time before re-enabling main feature after exiting restricted states (e.g., swimming, crawling) (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Render player model in first-person perspective", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Arrows, bee stings and other objects that can be stuck in the player's body", "config.tooltip.xtracr_realcamera.rerenderModel": "Render the model again at the original rendering time to avoid some visual problems caused by rendering early", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "For several frames after the binding failure, continue to use the previous successful binding result", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Smooth factor of camera displacement, the higher the value, the smoother the movement", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Smooth factor of camera rotation, the higher the value, the smoother the movement", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Currently bound configuration index, 0 means allowing binding to any valid configuration", - "config.tooltip.xtracr_realcamera.outTick": "The time before re-enabling main feature after exiting restricted states (e.g., swimming, crawling) (1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Three matching methods are supported:\n1. Wildcard `*` matching (e.g., `minecraft:*sword`)\n2. Tag matching (starts with `#`, e.g., `#minecraft:swords`)\n3. Direct item ID (e.g., `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Control the size of the offsets", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Switch to next configuration", + "key.xtracr_realcamera.activeConfigIndexPREV": "Switch to previous configuration", + "key.xtracr_realcamera.activeConfigIndexRESET": "Reset configuration index", + "key.xtracr_realcamera.adjustBACK": "Adjust BACK", + "key.xtracr_realcamera.adjustDOWN": "Adjust DOWN", + "key.xtracr_realcamera.adjustFRONT": "Adjust FRONT", + "key.xtracr_realcamera.adjustLEFT": "Adjust LEFT", + "key.xtracr_realcamera.adjustRIGHT": "Adjust RIGHT", + "key.xtracr_realcamera.adjustUP": "Adjust UP", + "key.xtracr_realcamera.modelViewScreen": "Open Model View Screen", + "key.xtracr_realcamera.toggleAdjustMode": "Toggle Adjust Mode", + "key.xtracr_realcamera.toggleCameraMode": "Toggle Camera Mode", + "key.xtracr_realcamera.togglePerspective": "Enable/Disable", "message.xtracr_realcamera.bindingFailed": "[%s]: Binding failed, please go to the %s screen and configure manually (Key: %s)", - - "screen.xtracr_realcamera.modelView_title": "Model View", - "screen.widget.xtracr_realcamera.modelView_import": "Import", + "modmenu.descriptionTranslation.realcamera": "Make the camera more realistic in the first-person view.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "When disabled, the camera's relative relationship to the model will not change, but the camera's corresponding attributes will not be modified by this mod", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Saved Configs", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Copy all disabling settings", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Delete the selected rectangle\n(Or use the Delete key)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Planes where all vertex-to-screen distances are less than this value will not be rendered", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Disabling Settings\nGlobal disabling settings are in the config screen", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "The parts contained in the blue boxes will be disabled\nLeft Click to select, other keys to cancel selection\n%s+Left Click to quickly select the part pointed to by the mouse pointer", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Name of the disable setting", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Name cannot be empty!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Texture id cannot be empty!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Export the current config to the clipboard", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Export failed: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Export succeeded!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Focused Rectangle Number\n(0 means no selection)\nPress Space or Enter to locate the current focused rectangle (When typing, press twice to locate)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Import the config from the clipboard", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import failed: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s succeeded!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Paste all disabling settings in the clipboard to current config\n(Will not override existing setting with the same name)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "In the preview mode, you can adjust the camera's offset and rotation", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Priority when binding, the larger the value the higher the priority, and the higher the sorting on the right side", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Save as\n(When there is a setting with the same name, you can also press the save button on the left)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Scale, which controls the size of the offsets", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Left Click to get the UV coordinates at the mouse pointer\nThe three sets of UV coordinates below are, from top to bottom, the UV coordinates of the forward vector, the upward vector, and the binding point on the target plane\nNote: %s+Scroll to switch between the different layers of the model. Manually inputting UV coordinates allows you to bind more accurately to the target position", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Decide the mode of %s+Left Click quick selection\n(%s+Scroll to change the selection range in the range mode)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Name of the config", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "The texture id of the selected model (not necessary to be the full id), can be shortened when saving to make it easier to recognize.\nFor example, shorten minecraft:textures/entity/player/slim/alex.png to minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Open Global Config Screen\n(Cloth Config API required)", + "screen.widget.xtracr_realcamera.modelView_all": "All", + "screen.widget.xtracr_realcamera.modelView_configs": "Configs", + "screen.widget.xtracr_realcamera.modelView_copy": "Copy", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Current Config", + "screen.widget.xtracr_realcamera.modelView_disable": "Disable", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Disable Mode", "screen.widget.xtracr_realcamera.modelView_export": "Export", - "screen.widget.xtracr_realcamera.modelView_selecting": "Selecting", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Forward Vector", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Upward Vector", - "screen.widget.xtracr_realcamera.modelView_position": "Target Plane", - "screen.widget.xtracr_realcamera.modelView_save": "Save", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Disable Mode", - "screen.widget.xtracr_realcamera.modelView_all": "All", - "screen.widget.xtracr_realcamera.modelView_part": "Part", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Selection Mode", - "screen.widget.xtracr_realcamera.modelView_single": "Single", + "screen.widget.xtracr_realcamera.modelView_import": "Import", "screen.widget.xtracr_realcamera.modelView_multiple": "Multiple", - "screen.widget.xtracr_realcamera.modelView_range": "Range", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Toggle Slider to Field", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Toggle Field to Slider", "screen.widget.xtracr_realcamera.modelView_offsetX": "X Offset = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Y Offset = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z Offset = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Part", + "screen.widget.xtracr_realcamera.modelView_paste": "Paste", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Disable", + "screen.widget.xtracr_realcamera.modelView_position": "Target Plane", "screen.widget.xtracr_realcamera.modelView_preview": "Preview", - "screen.widget.xtracr_realcamera.modelView_configs": "Configs", - "screen.widget.xtracr_realcamera.modelView_copy": "Copy", - "screen.widget.xtracr_realcamera.modelView_paste": "Paste", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Current Config", - "screen.tooltip.xtracr_realcamera.modelView_import": "Import the config from the clipboard", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s succeeded!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import failed: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Export the current config to the clipboard", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Export succeeded!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Export failed: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Left Click to get the UV coordinates at the mouse pointer\nThe three sets of UV coordinates below are, from top to bottom, the UV coordinates of the forward vector, the upward vector, and the binding point on the target plane\nNote: %s+Scroll to switch between the different layers of the model. Manually inputting UV coordinates allows you to bind more accurately to the target position", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "The texture id of the selected model (not necessary to be the full id), can be shortened when saving to make it easier to recognize.\nFor example, shorten minecraft:textures/entity/player/slim/alex.png to minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "The parts contained in the blue boxes will be disabled\nLeft Click to select, other keys to cancel selection\n%s+Left Click to quickly select the part pointed to by the mouse pointer", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Decide the mode of %s+Left Click quick selection\n(%s+Scroll to change the selection range in the range mode)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Focused Rectangle Number\n(0 means no selection)\nPress Space or Enter to locate the current focused rectangle (When typing, press twice to locate)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Delete the selected rectangle\n(Or use the Delete key)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "When disabled, the camera's relative relationship to the model will not change, but the camera's corresponding attributes will not be modified by this mod", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Scale, which controls the size of the offsets", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Planes where all vertex-to-screen distances are less than this value will not be rendered", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Priority when binding, the larger the value the higher the priority, and the higher the sorting on the right side", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Name of the config", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Disabling Settings\nGlobal disabling settings are in the config screen", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Saved Configs", - "screen.tooltip.xtracr_realcamera.modelView_preview": "In the preview mode, you can adjust the camera's offset and rotation", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Open Global Config Screen\n(Cloth Config API required)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copy all disabling settings", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Paste all disabling settings in the clipboard to current config\n(Will not override existing setting with the same name)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Name cannot be empty!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Texture id cannot be empty!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Save as\n(When there is a setting with the same name, you can also press the save button on the left)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Name of the disable setting" + "screen.widget.xtracr_realcamera.modelView_range": "Range", + "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Save", + "screen.widget.xtracr_realcamera.modelView_selecting": "Selecting", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Selection Mode", + "screen.widget.xtracr_realcamera.modelView_single": "Single", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Toggle Field to Slider", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Toggle Slider to Field", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Upward Vector", + "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", + "screen.xtracr_realcamera.modelView_title": "Model View" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/es_es.json b/common/src/main/resources/assets/realcamera/lang/es_es.json index 580e31fa..921cd865 100644 --- a/common/src/main/resources/assets/realcamera/lang/es_es.json +++ b/common/src/main/resources/assets/realcamera/lang/es_es.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Abrir Pantalla de Vista de Modelo", - "key.xtracr_realcamera.togglePerspective": "Activar/Desactivar", - "key.xtracr_realcamera.activeConfigIndexPREV": "Cambiar a la configuración anterior", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Cambiar a la siguiente configuración", - "key.xtracr_realcamera.activeConfigIndexRESET": "Restablecer índice de configuración", - "key.xtracr_realcamera.toggleAdjustMode": "Cambiar Modo de Ajuste", - "key.xtracr_realcamera.toggleCameraMode": "Cambiar Modo de Cámara", - "key.xtracr_realcamera.adjustUP": "Ajustar ARRIBA", - "key.xtracr_realcamera.adjustDOWN": "Ajustar ABAJO", - "key.xtracr_realcamera.adjustFRONT": "Ajustar ADELANTE", - "key.xtracr_realcamera.adjustBACK": "Ajustar ATRÁS", - "key.xtracr_realcamera.adjustLEFT": "Ajustar IZQUIERDA", - "key.xtracr_realcamera.adjustRIGHT": "Ajustar DERECHA", - "modmenu.descriptionTranslation.realcamera": "Hace que la cámara sea más realista en la vista en primera persona.", - - "config.category.xtracr_realcamera.general": "General", "config.category.xtracr_realcamera.binding": "Modo de Vinculación", - "config.category.xtracr_realcamera.classic": "Modo Clásico", "config.category.xtracr_realcamera.cameraOffset": "Desplazamiento de Cámara", - "config.category.xtracr_realcamera.centerOffset": "Desplazamiento del Centro de Rotación", "config.category.xtracr_realcamera.cameraRotation": "Rotación de Cámara", - "config.tooltip.xtracr_realcamera.classicOffset": "Desplazamiento de la cámara desde su centro de rotación", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Nota: el frente, arriba e izquierda del jugador son los ejes X, Y y Z respectivamente", - "config.tooltip.xtracr_realcamera.centerOffset": "Desplazamiento del centro de rotación desde la cabeza", - "config.tooltip.xtracr_realcamera.cameraRotation": "Rotación adicional de la cámara en grados", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Nota: Pitch, yaw y roll son rotaciones en los ejes izquierda, arriba y frente respectivamente", - - "config.option.xtracr_realcamera.enabled": "Mod Activado", - "config.option.xtracr_realcamera.isClassic": "Modo Clásico", - "config.option.xtracr_realcamera.dynamicCrosshair": "Mira Dinámica", - "config.option.xtracr_realcamera.renderModel": "Renderizar Modelo de Jugador", + "config.category.xtracr_realcamera.centerOffset": "Desplazamiento del Centro de Rotación", + "config.category.xtracr_realcamera.classic": "Modo Clásico", + "config.category.xtracr_realcamera.general": "General", + "config.option.xtracr_realcamera.activeConfigIndex": "Índice de configuración activa", + "config.option.xtracr_realcamera.adjustOffset": "Ajustar Desplazamiento de Cámara", "config.option.xtracr_realcamera.adjustStep": "Paso de Ajuste", - "config.option.xtracr_realcamera.classicAdjustMode": "Modo de Ajuste", - "config.option.xtracr_realcamera.scale": "Escala", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Marcos de retención de resultado de vinculación", "config.option.xtracr_realcamera.cameraOffset": "Desplazamiento de Cámara %s", "config.option.xtracr_realcamera.centerOffset": "Desplazamiento del Centro de Rotación %s", - "config.option.xtracr_realcamera.pitch": "Pitch", - "config.option.xtracr_realcamera.yaw": "Yaw", - "config.option.xtracr_realcamera.roll": "Roll", - "config.option.xtracr_realcamera.toModelViewScreen": "Para configuraciones detalladas, por favor vaya a la pantalla %s (se necesita configurar una tecla para abrirla)", - "config.option.xtracr_realcamera.screenModifierKey": "Tecla modificadora de pantalla %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Modo de Enlace Heredado", - "config.option.xtracr_realcamera.adjustOffset": "Ajustar Desplazamiento de Cámara", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensajes de fallo de vinculación", - "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Atascados", - "config.option.xtracr_realcamera.rerenderModel": "Re-renderizar Modelo", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Marcos de retención de resultado de vinculación", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Factor de suavizado de desplazamiento", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Factor de suavizado de rotación", - "config.option.xtracr_realcamera.activeConfigIndex": "Índice de configuración activa", + "config.option.xtracr_realcamera.classicAdjustMode": "Modo de Ajuste", "config.option.xtracr_realcamera.disableConfig": "Configuración Desactivada", - "config.option.xtracr_realcamera.disableWhenSneaking": "Desactivar función principal al agacharse", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Desactivar función principal al sostener...", + "config.option.xtracr_realcamera.disableRenderItems": "Desactivar renderizado al sostener...", "config.option.xtracr_realcamera.disableWhenCrawling": "Desactivar función principal al gatear", + "config.option.xtracr_realcamera.disableWhenSneaking": "Desactivar función principal al agacharse", "config.option.xtracr_realcamera.disableWhenSwimming": "Desactivar función principal al nadar", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Factor de suavizado de desplazamiento", + "config.option.xtracr_realcamera.dynamicCrosshair": "Mira Dinámica", + "config.option.xtracr_realcamera.enabled": "Mod Activado", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensajes de fallo de vinculación", + "config.option.xtracr_realcamera.isClassic": "Modo Clásico", + "config.option.xtracr_realcamera.legacyBindingMode": "Modo de Enlace Heredado", "config.option.xtracr_realcamera.outTick": "Retraso al salir del estado de natación (en ticks)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Desactivar función principal al sostener...", - "config.option.xtracr_realcamera.disableRenderItems": "Desactivar renderizado al sostener...", - "config.tooltip.xtracr_realcamera.isClassic": "El modo clásico solo hace cambios simples a la posición y rotación de la cámara", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Cuando está activado, la mira seguirá la vista del jugador, asegurando resultados de impacto consistentes\nRecomendado activar cuando están instalados mods como Jade, WTHIT o similares", - "config.tooltip.xtracr_realcamera.renderModel": "Renderizar modelo del jugador en perspectiva en primera persona", + "config.option.xtracr_realcamera.pitch": "Pitch", + "config.option.xtracr_realcamera.renderModel": "Renderizar Modelo de Jugador", + "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Atascados", + "config.option.xtracr_realcamera.rerenderModel": "Re-renderizar Modelo", + "config.option.xtracr_realcamera.roll": "Roll", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Factor de suavizado de rotación", + "config.option.xtracr_realcamera.scale": "Escala", + "config.option.xtracr_realcamera.screenModifierKey": "Tecla modificadora de pantalla %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Para configuraciones detalladas, por favor vaya a la pantalla %s (se necesita configurar una tecla para abrirla)", + "config.option.xtracr_realcamera.yaw": "Yaw", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuración actualmente vinculada, 0 significa permitir la vinculación a cualquier configuración válida", + "config.tooltip.xtracr_realcamera.adjustOffset": "Al presionar la tecla de ajuste, ajusta el desplazamiento o rotación de la cámara", "config.tooltip.xtracr_realcamera.adjustStep": "Longitud o 1/100 del ángulo del ajuste por paso", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Durante varios fotogramas después del fallo de vinculación, continuar utilizando el resultado de vinculación exitoso anterior", + "config.tooltip.xtracr_realcamera.cameraRotation": "Rotación adicional de la cámara en grados", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Nota: Pitch, yaw y roll son rotaciones en los ejes izquierda, arriba y frente respectivamente", + "config.tooltip.xtracr_realcamera.centerOffset": "Desplazamiento del centro de rotación desde la cabeza", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Determina qué ajustar al presionar la tecla de ajuste", - "config.tooltip.xtracr_realcamera.scale": "Controla el tamaño de los desplazamientos", + "config.tooltip.xtracr_realcamera.classicOffset": "Desplazamiento de la cámara desde su centro de rotación", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Nota: el frente, arriba e izquierda del jugador son los ejes X, Y y Z respectivamente", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Se admiten tres métodos de coincidencia:\n1. Coincidencia con comodín `*` (por ejemplo, `minecraft:*sword`)\n2. Coincidencia de etiquetas (comienza con `#`, por ejemplo, `#minecraft:swords`)\n3. ID de objeto directo (por ejemplo, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Factor de suavizado del desplazamiento de la cámara, cuanto mayor sea el valor, más suave será el movimiento", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Cuando está activado, la mira seguirá la vista del jugador, asegurando resultados de impacto consistentes\nRecomendado activar cuando están instalados mods como Jade, WTHIT o similares", + "config.tooltip.xtracr_realcamera.isClassic": "El modo clásico solo hace cambios simples a la posición y rotación de la cámara", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Usando el modo de enlace de la versión heredada (v0.5), solo se admiten modelos vanilla y acciones basadas en modelos vanilla\nSus propiedades se pueden configurar en 'LEGACY_MODE' de la pantalla %s cuando está habilitado", - "config.tooltip.xtracr_realcamera.adjustOffset": "Al presionar la tecla de ajuste, ajusta el desplazamiento o rotación de la cámara", + "config.tooltip.xtracr_realcamera.outTick": "Tiempo antes de activar la función principal después de salir del estado de natación (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Renderizar modelo del jugador en perspectiva en primera persona", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flechas, picaduras de abeja y otros objetos que pueden quedar atascados en el cuerpo del jugador", "config.tooltip.xtracr_realcamera.rerenderModel": "Renderizar el modelo nuevamente en el momento original de renderizado para evitar problemas visuales causados por renderizado temprano", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Durante varios fotogramas después del fallo de vinculación, continuar utilizando el resultado de vinculación exitoso anterior", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Factor de suavizado del desplazamiento de la cámara, cuanto mayor sea el valor, más suave será el movimiento", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Factor de suavizado de la rotación de la cámara, cuanto mayor sea el valor, más suave será el movimiento", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuración actualmente vinculada, 0 significa permitir la vinculación a cualquier configuración válida", - "config.tooltip.xtracr_realcamera.outTick": "Tiempo antes de activar la función principal después de salir del estado de natación (1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Se admiten tres métodos de coincidencia:\n1. Coincidencia con comodín `*` (por ejemplo, `minecraft:*sword`)\n2. Coincidencia de etiquetas (comienza con `#`, por ejemplo, `#minecraft:swords`)\n3. ID de objeto directo (por ejemplo, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Controla el tamaño de los desplazamientos", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Cambiar a la siguiente configuración", + "key.xtracr_realcamera.activeConfigIndexPREV": "Cambiar a la configuración anterior", + "key.xtracr_realcamera.activeConfigIndexRESET": "Restablecer índice de configuración", + "key.xtracr_realcamera.adjustBACK": "Ajustar ATRÁS", + "key.xtracr_realcamera.adjustDOWN": "Ajustar ABAJO", + "key.xtracr_realcamera.adjustFRONT": "Ajustar ADELANTE", + "key.xtracr_realcamera.adjustLEFT": "Ajustar IZQUIERDA", + "key.xtracr_realcamera.adjustRIGHT": "Ajustar DERECHA", + "key.xtracr_realcamera.adjustUP": "Ajustar ARRIBA", + "key.xtracr_realcamera.modelViewScreen": "Abrir Pantalla de Vista de Modelo", + "key.xtracr_realcamera.toggleAdjustMode": "Cambiar Modo de Ajuste", + "key.xtracr_realcamera.toggleCameraMode": "Cambiar Modo de Cámara", + "key.xtracr_realcamera.togglePerspective": "Activar/Desactivar", "message.xtracr_realcamera.bindingFailed": "[%s]: Vinculación fallida, por favor vaya a la pantalla %s y configure manualmente (tecla: %s)", - - "screen.xtracr_realcamera.modelView_title": "Vista de Modelo", - "screen.widget.xtracr_realcamera.modelView_import": "Importar", + "modmenu.descriptionTranslation.realcamera": "Hace que la cámara sea más realista en la vista en primera persona.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Cuando está desactivado, la relación relativa de la cámara con el modelo no cambiará, pero los atributos correspondientes de la cámara no serán modificados por este mod", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Configuraciones Guardadas", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas las configuraciones de desactivación", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Eliminar el rectángulo seleccionado\n(O usar la tecla Delete)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Los planos donde todas las distancias de vértice a pantalla son menores que este valor no se renderizarán", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Configuraciones de Desactivación\nLas configuraciones globales de desactivación están en la pantalla de configuración", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Las partes contenidas en los cuadros azules serán desactivadas\nClic izquierdo para seleccionar, otras teclas para cancelar la selección\n%s+Clic izquierdo para seleccionar rápidamente la parte señalada por el puntero del ratón", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nombre de la configuración de desactivación", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "¡El nombre no puede estar vacío!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "¡El ID de textura no puede estar vacío!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Exportar la configuración actual al portapapeles", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Exportación fallida: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "¡Exportación exitosa!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Número de Rectángulo Enfocado\n(0 significa sin selección)\nPresione Espacio o Enter para localizar el rectángulo enfocado actual (Al escribir, presione dos veces para localizar)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Importar la configuración desde el portapapeles", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Importación fallida: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "¡Importación %s exitosa!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Pegar todas las configuraciones de desactivación del portapapeles a la configuración actual\n(No sobrescribirá la configuración existente con el mismo nombre)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "En el modo de vista previa, puedes ajustar el desplazamiento y rotación de la cámara", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridad al vincular, cuanto mayor sea el valor, mayor será la prioridad y más alto será el orden en el lado derecho", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Guardar como\n(Cuando existe una configuración con el mismo nombre, también puede usar el botón guardar a la izquierda)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla el tamaño de los desplazamientos", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clic izquierdo para obtener las coordenadas UV en el puntero del ratón\nLos tres conjuntos de coordenadas UV a continuación son, de arriba a abajo, las coordenadas UV del vector adelante, el vector arriba y el punto de vinculación en el plano objetivo\nNota: %s+Desplazarse para cambiar entre las diferentes capas del modelo. Ingresar manualmente las coordenadas UV permite vincular con mayor precisión a la posición objetivo", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina el modo de selección rápida %s+Clic izquierdo\n(%s+Desplazarse para cambiar el rango de selección en el modo de rango)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nombre de la configuración", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "El ID de textura del modelo seleccionado (no es necesario que sea el ID completo), se puede acortar al guardar para que sea más fácil de reconocer.\nPor ejemplo, acortar minecraft:textures/entity/player/slim/alex.png a minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir la Pantalla de Configuración Global\n(Requiere Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "Todo", + "screen.widget.xtracr_realcamera.modelView_configs": "Configuraciones", + "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuración Actual", + "screen.widget.xtracr_realcamera.modelView_disable": "Desactivar", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo Desactivado", "screen.widget.xtracr_realcamera.modelView_export": "Exportar", - "screen.widget.xtracr_realcamera.modelView_selecting": "Seleccionando", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Vector Adelante", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vector Arriba", - "screen.widget.xtracr_realcamera.modelView_position": "Plano Objetivo", - "screen.widget.xtracr_realcamera.modelView_save": "Guardar", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo Desactivado", - "screen.widget.xtracr_realcamera.modelView_all": "Todo", - "screen.widget.xtracr_realcamera.modelView_part": "Parte", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Modo de Selección", - "screen.widget.xtracr_realcamera.modelView_single": "Único", + "screen.widget.xtracr_realcamera.modelView_import": "Importar", "screen.widget.xtracr_realcamera.modelView_multiple": "Múltiple", - "screen.widget.xtracr_realcamera.modelView_range": "Rango", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Cambiar de Deslizador a Campo", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Cambiar de Campo a Deslizador", "screen.widget.xtracr_realcamera.modelView_offsetX": "Desplazamiento X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Desplazamiento Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Desplazamiento Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Parte", + "screen.widget.xtracr_realcamera.modelView_paste": "Pegar", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Desactivar", + "screen.widget.xtracr_realcamera.modelView_position": "Plano Objetivo", "screen.widget.xtracr_realcamera.modelView_preview": "Vista Previa", - "screen.widget.xtracr_realcamera.modelView_configs": "Configuraciones", - "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", - "screen.widget.xtracr_realcamera.modelView_paste": "Pegar", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuración Actual", - "screen.tooltip.xtracr_realcamera.modelView_import": "Importar la configuración desde el portapapeles", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "¡Importación %s exitosa!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Importación fallida: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Exportar la configuración actual al portapapeles", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "¡Exportación exitosa!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Exportación fallida: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clic izquierdo para obtener las coordenadas UV en el puntero del ratón\nLos tres conjuntos de coordenadas UV a continuación son, de arriba a abajo, las coordenadas UV del vector adelante, el vector arriba y el punto de vinculación en el plano objetivo\nNota: %s+Desplazarse para cambiar entre las diferentes capas del modelo. Ingresar manualmente las coordenadas UV permite vincular con mayor precisión a la posición objetivo", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "El ID de textura del modelo seleccionado (no es necesario que sea el ID completo), se puede acortar al guardar para que sea más fácil de reconocer.\nPor ejemplo, acortar minecraft:textures/entity/player/slim/alex.png a minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Las partes contenidas en los cuadros azules serán desactivadas\nClic izquierdo para seleccionar, otras teclas para cancelar la selección\n%s+Clic izquierdo para seleccionar rápidamente la parte señalada por el puntero del ratón", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina el modo de selección rápida %s+Clic izquierdo\n(%s+Desplazarse para cambiar el rango de selección en el modo de rango)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Número de Rectángulo Enfocado\n(0 significa sin selección)\nPresione Espacio o Enter para localizar el rectángulo enfocado actual (Al escribir, presione dos veces para localizar)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Eliminar el rectángulo seleccionado\n(O usar la tecla Delete)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Cuando está desactivado, la relación relativa de la cámara con el modelo no cambiará, pero los atributos correspondientes de la cámara no serán modificados por este mod", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla el tamaño de los desplazamientos", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Los planos donde todas las distancias de vértice a pantalla son menores que este valor no se renderizarán", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridad al vincular, cuanto mayor sea el valor, mayor será la prioridad y más alto será el orden en el lado derecho", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nombre de la configuración", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Configuraciones de Desactivación\nLas configuraciones globales de desactivación están en la pantalla de configuración", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Configuraciones Guardadas", - "screen.tooltip.xtracr_realcamera.modelView_preview": "En el modo de vista previa, puedes ajustar el desplazamiento y rotación de la cámara", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir la Pantalla de Configuración Global\n(Requiere Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas las configuraciones de desactivación", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Pegar todas las configuraciones de desactivación del portapapeles a la configuración actual\n(No sobrescribirá la configuración existente con el mismo nombre)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "¡El nombre no puede estar vacío!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "¡El ID de textura no puede estar vacío!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Guardar como\n(Cuando existe una configuración con el mismo nombre, también puede usar el botón guardar a la izquierda)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nombre de la configuración de desactivación" + "screen.widget.xtracr_realcamera.modelView_range": "Rango", + "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Guardar", + "screen.widget.xtracr_realcamera.modelView_selecting": "Seleccionando", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Modo de Selección", + "screen.widget.xtracr_realcamera.modelView_single": "Único", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Cambiar de Campo a Deslizador", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Cambiar de Deslizador a Campo", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vector Arriba", + "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", + "screen.xtracr_realcamera.modelView_title": "Vista de Modelo" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/fr_fr.json b/common/src/main/resources/assets/realcamera/lang/fr_fr.json index 581ef6b6..69dd50bf 100644 --- a/common/src/main/resources/assets/realcamera/lang/fr_fr.json +++ b/common/src/main/resources/assets/realcamera/lang/fr_fr.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Ouvrir l'écran de visualisation du modèle", - "key.xtracr_realcamera.togglePerspective": "Activer/Désactiver", - "key.xtracr_realcamera.activeConfigIndexPREV": "Passer à la configuration précédente", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Passer à la configuration suivante", - "key.xtracr_realcamera.activeConfigIndexRESET": "Réinitialiser l'index de configuration", - "key.xtracr_realcamera.toggleAdjustMode": "Basculer le mode d'ajustement", - "key.xtracr_realcamera.toggleCameraMode": "Basculer le mode caméra", - "key.xtracr_realcamera.adjustUP": "Ajuster vers le HAUT", - "key.xtracr_realcamera.adjustDOWN": "Ajuster vers le BAS", - "key.xtracr_realcamera.adjustFRONT": "Ajuster vers l'AVANT", - "key.xtracr_realcamera.adjustBACK": "Ajuster vers l'ARRIÈRE", - "key.xtracr_realcamera.adjustLEFT": "Ajuster vers la GAUCHE", - "key.xtracr_realcamera.adjustRIGHT": "Ajuster vers la DROITE", - "modmenu.descriptionTranslation.realcamera": "Rendre la caméra plus réaliste en vue à la première personne.", - - "config.category.xtracr_realcamera.general": "Général", "config.category.xtracr_realcamera.binding": "Mode Liaison", - "config.category.xtracr_realcamera.classic": "Mode Classique", "config.category.xtracr_realcamera.cameraOffset": "Décalage Caméra", - "config.category.xtracr_realcamera.centerOffset": "Décalage Centre Rotation", "config.category.xtracr_realcamera.cameraRotation": "Rotation Caméra", - "config.tooltip.xtracr_realcamera.classicOffset": "Décalage de la caméra par rapport à son centre de rotation", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Note : l'avant, le haut et la gauche du joueur sont respectivement les axes X, Y et Z", - "config.tooltip.xtracr_realcamera.centerOffset": "Décalage du centre de rotation par rapport à la tête", - "config.tooltip.xtracr_realcamera.cameraRotation": "Rotation supplémentaire de la caméra en degrés", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Note : Pitch, yaw et roll sont des rotations sur les axes gauche, haut et avant respectivement", - - "config.option.xtracr_realcamera.enabled": "Mod Activé", - "config.option.xtracr_realcamera.isClassic": "Mode Classique", - "config.option.xtracr_realcamera.dynamicCrosshair": "Réticule Dynamique", - "config.option.xtracr_realcamera.renderModel": "Afficher le Modèle du Joueur", + "config.category.xtracr_realcamera.centerOffset": "Décalage Centre Rotation", + "config.category.xtracr_realcamera.classic": "Mode Classique", + "config.category.xtracr_realcamera.general": "Général", + "config.option.xtracr_realcamera.activeConfigIndex": "Index de configuration actif", + "config.option.xtracr_realcamera.adjustOffset": "Ajuster le Décalage Caméra", "config.option.xtracr_realcamera.adjustStep": "Pas d'Ajustement", - "config.option.xtracr_realcamera.classicAdjustMode": "Mode d'Ajustement", - "config.option.xtracr_realcamera.scale": "Échelle", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Images de rétention des résultats de liaison", "config.option.xtracr_realcamera.cameraOffset": "Décalage Caméra %s", "config.option.xtracr_realcamera.centerOffset": "Décalage Centre Rotation %s", - "config.option.xtracr_realcamera.pitch": "Pitch", - "config.option.xtracr_realcamera.yaw": "Yaw", - "config.option.xtracr_realcamera.roll": "Roll", - "config.option.xtracr_realcamera.toModelViewScreen": "Pour les paramètres détaillés, veuillez aller à l'écran %s (un raccourci clavier doit être défini pour l'ouvrir)", - "config.option.xtracr_realcamera.screenModifierKey": "Touche modifi d'écran %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Mode de Liaison Hérité", - "config.option.xtracr_realcamera.adjustOffset": "Ajuster le Décalage Caméra", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Masquer les messages d'échec de liaison", - "config.option.xtracr_realcamera.renderStuckObjects": "Afficher les Objets Coincés", - "config.option.xtracr_realcamera.rerenderModel": "Réafficher le Modèle", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Images de rétention des résultats de liaison", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Facteur de lissage du déplacement", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Facteur de lissage de la rotation", - "config.option.xtracr_realcamera.activeConfigIndex": "Index de configuration actif", + "config.option.xtracr_realcamera.classicAdjustMode": "Mode d'Ajustement", "config.option.xtracr_realcamera.disableConfig": "Config Désactivée", - "config.option.xtracr_realcamera.disableWhenSneaking": "Désactiver la fonctionnalité principale en se faufilant", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Désactiver la fonctionnalité principale en tenant...", + "config.option.xtracr_realcamera.disableRenderItems": "Désactiver le rendu en tenant...", "config.option.xtracr_realcamera.disableWhenCrawling": "Désactiver la fonctionnalité principale en rampant", + "config.option.xtracr_realcamera.disableWhenSneaking": "Désactiver la fonctionnalité principale en se faufilant", "config.option.xtracr_realcamera.disableWhenSwimming": "Désactiver la fonctionnalité principale en nageant", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Facteur de lissage du déplacement", + "config.option.xtracr_realcamera.dynamicCrosshair": "Réticule Dynamique", + "config.option.xtracr_realcamera.enabled": "Mod Activé", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Masquer les messages d'échec de liaison", + "config.option.xtracr_realcamera.isClassic": "Mode Classique", + "config.option.xtracr_realcamera.legacyBindingMode": "Mode de Liaison Hérité", "config.option.xtracr_realcamera.outTick": "Délai de sortie de l'état de nage (en ticks)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Désactiver la fonctionnalité principale en tenant...", - "config.option.xtracr_realcamera.disableRenderItems": "Désactiver le rendu en tenant...", - "config.tooltip.xtracr_realcamera.isClassic": "Le mode classique ne fait que des changements simples à la position et à la rotation de la caméra", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Lorsqu'il est activé, le réticule suivra la vue du joueur, garantissant un résultat de frappe cohérent\nRecommandé d'activer lorsque Jade, WTHIT ou des mods similaires sont installés", - "config.tooltip.xtracr_realcamera.renderModel": "Afficher le modèle du joueur en vue à la première personne", + "config.option.xtracr_realcamera.pitch": "Pitch", + "config.option.xtracr_realcamera.renderModel": "Afficher le Modèle du Joueur", + "config.option.xtracr_realcamera.renderStuckObjects": "Afficher les Objets Coincés", + "config.option.xtracr_realcamera.rerenderModel": "Réafficher le Modèle", + "config.option.xtracr_realcamera.roll": "Roll", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Facteur de lissage de la rotation", + "config.option.xtracr_realcamera.scale": "Échelle", + "config.option.xtracr_realcamera.screenModifierKey": "Touche modifi d'écran %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Pour les paramètres détaillés, veuillez aller à l'écran %s (un raccourci clavier doit être défini pour l'ouvrir)", + "config.option.xtracr_realcamera.yaw": "Yaw", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Index de configuration actuellement lié, 0 signifie autoriser la liaison à toute configuration valide", + "config.tooltip.xtracr_realcamera.adjustOffset": "Lors de l'appui sur la touche d'ajustement, ajuster le décalage ou la rotation de la caméra", "config.tooltip.xtracr_realcamera.adjustStep": "Longueur ou 1/100 de l'angle de l'ajustement par étape", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Pendant plusieurs images après l'échec de la liaison, continuer à utiliser le résultat de liaison réussi précédent", + "config.tooltip.xtracr_realcamera.cameraRotation": "Rotation supplémentaire de la caméra en degrés", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Note : Pitch, yaw et roll sont des rotations sur les axes gauche, haut et avant respectivement", + "config.tooltip.xtracr_realcamera.centerOffset": "Décalage du centre de rotation par rapport à la tête", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Détermine quoi ajuster lors de l'appui sur la touche d'ajustement", - "config.tooltip.xtracr_realcamera.scale": "Contrôler la taille des décalages", + "config.tooltip.xtracr_realcamera.classicOffset": "Décalage de la caméra par rapport à son centre de rotation", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Note : l'avant, le haut et la gauche du joueur sont respectivement les axes X, Y et Z", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Trois méthodes de correspondance sont prises en charge :\n1. Correspondance avec joker `*` (par exemple, `minecraft:*sword`)\n2. Correspondance d'étiquette (commence par `#`, par exemple, `#minecraft:swords`)\n3. ID d'objet direct (par exemple, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Facteur de lissage du déplacement de la caméra, plus la valeur est élevée, plus le mouvement est fluide", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Lorsqu'il est activé, le réticule suivra la vue du joueur, garantissant un résultat de frappe cohérent\nRecommandé d'activer lorsque Jade, WTHIT ou des mods similaires sont installés", + "config.tooltip.xtracr_realcamera.isClassic": "Le mode classique ne fait que des changements simples à la position et à la rotation de la caméra", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Utilisation du mode de liaison de la version héritée (v0.5), seuls les modèles vanilla et les actions basées sur des modèles vanilla sont pris en charge\nSes propriétés peuvent être définies dans 'LEGACY_MODE' de l'écran %s lorsqu'il est activé", - "config.tooltip.xtracr_realcamera.adjustOffset": "Lors de l'appui sur la touche d'ajustement, ajuster le décalage ou la rotation de la caméra", + "config.tooltip.xtracr_realcamera.outTick": "Le délai d'activation de la fonction principale après la sortie de l'état de nage (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Afficher le modèle du joueur en vue à la première personne", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flèches, piqûres d'abeille et autres objets pouvant être coincés dans le corps du joueur", "config.tooltip.xtracr_realcamera.rerenderModel": "Afficher à nouveau le modèle au moment du rendu original pour éviter certains problèmes visuels causés par un rendu précoce", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Pendant plusieurs images après l'échec de la liaison, continuer à utiliser le résultat de liaison réussi précédent", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Facteur de lissage du déplacement de la caméra, plus la valeur est élevée, plus le mouvement est fluide", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Facteur de lissage de la rotation de la caméra, plus la valeur est élevée, plus le mouvement est fluide", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Index de configuration actuellement lié, 0 signifie autoriser la liaison à toute configuration valide", - "config.tooltip.xtracr_realcamera.outTick": "Le délai d'activation de la fonction principale après la sortie de l'état de nage (1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Trois méthodes de correspondance sont prises en charge :\n1. Correspondance avec joker `*` (par exemple, `minecraft:*sword`)\n2. Correspondance d'étiquette (commence par `#`, par exemple, `#minecraft:swords`)\n3. ID d'objet direct (par exemple, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Contrôler la taille des décalages", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Passer à la configuration suivante", + "key.xtracr_realcamera.activeConfigIndexPREV": "Passer à la configuration précédente", + "key.xtracr_realcamera.activeConfigIndexRESET": "Réinitialiser l'index de configuration", + "key.xtracr_realcamera.adjustBACK": "Ajuster vers l'ARRIÈRE", + "key.xtracr_realcamera.adjustDOWN": "Ajuster vers le BAS", + "key.xtracr_realcamera.adjustFRONT": "Ajuster vers l'AVANT", + "key.xtracr_realcamera.adjustLEFT": "Ajuster vers la GAUCHE", + "key.xtracr_realcamera.adjustRIGHT": "Ajuster vers la DROITE", + "key.xtracr_realcamera.adjustUP": "Ajuster vers le HAUT", + "key.xtracr_realcamera.modelViewScreen": "Ouvrir l'écran de visualisation du modèle", + "key.xtracr_realcamera.toggleAdjustMode": "Basculer le mode d'ajustement", + "key.xtracr_realcamera.toggleCameraMode": "Basculer le mode caméra", + "key.xtracr_realcamera.togglePerspective": "Activer/Désactiver", "message.xtracr_realcamera.bindingFailed": "[%s]: Échec de la liaison, veuillez aller à l'écran %s et configurer manuellement (touche: %s)", - - "screen.xtracr_realcamera.modelView_title": "Vue Modèle", - "screen.widget.xtracr_realcamera.modelView_import": "Importer", + "modmenu.descriptionTranslation.realcamera": "Rendre la caméra plus réaliste en vue à la première personne.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Lorsqu'il est désactivé, la relation relative de la caméra avec le modèle ne changera pas, mais les attributs correspondants de la caméra ne seront pas modifiés par ce mod", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurations enregistrées", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Copier tous les paramètres de désactivation", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Supprimer le rectangle sélectionné\n(Ou utiliser la touche Suppr)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Les plans où toutes les distances vertex-à-écran sont inférieures à cette valeur ne seront pas rendus", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Paramètres de désactivation\nLes paramètres de désactivation globaux se trouvent dans l'écran de configuration", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Les parties contenues dans les cadres bleus seront désactivées\nClic gauche pour sélectionner, autres touches pour annuler la sélection\n%s+Clic gauche pour sélectionner rapidement la partie pointée par le curseur de la souris", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nom du paramètre de désactivation", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Le nom ne peut pas être vide !", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "L'identifiant de texture ne peut pas être vide !", + "screen.tooltip.xtracr_realcamera.modelView_export": "Exporter la configuration actuelle vers le presse-papiers", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Échec de l'exportation : \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Exportation réussie !", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Numéro du rectangle focalisé\n(0 signifie aucune sélection)\nAppuyez sur Espace ou Entrée pour localiser le rectangle focalisé actuel (Lors de la frappe, appuyez deux fois pour localiser)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Importer la configuration depuis le presse-papiers", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Échec de l'importation : \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importation %s réussie !", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Coller tous les paramètres de désactivation du presse-papiers dans la configuration actuelle\n(Ne remplacera pas les paramètres existants portant le même nom)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "En mode aperçu, vous pouvez ajuster le décalage et la rotation de la caméra", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorité lors de la liaison, plus la valeur est grande, plus la priorité est élevée et plus le tri est haut sur le côté droit", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Enregistrer sous\n(Lorsqu'il existe une configuration avec le même nom, vous pouvez également utiliser le bouton enregistrer à gauche)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Échelle, qui contrôle la taille des décalages", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clic gauche pour obtenir les coordonnées UV au niveau du pointeur de la souris\nLes trois ensembles de coordonnées UV ci-dessous sont, de haut en bas, les coordonnées UV du vecteur avant, du vecteur haut et du point de liaison sur le plan cible\nNote : %s+Défilement pour basculer entre les différentes couches du modèle. La saisie manuelle des coordonnées UV permet de se lier plus précisément à la position cible", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Détermine le mode de sélection rapide %s+Clic gauche\n(%s+Défilement pour changer la plage de sélection en mode plage)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nom de la configuration", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "L'identifiant de texture du modèle sélectionné (pas nécessairement l'identifiant complet), peut être raccourci lors de l'enregistrement pour faciliter la reconnaissance.\nPar exemple, raccourcissez minecraft:textures/entity/player/slim/alex.png en minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Ouvrir l'écran de configuration globale\n(API Cloth Config requise)", + "screen.widget.xtracr_realcamera.modelView_all": "Tout", + "screen.widget.xtracr_realcamera.modelView_configs": "Configurations", + "screen.widget.xtracr_realcamera.modelView_copy": "Copier", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Config Actuelle", + "screen.widget.xtracr_realcamera.modelView_disable": "Désactiver", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Mode Désactivé", "screen.widget.xtracr_realcamera.modelView_export": "Exporter", - "screen.widget.xtracr_realcamera.modelView_selecting": "Sélection", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Vecteur Avant", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vecteur Haut", - "screen.widget.xtracr_realcamera.modelView_position": "Plan Cible", - "screen.widget.xtracr_realcamera.modelView_save": "Enregistrer", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Mode Désactivé", - "screen.widget.xtracr_realcamera.modelView_all": "Tout", - "screen.widget.xtracr_realcamera.modelView_part": "Partie", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Mode de Sélection", - "screen.widget.xtracr_realcamera.modelView_single": "Unique", + "screen.widget.xtracr_realcamera.modelView_import": "Importer", "screen.widget.xtracr_realcamera.modelView_multiple": "Multiple", - "screen.widget.xtracr_realcamera.modelView_range": "Plage", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Basculer du curseur au champ", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Basculer du champ au curseur", "screen.widget.xtracr_realcamera.modelView_offsetX": "Décalage X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Décalage Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Décalage Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Partie", + "screen.widget.xtracr_realcamera.modelView_paste": "Coller", "screen.widget.xtracr_realcamera.modelView_pitch": "Tangage = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Lacet = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Roulis = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Désactiver", + "screen.widget.xtracr_realcamera.modelView_position": "Plan Cible", "screen.widget.xtracr_realcamera.modelView_preview": "Aperçu", - "screen.widget.xtracr_realcamera.modelView_configs": "Configurations", - "screen.widget.xtracr_realcamera.modelView_copy": "Copier", - "screen.widget.xtracr_realcamera.modelView_paste": "Coller", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Config Actuelle", - "screen.tooltip.xtracr_realcamera.modelView_import": "Importer la configuration depuis le presse-papiers", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importation %s réussie !", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Échec de l'importation : \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Exporter la configuration actuelle vers le presse-papiers", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Exportation réussie !", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Échec de l'exportation : \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clic gauche pour obtenir les coordonnées UV au niveau du pointeur de la souris\nLes trois ensembles de coordonnées UV ci-dessous sont, de haut en bas, les coordonnées UV du vecteur avant, du vecteur haut et du point de liaison sur le plan cible\nNote : %s+Défilement pour basculer entre les différentes couches du modèle. La saisie manuelle des coordonnées UV permet de se lier plus précisément à la position cible", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "L'identifiant de texture du modèle sélectionné (pas nécessairement l'identifiant complet), peut être raccourci lors de l'enregistrement pour faciliter la reconnaissance.\nPar exemple, raccourcissez minecraft:textures/entity/player/slim/alex.png en minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Les parties contenues dans les cadres bleus seront désactivées\nClic gauche pour sélectionner, autres touches pour annuler la sélection\n%s+Clic gauche pour sélectionner rapidement la partie pointée par le curseur de la souris", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Détermine le mode de sélection rapide %s+Clic gauche\n(%s+Défilement pour changer la plage de sélection en mode plage)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Numéro du rectangle focalisé\n(0 signifie aucune sélection)\nAppuyez sur Espace ou Entrée pour localiser le rectangle focalisé actuel (Lors de la frappe, appuyez deux fois pour localiser)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Supprimer le rectangle sélectionné\n(Ou utiliser la touche Suppr)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Lorsqu'il est désactivé, la relation relative de la caméra avec le modèle ne changera pas, mais les attributs correspondants de la caméra ne seront pas modifiés par ce mod", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Échelle, qui contrôle la taille des décalages", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Les plans où toutes les distances vertex-à-écran sont inférieures à cette valeur ne seront pas rendus", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorité lors de la liaison, plus la valeur est grande, plus la priorité est élevée et plus le tri est haut sur le côté droit", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nom de la configuration", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Paramètres de désactivation\nLes paramètres de désactivation globaux se trouvent dans l'écran de configuration", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurations enregistrées", - "screen.tooltip.xtracr_realcamera.modelView_preview": "En mode aperçu, vous pouvez ajuster le décalage et la rotation de la caméra", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Ouvrir l'écran de configuration globale\n(API Cloth Config requise)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copier tous les paramètres de désactivation", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Coller tous les paramètres de désactivation du presse-papiers dans la configuration actuelle\n(Ne remplacera pas les paramètres existants portant le même nom)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Le nom ne peut pas être vide !", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "L'identifiant de texture ne peut pas être vide !", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Enregistrer sous\n(Lorsqu'il existe une configuration avec le même nom, vous pouvez également utiliser le bouton enregistrer à gauche)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nom du paramètre de désactivation" + "screen.widget.xtracr_realcamera.modelView_range": "Plage", + "screen.widget.xtracr_realcamera.modelView_roll": "Roulis = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Enregistrer", + "screen.widget.xtracr_realcamera.modelView_selecting": "Sélection", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Mode de Sélection", + "screen.widget.xtracr_realcamera.modelView_single": "Unique", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Basculer du champ au curseur", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Basculer du curseur au champ", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vecteur Haut", + "screen.widget.xtracr_realcamera.modelView_yaw": "Lacet = %s", + "screen.xtracr_realcamera.modelView_title": "Vue Modèle" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/ja_jp.json b/common/src/main/resources/assets/realcamera/lang/ja_jp.json index 83d42b51..7b167d1d 100644 --- a/common/src/main/resources/assets/realcamera/lang/ja_jp.json +++ b/common/src/main/resources/assets/realcamera/lang/ja_jp.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "モデルビュー画面を開く", - "key.xtracr_realcamera.togglePerspective": "オン/オフ", - "key.xtracr_realcamera.activeConfigIndexPREV": "前の設定に切り替え", - "key.xtracr_realcamera.activeConfigIndexNEXT": "次の設定に切り替え", - "key.xtracr_realcamera.activeConfigIndexRESET": "設定インデックスをリセット", - "key.xtracr_realcamera.toggleAdjustMode": "調整モードを切り替え", - "key.xtracr_realcamera.toggleCameraMode": "カメラモードを切り替え", - "key.xtracr_realcamera.adjustUP": "上に調整", - "key.xtracr_realcamera.adjustDOWN": "下に調整", - "key.xtracr_realcamera.adjustFRONT": "前に調整", - "key.xtracr_realcamera.adjustBACK": "後ろに調整", - "key.xtracr_realcamera.adjustLEFT": "左に調整", - "key.xtracr_realcamera.adjustRIGHT": "右に調整", - "modmenu.descriptionTranslation.realcamera": "一人称視点のカメラをよりリアルにします。", - - "config.category.xtracr_realcamera.general": "一般", "config.category.xtracr_realcamera.binding": "バインディングモード", - "config.category.xtracr_realcamera.classic": "クラシックモード", "config.category.xtracr_realcamera.cameraOffset": "カメラオフセット", - "config.category.xtracr_realcamera.centerOffset": "回転中心オフセット", "config.category.xtracr_realcamera.cameraRotation": "カメラ回転", - "config.tooltip.xtracr_realcamera.classicOffset": "カメラの回転中心に対するオフセット値", - "config.tooltip.xtracr_realcamera.classicOffset_n": "注: プレイヤーの前方、上方、左方がそれぞれX、Y、Z軸", - "config.tooltip.xtracr_realcamera.centerOffset": "回転中心の頭部に対するオフセット値", - "config.tooltip.xtracr_realcamera.cameraRotation": "追加のカメラ回転角度", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "注: ピッチ、ヨー、ロールはそれぞれ左方、上方、前方を軸とした回転", - - "config.option.xtracr_realcamera.enabled": "機能を有効にする", - "config.option.xtracr_realcamera.isClassic": "クラシックモード", - "config.option.xtracr_realcamera.dynamicCrosshair": "動的クロスヘア", - "config.option.xtracr_realcamera.renderModel": "プレイヤーモデルをレンダリング", + "config.category.xtracr_realcamera.centerOffset": "回転中心オフセット", + "config.category.xtracr_realcamera.classic": "クラシックモード", + "config.category.xtracr_realcamera.general": "一般", + "config.option.xtracr_realcamera.activeConfigIndex": "現在の設定インデックス", + "config.option.xtracr_realcamera.adjustOffset": "カメラオフセットを調整", "config.option.xtracr_realcamera.adjustStep": "調整ステップ", - "config.option.xtracr_realcamera.classicAdjustMode": "調整モード", - "config.option.xtracr_realcamera.scale": "スケール", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "バインディング結果保持フレーム数", "config.option.xtracr_realcamera.cameraOffset": "カメラ%sオフセット", "config.option.xtracr_realcamera.centerOffset": "回転中心%sオフセット", - "config.option.xtracr_realcamera.pitch": "ピッチ角", - "config.option.xtracr_realcamera.yaw": "ヨー角", - "config.option.xtracr_realcamera.roll": "ロール角", - "config.option.xtracr_realcamera.toModelViewScreen": "詳細設定は%s画面で行ってください(開くにはホットキーを設定する必要があります)", - "config.option.xtracr_realcamera.screenModifierKey": "%s画面修飾キー", - "config.option.xtracr_realcamera.legacyBindingMode": "旧バインディングモード", - "config.option.xtracr_realcamera.adjustOffset": "カメラオフセットを調整", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "バインディング失敗メッセージを非表示", - "config.option.xtracr_realcamera.renderStuckObjects": "体に刺さったオブジェクトをレンダリング", - "config.option.xtracr_realcamera.rerenderModel": "モデルを再レンダリング", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "バインディング結果保持フレーム数", - "config.option.xtracr_realcamera.displacementSmoothFactor": "変位平滑化係数", - "config.option.xtracr_realcamera.rotationSmoothFactor": "回転平滑化係数", - "config.option.xtracr_realcamera.activeConfigIndex": "現在の設定インデックス", + "config.option.xtracr_realcamera.classicAdjustMode": "調整モード", "config.option.xtracr_realcamera.disableConfig": "無効設定", - "config.option.xtracr_realcamera.disableWhenSneaking": "スニーク時にメイン機能を無効化", + "config.option.xtracr_realcamera.disableMainFeatureItems": "...を持っている時にメイン機能を無効化", + "config.option.xtracr_realcamera.disableRenderItems": "...を持っている時にレンダリングを無効化", "config.option.xtracr_realcamera.disableWhenCrawling": "這行時にメイン機能を無効化", + "config.option.xtracr_realcamera.disableWhenSneaking": "スニーク時にメイン機能を無効化", "config.option.xtracr_realcamera.disableWhenSwimming": "泳いでいる時にメイン機能を無効化", + "config.option.xtracr_realcamera.displacementSmoothFactor": "変位平滑化係数", + "config.option.xtracr_realcamera.dynamicCrosshair": "動的クロスヘア", + "config.option.xtracr_realcamera.enabled": "機能を有効にする", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "バインディング失敗メッセージを非表示", + "config.option.xtracr_realcamera.isClassic": "クラシックモード", + "config.option.xtracr_realcamera.legacyBindingMode": "旧バインディングモード", "config.option.xtracr_realcamera.outTick": "無効状態退出遅延(単位:TICK)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "...を持っている時にメイン機能を無効化", - "config.option.xtracr_realcamera.disableRenderItems": "...を持っている時にレンダリングを無効化", - "config.tooltip.xtracr_realcamera.isClassic": "クラシックモードではカメラの位置と回転に簡単な変更のみを行います", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "有効時、クロスヘアはプレイヤーの視線に合わせて移動し、命中結果に影響を与えません\nJade、WTHITなどの類似MODがインストールされている場合に推奨", - "config.tooltip.xtracr_realcamera.renderModel": "一人称視点でプレイヤーモデルをレンダリング", + "config.option.xtracr_realcamera.pitch": "ピッチ角", + "config.option.xtracr_realcamera.renderModel": "プレイヤーモデルをレンダリング", + "config.option.xtracr_realcamera.renderStuckObjects": "体に刺さったオブジェクトをレンダリング", + "config.option.xtracr_realcamera.rerenderModel": "モデルを再レンダリング", + "config.option.xtracr_realcamera.roll": "ロール角", + "config.option.xtracr_realcamera.rotationSmoothFactor": "回転平滑化係数", + "config.option.xtracr_realcamera.scale": "スケール", + "config.option.xtracr_realcamera.screenModifierKey": "%s画面修飾キー", + "config.option.xtracr_realcamera.toModelViewScreen": "詳細設定は%s画面で行ってください(開くにはホットキーを設定する必要があります)", + "config.option.xtracr_realcamera.yaw": "ヨー角", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "現在バインドされている設定のインデックス、0は有効な設定をバインド可能", + "config.tooltip.xtracr_realcamera.adjustOffset": "現在の調整キーでカメラのオフセットまたは回転を調整", "config.tooltip.xtracr_realcamera.adjustStep": "各調整ステップの角度の1/100または長さ", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "バインディング失敗後の数フレーム間、前回成功したバインディング結果を継続使用", + "config.tooltip.xtracr_realcamera.cameraRotation": "追加のカメラ回転角度", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "注: ピッチ、ヨー、ロールはそれぞれ左方、上方、前方を軸とした回転", + "config.tooltip.xtracr_realcamera.centerOffset": "回転中心の頭部に対するオフセット値", "config.tooltip.xtracr_realcamera.classicAdjustMode": "現在の調整キーで何を調整するかを決定", - "config.tooltip.xtracr_realcamera.scale": "オフセット量のサイズを制御", + "config.tooltip.xtracr_realcamera.classicOffset": "カメラの回転中心に対するオフセット値", + "config.tooltip.xtracr_realcamera.classicOffset_n": "注: プレイヤーの前方、上方、左方がそれぞれX、Y、Z軸", + "config.tooltip.xtracr_realcamera.disableRenderItems": "3つのマッチング方法をサポート:\n1. ワイルドカード`*`マッチング(例: `minecraft:*sword`)\n2. タグマッチング(`#`で始まる、例: `#minecraft:swords`)\n3. 直接アイテムID(例: `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "カメラ変位平滑化係数、値が大きいほどスムーズ", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "有効時、クロスヘアはプレイヤーの視線に合わせて移動し、命中結果に影響を与えません\nJade、WTHITなどの類似MODがインストールされている場合に推奨", + "config.tooltip.xtracr_realcamera.isClassic": "クラシックモードではカメラの位置と回転に簡単な変更のみを行います", "config.tooltip.xtracr_realcamera.legacyBindingMode": "旧バージョン(v0.5)のバインディングモードを使用します。バニラモデルとバニラモデルベースのアクションのみサポート\n有効にすると、%sインターフェースの'LEGACY_MODE'でプロパティを設定できます", - "config.tooltip.xtracr_realcamera.adjustOffset": "現在の調整キーでカメラのオフセットまたは回転を調整", + "config.tooltip.xtracr_realcamera.outTick": "プレイヤーが特定の状態を停止した後、主機能を再開するまでの時間(1 tick = 0.05秒)", + "config.tooltip.xtracr_realcamera.renderModel": "一人称視点でプレイヤーモデルをレンダリング", "config.tooltip.xtracr_realcamera.renderStuckObjects": "矢、蜂の針などプレイヤーの体に刺さるオブジェクト", "config.tooltip.xtracr_realcamera.rerenderModel": "元のレンダリングタイミングでモデルを再レンダリングし、早期レンダリングによる視覚的問題を回避", - "config.tooltip.xtracr_realcamera.outTick": "プレイヤーが特定の状態を停止した後、主機能を再開するまでの時間(1 tick = 0.05秒)", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "バインディング失敗後の数フレーム間、前回成功したバインディング結果を継続使用", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "カメラ変位平滑化係数、値が大きいほどスムーズ", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "カメラ回転平滑化係数、値が大きいほどスムーズ", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "現在バインドされている設定のインデックス、0は有効な設定をバインド可能", - "config.tooltip.xtracr_realcamera.disableRenderItems": "3つのマッチング方法をサポート:\n1. ワイルドカード`*`マッチング(例: `minecraft:*sword`)\n2. タグマッチング(`#`で始まる、例: `#minecraft:swords`)\n3. 直接アイテムID(例: `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "オフセット量のサイズを制御", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "次の設定に切り替え", + "key.xtracr_realcamera.activeConfigIndexPREV": "前の設定に切り替え", + "key.xtracr_realcamera.activeConfigIndexRESET": "設定インデックスをリセット", + "key.xtracr_realcamera.adjustBACK": "後ろに調整", + "key.xtracr_realcamera.adjustDOWN": "下に調整", + "key.xtracr_realcamera.adjustFRONT": "前に調整", + "key.xtracr_realcamera.adjustLEFT": "左に調整", + "key.xtracr_realcamera.adjustRIGHT": "右に調整", + "key.xtracr_realcamera.adjustUP": "上に調整", + "key.xtracr_realcamera.modelViewScreen": "モデルビュー画面を開く", + "key.xtracr_realcamera.toggleAdjustMode": "調整モードを切り替え", + "key.xtracr_realcamera.toggleCameraMode": "カメラモードを切り替え", + "key.xtracr_realcamera.togglePerspective": "オン/オフ", "message.xtracr_realcamera.bindingFailed": "[%s]: バインディングに失敗しました。%s画面で手動設定してください(キー: %s)", - - "screen.xtracr_realcamera.modelView_title": "モデルビュー", - "screen.widget.xtracr_realcamera.modelView_import": "インポート", + "modmenu.descriptionTranslation.realcamera": "一人称視点のカメラをよりリアルにします。", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "無効時、カメラとモデルの相対的な位置関係は変化しませんが、カメラの対応する属性はこのMODによって変更されません", + "screen.tooltip.xtracr_realcamera.modelView_configs": "保存済み設定", + "screen.tooltip.xtracr_realcamera.modelView_copy": "全ての無効設定をコピー", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "選択された矩形を削除\n(またはDeleteキーを使用)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "全ての頂点から画面までの距離がこの値より小さい面はレンダリングされません", + "screen.tooltip.xtracr_realcamera.modelView_disable": "無効設定\nグローバル無効設定は設定画面にあります", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "青い枠で囲まれた部分は無効になります\n左側のマテリアルビューでマウスの左ボタンで選択、他のボタンで選択解除\n%s+左クリックでマウスポインタが指す部分を素早く選択できます", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "無効設定の名前", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名前は空にできません!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "テクスチャIDは空にできません!", + "screen.tooltip.xtracr_realcamera.modelView_export": "現在の設定をクリップボードにエクスポート", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "エクスポートに失敗しました: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "エクスポートに成功しました!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "選択された矩形の番号\n(0は未選択)\nスペースまたはエンターで現在選択されている矩形を位置特定(入力中は2回押すと位置特定)", + "screen.tooltip.xtracr_realcamera.modelView_import": "クリップボードから設定をインポート", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "インポートに失敗しました: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%sのインポートに成功しました!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "クリップボードの全ての無効設定を現在の設定に貼り付け\n(同名設定は上書きされません)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "プレビューモードでカメラの様々なオフセットを調整できます", + "screen.tooltip.xtracr_realcamera.modelView_priority": "バインディング時の優先度、値が大きいほど優先度が高く右側のソートで上位に表示", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "名前を付けて保存\n(同名設定がある場合も左の保存ボタンを使用できます)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "スケール、オフセットのサイズを制御", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左クリックでマウスポインタ位置のUV座標を取得\n下の3組のUV座標は上から順に前方ベクトル、上方ベクトル、ターゲット平面上のバインディング点のUV座標\n注: %s+スクロールでモデルの異なるレイヤー間を切り替えられます。手動でUV座標を入力するとターゲット位置に正確にバインドできます", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+左クリッククイック選択のモードを決定\n(%s+スクロールで範囲モードの選択範囲を変更)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "設定名", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "選択されたモデルのテクスチャID(完全なIDでなくても認識可能)、保存時に一部を短縮してプログラム認識を容易にできます\n例: minecraft:textures/entity/player/slim/alex.pngをminecraft:textures/entity/player/に短縮", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "グローバル設定画面を開く\n(Cloth Config APIが必要)", + "screen.widget.xtracr_realcamera.modelView_all": "全て", + "screen.widget.xtracr_realcamera.modelView_configs": "設定", + "screen.widget.xtracr_realcamera.modelView_copy": "コピー", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "現在の設定", + "screen.widget.xtracr_realcamera.modelView_disable": "無効", + "screen.widget.xtracr_realcamera.modelView_disableMode": "無効モード", "screen.widget.xtracr_realcamera.modelView_export": "エクスポート", - "screen.widget.xtracr_realcamera.modelView_selecting": "選択", "screen.widget.xtracr_realcamera.modelView_forwardVector": "前方ベクトル", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "上方ベクトル", - "screen.widget.xtracr_realcamera.modelView_position": "ターゲット平面", - "screen.widget.xtracr_realcamera.modelView_save": "保存", - "screen.widget.xtracr_realcamera.modelView_disableMode": "無効モード", - "screen.widget.xtracr_realcamera.modelView_all": "全て", - "screen.widget.xtracr_realcamera.modelView_part": "一部", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "選択モード", - "screen.widget.xtracr_realcamera.modelView_single": "単一選択", + "screen.widget.xtracr_realcamera.modelView_import": "インポート", "screen.widget.xtracr_realcamera.modelView_multiple": "複数選択", - "screen.widget.xtracr_realcamera.modelView_range": "範囲", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "スライダーから入力欄へ切り替え", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "入力欄からスライダーへ切り替え", "screen.widget.xtracr_realcamera.modelView_offsetX": "Xオフセット = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Yオフセット = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Zオフセット = %s", + "screen.widget.xtracr_realcamera.modelView_part": "一部", + "screen.widget.xtracr_realcamera.modelView_paste": "貼り付け", "screen.widget.xtracr_realcamera.modelView_pitch": "ピッチ = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "ヨー = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "ロール = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "無効", + "screen.widget.xtracr_realcamera.modelView_position": "ターゲット平面", "screen.widget.xtracr_realcamera.modelView_preview": "プレビュー", - "screen.widget.xtracr_realcamera.modelView_configs": "設定", - "screen.widget.xtracr_realcamera.modelView_copy": "コピー", - "screen.widget.xtracr_realcamera.modelView_paste": "貼り付け", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "現在の設定", - "screen.tooltip.xtracr_realcamera.modelView_import": "クリップボードから設定をインポート", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%sのインポートに成功しました!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "インポートに失敗しました: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "現在の設定をクリップボードにエクスポート", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "エクスポートに成功しました!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "エクスポートに失敗しました: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左クリックでマウスポインタ位置のUV座標を取得\n下の3組のUV座標は上から順に前方ベクトル、上方ベクトル、ターゲット平面上のバインディング点のUV座標\n注: %s+スクロールでモデルの異なるレイヤー間を切り替えられます。手動でUV座標を入力するとターゲット位置に正確にバインドできます", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "選択されたモデルのテクスチャID(完全なIDでなくても認識可能)、保存時に一部を短縮してプログラム認識を容易にできます\n例: minecraft:textures/entity/player/slim/alex.pngをminecraft:textures/entity/player/に短縮", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "青い枠で囲まれた部分は無効になります\n左側のマテリアルビューでマウスの左ボタンで選択、他のボタンで選択解除\n%s+左クリックでマウスポインタが指す部分を素早く選択できます", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+左クリッククイック選択のモードを決定\n(%s+スクロールで範囲モードの選択範囲を変更)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "選択された矩形の番号\n(0は未選択)\nスペースまたはエンターで現在選択されている矩形を位置特定(入力中は2回押すと位置特定)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "選択された矩形を削除\n(またはDeleteキーを使用)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "無効時、カメラとモデルの相対的な位置関係は変化しませんが、カメラの対応する属性はこのMODによって変更されません", - "screen.tooltip.xtracr_realcamera.modelView_scale": "スケール、オフセットのサイズを制御", - "screen.tooltip.xtracr_realcamera.modelView_depth": "全ての頂点から画面までの距離がこの値より小さい面はレンダリングされません", - "screen.tooltip.xtracr_realcamera.modelView_priority": "バインディング時の優先度、値が大きいほど優先度が高く右側のソートで上位に表示", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "設定名", - "screen.tooltip.xtracr_realcamera.modelView_disable": "無効設定\nグローバル無効設定は設定画面にあります", - "screen.tooltip.xtracr_realcamera.modelView_configs": "保存済み設定", - "screen.tooltip.xtracr_realcamera.modelView_preview": "プレビューモードでカメラの様々なオフセットを調整できます", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "グローバル設定画面を開く\n(Cloth Config APIが必要)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "全ての無効設定をコピー", - "screen.tooltip.xtracr_realcamera.modelView_paste": "クリップボードの全ての無効設定を現在の設定に貼り付け\n(同名設定は上書きされません)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名前は空にできません!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "テクスチャIDは空にできません!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "名前を付けて保存\n(同名設定がある場合も左の保存ボタンを使用できます)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "無効設定の名前" + "screen.widget.xtracr_realcamera.modelView_range": "範囲", + "screen.widget.xtracr_realcamera.modelView_roll": "ロール = %s", + "screen.widget.xtracr_realcamera.modelView_save": "保存", + "screen.widget.xtracr_realcamera.modelView_selecting": "選択", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "選択モード", + "screen.widget.xtracr_realcamera.modelView_single": "単一選択", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "入力欄からスライダーへ切り替え", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "スライダーから入力欄へ切り替え", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "上方ベクトル", + "screen.widget.xtracr_realcamera.modelView_yaw": "ヨー = %s", + "screen.xtracr_realcamera.modelView_title": "モデルビュー" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/ko_kr.json b/common/src/main/resources/assets/realcamera/lang/ko_kr.json index a7b1587e..5936f653 100644 --- a/common/src/main/resources/assets/realcamera/lang/ko_kr.json +++ b/common/src/main/resources/assets/realcamera/lang/ko_kr.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "모델 뷰 화면 열기", - "key.xtracr_realcamera.togglePerspective": "활성화/비활성화", - "key.xtracr_realcamera.activeConfigIndexPREV": "이전 설정으로 전환", - "key.xtracr_realcamera.activeConfigIndexNEXT": "다음 설정으로 전환", - "key.xtracr_realcamera.activeConfigIndexRESET": "설정 인덱스 초기화", - "key.xtracr_realcamera.toggleAdjustMode": "조정 모드 전환", - "key.xtracr_realcamera.toggleCameraMode": "카메라 모드 전환", - "key.xtracr_realcamera.adjustUP": "위로 조정", - "key.xtracr_realcamera.adjustDOWN": "아래로 조정", - "key.xtracr_realcamera.adjustFRONT": "앞으로 조정", - "key.xtracr_realcamera.adjustBACK": "뒤로 조정", - "key.xtracr_realcamera.adjustLEFT": "왼쪽으로 조정", - "key.xtracr_realcamera.adjustRIGHT": "오른쪽으로 조정", - "modmenu.descriptionTranslation.realcamera": "1인칭 시점에서 카메라를 더 현실적으로 만듭니다", - - "config.category.xtracr_realcamera.general": "일반", "config.category.xtracr_realcamera.binding": "바인딩 모드", - "config.category.xtracr_realcamera.classic": "클래식 모드", "config.category.xtracr_realcamera.cameraOffset": "카메라 오프셋", - "config.category.xtracr_realcamera.centerOffset": "회전 중심 오프셋", "config.category.xtracr_realcamera.cameraRotation": "카메라 회전", - "config.tooltip.xtracr_realcamera.classicOffset": "회전 중심으로부터의 카메라 오프셋", - "config.tooltip.xtracr_realcamera.classicOffset_n": "참고: 플레이어의 전방, 상단, 좌측이 각각 X, Y, Z 축입니다", - "config.tooltip.xtracr_realcamera.centerOffset": "머리로부터의 회전 중심 오프셋", - "config.tooltip.xtracr_realcamera.cameraRotation": "추가 카메라 회전 각도", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "참고: 피치, 요, 롤은 각각 좌측, 상단, 전방 축을 기준으로 한 회전입니다", - - "config.option.xtracr_realcamera.enabled": "모드 활성화", - "config.option.xtracr_realcamera.isClassic": "클래식 모드", - "config.option.xtracr_realcamera.dynamicCrosshair": "동적 크로스헤어", - "config.option.xtracr_realcamera.renderModel": "플레이어 모델 렌더링", + "config.category.xtracr_realcamera.centerOffset": "회전 중심 오프셋", + "config.category.xtracr_realcamera.classic": "클래식 모드", + "config.category.xtracr_realcamera.general": "일반", + "config.option.xtracr_realcamera.activeConfigIndex": "현재 설정 인덱스", + "config.option.xtracr_realcamera.adjustOffset": "카메라 오프셋 조정", "config.option.xtracr_realcamera.adjustStep": "조정 단계", - "config.option.xtracr_realcamera.classicAdjustMode": "조정 모드", - "config.option.xtracr_realcamera.scale": "크기 조절", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "바인딩 결과 유지 프레임", "config.option.xtracr_realcamera.cameraOffset": "카메라 %s 오프셋", "config.option.xtracr_realcamera.centerOffset": "회전 중심 %s 오프셋", - "config.option.xtracr_realcamera.pitch": "피치", - "config.option.xtracr_realcamera.yaw": "요", - "config.option.xtracr_realcamera.roll": "롤", - "config.option.xtracr_realcamera.toModelViewScreen": "자세한 설정은 %s 화면에서 확인하세요 (열기 위한 키 설정 필요)", - "config.option.xtracr_realcamera.screenModifierKey": "%s 화면 수정 키", - "config.option.xtracr_realcamera.legacyBindingMode": "레거시 바인딩 모드", - "config.option.xtracr_realcamera.adjustOffset": "카메라 오프셋 조정", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "바인딩 실패 메시지 숨기기", - "config.option.xtracr_realcamera.renderStuckObjects": "박힌 물체 렌더링", - "config.option.xtracr_realcamera.rerenderModel": "모델 재렌더링", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "바인딩 결과 유지 프레임", - "config.option.xtracr_realcamera.displacementSmoothFactor": "변위 평활화 계수", - "config.option.xtracr_realcamera.rotationSmoothFactor": "회전 평활화 계수", - "config.option.xtracr_realcamera.activeConfigIndex": "현재 설정 인덱스", + "config.option.xtracr_realcamera.classicAdjustMode": "조정 모드", "config.option.xtracr_realcamera.disableConfig": "비활성화 설정", - "config.option.xtracr_realcamera.disableWhenSneaking": "숨어 있을 때 주요 기능 비활성화", + "config.option.xtracr_realcamera.disableMainFeatureItems": "...을(를) 들고 있을 때 주요 기능 비활성화", + "config.option.xtracr_realcamera.disableRenderItems": "...을(를) 들고 있을 때 렌더링 비활성화", "config.option.xtracr_realcamera.disableWhenCrawling": "기어다닐 때 주요 기능 비활성화", + "config.option.xtracr_realcamera.disableWhenSneaking": "숨어 있을 때 주요 기능 비활성화", "config.option.xtracr_realcamera.disableWhenSwimming": "수영할 때 주요 기능 비활성화", + "config.option.xtracr_realcamera.displacementSmoothFactor": "변위 평활화 계수", + "config.option.xtracr_realcamera.dynamicCrosshair": "동적 크로스헤어", + "config.option.xtracr_realcamera.enabled": "모드 활성화", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "바인딩 실패 메시지 숨기기", + "config.option.xtracr_realcamera.isClassic": "클래식 모드", + "config.option.xtracr_realcamera.legacyBindingMode": "레거시 바인딩 모드", "config.option.xtracr_realcamera.outTick": "비활성화 상태 종료 지연 (틱 단위)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "...을(를) 들고 있을 때 주요 기능 비활성화", - "config.option.xtracr_realcamera.disableRenderItems": "...을(를) 들고 있을 때 렌더링 비활성화", - "config.tooltip.xtracr_realcamera.isClassic": "클래식 모드는 카메라의 위치와 회전에 간단한 변경만 적용합니다", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "활성화 시 크로스헤어가 플레이어의 시선을 따라가며 일관된 명중 결과를 보장합니다\nJade, WTHIT 또는 유사 모드 설치 시 활성화 권장", - "config.tooltip.xtracr_realcamera.renderModel": "1인칭 시점에서 플레이어 모델 렌더링", + "config.option.xtracr_realcamera.pitch": "피치", + "config.option.xtracr_realcamera.renderModel": "플레이어 모델 렌더링", + "config.option.xtracr_realcamera.renderStuckObjects": "박힌 물체 렌더링", + "config.option.xtracr_realcamera.rerenderModel": "모델 재렌더링", + "config.option.xtracr_realcamera.roll": "롤", + "config.option.xtracr_realcamera.rotationSmoothFactor": "회전 평활화 계수", + "config.option.xtracr_realcamera.scale": "크기 조절", + "config.option.xtracr_realcamera.screenModifierKey": "%s 화면 수정 키", + "config.option.xtracr_realcamera.toModelViewScreen": "자세한 설정은 %s 화면에서 확인하세요 (열기 위한 키 설정 필요)", + "config.option.xtracr_realcamera.yaw": "요", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "현재 바인딩된 설정의 인덱스, 0은 유효한 설정을 바인딩할 수 있음을 의미", + "config.tooltip.xtracr_realcamera.adjustOffset": "조정 키 누를 때 카메라 오프셋 또는 회전 조정", "config.tooltip.xtracr_realcamera.adjustStep": "단계별 조정 길이 또는 각도의 1/100", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "바인딩 실패 후 몇 프레임 동안 이전 성공한 바인딩 결과 사용 유지", + "config.tooltip.xtracr_realcamera.cameraRotation": "추가 카메라 회전 각도", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "참고: 피치, 요, 롤은 각각 좌측, 상단, 전방 축을 기준으로 한 회전입니다", + "config.tooltip.xtracr_realcamera.centerOffset": "머리로부터의 회전 중심 오프셋", "config.tooltip.xtracr_realcamera.classicAdjustMode": "조정 키 누를 때 조정할 대상을 결정합니다", - "config.tooltip.xtracr_realcamera.scale": "오프셋 크기를 제어합니다", + "config.tooltip.xtracr_realcamera.classicOffset": "회전 중심으로부터의 카메라 오프셋", + "config.tooltip.xtracr_realcamera.classicOffset_n": "참고: 플레이어의 전방, 상단, 좌측이 각각 X, Y, Z 축입니다", + "config.tooltip.xtracr_realcamera.disableRenderItems": "세 가지 매칭 방식 지원:\n1. 와일드카드 `*` 매칭 (예: `minecraft:*sword`)\n2. 태그 매칭 (`#`으로 시작, 예: `#minecraft:swords`)\n3. 직접 아이템 ID (예: `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "카메라 변위 평활화 계수, 값이 클수록 이동이 부드러워집니다", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "활성화 시 크로스헤어가 플레이어의 시선을 따라가며 일관된 명중 결과를 보장합니다\nJade, WTHIT 또는 유사 모드 설치 시 활성화 권장", + "config.tooltip.xtracr_realcamera.isClassic": "클래식 모드는 카메라의 위치와 회전에 간단한 변경만 적용합니다", "config.tooltip.xtracr_realcamera.legacyBindingMode": "이전 버전(v0.5)의 바인딩 모드 사용, 기본 모델 및 기본 모델 기반 작업만 지원합니다\n활성화 시 %s 화면의 'LEGACY_MODE'에서 속성 설정 가능", - "config.tooltip.xtracr_realcamera.adjustOffset": "조정 키 누를 때 카메라 오프셋 또는 회전 조정", + "config.tooltip.xtracr_realcamera.outTick": "비활성화 상태 종료 후 주요 기능 재활성화까지의 시간 (1 틱 = 0.05초)", + "config.tooltip.xtracr_realcamera.renderModel": "1인칭 시점에서 플레이어 모델 렌더링", "config.tooltip.xtracr_realcamera.renderStuckObjects": "화살, 벌 침 등 플레이어 몸에 박힐 수 있는 물체들", "config.tooltip.xtracr_realcamera.rerenderModel": "원본 렌더링 시간에 모델을 다시 렌더링하여 조기 렌더링으로 인한 시각적 문제 방지", - "config.tooltip.xtracr_realcamera.outTick": "비활성화 상태 종료 후 주요 기능 재활성화까지의 시간 (1 틱 = 0.05초)", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "바인딩 실패 후 몇 프레임 동안 이전 성공한 바인딩 결과 사용 유지", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "카메라 변위 평활화 계수, 값이 클수록 이동이 부드러워집니다", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "카메라 회전 평활화 계수, 값이 클수록 이동이 부드러워집니다", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "현재 바인딩된 설정의 인덱스, 0은 유효한 설정을 바인딩할 수 있음을 의미", - "config.tooltip.xtracr_realcamera.disableRenderItems": "세 가지 매칭 방식 지원:\n1. 와일드카드 `*` 매칭 (예: `minecraft:*sword`)\n2. 태그 매칭 (`#`으로 시작, 예: `#minecraft:swords`)\n3. 직접 아이템 ID (예: `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "오프셋 크기를 제어합니다", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "다음 설정으로 전환", + "key.xtracr_realcamera.activeConfigIndexPREV": "이전 설정으로 전환", + "key.xtracr_realcamera.activeConfigIndexRESET": "설정 인덱스 초기화", + "key.xtracr_realcamera.adjustBACK": "뒤로 조정", + "key.xtracr_realcamera.adjustDOWN": "아래로 조정", + "key.xtracr_realcamera.adjustFRONT": "앞으로 조정", + "key.xtracr_realcamera.adjustLEFT": "왼쪽으로 조정", + "key.xtracr_realcamera.adjustRIGHT": "오른쪽으로 조정", + "key.xtracr_realcamera.adjustUP": "위로 조정", + "key.xtracr_realcamera.modelViewScreen": "모델 뷰 화면 열기", + "key.xtracr_realcamera.toggleAdjustMode": "조정 모드 전환", + "key.xtracr_realcamera.toggleCameraMode": "카메라 모드 전환", + "key.xtracr_realcamera.togglePerspective": "활성화/비활성화", "message.xtracr_realcamera.bindingFailed": "[%s]: 바인딩 실패, %s 화면에서 수동으로 설정하세요 (키: %s)", - - "screen.xtracr_realcamera.modelView_title": "모델 뷰", - "screen.widget.xtracr_realcamera.modelView_import": "가져오기", + "modmenu.descriptionTranslation.realcamera": "1인칭 시점에서 카메라를 더 현실적으로 만듭니다", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "비활성화 시 카메라와 모델의 상대적 관계는 변하지 않지만, 카메라의 해당 속성은 이 모드에서 수정되지 않습니다", + "screen.tooltip.xtracr_realcamera.modelView_configs": "저장된 설정", + "screen.tooltip.xtracr_realcamera.modelView_copy": "모든 비활성화 설정 복사", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "선택된 사각형 삭제\n(또는 Delete 키 사용)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "모든 정점-화면 거리가 이 값보다 작은 면은 렌더링되지 않습니다", + "screen.tooltip.xtracr_realcamera.modelView_disable": "비활성화 설정\n전역 비활성화 설정은 설정 화면에 있습니다", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "파란색 상자 안의 부분이 비활성화됩니다\n왼쪽 텍스처 뷰에서 왼쪽 클릭으로 선택, 다른 키로 선택 취소\n%s+왼쪽 클릭으로 마우스 포인터가 가리키는 부분 빠르게 선택", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "비활성화 설정 이름", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "이름은 비울 수 없습니다!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "텍스처 ID는 비울 수 없습니다!", + "screen.tooltip.xtracr_realcamera.modelView_export": "현재 설정을 클립보드로 내보내기", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "내보내기 실패: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "내보내기 성공!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "선택된 사각형 번호\n(0은 미선택)\n스페이스 또는 엔터로 현재 선택된 사각형 위치 확인 (입력 중일 때 두 번 누르면 위치 확인)", + "screen.tooltip.xtracr_realcamera.modelView_import": "클립보드에서 설정 가져오기", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "가져오기 실패: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s 가져오기 성공!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "클립보드의 모든 비활성화 설정을 현재 설정에 붙여넣기\n(동일 이름 설정 덮어쓰지 않음)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "미리보기 모드에서 카메라의 다양한 오프셋 조정 가능", + "screen.tooltip.xtracr_realcamera.modelView_priority": "바인딩 시 우선순위, 값이 클수록 우선순위가 높으며 오른쪽 정렬에서 위쪽에 표시", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "다른 이름으로 저장\n(동일 이름 설정이 있을 때 왼쪽 저장 버튼도 사용 가능)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "크기 조절, 오프셋 크기 제어", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+왼쪽 클릭으로 마우스 포인터 위치의 UV 좌표 얻기\n아래 세 가지 UV 좌표는 위에서부터 전방 벡터, 상향 벡터, 대상 평면의 바인딩 지점 UV 좌표입니다\n참고: %s+스크롤로 모델의 다른 레이어 간 전환, 수동 UV 좌표 입력으로 대상 위치에 더 정확하게 바인딩 가능", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+왼쪽 클릭 빠른 선택 모드 결정\n(%s+스크롤로 범위 모드에서 선택 범위 변경)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "설정 이름", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "선택된 모델의 텍스처 ID (전체 ID일 필요 없음), 저장 시 일부 생략하여 프로그램 인식 용이하게 함\n예: minecraft:textures/entity/player/slim/alex.png → minecraft:textures/entity/player/", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "전역 설정 화면 열기\n(Cloth Config API 필요)", + "screen.widget.xtracr_realcamera.modelView_all": "전체", + "screen.widget.xtracr_realcamera.modelView_configs": "설정", + "screen.widget.xtracr_realcamera.modelView_copy": "복사", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "현재 설정", + "screen.widget.xtracr_realcamera.modelView_disable": "비활성화", + "screen.widget.xtracr_realcamera.modelView_disableMode": "비활성화 모드", "screen.widget.xtracr_realcamera.modelView_export": "내보내기", - "screen.widget.xtracr_realcamera.modelView_selecting": "선택", "screen.widget.xtracr_realcamera.modelView_forwardVector": "전방 벡터", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "상향 벡터", - "screen.widget.xtracr_realcamera.modelView_position": "대상 평면", - "screen.widget.xtracr_realcamera.modelView_save": "저장", - "screen.widget.xtracr_realcamera.modelView_disableMode": "비활성화 모드", - "screen.widget.xtracr_realcamera.modelView_all": "전체", - "screen.widget.xtracr_realcamera.modelView_part": "부분", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "선택 모드", - "screen.widget.xtracr_realcamera.modelView_single": "단일", + "screen.widget.xtracr_realcamera.modelView_import": "가져오기", "screen.widget.xtracr_realcamera.modelView_multiple": "다중", - "screen.widget.xtracr_realcamera.modelView_range": "범위", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "슬라이더에서 필드로 전환", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "필드에서 슬라이더로 전환", "screen.widget.xtracr_realcamera.modelView_offsetX": "X 오프셋 = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Y 오프셋 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z 오프셋 = %s", + "screen.widget.xtracr_realcamera.modelView_part": "부분", + "screen.widget.xtracr_realcamera.modelView_paste": "붙여넣기", "screen.widget.xtracr_realcamera.modelView_pitch": "피치 = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "요 = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "롤 = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "비활성화", + "screen.widget.xtracr_realcamera.modelView_position": "대상 평면", "screen.widget.xtracr_realcamera.modelView_preview": "미리보기", - "screen.widget.xtracr_realcamera.modelView_configs": "설정", - "screen.widget.xtracr_realcamera.modelView_copy": "복사", - "screen.widget.xtracr_realcamera.modelView_paste": "붙여넣기", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "현재 설정", - "screen.tooltip.xtracr_realcamera.modelView_import": "클립보드에서 설정 가져오기", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s 가져오기 성공!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "가져오기 실패: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "현재 설정을 클립보드로 내보내기", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "내보내기 성공!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "내보내기 실패: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+왼쪽 클릭으로 마우스 포인터 위치의 UV 좌표 얻기\n아래 세 가지 UV 좌표는 위에서부터 전방 벡터, 상향 벡터, 대상 평면의 바인딩 지점 UV 좌표입니다\n참고: %s+스크롤로 모델의 다른 레이어 간 전환, 수동 UV 좌표 입력으로 대상 위치에 더 정확하게 바인딩 가능", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "선택된 모델의 텍스처 ID (전체 ID일 필요 없음), 저장 시 일부 생략하여 프로그램 인식 용이하게 함\n예: minecraft:textures/entity/player/slim/alex.png → minecraft:textures/entity/player/", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "파란색 상자 안의 부분이 비활성화됩니다\n왼쪽 텍스처 뷰에서 왼쪽 클릭으로 선택, 다른 키로 선택 취소\n%s+왼쪽 클릭으로 마우스 포인터가 가리키는 부분 빠르게 선택", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+왼쪽 클릭 빠른 선택 모드 결정\n(%s+스크롤로 범위 모드에서 선택 범위 변경)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "선택된 사각형 번호\n(0은 미선택)\n스페이스 또는 엔터로 현재 선택된 사각형 위치 확인 (입력 중일 때 두 번 누르면 위치 확인)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "선택된 사각형 삭제\n(또는 Delete 키 사용)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "비활성화 시 카메라와 모델의 상대적 관계는 변하지 않지만, 카메라의 해당 속성은 이 모드에서 수정되지 않습니다", - "screen.tooltip.xtracr_realcamera.modelView_scale": "크기 조절, 오프셋 크기 제어", - "screen.tooltip.xtracr_realcamera.modelView_depth": "모든 정점-화면 거리가 이 값보다 작은 면은 렌더링되지 않습니다", - "screen.tooltip.xtracr_realcamera.modelView_priority": "바인딩 시 우선순위, 값이 클수록 우선순위가 높으며 오른쪽 정렬에서 위쪽에 표시", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "설정 이름", - "screen.tooltip.xtracr_realcamera.modelView_disable": "비활성화 설정\n전역 비활성화 설정은 설정 화면에 있습니다", - "screen.tooltip.xtracr_realcamera.modelView_configs": "저장된 설정", - "screen.tooltip.xtracr_realcamera.modelView_preview": "미리보기 모드에서 카메라의 다양한 오프셋 조정 가능", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "전역 설정 화면 열기\n(Cloth Config API 필요)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "모든 비활성화 설정 복사", - "screen.tooltip.xtracr_realcamera.modelView_paste": "클립보드의 모든 비활성화 설정을 현재 설정에 붙여넣기\n(동일 이름 설정 덮어쓰지 않음)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "이름은 비울 수 없습니다!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "텍스처 ID는 비울 수 없습니다!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "다른 이름으로 저장\n(동일 이름 설정이 있을 때 왼쪽 저장 버튼도 사용 가능)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "비활성화 설정 이름" + "screen.widget.xtracr_realcamera.modelView_range": "범위", + "screen.widget.xtracr_realcamera.modelView_roll": "롤 = %s", + "screen.widget.xtracr_realcamera.modelView_save": "저장", + "screen.widget.xtracr_realcamera.modelView_selecting": "선택", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "선택 모드", + "screen.widget.xtracr_realcamera.modelView_single": "단일", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "필드에서 슬라이더로 전환", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "슬라이더에서 필드로 전환", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "상향 벡터", + "screen.widget.xtracr_realcamera.modelView_yaw": "요 = %s", + "screen.xtracr_realcamera.modelView_title": "모델 뷰" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/lzh.json b/common/src/main/resources/assets/realcamera/lang/lzh.json index 3481b108..88c8885b 100644 --- a/common/src/main/resources/assets/realcamera/lang/lzh.json +++ b/common/src/main/resources/assets/realcamera/lang/lzh.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "啟模型觀象之窗", - "key.xtracr_realcamera.togglePerspective": "開/闔", - "key.xtracr_realcamera.activeConfigIndexPREV": "切上配", - "key.xtracr_realcamera.activeConfigIndexNEXT": "切下配", - "key.xtracr_realcamera.activeConfigIndexRESET": "改配之引", - "key.xtracr_realcamera.toggleAdjustMode": "易調校之法", - "key.xtracr_realcamera.toggleCameraMode": "易鏡觀之道", - "key.xtracr_realcamera.adjustUP": "上移", - "key.xtracr_realcamera.adjustDOWN": "下移", - "key.xtracr_realcamera.adjustFRONT": "前移", - "key.xtracr_realcamera.adjustBACK": "後移", - "key.xtracr_realcamera.adjustLEFT": "左移", - "key.xtracr_realcamera.adjustRIGHT": "右移", - "modmenu.descriptionTranslation.realcamera": "使第一人稱之鏡觀愈真。", - - "config.category.xtracr_realcamera.general": "總則", "config.category.xtracr_realcamera.binding": "系定之法", - "config.category.xtracr_realcamera.classic": "古法", "config.category.xtracr_realcamera.cameraOffset": "鏡觀偏移", - "config.category.xtracr_realcamera.centerOffset": "樞軸偏移", "config.category.xtracr_realcamera.cameraRotation": "鏡觀旋轉", - "config.tooltip.xtracr_realcamera.classicOffset": "鏡觀相對樞軸之移值", - "config.tooltip.xtracr_realcamera.classicOffset_n": "註: 戯者之前、上、左分別為X、Y、Z軸", - "config.tooltip.xtracr_realcamera.centerOffset": "樞軸相對首部之移值", - "config.tooltip.xtracr_realcamera.cameraRotation": "額外之鏡觀轉角度", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "註: 俯仰、偏航、翻滾乃以左、上、前為軸之轉", - - "config.option.xtracr_realcamera.enabled": "啟其能", - "config.option.xtracr_realcamera.isClassic": "古法", - "config.option.xtracr_realcamera.dynamicCrosshair": "動準星", - "config.option.xtracr_realcamera.renderModel": "顯戯者之形", + "config.category.xtracr_realcamera.centerOffset": "樞軸偏移", + "config.category.xtracr_realcamera.classic": "古法", + "config.category.xtracr_realcamera.general": "總則", + "config.option.xtracr_realcamera.activeConfigIndex": "現綁配之引", + "config.option.xtracr_realcamera.adjustOffset": "調鏡觀移", "config.option.xtracr_realcamera.adjustStep": "調校之步", - "config.option.xtracr_realcamera.classicAdjustMode": "調校之法", - "config.option.xtracr_realcamera.scale": "縮放之度", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "系定果存之幀數", "config.option.xtracr_realcamera.cameraOffset": "鏡觀%s移", "config.option.xtracr_realcamera.centerOffset": "樞軸%s移", - "config.option.xtracr_realcamera.pitch": "俯仰", - "config.option.xtracr_realcamera.yaw": "偏航", - "config.option.xtracr_realcamera.roll": "翻滾", - "config.option.xtracr_realcamera.toModelViewScreen": "詳設請往%s窗(需設捷鍵以啟之)", - "config.option.xtracr_realcamera.screenModifierKey": "%s窗修飾鍵", - "config.option.xtracr_realcamera.legacyBindingMode": "古版系定之法", - "config.option.xtracr_realcamera.adjustOffset": "調鏡觀移", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱系定敗之訊", - "config.option.xtracr_realcamera.renderStuckObjects": "示附身之物", - "config.option.xtracr_realcamera.rerenderModel": "重顯其形", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "系定果存之幀數", - "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑之係", - "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑之係", - "config.option.xtracr_realcamera.activeConfigIndex": "現綁配之引", + "config.option.xtracr_realcamera.classicAdjustMode": "調校之法", "config.option.xtracr_realcamera.disableConfig": "禁配", - "config.option.xtracr_realcamera.disableWhenSneaking": "潛伏時禁其能", + "config.option.xtracr_realcamera.disableMainFeatureItems": "持...時禁其能", + "config.option.xtracr_realcamera.disableRenderItems": "持...時禁其顯", "config.option.xtracr_realcamera.disableWhenCrawling": "爬攀時禁其能", + "config.option.xtracr_realcamera.disableWhenSneaking": "潛伏時禁其能", "config.option.xtracr_realcamera.disableWhenSwimming": "游水時禁其能", + "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑之係", + "config.option.xtracr_realcamera.dynamicCrosshair": "動準星", + "config.option.xtracr_realcamera.enabled": "啟其能", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱系定敗之訊", + "config.option.xtracr_realcamera.isClassic": "古法", + "config.option.xtracr_realcamera.legacyBindingMode": "古版系定之法", "config.option.xtracr_realcamera.outTick": "出禁之延(單位:tick)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "持...時禁其能", - "config.option.xtracr_realcamera.disableRenderItems": "持...時禁其顯", - "config.tooltip.xtracr_realcamera.isClassic": "古法唯簡調鏡觀之位與旋", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "啟時,準星隨視線而動,保中無誤\n若裝Jade、WTHIT等類模組,宜啟之", - "config.tooltip.xtracr_realcamera.renderModel": "第一人稱顯戯者之形", + "config.option.xtracr_realcamera.pitch": "俯仰", + "config.option.xtracr_realcamera.renderModel": "顯戯者之形", + "config.option.xtracr_realcamera.renderStuckObjects": "示附身之物", + "config.option.xtracr_realcamera.rerenderModel": "重顯其形", + "config.option.xtracr_realcamera.roll": "翻滾", + "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑之係", + "config.option.xtracr_realcamera.scale": "縮放之度", + "config.option.xtracr_realcamera.screenModifierKey": "%s窗修飾鍵", + "config.option.xtracr_realcamera.toModelViewScreen": "詳設請往%s窗(需設捷鍵以啟之)", + "config.option.xtracr_realcamera.yaw": "偏航", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "現配之引,零意奏許定諸配", + "config.tooltip.xtracr_realcamera.adjustOffset": "當前按調校鍵時乃調鏡觀之偏移或旋轉", "config.tooltip.xtracr_realcamera.adjustStep": "每步調校角度之百分一或長度", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "系定敗後數幀內,沿用前次成之果", + "config.tooltip.xtracr_realcamera.cameraRotation": "額外之鏡觀轉角度", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "註: 俯仰、偏航、翻滾乃以左、上、前為軸之轉", + "config.tooltip.xtracr_realcamera.centerOffset": "樞軸相對首部之移值", "config.tooltip.xtracr_realcamera.classicAdjustMode": "定當前按調校鍵時調何者", - "config.tooltip.xtracr_realcamera.scale": "控偏移大小", + "config.tooltip.xtracr_realcamera.classicOffset": "鏡觀相對樞軸之移值", + "config.tooltip.xtracr_realcamera.classicOffset_n": "註: 戯者之前、上、左分別為X、Y、Z軸", + "config.tooltip.xtracr_realcamera.disableRenderItems": "三法可配:\n1. 通配符`*`配(如`minecraft:*sword`)\n2. 標籤配以`#`始(如`#minecraft:swords`)\n3. 直物ID(如`minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "鏡觀移滑係,值愈大愈平", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "啟時,準星隨視線而動,保中無誤\n若裝Jade、WTHIT等類模組,宜啟之", + "config.tooltip.xtracr_realcamera.isClassic": "古法唯簡調鏡觀之位與旋", "config.tooltip.xtracr_realcamera.legacyBindingMode": "用古版(v0.5)系定之法,惟原模及原模所出之動可受\n啟之則可於%s窗'LEGACY_MODE'中設其性", - "config.tooltip.xtracr_realcamera.adjustOffset": "當前按調校鍵時乃調鏡觀之偏移或旋轉", + "config.tooltip.xtracr_realcamera.outTick": "止禁,即復其能所之延時(1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "第一人稱顯戯者之形", "config.tooltip.xtracr_realcamera.renderStuckObjects": "矢,蜂針等附身之物", "config.tooltip.xtracr_realcamera.rerenderModel": "於原顯時重顯其形,免早顯致視誤", - "config.tooltip.xtracr_realcamera.outTick": "止禁,即復其能所之延時(1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "系定敗後數幀內,沿用前次成之果", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "鏡觀移滑係,值愈大愈平", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "鏡觀轉滑係,值愈大愈平", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "現配之引,零意奏許定諸配", - "config.tooltip.xtracr_realcamera.disableRenderItems": "三法可配:\n1. 通配符`*`配(如`minecraft:*sword`)\n2. 標籤配以`#`始(如`#minecraft:swords`)\n3. 直物ID(如`minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "控偏移大小", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切下配", + "key.xtracr_realcamera.activeConfigIndexPREV": "切上配", + "key.xtracr_realcamera.activeConfigIndexRESET": "改配之引", + "key.xtracr_realcamera.adjustBACK": "後移", + "key.xtracr_realcamera.adjustDOWN": "下移", + "key.xtracr_realcamera.adjustFRONT": "前移", + "key.xtracr_realcamera.adjustLEFT": "左移", + "key.xtracr_realcamera.adjustRIGHT": "右移", + "key.xtracr_realcamera.adjustUP": "上移", + "key.xtracr_realcamera.modelViewScreen": "啟模型觀象之窗", + "key.xtracr_realcamera.toggleAdjustMode": "易調校之法", + "key.xtracr_realcamera.toggleCameraMode": "易鏡觀之道", + "key.xtracr_realcamera.togglePerspective": "開/闔", "message.xtracr_realcamera.bindingFailed": "[%s]: 系定敗,往%s窗親設之(鍵:%s)", - - "screen.xtracr_realcamera.modelView_title": "模型觀象", - "screen.widget.xtracr_realcamera.modelView_import": "入", + "modmenu.descriptionTranslation.realcamera": "使第一人稱之鏡觀愈真。", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "禁時,鏡觀與模型之相對不變,然鏡觀之對應性不為本模所改", + "screen.tooltip.xtracr_realcamera.modelView_configs": "已存之設", + "screen.tooltip.xtracr_realcamera.modelView_copy": "抄諸禁設", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "去擇之矩\n(或用Delete鍵)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "諸頂點至屏距皆小於此值之面不顯", + "screen.tooltip.xtracr_realcamera.modelView_disable": "禁設\n全禁設在設屏中", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "藍框含之部將禁\n可於左材視以左鍵框擇,他鍵廢擇\n%s+左鍵可速擇光標指之部", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁設之名", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名不可空!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材id不可空!", + "screen.tooltip.xtracr_realcamera.modelView_export": "出今設至剪貼板", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "出敗:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "出成!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "擇矩之號\n(0示未擇)\n可以空格或回車定位今擇之矩(當輸時,按兩次即可定位)", + "screen.tooltip.xtracr_realcamera.modelView_import": "从剪貼板入設", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "入敗:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "入%s成!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "貼剪貼板諸禁設至今設\n(不蓋同名設)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "於覽式可調鏡觀諸偏移", + "screen.tooltip.xtracr_realcamera.modelView_priority": "系定之先級,值愈大愈先,且右列愈前", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "存為\n(當有同名設時,亦可用左存鈕)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放之度,控偏移量之大小", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左鍵可取光標處UV座標\n下三組UV座標自上而下為前向矢、上向矢與的平面上系點之UV座標\n註:%s鍵+滾輪可易模型之層,手輸UV座標可精系的位", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "定%s+左鍵速擇之法\n(%s鍵+滾輪可易域擇之範)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "設之名", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "所選模型紋理之id(非全id亦可識),存時可短之以便程序識\n如將minecraft:textures/entity/player/slim/alex.png短為minecraft:textures/entity/player/", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "啟全設屏\n(需裝Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "全", + "screen.widget.xtracr_realcamera.modelView_configs": "設", + "screen.widget.xtracr_realcamera.modelView_copy": "抄", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "現綁配", + "screen.widget.xtracr_realcamera.modelView_disable": "禁", + "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用之法", "screen.widget.xtracr_realcamera.modelView_export": "出", - "screen.widget.xtracr_realcamera.modelView_selecting": "擇", "screen.widget.xtracr_realcamera.modelView_forwardVector": "前向矢", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "上向矢", - "screen.widget.xtracr_realcamera.modelView_position": "的平面", - "screen.widget.xtracr_realcamera.modelView_save": "存", - "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用之法", - "screen.widget.xtracr_realcamera.modelView_all": "全", - "screen.widget.xtracr_realcamera.modelView_part": "塊", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "擇法", - "screen.widget.xtracr_realcamera.modelView_single": "單擇", + "screen.widget.xtracr_realcamera.modelView_import": "入", "screen.widget.xtracr_realcamera.modelView_multiple": "多擇", - "screen.widget.xtracr_realcamera.modelView_range": "域", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "滑塊向框", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "框向滑塊", "screen.widget.xtracr_realcamera.modelView_offsetX": "X移 = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Y移 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z移 = %s", + "screen.widget.xtracr_realcamera.modelView_part": "塊", + "screen.widget.xtracr_realcamera.modelView_paste": "貼", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰 = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "偏航 = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "翻滾 = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "禁", + "screen.widget.xtracr_realcamera.modelView_position": "的平面", "screen.widget.xtracr_realcamera.modelView_preview": "覽", - "screen.widget.xtracr_realcamera.modelView_configs": "設", - "screen.widget.xtracr_realcamera.modelView_copy": "抄", - "screen.widget.xtracr_realcamera.modelView_paste": "貼", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "現綁配", - "screen.tooltip.xtracr_realcamera.modelView_import": "从剪貼板入設", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "入%s成!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "入敗:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "出今設至剪貼板", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "出成!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "出敗:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左鍵可取光標處UV座標\n下三組UV座標自上而下為前向矢、上向矢與的平面上系點之UV座標\n註:%s鍵+滾輪可易模型之層,手輸UV座標可精系的位", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "所選模型紋理之id(非全id亦可識),存時可短之以便程序識\n如將minecraft:textures/entity/player/slim/alex.png短為minecraft:textures/entity/player/", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "藍框含之部將禁\n可於左材視以左鍵框擇,他鍵廢擇\n%s+左鍵可速擇光標指之部", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "定%s+左鍵速擇之法\n(%s鍵+滾輪可易域擇之範)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "擇矩之號\n(0示未擇)\n可以空格或回車定位今擇之矩(當輸時,按兩次即可定位)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "去擇之矩\n(或用Delete鍵)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "禁時,鏡觀與模型之相對不變,然鏡觀之對應性不為本模所改", - "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放之度,控偏移量之大小", - "screen.tooltip.xtracr_realcamera.modelView_depth": "諸頂點至屏距皆小於此值之面不顯", - "screen.tooltip.xtracr_realcamera.modelView_priority": "系定之先級,值愈大愈先,且右列愈前", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "設之名", - "screen.tooltip.xtracr_realcamera.modelView_disable": "禁設\n全禁設在設屏中", - "screen.tooltip.xtracr_realcamera.modelView_configs": "已存之設", - "screen.tooltip.xtracr_realcamera.modelView_preview": "於覽式可調鏡觀諸偏移", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "啟全設屏\n(需裝Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "抄諸禁設", - "screen.tooltip.xtracr_realcamera.modelView_paste": "貼剪貼板諸禁設至今設\n(不蓋同名設)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名不可空!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材id不可空!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "存為\n(當有同名設時,亦可用左存鈕)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁設之名" + "screen.widget.xtracr_realcamera.modelView_range": "域", + "screen.widget.xtracr_realcamera.modelView_roll": "翻滾 = %s", + "screen.widget.xtracr_realcamera.modelView_save": "存", + "screen.widget.xtracr_realcamera.modelView_selecting": "擇", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "擇法", + "screen.widget.xtracr_realcamera.modelView_single": "單擇", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "框向滑塊", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "滑塊向框", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "上向矢", + "screen.widget.xtracr_realcamera.modelView_yaw": "偏航 = %s", + "screen.xtracr_realcamera.modelView_title": "模型觀象" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/pl_pl.json b/common/src/main/resources/assets/realcamera/lang/pl_pl.json index 29672052..3a70311c 100644 --- a/common/src/main/resources/assets/realcamera/lang/pl_pl.json +++ b/common/src/main/resources/assets/realcamera/lang/pl_pl.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Prawdziwa Kamera", - "key.xtracr_realcamera.modelViewScreen": "Otwórz Ekran Podglądu Modelu", - "key.xtracr_realcamera.togglePerspective": "Włącz/Wyłącz", - "key.xtracr_realcamera.activeConfigIndexPREV": "Przełącz na poprzednią konfigurację", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Przełącz na następną konfigurację", - "key.xtracr_realcamera.activeConfigIndexRESET": "Zresetuj indeks konfiguracji", - "key.xtracr_realcamera.toggleAdjustMode": "Przełącz Tryb Dostosowania", - "key.xtracr_realcamera.toggleCameraMode": "Przełącz Tryb Kamery", - "key.xtracr_realcamera.adjustUP": "Dostosuj W GÓRĘ", - "key.xtracr_realcamera.adjustDOWN": "Dostosuj W DÓŁ", - "key.xtracr_realcamera.adjustFRONT": "Dostosuj DO PRZODU", - "key.xtracr_realcamera.adjustBACK": "Dostosuj DO TYŁU", - "key.xtracr_realcamera.adjustLEFT": "Dostosuj W LEWO", - "key.xtracr_realcamera.adjustRIGHT": "Dostosuj W PRAWO", - "modmenu.descriptionTranslation.realcamera": "Uczynienie kamery bardziej realistyczną w trybie pierwszoosobowym.", - - "config.category.xtracr_realcamera.general": "Ogólne", "config.category.xtracr_realcamera.binding": "Tryb Powiązania", - "config.category.xtracr_realcamera.classic": "Tryb Klasyczny", "config.category.xtracr_realcamera.cameraOffset": "Przesunięcie Kamery", - "config.category.xtracr_realcamera.centerOffset": "Przesunięcie Centrum Obrótu", "config.category.xtracr_realcamera.cameraRotation": "Obrót Kamery", - "config.tooltip.xtracr_realcamera.classicOffset": "Przesunięcie kamery względem centrum obrotu", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Uwaga: przód, góra i lewa strona gracza odpowiadają osiom X, Y i Z", - "config.tooltip.xtracr_realcamera.centerOffset": "Przesunięcie centrum obrotu względem głowy", - "config.tooltip.xtracr_realcamera.cameraRotation": "Dodatkowy obrót kamery w stopniach", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Uwaga: pochylenie, odchylenie i przechylenie to obroty wokół lewej, górnej i przedniej osi odpowiednio", - - "config.option.xtracr_realcamera.enabled": "Mod Włączony", - "config.option.xtracr_realcamera.isClassic": "Tryb Klasyczny", - "config.option.xtracr_realcamera.dynamicCrosshair": "Dynamiczny Celownik", - "config.option.xtracr_realcamera.renderModel": "Wyświetl Model Gracza", + "config.category.xtracr_realcamera.centerOffset": "Przesunięcie Centrum Obrótu", + "config.category.xtracr_realcamera.classic": "Tryb Klasyczny", + "config.category.xtracr_realcamera.general": "Ogólne", + "config.option.xtracr_realcamera.activeConfigIndex": "Aktywny Indeks Konfiguracji", + "config.option.xtracr_realcamera.adjustOffset": "Dostosuj Przesunięcie Kamery", "config.option.xtracr_realcamera.adjustStep": "Krok Dostosowania", - "config.option.xtracr_realcamera.classicAdjustMode": "Tryb Dostosowania", - "config.option.xtracr_realcamera.scale": "Skala", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Klatki przechowywania wyniku wiązania", "config.option.xtracr_realcamera.cameraOffset": "Przesunięcie Kamery %s", "config.option.xtracr_realcamera.centerOffset": "Przesunięcie Centrum Obrótu %s", - "config.option.xtracr_realcamera.pitch": "Pochylenie", - "config.option.xtracr_realcamera.yaw": "Odchylenie", - "config.option.xtracr_realcamera.roll": "Przechylenie", - "config.option.xtracr_realcamera.toModelViewScreen": "Aby uzyskać szczegółowe ustawienia, przejdź do ekranu %s (wymagane przypisanie klawisza otwierającego)", - "config.option.xtracr_realcamera.screenModifierKey": "Klawisz modyfikatora ekranu %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Tryb Przestarzałego Wiązania", - "config.option.xtracr_realcamera.adjustOffset": "Dostosuj Przesunięcie Kamery", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ukryj komunikaty o niepowodzeniu wiązania", - "config.option.xtracr_realcamera.renderStuckObjects": "Wyświetl Zatkane Obiekty", - "config.option.xtracr_realcamera.rerenderModel": "Ponownie Wyrenderuj Model", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Klatki przechowywania wyniku wiązania", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Współczynnik wygładzania przemieszczenia", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Współczynnik wygładzania obrotu", - "config.option.xtracr_realcamera.activeConfigIndex": "Aktywny Indeks Konfiguracji", + "config.option.xtracr_realcamera.classicAdjustMode": "Tryb Dostosowania", "config.option.xtracr_realcamera.disableConfig": "Wyłącz Konfigurację", - "config.option.xtracr_realcamera.disableWhenSneaking": "Wyłącz główną funkcję podczas skradania", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Wyłącz główną funkcję podczas trzymania...", + "config.option.xtracr_realcamera.disableRenderItems": "Wyłącz renderowanie podczas trzymania...", "config.option.xtracr_realcamera.disableWhenCrawling": "Wyłącz główną funkcję podczas czołgania", + "config.option.xtracr_realcamera.disableWhenSneaking": "Wyłącz główną funkcję podczas skradania", "config.option.xtracr_realcamera.disableWhenSwimming": "Wyłącz główną funkcję podczas pływania", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Współczynnik wygładzania przemieszczenia", + "config.option.xtracr_realcamera.dynamicCrosshair": "Dynamiczny Celownik", + "config.option.xtracr_realcamera.enabled": "Mod Włączony", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ukryj komunikaty o niepowodzeniu wiązania", + "config.option.xtracr_realcamera.isClassic": "Tryb Klasyczny", + "config.option.xtracr_realcamera.legacyBindingMode": "Tryb Przestarzałego Wiązania", "config.option.xtracr_realcamera.outTick": "Opóźnienie wyjścia ze stanu pływania (w tickach)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Wyłącz główną funkcję podczas trzymania...", - "config.option.xtracr_realcamera.disableRenderItems": "Wyłącz renderowanie podczas trzymania...", - "config.tooltip.xtracr_realcamera.isClassic": "Tryb klasyczny wprowadza tylko proste zmiany w pozycji i obrocie kamery", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Po włączeniu celownik będzie podążał za wzrokiem gracza, zapewniając precyzyjne trafienie\nZaleca się włączenie przy instalacji modów takich jak Jade, WTHIT lub podobnych", - "config.tooltip.xtracr_realcamera.renderModel": "Wyświetl model gracza w trybie pierwszoosobowym", + "config.option.xtracr_realcamera.pitch": "Pochylenie", + "config.option.xtracr_realcamera.renderModel": "Wyświetl Model Gracza", + "config.option.xtracr_realcamera.renderStuckObjects": "Wyświetl Zatkane Obiekty", + "config.option.xtracr_realcamera.rerenderModel": "Ponownie Wyrenderuj Model", + "config.option.xtracr_realcamera.roll": "Przechylenie", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Współczynnik wygładzania obrotu", + "config.option.xtracr_realcamera.scale": "Skala", + "config.option.xtracr_realcamera.screenModifierKey": "Klawisz modyfikatora ekranu %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Aby uzyskać szczegółowe ustawienia, przejdź do ekranu %s (wymagane przypisanie klawisza otwierającego)", + "config.option.xtracr_realcamera.yaw": "Odchylenie", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Aktualnie powiązany indeks konfiguracji, 0 oznacza pozwolenie na powiązanie z dowolną prawidłową konfiguracją", + "config.tooltip.xtracr_realcamera.adjustOffset": "Po naciśnięciu klawisza dostosowania, reguluj przesunięcie lub obrót kamery", "config.tooltip.xtracr_realcamera.adjustStep": "Długość lub 1/100 kąta dostosowania na krok", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Przez kilka klatek po niepowodzeniu wiązania kontynuuj używanie poprzedniego udanego wyniku wiązania", + "config.tooltip.xtracr_realcamera.cameraRotation": "Dodatkowy obrót kamery w stopniach", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Uwaga: pochylenie, odchylenie i przechylenie to obroty wokół lewej, górnej i przedniej osi odpowiednio", + "config.tooltip.xtracr_realcamera.centerOffset": "Przesunięcie centrum obrotu względem głowy", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Określa, co dostosować po naciśnięciu klawisza dostosowania", - "config.tooltip.xtracr_realcamera.scale": "Kontroluj rozmiar przesunięć", + "config.tooltip.xtracr_realcamera.classicOffset": "Przesunięcie kamery względem centrum obrotu", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Uwaga: przód, góra i lewa strona gracza odpowiadają osiom X, Y i Z", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Obsługiwane są trzy metody dopasowania:\n1. Dopasowanie wildcard `*` (np. `minecraft:*sword`)\n2. Dopasowanie tagów (zaczyna się od `#`, np. `#minecraft:swords`)\n3. Bezpośrednie ID przedmiotu (np. `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Współczynnik wygładzania przemieszczenia kamery, im wyższa wartość, tym płynniejszy ruch", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Po włączeniu celownik będzie podążał za wzrokiem gracza, zapewniając precyzyjne trafienie\nZaleca się włączenie przy instalacji modów takich jak Jade, WTHIT lub podobnych", + "config.tooltip.xtracr_realcamera.isClassic": "Tryb klasyczny wprowadza tylko proste zmiany w pozycji i obrocie kamery", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Używa trybu przestarzałego wiązania (v0.5), obsługuje tylko standardowe modele i działania na nich bazujące\nPo włączeniu właściwości można ustawić w 'LEGACY_MODE' ekranu %s", - "config.tooltip.xtracr_realcamera.adjustOffset": "Po naciśnięciu klawisza dostosowania, reguluj przesunięcie lub obrót kamery", + "config.tooltip.xtracr_realcamera.outTick": "Opóźnienie włączenia głównej funkcji po wyjściu ze stanu pływania (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Wyświetl model gracza w trybie pierwszoosobowym", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Strzały, żądła pszczół i inne obiekty, które mogą utknąć w ciele gracza", "config.tooltip.xtracr_realcamera.rerenderModel": "Ponownie renderuj model w oryginalnym czasie renderowania, aby uniknąć problemów wizualnych spowodowanych wczesnym renderowaniem", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Przez kilka klatek po niepowodzeniu wiązania kontynuuj używanie poprzedniego udanego wyniku wiązania", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Współczynnik wygładzania przemieszczenia kamery, im wyższa wartość, tym płynniejszy ruch", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Współczynnik wygładzania obrotu kamery, im wyższa wartość, tym płynniejszy ruch", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Aktualnie powiązany indeks konfiguracji, 0 oznacza pozwolenie na powiązanie z dowolną prawidłową konfiguracją", - "config.tooltip.xtracr_realcamera.outTick": "Opóźnienie włączenia głównej funkcji po wyjściu ze stanu pływania (1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Obsługiwane są trzy metody dopasowania:\n1. Dopasowanie wildcard `*` (np. `minecraft:*sword`)\n2. Dopasowanie tagów (zaczyna się od `#`, np. `#minecraft:swords`)\n3. Bezpośrednie ID przedmiotu (np. `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Kontroluj rozmiar przesunięć", + "general.xtracr_realcamera.modName": "Prawdziwa Kamera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Przełącz na następną konfigurację", + "key.xtracr_realcamera.activeConfigIndexPREV": "Przełącz na poprzednią konfigurację", + "key.xtracr_realcamera.activeConfigIndexRESET": "Zresetuj indeks konfiguracji", + "key.xtracr_realcamera.adjustBACK": "Dostosuj DO TYŁU", + "key.xtracr_realcamera.adjustDOWN": "Dostosuj W DÓŁ", + "key.xtracr_realcamera.adjustFRONT": "Dostosuj DO PRZODU", + "key.xtracr_realcamera.adjustLEFT": "Dostosuj W LEWO", + "key.xtracr_realcamera.adjustRIGHT": "Dostosuj W PRAWO", + "key.xtracr_realcamera.adjustUP": "Dostosuj W GÓRĘ", + "key.xtracr_realcamera.modelViewScreen": "Otwórz Ekran Podglądu Modelu", + "key.xtracr_realcamera.toggleAdjustMode": "Przełącz Tryb Dostosowania", + "key.xtracr_realcamera.toggleCameraMode": "Przełącz Tryb Kamery", + "key.xtracr_realcamera.togglePerspective": "Włącz/Wyłącz", "message.xtracr_realcamera.bindingFailed": "[%s]: Błąd powiązania, przejdź do ekranu %s i skonfiguruj ręcznie (Klawisz: %s)", - - "screen.xtracr_realcamera.modelView_title": "Widok modelu", - "screen.widget.xtracr_realcamera.modelView_import": "Importuj", + "modmenu.descriptionTranslation.realcamera": "Uczynienie kamery bardziej realistyczną w trybie pierwszoosobowym.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Po wyłączeniu względna pozycja kamery względem modelu nie ulegnie zmianie, ale odpowiednie atrybuty kamery nie będą modyfikowane przez ten mod", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Zapisane konfiguracje", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Skopiuj wszystkie ustawienia wyłączenia", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Usuń zaznaczony prostokąt\n(Lub użyj klawisza Delete)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Płaszczyzny, w których wszystkie odległości od wierzchołka do ekranu są mniejsze niż ta wartość, nie będą renderowane", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Ustawienia wyłączenia\nGlobalne ustawienia wyłączenia znajdują się na ekranie konfiguracji", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Części zawarte w niebieskich ramkach zostaną wyłączone\nLewy przycisk myszy do wyboru, inne klawisze do anulowania wyboru\n%s+LKliknij, aby szybko wybrać część wskazaną przez kursor myszy", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nazwa ustawienia wyłączenia", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Nazwa nie może być pusta!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Identyfikator tekstury nie może być pusty!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Eksportuj bieżącą konfigurację do schowka", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Eksport nie powiódł się: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Eksport powiódł się!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Numer zaznaczonego prostokąta\n(0 oznacza brak wyboru)\nNaciśnij Spację lub Enter, aby zlokalizować bieżący zaznaczony prostokąt (Podczas pisania naciśnij dwukrotnie, aby zlokalizować)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Importuj konfigurację ze schowka", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import nie powiódł się: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s powiódł się!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Wklej wszystkie ustawienia wyłączenia ze schowka do bieżącej konfiguracji\n(Nie nadpisze istniejących ustawień o tej samej nazwie)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "W trybie podglądu możesz dostosować przesunięcie i obrót kamery", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorytet powiązania: im większa wartość, tym wyższy priorytet i wyższe sortowanie po prawej stronie", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Zapisz jako\n(Gdy istnieje konfiguracja o tej samej nazwie, możesz również użyć przycisku zapisu po lewej stronie)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Skala, która kontroluje rozmiar przesunięć", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+LKliknij, aby uzyskać współrzędne UV w miejscu wskaźnika myszy\nTrzy zestawy współrzędnych UV poniżej, od góry do dołu, to współrzędne UV wektora do przodu, wektora w górę i punktu wiązania na płaszczyźnie docelowej\nUwaga: %s+Przewiń, aby przełączać się między różnymi warstwami modelu. Ręczne wprowadzanie współrzędnych UV pozwala dokładniej powiązać z pozycją docelową", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Określa tryb szybkiego wyboru %s+LKliknięcia\n(%s+Przewiń, aby zmienić zakres wyboru w trybie zakresu)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nazwa konfiguracji", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "Identyfikator tekstury wybranego modelu (niekoniecznie pełny identyfikator), może zostać skrócony podczas zapisywania dla łatwiejszego rozpoznania.\nNa przykład skróć minecraft:textures/entity/player/slim/alex.png do minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Otwórz globalny ekran konfiguracji\n(Wymagane Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "Wszystko", + "screen.widget.xtracr_realcamera.modelView_configs": "Konfiguracje", + "screen.widget.xtracr_realcamera.modelView_copy": "Kopiuj", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Bieżąca Konfiguracja", + "screen.widget.xtracr_realcamera.modelView_disable": "Wyłącz", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Tryb wyłączenia", "screen.widget.xtracr_realcamera.modelView_export": "Eksportuj", - "screen.widget.xtracr_realcamera.modelView_selecting": "Wybór", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Wektor do przodu", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Wektor w górę", - "screen.widget.xtracr_realcamera.modelView_position": "Płaszczyzna docelowa", - "screen.widget.xtracr_realcamera.modelView_save": "Zapisz", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Tryb wyłączenia", - "screen.widget.xtracr_realcamera.modelView_all": "Wszystko", - "screen.widget.xtracr_realcamera.modelView_part": "Część", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Tryb wyboru", - "screen.widget.xtracr_realcamera.modelView_single": "Pojedynczy", + "screen.widget.xtracr_realcamera.modelView_import": "Importuj", "screen.widget.xtracr_realcamera.modelView_multiple": "Wielokrotny", - "screen.widget.xtracr_realcamera.modelView_range": "Zakres", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Przełącz suwak na pole", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Przełącz pole na suwak", "screen.widget.xtracr_realcamera.modelView_offsetX": "Przesunięcie X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Przesunięcie Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Przesunięcie Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Część", + "screen.widget.xtracr_realcamera.modelView_paste": "Wklej", "screen.widget.xtracr_realcamera.modelView_pitch": "Pochylenie = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Odchylenie = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Przechylenie = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Wyłącz", + "screen.widget.xtracr_realcamera.modelView_position": "Płaszczyzna docelowa", "screen.widget.xtracr_realcamera.modelView_preview": "Podgląd", - "screen.widget.xtracr_realcamera.modelView_configs": "Konfiguracje", - "screen.widget.xtracr_realcamera.modelView_copy": "Kopiuj", - "screen.widget.xtracr_realcamera.modelView_paste": "Wklej", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Bieżąca Konfiguracja", - "screen.tooltip.xtracr_realcamera.modelView_import": "Importuj konfigurację ze schowka", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s powiódł się!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import nie powiódł się: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Eksportuj bieżącą konfigurację do schowka", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Eksport powiódł się!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Eksport nie powiódł się: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+LKliknij, aby uzyskać współrzędne UV w miejscu wskaźnika myszy\nTrzy zestawy współrzędnych UV poniżej, od góry do dołu, to współrzędne UV wektora do przodu, wektora w górę i punktu wiązania na płaszczyźnie docelowej\nUwaga: %s+Przewiń, aby przełączać się między różnymi warstwami modelu. Ręczne wprowadzanie współrzędnych UV pozwala dokładniej powiązać z pozycją docelową", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "Identyfikator tekstury wybranego modelu (niekoniecznie pełny identyfikator), może zostać skrócony podczas zapisywania dla łatwiejszego rozpoznania.\nNa przykład skróć minecraft:textures/entity/player/slim/alex.png do minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Części zawarte w niebieskich ramkach zostaną wyłączone\nLewy przycisk myszy do wyboru, inne klawisze do anulowania wyboru\n%s+LKliknij, aby szybko wybrać część wskazaną przez kursor myszy", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Określa tryb szybkiego wyboru %s+LKliknięcia\n(%s+Przewiń, aby zmienić zakres wyboru w trybie zakresu)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Numer zaznaczonego prostokąta\n(0 oznacza brak wyboru)\nNaciśnij Spację lub Enter, aby zlokalizować bieżący zaznaczony prostokąt (Podczas pisania naciśnij dwukrotnie, aby zlokalizować)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Usuń zaznaczony prostokąt\n(Lub użyj klawisza Delete)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Po wyłączeniu względna pozycja kamery względem modelu nie ulegnie zmianie, ale odpowiednie atrybuty kamery nie będą modyfikowane przez ten mod", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Skala, która kontroluje rozmiar przesunięć", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Płaszczyzny, w których wszystkie odległości od wierzchołka do ekranu są mniejsze niż ta wartość, nie będą renderowane", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorytet powiązania: im większa wartość, tym wyższy priorytet i wyższe sortowanie po prawej stronie", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nazwa konfiguracji", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Ustawienia wyłączenia\nGlobalne ustawienia wyłączenia znajdują się na ekranie konfiguracji", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Zapisane konfiguracje", - "screen.tooltip.xtracr_realcamera.modelView_preview": "W trybie podglądu możesz dostosować przesunięcie i obrót kamery", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Otwórz globalny ekran konfiguracji\n(Wymagane Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Skopiuj wszystkie ustawienia wyłączenia", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Wklej wszystkie ustawienia wyłączenia ze schowka do bieżącej konfiguracji\n(Nie nadpisze istniejących ustawień o tej samej nazwie)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Nazwa nie może być pusta!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Identyfikator tekstury nie może być pusty!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Zapisz jako\n(Gdy istnieje konfiguracja o tej samej nazwie, możesz również użyć przycisku zapisu po lewej stronie)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nazwa ustawienia wyłączenia" + "screen.widget.xtracr_realcamera.modelView_range": "Zakres", + "screen.widget.xtracr_realcamera.modelView_roll": "Przechylenie = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Zapisz", + "screen.widget.xtracr_realcamera.modelView_selecting": "Wybór", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Tryb wyboru", + "screen.widget.xtracr_realcamera.modelView_single": "Pojedynczy", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Przełącz pole na suwak", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Przełącz suwak na pole", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Wektor w górę", + "screen.widget.xtracr_realcamera.modelView_yaw": "Odchylenie = %s", + "screen.xtracr_realcamera.modelView_title": "Widok modelu" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/pt_br.json b/common/src/main/resources/assets/realcamera/lang/pt_br.json index dc1188e5..ae0d7381 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_br.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_br.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Abrir Tela de Visualização do Modelo", - "key.xtracr_realcamera.togglePerspective": "Ativar/Desativar", - "key.xtracr_realcamera.activeConfigIndexPREV": "Mudar para configuração anterior", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Mudar para próxima configuração", - "key.xtracr_realcamera.activeConfigIndexRESET": "Redefinir índice de configuração", - "key.xtracr_realcamera.toggleAdjustMode": "Alternar Modo de Ajuste", - "key.xtracr_realcamera.toggleCameraMode": "Alternar Modo de Câmera", - "key.xtracr_realcamera.adjustUP": "Ajustar PARA CIMA", - "key.xtracr_realcamera.adjustDOWN": "Ajustar PARA BAIXO", - "key.xtracr_realcamera.adjustFRONT": "Ajustar FRENTE", - "key.xtracr_realcamera.adjustBACK": "Ajustar TRÁS", - "key.xtracr_realcamera.adjustLEFT": "Ajustar ESQUERDA", - "key.xtracr_realcamera.adjustRIGHT": "Ajustar DIREITA", - "modmenu.descriptionTranslation.realcamera": "Torna a câmera mais realista na visão em primeira pessoa.", - - "config.category.xtracr_realcamera.general": "Geral", "config.category.xtracr_realcamera.binding": "Modo de Vinculação", - "config.category.xtracr_realcamera.classic": "Modo Clássico", "config.category.xtracr_realcamera.cameraOffset": "Deslocamento da Câmera", - "config.category.xtracr_realcamera.centerOffset": "Deslocamento do Centro de Rotação", "config.category.xtracr_realcamera.cameraRotation": "Rotação da Câmera", - "config.tooltip.xtracr_realcamera.classicOffset": "Deslocamento da câmera em relação ao seu centro de rotação", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Nota: a frente, cima e esquerda do jogador são os eixos X, Y e Z respectivamente", - "config.tooltip.xtracr_realcamera.centerOffset": "Deslocamento do centro de rotação em relação à cabeça", - "config.tooltip.xtracr_realcamera.cameraRotation": "Rotação adicional da câmera em graus", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Nota: Pitch, yaw e roll são rotações nos eixos esquerda, cima e frente respectivamente", - - "config.option.xtracr_realcamera.enabled": "Mod Ativado", - "config.option.xtracr_realcamera.isClassic": "Modo Clássico", - "config.option.xtracr_realcamera.dynamicCrosshair": "Mira Dinâmica", - "config.option.xtracr_realcamera.renderModel": "Renderizar Modelo do Jogador", + "config.category.xtracr_realcamera.centerOffset": "Deslocamento do Centro de Rotação", + "config.category.xtracr_realcamera.classic": "Modo Clássico", + "config.category.xtracr_realcamera.general": "Geral", + "config.option.xtracr_realcamera.activeConfigIndex": "Índice de Configuração Ativa", + "config.option.xtracr_realcamera.adjustOffset": "Ajustar Deslocamento da Câmera", "config.option.xtracr_realcamera.adjustStep": "Passo de Ajuste", - "config.option.xtracr_realcamera.classicAdjustMode": "Modo de Ajuste", - "config.option.xtracr_realcamera.scale": "Escala", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Quadros de retenção de resultado de vinculação", "config.option.xtracr_realcamera.cameraOffset": "Deslocamento %s da Câmera", "config.option.xtracr_realcamera.centerOffset": "Deslocamento %s do Centro de Rotação", - "config.option.xtracr_realcamera.pitch": "Pitch", - "config.option.xtracr_realcamera.yaw": "Yaw", - "config.option.xtracr_realcamera.roll": "Roll", - "config.option.xtracr_realcamera.toModelViewScreen": "Para configurações detalhadas, vá para a tela %s (é necessário definir uma tecla para abri-la)", - "config.option.xtracr_realcamera.screenModifierKey": "Tecla modificadora de tela %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Modo de Vinculação Legado", - "config.option.xtracr_realcamera.adjustOffset": "Ajustar Deslocamento da Câmera", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensagens de falha de vinculação", - "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Presos", - "config.option.xtracr_realcamera.rerenderModel": "Renderizar Modelo Novamente", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Quadros de retenção de resultado de vinculação", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização de deslocamento", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização de rotação", - "config.option.xtracr_realcamera.activeConfigIndex": "Índice de Configuração Ativa", + "config.option.xtracr_realcamera.classicAdjustMode": "Modo de Ajuste", "config.option.xtracr_realcamera.disableConfig": "Desativar Configuração", - "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Desativar função principal ao segurar...", + "config.option.xtracr_realcamera.disableRenderItems": "Desativar renderização ao segurar...", "config.option.xtracr_realcamera.disableWhenCrawling": "Desativar função principal ao rastejar", + "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", "config.option.xtracr_realcamera.disableWhenSwimming": "Desativar função principal ao nadar", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização de deslocamento", + "config.option.xtracr_realcamera.dynamicCrosshair": "Mira Dinâmica", + "config.option.xtracr_realcamera.enabled": "Mod Ativado", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensagens de falha de vinculação", + "config.option.xtracr_realcamera.isClassic": "Modo Clássico", + "config.option.xtracr_realcamera.legacyBindingMode": "Modo de Vinculação Legado", "config.option.xtracr_realcamera.outTick": "Atraso na saída do estado de natação (em ticks)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Desativar função principal ao segurar...", - "config.option.xtracr_realcamera.disableRenderItems": "Desativar renderização ao segurar...", - "config.tooltip.xtracr_realcamera.isClassic": "O modo clássico apenas faz alterações simples na posição e rotação da câmera", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Quando ativado, a mira seguirá a visão do jogador, garantindo um resultado de acerto consistente\nRecomendado ativar quando mods como Jade, WTHIT ou similares estiverem instalados", - "config.tooltip.xtracr_realcamera.renderModel": "Renderizar modelo do jogador em perspectiva de primeira pessoa", + "config.option.xtracr_realcamera.pitch": "Pitch", + "config.option.xtracr_realcamera.renderModel": "Renderizar Modelo do Jogador", + "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Presos", + "config.option.xtracr_realcamera.rerenderModel": "Renderizar Modelo Novamente", + "config.option.xtracr_realcamera.roll": "Roll", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização de rotação", + "config.option.xtracr_realcamera.scale": "Escala", + "config.option.xtracr_realcamera.screenModifierKey": "Tecla modificadora de tela %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Para configurações detalhadas, vá para a tela %s (é necessário definir uma tecla para abri-la)", + "config.option.xtracr_realcamera.yaw": "Yaw", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuração atualmente vinculada, 0 significa permitir vinculação a qualquer configuração válida", + "config.tooltip.xtracr_realcamera.adjustOffset": "Ao pressionar a tecla de ajuste, ajusta o deslocamento ou rotação da câmera", "config.tooltip.xtracr_realcamera.adjustStep": "Comprimento ou 1/100 do ângulo do ajuste por passo", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Por vários quadros após a falha de vinculação, continue usando o resultado de vinculação bem-sucedido anterior", + "config.tooltip.xtracr_realcamera.cameraRotation": "Rotação adicional da câmera em graus", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Nota: Pitch, yaw e roll são rotações nos eixos esquerda, cima e frente respectivamente", + "config.tooltip.xtracr_realcamera.centerOffset": "Deslocamento do centro de rotação em relação à cabeça", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Determina o que ajustar ao pressionar a tecla de ajuste", - "config.tooltip.xtracr_realcamera.scale": "Controla o tamanho dos deslocamentos", + "config.tooltip.xtracr_realcamera.classicOffset": "Deslocamento da câmera em relação ao seu centro de rotação", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Nota: a frente, cima e esquerda do jogador são os eixos X, Y e Z respectivamente", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Três métodos de correspondência são suportados:\n1. Correspondência com curinga `*` (por exemplo, `minecraft:*sword`)\n2. Correspondência de tag (começa com `#`, por exemplo, `#minecraft:swords`)\n3. ID de item direto (por exemplo, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização do deslocamento da câmera, quanto maior o valor, mais suave o movimento", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Quando ativado, a mira seguirá a visão do jogador, garantindo um resultado de acerto consistente\nRecomendado ativar quando mods como Jade, WTHIT ou similares estiverem instalados", + "config.tooltip.xtracr_realcamera.isClassic": "O modo clássico apenas faz alterações simples na posição e rotação da câmera", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Usando o modo de vinculação da versão legada (v0.5), apenas modelos vanilla e ações baseadas em modelos vanilla são suportados\nSuas propriedades podem ser definidas em 'LEGACY_MODE' da tela %s quando ativado", - "config.tooltip.xtracr_realcamera.adjustOffset": "Ao pressionar a tecla de ajuste, ajusta o deslocamento ou rotação da câmera", + "config.tooltip.xtracr_realcamera.outTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Renderizar modelo do jogador em perspectiva de primeira pessoa", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flechas, ferrões de abelha e outros objetos que podem ficar presos no corpo do jogador", "config.tooltip.xtracr_realcamera.rerenderModel": "Renderizar o modelo novamente no momento original de renderização para evitar alguns problemas visuais causados pela renderização antecipada", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Por vários quadros após a falha de vinculação, continue usando o resultado de vinculação bem-sucedido anterior", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização do deslocamento da câmera, quanto maior o valor, mais suave o movimento", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização da rotação da câmera, quanto maior o valor, mais suave o movimento", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuração atualmente vinculada, 0 significa permitir vinculação a qualquer configuração válida", - "config.tooltip.xtracr_realcamera.outTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Três métodos de correspondência são suportados:\n1. Correspondência com curinga `*` (por exemplo, `minecraft:*sword`)\n2. Correspondência de tag (começa com `#`, por exemplo, `#minecraft:swords`)\n3. ID de item direto (por exemplo, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Controla o tamanho dos deslocamentos", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Mudar para próxima configuração", + "key.xtracr_realcamera.activeConfigIndexPREV": "Mudar para configuração anterior", + "key.xtracr_realcamera.activeConfigIndexRESET": "Redefinir índice de configuração", + "key.xtracr_realcamera.adjustBACK": "Ajustar TRÁS", + "key.xtracr_realcamera.adjustDOWN": "Ajustar PARA BAIXO", + "key.xtracr_realcamera.adjustFRONT": "Ajustar FRENTE", + "key.xtracr_realcamera.adjustLEFT": "Ajustar ESQUERDA", + "key.xtracr_realcamera.adjustRIGHT": "Ajustar DIREITA", + "key.xtracr_realcamera.adjustUP": "Ajustar PARA CIMA", + "key.xtracr_realcamera.modelViewScreen": "Abrir Tela de Visualização do Modelo", + "key.xtracr_realcamera.toggleAdjustMode": "Alternar Modo de Ajuste", + "key.xtracr_realcamera.toggleCameraMode": "Alternar Modo de Câmera", + "key.xtracr_realcamera.togglePerspective": "Ativar/Desativar", "message.xtracr_realcamera.bindingFailed": "[%s]: Vinculação falhou, por favor vá para a tela %s e configure manualmente (Tecla: %s)", - - "screen.xtracr_realcamera.modelView_title": "Visualização de Modelo", - "screen.widget.xtracr_realcamera.modelView_import": "Importar", + "modmenu.descriptionTranslation.realcamera": "Torna a câmera mais realista na visão em primeira pessoa.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Quando desativado, a relação relativa da câmera com o modelo não mudará, mas os atributos correspondentes da câmera não serão modificados por este mod", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurações Salvas", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas as configurações de desativação", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Excluir o retângulo selecionado\n(Ou use a tecla Delete)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Planos onde todas as distâncias vértice-para-tela são menores que este valor não serão renderizados", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Configurações de Desativação\nConfigurações globais de desativação estão na tela de configuração", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "As partes contidas nas caixas azuis serão desativadas\nClique esquerdo para selecionar, outras teclas para cancelar a seleção\n%s+Clique Esquerdo para selecionar rapidamente a parte apontada pelo cursor do mouse", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nome da configuração de desativação", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "O nome não pode estar vazio!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "O ID da textura não pode estar vazio!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Exportar configuração atual para a área de transferência", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Falha na exportação: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Exportação bem-sucedida!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Número do Retângulo Focado\n(0 significa nenhuma seleção)\nPressione Espaço ou Enter para localizar o retângulo focado atual (Ao digitar, pressione duas vezes para localizar)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Colar todas as configurações de desativação da área de transferência para a configuração atual\n(Não substituirá configurações existentes com o mesmo nome)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla o tamanho dos deslocamentos", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clique Esquerdo para obter as coordenadas UV no ponteiro do mouse\nOs três conjuntos de coordenadas UV abaixo são, de cima para baixo, as coordenadas UV do vetor de frente, do vetor para cima e do ponto de vinculação no plano alvo\nNota: %s+Rolar para alternar entre as diferentes camadas do modelo. Inserir manualmente as coordenadas UV permite vincular com mais precisão à posição alvo", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina o modo de seleção rápida %s+Clique Esquerdo\n(%s+Rolar para alterar o intervalo de seleção no modo de intervalo)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nome da configuração", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "O ID da textura do modelo selecionado (não precisa ser o ID completo), pode ser encurtado ao salvar para facilitar o reconhecimento.\nPor exemplo, encurte minecraft:textures/entity/player/slim/alex.png para minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir a Tela de Configuração Global\n(Cloth Config API necessário)", + "screen.widget.xtracr_realcamera.modelView_all": "Todos", + "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", + "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", + "screen.widget.xtracr_realcamera.modelView_disable": "Desativar", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo de Desativação", "screen.widget.xtracr_realcamera.modelView_export": "Exportar", - "screen.widget.xtracr_realcamera.modelView_selecting": "Selecionando", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Vetor de Frente", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vetor para Cima", - "screen.widget.xtracr_realcamera.modelView_position": "Plano Alvo", - "screen.widget.xtracr_realcamera.modelView_save": "Salvar", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo de Desativação", - "screen.widget.xtracr_realcamera.modelView_all": "Todos", - "screen.widget.xtracr_realcamera.modelView_part": "Parte", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Modo de Seleção", - "screen.widget.xtracr_realcamera.modelView_single": "Único", + "screen.widget.xtracr_realcamera.modelView_import": "Importar", "screen.widget.xtracr_realcamera.modelView_multiple": "Múltiplo", - "screen.widget.xtracr_realcamera.modelView_range": "Intervalo", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Alternar Controle Deslizante para Campo", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Alternar Campo para Controle Deslizante", "screen.widget.xtracr_realcamera.modelView_offsetX": "Deslocamento X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Deslocamento Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Deslocamento Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Parte", + "screen.widget.xtracr_realcamera.modelView_paste": "Colar", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Desativar", + "screen.widget.xtracr_realcamera.modelView_position": "Plano Alvo", "screen.widget.xtracr_realcamera.modelView_preview": "Pré-visualização", - "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", - "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", - "screen.widget.xtracr_realcamera.modelView_paste": "Colar", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", - "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Exportar configuração atual para a área de transferência", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Exportação bem-sucedida!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Falha na exportação: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clique Esquerdo para obter as coordenadas UV no ponteiro do mouse\nOs três conjuntos de coordenadas UV abaixo são, de cima para baixo, as coordenadas UV do vetor de frente, do vetor para cima e do ponto de vinculação no plano alvo\nNota: %s+Rolar para alternar entre as diferentes camadas do modelo. Inserir manualmente as coordenadas UV permite vincular com mais precisão à posição alvo", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "O ID da textura do modelo selecionado (não precisa ser o ID completo), pode ser encurtado ao salvar para facilitar o reconhecimento.\nPor exemplo, encurte minecraft:textures/entity/player/slim/alex.png para minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "As partes contidas nas caixas azuis serão desativadas\nClique esquerdo para selecionar, outras teclas para cancelar a seleção\n%s+Clique Esquerdo para selecionar rapidamente a parte apontada pelo cursor do mouse", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina o modo de seleção rápida %s+Clique Esquerdo\n(%s+Rolar para alterar o intervalo de seleção no modo de intervalo)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Número do Retângulo Focado\n(0 significa nenhuma seleção)\nPressione Espaço ou Enter para localizar o retângulo focado atual (Ao digitar, pressione duas vezes para localizar)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Excluir o retângulo selecionado\n(Ou use a tecla Delete)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Quando desativado, a relação relativa da câmera com o modelo não mudará, mas os atributos correspondentes da câmera não serão modificados por este mod", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla o tamanho dos deslocamentos", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Planos onde todas as distâncias vértice-para-tela são menores que este valor não serão renderizados", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nome da configuração", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Configurações de Desativação\nConfigurações globais de desativação estão na tela de configuração", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurações Salvas", - "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir a Tela de Configuração Global\n(Cloth Config API necessário)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas as configurações de desativação", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Colar todas as configurações de desativação da área de transferência para a configuração atual\n(Não substituirá configurações existentes com o mesmo nome)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "O nome não pode estar vazio!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "O ID da textura não pode estar vazio!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nome da configuração de desativação" + "screen.widget.xtracr_realcamera.modelView_range": "Intervalo", + "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Salvar", + "screen.widget.xtracr_realcamera.modelView_selecting": "Selecionando", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Modo de Seleção", + "screen.widget.xtracr_realcamera.modelView_single": "Único", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Alternar Campo para Controle Deslizante", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Alternar Controle Deslizante para Campo", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vetor para Cima", + "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", + "screen.xtracr_realcamera.modelView_title": "Visualização de Modelo" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/pt_pt.json b/common/src/main/resources/assets/realcamera/lang/pt_pt.json index 49f8ba17..b672d933 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_pt.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_pt.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Abrir Tela de Visualização de Modelo", - "key.xtracr_realcamera.togglePerspective": "Ativar/Desativar", - "key.xtracr_realcamera.activeConfigIndexPREV": "Mudar para configuração anterior", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Mudar para próxima configuração", - "key.xtracr_realcamera.activeConfigIndexRESET": "Redefinir índice de configuração", - "key.xtracr_realcamera.toggleAdjustMode": "Alternar Modo de Ajuste", - "key.xtracr_realcamera.toggleCameraMode": "Alternar Modo de Câmera", - "key.xtracr_realcamera.adjustUP": "Ajustar PARA CIMA", - "key.xtracr_realcamera.adjustDOWN": "Ajustar PARA BAIXO", - "key.xtracr_realcamera.adjustFRONT": "Ajustar FRENTE", - "key.xtracr_realcamera.adjustBACK": "Ajustar TRÁS", - "key.xtracr_realcamera.adjustLEFT": "Ajustar ESQUERDA", - "key.xtracr_realcamera.adjustRIGHT": "Ajustar DIREITA", - "modmenu.descriptionTranslation.realcamera": "Torne a câmera mais realista na visão em primeira pessoa.", - - "config.category.xtracr_realcamera.general": "Geral", "config.category.xtracr_realcamera.binding": "Modo de Vinculação", - "config.category.xtracr_realcamera.classic": "Modo Clássico", "config.category.xtracr_realcamera.cameraOffset": "Deslocamento da Câmera", - "config.category.xtracr_realcamera.centerOffset": "Deslocamento do Centro de Rotação", "config.category.xtracr_realcamera.cameraRotation": "Rotação da Câmera", - "config.tooltip.xtracr_realcamera.classicOffset": "Deslocamento da câmera em relação ao seu centro de rotação", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Nota: a frente, cima e esquerda do jogador são os eixos X, Y and Z respectivamente", - "config.tooltip.xtracr_realcamera.centerOffset": "Deslocamento do centro de rotação em relação à cabeça", - "config.tooltip.xtracr_realcamera.cameraRotation": "Rotação adicional da câmera em graus", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Nota: Pitch, yaw e roll são rotações nos eixos esquerda, cima e frente respectivamente", - - "config.option.xtracr_realcamera.enabled": "Mod Ativado", - "config.option.xtracr_realcamera.isClassic": "Modo Clássico", - "config.option.xtracr_realcamera.dynamicCrosshair": "Mira Dinâmica", - "config.option.xtracr_realcamera.renderModel": "Renderizar Modelo do Jogador", + "config.category.xtracr_realcamera.centerOffset": "Deslocamento do Centro de Rotação", + "config.category.xtracr_realcamera.classic": "Modo Clássico", + "config.category.xtracr_realcamera.general": "Geral", + "config.option.xtracr_realcamera.activeConfigIndex": "Índice de Configuração Ativa", + "config.option.xtracr_realcamera.adjustOffset": "Ajustar Deslocamento da Câmera", "config.option.xtracr_realcamera.adjustStep": "Passo de Ajuste", - "config.option.xtracr_realcamera.classicAdjustMode": "Modo de Ajuste", - "config.option.xtracr_realcamera.scale": "Escala", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Quadros de retenção de resultado de vinculação", "config.option.xtracr_realcamera.cameraOffset": "Deslocamento %s da Câmera", "config.option.xtracr_realcamera.centerOffset": "Deslocamento %s do Centro de Rotação", - "config.option.xtracr_realcamera.pitch": "Pitch", - "config.option.xtracr_realcamera.yaw": "Yaw", - "config.option.xtracr_realcamera.roll": "Roll", - "config.option.xtracr_realcamera.toModelViewScreen": "Para configurações detalhadas, vá para a tela %s (é necessário definir uma tecla para abri-la)", - "config.option.xtracr_realcamera.screenModifierKey": "Tecla modificadora de tela %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Modo de Vinculação Legado", - "config.option.xtracr_realcamera.adjustOffset": "Ajustar Deslocamento da Câmera", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensagens de falha de vinculação", - "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Presos", - "config.option.xtracr_realcamera.rerenderModel": "Renderizar Modelo Novamente", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Quadros de retenção de resultado de vinculação", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização de deslocamento", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização de rotação", - "config.option.xtracr_realcamera.activeConfigIndex": "Índice de Configuração Ativa", + "config.option.xtracr_realcamera.classicAdjustMode": "Modo de Ajuste", "config.option.xtracr_realcamera.disableConfig": "Desativar Configuração", - "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Desativar função principal ao segurar...", + "config.option.xtracr_realcamera.disableRenderItems": "Desativar renderização ao segurar...", "config.option.xtracr_realcamera.disableWhenCrawling": "Desativar função principal ao rastejar", + "config.option.xtracr_realcamera.disableWhenSneaking": "Desativar função principal ao agachar", "config.option.xtracr_realcamera.disableWhenSwimming": "Desativar função principal ao nadar", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização de deslocamento", + "config.option.xtracr_realcamera.dynamicCrosshair": "Mira Dinâmica", + "config.option.xtracr_realcamera.enabled": "Mod Ativado", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Ocultar mensagens de falha de vinculação", + "config.option.xtracr_realcamera.isClassic": "Modo Clássico", + "config.option.xtracr_realcamera.legacyBindingMode": "Modo de Vinculação Legado", "config.option.xtracr_realcamera.outTick": "Atraso na saída do estado de natação (em ticks)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Desativar função principal ao segurar...", - "config.option.xtracr_realcamera.disableRenderItems": "Desativar renderização ao segurar...", - "config.tooltip.xtracr_realcamera.isClassic": "O modo clássico apenas faz alterações simples na posição e rotação da câmera", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Quando ativado, a mira seguirá a visão do jogador, garantindo um resultado de acerto consistente\nRecomendado ativar quando mods como Jade, WTHIT ou similares estiverem instalados", - "config.tooltip.xtracr_realcamera.renderModel": "Renderizar modelo do jogador em perspectiva de primeira pessoa", + "config.option.xtracr_realcamera.pitch": "Pitch", + "config.option.xtracr_realcamera.renderModel": "Renderizar Modelo do Jogador", + "config.option.xtracr_realcamera.renderStuckObjects": "Renderizar Objetos Presos", + "config.option.xtracr_realcamera.rerenderModel": "Renderizar Modelo Novamente", + "config.option.xtracr_realcamera.roll": "Roll", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização de rotação", + "config.option.xtracr_realcamera.scale": "Escala", + "config.option.xtracr_realcamera.screenModifierKey": "Tecla modificadora de tela %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Para configurações detalhadas, vá para a tela %s (é necessário definir uma tecla para abri-la)", + "config.option.xtracr_realcamera.yaw": "Yaw", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuração atualmente vinculada, 0 significa permitir vinculação a qualquer configuração válida", + "config.tooltip.xtracr_realcamera.adjustOffset": "Ao pressionar a tecla de ajuste, ajusta o deslocamento ou rotação da câmera", "config.tooltip.xtracr_realcamera.adjustStep": "Comprimento ou 1/100 do ângulo do ajuste por passo", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Por vários quadros após a falha de vinculação, continue usando o resultado de vinculação bem-sucedido anterior", + "config.tooltip.xtracr_realcamera.cameraRotation": "Rotação adicional da câmera em graus", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Nota: Pitch, yaw e roll são rotações nos eixos esquerda, cima e frente respectivamente", + "config.tooltip.xtracr_realcamera.centerOffset": "Deslocamento do centro de rotação em relação à cabeça", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Determina o que ajustar ao pressionar a tecla de ajuste", - "config.tooltip.xtracr_realcamera.scale": "Controla o tamanho dos deslocamentos", + "config.tooltip.xtracr_realcamera.classicOffset": "Deslocamento da câmera em relação ao seu centro de rotação", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Nota: a frente, cima e esquerda do jogador são os eixos X, Y and Z respectivamente", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Três métodos de correspondência são suportados:\n1. Correspondência com curinga `*` (por exemplo, `minecraft:*sword`)\n2. Correspondência de tag (começa com `#`, por exemplo, `#minecraft:swords`)\n3. ID de item direto (por exemplo, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização do deslocamento da câmera, quanto maior o valor, mais suave o movimento", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Quando ativado, a mira seguirá a visão do jogador, garantindo um resultado de acerto consistente\nRecomendado ativar quando mods como Jade, WTHIT ou similares estiverem instalados", + "config.tooltip.xtracr_realcamera.isClassic": "O modo clássico apenas faz alterações simples na posição e rotação da câmera", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Usando o modo de vinculação da versão legada (v0.5), apenas modelos vanilla e ações baseadas em modelos vanilla são suportados\nSuas propriedades podem ser definidas em 'LEGACY_MODE' da tela %s quando ativado", - "config.tooltip.xtracr_realcamera.adjustOffset": "Ao pressionar a tecla de ajuste, ajusta o deslocamento ou rotação da câmera", + "config.tooltip.xtracr_realcamera.outTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Renderizar modelo do jogador em perspectiva de primeira pessoa", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Flechas, ferrões de abelha e outros objetos que podem ficar presos no corpo do jogador", "config.tooltip.xtracr_realcamera.rerenderModel": "Renderizar o modelo novamente no momento original de renderização para evitar alguns problemas visuais causados pela renderização antecipada", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Por vários quadros após a falha de vinculação, continue usando o resultado de vinculação bem-sucedido anterior", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Fator de suavização do deslocamento da câmera, quanto maior o valor, mais suave o movimento", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Fator de suavização da rotação da câmera, quanto maior o valor, mais suave o movimento", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Índice de configuração atualmente vinculada, 0 significa permitir vinculação a qualquer configuração válida", - "config.tooltip.xtracr_realcamera.outTick": "O tempo antes de habilitar o recurso principal após sair do estado de natação (1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Três métodos de correspondência são suportados:\n1. Correspondência com curinga `*` (por exemplo, `minecraft:*sword`)\n2. Correspondência de tag (começa com `#`, por exemplo, `#minecraft:swords`)\n3. ID de item direto (por exemplo, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Controla o tamanho dos deslocamentos", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Mudar para próxima configuração", + "key.xtracr_realcamera.activeConfigIndexPREV": "Mudar para configuração anterior", + "key.xtracr_realcamera.activeConfigIndexRESET": "Redefinir índice de configuração", + "key.xtracr_realcamera.adjustBACK": "Ajustar TRÁS", + "key.xtracr_realcamera.adjustDOWN": "Ajustar PARA BAIXO", + "key.xtracr_realcamera.adjustFRONT": "Ajustar FRENTE", + "key.xtracr_realcamera.adjustLEFT": "Ajustar ESQUERDA", + "key.xtracr_realcamera.adjustRIGHT": "Ajustar DIREITA", + "key.xtracr_realcamera.adjustUP": "Ajustar PARA CIMA", + "key.xtracr_realcamera.modelViewScreen": "Abrir Tela de Visualização de Modelo", + "key.xtracr_realcamera.toggleAdjustMode": "Alternar Modo de Ajuste", + "key.xtracr_realcamera.toggleCameraMode": "Alternar Modo de Câmera", + "key.xtracr_realcamera.togglePerspective": "Ativar/Desativar", "message.xtracr_realcamera.bindingFailed": "[%s]: Vinculação falhou, por favor vá para a tela %s e configure manualmente (Tecla: %s)", - - "screen.xtracr_realcamera.modelView_title": "Visualização de Modelo", - "screen.widget.xtracr_realcamera.modelView_import": "Importar", + "modmenu.descriptionTranslation.realcamera": "Torne a câmera mais realista na visão em primeira pessoa.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Quando desativado, a relação relativa da câmera com o modelo não mudará, mas os atributos correspondentes da câmera não serão modificados por este mod", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurações Salvas", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas as configurações de desativação", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Excluir o retângulo selecionado\n(Ou use a tecla Delete)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Planos onde todas as distâncias vértice-para-tela são menores que este valor não serão renderizados", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Configurações de Desativação\nConfigurações globais de desativação estão na tela de configuração", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "As partes contidas nas caixas azuis serão desativadas\nClique esquerdo para selecionar, outras teclas para cancelar a seleção\n%s+Clique Esquerdo para selecionar rapidamente a parte apontada pelo ponteiro do mouse", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nome da configuração de desativação", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "O nome não pode estar vazio!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "O ID da textura não pode estar vazio!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Exportar configuração atual para a área de transferência", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Falha na exportação: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Exportação bem-sucedida!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Número do Retângulo Focado\n(0 significa nenhuma seleção)\nPressione Espaço ou Enter para localizar o retângulo focado atual (Ao digitar, pressione duas vezes para localizar)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Colar todas as configurações de desativação da área de transferência para a configuração atual\n(Não substituirá configurações existentes com o mesmo nome)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla o tamanho dos deslocamentos", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clique Esquerdo para obter as coordenadas UV no ponteiro do mouse\nOs três conjuntos de coordenadas UV abaixo são, de cima para baixo, as coordenadas UV do vetor de frente, do vetor para cima e do ponto de vinculação no plano alvo\nNota: %s+Rolar para alternar entre as diferentes camadas do modelo. Inserir manualmente as coordenadas UV permite vincular com mais precisão à posição alvo", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina o modo de seleção rápida %s+Clique Esquerdo\n(%s+Rolar para alterar o intervalo de seleção no modo de intervalo)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nome da configuração", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "O ID da textura do modelo selecionado (não precisa ser o ID completo), pode ser encurtado ao salvar para facilitar o reconhecimento.\nPor exemplo, encurte minecraft:textures/entity/player/slim/alex.png para minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir a Tela de Configuração Global\n(Cloth Config API necessário)", + "screen.widget.xtracr_realcamera.modelView_all": "Todos", + "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", + "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", + "screen.widget.xtracr_realcamera.modelView_disable": "Desativar", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo de Desativação", "screen.widget.xtracr_realcamera.modelView_export": "Exportar", - "screen.widget.xtracr_realcamera.modelView_selecting": "Selecionando", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Vetor de Frente", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vetor para Cima", - "screen.widget.xtracr_realcamera.modelView_position": "Plano Alvo", - "screen.widget.xtracr_realcamera.modelView_save": "Salvar", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo de Desativação", - "screen.widget.xtracr_realcamera.modelView_all": "Todos", - "screen.widget.xtracr_realcamera.modelView_part": "Parte", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Modo de Seleção", - "screen.widget.xtracr_realcamera.modelView_single": "Único", + "screen.widget.xtracr_realcamera.modelView_import": "Importar", "screen.widget.xtracr_realcamera.modelView_multiple": "Múltiplo", - "screen.widget.xtracr_realcamera.modelView_range": "Intervalo", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Alternar Deslizante para Campo", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Alternar Campo para Deslizante", "screen.widget.xtracr_realcamera.modelView_offsetX": "Deslocamento X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Deslocamento Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Deslocamento Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Parte", + "screen.widget.xtracr_realcamera.modelView_paste": "Colar", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Desativar", + "screen.widget.xtracr_realcamera.modelView_position": "Plano Alvo", "screen.widget.xtracr_realcamera.modelView_preview": "Pré-visualização", - "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", - "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", - "screen.widget.xtracr_realcamera.modelView_paste": "Colar", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", - "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Exportar configuração atual para a área de transferência", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Exportação bem-sucedida!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Falha na exportação: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clique Esquerdo para obter as coordenadas UV no ponteiro do mouse\nOs três conjuntos de coordenadas UV abaixo são, de cima para baixo, as coordenadas UV do vetor de frente, do vetor para cima e do ponto de vinculação no plano alvo\nNota: %s+Rolar para alternar entre as diferentes camadas do modelo. Inserir manualmente as coordenadas UV permite vincular com mais precisão à posição alvo", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "O ID da textura do modelo selecionado (não precisa ser o ID completo), pode ser encurtado ao salvar para facilitar o reconhecimento.\nPor exemplo, encurte minecraft:textures/entity/player/slim/alex.png para minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "As partes contidas nas caixas azuis serão desativadas\nClique esquerdo para selecionar, outras teclas para cancelar a seleção\n%s+Clique Esquerdo para selecionar rapidamente a parte apontada pelo ponteiro do mouse", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina o modo de seleção rápida %s+Clique Esquerdo\n(%s+Rolar para alterar o intervalo de seleção no modo de intervalo)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Número do Retângulo Focado\n(0 significa nenhuma seleção)\nPressione Espaço ou Enter para localizar o retângulo focado atual (Ao digitar, pressione duas vezes para localizar)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Excluir o retângulo selecionado\n(Ou use a tecla Delete)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Quando desativado, a relação relativa da câmera com o modelo não mudará, mas os atributos correspondentes da câmera não serão modificados por este mod", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla o tamanho dos deslocamentos", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Planos onde todas as distâncias vértice-para-tela são menores que este valor não serão renderizados", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Nome da configuração", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Configurações de Desativação\nConfigurações globais de desativação estão na tela de configuração", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurações Salvas", - "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir a Tela de Configuração Global\n(Cloth Config API necessário)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas as configurações de desativação", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Colar todas as configurações de desativação da área de transferência para a configuração atual\n(Não substituirá configurações existentes com o mesmo nome)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "O nome não pode estar vazio!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "O ID da textura não pode estar vazio!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Nome da configuração de desativação" + "screen.widget.xtracr_realcamera.modelView_range": "Intervalo", + "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Salvar", + "screen.widget.xtracr_realcamera.modelView_selecting": "Selecionando", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Modo de Seleção", + "screen.widget.xtracr_realcamera.modelView_single": "Único", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Alternar Campo para Deslizante", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Alternar Deslizante para Campo", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vetor para Cima", + "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", + "screen.xtracr_realcamera.modelView_title": "Visualização de Modelo" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/ru_ru.json b/common/src/main/resources/assets/realcamera/lang/ru_ru.json index 7b9505af..fb449b6a 100644 --- a/common/src/main/resources/assets/realcamera/lang/ru_ru.json +++ b/common/src/main/resources/assets/realcamera/lang/ru_ru.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Открыть Экран Просмотра Модели", - "key.xtracr_realcamera.togglePerspective": "Включить/Выключить", - "key.xtracr_realcamera.activeConfigIndexPREV": "Переключиться на предыдущую конфигурацию", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Переключиться на следующую конфигурацию", - "key.xtracr_realcamera.activeConfigIndexRESET": "Сбросить индекс конфигурации", - "key.xtracr_realcamera.toggleAdjustMode": "Переключить Режим Настройки", - "key.xtracr_realcamera.toggleCameraMode": "Переключить Режим Камеры", - "key.xtracr_realcamera.adjustUP": "Настроить ВВЕРХ", - "key.xtracr_realcamera.adjustDOWN": "Настроить ВНИЗ", - "key.xtracr_realcamera.adjustFRONT": "Настроить ВПЕРЕД", - "key.xtracr_realcamera.adjustBACK": "Настроить НАЗАД", - "key.xtracr_realcamera.adjustLEFT": "Настроить ВЛЕВО", - "key.xtracr_realcamera.adjustRIGHT": "Настроить ВПРАВО", - "modmenu.descriptionTranslation.realcamera": "Сделать камеру более реалистичной в режиме от первого лица.", - - "config.category.xtracr_realcamera.general": "Основные", "config.category.xtracr_realcamera.binding": "Режим Привязки", - "config.category.xtracr_realcamera.classic": "Классический Режим", "config.category.xtracr_realcamera.cameraOffset": "Смещение Камеры", - "config.category.xtracr_realcamera.centerOffset": "Смещение Центра Вращения", "config.category.xtracr_realcamera.cameraRotation": "Вращение Камеря", - "config.tooltip.xtracr_realcamera.classicOffset": "Смещение камеры от центра вращения", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Примечание: передняя, верхняя и левая стороны игрока соответствуют осям X, Y и Z", - "config.tooltip.xtracr_realcamera.centerOffset": "Смещение центра вращения от головы", - "config.tooltip.xtracr_realcamera.cameraRotation": "Дополнительное вращение камеры в градусах", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Примечание: тангаж, рыскание и крен - это вращения вокруг левой, верхней и передней осей соответственно", - - "config.option.xtracr_realcamera.enabled": "Мод Включен", - "config.option.xtracr_realcamera.isClassic": "Классический Режим", - "config.option.xtracr_realcamera.dynamicCrosshair": "Динамический Прицел", - "config.option.xtracr_realcamera.renderModel": "Отображать Модель Игрока", + "config.category.xtracr_realcamera.centerOffset": "Смещение Центра Вращения", + "config.category.xtracr_realcamera.classic": "Классический Режим", + "config.category.xtracr_realcamera.general": "Основные", + "config.option.xtracr_realcamera.activeConfigIndex": "Активный индекс конфигурации", + "config.option.xtracr_realcamera.adjustOffset": "Настроить Смещение Камеры", "config.option.xtracr_realcamera.adjustStep": "Шаг Настройки", - "config.option.xtracr_realcamera.classicAdjustMode": "Режим Настройки", - "config.option.xtracr_realcamera.scale": "Масштаб", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадры сохранения результата привязки", "config.option.xtracr_realcamera.cameraOffset": "Смещение Камеры %s", "config.option.xtracr_realcamera.centerOffset": "Смещение Центра Вращения %s", - "config.option.xtracr_realcamera.pitch": "Тангаж", - "config.option.xtracr_realcamera.yaw": "Рыскание", - "config.option.xtracr_realcamera.roll": "Крен", - "config.option.xtracr_realcamera.toModelViewScreen": "Для подробных настроек перейдите на экран %s (необходимо назначить клавишу для открытия)", - "config.option.xtracr_realcamera.screenModifierKey": "Клавиша-модификатор экрана %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Режим Устаревшей Привязки", - "config.option.xtracr_realcamera.adjustOffset": "Настроить Смещение Камеры", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Скрывать сообщения о неудачной привязке", - "config.option.xtracr_realcamera.renderStuckObjects": "Отображать Застрявшие Объекты", - "config.option.xtracr_realcamera.rerenderModel": "Перерисовать Модель", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадры сохранения результата привязки", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Коэффициент сглаживания смещения", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Коэффициент сглаживания вращения", - "config.option.xtracr_realcamera.activeConfigIndex": "Активный индекс конфигурации", + "config.option.xtracr_realcamera.classicAdjustMode": "Режим Настройки", "config.option.xtracr_realcamera.disableConfig": "Отключить Конфигурацию", - "config.option.xtracr_realcamera.disableWhenSneaking": "Отключить основную функцию при краже", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Отключить основную функцию при держании...", + "config.option.xtracr_realcamera.disableRenderItems": "Отключить отображение при держании...", "config.option.xtracr_realcamera.disableWhenCrawling": "Отключить основную функцию при ползании", + "config.option.xtracr_realcamera.disableWhenSneaking": "Отключить основную функцию при краже", "config.option.xtracr_realcamera.disableWhenSwimming": "Отключить основную функцию при плавании", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Коэффициент сглаживания смещения", + "config.option.xtracr_realcamera.dynamicCrosshair": "Динамический Прицел", + "config.option.xtracr_realcamera.enabled": "Мод Включен", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Скрывать сообщения о неудачной привязке", + "config.option.xtracr_realcamera.isClassic": "Классический Режим", + "config.option.xtracr_realcamera.legacyBindingMode": "Режим Устаревшей Привязки", "config.option.xtracr_realcamera.outTick": "Задержка выхода из состояния плавания (в тиках)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Отключить основную функцию при держании...", - "config.option.xtracr_realcamera.disableRenderItems": "Отключить отображение при держании...", - "config.tooltip.xtracr_realcamera.isClassic": "Классический режим вносит только простые изменения в положение и вращение камеры", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "При включении прицел будет следовать за взглядом игрока, обеспечивая точное попадание\nРекомендуется включить при установке Jade, WTHIT или подобных модов", - "config.tooltip.xtracr_realcamera.renderModel": "Отображать модель игрока в режиме от первого лица", + "config.option.xtracr_realcamera.pitch": "Тангаж", + "config.option.xtracr_realcamera.renderModel": "Отображать Модель Игрока", + "config.option.xtracr_realcamera.renderStuckObjects": "Отображать Застрявшие Объекты", + "config.option.xtracr_realcamera.rerenderModel": "Перерисовать Модель", + "config.option.xtracr_realcamera.roll": "Крен", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Коэффициент сглаживания вращения", + "config.option.xtracr_realcamera.scale": "Масштаб", + "config.option.xtracr_realcamera.screenModifierKey": "Клавиша-модификатор экрана %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Для подробных настроек перейдите на экран %s (необходимо назначить клавишу для открытия)", + "config.option.xtracr_realcamera.yaw": "Рыскание", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Текущий индекс привязанной конфигурации, 0 означает разрешение привязки к любой допустимой конфигурации", + "config.tooltip.xtracr_realcamera.adjustOffset": "При нажатии клавиши настройки, регулировать смещение или вращение камеры", "config.tooltip.xtracr_realcamera.adjustStep": "Длина или 1/100 угла настройки за шаг", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "В течение нескольких кадров после неудачной привязки продолжать использовать предыдущий успешный результат привязки", + "config.tooltip.xtracr_realcamera.cameraRotation": "Дополнительное вращение камеры в градусах", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Примечание: тангаж, рыскание и крен - это вращения вокруг левой, верхней и передней осей соответственно", + "config.tooltip.xtracr_realcamera.centerOffset": "Смещение центра вращения от головы", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Определяет, что настраивать при нажатии клавиши настройки", - "config.tooltip.xtracr_realcamera.scale": "Контролировать размер смещений", + "config.tooltip.xtracr_realcamera.classicOffset": "Смещение камеры от центра вращения", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Примечание: передняя, верхняя и левая стороны игрока соответствуют осям X, Y и Z", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Поддерживаются три метода сопоставления:\n1. Сопоставление с подстановочным знаком `*` (например, `minecraft:*sword`)\n2. Сопоставление по тегам (начинается с `#`, например, `#minecraft:swords`)\n3. Прямой ID предмета (например, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Коэффициент сглаживания смещения камеры, чем выше значение, тем плавнее движение", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "При включении прицел будет следовать за взглядом игрока, обеспечивая точное попадание\nРекомендуется включить при установке Jade, WTHIT или подобных модов", + "config.tooltip.xtracr_realcamera.isClassic": "Классический режим вносит только простые изменения в положение и вращение камеры", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Использует режим привязки устаревшей версии (v0.5), поддерживаются только стандартные модели и действия на их основе\nПосле включения свойства можно настроить в 'LEGACY_MODE' экрана %s", - "config.tooltip.xtracr_realcamera.adjustOffset": "При нажатии клавиши настройки, регулировать смещение или вращение камеры", + "config.tooltip.xtracr_realcamera.outTick": "Время перед включением основной функции после выхода из состояния плавания (1 тик = 0.05с)", + "config.tooltip.xtracr_realcamera.renderModel": "Отображать модель игрока в режиме от первого лица", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Стрелы, жала пчел и другие объекты, которые могут застрять в теле игрока", "config.tooltip.xtracr_realcamera.rerenderModel": "Перерисовывать модель в исходное время рендеринга, чтобы избежать визуальных проблем, вызванных ранним рендерингом", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "В течение нескольких кадров после неудачной привязки продолжать использовать предыдущий успешный результат привязки", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Коэффициент сглаживания смещения камеры, чем выше значение, тем плавнее движение", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Коэффициент сглаживания вращения камеры, чем выше значение, тем плавнее движение", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Текущий индекс привязанной конфигурации, 0 означает разрешение привязки к любой допустимой конфигурации", - "config.tooltip.xtracr_realcamera.outTick": "Время перед включением основной функции после выхода из состояния плавания (1 тик = 0.05с)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Поддерживаются три метода сопоставления:\n1. Сопоставление с подстановочным знаком `*` (например, `minecraft:*sword`)\n2. Сопоставление по тегам (начинается с `#`, например, `#minecraft:swords`)\n3. Прямой ID предмета (например, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Контролировать размер смещений", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Переключиться на следующую конфигурацию", + "key.xtracr_realcamera.activeConfigIndexPREV": "Переключиться на предыдущую конфигурацию", + "key.xtracr_realcamera.activeConfigIndexRESET": "Сбросить индекс конфигурации", + "key.xtracr_realcamera.adjustBACK": "Настроить НАЗАД", + "key.xtracr_realcamera.adjustDOWN": "Настроить ВНИЗ", + "key.xtracr_realcamera.adjustFRONT": "Настроить ВПЕРЕД", + "key.xtracr_realcamera.adjustLEFT": "Настроить ВЛЕВО", + "key.xtracr_realcamera.adjustRIGHT": "Настроить ВПРАВО", + "key.xtracr_realcamera.adjustUP": "Настроить ВВЕРХ", + "key.xtracr_realcamera.modelViewScreen": "Открыть Экран Просмотра Модели", + "key.xtracr_realcamera.toggleAdjustMode": "Переключить Режим Настройки", + "key.xtracr_realcamera.toggleCameraMode": "Переключить Режим Камеры", + "key.xtracr_realcamera.togglePerspective": "Включить/Выключить", "message.xtracr_realcamera.bindingFailed": "[%s]: Ошибка привязки, пожалуйста, перейдите на экран %s и настройте вручную (Клавиша: %s)", - - "screen.xtracr_realcamera.modelView_title": "Просмотр Модели", - "screen.widget.xtracr_realcamera.modelView_import": "Импорт", + "modmenu.descriptionTranslation.realcamera": "Сделать камеру более реалистичной в режиме от первого лица.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "При отключении относительное положение камеры к модели не изменится, но соответствующие атрибуты камеры не будут изменены этим модом", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Сохраненные конфигурации", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Копировать все настройки отключения", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Удалить выбранный прямоугольник\n(Или используйте клавишу Delete)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскости, где все расстояния от вершины до экрана меньше этого значения, не будут отображаться", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Настройки отключения\nГлобальные настройки отключения находятся на экране конфигурации", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Части, содержащиеся в синих рамках, будут отключены\nЛевый клик для выбора, другие клавиши для отмены выбора\n%s+Левый клик для быстрого выбора части, на которую указывает курсор мыши", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Имя настройки отключения", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Имя не может быть пустым!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Идентификатор текстуры не может быть пустым!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Экспортировать текущую конфигурацию в буфер обмена", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Ошибка экспорта: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Экспорт успешен!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Номер выделенного прямоугольника\n(0 означает отсутствие выбора)\nНажмите Пробел или Enter чтобы найти текущий выделенный прямоугольник (При вводе нажмите дважды чтобы найти)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Импортировать конфигурацию из буфера обмена", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Ошибка импорта: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Импорт %s успешен!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Вставить все настройки отключения из буфера обмена в текущую конфигурацию\n(Не перезапишет существующие настройки с тем же именем)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "В режиме предпросмотра вы можете настроить смещение и вращение камеры", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Приоритет при привязке: чем больше значение, тем выше приоритет и выше сортировка на правой стороне", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Сохранить как\n(При наличии настройки с тем же именем вы также можете использовать кнопку сохранения слева)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Масштаб, который контролирует размер смещений", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Левый клик чтобы получить UV-координаты в месте указателя мыши\nТри набора UV-координат ниже, сверху вниз, это UV-координаты вектора направления, вектора вверх и точки привязки на целевой плоскости\nПримечание: %s+Прокрутка для переключения между различными слоями модели. Ручной ввод UV-координат позволяет более точно привязаться к целевой позиции", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Определяет режим быстрого выбора %s+Левый клик\n(%s+Прокрутка для изменения диапазона выбора в режиме диапазона)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Имя конфигурации", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "Идентификатор текстуры выбранной модели (не обязательно полный идентификатор), может быть сокращен при сохранении для удобства распознавания.\nНапример, сократите minecraft:textures/entity/player/slim/alex.png до minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Открыть глобальный экран конфигурации\n(Требуется Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "Все", + "screen.widget.xtracr_realcamera.modelView_configs": "Конфигурации", + "screen.widget.xtracr_realcamera.modelView_copy": "Копировать", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Текущая Конфигурация", + "screen.widget.xtracr_realcamera.modelView_disable": "Отключить", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Режим отключения", "screen.widget.xtracr_realcamera.modelView_export": "Экспорт", - "screen.widget.xtracr_realcamera.modelView_selecting": "Выбор", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Вектор направления", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектор вверх", - "screen.widget.xtracr_realcamera.modelView_position": "Целевая плоскость", - "screen.widget.xtracr_realcamera.modelView_save": "Сохранить", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Режим отключения", - "screen.widget.xtracr_realcamera.modelView_all": "Все", - "screen.widget.xtracr_realcamera.modelView_part": "Часть", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Режим выбора", - "screen.widget.xtracr_realcamera.modelView_single": "Одиночный", + "screen.widget.xtracr_realcamera.modelView_import": "Импорт", "screen.widget.xtracr_realcamera.modelView_multiple": "Множественный", - "screen.widget.xtracr_realcamera.modelView_range": "Диапазон", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Переключить ползунок в поле", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Переключить поле в ползунок", "screen.widget.xtracr_realcamera.modelView_offsetX": "Смещение X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Смещение Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Смещение Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Часть", + "screen.widget.xtracr_realcamera.modelView_paste": "Вставить", "screen.widget.xtracr_realcamera.modelView_pitch": "Тангаж = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Рыскание = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Крен = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Отключить", + "screen.widget.xtracr_realcamera.modelView_position": "Целевая плоскость", "screen.widget.xtracr_realcamera.modelView_preview": "Предпросмотр", - "screen.widget.xtracr_realcamera.modelView_configs": "Конфигурации", - "screen.widget.xtracr_realcamera.modelView_copy": "Копировать", - "screen.widget.xtracr_realcamera.modelView_paste": "Вставить", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Текущая Конфигурация", - "screen.tooltip.xtracr_realcamera.modelView_import": "Импортировать конфигурацию из буфера обмена", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Импорт %s успешен!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Ошибка импорта: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Экспортировать текущую конфигурацию в буфер обмена", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Экспорт успешен!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Ошибка экспорта: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Левый клик чтобы получить UV-координаты в месте указателя мыши\nТри набора UV-координат ниже, сверху вниз, это UV-координаты вектора направления, вектора вверх и точки привязки на целевой плоскости\nПримечание: %s+Прокрутка для переключения между различными слоями модели. Ручной ввод UV-координат позволяет более точно привязаться к целевой позиции", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "Идентификатор текстуры выбранной модели (не обязательно полный идентификатор), может быть сокращен при сохранении для удобства распознавания.\nНапример, сократите minecraft:textures/entity/player/slim/alex.png до minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Части, содержащиеся в синих рамках, будут отключены\nЛевый клик для выбора, другие клавиши для отмены выбора\n%s+Левый клик для быстрого выбора части, на которую указывает курсор мыши", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Определяет режим быстрого выбора %s+Левый клик\n(%s+Прокрутка для изменения диапазона выбора в режиме диапазона)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Номер выделенного прямоугольника\n(0 означает отсутствие выбора)\nНажмите Пробел или Enter чтобы найти текущий выделенный прямоугольник (При вводе нажмите дважды чтобы найти)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Удалить выбранный прямоугольник\n(Или используйте клавишу Delete)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "При отключении относительное положение камеры к модели не изменится, но соответствующие атрибуты камеры не будут изменены этим модом", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Масштаб, который контролирует размер смещений", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскости, где все расстояния от вершины до экрана меньше этого значения, не будут отображаться", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Приоритет при привязке: чем больше значение, тем выше приоритет и выше сортировка на правой стороне", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Имя конфигурации", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Настройки отключения\nГлобальные настройки отключения находятся на экране конфигурации", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Сохраненные конфигурации", - "screen.tooltip.xtracr_realcamera.modelView_preview": "В режиме предпросмотра вы можете настроить смещение и вращение камеры", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Открыть глобальный экран конфигурации\n(Требуется Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Копировать все настройки отключения", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Вставить все настройки отключения из буфера обмена в текущую конфигурацию\n(Не перезапишет существующие настройки с тем же именем)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Имя не может быть пустым!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Идентификатор текстуры не может быть пустым!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Сохранить как\n(При наличии настройки с тем же именем вы также можете использовать кнопку сохранения слева)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Имя настройки отключения" + "screen.widget.xtracr_realcamera.modelView_range": "Диапазон", + "screen.widget.xtracr_realcamera.modelView_roll": "Крен = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Сохранить", + "screen.widget.xtracr_realcamera.modelView_selecting": "Выбор", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Режим выбора", + "screen.widget.xtracr_realcamera.modelView_single": "Одиночный", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Переключить поле в ползунок", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Переключить ползунок в поле", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектор вверх", + "screen.widget.xtracr_realcamera.modelView_yaw": "Рыскание = %s", + "screen.xtracr_realcamera.modelView_title": "Просмотр Модели" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/tr_tr.json b/common/src/main/resources/assets/realcamera/lang/tr_tr.json index 79eb9211..4fec1c17 100644 --- a/common/src/main/resources/assets/realcamera/lang/tr_tr.json +++ b/common/src/main/resources/assets/realcamera/lang/tr_tr.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Model Görünüm Ekranını Aç", - "key.xtracr_realcamera.togglePerspective": "Etkinleştir/Devre Dışı Bırak", - "key.xtracr_realcamera.activeConfigIndexPREV": "Önceki yapılandırmaya geç", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Sonraki yapılandırmaya geç", - "key.xtracr_realcamera.activeConfigIndexRESET": "Yapılandırma indeksini sıfırla", - "key.xtracr_realcamera.toggleAdjustMode": "Ayarlama Modunu Değiştir", - "key.xtracr_realcamera.toggleCameraMode": "Kamera Modunu Değiştir", - "key.xtracr_realcamera.adjustUP": "YUKARI Ayarla", - "key.xtracr_realcamera.adjustDOWN": "AŞAĞI Ayarla", - "key.xtracr_realcamera.adjustFRONT": "ÖNE Ayarla", - "key.xtracr_realcamera.adjustBACK": "ARKAYA Ayarla", - "key.xtracr_realcamera.adjustLEFT": "SOLA Ayarla", - "key.xtracr_realcamera.adjustRIGHT": "SAĞA Ayarla", - "modmenu.descriptionTranslation.realcamera": "Birinci şahıs görünümünde kamerayı daha gerçekçi hale getirir.", - - "config.category.xtracr_realcamera.general": "Genel", "config.category.xtracr_realcamera.binding": "Bağlama Modu", - "config.category.xtracr_realcamera.classic": "Klasik Mod", "config.category.xtracr_realcamera.cameraOffset": "Kamera Ofseti", - "config.category.xtracr_realcamera.centerOffset": "Dönüş Merkezi Ofseti", "config.category.xtracr_realcamera.cameraRotation": "Kamera Dönüşü", - "config.tooltip.xtracr_realcamera.classicOffset": "Kameranın dönüş merkezinden ofseti", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Not: oyuncunun ön, üst ve sol tarafı sırasıyla X, Y ve Z eksenleridir", - "config.tooltip.xtracr_realcamera.centerOffset": "Dönüş merkezinin baştan ofseti", - "config.tooltip.xtracr_realcamera.cameraRotation": "Derece cinsinden ek kamera dönüşü", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Not: Pitch, yaw ve roll sırasıyla sol, üst ve ön eksenlerdeki dönüşlerdir", - - "config.option.xtracr_realcamera.enabled": "Mod Etkin", - "config.option.xtracr_realcamera.isClassic": "Klasik Mod", - "config.option.xtracr_realcamera.dynamicCrosshair": "Dinamik Nişangah", - "config.option.xtracr_realcamera.renderModel": "Oyuncu Modelini Renderla", + "config.category.xtracr_realcamera.centerOffset": "Dönüş Merkezi Ofseti", + "config.category.xtracr_realcamera.classic": "Klasik Mod", + "config.category.xtracr_realcamera.general": "Genel", + "config.option.xtracr_realcamera.activeConfigIndex": "Aktif Yapılandırma İndeksi", + "config.option.xtracr_realcamera.adjustOffset": "Kamera Ofsetini Ayarla", "config.option.xtracr_realcamera.adjustStep": "Ayarlama Adımı", - "config.option.xtracr_realcamera.classicAdjustMode": "Ayarlama Modu", - "config.option.xtracr_realcamera.scale": "Ölçek", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Bağlama Sonucu Saklama Kareleri", "config.option.xtracr_realcamera.cameraOffset": "Kamera %s Ofseti", "config.option.xtracr_realcamera.centerOffset": "Dönüş Merkezi %s Ofseti", - "config.option.xtracr_realcamera.pitch": "Pitch", - "config.option.xtracr_realcamera.yaw": "Yaw", - "config.option.xtracr_realcamera.roll": "Roll", - "config.option.xtracr_realcamera.toModelViewScreen": "Detaylı ayarlar için lütfen %s ekranına gidin (açmak için tuş ataması yapılmalıdır)", - "config.option.xtracr_realcamera.screenModifierKey": "%s Ekranı Değiştirici Tuşu", - "config.option.xtracr_realcamera.legacyBindingMode": "Eski Bağlama Modu", - "config.option.xtracr_realcamera.adjustOffset": "Kamera Ofsetini Ayarla", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Bağlama Başarısız Mesajını Gizle", - "config.option.xtracr_realcamera.renderStuckObjects": "Sıkışmış Nesneleri Renderla", - "config.option.xtracr_realcamera.rerenderModel": "Modeli Yeniden Renderla", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Bağlama Sonucu Saklama Kareleri", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Yer Değiştirme Düzgünleştirme Faktörü", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Dönüş Düzgünleştirme Faktörü", - "config.option.xtracr_realcamera.activeConfigIndex": "Aktif Yapılandırma İndeksi", + "config.option.xtracr_realcamera.classicAdjustMode": "Ayarlama Modu", "config.option.xtracr_realcamera.disableConfig": "Yapılandırmayı Devre Dışı Bırak", - "config.option.xtracr_realcamera.disableWhenSneaking": "Eğilirken ana özelliği devre dışı bırak", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Tutarken ana özelliği devre dışı bırak...", + "config.option.xtracr_realcamera.disableRenderItems": "Tutarken renderlamayı devre dışı bırak...", "config.option.xtracr_realcamera.disableWhenCrawling": "Sürünürken ana özelliği devre dışı bırak", + "config.option.xtracr_realcamera.disableWhenSneaking": "Eğilirken ana özelliği devre dışı bırak", "config.option.xtracr_realcamera.disableWhenSwimming": "Yüzerken ana özelliği devre dışı bırak", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Yer Değiştirme Düzgünleştirme Faktörü", + "config.option.xtracr_realcamera.dynamicCrosshair": "Dinamik Nişangah", + "config.option.xtracr_realcamera.enabled": "Mod Etkin", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Bağlama Başarısız Mesajını Gizle", + "config.option.xtracr_realcamera.isClassic": "Klasik Mod", + "config.option.xtracr_realcamera.legacyBindingMode": "Eski Bağlama Modu", "config.option.xtracr_realcamera.outTick": "Yüzme durumundan çıkma gecikmesi (tik cinsinden)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Tutarken ana özelliği devre dışı bırak...", - "config.option.xtracr_realcamera.disableRenderItems": "Tutarken renderlamayı devre dışı bırak...", - "config.tooltip.xtracr_realcamera.isClassic": "Klasik mod yalnızca kameranın konumuna ve dönüşüne basit değişiklikler yapar", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Etkinleştirildiğinde, nişangah oyuncunun görüşünü takip ederek tutarlı vuruş sonuçları sağlar\nJade, WTHIT veya benzeri modlar yüklüyken etkinleştirilmesi önerilir", - "config.tooltip.xtracr_realcamera.renderModel": "Birinci şahıs perspektifinde oyuncu modelini renderla", + "config.option.xtracr_realcamera.pitch": "Pitch", + "config.option.xtracr_realcamera.renderModel": "Oyuncu Modelini Renderla", + "config.option.xtracr_realcamera.renderStuckObjects": "Sıkışmış Nesneleri Renderla", + "config.option.xtracr_realcamera.rerenderModel": "Modeli Yeniden Renderla", + "config.option.xtracr_realcamera.roll": "Roll", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Dönüş Düzgünleştirme Faktörü", + "config.option.xtracr_realcamera.scale": "Ölçek", + "config.option.xtracr_realcamera.screenModifierKey": "%s Ekranı Değiştirici Tuşu", + "config.option.xtracr_realcamera.toModelViewScreen": "Detaylı ayarlar için lütfen %s ekranına gidin (açmak için tuş ataması yapılmalıdır)", + "config.option.xtracr_realcamera.yaw": "Yaw", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Şu anda bağlı yapılandırma indeksi, 0 herhangi bir geçerli yapılandırmaya bağlanmaya izin verir", + "config.tooltip.xtracr_realcamera.adjustOffset": "Ayarlama tuşuna basıldığında, kameranın ofsetini veya dönüşünü ayarlar", "config.tooltip.xtracr_realcamera.adjustStep": "Ayarlama başına adım uzunluğu veya açının 1/100'ü", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Bağlama başarısızlığından sonraki birkaç kare boyunca önceki başarılı bağlama sonucunu kullanmaya devam edin", + "config.tooltip.xtracr_realcamera.cameraRotation": "Derece cinsinden ek kamera dönüşü", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Not: Pitch, yaw ve roll sırasıyla sol, üst ve ön eksenlerdeki dönüşlerdir", + "config.tooltip.xtracr_realcamera.centerOffset": "Dönüş merkezinin baştan ofseti", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Ayarlama tuşuna basıldığında neyin ayarlanacağını belirler", - "config.tooltip.xtracr_realcamera.scale": "Ofsetlerin boyutunu kontrol eder", + "config.tooltip.xtracr_realcamera.classicOffset": "Kameranın dönüş merkezinden ofseti", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Not: oyuncunun ön, üst ve sol tarafı sırasıyla X, Y ve Z eksenleridir", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Üç eşleştirme yöntemi desteklenir:\n1. Joker karakter `*` eşleştirmesi (örneğin, `minecraft:*sword`)\n2. Etiket eşleştirmesi (`#` ile başlar, örneğin `#minecraft:swords`)\n3. Doğrudan öğe kimliği (örneğin, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Kamera yer değiştirme düzgünleştirme faktörü, değer ne kadar yüksekse hareket o kadar pürüzsüz olur", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "Etkinleştirildiğinde, nişangah oyuncunun görüşünü takip ederek tutarlı vuruş sonuçları sağlar\nJade, WTHIT veya benzeri modlar yüklüyken etkinleştirilmesi önerilir", + "config.tooltip.xtracr_realcamera.isClassic": "Klasik mod yalnızca kameranın konumuna ve dönüşüne basit değişiklikler yapar", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Eski sürümün (v0.5) bağlama modu kullanılarak, yalnızca vanilla model ve vanilla model temelli eylemler desteklenir\nÖzellikleri, etkinleştirildiğinde %s ekranının 'LEGACY_MODE' bölümünde ayarlanabilir", - "config.tooltip.xtracr_realcamera.adjustOffset": "Ayarlama tuşuna basıldığında, kameranın ofsetini veya dönüşünü ayarlar", + "config.tooltip.xtracr_realcamera.outTick": "Yüzme durumundan çıktıktan sonra ana özelliği etkinleştirmeden önce geçen süre (1 tik = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "Birinci şahıs perspektifinde oyuncu modelini renderla", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Oyuncunun vücuduna saplanabilen oklar, arı sokmaları ve diğer nesneler", "config.tooltip.xtracr_realcamera.rerenderModel": "Modeli orijinal render zamanında yeniden renderlayarak erken renderlamadan kaynaklanan görsel sorunları önler", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Bağlama başarısızlığından sonraki birkaç kare boyunca önceki başarılı bağlama sonucunu kullanmaya devam edin", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Kamera yer değiştirme düzgünleştirme faktörü, değer ne kadar yüksekse hareket o kadar pürüzsüz olur", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Kamera dönüş düzgünleştirme faktörü, değer ne kadar yüksekse hareket o kadar pürüzsüz olur", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Şu anda bağlı yapılandırma indeksi, 0 herhangi bir geçerli yapılandırmaya bağlanmaya izin verir", - "config.tooltip.xtracr_realcamera.outTick": "Yüzme durumundan çıktıktan sonra ana özelliği etkinleştirmeden önce geçen süre (1 tik = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Üç eşleştirme yöntemi desteklenir:\n1. Joker karakter `*` eşleştirmesi (örneğin, `minecraft:*sword`)\n2. Etiket eşleştirmesi (`#` ile başlar, örneğin `#minecraft:swords`)\n3. Doğrudan öğe kimliği (örneğin, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Ofsetlerin boyutunu kontrol eder", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Sonraki yapılandırmaya geç", + "key.xtracr_realcamera.activeConfigIndexPREV": "Önceki yapılandırmaya geç", + "key.xtracr_realcamera.activeConfigIndexRESET": "Yapılandırma indeksini sıfırla", + "key.xtracr_realcamera.adjustBACK": "ARKAYA Ayarla", + "key.xtracr_realcamera.adjustDOWN": "AŞAĞI Ayarla", + "key.xtracr_realcamera.adjustFRONT": "ÖNE Ayarla", + "key.xtracr_realcamera.adjustLEFT": "SOLA Ayarla", + "key.xtracr_realcamera.adjustRIGHT": "SAĞA Ayarla", + "key.xtracr_realcamera.adjustUP": "YUKARI Ayarla", + "key.xtracr_realcamera.modelViewScreen": "Model Görünüm Ekranını Aç", + "key.xtracr_realcamera.toggleAdjustMode": "Ayarlama Modunu Değiştir", + "key.xtracr_realcamera.toggleCameraMode": "Kamera Modunu Değiştir", + "key.xtracr_realcamera.togglePerspective": "Etkinleştir/Devre Dışı Bırak", "message.xtracr_realcamera.bindingFailed": "[%s]: Bağlama başarısız oldu, lütfen %s ekranına gidin ve manuel olarak yapılandırın (Tuş: %s)", - - "screen.xtracr_realcamera.modelView_title": "Model Görünümü", - "screen.widget.xtracr_realcamera.modelView_import": "İçe Aktar", + "modmenu.descriptionTranslation.realcamera": "Birinci şahıs görünümünde kamerayı daha gerçekçi hale getirir.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Devre dışı bırakıldığında, kameranın modele göre göreceli ilişkisi değişmeyecek, ancak kameranın ilgili özellikleri bu mod tarafından değiştirilmeyecektir", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Kayıtlı Yapılandırmalar", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Tüm devre dışı bırakma ayarlarını kopyala", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Seçili dikdörtgeni sil\n(Veya Sil tuşunu kullanın)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Tüm köşe-ekran mesafelerinin bu değerden küçük olduğu düzlemler render edilmeyecektir", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Devre Dışı Bırakma Ayarları\nGenel devre dışı bırakma ayarları ayarlar ekranındadır", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Mavi kutuların içindeki parçalar devre dışı bırakılacak\nSol tıkla seçin, diğer tuşlarla seçimi iptal edin\n%s+Sol Tık ile fare işaretçisinin gösterdiği parçayı hızlıca seçin", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Devre dışı bırakma ayarının adı", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "İsim boş olamaz!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Doku kimliği boş olamaz!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Mevcut yapılandırmayı panoya dışa aktar", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Dışa aktarma başarısız: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Dışa aktarma başarılı!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Odaklanan Dikdörtgen Numarası\n(0 seçim olmadığı anlamına gelir)\nMevcut odaklanan dikdörtgeni bulmak için Boşluk veya Enter'a basın (Yazarken, bulmak için iki kez basın)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Panodan yapılandırmayı içe aktar", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "İçe aktarma başarısız: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s içe aktarma başarılı!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Panodaki tüm devre dışı bırakma ayarlarını mevcut yapılandırmaya yapıştır\n(Aynı isimdeki mevcut ayarların üzerine yazılmaz)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "Önizleme modunda kameranın çeşitli ofsetlerini ayarlayabilirsiniz", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Bağlama önceliği, değer ne kadar büyükse öncelik o kadar yüksektir ve sağ taraftaki sıralama da o kadar yukarıdadır", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Farklı Kaydet\n(Aynı isimde bir ayar olduğunda, soldaki kaydet düğmesini de kullanabilirsiniz)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Ölçek, ofsetlerin boyutunu kontrol eder", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Sol Tık ile fare işaretçisindeki UV koordinatlarını alın\nAşağıdaki üç UV koordinat seti, yukarıdan aşağıya doğru, ileri vektör, yukarı vektör ve hedef düzlemdeki bağlama noktasının UV koordinatlarıdır\nNot: %s+Kaydırma ile modelin farklı katmanları arasında geçiş yapabilirsiniz. UV koordinatlarını manuel olarak girerek hedef konuma daha hassas bir şekilde bağlanabilirsiniz", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+Sol Tık hızlı seçim modunu belirler\n(%s+Kaydırma ile aralık modundaki seçim aralığını değiştirin)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Yapılandırmanın adı", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "Seçilen modelin doku kimliği (tam kimlik olması gerekmez), kaydederken tanınmasını kolaylaştırmak için kısaltılabilir.\nÖrneğin, minecraft:textures/entity/player/slim/alex.png dosyasını minecraft:textures/entity/player/ olarak kısaltabilirsiniz.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Genel Yapılandırma Ekranını Aç\n(Cloth Config API gerekli)", + "screen.widget.xtracr_realcamera.modelView_all": "Tümü", + "screen.widget.xtracr_realcamera.modelView_configs": "Yapılandırmalar", + "screen.widget.xtracr_realcamera.modelView_copy": "Kopyala", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Mevcut Yapılandırma", + "screen.widget.xtracr_realcamera.modelView_disable": "Devre Dışı Bırak", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Devre Dışı Bırakma Modu", "screen.widget.xtracr_realcamera.modelView_export": "Dışa Aktar", - "screen.widget.xtracr_realcamera.modelView_selecting": "Seçim", "screen.widget.xtracr_realcamera.modelView_forwardVector": "İleri Vektörü", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Yukarı Vektörü", - "screen.widget.xtracr_realcamera.modelView_position": "Hedef Düzlem", - "screen.widget.xtracr_realcamera.modelView_save": "Kaydet", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Devre Dışı Bırakma Modu", - "screen.widget.xtracr_realcamera.modelView_all": "Tümü", - "screen.widget.xtracr_realcamera.modelView_part": "Parça", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Seçim Modu", - "screen.widget.xtracr_realcamera.modelView_single": "Tekli", + "screen.widget.xtracr_realcamera.modelView_import": "İçe Aktar", "screen.widget.xtracr_realcamera.modelView_multiple": "Çoklu", - "screen.widget.xtracr_realcamera.modelView_range": "Aralık", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Kaydırıcıdan Alana Geç", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Alandan Kaydırıcıya Geç", "screen.widget.xtracr_realcamera.modelView_offsetX": "X Ofseti = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Y Ofseti = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z Ofseti = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Parça", + "screen.widget.xtracr_realcamera.modelView_paste": "Yapıştır", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Devre Dışı Bırak", + "screen.widget.xtracr_realcamera.modelView_position": "Hedef Düzlem", "screen.widget.xtracr_realcamera.modelView_preview": "Önizleme", - "screen.widget.xtracr_realcamera.modelView_configs": "Yapılandırmalar", - "screen.widget.xtracr_realcamera.modelView_copy": "Kopyala", - "screen.widget.xtracr_realcamera.modelView_paste": "Yapıştır", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Mevcut Yapılandırma", - "screen.tooltip.xtracr_realcamera.modelView_import": "Panodan yapılandırmayı içe aktar", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s içe aktarma başarılı!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "İçe aktarma başarısız: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Mevcut yapılandırmayı panoya dışa aktar", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Dışa aktarma başarılı!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Dışa aktarma başarısız: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Sol Tık ile fare işaretçisindeki UV koordinatlarını alın\nAşağıdaki üç UV koordinat seti, yukarıdan aşağıya doğru, ileri vektör, yukarı vektör ve hedef düzlemdeki bağlama noktasının UV koordinatlarıdır\nNot: %s+Kaydırma ile modelin farklı katmanları arasında geçiş yapabilirsiniz. UV koordinatlarını manuel olarak girerek hedef konuma daha hassas bir şekilde bağlanabilirsiniz", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "Seçilen modelin doku kimliği (tam kimlik olması gerekmez), kaydederken tanınmasını kolaylaştırmak için kısaltılabilir.\nÖrneğin, minecraft:textures/entity/player/slim/alex.png dosyasını minecraft:textures/entity/player/ olarak kısaltabilirsiniz.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Mavi kutuların içindeki parçalar devre dışı bırakılacak\nSol tıkla seçin, diğer tuşlarla seçimi iptal edin\n%s+Sol Tık ile fare işaretçisinin gösterdiği parçayı hızlıca seçin", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+Sol Tık hızlı seçim modunu belirler\n(%s+Kaydırma ile aralık modundaki seçim aralığını değiştirin)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Odaklanan Dikdörtgen Numarası\n(0 seçim olmadığı anlamına gelir)\nMevcut odaklanan dikdörtgeni bulmak için Boşluk veya Enter'a basın (Yazarken, bulmak için iki kez basın)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Seçili dikdörtgeni sil\n(Veya Sil tuşunu kullanın)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Devre dışı bırakıldığında, kameranın modele göre göreceli ilişkisi değişmeyecek, ancak kameranın ilgili özellikleri bu mod tarafından değiştirilmeyecektir", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Ölçek, ofsetlerin boyutunu kontrol eder", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Tüm köşe-ekran mesafelerinin bu değerden küçük olduğu düzlemler render edilmeyecektir", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Bağlama önceliği, değer ne kadar büyükse öncelik o kadar yüksektir ve sağ taraftaki sıralama da o kadar yukarıdadır", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Yapılandırmanın adı", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Devre Dışı Bırakma Ayarları\nGenel devre dışı bırakma ayarları ayarlar ekranındadır", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Kayıtlı Yapılandırmalar", - "screen.tooltip.xtracr_realcamera.modelView_preview": "Önizleme modunda kameranın çeşitli ofsetlerini ayarlayabilirsiniz", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Genel Yapılandırma Ekranını Aç\n(Cloth Config API gerekli)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Tüm devre dışı bırakma ayarlarını kopyala", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Panodaki tüm devre dışı bırakma ayarlarını mevcut yapılandırmaya yapıştır\n(Aynı isimdeki mevcut ayarların üzerine yazılmaz)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "İsim boş olamaz!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Doku kimliği boş olamaz!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Farklı Kaydet\n(Aynı isimde bir ayar olduğunda, soldaki kaydet düğmesini de kullanabilirsiniz)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Devre dışı bırakma ayarının adı" + "screen.widget.xtracr_realcamera.modelView_range": "Aralık", + "screen.widget.xtracr_realcamera.modelView_roll": "Roll = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Kaydet", + "screen.widget.xtracr_realcamera.modelView_selecting": "Seçim", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Seçim Modu", + "screen.widget.xtracr_realcamera.modelView_single": "Tekli", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Alandan Kaydırıcıya Geç", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Kaydırıcıdan Alana Geç", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Yukarı Vektörü", + "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", + "screen.xtracr_realcamera.modelView_title": "Model Görünümü" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/uk_ua.json b/common/src/main/resources/assets/realcamera/lang/uk_ua.json index 764b0716..aa48b777 100644 --- a/common/src/main/resources/assets/realcamera/lang/uk_ua.json +++ b/common/src/main/resources/assets/realcamera/lang/uk_ua.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "Відкрити Екран Перегляду Моделі", - "key.xtracr_realcamera.togglePerspective": "Увімкнути/Вимкнути", - "key.xtracr_realcamera.activeConfigIndexPREV": "Переключитися на попередню конфігурацію", - "key.xtracr_realcamera.activeConfigIndexNEXT": "Переключитися на наступну конфігурацію", - "key.xtracr_realcamera.activeConfigIndexRESET": "Скинути індекс конфігурації", - "key.xtracr_realcamera.toggleAdjustMode": "Переключити Режим Налаштування", - "key.xtracr_realcamera.toggleCameraMode": "Переключити Режим Камери", - "key.xtracr_realcamera.adjustUP": "Налаштувати ВГОРУ", - "key.xtracr_realcamera.adjustDOWN": "Налаштувати ВНИЗ", - "key.xtracr_realcamera.adjustFRONT": "Налаштувати ВПЕРЕД", - "key.xtracr_realcamera.adjustBACK": "Налаштувати НАЗАД", - "key.xtracr_realcamera.adjustLEFT": "Налаштувати ВЛІВО", - "key.xtracr_realcamera.adjustRIGHT": "Налаштувати ВПРАВО", - "modmenu.descriptionTranslation.realcamera": "Зробити камеру більш реалістичною в режимі від першої особи.", - - "config.category.xtracr_realcamera.general": "Основні", "config.category.xtracr_realcamera.binding": "Режим Прив'язки", - "config.category.xtracr_realcamera.classic": "Класичний Режим", "config.category.xtracr_realcamera.cameraOffset": "Зміщення Камери", - "config.category.xtracr_realcamera.centerOffset": "Зміщення Центру Обертання", "config.category.xtracr_realcamera.cameraRotation": "Обертання Камери", - "config.tooltip.xtracr_realcamera.classicOffset": "Зміщення камери від центру обертання", - "config.tooltip.xtracr_realcamera.classicOffset_n": "Примітка: передня, верхня та ліва сторони гравця відповідають осям X, Y та Z", - "config.tooltip.xtracr_realcamera.centerOffset": "Зміщення центру обертання від голови", - "config.tooltip.xtracr_realcamera.cameraRotation": "Додаткове обертання камери в градусах", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "Примітка: тангаж, рискання та крен - це обертання навколо лівої, верхньої та передньої осей відповідно", - - "config.option.xtracr_realcamera.enabled": "Мод Увімкнено", - "config.option.xtracr_realcamera.isClassic": "Класичний Режим", - "config.option.xtracr_realcamera.dynamicCrosshair": "Динамічний Приціл", - "config.option.xtracr_realcamera.renderModel": "Відображати Модель Гравця", + "config.category.xtracr_realcamera.centerOffset": "Зміщення Центру Обертання", + "config.category.xtracr_realcamera.classic": "Класичний Режим", + "config.category.xtracr_realcamera.general": "Основні", + "config.option.xtracr_realcamera.activeConfigIndex": "Активний індекс конфігурації", + "config.option.xtracr_realcamera.adjustOffset": "Налаштувати Зміщення Камери", "config.option.xtracr_realcamera.adjustStep": "Крок Налаштування", - "config.option.xtracr_realcamera.classicAdjustMode": "Режим Налаштування", - "config.option.xtracr_realcamera.scale": "Масштаб", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадри збереження результату прив'язки", "config.option.xtracr_realcamera.cameraOffset": "Зміщення Камери %s", "config.option.xtracr_realcamera.centerOffset": "Зміщення Центру Обертання %s", - "config.option.xtracr_realcamera.pitch": "Тангаж", - "config.option.xtracr_realcamera.yaw": "Рискання", - "config.option.xtracr_realcamera.roll": "Крен", - "config.option.xtracr_realcamera.toModelViewScreen": "Для детальних налаштувань перейдіть на екран %s (необхідно призначити клавішу для відкриття)", - "config.option.xtracr_realcamera.screenModifierKey": "Клавіша-модифікатор екрану %s", - "config.option.xtracr_realcamera.legacyBindingMode": "Режим Застарілої Прив'язки", - "config.option.xtracr_realcamera.adjustOffset": "Налаштувати Зміщення Камери", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "Приховувати повідомлення про невдалу прив'язку", - "config.option.xtracr_realcamera.renderStuckObjects": "Відображати Застряглі Об'єкти", - "config.option.xtracr_realcamera.rerenderModel": "Перемалювати Модель", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "Кадри збереження результату прив'язки", - "config.option.xtracr_realcamera.displacementSmoothFactor": "Коефіцієнт згладжування зміщення", - "config.option.xtracr_realcamera.rotationSmoothFactor": "Коефіцієнт згладжування обертання", - "config.option.xtracr_realcamera.activeConfigIndex": "Активний індекс конфігурації", + "config.option.xtracr_realcamera.classicAdjustMode": "Режим Налаштування", "config.option.xtracr_realcamera.disableConfig": "Вимкнути Конфігурацію", - "config.option.xtracr_realcamera.disableWhenSneaking": "Вимкнути основну функцію при крадіжці", + "config.option.xtracr_realcamera.disableMainFeatureItems": "Вимкнути основну функцію при триманні...", + "config.option.xtracr_realcamera.disableRenderItems": "Вимкнути відображення при триманні...", "config.option.xtracr_realcamera.disableWhenCrawling": "Вимкнути основну функцію при повзанні", + "config.option.xtracr_realcamera.disableWhenSneaking": "Вимкнути основну функцію при крадіжці", "config.option.xtracr_realcamera.disableWhenSwimming": "Вимкнути основну функцію при плаванні", + "config.option.xtracr_realcamera.displacementSmoothFactor": "Коефіцієнт згладжування зміщення", + "config.option.xtracr_realcamera.dynamicCrosshair": "Динамічний Приціл", + "config.option.xtracr_realcamera.enabled": "Мод Увімкнено", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "Приховувати повідомлення про невдалу прив'язку", + "config.option.xtracr_realcamera.isClassic": "Класичний Режим", + "config.option.xtracr_realcamera.legacyBindingMode": "Режим Застарілої Прив'язки", "config.option.xtracr_realcamera.outTick": "Затримка виходу зі стану плавання (у тіках)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "Вимкнути основну функцію при триманні...", - "config.option.xtracr_realcamera.disableRenderItems": "Вимкнути відображення при триманні...", - "config.tooltip.xtracr_realcamera.isClassic": "Класичний режим вносить лише прості зміни в положення та обертання камери", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "При ввімкненні приціл слідуватиме за поглядом гравця, забезпечуючи точне попадання\nРекомендується ввімкнути при встановленні Jade, WTHIT або подібних модів", - "config.tooltip.xtracr_realcamera.renderModel": "Відображати модель гравця в режимі від першої особи", + "config.option.xtracr_realcamera.pitch": "Тангаж", + "config.option.xtracr_realcamera.renderModel": "Відображати Модель Гравця", + "config.option.xtracr_realcamera.renderStuckObjects": "Відображати Застряглі Об'єкти", + "config.option.xtracr_realcamera.rerenderModel": "Перемалювати Модель", + "config.option.xtracr_realcamera.roll": "Крен", + "config.option.xtracr_realcamera.rotationSmoothFactor": "Коефіцієнт згладжування обертання", + "config.option.xtracr_realcamera.scale": "Масштаб", + "config.option.xtracr_realcamera.screenModifierKey": "Клавіша-модифікатор екрану %s", + "config.option.xtracr_realcamera.toModelViewScreen": "Для детальних налаштувань перейдіть на екран %s (необхідно призначити клавішу для відкриття)", + "config.option.xtracr_realcamera.yaw": "Рискання", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "Поточний індекс прив'язаної конфігурації, 0 означає дозвіл прив'язки до будь-якої допустимої конфігурації", + "config.tooltip.xtracr_realcamera.adjustOffset": "При натисканні клавіші налаштування, регулювати зміщення або обертання камери", "config.tooltip.xtracr_realcamera.adjustStep": "Довжина або 1/100 кута налаштування за крок", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Протягом кількох кадрів після невдалої прив'язки продовжувати використовувати попередній успішний результат прив'язки", + "config.tooltip.xtracr_realcamera.cameraRotation": "Додаткове обертання камери в градусах", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "Примітка: тангаж, рискання та крен - це обертання навколо лівої, верхньої та передньої осей відповідно", + "config.tooltip.xtracr_realcamera.centerOffset": "Зміщення центру обертання від голови", "config.tooltip.xtracr_realcamera.classicAdjustMode": "Визначає, що налаштовувати при натисканні клавіші налаштування", - "config.tooltip.xtracr_realcamera.scale": "Контролювати розмір зміщень", + "config.tooltip.xtracr_realcamera.classicOffset": "Зміщення камери від центру обертання", + "config.tooltip.xtracr_realcamera.classicOffset_n": "Примітка: передня, верхня та ліва сторони гравця відповідають осям X, Y та Z", + "config.tooltip.xtracr_realcamera.disableRenderItems": "Підтримуються три методи співставлення:\n1. Співставлення з підстановковим знаком `*` (наприклад, `minecraft:*sword`)\n2. Співставлення за тегами (починається з `#`, наприклад, `#minecraft:swords`)\n3. Прямий ID предмета (наприклад, `minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Коефіцієнт згладжування зміщення камери, чим вище значення, тим плавніший рух", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "При ввімкненні приціл слідуватиме за поглядом гравця, забезпечуючи точне попадання\nРекомендується ввімкнути при встановленні Jade, WTHIT або подібних модів", + "config.tooltip.xtracr_realcamera.isClassic": "Класичний режим вносить лише прості зміни в положення та обертання камери", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Використовує режим прив'язки застарілої версії (v0.5), підтримуються лише стандартні моделі та дії на їх основі\nПісля ввімкнення властивості можна налаштувати в 'LEGACY_MODE' екрані %s", - "config.tooltip.xtracr_realcamera.adjustOffset": "При натисканні клавіші налаштування, регулювати зміщення або обертання камери", + "config.tooltip.xtracr_realcamera.outTick": "Час перед ввімкненням основної функції після виходу зі стану плавання (1 тік = 0.05с)", + "config.tooltip.xtracr_realcamera.renderModel": "Відображати модель гравця в режимі від першої особи", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Стріли, жала бджіл та інші об'єкти, які можуть застрягти в тілі гравця", "config.tooltip.xtracr_realcamera.rerenderModel": "Перемальовувати модель у вихідний час рендерингу, щоб уникнути візуальних проблем, викликаних раннім рендерингом", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "Протягом кількох кадрів після невдалої прив'язки продовжувати використовувати попередній успішний результат прив'язки", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "Коефіцієнт згладжування зміщення камери, чим вище значення, тим плавніший рух", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Коефіцієнт згладжування обертання камери, чим вище значення, тим плавніший рух", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "Поточний індекс прив'язаної конфігурації, 0 означає дозвіл прив'язки до будь-якої допустимої конфігурації", - "config.tooltip.xtracr_realcamera.outTick": "Час перед ввімкненням основної функції після виходу зі стану плавання (1 тік = 0.05с)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "Підтримуються три методи співставлення:\n1. Співставлення з підстановковим знаком `*` (наприклад, `minecraft:*sword`)\n2. Співставлення за тегами (починається з `#`, наприклад, `#minecraft:swords`)\n3. Прямий ID предмета (наприклад, `minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "Контролювати розмір зміщень", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "Переключитися на наступну конфігурацію", + "key.xtracr_realcamera.activeConfigIndexPREV": "Переключитися на попередню конфігурацію", + "key.xtracr_realcamera.activeConfigIndexRESET": "Скинути індекс конфігурації", + "key.xtracr_realcamera.adjustBACK": "Налаштувати НАЗАД", + "key.xtracr_realcamera.adjustDOWN": "Налаштувати ВНИЗ", + "key.xtracr_realcamera.adjustFRONT": "Налаштувати ВПЕРЕД", + "key.xtracr_realcamera.adjustLEFT": "Налаштувати ВЛІВО", + "key.xtracr_realcamera.adjustRIGHT": "Налаштувати ВПРАВО", + "key.xtracr_realcamera.adjustUP": "Налаштувати ВГОРУ", + "key.xtracr_realcamera.modelViewScreen": "Відкрити Екран Перегляду Моделі", + "key.xtracr_realcamera.toggleAdjustMode": "Переключити Режим Налаштування", + "key.xtracr_realcamera.toggleCameraMode": "Переключити Режим Камери", + "key.xtracr_realcamera.togglePerspective": "Увімкнути/Вимкнути", "message.xtracr_realcamera.bindingFailed": "[%s]: Помилка прив'язки, будь ласка, перейдіть на екран %s та налаштуйте вручну (Клавіша: %s)", - - "screen.xtracr_realcamera.modelView_title": "Перегляд Моделі", - "screen.widget.xtracr_realcamera.modelView_import": "Імпорт", + "modmenu.descriptionTranslation.realcamera": "Зробити камеру більш реалістичною в режимі від першої особи.", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "При вимкненні відносне положення камери до моделі не зміниться, але відповідні атрибути камери не будуть змінені цим модом", + "screen.tooltip.xtracr_realcamera.modelView_configs": "Збережені конфігурації", + "screen.tooltip.xtracr_realcamera.modelView_copy": "Копіювати всі налаштування вимкнення", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Видалити вибраний прямокутник\n(Або використовуйте клавішу Delete)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "Площини, де всі відстані від вершини до екрану менші за це значення, не будуть відображатися", + "screen.tooltip.xtracr_realcamera.modelView_disable": "Налаштування вимкнення\nГлобальні налаштування вимкнення знаходяться на екрані конфігурації", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Частини, що містяться в синіх рамках, будуть вимкнені\nЛівий клік для вибору, інші клавіші для скасування вибору\n%s+Лівий клік для швидкого вибору частини, на яку вказує курсор миші", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Ім'я налаштування вимкнення", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Ім'я не може бути порожнім!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Ідентифікатор текстури не може бути порожнім!", + "screen.tooltip.xtracr_realcamera.modelView_export": "Експортувати поточну конфігурацію в буфер обміну", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Помилка експорту: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Експорт успішний!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Номер виділеного прямокутника\n(0 означає відсутність вибору)\nНатисніть Пробіл або Enter щоб знайти поточний виділений прямокутник (При вводі натисніть двічі щоб знайти)", + "screen.tooltip.xtracr_realcamera.modelView_import": "Імпортувати конфігурацію з буфера обміну", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Помилка імпорту: \n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпорт %s успішний!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "Вставити всі налаштування вимкнення з буфера обміну в поточну конфігурацію\n(Не перезапише існуючі налаштування з тим же ім'ям)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "У режимі попереднього перегляду ви можете налаштувати зміщення та обертання камери", + "screen.tooltip.xtracr_realcamera.modelView_priority": "Пріоритет при прив'язці: чим більше значення, тим вищий пріоритет і вище сортування на правій стороні", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Зберегти як\n(При наявності налаштування з тим же ім'ям ви також можете використовувати кнопку збереження зліва)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "Масштаб, який контролює розмір зміщень", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Лівий клік щоб отримати UV-координати в місці вказівника миші\nТри набори UV-координат нижче, зверху вниз, це UV-координати вектора напрямку, вектора вгору та точки прив'язки на цільовій площині\nПримітка: %s+Прокрутка для перемикання між різними шарами моделі. Ручний ввід UV-координат дозволяє точніше прив'язатися до цільової позиції", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Визначає режим швидкого вибору %s+Лівий клік\n(%s+Прокрутка для зміни діапазону вибору в режимі діапазону)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "Ім'я конфігурації", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "Ідентифікатор текстури обраної моделі (не обов'язково повний ідентифікатор), може бути скорочений при збереженні для зручності розпізнавання.\nНаприклад, скоротити minecraft:textures/entity/player/slim/alex.png до minecraft:textures/entity/player/.", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Відкрити глобальний екран конфігурації\n(Потрібен Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "Усе", + "screen.widget.xtracr_realcamera.modelView_configs": "Конфігурації", + "screen.widget.xtracr_realcamera.modelView_copy": "Копіювати", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "Поточна Конфігурація", + "screen.widget.xtracr_realcamera.modelView_disable": "Вимкнути", + "screen.widget.xtracr_realcamera.modelView_disableMode": "Режим вимкнення", "screen.widget.xtracr_realcamera.modelView_export": "Експорт", - "screen.widget.xtracr_realcamera.modelView_selecting": "Вибір", "screen.widget.xtracr_realcamera.modelView_forwardVector": "Вектор напрямку", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектор вгору", - "screen.widget.xtracr_realcamera.modelView_position": "Цільова площина", - "screen.widget.xtracr_realcamera.modelView_save": "Зберегти", - "screen.widget.xtracr_realcamera.modelView_disableMode": "Режим вимкнення", - "screen.widget.xtracr_realcamera.modelView_all": "Усе", - "screen.widget.xtracr_realcamera.modelView_part": "Частина", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "Режим вибору", - "screen.widget.xtracr_realcamera.modelView_single": "Одиночний", + "screen.widget.xtracr_realcamera.modelView_import": "Імпорт", "screen.widget.xtracr_realcamera.modelView_multiple": "Множинний", - "screen.widget.xtracr_realcamera.modelView_range": "Діапазон", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Переключити повзунок у поле", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Переключити поле у повзунок", "screen.widget.xtracr_realcamera.modelView_offsetX": "Зміщення X = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Зміщення Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Зміщення Z = %s", + "screen.widget.xtracr_realcamera.modelView_part": "Частина", + "screen.widget.xtracr_realcamera.modelView_paste": "Вставити", "screen.widget.xtracr_realcamera.modelView_pitch": "Тангаж = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "Рискання = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "Крен = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "Вимкнути", + "screen.widget.xtracr_realcamera.modelView_position": "Цільова площина", "screen.widget.xtracr_realcamera.modelView_preview": "Попередній перегляд", - "screen.widget.xtracr_realcamera.modelView_configs": "Конфігурації", - "screen.widget.xtracr_realcamera.modelView_copy": "Копіювати", - "screen.widget.xtracr_realcamera.modelView_paste": "Вставити", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "Поточна Конфігурація", - "screen.tooltip.xtracr_realcamera.modelView_import": "Імпортувати конфігурацію з буфера обміну", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпорт %s успішний!", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Помилка імпорту: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_export": "Експортувати поточну конфігурацію в буфер обміну", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "Експорт успішний!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "Помилка експорту: \n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Лівий клік щоб отримати UV-координати в місці вказівника миші\nТри набори UV-координат нижче, зверху вниз, це UV-координати вектора напрямку, вектора вгору та точки прив'язки на цільовій площині\nПримітка: %s+Прокрутка для перемикання між різними шарами моделі. Ручний ввід UV-координат дозволяє точніше прив'язатися до цільової позиції", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "Ідентифікатор текстури обраної моделі (не обов'язково повний ідентифікатор), може бути скорочений при збереженні для зручності розпізнавання.\nНаприклад, скоротити minecraft:textures/entity/player/slim/alex.png до minecraft:textures/entity/player/.", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "Частини, що містяться в синіх рамках, будуть вимкнені\nЛівий клік для вибору, інші клавіші для скасування вибору\n%s+Лівий клік для швидкого вибору частини, на яку вказує курсор миші", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Визначає режим швидкого вибору %s+Лівий клік\n(%s+Прокрутка для зміни діапазону вибору в режимі діапазону)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "Номер виділеного прямокутника\n(0 означає відсутність вибору)\nНатисніть Пробіл або Enter щоб знайти поточний виділений прямокутник (При вводі натисніть двічі щоб знайти)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Видалити вибраний прямокутник\n(Або використовуйте клавішу Delete)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "При вимкненні відносне положення камери до моделі не зміниться, але відповідні атрибути камери не будуть змінені цим модом", - "screen.tooltip.xtracr_realcamera.modelView_scale": "Масштаб, який контролює розмір зміщень", - "screen.tooltip.xtracr_realcamera.modelView_depth": "Площини, де всі відстані від вершини до екрану менші за це значення, не будуть відображатися", - "screen.tooltip.xtracr_realcamera.modelView_priority": "Пріоритет при прив'язці: чим більше значення, тим вищий пріоритет і вище сортування на правій стороні", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "Ім'я конфігурації", - "screen.tooltip.xtracr_realcamera.modelView_disable": "Налаштування вимкнення\nГлобальні налаштування вимкнення знаходяться на екрані конфігурації", - "screen.tooltip.xtracr_realcamera.modelView_configs": "Збережені конфігурації", - "screen.tooltip.xtracr_realcamera.modelView_preview": "У режимі попереднього перегляду ви можете налаштувати зміщення та обертання камери", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Відкрити глобальний екран конфігурації\n(Потрібен Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Копіювати всі налаштування вимкнення", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Вставити всі налаштування вимкнення з буфера обміну в поточну конфігурацію\n(Не перезапише існуючі налаштування з тим же ім'ям)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "Ім'я не може бути порожнім!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "Ідентифікатор текстури не може бути порожнім!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Зберегти як\n(При наявності налаштування з тим же ім'ям ви також можете використовувати кнопку збереження зліва)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "Ім'я налаштування вимкнення" + "screen.widget.xtracr_realcamera.modelView_range": "Діапазон", + "screen.widget.xtracr_realcamera.modelView_roll": "Крен = %s", + "screen.widget.xtracr_realcamera.modelView_save": "Зберегти", + "screen.widget.xtracr_realcamera.modelView_selecting": "Вибір", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "Режим вибору", + "screen.widget.xtracr_realcamera.modelView_single": "Одиночний", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "Переключити поле у повзунок", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "Переключити повзунок у поле", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектор вгору", + "screen.widget.xtracr_realcamera.modelView_yaw": "Рискання = %s", + "screen.xtracr_realcamera.modelView_title": "Перегляд Моделі" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index d81515cb..4ce465b3 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "打开模型视图界面", - "key.xtracr_realcamera.togglePerspective": "开启/关闭", - "key.xtracr_realcamera.activeConfigIndexPREV": "切换到上一个配置", - "key.xtracr_realcamera.activeConfigIndexNEXT": "切换到下一个配置", - "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", - "key.xtracr_realcamera.toggleAdjustMode": "切换调整模式", - "key.xtracr_realcamera.toggleCameraMode": "切换摄像头模式", - "key.xtracr_realcamera.adjustUP": "向上调整", - "key.xtracr_realcamera.adjustDOWN": "向下调整", - "key.xtracr_realcamera.adjustFRONT": "向前调整", - "key.xtracr_realcamera.adjustBACK": "向后调整", - "key.xtracr_realcamera.adjustLEFT": "向左调整", - "key.xtracr_realcamera.adjustRIGHT": "向右调整", - "modmenu.descriptionTranslation.realcamera": "使第一人称视角下的摄像头更加真实。", - - "config.category.xtracr_realcamera.general": "通用", "config.category.xtracr_realcamera.binding": "绑定模式", - "config.category.xtracr_realcamera.classic": "经典模式", "config.category.xtracr_realcamera.cameraOffset": "摄像头偏移", - "config.category.xtracr_realcamera.centerOffset": "旋转中心偏移", "config.category.xtracr_realcamera.cameraRotation": "摄像头旋转", - "config.tooltip.xtracr_realcamera.classicOffset": "摄像头相对旋转中心的偏移值", - "config.tooltip.xtracr_realcamera.classicOffset_n": "注:玩家的的前方、上方和左方分别为X、Y和Z轴", - "config.tooltip.xtracr_realcamera.centerOffset": "旋转中心相对头部的偏移值", - "config.tooltip.xtracr_realcamera.cameraRotation": "额外的摄像头旋转角度", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "注:俯仰、偏航和翻滚分别是以左方、上方和前方为轴的旋转", - - "config.option.xtracr_realcamera.enabled": "开启功能", - "config.option.xtracr_realcamera.isClassic": "经典模式", - "config.option.xtracr_realcamera.dynamicCrosshair": "动态十字准心", - "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", + "config.category.xtracr_realcamera.centerOffset": "旋转中心偏移", + "config.category.xtracr_realcamera.classic": "经典模式", + "config.category.xtracr_realcamera.general": "通用", + "config.option.xtracr_realcamera.activeConfigIndex": "当前配置索引", + "config.option.xtracr_realcamera.adjustOffset": "调整摄像头偏移", "config.option.xtracr_realcamera.adjustStep": "调整步长", - "config.option.xtracr_realcamera.classicAdjustMode": "调整模式", - "config.option.xtracr_realcamera.scale": "缩放比例", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "绑定结果保留帧数", "config.option.xtracr_realcamera.cameraOffset": "摄像头%s偏移", "config.option.xtracr_realcamera.centerOffset": "旋转中心%s偏移", - "config.option.xtracr_realcamera.pitch": "俯仰角", - "config.option.xtracr_realcamera.yaw": "偏航角", - "config.option.xtracr_realcamera.roll": "翻滚角", - "config.option.xtracr_realcamera.toModelViewScreen": "详细设置请前往%s界面(需设置快捷键来打开它)", - "config.option.xtracr_realcamera.screenModifierKey": "%s界面修饰键", - "config.option.xtracr_realcamera.legacyBindingMode": "旧绑定模式", - "config.option.xtracr_realcamera.adjustOffset": "调整摄像头偏移", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "隐藏绑定失败消息", - "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物体", - "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "绑定结果保留帧数", - "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑系数", - "config.option.xtracr_realcamera.rotationSmoothFactor": "旋转平滑系数", - "config.option.xtracr_realcamera.activeConfigIndex": "当前配置索引", + "config.option.xtracr_realcamera.classicAdjustMode": "调整模式", "config.option.xtracr_realcamera.disableConfig": "禁用配置", - "config.option.xtracr_realcamera.disableWhenSneaking": "潜行时禁用主要功能", + "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...时禁用主要功能", + "config.option.xtracr_realcamera.disableRenderItems": "在手持...时禁用渲染", "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSneaking": "潜行时禁用主要功能", "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", + "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑系数", + "config.option.xtracr_realcamera.dynamicCrosshair": "动态十字准心", + "config.option.xtracr_realcamera.enabled": "开启功能", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "隐藏绑定失败消息", + "config.option.xtracr_realcamera.isClassic": "经典模式", + "config.option.xtracr_realcamera.legacyBindingMode": "旧绑定模式", "config.option.xtracr_realcamera.outTick": "禁用状态退出延迟(单位:tick)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...时禁用主要功能", - "config.option.xtracr_realcamera.disableRenderItems": "在手持...时禁用渲染", - "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在开启状态下,十字准心会随着玩家的视线移动,确保命中结果不受影响\n在安装了Jade、WTHIT或类似模组时建议启用", - "config.tooltip.xtracr_realcamera.renderModel": "在第一人称视角下渲染玩家模型", + "config.option.xtracr_realcamera.pitch": "俯仰角", + "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", + "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物体", + "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", + "config.option.xtracr_realcamera.roll": "翻滚角", + "config.option.xtracr_realcamera.rotationSmoothFactor": "旋转平滑系数", + "config.option.xtracr_realcamera.scale": "缩放比例", + "config.option.xtracr_realcamera.screenModifierKey": "%s界面修饰键", + "config.option.xtracr_realcamera.toModelViewScreen": "详细设置请前往%s界面(需设置快捷键来打开它)", + "config.option.xtracr_realcamera.yaw": "偏航角", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "当前绑定的配置索引,0表示允许绑定任何有效配置", + "config.tooltip.xtracr_realcamera.adjustOffset": "当前按下调整键时是调整摄像头的偏移还是旋转", "config.tooltip.xtracr_realcamera.adjustStep": "每步调整的角度的1/100或长度", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在绑定失败后的数帧内,沿用上个成功的绑定结果", + "config.tooltip.xtracr_realcamera.cameraRotation": "额外的摄像头旋转角度", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "注:俯仰、偏航和翻滚分别是以左方、上方和前方为轴的旋转", + "config.tooltip.xtracr_realcamera.centerOffset": "旋转中心相对头部的偏移值", "config.tooltip.xtracr_realcamera.classicAdjustMode": "决定当前按下调整键时调整哪一个", - "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", + "config.tooltip.xtracr_realcamera.classicOffset": "摄像头相对旋转中心的偏移值", + "config.tooltip.xtracr_realcamera.classicOffset_n": "注:玩家的的前方、上方和左方分别为X、Y和Z轴", + "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三种匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 标签匹配以`#`开头(如`#minecraft:swords`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相机位移平滑系数,值越大越平滑", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在开启状态下,十字准心会随着玩家的视线移动,确保命中结果不受影响\n在安装了Jade、WTHIT或类似模组时建议启用", + "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", "config.tooltip.xtracr_realcamera.legacyBindingMode": "使用旧版本(v0.5)的绑定模式,仅支持原版模型和基于原版模型的动作\n开启后可在%s界面的'LEGACY_MODE'中设置属性", - "config.tooltip.xtracr_realcamera.adjustOffset": "当前按下调整键时是调整摄像头的偏移还是旋转", + "config.tooltip.xtracr_realcamera.outTick": "玩家停止某些状态(如游泳、爬行)后重启主要功能的时间(1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.renderModel": "在第一人称视角下渲染玩家模型", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它会卡在玩家身体里的物体", "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染时机重新渲染模型,以避免一些因提前渲染导致的视觉问题", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在绑定失败后的数帧内,沿用上个成功的绑定结果", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相机位移平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相机旋转平滑系数,值越大越平滑", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "当前绑定的配置索引,0表示允许绑定任何有效配置", - "config.tooltip.xtracr_realcamera.outTick": "玩家停止某些状态(如游泳、爬行)后重启主要功能的时间(1 tick = 0.05s)", - "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三种匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 标签匹配以`#`开头(如`#minecraft:swords`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切换到下一个配置", + "key.xtracr_realcamera.activeConfigIndexPREV": "切换到上一个配置", + "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", + "key.xtracr_realcamera.adjustBACK": "向后调整", + "key.xtracr_realcamera.adjustDOWN": "向下调整", + "key.xtracr_realcamera.adjustFRONT": "向前调整", + "key.xtracr_realcamera.adjustLEFT": "向左调整", + "key.xtracr_realcamera.adjustRIGHT": "向右调整", + "key.xtracr_realcamera.adjustUP": "向上调整", + "key.xtracr_realcamera.modelViewScreen": "打开模型视图界面", + "key.xtracr_realcamera.toggleAdjustMode": "切换调整模式", + "key.xtracr_realcamera.toggleCameraMode": "切换摄像头模式", + "key.xtracr_realcamera.togglePerspective": "开启/关闭", "message.xtracr_realcamera.bindingFailed": "[%s]: 绑定失败,请前往%s界面手动设置(键位:%s)", - - "screen.xtracr_realcamera.modelView_title": "模型视图", - "screen.widget.xtracr_realcamera.modelView_import": "导入", + "modmenu.descriptionTranslation.realcamera": "使第一人称视角下的摄像头更加真实。", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "当禁用时,摄像头与模型的相对关系不会变化,但摄像头的对应属性不会被本模组修改", + "screen.tooltip.xtracr_realcamera.modelView_configs": "已保存的配置", + "screen.tooltip.xtracr_realcamera.modelView_copy": "复制所有禁用设置", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "删除选中的矩形\n(或使用Delete键)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "全部顶点到屏幕距离均小于该值的面不会被渲染", + "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用设置\n全局禁用设置在配置屏幕中", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "被蓝框包含的部分会被禁用\n可在左侧材质视图中鼠标左键框选,其它键取消选择\n%s+左键可快速选择被鼠标指针指向的部分", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁用设置的名称", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名称不能为空!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材质id不能为空!", + "screen.tooltip.xtracr_realcamera.modelView_export": "导出当前配置到剪贴板", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "导出失败:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "导出成功!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "选中的矩形编号\n(0表示不选中)\n可通过空格或回车键定位到当前选中的矩形(当正在输入时,按两次即可定位)", + "screen.tooltip.xtracr_realcamera.modelView_import": "从剪贴板导入配置", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "导入失败:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "导入%s成功!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "粘贴剪贴板中的所有禁用设置到当前配置\n(不会覆盖同名设置)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "在预览模式可以调整相机的各个偏移量", + "screen.tooltip.xtracr_realcamera.modelView_priority": "绑定时的优先级,值越大优先级越高,并且在右侧排序越靠上", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "保存为\n(当存在同名设置时,也可使用左侧保存按钮)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "缩放比例,控制偏移量的大小", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左键可获取鼠标指针处的UV坐标\n下方三组UV坐标由上到下依次为向前矢量、向上矢量和目标平面上绑定点的UV坐标\n注:%s键+滚轮可在模型的不同层间切换,手动输入UV坐标可以更加精确地绑定到目标位置", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "决定%s+左键快速选择的模式\n(%s键+滚轮可改变范围模式下的选择范围)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "配置的名称", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "被选中的模型的纹理的id(不是完整的id也可以识别),保存时可以缩短一部分以便于程序识别\n比如将minecraft:textures/entity/player/slim/alex.png缩短为minecraft:textures/entity/player/", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打开全局配置屏幕\n(需要安装Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "全部", + "screen.widget.xtracr_realcamera.modelView_configs": "配置", + "screen.widget.xtracr_realcamera.modelView_copy": "复制", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "当前配置", + "screen.widget.xtracr_realcamera.modelView_disable": "禁用", + "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", "screen.widget.xtracr_realcamera.modelView_export": "导出", - "screen.widget.xtracr_realcamera.modelView_selecting": "选择", "screen.widget.xtracr_realcamera.modelView_forwardVector": "向前矢量", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上矢量", - "screen.widget.xtracr_realcamera.modelView_position": "目标平面", - "screen.widget.xtracr_realcamera.modelView_save": "保存", - "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", - "screen.widget.xtracr_realcamera.modelView_all": "全部", - "screen.widget.xtracr_realcamera.modelView_part": "部分", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "选择模式", - "screen.widget.xtracr_realcamera.modelView_single": "单选", + "screen.widget.xtracr_realcamera.modelView_import": "导入", "screen.widget.xtracr_realcamera.modelView_multiple": "多选", - "screen.widget.xtracr_realcamera.modelView_range": "范围", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "切换滑块到输入框", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "切换输入框到滑块", "screen.widget.xtracr_realcamera.modelView_offsetX": "X偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Y偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z偏移量 = %s", + "screen.widget.xtracr_realcamera.modelView_part": "部分", + "screen.widget.xtracr_realcamera.modelView_paste": "粘贴", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰角 = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "翻滚角 = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "禁用", + "screen.widget.xtracr_realcamera.modelView_position": "目标平面", "screen.widget.xtracr_realcamera.modelView_preview": "预览", - "screen.widget.xtracr_realcamera.modelView_configs": "配置", - "screen.widget.xtracr_realcamera.modelView_copy": "复制", - "screen.widget.xtracr_realcamera.modelView_paste": "粘贴", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "当前配置", - "screen.tooltip.xtracr_realcamera.modelView_import": "从剪贴板导入配置", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "导入失败:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "导入%s成功!", - "screen.tooltip.xtracr_realcamera.modelView_export": "导出当前配置到剪贴板", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "导出成功!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "导出失败:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左键可获取鼠标指针处的UV坐标\n下方三组UV坐标由上到下依次为向前矢量、向上矢量和目标平面上绑定点的UV坐标\n注:%s键+滚轮可在模型的不同层间切换,手动输入UV坐标可以更加精确地绑定到目标位置", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "被选中的模型的纹理的id(不是完整的id也可以识别),保存时可以缩短一部分以便于程序识别\n比如将minecraft:textures/entity/player/slim/alex.png缩短为minecraft:textures/entity/player/", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "被蓝框包含的部分会被禁用\n可在左侧材质视图中鼠标左键框选,其它键取消选择\n%s+左键可快速选择被鼠标指针指向的部分", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "决定%s+左键快速选择的模式\n(%s键+滚轮可改变范围模式下的选择范围)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "选中的矩形编号\n(0表示不选中)\n可通过空格或回车键定位到当前选中的矩形(当正在输入时,按两次即可定位)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "删除选中的矩形\n(或使用Delete键)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "当禁用时,摄像头与模型的相对关系不会变化,但摄像头的对应属性不会被本模组修改", - "screen.tooltip.xtracr_realcamera.modelView_scale": "缩放比例,控制偏移量的大小", - "screen.tooltip.xtracr_realcamera.modelView_depth": "全部顶点到屏幕距离均小于该值的面不会被渲染", - "screen.tooltip.xtracr_realcamera.modelView_priority": "绑定时的优先级,值越大优先级越高,并且在右侧排序越靠上", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "配置的名称", - "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用设置\n全局禁用设置在配置屏幕中", - "screen.tooltip.xtracr_realcamera.modelView_configs": "已保存的配置", - "screen.tooltip.xtracr_realcamera.modelView_preview": "在预览模式可以调整相机的各个偏移量", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打开全局配置屏幕\n(需要安装Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "复制所有禁用设置", - "screen.tooltip.xtracr_realcamera.modelView_paste": "粘贴剪贴板中的所有禁用设置到当前配置\n(不会覆盖同名设置)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名称不能为空!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材质id不能为空!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "保存为\n(当存在同名设置时,也可使用左侧保存按钮)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁用设置的名称" + "screen.widget.xtracr_realcamera.modelView_range": "范围", + "screen.widget.xtracr_realcamera.modelView_roll": "翻滚角 = %s", + "screen.widget.xtracr_realcamera.modelView_save": "保存", + "screen.widget.xtracr_realcamera.modelView_selecting": "选择", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "选择模式", + "screen.widget.xtracr_realcamera.modelView_single": "单选", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "切换输入框到滑块", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "切换滑块到输入框", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上矢量", + "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", + "screen.xtracr_realcamera.modelView_title": "模型视图" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/zh_hk.json b/common/src/main/resources/assets/realcamera/lang/zh_hk.json index 0b23af1c..96053fb9 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_hk.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_hk.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "打開模型視圖界面", - "key.xtracr_realcamera.togglePerspective": "開啟/關閉", - "key.xtracr_realcamera.activeConfigIndexPREV": "切換到上一個配置", - "key.xtracr_realcamera.activeConfigIndexNEXT": "切換到下一個配置", - "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", - "key.xtracr_realcamera.toggleAdjustMode": "切換調整模式", - "key.xtracr_realcamera.toggleCameraMode": "切換攝像頭模式", - "key.xtracr_realcamera.adjustUP": "向上調整", - "key.xtracr_realcamera.adjustDOWN": "向下調整", - "key.xtracr_realcamera.adjustFRONT": "向前調整", - "key.xtracr_realcamera.adjustBACK": "向後調整", - "key.xtracr_realcamera.adjustLEFT": "向左調整", - "key.xtracr_realcamera.adjustRIGHT": "向右調整", - "modmenu.descriptionTranslation.realcamera": "使第一人稱視角下的攝像頭更加真實。", - - "config.category.xtracr_realcamera.general": "通用", "config.category.xtracr_realcamera.binding": "綁定模式", - "config.category.xtracr_realcamera.classic": "經典模式", "config.category.xtracr_realcamera.cameraOffset": "攝像頭偏移", - "config.category.xtracr_realcamera.centerOffset": "旋轉中心偏移", "config.category.xtracr_realcamera.cameraRotation": "攝像頭旋轉", - "config.tooltip.xtracr_realcamera.classicOffset": "攝像頭相對旋轉中心的偏移值", - "config.tooltip.xtracr_realcamera.classicOffset_n": "注: 玩家的前方、上方和左方分別為X、Y和Z軸", - "config.tooltip.xtracr_realcamera.centerOffset": "旋轉中心相對頭部的偏移值", - "config.tooltip.xtracr_realcamera.cameraRotation": "額外的攝像頭旋轉角度", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "注:俯仰、偏航和翻滾分別是以左方、上方和前方為軸的旋轉", - - "config.option.xtracr_realcamera.enabled": "開啟功能", - "config.option.xtracr_realcamera.isClassic": "經典模式", - "config.option.xtracr_realcamera.dynamicCrosshair": "動態十字準心", - "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", + "config.category.xtracr_realcamera.centerOffset": "旋轉中心偏移", + "config.category.xtracr_realcamera.classic": "經典模式", + "config.category.xtracr_realcamera.general": "通用", + "config.option.xtracr_realcamera.activeConfigIndex": "當前配置索引", + "config.option.xtracr_realcamera.adjustOffset": "調整攝像頭偏移", "config.option.xtracr_realcamera.adjustStep": "調整步長", - "config.option.xtracr_realcamera.classicAdjustMode": "調整模式", - "config.option.xtracr_realcamera.scale": "縮放比例", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留帧数", "config.option.xtracr_realcamera.cameraOffset": "攝像頭%s偏移", "config.option.xtracr_realcamera.centerOffset": "旋轉中心%s偏移", - "config.option.xtracr_realcamera.pitch": "俯仰角", - "config.option.xtracr_realcamera.yaw": "偏航角", - "config.option.xtracr_realcamera.roll": "翻滾角", - "config.option.xtracr_realcamera.toModelViewScreen": "詳細設置請前往%s界面(需設置快捷鍵來打開它)", - "config.option.xtracr_realcamera.screenModifierKey": "%s界面修飾鍵", - "config.option.xtracr_realcamera.legacyBindingMode": "舊綁定模式", - "config.option.xtracr_realcamera.adjustOffset": "調整攝像頭偏移", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱藏綁定失敗消息", - "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物體", - "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留帧数", - "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑係數", - "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑係數", - "config.option.xtracr_realcamera.activeConfigIndex": "當前配置索引", + "config.option.xtracr_realcamera.classicAdjustMode": "調整模式", "config.option.xtracr_realcamera.disableConfig": "禁用配置", - "config.option.xtracr_realcamera.disableWhenSneaking": "潛行时禁用主要功能", + "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...時禁用主要功能", + "config.option.xtracr_realcamera.disableRenderItems": "在手持...時禁用渲染", "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSneaking": "潛行时禁用主要功能", "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", + "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑係數", + "config.option.xtracr_realcamera.dynamicCrosshair": "動態十字準心", + "config.option.xtracr_realcamera.enabled": "開啟功能", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱藏綁定失敗消息", + "config.option.xtracr_realcamera.isClassic": "經典模式", + "config.option.xtracr_realcamera.legacyBindingMode": "舊綁定模式", "config.option.xtracr_realcamera.outTick": "禁用状态退出延迟(单位:tick)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...時禁用主要功能", - "config.option.xtracr_realcamera.disableRenderItems": "在手持...時禁用渲染", - "config.tooltip.xtracr_realcamera.isClassic": "經典模式只對攝像頭的位置和旋轉做簡單的修改", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在開啟狀態下,十字準心會隨著玩家的視線移動,確保命中結果不受影響\n在安裝了Jade、WTHIT或類似模組時建議啟用", - "config.tooltip.xtracr_realcamera.renderModel": "在第一人稱視角下渲染玩家模型", + "config.option.xtracr_realcamera.pitch": "俯仰角", + "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", + "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物體", + "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", + "config.option.xtracr_realcamera.roll": "翻滾角", + "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑係數", + "config.option.xtracr_realcamera.scale": "縮放比例", + "config.option.xtracr_realcamera.screenModifierKey": "%s界面修飾鍵", + "config.option.xtracr_realcamera.toModelViewScreen": "詳細設置請前往%s界面(需設置快捷鍵來打開它)", + "config.option.xtracr_realcamera.yaw": "偏航角", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "當前綁定的配置索引,0表示允許綁定任何有效配置", + "config.tooltip.xtracr_realcamera.adjustOffset": "當前按下調整鍵時是調整攝像頭的偏移還是旋轉", "config.tooltip.xtracr_realcamera.adjustStep": "每步調整的角度1/100或長度", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在綁定失敗的數帧内,沿用上个成功的綁定結果", + "config.tooltip.xtracr_realcamera.cameraRotation": "額外的攝像頭旋轉角度", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "注:俯仰、偏航和翻滾分別是以左方、上方和前方為軸的旋轉", + "config.tooltip.xtracr_realcamera.centerOffset": "旋轉中心相對頭部的偏移值", "config.tooltip.xtracr_realcamera.classicAdjustMode": "決定當前按下調整鍵時調整哪一個", - "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", + "config.tooltip.xtracr_realcamera.classicOffset": "攝像頭相對旋轉中心的偏移值", + "config.tooltip.xtracr_realcamera.classicOffset_n": "注: 玩家的前方、上方和左方分別為X、Y和Z軸", + "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三種匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 標簽匹配`#`開頭(如`#minecraft:tools`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相機位移平滑系数,值越大越平滑", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在開啟狀態下,十字準心會隨著玩家的視線移動,確保命中結果不受影響\n在安裝了Jade、WTHIT或類似模組時建議啟用", + "config.tooltip.xtracr_realcamera.isClassic": "經典模式只對攝像頭的位置和旋轉做簡單的修改", "config.tooltip.xtracr_realcamera.legacyBindingMode": "使用舊版本(v0.5)的綁定模式,僅支援原版模型和基於原版模型的動作\n開啟後可在%s界面的'LEGACY_MODE'中設置屬性", - "config.tooltip.xtracr_realcamera.adjustOffset": "當前按下調整鍵時是調整攝像頭的偏移還是旋轉", + "config.tooltip.xtracr_realcamera.outTick": "玩家停止特定狀態後重啟主要功能的時間(1 tick = 0.05秒)", + "config.tooltip.xtracr_realcamera.renderModel": "在第一人稱視角下渲染玩家模型", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它會卡在玩家身體裡的物體", "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染時機重新渲染模型,以避免一些因提前渲染導致的視覺問題", - "config.tooltip.xtracr_realcamera.outTick": "玩家停止特定狀態後重啟主要功能的時間(1 tick = 0.05秒)", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在綁定失敗的數帧内,沿用上个成功的綁定結果", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相機位移平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相機旋轉平滑系数,值越大越平滑", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "當前綁定的配置索引,0表示允許綁定任何有效配置", - "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三種匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 標簽匹配`#`開頭(如`#minecraft:tools`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切換到下一個配置", + "key.xtracr_realcamera.activeConfigIndexPREV": "切換到上一個配置", + "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", + "key.xtracr_realcamera.adjustBACK": "向後調整", + "key.xtracr_realcamera.adjustDOWN": "向下調整", + "key.xtracr_realcamera.adjustFRONT": "向前調整", + "key.xtracr_realcamera.adjustLEFT": "向左調整", + "key.xtracr_realcamera.adjustRIGHT": "向右調整", + "key.xtracr_realcamera.adjustUP": "向上調整", + "key.xtracr_realcamera.modelViewScreen": "打開模型視圖界面", + "key.xtracr_realcamera.toggleAdjustMode": "切換調整模式", + "key.xtracr_realcamera.toggleCameraMode": "切換攝像頭模式", + "key.xtracr_realcamera.togglePerspective": "開啟/關閉", "message.xtracr_realcamera.bindingFailed": "[%s]: 綁定失敗,請前往%s界面手動設置(鍵位:%s)", - - "screen.xtracr_realcamera.modelView_title": "模型視圖", - "screen.widget.xtracr_realcamera.modelView_import": "導入", + "modmenu.descriptionTranslation.realcamera": "使第一人稱視角下的攝像頭更加真實。", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "當禁用時,攝像頭與模型的相對關係不會變化,但攝像頭的對應屬性不會被本模組修改", + "screen.tooltip.xtracr_realcamera.modelView_configs": "已儲存的配置", + "screen.tooltip.xtracr_realcamera.modelView_copy": "複製所有禁用設置", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "刪除選中的矩形\n(或使用Delete鍵)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "全部頂點到屏幕距離均小於該值的面不會被渲染", + "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用設置\n全局禁用設置在配置屏幕中", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "被藍框包含的部分會被禁用\n可在左側材質視圖中鼠標左鍵框選,其它鍵取消選擇\n左Alt+左鍵可快速選擇被鼠標指針指向的部分", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁用設置的名稱", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名稱不能為空!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材質id不能為空!", + "screen.tooltip.xtracr_realcamera.modelView_export": "導出當前配置到剪貼簿", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "導出失敗:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "導出成功!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "選中的矩形編號\n(0表示不選中)\n可通過空格或回車鍵定位到當前選中的矩形(當正在輸入時,按兩次即可定位)", + "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "貼上剪貼簿中的所有禁用設置到當前配置\n(不會覆蓋同名設置)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", + "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放比例,控制偏移量的大小", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "左Alt+左鍵可獲取鼠標指針處的UV座標\n下方三組UV座標由上到下依次為向前向量、向上向量和目標平面上綁定點的UV座標\n註:左Alt鍵+滾輪可在模型的不同層間切換,手動輸入UV座標可以更加精確地綁定到目標位置", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "決定左Alt+左鍵快速選擇的模式\n(左Alt鍵+滾輪可改變範圍模式下的選擇範圍)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "配置的名稱", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "被選中的模型的紋理的id(不是完整的id也可以識別),儲存時可以縮短一部分以便於程序識別\n比如將minecraft:textures/entity/player/slim/alex.png縮短為minecraft:textures/entity/player/", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打開全局配置屏幕\n(需要安裝Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "全部", + "screen.widget.xtracr_realcamera.modelView_configs": "配置", + "screen.widget.xtracr_realcamera.modelView_copy": "複製", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", + "screen.widget.xtracr_realcamera.modelView_disable": "禁用", + "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", "screen.widget.xtracr_realcamera.modelView_export": "導出", - "screen.widget.xtracr_realcamera.modelView_selecting": "選擇", "screen.widget.xtracr_realcamera.modelView_forwardVector": "向前向量", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上向量", - "screen.widget.xtracr_realcamera.modelView_position": "目標平面", - "screen.widget.xtracr_realcamera.modelView_save": "儲存", - "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", - "screen.widget.xtracr_realcamera.modelView_all": "全部", - "screen.widget.xtracr_realcamera.modelView_part": "部分", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "選擇模式", - "screen.widget.xtracr_realcamera.modelView_single": "單選", + "screen.widget.xtracr_realcamera.modelView_import": "導入", "screen.widget.xtracr_realcamera.modelView_multiple": "多選", - "screen.widget.xtracr_realcamera.modelView_range": "範圍", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "切換滑塊到輸入框", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "切換輸入框到滑塊", "screen.widget.xtracr_realcamera.modelView_offsetX": "X偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Y偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z偏移量 = %s", + "screen.widget.xtracr_realcamera.modelView_part": "部分", + "screen.widget.xtracr_realcamera.modelView_paste": "貼上", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰角 = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "翻滾角 = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "禁用", + "screen.widget.xtracr_realcamera.modelView_position": "目標平面", "screen.widget.xtracr_realcamera.modelView_preview": "預覽", - "screen.widget.xtracr_realcamera.modelView_configs": "配置", - "screen.widget.xtracr_realcamera.modelView_copy": "複製", - "screen.widget.xtracr_realcamera.modelView_paste": "貼上", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", - "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", - "screen.tooltip.xtracr_realcamera.modelView_export": "導出當前配置到剪貼簿", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "導出成功!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "導出失敗:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "左Alt+左鍵可獲取鼠標指針處的UV座標\n下方三組UV座標由上到下依次為向前向量、向上向量和目標平面上綁定點的UV座標\n註:左Alt鍵+滾輪可在模型的不同層間切換,手動輸入UV座標可以更加精確地綁定到目標位置", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "被選中的模型的紋理的id(不是完整的id也可以識別),儲存時可以縮短一部分以便於程序識別\n比如將minecraft:textures/entity/player/slim/alex.png縮短為minecraft:textures/entity/player/", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "被藍框包含的部分會被禁用\n可在左側材質視圖中鼠標左鍵框選,其它鍵取消選擇\n左Alt+左鍵可快速選擇被鼠標指針指向的部分", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "決定左Alt+左鍵快速選擇的模式\n(左Alt鍵+滾輪可改變範圍模式下的選擇範圍)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "選中的矩形編號\n(0表示不選中)\n可通過空格或回車鍵定位到當前選中的矩形(當正在輸入時,按兩次即可定位)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "刪除選中的矩形\n(或使用Delete鍵)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "當禁用時,攝像頭與模型的相對關係不會變化,但攝像頭的對應屬性不會被本模組修改", - "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放比例,控制偏移量的大小", - "screen.tooltip.xtracr_realcamera.modelView_depth": "全部頂點到屏幕距離均小於該值的面不會被渲染", - "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "配置的名稱", - "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用設置\n全局禁用設置在配置屏幕中", - "screen.tooltip.xtracr_realcamera.modelView_configs": "已儲存的配置", - "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打開全局配置屏幕\n(需要安裝Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "複製所有禁用設置", - "screen.tooltip.xtracr_realcamera.modelView_paste": "貼上剪貼簿中的所有禁用設置到當前配置\n(不會覆蓋同名設置)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名稱不能為空!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材質id不能為空!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁用設置的名稱" + "screen.widget.xtracr_realcamera.modelView_range": "範圍", + "screen.widget.xtracr_realcamera.modelView_roll": "翻滾角 = %s", + "screen.widget.xtracr_realcamera.modelView_save": "儲存", + "screen.widget.xtracr_realcamera.modelView_selecting": "選擇", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "選擇模式", + "screen.widget.xtracr_realcamera.modelView_single": "單選", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "切換輸入框到滑塊", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "切換滑塊到輸入框", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上向量", + "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", + "screen.xtracr_realcamera.modelView_title": "模型視圖" } \ No newline at end of file diff --git a/common/src/main/resources/assets/realcamera/lang/zh_tw.json b/common/src/main/resources/assets/realcamera/lang/zh_tw.json index 0b23af1c..96053fb9 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_tw.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_tw.json @@ -1,135 +1,132 @@ { - "general.xtracr_realcamera.modName": "Real Camera", - "key.xtracr_realcamera.modelViewScreen": "打開模型視圖界面", - "key.xtracr_realcamera.togglePerspective": "開啟/關閉", - "key.xtracr_realcamera.activeConfigIndexPREV": "切換到上一個配置", - "key.xtracr_realcamera.activeConfigIndexNEXT": "切換到下一個配置", - "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", - "key.xtracr_realcamera.toggleAdjustMode": "切換調整模式", - "key.xtracr_realcamera.toggleCameraMode": "切換攝像頭模式", - "key.xtracr_realcamera.adjustUP": "向上調整", - "key.xtracr_realcamera.adjustDOWN": "向下調整", - "key.xtracr_realcamera.adjustFRONT": "向前調整", - "key.xtracr_realcamera.adjustBACK": "向後調整", - "key.xtracr_realcamera.adjustLEFT": "向左調整", - "key.xtracr_realcamera.adjustRIGHT": "向右調整", - "modmenu.descriptionTranslation.realcamera": "使第一人稱視角下的攝像頭更加真實。", - - "config.category.xtracr_realcamera.general": "通用", "config.category.xtracr_realcamera.binding": "綁定模式", - "config.category.xtracr_realcamera.classic": "經典模式", "config.category.xtracr_realcamera.cameraOffset": "攝像頭偏移", - "config.category.xtracr_realcamera.centerOffset": "旋轉中心偏移", "config.category.xtracr_realcamera.cameraRotation": "攝像頭旋轉", - "config.tooltip.xtracr_realcamera.classicOffset": "攝像頭相對旋轉中心的偏移值", - "config.tooltip.xtracr_realcamera.classicOffset_n": "注: 玩家的前方、上方和左方分別為X、Y和Z軸", - "config.tooltip.xtracr_realcamera.centerOffset": "旋轉中心相對頭部的偏移值", - "config.tooltip.xtracr_realcamera.cameraRotation": "額外的攝像頭旋轉角度", - "config.tooltip.xtracr_realcamera.cameraRotation_n": "注:俯仰、偏航和翻滾分別是以左方、上方和前方為軸的旋轉", - - "config.option.xtracr_realcamera.enabled": "開啟功能", - "config.option.xtracr_realcamera.isClassic": "經典模式", - "config.option.xtracr_realcamera.dynamicCrosshair": "動態十字準心", - "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", + "config.category.xtracr_realcamera.centerOffset": "旋轉中心偏移", + "config.category.xtracr_realcamera.classic": "經典模式", + "config.category.xtracr_realcamera.general": "通用", + "config.option.xtracr_realcamera.activeConfigIndex": "當前配置索引", + "config.option.xtracr_realcamera.adjustOffset": "調整攝像頭偏移", "config.option.xtracr_realcamera.adjustStep": "調整步長", - "config.option.xtracr_realcamera.classicAdjustMode": "調整模式", - "config.option.xtracr_realcamera.scale": "縮放比例", + "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留帧数", "config.option.xtracr_realcamera.cameraOffset": "攝像頭%s偏移", "config.option.xtracr_realcamera.centerOffset": "旋轉中心%s偏移", - "config.option.xtracr_realcamera.pitch": "俯仰角", - "config.option.xtracr_realcamera.yaw": "偏航角", - "config.option.xtracr_realcamera.roll": "翻滾角", - "config.option.xtracr_realcamera.toModelViewScreen": "詳細設置請前往%s界面(需設置快捷鍵來打開它)", - "config.option.xtracr_realcamera.screenModifierKey": "%s界面修飾鍵", - "config.option.xtracr_realcamera.legacyBindingMode": "舊綁定模式", - "config.option.xtracr_realcamera.adjustOffset": "調整攝像頭偏移", - "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱藏綁定失敗消息", - "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物體", - "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", - "config.option.xtracr_realcamera.bindResultRetentionFrames": "綁定結果保留帧数", - "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑係數", - "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑係數", - "config.option.xtracr_realcamera.activeConfigIndex": "當前配置索引", + "config.option.xtracr_realcamera.classicAdjustMode": "調整模式", "config.option.xtracr_realcamera.disableConfig": "禁用配置", - "config.option.xtracr_realcamera.disableWhenSneaking": "潛行时禁用主要功能", + "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...時禁用主要功能", + "config.option.xtracr_realcamera.disableRenderItems": "在手持...時禁用渲染", "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSneaking": "潛行时禁用主要功能", "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", + "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑係數", + "config.option.xtracr_realcamera.dynamicCrosshair": "動態十字準心", + "config.option.xtracr_realcamera.enabled": "開啟功能", + "config.option.xtracr_realcamera.hideBindingFailureMessage": "隱藏綁定失敗消息", + "config.option.xtracr_realcamera.isClassic": "經典模式", + "config.option.xtracr_realcamera.legacyBindingMode": "舊綁定模式", "config.option.xtracr_realcamera.outTick": "禁用状态退出延迟(单位:tick)", - "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...時禁用主要功能", - "config.option.xtracr_realcamera.disableRenderItems": "在手持...時禁用渲染", - "config.tooltip.xtracr_realcamera.isClassic": "經典模式只對攝像頭的位置和旋轉做簡單的修改", - "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在開啟狀態下,十字準心會隨著玩家的視線移動,確保命中結果不受影響\n在安裝了Jade、WTHIT或類似模組時建議啟用", - "config.tooltip.xtracr_realcamera.renderModel": "在第一人稱視角下渲染玩家模型", + "config.option.xtracr_realcamera.pitch": "俯仰角", + "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", + "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物體", + "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", + "config.option.xtracr_realcamera.roll": "翻滾角", + "config.option.xtracr_realcamera.rotationSmoothFactor": "旋轉平滑係數", + "config.option.xtracr_realcamera.scale": "縮放比例", + "config.option.xtracr_realcamera.screenModifierKey": "%s界面修飾鍵", + "config.option.xtracr_realcamera.toModelViewScreen": "詳細設置請前往%s界面(需設置快捷鍵來打開它)", + "config.option.xtracr_realcamera.yaw": "偏航角", + "config.tooltip.xtracr_realcamera.activeConfigIndex": "當前綁定的配置索引,0表示允許綁定任何有效配置", + "config.tooltip.xtracr_realcamera.adjustOffset": "當前按下調整鍵時是調整攝像頭的偏移還是旋轉", "config.tooltip.xtracr_realcamera.adjustStep": "每步調整的角度1/100或長度", + "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在綁定失敗的數帧内,沿用上个成功的綁定結果", + "config.tooltip.xtracr_realcamera.cameraRotation": "額外的攝像頭旋轉角度", + "config.tooltip.xtracr_realcamera.cameraRotation_n": "注:俯仰、偏航和翻滾分別是以左方、上方和前方為軸的旋轉", + "config.tooltip.xtracr_realcamera.centerOffset": "旋轉中心相對頭部的偏移值", "config.tooltip.xtracr_realcamera.classicAdjustMode": "決定當前按下調整鍵時調整哪一個", - "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", + "config.tooltip.xtracr_realcamera.classicOffset": "攝像頭相對旋轉中心的偏移值", + "config.tooltip.xtracr_realcamera.classicOffset_n": "注: 玩家的前方、上方和左方分別為X、Y和Z軸", + "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三種匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 標簽匹配`#`開頭(如`#minecraft:tools`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", + "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相機位移平滑系数,值越大越平滑", + "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在開啟狀態下,十字準心會隨著玩家的視線移動,確保命中結果不受影響\n在安裝了Jade、WTHIT或類似模組時建議啟用", + "config.tooltip.xtracr_realcamera.isClassic": "經典模式只對攝像頭的位置和旋轉做簡單的修改", "config.tooltip.xtracr_realcamera.legacyBindingMode": "使用舊版本(v0.5)的綁定模式,僅支援原版模型和基於原版模型的動作\n開啟後可在%s界面的'LEGACY_MODE'中設置屬性", - "config.tooltip.xtracr_realcamera.adjustOffset": "當前按下調整鍵時是調整攝像頭的偏移還是旋轉", + "config.tooltip.xtracr_realcamera.outTick": "玩家停止特定狀態後重啟主要功能的時間(1 tick = 0.05秒)", + "config.tooltip.xtracr_realcamera.renderModel": "在第一人稱視角下渲染玩家模型", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它會卡在玩家身體裡的物體", "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染時機重新渲染模型,以避免一些因提前渲染導致的視覺問題", - "config.tooltip.xtracr_realcamera.outTick": "玩家停止特定狀態後重啟主要功能的時間(1 tick = 0.05秒)", - "config.tooltip.xtracr_realcamera.bindResultRetentionFrames": "在綁定失敗的數帧内,沿用上个成功的綁定結果", - "config.tooltip.xtracr_realcamera.displacementSmoothFactor": "相機位移平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相機旋轉平滑系数,值越大越平滑", - "config.tooltip.xtracr_realcamera.activeConfigIndex": "當前綁定的配置索引,0表示允許綁定任何有效配置", - "config.tooltip.xtracr_realcamera.disableRenderItems": "支持三種匹配方式:\n1. 通配符`*`匹配(如`minecraft:*sword`)\n2. 標簽匹配`#`開頭(如`#minecraft:tools`)\n3. 直接物品ID(如`minecraft:diamond_sword`)", - + "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", + "general.xtracr_realcamera.modName": "Real Camera", + "key.category.xtracr_realcamera.general": "Real Camera", + "key.xtracr_realcamera.activeConfigIndexNEXT": "切換到下一個配置", + "key.xtracr_realcamera.activeConfigIndexPREV": "切換到上一個配置", + "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", + "key.xtracr_realcamera.adjustBACK": "向後調整", + "key.xtracr_realcamera.adjustDOWN": "向下調整", + "key.xtracr_realcamera.adjustFRONT": "向前調整", + "key.xtracr_realcamera.adjustLEFT": "向左調整", + "key.xtracr_realcamera.adjustRIGHT": "向右調整", + "key.xtracr_realcamera.adjustUP": "向上調整", + "key.xtracr_realcamera.modelViewScreen": "打開模型視圖界面", + "key.xtracr_realcamera.toggleAdjustMode": "切換調整模式", + "key.xtracr_realcamera.toggleCameraMode": "切換攝像頭模式", + "key.xtracr_realcamera.togglePerspective": "開啟/關閉", "message.xtracr_realcamera.bindingFailed": "[%s]: 綁定失敗,請前往%s界面手動設置(鍵位:%s)", - - "screen.xtracr_realcamera.modelView_title": "模型視圖", - "screen.widget.xtracr_realcamera.modelView_import": "導入", + "modmenu.descriptionTranslation.realcamera": "使第一人稱視角下的攝像頭更加真實。", + "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "當禁用時,攝像頭與模型的相對關係不會變化,但攝像頭的對應屬性不會被本模組修改", + "screen.tooltip.xtracr_realcamera.modelView_configs": "已儲存的配置", + "screen.tooltip.xtracr_realcamera.modelView_copy": "複製所有禁用設置", + "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "刪除選中的矩形\n(或使用Delete鍵)", + "screen.tooltip.xtracr_realcamera.modelView_depth": "全部頂點到屏幕距離均小於該值的面不會被渲染", + "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用設置\n全局禁用設置在配置屏幕中", + "screen.tooltip.xtracr_realcamera.modelView_disableMode": "被藍框包含的部分會被禁用\n可在左側材質視圖中鼠標左鍵框選,其它鍵取消選擇\n左Alt+左鍵可快速選擇被鼠標指針指向的部分", + "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁用設置的名稱", + "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名稱不能為空!", + "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材質id不能為空!", + "screen.tooltip.xtracr_realcamera.modelView_export": "導出當前配置到剪貼簿", + "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "導出失敗:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "導出成功!", + "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "選中的矩形編號\n(0表示不選中)\n可通過空格或回車鍵定位到當前選中的矩形(當正在輸入時,按兩次即可定位)", + "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", + "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", + "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", + "screen.tooltip.xtracr_realcamera.modelView_paste": "貼上剪貼簿中的所有禁用設置到當前配置\n(不會覆蓋同名設置)", + "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", + "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", + "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放比例,控制偏移量的大小", + "screen.tooltip.xtracr_realcamera.modelView_selecting": "左Alt+左鍵可獲取鼠標指針處的UV座標\n下方三組UV座標由上到下依次為向前向量、向上向量和目標平面上綁定點的UV座標\n註:左Alt鍵+滾輪可在模型的不同層間切換,手動輸入UV座標可以更加精確地綁定到目標位置", + "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "決定左Alt+左鍵快速選擇的模式\n(左Alt鍵+滾輪可改變範圍模式下的選擇範圍)", + "screen.tooltip.xtracr_realcamera.modelView_targetName": "配置的名稱", + "screen.tooltip.xtracr_realcamera.modelView_textureId": "被選中的模型的紋理的id(不是完整的id也可以識別),儲存時可以縮短一部分以便於程序識別\n比如將minecraft:textures/entity/player/slim/alex.png縮短為minecraft:textures/entity/player/", + "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打開全局配置屏幕\n(需要安裝Cloth Config API)", + "screen.widget.xtracr_realcamera.modelView_all": "全部", + "screen.widget.xtracr_realcamera.modelView_configs": "配置", + "screen.widget.xtracr_realcamera.modelView_copy": "複製", + "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", + "screen.widget.xtracr_realcamera.modelView_disable": "禁用", + "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", "screen.widget.xtracr_realcamera.modelView_export": "導出", - "screen.widget.xtracr_realcamera.modelView_selecting": "選擇", "screen.widget.xtracr_realcamera.modelView_forwardVector": "向前向量", - "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上向量", - "screen.widget.xtracr_realcamera.modelView_position": "目標平面", - "screen.widget.xtracr_realcamera.modelView_save": "儲存", - "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", - "screen.widget.xtracr_realcamera.modelView_all": "全部", - "screen.widget.xtracr_realcamera.modelView_part": "部分", - "screen.widget.xtracr_realcamera.modelView_selectionMode": "選擇模式", - "screen.widget.xtracr_realcamera.modelView_single": "單選", + "screen.widget.xtracr_realcamera.modelView_import": "導入", "screen.widget.xtracr_realcamera.modelView_multiple": "多選", - "screen.widget.xtracr_realcamera.modelView_range": "範圍", - "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "切換滑塊到輸入框", - "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "切換輸入框到滑塊", "screen.widget.xtracr_realcamera.modelView_offsetX": "X偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetY": "Y偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z偏移量 = %s", + "screen.widget.xtracr_realcamera.modelView_part": "部分", + "screen.widget.xtracr_realcamera.modelView_paste": "貼上", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰角 = %s", - "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", - "screen.widget.xtracr_realcamera.modelView_roll": "翻滾角 = %s", - "screen.widget.xtracr_realcamera.modelView_disable": "禁用", + "screen.widget.xtracr_realcamera.modelView_position": "目標平面", "screen.widget.xtracr_realcamera.modelView_preview": "預覽", - "screen.widget.xtracr_realcamera.modelView_configs": "配置", - "screen.widget.xtracr_realcamera.modelView_copy": "複製", - "screen.widget.xtracr_realcamera.modelView_paste": "貼上", - "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", - "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", - "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", - "screen.tooltip.xtracr_realcamera.modelView_export": "導出當前配置到剪貼簿", - "screen.tooltip.xtracr_realcamera.modelView_exportSucceeded": "導出成功!", - "screen.tooltip.xtracr_realcamera.modelView_exportFailed": "導出失敗:\n%s", - "screen.tooltip.xtracr_realcamera.modelView_selecting": "左Alt+左鍵可獲取鼠標指針處的UV座標\n下方三組UV座標由上到下依次為向前向量、向上向量和目標平面上綁定點的UV座標\n註:左Alt鍵+滾輪可在模型的不同層間切換,手動輸入UV座標可以更加精確地綁定到目標位置", - "screen.tooltip.xtracr_realcamera.modelView_textureId": "被選中的模型的紋理的id(不是完整的id也可以識別),儲存時可以縮短一部分以便於程序識別\n比如將minecraft:textures/entity/player/slim/alex.png縮短為minecraft:textures/entity/player/", - "screen.tooltip.xtracr_realcamera.modelView_disableMode": "被藍框包含的部分會被禁用\n可在左側材質視圖中鼠標左鍵框選,其它鍵取消選擇\n左Alt+左鍵可快速選擇被鼠標指針指向的部分", - "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "決定左Alt+左鍵快速選擇的模式\n(左Alt鍵+滾輪可改變範圍模式下的選擇範圍)", - "screen.tooltip.xtracr_realcamera.modelView_focusedRectangleNumber": "選中的矩形編號\n(0表示不選中)\n可通過空格或回車鍵定位到當前選中的矩形(當正在輸入時,按兩次即可定位)", - "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "刪除選中的矩形\n(或使用Delete鍵)", - "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "當禁用時,攝像頭與模型的相對關係不會變化,但攝像頭的對應屬性不會被本模組修改", - "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放比例,控制偏移量的大小", - "screen.tooltip.xtracr_realcamera.modelView_depth": "全部頂點到屏幕距離均小於該值的面不會被渲染", - "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", - "screen.tooltip.xtracr_realcamera.modelView_targetName": "配置的名稱", - "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用設置\n全局禁用設置在配置屏幕中", - "screen.tooltip.xtracr_realcamera.modelView_configs": "已儲存的配置", - "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", - "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打開全局配置屏幕\n(需要安裝Cloth Config API)", - "screen.tooltip.xtracr_realcamera.modelView_copy": "複製所有禁用設置", - "screen.tooltip.xtracr_realcamera.modelView_paste": "貼上剪貼簿中的所有禁用設置到當前配置\n(不會覆蓋同名設置)", - "screen.tooltip.xtracr_realcamera.modelView_emptyName": "名稱不能為空!", - "screen.tooltip.xtracr_realcamera.modelView_emptyTextureId": "材質id不能為空!", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", - "screen.tooltip.xtracr_realcamera.modelView_disabledName": "禁用設置的名稱" + "screen.widget.xtracr_realcamera.modelView_range": "範圍", + "screen.widget.xtracr_realcamera.modelView_roll": "翻滾角 = %s", + "screen.widget.xtracr_realcamera.modelView_save": "儲存", + "screen.widget.xtracr_realcamera.modelView_selecting": "選擇", + "screen.widget.xtracr_realcamera.modelView_selectionMode": "選擇模式", + "screen.widget.xtracr_realcamera.modelView_single": "單選", + "screen.widget.xtracr_realcamera.modelView_toggleFieldToSlider": "切換輸入框到滑塊", + "screen.widget.xtracr_realcamera.modelView_toggleSliderToField": "切換滑塊到輸入框", + "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上向量", + "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", + "screen.xtracr_realcamera.modelView_title": "模型視圖" } \ No newline at end of file diff --git a/common/src/main/resources/realcamera-common.mixins.json b/common/src/main/resources/realcamera-common.mixins.json index 21830b03..1f026f74 100644 --- a/common/src/main/resources/realcamera-common.mixins.json +++ b/common/src/main/resources/realcamera-common.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8.5", "package": "com.xtracr.realcamera.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_25", "mixins": [ ], "client": [ @@ -14,11 +14,12 @@ "MixinItemInHandRenderer", "MixinLevelRenderer", "MixinLocalPlayer", - "MixinPlayerRenderer", "MixinStuckInBodyLayer", - "accessor.CameraAccessor", - "accessor.GameRendererAccessor", - "accessor.PlayerRendererAccessor" + "accessor.AvatarRendererAccessor", + "accessor.CustomFeatureRenderer$StorageAccessor", + "accessor.GuiGraphicsExtractorAccessor", + "accessor.ModelFeatureRenderer$StorageAccessor", + "accessor.ModelPartFeatureRenderer$StorageAccessor" ], "server": [ ], diff --git a/common/src/main/resources/realcamera.accesswidener b/common/src/main/resources/realcamera.accesswidener index 246b8795..869e8c7c 100644 --- a/common/src/main/resources/realcamera.accesswidener +++ b/common/src/main/resources/realcamera.accesswidener @@ -1,2 +1,3 @@ -accessWidener v2 named -extendable method net/minecraft/client/renderer/MultiBufferSource$BufferSource endBatch (Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/BufferBuilder;)V \ No newline at end of file +accessWidener v2 official +accessible class net/minecraft/client/gui/GuiGraphicsExtractor$ScissorStack +extendable method net/minecraft/client/renderer/MultiBufferSource$BufferSource endBatch (Lnet/minecraft/client/renderer/rendertype/RenderType;Lcom/mojang/blaze3d/vertex/BufferBuilder;)V \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index d3fa27df..00000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,72 +0,0 @@ -plugins { - id "com.gradleup.shadow" version "9.3.0" -} - -base { - archivesName = rootProject.mod_id + "-" + rootProject.minecraft_version + "-fabric" -} - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common - shadowCommon - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - - // Cloth Config - modRuntimeOnly "me.shedaniel.cloth:cloth-config-fabric:${rootProject.cloth_config_version}" - // Modmenu - modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { - exclude(group: "net.fabricmc.fabric-api") - } - -// modImplementation "org.antlr:antlr4-runtime:4.13.1" -// modImplementation "io.github.douira:glsl-transformer:2.0.1" -// modImplementation "org.anarres:jcpp:1.4.14" -// modImplementation "maven.modrinth:iris:1.8.8+1.21.1-fabric" -// modImplementation "maven.modrinth:sodium:mc1.21.1-0.6.13-fabric" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} - -processResources { - inputs.property "version", project.version - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -shadowJar { - exclude "architectury.common.json" - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - injectAccessWidener = true - inputFile.set shadowJar.archiveFile - dependsOn shadowJar -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 00000000..8adb3df2 --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,102 @@ +plugins { + id("net.fabricmc.fabric-loom") + id("maven-publish") +} + +val modId = project.property("mod_id") as String +val javaVersion = project.property("java_version") as String +val minecraftVersion = project.property("minecraft_version") as String +val fabricLoaderVersion = project.property("fabric_loader_version") as String +val fabricApiVersion = project.property("fabric_api_version") as String + +val clothConfigVersion = project.property("cloth_config_version") as String +val modMenuVersion = project.property("modmenu_version") as String + +base { + archivesName = "$modId-$minecraftVersion-fabric" +} + +val commonProject = project(":common") + +project.evaluationDependsOn(commonProject.path) + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersion)) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(javaVersion.toInt()) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraftVersion") + + implementation("net.fabricmc:fabric-loader:$fabricLoaderVersion") + implementation("net.fabricmc.fabric-api:fabric-api:$fabricApiVersion") + + // Cloth Config + runtimeOnly("me.shedaniel.cloth:cloth-config-fabric:$clothConfigVersion") + // Modmenu + implementation("com.terraformersmc:modmenu:$modMenuVersion") { + exclude(group = "net.fabricmc.fabric-api") + } + + implementation(commonProject) +} + +loom { + accessWidenerPath.set(project(":common").file("src/main/resources/realcamera.accesswidener")) + + mods { + create(modId) { + sourceSet(sourceSets.main.get()) + } + } +} + +sourceSets { + named("main") { + resources { + srcDir(commonProject.sourceSets.main.get().resources) + } + } +} + +tasks.processResources { + inputs.property("version", project.version) + filesMatching("fabric.mod.json") { + expand("version" to project.version) + } +} + +tasks.jar { + from(sourceSets.main.get().output) + from(commonProject.sourceSets.main.get().output) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +val sourcesJarTask = tasks.named("sourcesJar") { + from(sourceSets.main.get().allSource) + from(commonProject.sourceSets.main.get().allSource) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier.set("sources") +} + +artifacts { + archives(tasks.jar) + archives(sourcesJarTask) +} + +publishing { + publications { + register("fabricJar") { + artifactId = base.archivesName.get() + artifact(tasks.jar) + artifact(sourcesJarTask) + } + } +} diff --git a/fabric/src/main/java/com/xtracr/realcamera/EventHandler.java b/fabric/src/main/java/com/xtracr/realcamera/EventHandler.java deleted file mode 100644 index 9bed039d..00000000 --- a/fabric/src/main/java/com/xtracr/realcamera/EventHandler.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.xtracr.realcamera; - -import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.util.CrosshairUtil; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; -import net.minecraft.client.Minecraft; - -public class EventHandler { - public static void onWorldRenderStart(WorldRenderContext context) { - if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { - CrosshairUtil.update(Minecraft.getInstance(), context.camera(), context.positionMatrix(), context.projectionMatrix()); - } - } -} diff --git a/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java b/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java index 9ffd9155..1b621dde 100644 --- a/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java +++ b/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java @@ -1,22 +1,32 @@ package com.xtracr.realcamera; +import com.xtracr.realcamera.renderer.gui.GuiCulledModelsRenderer; +import com.xtracr.realcamera.renderer.gui.GuiFlattenedModelsRenderer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; +import net.fabricmc.fabric.api.client.rendering.v1.PictureInPictureRendererRegistry; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.KeyMapping; @Environment(EnvType.CLIENT) public class RealCameraFabric implements ClientModInitializer, RealCamera { @Override public void onInitializeClient() { initialize(); - KeyMappings.register(KeyBindingHelper::registerKeyBinding); + + KeyMapping.Category.register(KeyMappings.GENERAL.id()); + KeyMappings.register(KeyMappingHelper::registerKeyMapping); + registerPictureInPictureRenderers(); ClientTickEvents.END_CLIENT_TICK.register(KeyMappings::handle); - WorldRenderEvents.START.register(EventHandler::onWorldRenderStart); + } + + private void registerPictureInPictureRenderers() { + PictureInPictureRendererRegistry.register(ctx -> new GuiCulledModelsRenderer(ctx.bufferSource())); + PictureInPictureRendererRegistry.register(ctx -> new GuiFlattenedModelsRenderer(ctx.bufferSource())); } @Override diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 39d04c4d..f4fd8a17 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -27,11 +27,12 @@ "realcamera.mixins.json", "realcamera-common.mixins.json" ], + "accessWidener": "realcamera.accesswidener", "depends": { - "fabricloader": "*", + "fabricloader": ">=0.18.4", "fabric-api": "*", - "minecraft": "1.21.1", - "java": ">=21" + "minecraft": "~26.1", + "java": ">=25" }, "recommends": { "modmenu": "*", diff --git a/fabric/src/main/resources/realcamera.mixins.json b/fabric/src/main/resources/realcamera.mixins.json index 16ce00cc..6e60890b 100644 --- a/fabric/src/main/resources/realcamera.mixins.json +++ b/fabric/src/main/resources/realcamera.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8.5", "package": "com.xtracr.realcamera.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_25", "mixins": [ ], "client": [ diff --git a/gradle.properties b/gradle.properties index 8adf3338..e08ad7e8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,20 @@ # Done to increase the memory available to gradle. org.gradle.jvmargs=-Xmx4G -XX:+UseG1GC org.gradle.parallel=true -org.gradle.caching=true +org.gradle.configuration-cache=false ## Environment Properties -minecraft_version=1.21.1 +java_version=25 +minecraft_version=26.1.1 enabled_platforms=fabric,neoforge -fabric_loader_version=0.18.4 -neoforge_version=21.1.217 +loom_version=1.16-SNAPSHOT +fabric_loader_version=0.19.0 +neoforge_version=26.1.1.14-beta +moddev_version=2.0.141 ## Mod Properties mod_id=realcamera -mod_version=0.7.5-beta +mod_version=0.7.6-beta mod_group_id=com.xtracr.realcamera ## Dependencies -fabric_api_version=0.116.7+1.21.1 -cloth_config_version=15.0.140 -modmenu_version=11.0.3 +fabric_api_version=0.145.4+26.1.1 +cloth_config_version=26.1.154 +modmenu_version=18.0.0-alpha.8 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee3125fe0768e9a76ee977ac089eb657005e..d997cfc60f4cff0e7451d19d49a82fa986695d07 100644 GIT binary patch delta 39855 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 N2q(zEpY4qk{{xkq;s5{u diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 23449a2b..c61a118f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index adff685a..739907df 100644 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/neoforge/build.gradle b/neoforge/build.gradle deleted file mode 100644 index 1a5e1213..00000000 --- a/neoforge/build.gradle +++ /dev/null @@ -1,69 +0,0 @@ -plugins { - id "com.gradleup.shadow" version "9.3.0" -} - -base { - archivesName = rootProject.mod_id + "-" + rootProject.minecraft_version + "-neoforge" -} - -architectury { - platformSetupLoomIde() - neoForge() -} - -repositories { - maven { url "https://maven.neoforged.net/releases" } -} - -loom { - neoForge {} -} - -configurations { - common - shadowCommon - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common -} - -dependencies { - neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" - - // Cloth Config - modRuntimeOnly "me.shedaniel.cloth:cloth-config-neoforge:${rootProject.cloth_config_version}" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive false } -} - -processResources { - inputs.property "version", project.version - filesMatching("META-INF/neoforge.mods.toml") { - expand "version": project.version - } -} - -shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - configurations = [project.configurations.shadowCommon] - setArchiveClassifier "dev-shadow" -} - -remapJar { - inputFile.set shadowJar.archiveFile - dependsOn shadowJar -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 00000000..e550da50 --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,99 @@ +plugins { + id("java-library") + id("net.neoforged.moddev") + id("maven-publish") +} + +val modId = project.property("mod_id") as String +val javaVersion = project.property("java_version") as String +val minecraftVersion = project.property("minecraft_version") as String +val neoforgeVersion = project.property("neoforge_version") as String + +val clothConfigVersion = project.property("cloth_config_version") as String + +base { + archivesName = "$modId-$minecraftVersion-neoforge" +} + +val commonProject = project(":common") + +project.evaluationDependsOn(commonProject.path) + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersion)) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(javaVersion.toInt()) +} + +dependencies { + // Cloth Config + runtimeOnly("me.shedaniel.cloth:cloth-config-neoforge:$clothConfigVersion") + + implementation(commonProject) +} + +neoForge { + version = neoforgeVersion + + runs { + register("neoforgeClient") { + client() + systemProperty("forge.logging.console.level", "debug") + gameDirectory.set(file("run/client")) + } + register("neoforgeServer") { + server() + systemProperty("forge.logging.console.level", "debug") + gameDirectory.set(file("run/server")) + programArguments.addAll("nogui") + } + } + + mods { + create(modId) { + sourceSet(sourceSets.main.get()) + sourceSet(commonProject.sourceSets.main.get()) + } + } +} + +tasks.processResources { + inputs.property("version", project.version) + filesMatching("META-INF/neoforge.mods.toml") { + expand("version" to project.version) + } +} + +tasks.jar { + from(sourceSets.main.get().output) + from(commonProject.sourceSets.main.get().output) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +val sourcesJarTask = tasks.named("sourcesJar") { + from(sourceSets.main.get().allSource) + from(commonProject.sourceSets.main.get().allSource) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier.set("sources") +} + +artifacts { + archives(tasks.jar) + archives(sourcesJarTask) +} + +publishing { + publications { + register("neoforgeJar") { + artifactId = base.archivesName.get() + artifact(tasks.jar) + artifact(sourcesJarTask) + } + } +} diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties index 7da18ea6..e69de29b 100644 --- a/neoforge/gradle.properties +++ b/neoforge/gradle.properties @@ -1 +0,0 @@ -loom.platform=neoforge diff --git a/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java b/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java index eea429fe..c6aecff5 100644 --- a/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java +++ b/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java @@ -1,21 +1,15 @@ package com.xtracr.realcamera; -import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.util.CrosshairUtil; import net.minecraft.client.Minecraft; import net.neoforged.neoforge.client.event.ClientTickEvent; -import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.common.NeoForge; public class EventHandler { - public static void onClientTick(ClientTickEvent.Post event) { - KeyMappings.handle(Minecraft.getInstance()); + public static void addListeners() { + NeoForge.EVENT_BUS.addListener(EventHandler::onClientTick); } - public static void onRenderLevelStage(RenderLevelStageEvent event) { - if (RenderLevelStageEvent.Stage.AFTER_SKY.equals(event.getStage())) { - if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { - CrosshairUtil.update(Minecraft.getInstance(), event.getCamera(), event.getModelViewMatrix(), event.getProjectionMatrix()); - } - } + public static void onClientTick(ClientTickEvent.Post event) { + KeyMappings.handle(Minecraft.getInstance()); } } diff --git a/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java b/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java index be986d01..4348ff19 100644 --- a/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java +++ b/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java @@ -1,18 +1,23 @@ package com.xtracr.realcamera; import com.xtracr.realcamera.config.ConfigScreen; +import com.xtracr.realcamera.renderer.gui.GuiCulledModelsRenderer; +import com.xtracr.realcamera.renderer.gui.GuiFlattenedModelsRenderer; +import com.xtracr.realcamera.renderer.state.gui.GuiCulledModelsRenderState; +import com.xtracr.realcamera.renderer.state.gui.GuiFlattenedModelsRenderState; +import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.event.RegisterPictureInPictureRenderersEvent; import net.neoforged.neoforge.client.gui.IConfigScreenFactory; -import net.neoforged.neoforge.common.NeoForge; import java.util.Map; -@Mod(RealCamera.MODID) +@Mod(value = RealCamera.MODID, dist = Dist.CLIENT) public class RealCameraNeoForge implements RealCamera { private final ModContainer modContainer; private final Map modIdMap = Map.of("cloth-config", "cloth_config"); @@ -21,23 +26,29 @@ public RealCameraNeoForge(IEventBus modEventBus, ModContainer modContainer) { this.modContainer = modContainer; modEventBus.addListener(this::clientSetup); modEventBus.addListener(this::onKeyRegister); + modEventBus.addListener(this::onPictureInPictureRenderersRegister); } - public void clientSetup(FMLClientSetupEvent event) { + private void clientSetup(FMLClientSetupEvent event) { initialize(); - NeoForge.EVENT_BUS.addListener(EventHandler::onClientTick); - NeoForge.EVENT_BUS.addListener(EventHandler::onRenderLevelStage); + EventHandler.addListeners(); if (isModLoaded("cloth-config")) { - modContainer.registerExtensionPoint(IConfigScreenFactory.class, (container, modListScreen) -> ConfigScreen.create(modListScreen)); + modContainer.registerExtensionPoint(IConfigScreenFactory.class, (_, modListScreen) -> ConfigScreen.create(modListScreen)); } } - public void onKeyRegister(RegisterKeyMappingsEvent event) { + private void onKeyRegister(RegisterKeyMappingsEvent event) { + event.registerCategory(KeyMappings.GENERAL); KeyMappings.register(event::register); } + private void onPictureInPictureRenderersRegister(RegisterPictureInPictureRenderersEvent event) { + event.register(GuiCulledModelsRenderState.class, GuiCulledModelsRenderer::new); + event.register(GuiFlattenedModelsRenderState.class, GuiFlattenedModelsRenderer::new); + } + @Override public boolean isModLoaded(String modId) { return ModList.get().isLoaded(modIdMap.getOrDefault(modId, modId)); diff --git a/neoforge/src/main/resources/META-INF/accesstransformer.cfg b/neoforge/src/main/resources/META-INF/accesstransformer.cfg index 3e6e0b95..3e09a5a6 100644 --- a/neoforge/src/main/resources/META-INF/accesstransformer.cfg +++ b/neoforge/src/main/resources/META-INF/accesstransformer.cfg @@ -1 +1,2 @@ +public net.minecraft.client.gui.GuiGraphicsExtractor$ScissorStack protected net.minecraft.client.renderer.MultiBufferSource$BufferSource endBatch(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/BufferBuilder;)V \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index d164d6af..811bf035 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -24,28 +24,28 @@ Make the camera more realistic in the first-person view. [[dependencies.realcamera]] modId = "neoforge" -type= "required" -versionRange = "[21,)" +type = "required" +versionRange = "[26,)" ordering = "NONE" side = "BOTH" [[dependencies.realcamera]] modId = "minecraft" type = "required" -versionRange = "[1.21.1,1.21.2)" +versionRange = "[26,27)" ordering = "NONE" side = "BOTH" [[dependencies.realcamera]] modId = "cloth_config" type = "optional" -versionRange = "[15.0,)" +versionRange = "[21.0,)" ordering = "NONE" side = "CLIENT" [dependencies.realcamera.mc-publish] - ignore = false - modrinth = "cloth-config" - curseforge = "cloth-config" +ignore = false +modrinth = "cloth-config" +curseforge = "cloth-config" [[mixins]] config = "realcamera-common.mixins.json" diff --git a/neoforge/src/main/resources/realcamera.mixins.json b/neoforge/src/main/resources/realcamera.mixins.json index 16ce00cc..6e60890b 100644 --- a/neoforge/src/main/resources/realcamera.mixins.json +++ b/neoforge/src/main/resources/realcamera.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8.5", "package": "com.xtracr.realcamera.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_25", "mixins": [ ], "client": [ diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index c460dcc6..00000000 --- a/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } - maven { url "https://maven.neoforged.net/releases" } - } -} - -include("common") -include("fabric") -include("neoforge") - -rootProject.name = "RealCamera" diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..6c49b8d6 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + repositories { + maven { + name = "Fabric" + url = uri("https://maven.fabricmc.net/") + } + maven { + name = "NeoForge" + url = uri("https://maven.neoforged.net/releases") + } + gradlePluginPortal() + } + + plugins { + id("net.fabricmc.fabric-loom") version providers.gradleProperty("loom_version") + id("net.neoforged.moddev") version providers.gradleProperty("moddev_version") + } +} + +rootProject.name = "RealCamera" + +include("common") +include("fabric") +include("neoforge") From c1021874bebe1fb5302a04ab521c7763f7fafde1 Mon Sep 17 00:00:00 2001 From: xTracr Date: Sun, 19 Apr 2026 14:16:54 +0800 Subject: [PATCH 10/34] Delete `copy`, `paste` button and fix textureId lookup --- .../realcamera/gui/ModelViewScreen.java | 16 +++----- .../mixin/accessor/RenderTypeAccessor.java | 12 ++++++ .../renderer/BuiltIterableBuffer.java | 39 +++++++++++++++---- .../assets/realcamera/lang/be_by.json | 4 -- .../assets/realcamera/lang/en_us.json | 4 -- .../assets/realcamera/lang/es_es.json | 4 -- .../assets/realcamera/lang/fr_fr.json | 4 -- .../assets/realcamera/lang/ja_jp.json | 4 -- .../assets/realcamera/lang/ko_kr.json | 4 -- .../resources/assets/realcamera/lang/lzh.json | 4 -- .../assets/realcamera/lang/pl_pl.json | 4 -- .../assets/realcamera/lang/pt_br.json | 4 -- .../assets/realcamera/lang/pt_pt.json | 4 -- .../assets/realcamera/lang/ru_ru.json | 4 -- .../assets/realcamera/lang/tr_tr.json | 4 -- .../assets/realcamera/lang/uk_ua.json | 4 -- .../assets/realcamera/lang/zh_cn.json | 4 -- .../assets/realcamera/lang/zh_hk.json | 4 -- .../assets/realcamera/lang/zh_tw.json | 4 -- .../resources/realcamera-common.mixins.json | 3 +- .../main/resources/realcamera.accesswidener | 1 + .../resources/META-INF/accesstransformer.cfg | 1 + 22 files changed, 52 insertions(+), 84 deletions(-) create mode 100644 common/src/main/java/com/xtracr/realcamera/mixin/accessor/RenderTypeAccessor.java diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 83ebacfd..bc58e4dd 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -64,7 +64,6 @@ public class ModelViewScreen extends Screen { @Nullable private ScreenRectangle textureViewArea; private VertexData[][] focusedPolyhedron = new VertexData[0][]; - private List configsInClipBoard = new ArrayList<>(); @Nullable private UVRectangleWidget focusedRectWidget; private StringWidget rectWidgetsSizeWidget; @@ -182,7 +181,7 @@ private void initWidgets(int page) { } private void initLeftWidgets() { - rectWidgetsSizeWidget = new StringWidget(x + 4 + widgetWidth + 5, y + 4 + (widgetHeight + 2) * 3, widgetWidth - 22, widgetHeight, LocUtil.literal(String.valueOf(rectWidgets.size())), font); + rectWidgetsSizeWidget = new StringWidget(x + 4 + widgetWidth + 5 + font.width("/"), y + 4 + (widgetHeight + 2) * 3, widgetWidth - 22, widgetHeight, LocUtil.literal(String.valueOf(rectWidgets.size())), font); forwardUField = createFloatField(widgetWidth, 0, forwardUField); forwardVField = createFloatField(widgetWidth, 0, forwardVField); upwardUField = createFloatField(widgetWidth, 0, upwardUField); @@ -330,13 +329,8 @@ private void initRightWidgets() { }), smallSettings).setTooltip(createTooltip("toConfigScreen")); final int widgetsPerPage, size; if (toggleCategoryButton.getValue() == Category.DISABLE) { - widgetsPerPage = 6; + widgetsPerPage = 7; size = disableConfigs.size(); - rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("copy"), widgetWidth, _ -> configsInClipBoard = List.copyOf(disableConfigs)), 2).setTooltip(createTooltip("copy")); - rows.addChild(createButton(LocUtil.MODEL_VIEW_WIDGET("paste"), widgetWidth, _ -> { - configsInClipBoard.stream().filter(config -> disableConfigs.stream().noneMatch(c -> c.name().equals(config.name()))).forEach(disableConfigs::add); - initWidgets(0); - }), 2).setTooltip(createTooltip("paste")); rows.addChild(disabledNameField, 3, smallSettings).setTooltip(createTooltip("disabledName")); rows.addChild(new SimpleIconButton(64, 0, button -> { String name = disabledNameField.getValue(), textureId = disabledIdField.getValue(); @@ -367,7 +361,7 @@ private void initRightWidgets() { if (value == 0) hiddenNames.remove(config.name()); else hiddenNames.add(config.name()); }) - .setPosition(x + (xSize + middleWidth) / 2 - 20, y + 5 + (widgetHeight + 2) * (3 + i % widgetsPerPage)); + .setPosition(x + (xSize + middleWidth) / 2 - 20, y + 5 + (widgetHeight + 2) * (2 + i % widgetsPerPage)); rows.addChild(createButton(LocUtil.literal(config.name()), widgetWidth * 2 - 18, _ -> { disabledNameField.setValue(config.name()); disabledIdField.setValue(config.textureId()); @@ -409,8 +403,8 @@ private void initRightWidgets() { grid.visitWidgets(this::addRenderableWidget); final int pages = (size - 1) / widgetsPerPage + 1; addRenderableWidget(new SimpleIconButton(x + (xSize + middleWidth) / 2 + 8, y + ySize - 20, 16, 16, 16, 0, _ -> initWidgets((page - 1 + pages) % pages))); - Component pageInfo = LocUtil.literal((page + 1) + " / " + pages); - addRenderableWidget(new StringWidget(x + (3 * xSize + middleWidth) / 4 + 2 - font.width(pageInfo) / 2, y + ySize - 20, font.width(pageInfo), widgetHeight, pageInfo, font)); + Component pageInfoText = LocUtil.literal((page + 1) + " / " + pages); + addRenderableWidget(new StringWidget(x + (3 * xSize + middleWidth) / 4 + 2 - font.width(pageInfoText) / 2, y + ySize - 20, font.width(pageInfoText), widgetHeight, pageInfoText, font)); addRenderableWidget(new SimpleIconButton(x + xSize - 21, y + ySize - 20, 16, 16, 32, 0, _ -> initWidgets((page + 1) % pages))); } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/accessor/RenderTypeAccessor.java b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/RenderTypeAccessor.java new file mode 100644 index 00000000..4366b6dd --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/mixin/accessor/RenderTypeAccessor.java @@ -0,0 +1,12 @@ +package com.xtracr.realcamera.mixin.accessor; + +import net.minecraft.client.renderer.rendertype.RenderSetup; +import net.minecraft.client.renderer.rendertype.RenderType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RenderType.class) +public interface RenderTypeAccessor { + @Accessor + RenderSetup getState(); +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index c3f0869b..611914be 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -1,31 +1,54 @@ package com.xtracr.realcamera.renderer; import com.mojang.blaze3d.vertex.MeshData; +import com.xtracr.realcamera.RealCamera; +import com.xtracr.realcamera.mixin.accessor.RenderTypeAccessor; import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.renderer.state.VertexData.UV; +import net.minecraft.client.renderer.rendertype.RenderSetup; import net.minecraft.client.renderer.rendertype.RenderType; import org.jspecify.annotations.Nullable; import java.awt.*; +import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public record BuiltIterableBuffer(RenderType renderType, String textureId, IterableVertexBuffer vertexBuffer) { - private static final Pattern TEXTURE_ID_PATTERN = Pattern.compile("texture\\[Optional\\[(.*?)]"); + @Nullable + private static final Field TEXTURES_FIELD; private static final Map TEXTURE_ID_CACHE = new HashMap<>(); private static final Map> FIND_PRIMITIVE_CACHE = new HashMap<>(); + static { + Field texturesField = null; + try { + texturesField = RenderSetup.class.getDeclaredField("textures"); + texturesField.setAccessible(true); + } catch (NoSuchFieldException e) { + RealCamera.LOGGER.error("Failed to find textures field in RenderSetup", e); + } + TEXTURES_FIELD = texturesField; + } + public static BuiltIterableBuffer buildFrom(RenderType renderType, MeshData meshData) { - String textureId = TEXTURE_ID_CACHE.computeIfAbsent(renderType, rt -> { - String renderTypeName = rt.toString(); - Matcher matcher = TEXTURE_ID_PATTERN.matcher(renderTypeName); - return matcher.find() ? matcher.group(1) : renderTypeName; - }); + String textureId = TEXTURE_ID_CACHE.computeIfAbsent(renderType, BuiltIterableBuffer::getTextureId); return new BuiltIterableBuffer(renderType, textureId, new IterableVertexBuffer(meshData)); } + @SuppressWarnings("unchecked") + private static String getTextureId(RenderType renderType) { + if (TEXTURES_FIELD == null) return renderType.toString(); + RenderSetup renderSetup = ((RenderTypeAccessor) renderType).getState(); + try { + Map textureBindings = (Map) TEXTURES_FIELD.get(renderSetup); + RenderSetup.TextureBinding sampler0 = textureBindings.get("Sampler0"); + if (sampler0 != null) return sampler0.location().toString(); + } catch (IllegalAccessException | IllegalArgumentException | ClassCastException _) { + } + return renderType.toString(); + } + public boolean anyNotCached(UV[] uvs) { Map cache = FIND_PRIMITIVE_CACHE.get(renderType); if (cache == null) return true; diff --git a/common/src/main/resources/assets/realcamera/lang/be_by.json b/common/src/main/resources/assets/realcamera/lang/be_by.json index 8024873c..7c8ee0ce 100644 --- a/common/src/main/resources/assets/realcamera/lang/be_by.json +++ b/common/src/main/resources/assets/realcamera/lang/be_by.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Зрабіць камеру больш рэалістычнай у рэжыме ад першай асобы.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Калі адключана, адноснае становішча камеры да мадэлі не мяняецца, але адпаведныя атрыбуты камеры не будуць зменены гэтым модам", "screen.tooltip.xtracr_realcamera.modelView_configs": "Захаваныя канфігурацыі", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Капіяваць усе налады адключэння", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Выдаліць абраную прастакутную вобласць\n(Ці выкарыстайце клавішу Delete)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскасці, адлеглась ад усіх вяршынь да экрана ў якіх меншая за гэта значэнне, не будуць адлюстроўвацца", "screen.tooltip.xtracr_realcamera.modelView_disable": "Налады адключэння\nГлабальныя налады адключэння знаходзяцца на экране канфігурацыі", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Імпартаваць канфіг з буфера абмену", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Імпарт не ўдаўся: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпарт %s паспяховы!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Уставіць усе налады адключэння з буфера абмену ў бягучы канфіг\n(Не перазапіша існуючыя налады з такой жа назвай)", "screen.tooltip.xtracr_realcamera.modelView_preview": "У рэжыме прадпрагляду вы можаце наладжваць зрух і паварот камеры", "screen.tooltip.xtracr_realcamera.modelView_priority": "Прыярытэт пры прывязцы, чым больш значэнне, тым вышэй прыярытэт і размяшчэнне справей у спісе", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Захаваць як\n(Калі існуе канфігурацыя з такой жа назвай, вы таксама можаце націснуць кнопку захавання злева)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Адкрыць глабальны экран канфігурацыі\n(Патрабуецца Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "Усё", "screen.widget.xtracr_realcamera.modelView_configs": "Канфігурацыі", - "screen.widget.xtracr_realcamera.modelView_copy": "Капіяваць", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Бягучая Канфігурацыя", "screen.widget.xtracr_realcamera.modelView_disable": "Адключыць", "screen.widget.xtracr_realcamera.modelView_disableMode": "Рэжым адключэння", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Зрух Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Зрух Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Частка", - "screen.widget.xtracr_realcamera.modelView_paste": "Уставіць", "screen.widget.xtracr_realcamera.modelView_pitch": "Тангаж = %s", "screen.widget.xtracr_realcamera.modelView_position": "Мэтавая плоскасць", "screen.widget.xtracr_realcamera.modelView_preview": "Прадпрагляд", diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index 0e7afd4e..73f7e51a 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Make the camera more realistic in the first-person view.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "When disabled, the camera's relative relationship to the model will not change, but the camera's corresponding attributes will not be modified by this mod", "screen.tooltip.xtracr_realcamera.modelView_configs": "Saved Configs", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copy all disabling settings", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Delete the selected rectangle\n(Or use the Delete key)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Planes where all vertex-to-screen distances are less than this value will not be rendered", "screen.tooltip.xtracr_realcamera.modelView_disable": "Disabling Settings\nGlobal disabling settings are in the config screen", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Import the config from the clipboard", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import failed: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s succeeded!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Paste all disabling settings in the clipboard to current config\n(Will not override existing setting with the same name)", "screen.tooltip.xtracr_realcamera.modelView_preview": "In the preview mode, you can adjust the camera's offset and rotation", "screen.tooltip.xtracr_realcamera.modelView_priority": "Priority when binding, the larger the value the higher the priority, and the higher the sorting on the right side", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Save as\n(When there is a setting with the same name, you can also press the save button on the left)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Open Global Config Screen\n(Cloth Config API required)", "screen.widget.xtracr_realcamera.modelView_all": "All", "screen.widget.xtracr_realcamera.modelView_configs": "Configs", - "screen.widget.xtracr_realcamera.modelView_copy": "Copy", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Current Config", "screen.widget.xtracr_realcamera.modelView_disable": "Disable", "screen.widget.xtracr_realcamera.modelView_disableMode": "Disable Mode", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Y Offset = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z Offset = %s", "screen.widget.xtracr_realcamera.modelView_part": "Part", - "screen.widget.xtracr_realcamera.modelView_paste": "Paste", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", "screen.widget.xtracr_realcamera.modelView_position": "Target Plane", "screen.widget.xtracr_realcamera.modelView_preview": "Preview", diff --git a/common/src/main/resources/assets/realcamera/lang/es_es.json b/common/src/main/resources/assets/realcamera/lang/es_es.json index 921cd865..5139d5df 100644 --- a/common/src/main/resources/assets/realcamera/lang/es_es.json +++ b/common/src/main/resources/assets/realcamera/lang/es_es.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Hace que la cámara sea más realista en la vista en primera persona.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Cuando está desactivado, la relación relativa de la cámara con el modelo no cambiará, pero los atributos correspondientes de la cámara no serán modificados por este mod", "screen.tooltip.xtracr_realcamera.modelView_configs": "Configuraciones Guardadas", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas las configuraciones de desactivación", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Eliminar el rectángulo seleccionado\n(O usar la tecla Delete)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Los planos donde todas las distancias de vértice a pantalla son menores que este valor no se renderizarán", "screen.tooltip.xtracr_realcamera.modelView_disable": "Configuraciones de Desactivación\nLas configuraciones globales de desactivación están en la pantalla de configuración", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Importar la configuración desde el portapapeles", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Importación fallida: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "¡Importación %s exitosa!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Pegar todas las configuraciones de desactivación del portapapeles a la configuración actual\n(No sobrescribirá la configuración existente con el mismo nombre)", "screen.tooltip.xtracr_realcamera.modelView_preview": "En el modo de vista previa, puedes ajustar el desplazamiento y rotación de la cámara", "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridad al vincular, cuanto mayor sea el valor, mayor será la prioridad y más alto será el orden en el lado derecho", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Guardar como\n(Cuando existe una configuración con el mismo nombre, también puede usar el botón guardar a la izquierda)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir la Pantalla de Configuración Global\n(Requiere Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "Todo", "screen.widget.xtracr_realcamera.modelView_configs": "Configuraciones", - "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuración Actual", "screen.widget.xtracr_realcamera.modelView_disable": "Desactivar", "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo Desactivado", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Desplazamiento Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Desplazamiento Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Parte", - "screen.widget.xtracr_realcamera.modelView_paste": "Pegar", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", "screen.widget.xtracr_realcamera.modelView_position": "Plano Objetivo", "screen.widget.xtracr_realcamera.modelView_preview": "Vista Previa", diff --git a/common/src/main/resources/assets/realcamera/lang/fr_fr.json b/common/src/main/resources/assets/realcamera/lang/fr_fr.json index 69dd50bf..a174e7ea 100644 --- a/common/src/main/resources/assets/realcamera/lang/fr_fr.json +++ b/common/src/main/resources/assets/realcamera/lang/fr_fr.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Rendre la caméra plus réaliste en vue à la première personne.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Lorsqu'il est désactivé, la relation relative de la caméra avec le modèle ne changera pas, mais les attributs correspondants de la caméra ne seront pas modifiés par ce mod", "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurations enregistrées", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copier tous les paramètres de désactivation", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Supprimer le rectangle sélectionné\n(Ou utiliser la touche Suppr)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Les plans où toutes les distances vertex-à-écran sont inférieures à cette valeur ne seront pas rendus", "screen.tooltip.xtracr_realcamera.modelView_disable": "Paramètres de désactivation\nLes paramètres de désactivation globaux se trouvent dans l'écran de configuration", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Importer la configuration depuis le presse-papiers", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Échec de l'importation : \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importation %s réussie !", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Coller tous les paramètres de désactivation du presse-papiers dans la configuration actuelle\n(Ne remplacera pas les paramètres existants portant le même nom)", "screen.tooltip.xtracr_realcamera.modelView_preview": "En mode aperçu, vous pouvez ajuster le décalage et la rotation de la caméra", "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorité lors de la liaison, plus la valeur est grande, plus la priorité est élevée et plus le tri est haut sur le côté droit", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Enregistrer sous\n(Lorsqu'il existe une configuration avec le même nom, vous pouvez également utiliser le bouton enregistrer à gauche)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Ouvrir l'écran de configuration globale\n(API Cloth Config requise)", "screen.widget.xtracr_realcamera.modelView_all": "Tout", "screen.widget.xtracr_realcamera.modelView_configs": "Configurations", - "screen.widget.xtracr_realcamera.modelView_copy": "Copier", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Config Actuelle", "screen.widget.xtracr_realcamera.modelView_disable": "Désactiver", "screen.widget.xtracr_realcamera.modelView_disableMode": "Mode Désactivé", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Décalage Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Décalage Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Partie", - "screen.widget.xtracr_realcamera.modelView_paste": "Coller", "screen.widget.xtracr_realcamera.modelView_pitch": "Tangage = %s", "screen.widget.xtracr_realcamera.modelView_position": "Plan Cible", "screen.widget.xtracr_realcamera.modelView_preview": "Aperçu", diff --git a/common/src/main/resources/assets/realcamera/lang/ja_jp.json b/common/src/main/resources/assets/realcamera/lang/ja_jp.json index 7b167d1d..0858a1fb 100644 --- a/common/src/main/resources/assets/realcamera/lang/ja_jp.json +++ b/common/src/main/resources/assets/realcamera/lang/ja_jp.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "一人称視点のカメラをよりリアルにします。", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "無効時、カメラとモデルの相対的な位置関係は変化しませんが、カメラの対応する属性はこのMODによって変更されません", "screen.tooltip.xtracr_realcamera.modelView_configs": "保存済み設定", - "screen.tooltip.xtracr_realcamera.modelView_copy": "全ての無効設定をコピー", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "選択された矩形を削除\n(またはDeleteキーを使用)", "screen.tooltip.xtracr_realcamera.modelView_depth": "全ての頂点から画面までの距離がこの値より小さい面はレンダリングされません", "screen.tooltip.xtracr_realcamera.modelView_disable": "無効設定\nグローバル無効設定は設定画面にあります", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "クリップボードから設定をインポート", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "インポートに失敗しました: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%sのインポートに成功しました!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "クリップボードの全ての無効設定を現在の設定に貼り付け\n(同名設定は上書きされません)", "screen.tooltip.xtracr_realcamera.modelView_preview": "プレビューモードでカメラの様々なオフセットを調整できます", "screen.tooltip.xtracr_realcamera.modelView_priority": "バインディング時の優先度、値が大きいほど優先度が高く右側のソートで上位に表示", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "名前を付けて保存\n(同名設定がある場合も左の保存ボタンを使用できます)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "グローバル設定画面を開く\n(Cloth Config APIが必要)", "screen.widget.xtracr_realcamera.modelView_all": "全て", "screen.widget.xtracr_realcamera.modelView_configs": "設定", - "screen.widget.xtracr_realcamera.modelView_copy": "コピー", "screen.widget.xtracr_realcamera.modelView_currentConfig": "現在の設定", "screen.widget.xtracr_realcamera.modelView_disable": "無効", "screen.widget.xtracr_realcamera.modelView_disableMode": "無効モード", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Yオフセット = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Zオフセット = %s", "screen.widget.xtracr_realcamera.modelView_part": "一部", - "screen.widget.xtracr_realcamera.modelView_paste": "貼り付け", "screen.widget.xtracr_realcamera.modelView_pitch": "ピッチ = %s", "screen.widget.xtracr_realcamera.modelView_position": "ターゲット平面", "screen.widget.xtracr_realcamera.modelView_preview": "プレビュー", diff --git a/common/src/main/resources/assets/realcamera/lang/ko_kr.json b/common/src/main/resources/assets/realcamera/lang/ko_kr.json index 5936f653..af9931ee 100644 --- a/common/src/main/resources/assets/realcamera/lang/ko_kr.json +++ b/common/src/main/resources/assets/realcamera/lang/ko_kr.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "1인칭 시점에서 카메라를 더 현실적으로 만듭니다", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "비활성화 시 카메라와 모델의 상대적 관계는 변하지 않지만, 카메라의 해당 속성은 이 모드에서 수정되지 않습니다", "screen.tooltip.xtracr_realcamera.modelView_configs": "저장된 설정", - "screen.tooltip.xtracr_realcamera.modelView_copy": "모든 비활성화 설정 복사", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "선택된 사각형 삭제\n(또는 Delete 키 사용)", "screen.tooltip.xtracr_realcamera.modelView_depth": "모든 정점-화면 거리가 이 값보다 작은 면은 렌더링되지 않습니다", "screen.tooltip.xtracr_realcamera.modelView_disable": "비활성화 설정\n전역 비활성화 설정은 설정 화면에 있습니다", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "클립보드에서 설정 가져오기", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "가져오기 실패: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s 가져오기 성공!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "클립보드의 모든 비활성화 설정을 현재 설정에 붙여넣기\n(동일 이름 설정 덮어쓰지 않음)", "screen.tooltip.xtracr_realcamera.modelView_preview": "미리보기 모드에서 카메라의 다양한 오프셋 조정 가능", "screen.tooltip.xtracr_realcamera.modelView_priority": "바인딩 시 우선순위, 값이 클수록 우선순위가 높으며 오른쪽 정렬에서 위쪽에 표시", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "다른 이름으로 저장\n(동일 이름 설정이 있을 때 왼쪽 저장 버튼도 사용 가능)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "전역 설정 화면 열기\n(Cloth Config API 필요)", "screen.widget.xtracr_realcamera.modelView_all": "전체", "screen.widget.xtracr_realcamera.modelView_configs": "설정", - "screen.widget.xtracr_realcamera.modelView_copy": "복사", "screen.widget.xtracr_realcamera.modelView_currentConfig": "현재 설정", "screen.widget.xtracr_realcamera.modelView_disable": "비활성화", "screen.widget.xtracr_realcamera.modelView_disableMode": "비활성화 모드", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Y 오프셋 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z 오프셋 = %s", "screen.widget.xtracr_realcamera.modelView_part": "부분", - "screen.widget.xtracr_realcamera.modelView_paste": "붙여넣기", "screen.widget.xtracr_realcamera.modelView_pitch": "피치 = %s", "screen.widget.xtracr_realcamera.modelView_position": "대상 평면", "screen.widget.xtracr_realcamera.modelView_preview": "미리보기", diff --git a/common/src/main/resources/assets/realcamera/lang/lzh.json b/common/src/main/resources/assets/realcamera/lang/lzh.json index 88c8885b..a0ed305b 100644 --- a/common/src/main/resources/assets/realcamera/lang/lzh.json +++ b/common/src/main/resources/assets/realcamera/lang/lzh.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "使第一人稱之鏡觀愈真。", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "禁時,鏡觀與模型之相對不變,然鏡觀之對應性不為本模所改", "screen.tooltip.xtracr_realcamera.modelView_configs": "已存之設", - "screen.tooltip.xtracr_realcamera.modelView_copy": "抄諸禁設", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "去擇之矩\n(或用Delete鍵)", "screen.tooltip.xtracr_realcamera.modelView_depth": "諸頂點至屏距皆小於此值之面不顯", "screen.tooltip.xtracr_realcamera.modelView_disable": "禁設\n全禁設在設屏中", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "从剪貼板入設", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "入敗:\n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "入%s成!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "貼剪貼板諸禁設至今設\n(不蓋同名設)", "screen.tooltip.xtracr_realcamera.modelView_preview": "於覽式可調鏡觀諸偏移", "screen.tooltip.xtracr_realcamera.modelView_priority": "系定之先級,值愈大愈先,且右列愈前", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "存為\n(當有同名設時,亦可用左存鈕)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "啟全設屏\n(需裝Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "全", "screen.widget.xtracr_realcamera.modelView_configs": "設", - "screen.widget.xtracr_realcamera.modelView_copy": "抄", "screen.widget.xtracr_realcamera.modelView_currentConfig": "現綁配", "screen.widget.xtracr_realcamera.modelView_disable": "禁", "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用之法", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Y移 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z移 = %s", "screen.widget.xtracr_realcamera.modelView_part": "塊", - "screen.widget.xtracr_realcamera.modelView_paste": "貼", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰 = %s", "screen.widget.xtracr_realcamera.modelView_position": "的平面", "screen.widget.xtracr_realcamera.modelView_preview": "覽", diff --git a/common/src/main/resources/assets/realcamera/lang/pl_pl.json b/common/src/main/resources/assets/realcamera/lang/pl_pl.json index 3a70311c..0b75ce8a 100644 --- a/common/src/main/resources/assets/realcamera/lang/pl_pl.json +++ b/common/src/main/resources/assets/realcamera/lang/pl_pl.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Uczynienie kamery bardziej realistyczną w trybie pierwszoosobowym.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Po wyłączeniu względna pozycja kamery względem modelu nie ulegnie zmianie, ale odpowiednie atrybuty kamery nie będą modyfikowane przez ten mod", "screen.tooltip.xtracr_realcamera.modelView_configs": "Zapisane konfiguracje", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Skopiuj wszystkie ustawienia wyłączenia", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Usuń zaznaczony prostokąt\n(Lub użyj klawisza Delete)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Płaszczyzny, w których wszystkie odległości od wierzchołka do ekranu są mniejsze niż ta wartość, nie będą renderowane", "screen.tooltip.xtracr_realcamera.modelView_disable": "Ustawienia wyłączenia\nGlobalne ustawienia wyłączenia znajdują się na ekranie konfiguracji", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Importuj konfigurację ze schowka", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Import nie powiódł się: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s powiódł się!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Wklej wszystkie ustawienia wyłączenia ze schowka do bieżącej konfiguracji\n(Nie nadpisze istniejących ustawień o tej samej nazwie)", "screen.tooltip.xtracr_realcamera.modelView_preview": "W trybie podglądu możesz dostosować przesunięcie i obrót kamery", "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorytet powiązania: im większa wartość, tym wyższy priorytet i wyższe sortowanie po prawej stronie", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Zapisz jako\n(Gdy istnieje konfiguracja o tej samej nazwie, możesz również użyć przycisku zapisu po lewej stronie)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Otwórz globalny ekran konfiguracji\n(Wymagane Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "Wszystko", "screen.widget.xtracr_realcamera.modelView_configs": "Konfiguracje", - "screen.widget.xtracr_realcamera.modelView_copy": "Kopiuj", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Bieżąca Konfiguracja", "screen.widget.xtracr_realcamera.modelView_disable": "Wyłącz", "screen.widget.xtracr_realcamera.modelView_disableMode": "Tryb wyłączenia", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Przesunięcie Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Przesunięcie Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Część", - "screen.widget.xtracr_realcamera.modelView_paste": "Wklej", "screen.widget.xtracr_realcamera.modelView_pitch": "Pochylenie = %s", "screen.widget.xtracr_realcamera.modelView_position": "Płaszczyzna docelowa", "screen.widget.xtracr_realcamera.modelView_preview": "Podgląd", diff --git a/common/src/main/resources/assets/realcamera/lang/pt_br.json b/common/src/main/resources/assets/realcamera/lang/pt_br.json index ae0d7381..8b604596 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_br.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_br.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Torna a câmera mais realista na visão em primeira pessoa.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Quando desativado, a relação relativa da câmera com o modelo não mudará, mas os atributos correspondentes da câmera não serão modificados por este mod", "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurações Salvas", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas as configurações de desativação", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Excluir o retângulo selecionado\n(Ou use a tecla Delete)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Planos onde todas as distâncias vértice-para-tela são menores que este valor não serão renderizados", "screen.tooltip.xtracr_realcamera.modelView_disable": "Configurações de Desativação\nConfigurações globais de desativação estão na tela de configuração", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Colar todas as configurações de desativação da área de transferência para a configuração atual\n(Não substituirá configurações existentes com o mesmo nome)", "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir a Tela de Configuração Global\n(Cloth Config API necessário)", "screen.widget.xtracr_realcamera.modelView_all": "Todos", "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", - "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", "screen.widget.xtracr_realcamera.modelView_disable": "Desativar", "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo de Desativação", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Deslocamento Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Deslocamento Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Parte", - "screen.widget.xtracr_realcamera.modelView_paste": "Colar", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", "screen.widget.xtracr_realcamera.modelView_position": "Plano Alvo", "screen.widget.xtracr_realcamera.modelView_preview": "Pré-visualização", diff --git a/common/src/main/resources/assets/realcamera/lang/pt_pt.json b/common/src/main/resources/assets/realcamera/lang/pt_pt.json index b672d933..ccbb4f41 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_pt.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_pt.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Torne a câmera mais realista na visão em primeira pessoa.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Quando desativado, a relação relativa da câmera com o modelo não mudará, mas os atributos correspondentes da câmera não serão modificados por este mod", "screen.tooltip.xtracr_realcamera.modelView_configs": "Configurações Salvas", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Copiar todas as configurações de desativação", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Excluir o retângulo selecionado\n(Ou use a tecla Delete)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Planos onde todas as distâncias vértice-para-tela são menores que este valor não serão renderizados", "screen.tooltip.xtracr_realcamera.modelView_disable": "Configurações de Desativação\nConfigurações globais de desativação estão na tela de configuração", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Importar configuração da área de transferência", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Falha na importação: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Colar todas as configurações de desativação da área de transferência para a configuração atual\n(Não substituirá configurações existentes com o mesmo nome)", "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Abrir a Tela de Configuração Global\n(Cloth Config API necessário)", "screen.widget.xtracr_realcamera.modelView_all": "Todos", "screen.widget.xtracr_realcamera.modelView_configs": "Configurações", - "screen.widget.xtracr_realcamera.modelView_copy": "Copiar", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Configuração Atual", "screen.widget.xtracr_realcamera.modelView_disable": "Desativar", "screen.widget.xtracr_realcamera.modelView_disableMode": "Modo de Desativação", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Deslocamento Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Deslocamento Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Parte", - "screen.widget.xtracr_realcamera.modelView_paste": "Colar", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", "screen.widget.xtracr_realcamera.modelView_position": "Plano Alvo", "screen.widget.xtracr_realcamera.modelView_preview": "Pré-visualização", diff --git a/common/src/main/resources/assets/realcamera/lang/ru_ru.json b/common/src/main/resources/assets/realcamera/lang/ru_ru.json index fb449b6a..eb8eec98 100644 --- a/common/src/main/resources/assets/realcamera/lang/ru_ru.json +++ b/common/src/main/resources/assets/realcamera/lang/ru_ru.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Сделать камеру более реалистичной в режиме от первого лица.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "При отключении относительное положение камеры к модели не изменится, но соответствующие атрибуты камеры не будут изменены этим модом", "screen.tooltip.xtracr_realcamera.modelView_configs": "Сохраненные конфигурации", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Копировать все настройки отключения", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Удалить выбранный прямоугольник\n(Или используйте клавишу Delete)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Плоскости, где все расстояния от вершины до экрана меньше этого значения, не будут отображаться", "screen.tooltip.xtracr_realcamera.modelView_disable": "Настройки отключения\nГлобальные настройки отключения находятся на экране конфигурации", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Импортировать конфигурацию из буфера обмена", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Ошибка импорта: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Импорт %s успешен!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Вставить все настройки отключения из буфера обмена в текущую конфигурацию\n(Не перезапишет существующие настройки с тем же именем)", "screen.tooltip.xtracr_realcamera.modelView_preview": "В режиме предпросмотра вы можете настроить смещение и вращение камеры", "screen.tooltip.xtracr_realcamera.modelView_priority": "Приоритет при привязке: чем больше значение, тем выше приоритет и выше сортировка на правой стороне", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Сохранить как\n(При наличии настройки с тем же именем вы также можете использовать кнопку сохранения слева)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Открыть глобальный экран конфигурации\n(Требуется Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "Все", "screen.widget.xtracr_realcamera.modelView_configs": "Конфигурации", - "screen.widget.xtracr_realcamera.modelView_copy": "Копировать", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Текущая Конфигурация", "screen.widget.xtracr_realcamera.modelView_disable": "Отключить", "screen.widget.xtracr_realcamera.modelView_disableMode": "Режим отключения", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Смещение Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Смещение Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Часть", - "screen.widget.xtracr_realcamera.modelView_paste": "Вставить", "screen.widget.xtracr_realcamera.modelView_pitch": "Тангаж = %s", "screen.widget.xtracr_realcamera.modelView_position": "Целевая плоскость", "screen.widget.xtracr_realcamera.modelView_preview": "Предпросмотр", diff --git a/common/src/main/resources/assets/realcamera/lang/tr_tr.json b/common/src/main/resources/assets/realcamera/lang/tr_tr.json index 4fec1c17..2dd336f2 100644 --- a/common/src/main/resources/assets/realcamera/lang/tr_tr.json +++ b/common/src/main/resources/assets/realcamera/lang/tr_tr.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Birinci şahıs görünümünde kamerayı daha gerçekçi hale getirir.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "Devre dışı bırakıldığında, kameranın modele göre göreceli ilişkisi değişmeyecek, ancak kameranın ilgili özellikleri bu mod tarafından değiştirilmeyecektir", "screen.tooltip.xtracr_realcamera.modelView_configs": "Kayıtlı Yapılandırmalar", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Tüm devre dışı bırakma ayarlarını kopyala", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Seçili dikdörtgeni sil\n(Veya Sil tuşunu kullanın)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Tüm köşe-ekran mesafelerinin bu değerden küçük olduğu düzlemler render edilmeyecektir", "screen.tooltip.xtracr_realcamera.modelView_disable": "Devre Dışı Bırakma Ayarları\nGenel devre dışı bırakma ayarları ayarlar ekranındadır", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Panodan yapılandırmayı içe aktar", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "İçe aktarma başarısız: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s içe aktarma başarılı!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Panodaki tüm devre dışı bırakma ayarlarını mevcut yapılandırmaya yapıştır\n(Aynı isimdeki mevcut ayarların üzerine yazılmaz)", "screen.tooltip.xtracr_realcamera.modelView_preview": "Önizleme modunda kameranın çeşitli ofsetlerini ayarlayabilirsiniz", "screen.tooltip.xtracr_realcamera.modelView_priority": "Bağlama önceliği, değer ne kadar büyükse öncelik o kadar yüksektir ve sağ taraftaki sıralama da o kadar yukarıdadır", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Farklı Kaydet\n(Aynı isimde bir ayar olduğunda, soldaki kaydet düğmesini de kullanabilirsiniz)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Genel Yapılandırma Ekranını Aç\n(Cloth Config API gerekli)", "screen.widget.xtracr_realcamera.modelView_all": "Tümü", "screen.widget.xtracr_realcamera.modelView_configs": "Yapılandırmalar", - "screen.widget.xtracr_realcamera.modelView_copy": "Kopyala", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Mevcut Yapılandırma", "screen.widget.xtracr_realcamera.modelView_disable": "Devre Dışı Bırak", "screen.widget.xtracr_realcamera.modelView_disableMode": "Devre Dışı Bırakma Modu", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Y Ofseti = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z Ofseti = %s", "screen.widget.xtracr_realcamera.modelView_part": "Parça", - "screen.widget.xtracr_realcamera.modelView_paste": "Yapıştır", "screen.widget.xtracr_realcamera.modelView_pitch": "Pitch = %s", "screen.widget.xtracr_realcamera.modelView_position": "Hedef Düzlem", "screen.widget.xtracr_realcamera.modelView_preview": "Önizleme", diff --git a/common/src/main/resources/assets/realcamera/lang/uk_ua.json b/common/src/main/resources/assets/realcamera/lang/uk_ua.json index aa48b777..27307c1b 100644 --- a/common/src/main/resources/assets/realcamera/lang/uk_ua.json +++ b/common/src/main/resources/assets/realcamera/lang/uk_ua.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "Зробити камеру більш реалістичною в режимі від першої особи.", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "При вимкненні відносне положення камери до моделі не зміниться, але відповідні атрибути камери не будуть змінені цим модом", "screen.tooltip.xtracr_realcamera.modelView_configs": "Збережені конфігурації", - "screen.tooltip.xtracr_realcamera.modelView_copy": "Копіювати всі налаштування вимкнення", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "Видалити вибраний прямокутник\n(Або використовуйте клавішу Delete)", "screen.tooltip.xtracr_realcamera.modelView_depth": "Площини, де всі відстані від вершини до екрану менші за це значення, не будуть відображатися", "screen.tooltip.xtracr_realcamera.modelView_disable": "Налаштування вимкнення\nГлобальні налаштування вимкнення знаходяться на екрані конфігурації", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "Імпортувати конфігурацію з буфера обміну", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "Помилка імпорту: \n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпорт %s успішний!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "Вставити всі налаштування вимкнення з буфера обміну в поточну конфігурацію\n(Не перезапише існуючі налаштування з тим же ім'ям)", "screen.tooltip.xtracr_realcamera.modelView_preview": "У режимі попереднього перегляду ви можете налаштувати зміщення та обертання камери", "screen.tooltip.xtracr_realcamera.modelView_priority": "Пріоритет при прив'язці: чим більше значення, тим вищий пріоритет і вище сортування на правій стороні", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Зберегти як\n(При наявності налаштування з тим же ім'ям ви також можете використовувати кнопку збереження зліва)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "Відкрити глобальний екран конфігурації\n(Потрібен Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "Усе", "screen.widget.xtracr_realcamera.modelView_configs": "Конфігурації", - "screen.widget.xtracr_realcamera.modelView_copy": "Копіювати", "screen.widget.xtracr_realcamera.modelView_currentConfig": "Поточна Конфігурація", "screen.widget.xtracr_realcamera.modelView_disable": "Вимкнути", "screen.widget.xtracr_realcamera.modelView_disableMode": "Режим вимкнення", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Зміщення Y = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Зміщення Z = %s", "screen.widget.xtracr_realcamera.modelView_part": "Частина", - "screen.widget.xtracr_realcamera.modelView_paste": "Вставити", "screen.widget.xtracr_realcamera.modelView_pitch": "Тангаж = %s", "screen.widget.xtracr_realcamera.modelView_position": "Цільова площина", "screen.widget.xtracr_realcamera.modelView_preview": "Попередній перегляд", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 4ce465b3..3ffd60e7 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "使第一人称视角下的摄像头更加真实。", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "当禁用时,摄像头与模型的相对关系不会变化,但摄像头的对应属性不会被本模组修改", "screen.tooltip.xtracr_realcamera.modelView_configs": "已保存的配置", - "screen.tooltip.xtracr_realcamera.modelView_copy": "复制所有禁用设置", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "删除选中的矩形\n(或使用Delete键)", "screen.tooltip.xtracr_realcamera.modelView_depth": "全部顶点到屏幕距离均小于该值的面不会被渲染", "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用设置\n全局禁用设置在配置屏幕中", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "从剪贴板导入配置", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "导入失败:\n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "导入%s成功!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "粘贴剪贴板中的所有禁用设置到当前配置\n(不会覆盖同名设置)", "screen.tooltip.xtracr_realcamera.modelView_preview": "在预览模式可以调整相机的各个偏移量", "screen.tooltip.xtracr_realcamera.modelView_priority": "绑定时的优先级,值越大优先级越高,并且在右侧排序越靠上", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "保存为\n(当存在同名设置时,也可使用左侧保存按钮)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打开全局配置屏幕\n(需要安装Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "全部", "screen.widget.xtracr_realcamera.modelView_configs": "配置", - "screen.widget.xtracr_realcamera.modelView_copy": "复制", "screen.widget.xtracr_realcamera.modelView_currentConfig": "当前配置", "screen.widget.xtracr_realcamera.modelView_disable": "禁用", "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Y偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_part": "部分", - "screen.widget.xtracr_realcamera.modelView_paste": "粘贴", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰角 = %s", "screen.widget.xtracr_realcamera.modelView_position": "目标平面", "screen.widget.xtracr_realcamera.modelView_preview": "预览", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_hk.json b/common/src/main/resources/assets/realcamera/lang/zh_hk.json index 96053fb9..c75986e5 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_hk.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_hk.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "使第一人稱視角下的攝像頭更加真實。", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "當禁用時,攝像頭與模型的相對關係不會變化,但攝像頭的對應屬性不會被本模組修改", "screen.tooltip.xtracr_realcamera.modelView_configs": "已儲存的配置", - "screen.tooltip.xtracr_realcamera.modelView_copy": "複製所有禁用設置", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "刪除選中的矩形\n(或使用Delete鍵)", "screen.tooltip.xtracr_realcamera.modelView_depth": "全部頂點到屏幕距離均小於該值的面不會被渲染", "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用設置\n全局禁用設置在配置屏幕中", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "貼上剪貼簿中的所有禁用設置到當前配置\n(不會覆蓋同名設置)", "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打開全局配置屏幕\n(需要安裝Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "全部", "screen.widget.xtracr_realcamera.modelView_configs": "配置", - "screen.widget.xtracr_realcamera.modelView_copy": "複製", "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", "screen.widget.xtracr_realcamera.modelView_disable": "禁用", "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Y偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_part": "部分", - "screen.widget.xtracr_realcamera.modelView_paste": "貼上", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰角 = %s", "screen.widget.xtracr_realcamera.modelView_position": "目標平面", "screen.widget.xtracr_realcamera.modelView_preview": "預覽", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_tw.json b/common/src/main/resources/assets/realcamera/lang/zh_tw.json index 96053fb9..c75986e5 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_tw.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_tw.json @@ -75,7 +75,6 @@ "modmenu.descriptionTranslation.realcamera": "使第一人稱視角下的攝像頭更加真實。", "screen.tooltip.xtracr_realcamera.modelView_bindButtons": "當禁用時,攝像頭與模型的相對關係不會變化,但攝像頭的對應屬性不會被本模組修改", "screen.tooltip.xtracr_realcamera.modelView_configs": "已儲存的配置", - "screen.tooltip.xtracr_realcamera.modelView_copy": "複製所有禁用設置", "screen.tooltip.xtracr_realcamera.modelView_deleteSelectedRectangle": "刪除選中的矩形\n(或使用Delete鍵)", "screen.tooltip.xtracr_realcamera.modelView_depth": "全部頂點到屏幕距離均小於該值的面不會被渲染", "screen.tooltip.xtracr_realcamera.modelView_disable": "禁用設置\n全局禁用設置在配置屏幕中", @@ -90,7 +89,6 @@ "screen.tooltip.xtracr_realcamera.modelView_import": "從剪貼簿導入配置", "screen.tooltip.xtracr_realcamera.modelView_importFailed": "導入失敗:\n%s", "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", - "screen.tooltip.xtracr_realcamera.modelView_paste": "貼上剪貼簿中的所有禁用設置到當前配置\n(不會覆蓋同名設置)", "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", @@ -102,7 +100,6 @@ "screen.tooltip.xtracr_realcamera.modelView_toConfigScreen": "打開全局配置屏幕\n(需要安裝Cloth Config API)", "screen.widget.xtracr_realcamera.modelView_all": "全部", "screen.widget.xtracr_realcamera.modelView_configs": "配置", - "screen.widget.xtracr_realcamera.modelView_copy": "複製", "screen.widget.xtracr_realcamera.modelView_currentConfig": "當前配置", "screen.widget.xtracr_realcamera.modelView_disable": "禁用", "screen.widget.xtracr_realcamera.modelView_disableMode": "禁用模式", @@ -114,7 +111,6 @@ "screen.widget.xtracr_realcamera.modelView_offsetY": "Y偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_offsetZ": "Z偏移量 = %s", "screen.widget.xtracr_realcamera.modelView_part": "部分", - "screen.widget.xtracr_realcamera.modelView_paste": "貼上", "screen.widget.xtracr_realcamera.modelView_pitch": "俯仰角 = %s", "screen.widget.xtracr_realcamera.modelView_position": "目標平面", "screen.widget.xtracr_realcamera.modelView_preview": "預覽", diff --git a/common/src/main/resources/realcamera-common.mixins.json b/common/src/main/resources/realcamera-common.mixins.json index 1f026f74..fea92b3d 100644 --- a/common/src/main/resources/realcamera-common.mixins.json +++ b/common/src/main/resources/realcamera-common.mixins.json @@ -19,7 +19,8 @@ "accessor.CustomFeatureRenderer$StorageAccessor", "accessor.GuiGraphicsExtractorAccessor", "accessor.ModelFeatureRenderer$StorageAccessor", - "accessor.ModelPartFeatureRenderer$StorageAccessor" + "accessor.ModelPartFeatureRenderer$StorageAccessor", + "accessor.RenderTypeAccessor" ], "server": [ ], diff --git a/common/src/main/resources/realcamera.accesswidener b/common/src/main/resources/realcamera.accesswidener index 869e8c7c..8b9c3f07 100644 --- a/common/src/main/resources/realcamera.accesswidener +++ b/common/src/main/resources/realcamera.accesswidener @@ -1,3 +1,4 @@ accessWidener v2 official accessible class net/minecraft/client/gui/GuiGraphicsExtractor$ScissorStack +accessible class net/minecraft/client/renderer/rendertype/RenderSetup$TextureBinding extendable method net/minecraft/client/renderer/MultiBufferSource$BufferSource endBatch (Lnet/minecraft/client/renderer/rendertype/RenderType;Lcom/mojang/blaze3d/vertex/BufferBuilder;)V \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/accesstransformer.cfg b/neoforge/src/main/resources/META-INF/accesstransformer.cfg index 3e09a5a6..9b411f49 100644 --- a/neoforge/src/main/resources/META-INF/accesstransformer.cfg +++ b/neoforge/src/main/resources/META-INF/accesstransformer.cfg @@ -1,2 +1,3 @@ public net.minecraft.client.gui.GuiGraphicsExtractor$ScissorStack +public net.minecraft.client.renderer.rendertype.RenderSetup$TextureBinding protected net.minecraft.client.renderer.MultiBufferSource$BufferSource endBatch(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/BufferBuilder;)V \ No newline at end of file From d811c45f0c59a703862c4c8b494fd3769f90c926 Mon Sep 17 00:00:00 2001 From: xTracr Date: Sat, 9 May 2026 14:08:10 +0800 Subject: [PATCH 11/34] Replace `Float2ObjectOpenHashMap` with `LongOpenHashSet` --- .../realcamera/compat/DisableHelper.java | 4 +++- .../xtracr/realcamera/compat/YSMCompat.java | 4 ++-- .../xtracr/realcamera/config/BindTarget.java | 18 +++++++----------- gradle.properties | 10 +++++----- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index 015ea304..70c6140a 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -13,9 +13,11 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; +import java.util.regex.Pattern; public class DisableHelper { public static final Entry MAIN_FEATURE, RENDER_MODEL, RENDER_HANDS; + private static final Pattern MULTI_STAR = Pattern.compile("\\*+"); private static final Predicate FALSE = _ -> false; private static final Map entries = new HashMap<>(); public static int exitTick = 0; @@ -81,7 +83,7 @@ public static boolean matchesItemPattern(Item item, String pattern) { public static boolean simpleWildcardMatch(String text, String pattern) { if (pattern.isEmpty()) return text.isEmpty(); if (pattern.equals(text)) return true; - String[] parts = pattern.split("\\*+"); + String[] parts = MULTI_STAR.split(pattern); if (parts.length == 0) return true; int currentIndex = 0; if (!pattern.startsWith("*")) { diff --git a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java index 1a2d846c..e00e6bf9 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java @@ -78,7 +78,7 @@ public TransformedVertexRecorder setRotation(float pitch, float yaw) { public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { - BindResult result = resultMap.computeIfAbsent(target, _ -> new BindResult(target)); + BindResult result = resultMap.computeIfAbsent(target, BindResult::new); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = new VertexData.UV(config.posU(), config.posV()); VertexData.UV forwardUV = new VertexData.UV(config.forwardU(), config.forwardV()); @@ -100,7 +100,7 @@ public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { public void computeBindResult(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { - BindResult result = resultMap.computeIfAbsent(target, _ -> new BindResult(target)); + BindResult result = resultMap.computeIfAbsent(target, BindResult::new); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = result.getPosition() == Vec3.ZERO ? new VertexData.UV(config.posU(), config.posV()) : null; VertexData.UV forwardUV = result.getForward() == Vec3.ZERO ? new VertexData.UV(config.forwardU(), config.forwardV()) : null; diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index 3f5dc027..32ce669c 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -5,8 +5,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.xtracr.realcamera.renderer.state.VertexData; -import it.unimi.dsi.fastutil.floats.Float2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.floats.FloatOpenHashSet; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; @@ -211,7 +210,7 @@ public void write(FriendlyByteBuf byteBuf) { @JsonAdapter(DisableConfig.Adapter.class) public static class DisableConfig { - private final Float2ObjectOpenHashMap disableCacheMap = new Float2ObjectOpenHashMap<>(); + private final LongOpenHashSet disabledUVs = new LongOpenHashSet(), enabledUVs = new LongOpenHashSet(); private final String name; private final String textureId; private final boolean disableAll; @@ -222,7 +221,6 @@ public DisableConfig(String name, String textureId, boolean disableAll, UVRectan this.textureId = textureId; this.disableAll = disableAll; this.rectangles = rectangles; - disableCacheMap.defaultReturnValue(FloatOpenHashSet.of()); } public static DisableConfig read(FriendlyByteBuf byteBuf) { @@ -264,17 +262,15 @@ public void write(FriendlyByteBuf byteBuf) { public boolean disable(VertexData vertex) { final float u = vertex.u(), v = vertex.v(); - final FloatOpenHashSet cachedVs = disableCacheMap.get(u); - if (!cachedVs.isEmpty()) { - if (cachedVs.contains(v)) return true; - if (cachedVs.contains(-v)) return false; - } + final long packed = (long) Float.floatToIntBits(u) << 32 | Float.floatToIntBits(v); + if (enabledUVs.contains(packed)) return false; + if (disabledUVs.contains(packed)) return true; for (UVRectangle rect : rectangles) { if (!rect.contains(u, v)) continue; - disableCacheMap.computeIfAbsent(u, _ -> new FloatOpenHashSet()).add(v); + disabledUVs.add(packed); return true; } - disableCacheMap.computeIfAbsent(u, _ -> new FloatOpenHashSet()).add(-v); + enabledUVs.add(packed); return false; } diff --git a/gradle.properties b/gradle.properties index e08ad7e8..16bf9fb3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,17 +4,17 @@ org.gradle.parallel=true org.gradle.configuration-cache=false ## Environment Properties java_version=25 -minecraft_version=26.1.1 +minecraft_version=26.1.2 enabled_platforms=fabric,neoforge loom_version=1.16-SNAPSHOT -fabric_loader_version=0.19.0 -neoforge_version=26.1.1.14-beta +fabric_loader_version=0.19.2 +neoforge_version=26.1.2.36-beta moddev_version=2.0.141 ## Mod Properties mod_id=realcamera -mod_version=0.7.6-beta +mod_version=0.7.7-beta mod_group_id=com.xtracr.realcamera ## Dependencies -fabric_api_version=0.145.4+26.1.1 +fabric_api_version=0.147.0+26.1.2 cloth_config_version=26.1.154 modmenu_version=18.0.0-alpha.8 From f69509813971bb8a2114ba42cd9deefd38ae5eae Mon Sep 17 00:00:00 2001 From: xTracr Date: Tue, 12 May 2026 17:22:04 +0800 Subject: [PATCH 12/34] Extract RenderTypeUtil with evicting caches; finalize utility classes -- Upgrade gradle to 9.5.0 --- .gitignore | 3 +- .../renderer/BuiltIterableBuffer.java | 44 ++--------- .../xtracr/realcamera/util/CrosshairUtil.java | 2 +- .../com/xtracr/realcamera/util/LocUtil.java | 2 +- .../com/xtracr/realcamera/util/MathUtil.java | 2 +- .../xtracr/realcamera/util/RaycastUtil.java | 2 +- .../realcamera/util/RenderTypeUtil.java | 76 +++++++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 5 +- 8 files changed, 89 insertions(+), 47 deletions(-) create mode 100644 common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java diff --git a/.gitignore b/.gitignore index 36d81e47..87beff70 100644 --- a/.gitignore +++ b/.gitignore @@ -36,5 +36,6 @@ replay_*.log *.hprof *.jfr -# claude +# agent +AGENTS.md CLAUDE.md \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index 611914be..c684a565 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -1,56 +1,22 @@ package com.xtracr.realcamera.renderer; import com.mojang.blaze3d.vertex.MeshData; -import com.xtracr.realcamera.RealCamera; -import com.xtracr.realcamera.mixin.accessor.RenderTypeAccessor; import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.renderer.state.VertexData.UV; -import net.minecraft.client.renderer.rendertype.RenderSetup; +import com.xtracr.realcamera.util.RenderTypeUtil; import net.minecraft.client.renderer.rendertype.RenderType; import org.jspecify.annotations.Nullable; import java.awt.*; -import java.lang.reflect.Field; -import java.util.HashMap; import java.util.Map; public record BuiltIterableBuffer(RenderType renderType, String textureId, IterableVertexBuffer vertexBuffer) { - @Nullable - private static final Field TEXTURES_FIELD; - private static final Map TEXTURE_ID_CACHE = new HashMap<>(); - private static final Map> FIND_PRIMITIVE_CACHE = new HashMap<>(); - - static { - Field texturesField = null; - try { - texturesField = RenderSetup.class.getDeclaredField("textures"); - texturesField.setAccessible(true); - } catch (NoSuchFieldException e) { - RealCamera.LOGGER.error("Failed to find textures field in RenderSetup", e); - } - TEXTURES_FIELD = texturesField; - } - public static BuiltIterableBuffer buildFrom(RenderType renderType, MeshData meshData) { - String textureId = TEXTURE_ID_CACHE.computeIfAbsent(renderType, BuiltIterableBuffer::getTextureId); - return new BuiltIterableBuffer(renderType, textureId, new IterableVertexBuffer(meshData)); - } - - @SuppressWarnings("unchecked") - private static String getTextureId(RenderType renderType) { - if (TEXTURES_FIELD == null) return renderType.toString(); - RenderSetup renderSetup = ((RenderTypeAccessor) renderType).getState(); - try { - Map textureBindings = (Map) TEXTURES_FIELD.get(renderSetup); - RenderSetup.TextureBinding sampler0 = textureBindings.get("Sampler0"); - if (sampler0 != null) return sampler0.location().toString(); - } catch (IllegalAccessException | IllegalArgumentException | ClassCastException _) { - } - return renderType.toString(); + return new BuiltIterableBuffer(renderType, RenderTypeUtil.getTextureId(renderType), new IterableVertexBuffer(meshData)); } public boolean anyNotCached(UV[] uvs) { - Map cache = FIND_PRIMITIVE_CACHE.get(renderType); + Map cache = RenderTypeUtil.getPrimitiveCache(renderType); if (cache == null) return true; for (UV uv : uvs) { if (!cache.containsKey(uv)) return true; @@ -59,7 +25,7 @@ public boolean anyNotCached(UV[] uvs) { } public VertexData[] @Nullable [] findPrimitivesInCache(UV[] uvs) { - Map cache = FIND_PRIMITIVE_CACHE.get(renderType); + Map cache = RenderTypeUtil.getPrimitiveCache(renderType); int length = renderType.mode().primitiveLength, uvsLength = uvs.length; VertexData[][] primitives = new VertexData[uvsLength][]; if (cache == null) return primitives; @@ -116,7 +82,7 @@ public boolean anyNotCached(UV[] uvs) { uvCache[j * 2] = primitive[j].u(); uvCache[j * 2 + 1] = primitive[j].v(); } - FIND_PRIMITIVE_CACHE.computeIfAbsent(renderType, _ -> new HashMap<>()).put(uv, uvCache); + RenderTypeUtil.cachePrimitive(renderType, uv, uvCache); primitives[i] = VertexData.asImmutable(primitive); } return allFound; diff --git a/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java b/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java index 557c7dcb..16a7c2a6 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/CrosshairUtil.java @@ -8,7 +8,7 @@ import org.joml.Matrix3x2fStack; import org.joml.Matrix4fc; -public class CrosshairUtil { +public final class CrosshairUtil { public static EntityHitResult capturedEntityHitResult; public static Vec3 offset = Vec3.ZERO; diff --git a/common/src/main/java/com/xtracr/realcamera/util/LocUtil.java b/common/src/main/java/com/xtracr/realcamera/util/LocUtil.java index c2ea3007..3b0b14b8 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/LocUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/LocUtil.java @@ -4,7 +4,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -public class LocUtil { +public final class LocUtil { public static final String KEY_MOD_NAME = "general." + RealCamera.FULL_ID + ".modName"; public static MutableComponent MOD_NAME() { diff --git a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java index ab939a6a..315bc540 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java @@ -5,7 +5,7 @@ import org.joml.Matrix4fc; import org.joml.Vector4f; -public class MathUtil { +public final class MathUtil { public static double round(double d, int digits) { return Math.round(d * Math.pow(10, digits)) / Math.pow(10, digits); } diff --git a/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java b/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java index e2de0b92..c81c5103 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/RaycastUtil.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; -public class RaycastUtil { +public final class RaycastUtil { /** * Updates raycast start and end points ensuring: *
  • End point is on camera's viewing direction diff --git a/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java b/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java new file mode 100644 index 00000000..fa8df2b7 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java @@ -0,0 +1,76 @@ +package com.xtracr.realcamera.util; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.xtracr.realcamera.RealCamera; +import com.xtracr.realcamera.mixin.accessor.RenderTypeAccessor; +import com.xtracr.realcamera.renderer.state.VertexData.UV; +import net.minecraft.client.renderer.rendertype.RenderSetup; +import net.minecraft.client.renderer.rendertype.RenderType; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public final class RenderTypeUtil { + @Nullable + private static final Field TEXTURES_FIELD; + private static final LoadingCache TEXTURE_ID_CACHE = CacheBuilder.newBuilder() + .maximumSize(64) + .expireAfterAccess(60, TimeUnit.SECONDS) + .build(new TextureIdCacheLoader()); + private static final LoadingCache> PRIMITIVE_CACHE = CacheBuilder.newBuilder() + .maximumSize(64) + .expireAfterAccess(60, TimeUnit.SECONDS) + .build(new PrimitiveCacheLoader()); + + static { + Field texturesField = null; + try { + texturesField = RenderSetup.class.getDeclaredField("textures"); + texturesField.setAccessible(true); + } catch (NoSuchFieldException e) { + RealCamera.LOGGER.error("Failed to find textures field in RenderSetup", e); + } + TEXTURES_FIELD = texturesField; + } + + public static String getTextureId(RenderType renderType) { + return TEXTURE_ID_CACHE.getUnchecked(renderType); + } + + public static @Nullable Map getPrimitiveCache(RenderType renderType) { + return PRIMITIVE_CACHE.getIfPresent(renderType); + } + + public static void cachePrimitive(RenderType renderType, UV uv, float[] uvCoords) { + PRIMITIVE_CACHE.getUnchecked(renderType).put(uv, uvCoords); + } + + private static class TextureIdCacheLoader extends CacheLoader { + @SuppressWarnings("unchecked") + @Override + public @NonNull String load(@NonNull RenderType renderType) { + if (TEXTURES_FIELD == null) return renderType.toString(); + RenderSetup renderSetup = ((RenderTypeAccessor) renderType).getState(); + try { + Map textureBindings = (Map) TEXTURES_FIELD.get(renderSetup); + RenderSetup.TextureBinding sampler0 = textureBindings.get("Sampler0"); + if (sampler0 != null) return sampler0.location().toString(); + } catch (IllegalAccessException | IllegalArgumentException | ClassCastException _) { + } + return renderType.toString(); + } + } + + private static class PrimitiveCacheLoader extends CacheLoader> { + @Override + public @NonNull Map load(@NonNull RenderType renderType) { + return new HashMap<>(4); + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c61a118f..358d405e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ +#Tue May 12 13:08:14 CST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip -networkTimeout=10000 -validateDistributionUrl=true +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From d460430487fa4db4e9b9a01275b80ebcf33a318b Mon Sep 17 00:00:00 2001 From: xTracr Date: Tue, 12 May 2026 20:05:14 +0800 Subject: [PATCH 13/34] Remove AWT Polygon dependency with custom geometry methods; finalize non-API classes --- .../com/xtracr/realcamera/RealCameraCore.java | 2 +- .../xtracr/realcamera/api/RealCameraAPI.java | 2 +- .../compat/CompatibilityHelper.java | 2 +- .../realcamera/compat/DisableHelper.java | 2 +- .../realcamera/compat/LegacyBindingMode.java | 2 +- .../xtracr/realcamera/compat/YSMCompat.java | 2 +- .../xtracr/realcamera/config/BindTarget.java | 6 +-- .../xtracr/realcamera/config/ConfigFile.java | 2 +- .../realcamera/config/ConfigScreen.java | 2 +- .../xtracr/realcamera/config/ModConfig.java | 2 +- .../com/xtracr/realcamera/gui/GUIHelper.java | 2 +- .../xtracr/realcamera/gui/ModelAnalyser.java | 50 ++++--------------- .../realcamera/gui/ModelViewScreen.java | 48 +++++++++--------- .../renderer/BuiltIterableBuffer.java | 10 +--- .../renderer/IterableVertexBuffer.java | 14 +++--- .../renderer/MultiVertexCatcher.java | 8 +-- .../renderer/RoutingSubmitCollector.java | 4 +- .../renderer/gui/GuiCulledModelsRenderer.java | 2 +- .../gui/GuiFlattenedModelsRenderer.java | 2 +- .../realcamera/renderer/state/VertexData.java | 33 +++++++++++- .../com/xtracr/realcamera/util/MathUtil.java | 26 ++++++++++ .../xtracr/realcamera/RealCameraFabric.java | 2 +- .../realcamera/config/RealCameraMenu.java | 2 +- .../com/xtracr/realcamera/EventHandler.java | 2 +- .../xtracr/realcamera/RealCameraNeoForge.java | 2 +- 25 files changed, 125 insertions(+), 106 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 18ad5f6e..e83ad6e1 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -24,7 +24,7 @@ import org.joml.Matrix3f; import org.joml.Matrix4f; -public class RealCameraCore { +public final class RealCameraCore { private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); private static final CameraTransform smoothedCamera = new CameraTransform(); private static BindResult lastResult = BindResult.EMPTY, newResult = BindResult.EMPTY; diff --git a/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java b/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java index c91225bb..2e0157dc 100644 --- a/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java +++ b/common/src/main/java/com/xtracr/realcamera/api/RealCameraAPI.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.function.BiFunction; -public class RealCameraAPI { +public final class RealCameraAPI { private static final List> FUNCTIONS = new ArrayList<>(); private static final Map, Integer> PRIORITIES = new Object2IntOpenHashMap<>(); diff --git a/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java index 5f481a36..17776f4f 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java @@ -7,7 +7,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; -public class CompatibilityHelper { +public final class CompatibilityHelper { private static PlatformHelper platformHelper; private static Method NEA_playerTransformer_setDeltaTick; private static Field NEA_NEAnimationsLoader_INSTANCE; diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index 70c6140a..172c77f7 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -15,7 +15,7 @@ import java.util.function.Predicate; import java.util.regex.Pattern; -public class DisableHelper { +public final class DisableHelper { public static final Entry MAIN_FEATURE, RENDER_MODEL, RENDER_HANDS; private static final Pattern MULTI_STAR = Pattern.compile("\\*+"); private static final Predicate FALSE = _ -> false; diff --git a/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java b/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java index e12c664f..5cc4b2fb 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java @@ -15,7 +15,7 @@ import org.joml.Vector3f; import org.joml.Vector4f; -public class LegacyBindingMode { +public final class LegacyBindingMode { public static void register() { RealCameraAPI.registerFunction(100, LegacyBindingMode::computeBindResult); } diff --git a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java index e00e6bf9..6f7c36f1 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java @@ -19,7 +19,7 @@ import java.util.HashMap; import java.util.Map; -public class YSMCompat { +public final class YSMCompat { private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); private static final Map resultMap = new HashMap<>(); private static final TransformedVertexRecorder[] transformedRecorders = new TransformedVertexRecorder[4]; diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index 32ce669c..8e91c4b8 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -127,7 +127,7 @@ public void write(FriendlyByteBuf byteBuf) { } } - public static class OffsetConfig { + public static final class OffsetConfig { private float scale = 1, x = 0, y = 0, z = 0, pitch = 0, yaw = 0, roll = 0; public static OffsetConfig read(FriendlyByteBuf byteBuf) { @@ -209,7 +209,7 @@ public void write(FriendlyByteBuf byteBuf) { } @JsonAdapter(DisableConfig.Adapter.class) - public static class DisableConfig { + public static final class DisableConfig { private final LongOpenHashSet disabledUVs = new LongOpenHashSet(), enabledUVs = new LongOpenHashSet(); private final String name; private final String textureId; @@ -274,7 +274,7 @@ public boolean disable(VertexData vertex) { return false; } - public static class Adapter extends TypeAdapter { + public static final class Adapter extends TypeAdapter { @Override public void write(JsonWriter out, DisableConfig value) throws IOException { out.beginObject(); diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java index eefa33e5..0325871b 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java @@ -11,7 +11,7 @@ import java.nio.file.Files; import java.nio.file.Path; -public class ConfigFile { +public final class ConfigFile { private static final ModConfig modConfig = new ModConfig(); private static final String FILE_NAME = RealCamera.MODID + ".json"; private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 1a56ded3..137a18b0 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -11,7 +11,7 @@ import java.util.List; -public class ConfigScreen { +public final class ConfigScreen { public static Screen create(Screen parent) { ConfigFile.load(); ModConfig config = ConfigFile.config(); diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index 50c64ae3..c7be2871 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -9,7 +9,7 @@ import java.util.List; import java.util.stream.IntStream; -public class ModConfig { +public final class ModConfig { public static final double MIN_OFFSET_D = -1.0, MAX_OFFSET_D = 1.0; public static final float MIN_OFFSET_F = -1.0f, MAX_OFFSET_F = 1.0f; public boolean enabled = false; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java b/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java index b31c9878..340bdd8c 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java @@ -16,7 +16,7 @@ import java.util.List; -public class GUIHelper { +public final class GUIHelper { @Nullable public static ScreenRectangle getBounds(int x0, int y0, int x1, int y1, Matrix3x2f pose, @Nullable ScreenRectangle scissorArea) { ScreenRectangle scissorArea2 = new ScreenRectangle(x0, y0, x1 - x0, y1 - y0).transformMaxBounds(pose); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index 8d3b98f7..e4148537 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -24,20 +24,19 @@ import org.joml.Vector3f; import org.jspecify.annotations.Nullable; -import java.awt.*; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Set; -public class ModelAnalyser { +public final class ModelAnalyser { private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); private static final Set UNFOCUSABLE_RENDER_TYPES = Set.of(RenderTypes.armorEntityGlint(), RenderTypes.glintTranslucent(), RenderTypes.glint(), RenderTypes.entityGlint()); private static final int planeArgb = 0x6F3333CC, forwardArgb = 0xFF00CC00, upwardArgb = 0xFFCC0000, leftArgb = 0xFF0000CC, focusedArgb = 0x4FFFFFFF; private static final int z1 = 210, z2 = z1 + 10; public final List focusedPolyhedron = new ArrayList<>(); public final PoseStack modelPose = new PoseStack(), texturePose = new PoseStack(); - protected final List modelRecords = new ArrayList<>(), textureRecords = new ArrayList<>(); + final List modelRecords = new ArrayList<>(), textureRecords = new ArrayList<>(); private VertexData[][] targetPrimitives = new VertexData[3][]; private BindResult bindResult = BindResult.EMPTY; private BindTarget target = BindTarget.EMPTY; @@ -55,17 +54,6 @@ private static boolean haveCommonVertex(VertexData[] p1, List prim return false; } - private static Polygon getPolygon(VertexData[] primitive) { - int length = primitive.length; - int[] xs = new int[length], ys = new int[length]; - for (int j = 0; j < length; j++) { - VertexData vertex = primitive[j]; - xs[j] = (int) vertex.x(); - ys[j] = (int) vertex.y(); - } - return new Polygon(xs, ys, length); - } - public void initialize(BindTarget target, int modelScale) { this.target = target; this.modelScale = modelScale; @@ -115,19 +103,12 @@ public void applyDisableConfigs(String textureId, Set hiddenNames) { public void computeFocusedOnTexture(int mouseX, int mouseY) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; - Matrix4f positionMatrix = texturePose.last().pose(); - Vector3f position = new Vector3f(); + Vector3f newMousePosition = new Vector3f(mouseX, mouseY, 0) + .mulPosition(texturePose.last().pose().invert(new Matrix4f())); + float newMouseX = newMousePosition.x(), newMouseY = newMousePosition.y(); for (BuiltModelRecord record : textureRecords) { - int length = record.renderType().mode().primitiveLength; - int[] xs = new int[length], ys = new int[length]; for (VertexData[] primitive : record.primitives()) { - for (int j = 0; j < length; j++) { - VertexData vertex = primitive[j]; - position.set(vertex.u(), vertex.v(), 0).mulPosition(positionMatrix); - xs[j] = (int) position.x(); - ys[j] = (int) position.y(); - } - if (new Polygon(xs, ys, length).contains(mouseX, mouseY)) { + if (VertexData.containsUV(primitive, newMouseX, newMouseY)) { focusedRecord = record; focusedPolyhedron.add(primitive); break; @@ -143,7 +124,7 @@ public void computeFocusedOnModel(int mouseX, int mouseY, int layers) { if (UNFOCUSABLE_RENDER_TYPES.contains(record.renderType())) continue; VertexData[][] primitives = record.primitives(); for (VertexData[] primitive : primitives) { - if (!getPolygon(primitive).contains(mouseX, mouseY)) continue; + if (!VertexData.containsXY(primitive, mouseX, mouseY)) continue; VertexData vertex = primitive[0]; float deltaZ = vertex.normalZ() == 0 ? 0 : (vertex.normalX() * (mouseX - vertex.x()) + vertex.normalY() * (mouseY - vertex.y())) / vertex.normalZ(); sortByZ.add(new Object[]{record, primitive, vertex.z() - deltaZ}); @@ -175,20 +156,18 @@ public void computeFocusedOnModel(int minX, int minY, int maxX, int maxY) { } if (sortByZ.isEmpty()) return; sortByZ.sort(Comparator.comparingDouble(array -> -(float) array[2])); - List polygons = new ArrayList<>(); focusedRecord = (BuiltModelRecord) sortByZ.getFirst()[0]; while (!sortByZ.isEmpty()) { VertexData[] first = (VertexData[]) sortByZ.getFirst()[1]; focusedPolyhedron.add(first); - polygons.add(getPolygon(first)); sortByZ.removeFirst(); sortByZ.removeIf(array -> { if (array[0] != focusedRecord) return true; VertexData[] primitive = (VertexData[]) array[1]; primitiveFor: for (VertexData vertex : primitive) { - for (Polygon polygon : polygons) - if (polygon.contains(vertex.x(), vertex.y())) continue primitiveFor; + for (VertexData[] focused : focusedPolyhedron) + if (VertexData.containsXY(focused, vertex.x(), vertex.y())) continue primitiveFor; return false; } return true; @@ -307,16 +286,7 @@ public void computeBindResult(BuiltIterableBuffer builtBuffer) { BindResult result = new BindResult(target); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV[] uvs = {new VertexData.UV(config.posU(), config.posV()), new VertexData.UV(config.forwardU(), config.forwardV()), new VertexData.UV(config.upwardU(), config.upwardV())}; - targetPrimitives = builtBuffer.findPrimitivesInCache(uvs); - if (builtBuffer.anyNotCached(uvs)) { - for (int i = 0; i < targetPrimitives.length; i++) { - if (targetPrimitives[i] != null) uvs[i] = null; - } - VertexData[][] newPrimitives = builtBuffer.findPrimitives(uvs); - for (int i = 0; i < targetPrimitives.length; i++) { - if (newPrimitives[i] != null) targetPrimitives[i] = newPrimitives[i]; - } - } + targetPrimitives = builtBuffer.findPrimitives(uvs); if (targetPrimitives[0] != null) result.setPosition(VertexData.position(targetPrimitives[0], config.posU(), config.posV())); if (targetPrimitives[1] != null) result.setForward(VertexData.normal(targetPrimitives[1]).scale(-1)); if (targetPrimitives[2] != null) result.setUpward(VertexData.normal(targetPrimitives[2]).scale(-1)); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index bc58e4dd..7c3f292b 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -50,11 +50,11 @@ import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; -public class ModelViewScreen extends Screen { +public final class ModelViewScreen extends Screen { public final ModelAnalyser analyser = new ModelAnalyser(); - protected int xSize = 450, ySize = 206, middleWidth = xSize - 200, widgetWidth = (xSize - middleWidth) / 4 - 8, widgetHeight = 18; - protected int x, y, page = 0; - protected InputConstants.Key modifierKey = ConfigFile.config().getScreenModifierKey(); + private final int xSize = 450, ySize = 206, middleWidth = xSize - 200, widgetWidth = (xSize - middleWidth) / 4 - 8, widgetHeight = 18; + private int x, y, page = 0; + private InputConstants.Key modifierKey = ConfigFile.config().getScreenModifierKey(); private boolean initialized; private int modelScale = 80, textureScale = 80, layers = 0, selectionRadius = 10; private double modelX, modelY, textureX, textureY, clickedX = -1, clickedY = -1; @@ -460,7 +460,7 @@ public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX applyAnalyser(graphics, mouseX, mouseY); } - protected void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mouseY) { + private void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mouseY) { String textureId = toggleCategoryButton.getValue() == Category.DISABLE ? disabledIdField.getValue() : ""; Set hiddenNames = hiddenNameMap.getOrDefault(nameField.getValue(), Set.of()); analyser.applyDisableConfigs(textureId, hiddenNames); @@ -483,7 +483,7 @@ protected void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mous } } - protected void renderModelViewArea(GuiGraphicsExtractor graphics, LivingEntity entity) { + private void renderModelViewArea(GuiGraphicsExtractor graphics, LivingEntity entity) { int x1 = modelViewArea.left(), y1 = modelViewArea.top(), x2 = modelViewArea.right(), y2 = modelViewArea.bottom(); Quaternionf rotation = new Quaternionf().rotateX((float) Math.PI / 6 + xRot).rotateY((float) Math.PI / 6 + yRot).rotateZ((float) Math.PI); float entityBodyYaw = entity.yBodyRot; @@ -505,7 +505,7 @@ protected void renderModelViewArea(GuiGraphicsExtractor graphics, LivingEntity e entity.yHeadRot = entityHeadYaw; } - protected void renderEntityWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset, Quaternionf rotation, LivingEntity entity) { + private void renderEntityWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset, Quaternionf rotation, LivingEntity entity) { PoseStack modelPose = analyser.modelPose; modelPose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); modelPose.scale(scale, scale, -scale); @@ -521,21 +521,21 @@ protected void renderEntityWithAnalyser(GuiGraphicsExtractor graphics, int x1, i GUIHelper.culledModels(graphics, analyser.modelRecords, scale, transform, x1, y1, x2, y2); } - protected void renderTextureViewArea(GuiGraphicsExtractor graphics) { + private void renderTextureViewArea(GuiGraphicsExtractor graphics) { if (textureViewArea == null) return; int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); Vector3f offset = new Vector3f((float) textureX - 0.5f, (float) textureY - 0.5f, 0); renderTextureWithAnalyser(graphics, x1, y1, x2, y2, (float) (textureScale * textureViewArea.width()) / 80, offset); } - protected void renderTextureWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset) { + private void renderTextureWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset) { analyser.texturePose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); analyser.texturePose.scale(scale, scale, -scale); analyser.texturePose.translate(offset.x(), offset.y(), offset.z()); GUIHelper.flattenedModels(graphics, analyser.textureRecords, offset, x1, y1, x2, y2, scale); } - protected void importBindTarget(Button button) { + private void importBindTarget(Button button) { FriendlyByteBuf byteBuf = null; try { String base64 = minecraft.keyboardHandler.getClipboard(); @@ -562,7 +562,7 @@ protected void importBindTarget(Button button) { } } - protected void exportBindTarget(Button button) { + private void exportBindTarget(Button button) { FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); try { genBindTarget().write(byteBuf); @@ -583,7 +583,7 @@ protected void exportBindTarget(Button button) { } } - protected void loadBindTarget(BindTarget target) { + private void loadBindTarget(BindTarget target) { if (target.isEmpty()) return; nameField.setValue(target.name()); textureIdField.setValue(target.textureId()); @@ -616,7 +616,7 @@ protected void loadBindTarget(BindTarget target) { disableConfigs.addAll(List.of(target.disableConfigs())); } - protected BindTarget genBindTarget() { + private BindTarget genBindTarget() { TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); OffsetConfig offsets = new OffsetConfig() @@ -636,42 +636,42 @@ protected BindTarget genBindTarget() { return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, disableConfigArray); } - protected Tooltip createTooltip(String key, Object... args) { + private Tooltip createTooltip(String key, Object... args) { return Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP(key, args)); } - protected UVRectangleWidget createRectWidget(UVRectangle rect) { + private UVRectangleWidget createRectWidget(UVRectangle rect) { return new UVRectangleWidget(rect.uMin(), rect.vMin(), rect.uMax(), rect.vMax()); } - protected Button createButton(Component message, int width, Button.OnPress onPress) { + private Button createButton(Component message, int width, Button.OnPress onPress) { return Button.builder(message, onPress).size(width, widgetHeight).build(); } - protected CycleButton.Builder createCyclingButtonBuilder(Map messages, T defaultValue) { + private CycleButton.Builder createCyclingButtonBuilder(Map messages, T defaultValue) { return new CycleButton.Builder<>(messages::get, () -> defaultValue).withValues(messages.keySet()); } - protected DoubleSlider createSlider(String key, int width, double min, double max) { + private DoubleSlider createSlider(String key, int width, double min, double max) { return new DoubleSlider(width, widgetHeight, 0, min, max, d -> LocUtil.MODEL_VIEW_WIDGET(key, MathUtil.round(d, 2))); } - protected NumberField createFloatField(int width, float defaultValue, @Nullable NumberField copyFrom) { + private NumberField createFloatField(int width, float defaultValue, @Nullable NumberField copyFrom) { return NumberField.ofFloat(font, width - 2, widgetHeight - 2, defaultValue, copyFrom).setMax(1.0f).setMin(0f); } - protected EditBox createTextField(int width, int maxLength, @Nullable EditBox copyFrom) { + private EditBox createTextField(int width, int maxLength, @Nullable EditBox copyFrom) { EditBox editBox = new EditBox(font, 0, 0, width - 2, widgetHeight - 2, CommonComponents.EMPTY); editBox.setMaxLength(maxLength); if (copyFrom != null) editBox.setValue(copyFrom.getValue()); return editBox; } - protected boolean inModelViewArea(double x, double y) { + private boolean inModelViewArea(double x, double y) { return modelViewArea.containsPoint((int) x, (int) y); } - protected boolean inTextureViewArea(double x, double y) { + private boolean inTextureViewArea(double x, double y) { return textureViewArea != null && textureViewArea.containsPoint((int) x, (int) y); } @@ -836,8 +836,8 @@ public Category next() { } } - public class UVRectangleWidget extends AbstractWidget { - protected float uMin, vMin, uMax, vMax; + public final class UVRectangleWidget extends AbstractWidget { + private float uMin, vMin, uMax, vMax; public UVRectangleWidget(float uMin, float vMin, float uMax, float vMax) { super(0, 0, 16, 16, CommonComponents.EMPTY); diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index c684a565..2ab31848 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -7,7 +7,6 @@ import net.minecraft.client.renderer.rendertype.RenderType; import org.jspecify.annotations.Nullable; -import java.awt.*; import java.util.Map; public record BuiltIterableBuffer(RenderType renderType, String textureId, IterableVertexBuffer vertexBuffer) { @@ -58,22 +57,15 @@ public boolean anyNotCached(UV[] uvs) { } public VertexData[] @Nullable [] findPrimitives(UV[] uvs) { - final int resolution = 1000000; int length = renderType.mode().primitiveLength, uvsLength = uvs.length; - int[] us = new int[length], vs = new int[length]; VertexData[][] primitives = new VertexData[uvsLength][]; vertexBuffer.primitiveStream().anyMatch(primitive -> { - for (int i = 0; i < length; i++) { - us[i] = (int) (resolution * primitive[i].u()); - vs[i] = (int) (resolution * primitive[i].v()); - } - Polygon polygon = new Polygon(us, vs, length); boolean allFound = true; for (int i = 0; i < uvsLength; i++) { if (primitives[i] != null) continue; UV uv = uvs[i]; if (uv == null) continue; - if (!polygon.contains(resolution * uv.u(), resolution * uv.v())) { + if (!VertexData.containsUV(primitive, uv.u(), uv.v())) { allFound = false; continue; } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java index d080fa59..f2270c8d 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java @@ -18,7 +18,7 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -public class IterableVertexBuffer implements Iterable { +public final class IterableVertexBuffer implements Iterable { private static final boolean IS_LITTLE_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN; private static final float NORMAL_SCALE = 1.0f / 127.0f; public final int vertexCount, vertexSize; @@ -238,7 +238,7 @@ public VertexData asImmutable() { } } - private class VertexIterator extends VertexPointer implements Iterator { + private final class VertexIterator extends VertexPointer implements Iterator { private final int byteCount = vertexCount * vertexSize; @Override @@ -253,7 +253,7 @@ public boolean hasNext() { } } - private class VertexSpliterator extends VertexPointer implements Spliterator { + private final class VertexSpliterator extends VertexPointer implements Spliterator { private final int endIndex; private int currentIndex; @@ -296,7 +296,7 @@ public int characteristics() { } } - private class PrimitiveReader implements Iterable { + private final class PrimitiveReader implements Iterable { private final int primitiveLength, primitiveStride, primitiveCount; private final boolean startWithFirst; @@ -348,7 +348,7 @@ public VertexData[] next() { } } - private class PrimitiveSpliterator implements Spliterator { + private final class PrimitiveSpliterator implements Spliterator { private final MutableVertex[] reusablePrimitive = new MutableVertex[primitiveLength]; private final int endIndex; private int currentIndex; @@ -398,7 +398,7 @@ public int characteristics() { } - private class FastQuadReader implements Iterable { + private final class FastQuadReader implements Iterable { private final int quadCount = vertexCount / 4; @Override @@ -452,7 +452,7 @@ public VertexData[] next() { } } - private class FastQuadSpliterator implements Spliterator { + private final class FastQuadSpliterator implements Spliterator { private final MutableVertex[] reusableQuad = new MutableVertex[4]; private final int endIndex; private int currentIndex; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java index 43ff4b47..b1a778ef 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java @@ -21,7 +21,7 @@ import java.util.SequencedMap; import java.util.function.Consumer; -public class MultiVertexCatcher { +public final class MultiVertexCatcher { private final SubmitNodeStorage storage = new SubmitNodeStorage(); private final MeshCatcher meshCatcher = new MeshCatcher(); @@ -108,11 +108,11 @@ public void endCatching(Consumer consumer) { meshCatcher.endCatching(consumer); } - static class MeshCatcher extends MultiBufferSource.BufferSource { + static final class MeshCatcher extends MultiBufferSource.BufferSource { private final SequencedMap bufferPools = new Object2ObjectLinkedOpenHashMap<>(); private final SequencedMap caughtMeshes = new Object2ObjectLinkedOpenHashMap<>(); - protected MeshCatcher() { + private MeshCatcher() { super(new ByteBufferBuilder(0), Object2ObjectSortedMaps.emptyMap()); } @@ -167,7 +167,7 @@ protected void endBatch(@NonNull RenderType renderType, BufferBuilder bufferBuil } } - private static class ByteBufferBuilderPool { + private static final class ByteBufferBuilderPool { private final int bufferSize; private ByteBufferBuilder[] pool = new ByteBufferBuilder[0]; private int next = 0; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java b/common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java index fcd8c0cf..eac3cbaf 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/RoutingSubmitCollector.java @@ -26,7 +26,7 @@ import java.util.List; -public class RoutingSubmitCollector implements SubmitNodeCollector { +public final class RoutingSubmitCollector implements SubmitNodeCollector { private final SubmitNodeCollector defaultCollector; private final SubmitNodeCollector modelCollector; @@ -105,7 +105,7 @@ public void submitParticleGroup(@NonNull ParticleGroupRenderer particleGroupRend defaultCollector.submitParticleGroup(particleGroupRenderer); } - private class RoutingOrderedCollector implements OrderedSubmitNodeCollector { + private final class RoutingOrderedCollector implements OrderedSubmitNodeCollector { private final OrderedSubmitNodeCollector defaultDelegate; private final OrderedSubmitNodeCollector modelDelegate; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java index 25c39b35..7ef9788e 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java @@ -11,7 +11,7 @@ import org.joml.Matrix4f; import org.jspecify.annotations.NonNull; -public class GuiCulledModelsRenderer extends PictureInPictureRenderer { +public final class GuiCulledModelsRenderer extends PictureInPictureRenderer { public GuiCulledModelsRenderer(MultiBufferSource.BufferSource bufferSource) { super(bufferSource); } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java index 2513538e..0c95b6c0 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java @@ -11,7 +11,7 @@ import org.joml.Vector3f; import org.jspecify.annotations.NonNull; -public class GuiFlattenedModelsRenderer extends PictureInPictureRenderer { +public final class GuiFlattenedModelsRenderer extends PictureInPictureRenderer { public GuiFlattenedModelsRenderer(MultiBufferSource.BufferSource bufferSource) { super(bufferSource); } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java index 63e97959..18730375 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java @@ -1,6 +1,7 @@ package com.xtracr.realcamera.renderer.state; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.xtracr.realcamera.util.MathUtil; import net.minecraft.world.phys.Vec3; import org.joml.Matrix3f; import org.joml.Matrix4f; @@ -41,6 +42,36 @@ static Vec3 normal(VertexData[] vertices) { }; } + static boolean containsUV(VertexData[] vertices, float u, float v) { + return switch (vertices.length) { + case 3 -> MathUtil.pointInTriangle(u, v, + vertices[0].u(), vertices[0].v(), + vertices[1].u(), vertices[1].v(), + vertices[2].u(), vertices[2].v()); + case 4 -> MathUtil.pointInQuad(u, v, + vertices[0].u(), vertices[0].v(), + vertices[1].u(), vertices[1].v(), + vertices[2].u(), vertices[2].v(), + vertices[3].u(), vertices[3].v()); + default -> false; + }; + } + + static boolean containsXY(VertexData[] vertices, float x, float y) { + return switch (vertices.length) { + case 3 -> MathUtil.pointInTriangle(x, y, + vertices[0].x(), vertices[0].y(), + vertices[1].x(), vertices[1].y(), + vertices[2].x(), vertices[2].y()); + case 4 -> MathUtil.pointInQuad(x, y, + vertices[0].x(), vertices[0].y(), + vertices[1].x(), vertices[1].y(), + vertices[2].x(), vertices[2].y(), + vertices[3].x(), vertices[3].y()); + default -> false; + }; + } + float x(); float y(); @@ -105,7 +136,7 @@ public int hashCode() { record ImmutableVertex(float x, float y, float z, int argb, float u, float v, int overlay, int light, float normalX, float normalY, float normalZ) implements VertexData { } - class MutableVertex implements VertexData { + final class MutableVertex implements VertexData { public float x, y, z; public int argb; public float u, v; diff --git a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java index 315bc540..9b75ffdb 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java @@ -5,6 +5,8 @@ import org.joml.Matrix4fc; import org.joml.Vector4f; +import java.awt.*; + public final class MathUtil { public static double round(double d, int digits) { return Math.round(d * Math.pow(10, digits)) / Math.pow(10, digits); @@ -26,6 +28,30 @@ public static double ceil(double... ds) { return Math.ceil(d); } + public static float cross(float a, float b, float c, float d) { + return a * d - b * c; + } + + public static boolean pointInTriangle(float x, float y, float x0, float y0, float x1, float y1, float x2, float y2) { + float abX = x1 - x0, abY = y1 - y0; + float acX = x2 - x0, acY = y2 - y0; + float alpha = cross(abX, abY, acX, acY); + if (alpha == 0) return false; + float apX = x - x0, apY = y - y0; + float beta = cross(apX, apY, acX, acY) / alpha; + if (beta < 0) return false; + float gamma = cross(abX, abY, apX, apY) / alpha; + if (gamma < 0) return false; + return beta + gamma <= 1; + } + + public static boolean pointInQuad(float x, float y, + float x0, float y0, float x1, float y1, + float x2, float y2, float x3, float y3) { + return pointInTriangle(x, y, x0, y0, x1, y1, x2, y2) + || pointInTriangle(x, y, x1, y1, x2, y2, x3, y3); + } + public static Vec3 getEulerAngleYXZ(Matrix3f normal) { if (normal.m21 <= -1.0) return new Vec3(Math.PI / 2, Math.atan2(normal.m10, normal.m00), 0.0); else if (normal.m21 >= 1.0) return new Vec3(-Math.PI / 2, -Math.atan2(normal.m10, normal.m00), 0.0); diff --git a/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java b/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java index 1b621dde..c1c9129f 100644 --- a/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java +++ b/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java @@ -12,7 +12,7 @@ import net.minecraft.client.KeyMapping; @Environment(EnvType.CLIENT) -public class RealCameraFabric implements ClientModInitializer, RealCamera { +public final class RealCameraFabric implements ClientModInitializer, RealCamera { @Override public void onInitializeClient() { initialize(); diff --git a/fabric/src/main/java/com/xtracr/realcamera/config/RealCameraMenu.java b/fabric/src/main/java/com/xtracr/realcamera/config/RealCameraMenu.java index 21c93225..9ebcb673 100644 --- a/fabric/src/main/java/com/xtracr/realcamera/config/RealCameraMenu.java +++ b/fabric/src/main/java/com/xtracr/realcamera/config/RealCameraMenu.java @@ -3,7 +3,7 @@ import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; -public class RealCameraMenu implements ModMenuApi { +public final class RealCameraMenu implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { return ConfigScreen::create; diff --git a/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java b/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java index c6aecff5..02f737d6 100644 --- a/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java +++ b/neoforge/src/main/java/com/xtracr/realcamera/EventHandler.java @@ -4,7 +4,7 @@ import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.common.NeoForge; -public class EventHandler { +public final class EventHandler { public static void addListeners() { NeoForge.EVENT_BUS.addListener(EventHandler::onClientTick); } diff --git a/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java b/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java index 4348ff19..0b9c01cf 100644 --- a/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java +++ b/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java @@ -18,7 +18,7 @@ import java.util.Map; @Mod(value = RealCamera.MODID, dist = Dist.CLIENT) -public class RealCameraNeoForge implements RealCamera { +public final class RealCameraNeoForge implements RealCamera { private final ModContainer modContainer; private final Map modIdMap = Map.of("cloth-config", "cloth_config"); From 0864ef159cee85317e84a08eb7bdb5270067141d Mon Sep 17 00:00:00 2001 From: xTracr Date: Tue, 12 May 2026 23:56:04 +0800 Subject: [PATCH 14/34] Store primitive index instead of UV array in cache; simplify vertex reading Replaces the UV coordinate float array cache with primitive index caching, enabling direct primitive lookup via IterableVertexBuffer.readPrimitiveAt. Removes the VertexPointer inner class and byte-pointer traversal in favor of index-based readVertexAt calls, centralizing vertex decoding. --- .../renderer/BuiltIterableBuffer.java | 46 ++--- .../renderer/IterableVertexBuffer.java | 171 ++++-------------- .../realcamera/util/RenderTypeUtil.java | 12 +- 3 files changed, 51 insertions(+), 178 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index 2ab31848..c6b2586f 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -15,7 +15,7 @@ public static BuiltIterableBuffer buildFrom(RenderType renderType, MeshData mesh } public boolean anyNotCached(UV[] uvs) { - Map cache = RenderTypeUtil.getPrimitiveCache(renderType); + Map cache = RenderTypeUtil.getPrimitiveCache(renderType); if (cache == null) return true; for (UV uv : uvs) { if (!cache.containsKey(uv)) return true; @@ -24,42 +24,27 @@ public boolean anyNotCached(UV[] uvs) { } public VertexData[] @Nullable [] findPrimitivesInCache(UV[] uvs) { - Map cache = RenderTypeUtil.getPrimitiveCache(renderType); - int length = renderType.mode().primitiveLength, uvsLength = uvs.length; + Map cache = RenderTypeUtil.getPrimitiveCache(renderType); + int uvsLength = uvs.length; VertexData[][] primitives = new VertexData[uvsLength][]; if (cache == null) return primitives; - float[][] uvCacheArray = new float[uvsLength][]; - boolean allNull = true; for (int i = 0; i < uvsLength; i++) { - uvCacheArray[i] = cache.get(uvs[i]); - if (uvCacheArray[i] != null) allNull = false; + if (uvs[i] == null) continue; + Integer primitiveIndex = cache.get(uvs[i]); + if (primitiveIndex == null) continue; + VertexData[] primitive = vertexBuffer.readPrimitiveAt(primitiveIndex); + if (!VertexData.containsUV(primitive, uvs[i].u(), uvs[i].v())) continue; + primitives[i] = primitive; } - if (allNull) return primitives; - vertexBuffer.primitiveStream().anyMatch(primitive -> { - float[] uvCache; - boolean allFound = true; - cacheFor: - for (int i = 0; i < uvsLength; i++) { - if (primitives[i] != null) continue; - uvCache = uvCacheArray[i]; - if (uvCache == null) continue; - for (int j = 0; j < length; j++) { - if (uvCache[j * 2] != primitive[j].u() || uvCache[j * 2 + 1] != primitive[j].v()) { - allFound = false; - continue cacheFor; - } - } - primitives[i] = VertexData.asImmutable(primitive); - } - return allFound; - }); return primitives; } public VertexData[] @Nullable [] findPrimitives(UV[] uvs) { - int length = renderType.mode().primitiveLength, uvsLength = uvs.length; + int uvsLength = uvs.length; VertexData[][] primitives = new VertexData[uvsLength][]; + int[] counter = new int[1]; vertexBuffer.primitiveStream().anyMatch(primitive -> { + int idx = counter[0]++; boolean allFound = true; for (int i = 0; i < uvsLength; i++) { if (primitives[i] != null) continue; @@ -69,12 +54,7 @@ public boolean anyNotCached(UV[] uvs) { allFound = false; continue; } - float[] uvCache = new float[length * 2]; - for (int j = 0; j < length; j++) { - uvCache[j * 2] = primitive[j].u(); - uvCache[j * 2 + 1] = primitive[j].v(); - } - RenderTypeUtil.cachePrimitive(renderType, uv, uvCache); + RenderTypeUtil.cachePrimitive(renderType, uv, idx); primitives[i] = VertexData.asImmutable(primitive); } return allFound; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java index f2270c8d..ddcfa043 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java @@ -6,7 +6,6 @@ import com.mojang.blaze3d.vertex.VertexFormatElement; import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.renderer.state.VertexData.MutableVertex; -import net.minecraft.world.phys.Vec3; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -21,18 +20,17 @@ public final class IterableVertexBuffer implements Iterable { private static final boolean IS_LITTLE_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN; private static final float NORMAL_SCALE = 1.0f / 127.0f; - public final int vertexCount, vertexSize; - private final MutableVertex reusableVertex = VertexData.mutable(); + public final int vertexSize, vertexCount, primitiveLength, primitiveStride, primitiveCount; private final Iterable primitives; private final ByteBuffer buffer; private final int positionOffset, colorOffset, uvOffset, overlayOffset, lightOffset, normalOffset; private final boolean hasPosition, hasColor, hasUV, hasOverlay, hasLight, hasNormal, fullFormat; + private final boolean startWithFirst; public IterableVertexBuffer(MeshData meshData) { buffer = meshData.vertexBuffer(); MeshData.DrawState drawState = meshData.drawState(); VertexFormat format = drawState.format(); - vertexCount = drawState.vertexCount(); vertexSize = format.getVertexSize(); positionOffset = format.getOffset(VertexFormatElement.POSITION); colorOffset = format.getOffset(VertexFormatElement.COLOR); @@ -47,8 +45,14 @@ public IterableVertexBuffer(MeshData meshData) { hasLight = lightOffset != -1; hasNormal = normalOffset != -1; fullFormat = vertexSize == DefaultVertexFormat.ENTITY.getVertexSize(); - boolean isQuad = drawState.mode() == VertexFormat.Mode.QUADS; - primitives = fullFormat && isQuad ? new FastQuadReader() : new PrimitiveReader(drawState.mode()); + vertexCount = drawState.vertexCount(); + VertexFormat.Mode drawMode = drawState.mode(); + primitiveLength = drawMode.primitiveLength; + primitiveStride = drawMode.primitiveStride; + primitiveCount = (vertexCount - primitiveLength) / primitiveStride + 1; + startWithFirst = drawMode == VertexFormat.Mode.TRIANGLE_FAN; + boolean isQuad = drawMode == VertexFormat.Mode.QUADS; + primitives = fullFormat && isQuad ? new FastQuadReader() : new PrimitiveReader(); } public Iterable primitives() { @@ -65,7 +69,14 @@ public Stream primitiveStream() { public VertexData readVertexAt(int index) { Objects.checkIndex(index, vertexCount); - return readVertexAt(index, reusableVertex); + return readVertexAt(index, VertexData.mutable()); + } + + public VertexData[] readPrimitiveAt(int primitiveIndex) { + Objects.checkIndex(primitiveIndex, primitiveCount); + MutableVertex[] mutableVertices = new MutableVertex[primitiveLength]; + for (int i = 0; i < primitiveLength; i++) mutableVertices[i] = VertexData.mutable(); + return readPrimitiveAt(primitiveIndex, mutableVertices); } @Override @@ -129,131 +140,31 @@ private MutableVertex readVertexAt(int index, MutableVertex mutable) { return mutable; } - private class VertexPointer implements VertexData { - protected int bytePointer = 0; - - @Override - public float x() { - if (hasPosition) return buffer.getFloat(bytePointer + positionOffset); - return 0; - } - - @Override - public float y() { - if (hasPosition) return buffer.getFloat(bytePointer + positionOffset + 4); - return 0; - } - - @Override - public float z() { - if (hasPosition) return buffer.getFloat(bytePointer + positionOffset + 8); - return 0; - } - - @Override - public Vec3 position() { - if (hasPosition) - return new Vec3(buffer.getFloat(bytePointer + positionOffset), buffer.getFloat(bytePointer + positionOffset + 4), buffer.getFloat(bytePointer + positionOffset + 8)); - return Vec3.ZERO; - } - - @Override - public int argb() { - if (hasColor) return readColor(bytePointer + colorOffset); - return 0; - } - - @Override - public float u() { - if (hasUV) return buffer.getFloat(bytePointer + uvOffset); - return 0; - } - - @Override - public float v() { - if (hasUV) return buffer.getFloat(bytePointer + uvOffset + 4); - return 0; - } - - @Override - public UV uv() { - if (hasUV) - return new UV(buffer.getFloat(bytePointer + uvOffset), buffer.getFloat(bytePointer + uvOffset + 4)); - return new UV(0, 0); - } - - @Override - public int overlay() { - if (hasOverlay) return buffer.getInt(bytePointer + overlayOffset); - return 0; - } - - @Override - public int light() { - if (hasLight) return buffer.getInt(bytePointer + lightOffset); - return 0; - } - - @Override - public float normalX() { - if (hasNormal) return buffer.get(bytePointer + normalOffset) * NORMAL_SCALE; - return 0; - } - - @Override - public float normalY() { - if (hasNormal) return buffer.get(bytePointer + normalOffset + 1) * NORMAL_SCALE; - return 0; - } - - @Override - public float normalZ() { - if (hasNormal) return buffer.get(bytePointer + normalOffset + 2) * NORMAL_SCALE; - return 0; - } - - @Override - public Vec3 normal() { - if (hasNormal) - return new Vec3(buffer.get(bytePointer + normalOffset) * NORMAL_SCALE, buffer.get(bytePointer + normalOffset + 1) * NORMAL_SCALE, buffer.get(bytePointer + normalOffset + 2) * NORMAL_SCALE); - return Vec3.ZERO; - } - - @Override - public VertexData asImmutable() { - if (fullFormat) { - return new ImmutableVertex(buffer.getFloat(bytePointer), - buffer.getFloat(bytePointer + 4), - buffer.getFloat(bytePointer + 8), - readColor(bytePointer + 12), - buffer.getFloat(bytePointer + 16), - buffer.getFloat(bytePointer + 20), - buffer.getInt(bytePointer + 24), - buffer.getInt(bytePointer + 28), - buffer.get(bytePointer + 32) * NORMAL_SCALE, - buffer.get(bytePointer + 33) * NORMAL_SCALE, - buffer.get(bytePointer + 34) * NORMAL_SCALE); - } - return VertexData.super.asImmutable(); + private MutableVertex[] readPrimitiveAt(int index, MutableVertex[] mutableVertices) { + int vertexIndex = index * primitiveStride; + for (int i = startWithFirst ? 1 : 0; i < primitiveLength; i++) { + readVertexAt(vertexIndex + i, mutableVertices[i]); } + return mutableVertices; } - private final class VertexIterator extends VertexPointer implements Iterator { - private final int byteCount = vertexCount * vertexSize; + private final class VertexIterator implements Iterator { + private final MutableVertex reusableVertex = VertexData.mutable(); + private int currentIndex = 0; @Override public boolean hasNext() { - return bytePointer < byteCount - vertexSize; + return currentIndex < vertexCount; } @Override public @NonNull VertexData next() { - bytePointer += vertexSize; - return this; + return readVertexAt(currentIndex++, reusableVertex); } } - private final class VertexSpliterator extends VertexPointer implements Spliterator { + private final class VertexSpliterator implements Spliterator { + private final MutableVertex reusableVertex = VertexData.mutable(); private final int endIndex; private int currentIndex; @@ -265,8 +176,7 @@ public VertexSpliterator(int start, int end) { @Override public boolean tryAdvance(Consumer action) { if (currentIndex < endIndex) { - bytePointer = currentIndex * vertexSize; - action.accept(this); + action.accept(readVertexAt(currentIndex, reusableVertex)); currentIndex++; return true; } @@ -297,16 +207,6 @@ public int characteristics() { } private final class PrimitiveReader implements Iterable { - private final int primitiveLength, primitiveStride, primitiveCount; - private final boolean startWithFirst; - - public PrimitiveReader(VertexFormat.Mode drawMode) { - primitiveLength = drawMode.primitiveLength; - primitiveStride = drawMode.primitiveStride; - primitiveCount = (vertexCount - primitiveLength) / primitiveStride + 1; - startWithFirst = drawMode == VertexFormat.Mode.TRIANGLE_FAN; - } - @Override public @NonNull Iterator iterator() { return new PrimitiveIterator(); @@ -317,14 +217,7 @@ public Spliterator spliterator() { return new PrimitiveSpliterator(0, primitiveCount); } - private void readPrimitiveAt(int index, MutableVertex[] primitive) { - int vertexIndex = index * primitiveStride; - for (int i = startWithFirst ? 1 : 0; i < primitiveLength; i++) { - readVertexAt(vertexIndex + i, primitive[i]); - } - } - - private class PrimitiveIterator implements Iterator { + private final class PrimitiveIterator implements Iterator { private final MutableVertex[] reusablePrimitive = new MutableVertex[primitiveLength]; private int currentIndex = 0; diff --git a/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java b/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java index fa8df2b7..8f5f9e9a 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java @@ -23,7 +23,7 @@ public final class RenderTypeUtil { .maximumSize(64) .expireAfterAccess(60, TimeUnit.SECONDS) .build(new TextureIdCacheLoader()); - private static final LoadingCache> PRIMITIVE_CACHE = CacheBuilder.newBuilder() + private static final LoadingCache> PRIMITIVE_CACHE = CacheBuilder.newBuilder() .maximumSize(64) .expireAfterAccess(60, TimeUnit.SECONDS) .build(new PrimitiveCacheLoader()); @@ -43,12 +43,12 @@ public static String getTextureId(RenderType renderType) { return TEXTURE_ID_CACHE.getUnchecked(renderType); } - public static @Nullable Map getPrimitiveCache(RenderType renderType) { + public static @Nullable Map getPrimitiveCache(RenderType renderType) { return PRIMITIVE_CACHE.getIfPresent(renderType); } - public static void cachePrimitive(RenderType renderType, UV uv, float[] uvCoords) { - PRIMITIVE_CACHE.getUnchecked(renderType).put(uv, uvCoords); + public static void cachePrimitive(RenderType renderType, UV uv, int primitiveIndex) { + PRIMITIVE_CACHE.getUnchecked(renderType).put(uv, primitiveIndex); } private static class TextureIdCacheLoader extends CacheLoader { @@ -67,9 +67,9 @@ private static class TextureIdCacheLoader extends CacheLoader> { + private static class PrimitiveCacheLoader extends CacheLoader> { @Override - public @NonNull Map load(@NonNull RenderType renderType) { + public @NonNull Map load(@NonNull RenderType renderType) { return new HashMap<>(4); } } From 0ed3c653eac11414cceded7bd2bd9588e54d0412 Mon Sep 17 00:00:00 2001 From: xTracr Date: Wed, 13 May 2026 13:40:09 +0800 Subject: [PATCH 15/34] Rename RenderTypeUtil to RenderTypeCache; refactor vertex catching and GUI state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename RenderTypeUtil → RenderTypeCache, use Object2IntMap for primitive cache - Rename MultiVertexCatcher.endCatching → forEachBuffer, separating batch finalization - Remove stored pose state from ModelAnalyser, pass as parameter instead - Tighten access modifiers, use var for map entries, clean up formatting - Bump version to 0.7.8-beta --- .../com/xtracr/realcamera/RealCameraCore.java | 16 ++--- .../realcamera/compat/DisableHelper.java | 2 +- .../xtracr/realcamera/compat/YSMCompat.java | 50 ++++++++-------- .../xtracr/realcamera/gui/ModelAnalyser.java | 20 +++---- .../realcamera/gui/ModelViewScreen.java | 59 ++++++++++--------- .../gui/components/NumberField.java | 21 +++---- .../renderer/BuiltIterableBuffer.java | 24 +++----- .../renderer/MultiVertexCatcher.java | 41 +++++++------ .../renderer/gui/GuiCulledModelsRenderer.java | 2 +- .../gui/GuiFlattenedModelsRenderer.java | 2 +- .../realcamera/renderer/state/VertexData.java | 10 +++- .../com/xtracr/realcamera/util/MathUtil.java | 9 +-- ...nderTypeUtil.java => RenderTypeCache.java} | 17 +++--- gradle.properties | 2 +- 14 files changed, 136 insertions(+), 139 deletions(-) rename common/src/main/java/com/xtracr/realcamera/util/{RenderTypeUtil.java => RenderTypeCache.java} (81%) diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index e83ad6e1..e7ea9f67 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -75,7 +75,7 @@ public static void computeCamera(Minecraft client, float partialTicks) { if (!newResult.available()) { EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, new PoseStack(), vertexCatcher.initCollector()); - vertexCatcher.endCatching(RealCameraCore::computeBindResult); + vertexCatcher.forEachBuffer(RealCameraCore::computeBindResult); } entity.setInvisible(invisible); if (newResult.available()) { @@ -116,7 +116,7 @@ public static void renderCameraEntity(Minecraft client, float partialTicks, Subm dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, collector); final float m02 = modelView.m02(), m12 = modelView.m12(), m22 = modelView.m22(), m32 = modelView.m32(); final float depth = currentTarget().disablingDepth(); - vertexCatcher.endCatching(builtBuffer -> { + vertexCatcher.forEachBuffer(builtBuffer -> { DisableConfig[] disableConfigs = currentTarget().filteredDisableConfigs(config -> builtBuffer.textureId().contains(config.textureId())); for (DisableConfig config : disableConfigs) if (config.disableAll()) return; submitNodeCollector.submitCustomGeometry(poseStack, builtBuffer.renderType(), (_, buffer) -> { @@ -147,10 +147,12 @@ private static void computeBindResult(BuiltIterableBuffer builtBuffer) { BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV[] uvs = {new VertexData.UV(config.posU(), config.posV()), new VertexData.UV(config.forwardU(), config.forwardV()), new VertexData.UV(config.upwardU(), config.upwardV())}; VertexData[][] primitives = builtBuffer.findPrimitivesInCache(uvs); - if (builtBuffer.anyNotCached(uvs)) { - for (int i = 0; i < primitives.length; i++) { - if (primitives[i] != null) uvs[i] = null; - } + boolean allFound = true; + for (int i = 0; i < primitives.length; i++) { + if (primitives[i] != null) uvs[i] = null; + else allFound = false; + } + if (!allFound) { VertexData[][] newPrimitives = builtBuffer.findPrimitives(uvs); for (int i = 0; i < primitives.length; i++) { if (newPrimitives[i] == null && primitives[i] == null) continue targetFor; @@ -165,4 +167,4 @@ private static void computeBindResult(BuiltIterableBuffer builtBuffer) { return; } } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index 172c77f7..0be9eb8f 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -20,7 +20,7 @@ public final class DisableHelper { private static final Pattern MULTI_STAR = Pattern.compile("\\*+"); private static final Predicate FALSE = _ -> false; private static final Map entries = new HashMap<>(); - public static int exitTick = 0; + private static int exitTick = 0; static { MAIN_FEATURE = new Entry("mainFeature", player -> player.isSleeping() || player.isSpectator()); diff --git a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java index 6f7c36f1..1b1223b7 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java @@ -10,8 +10,8 @@ import com.xtracr.realcamera.renderer.state.VertexData; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.state.EntityRenderState; import net.minecraft.client.renderer.state.level.CameraRenderState; -import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; import org.joml.Matrix3f; import org.joml.Matrix4f; @@ -20,11 +20,9 @@ import java.util.Map; public final class YSMCompat { - private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); private static final Map resultMap = new HashMap<>(); private static final TransformedVertexRecorder[] transformedRecorders = new TransformedVertexRecorder[4]; private static BindResult bindResult = BindResult.EMPTY; - private static boolean allCached = false; static { final float pitch = 1.9106332f, yaw = 2.0943951f; @@ -41,33 +39,28 @@ public static void register() { private static BindResult computeBindResult(Minecraft client, float partialTicks) { resultMap.clear(); bindResult = BindResult.EMPTY; - allCached = true; - Entity entity = client.getCameraEntity(); EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); + EntityRenderState renderState = dispatcher.extractEntity(client.getCameraEntity(), partialTicks); PoseStack poseStack = new PoseStack(); - for (TransformedVertexRecorder transformedRecorder : transformedRecorders) { + for (TransformedVertexRecorder recorder : transformedRecorders) { poseStack.pushPose(); - poseStack.mulPose(transformedRecorder.matrix4f.invert(new Matrix4f())); - dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, vertexCatcher.initCollector()); - vertexCatcher.endCatching(transformedRecorder::computeBindResultInCache); + poseStack.mulPose(recorder.matrix4f.invert(new Matrix4f())); + dispatcher.submit(renderState, new CameraRenderState(), 0, 0, 0, poseStack, recorder.vertexCatcher.initCollector()); + recorder.vertexCatcher.forEachBuffer(recorder::computeBindResultInCache); poseStack.popPose(); if (bindResult.available()) return bindResult; } - if (allCached) return BindResult.EMPTY; - for (TransformedVertexRecorder transformedRecorder : transformedRecorders) { - poseStack.pushPose(); - poseStack.mulPose(transformedRecorder.matrix4f.invert(new Matrix4f())); - dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, vertexCatcher.initCollector()); - vertexCatcher.endCatching(transformedRecorder::computeBindResult); - poseStack.popPose(); + for (TransformedVertexRecorder recorder : transformedRecorders) { + recorder.vertexCatcher.forEachBuffer(recorder::computeBindResult); if (bindResult.available()) return bindResult; } return BindResult.EMPTY; } - protected static class TransformedVertexRecorder { - protected final Matrix4f matrix4f = new Matrix4f(); - protected final Matrix3f matrix3f = new Matrix3f(); + private static final class TransformedVertexRecorder { + private final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); + private final Matrix4f matrix4f = new Matrix4f(); + private final Matrix3f matrix3f = new Matrix3f(); public TransformedVertexRecorder setRotation(float pitch, float yaw) { matrix4f.rotationYXZ(yaw, pitch, 0).invert(); @@ -83,14 +76,16 @@ public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { VertexData.UV posUV = new VertexData.UV(config.posU(), config.posV()); VertexData.UV forwardUV = new VertexData.UV(config.forwardU(), config.forwardV()); VertexData.UV upwardUV = new VertexData.UV(config.upwardU(), config.upwardV()); - if (builtBuffer.anyNotCached(new VertexData.UV[]{posUV, forwardUV, upwardUV})) allCached = false; if (result.getPosition() != Vec3.ZERO) posUV = null; if (result.getForward() != Vec3.ZERO) forwardUV = null; if (result.getUpward() != Vec3.ZERO) upwardUV = null; VertexData[][] primitives = builtBuffer.findPrimitivesInCache(new VertexData.UV[]{posUV, forwardUV, upwardUV}); - if (primitives[0] != null) result.setPosition(new Vec3(VertexData.position(primitives[0], config.posU(), config.posV()).toVector3f().mulPosition(matrix4f))); - if (primitives[1] != null) result.setForward(new Vec3(VertexData.normal(primitives[1]).toVector3f().mul(matrix3f))); - if (primitives[2] != null) result.setUpward(new Vec3(VertexData.normal(primitives[2]).toVector3f().mul(matrix3f))); + if (primitives[0] != null) + result.setPosition(new Vec3(VertexData.position(primitives[0], config.posU(), config.posV()).toVector3f().mulPosition(matrix4f))); + if (primitives[1] != null) + result.setForward(new Vec3(VertexData.normal(primitives[1]).toVector3f().mul(matrix3f))); + if (primitives[2] != null) + result.setUpward(new Vec3(VertexData.normal(primitives[2]).toVector3f().mul(matrix3f))); if (!result.available()) continue; bindResult = result; return; @@ -106,9 +101,12 @@ public void computeBindResult(BuiltIterableBuffer builtBuffer) { VertexData.UV forwardUV = result.getForward() == Vec3.ZERO ? new VertexData.UV(config.forwardU(), config.forwardV()) : null; VertexData.UV upwardUV = result.getUpward() == Vec3.ZERO ? new VertexData.UV(config.upwardU(), config.upwardV()) : null; VertexData[][] primitives = builtBuffer.findPrimitives(new VertexData.UV[]{posUV, forwardUV, upwardUV}); - if (primitives[0] != null) result.setPosition(new Vec3(VertexData.position(primitives[0], config.posU(), config.posV()).toVector3f().mulPosition(matrix4f))); - if (primitives[1] != null) result.setForward(new Vec3(VertexData.normal(primitives[1]).toVector3f().mul(matrix3f))); - if (primitives[2] != null) result.setUpward(new Vec3(VertexData.normal(primitives[2]).toVector3f().mul(matrix3f))); + if (primitives[0] != null) + result.setPosition(new Vec3(VertexData.position(primitives[0], config.posU(), config.posV()).toVector3f().mulPosition(matrix4f))); + if (primitives[1] != null) + result.setForward(new Vec3(VertexData.normal(primitives[1]).toVector3f().mul(matrix3f))); + if (primitives[2] != null) + result.setUpward(new Vec3(VertexData.normal(primitives[2]).toVector3f().mul(matrix3f))); if (!result.available()) continue; bindResult = result; return; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index e4148537..a5bd282b 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -1,5 +1,6 @@ package com.xtracr.realcamera.gui; +import com.google.common.collect.ImmutableSet; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexFormat; @@ -31,11 +32,10 @@ public final class ModelAnalyser { private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); - private static final Set UNFOCUSABLE_RENDER_TYPES = Set.of(RenderTypes.armorEntityGlint(), RenderTypes.glintTranslucent(), RenderTypes.glint(), RenderTypes.entityGlint()); + private static final Set UNFOCUSABLE_RENDER_TYPES = ImmutableSet.of(RenderTypes.armorEntityGlint(), RenderTypes.glintTranslucent(), RenderTypes.glint(), RenderTypes.entityGlint()); private static final int planeArgb = 0x6F3333CC, forwardArgb = 0xFF00CC00, upwardArgb = 0xFFCC0000, leftArgb = 0xFF0000CC, focusedArgb = 0x4FFFFFFF; private static final int z1 = 210, z2 = z1 + 10; public final List focusedPolyhedron = new ArrayList<>(); - public final PoseStack modelPose = new PoseStack(), texturePose = new PoseStack(); final List modelRecords = new ArrayList<>(), textureRecords = new ArrayList<>(); private VertexData[][] targetPrimitives = new VertexData[3][]; private BindResult bindResult = BindResult.EMPTY; @@ -60,8 +60,6 @@ public void initialize(BindTarget target, int modelScale) { modelRecords.clear(); textureRecords.clear(); focusedPolyhedron.clear(); - modelPose.setIdentity(); - texturePose.setIdentity(); targetPrimitives[0] = targetPrimitives[1] = targetPrimitives[2] = null; bindResult = BindResult.EMPTY; focusedRecord = currentRecord = null; @@ -101,14 +99,11 @@ public void applyDisableConfigs(String textureId, Set hiddenNames) { } } - public void computeFocusedOnTexture(int mouseX, int mouseY) { + public void computeFocusedOnTexture(float mouseU, float mouseV) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; - Vector3f newMousePosition = new Vector3f(mouseX, mouseY, 0) - .mulPosition(texturePose.last().pose().invert(new Matrix4f())); - float newMouseX = newMousePosition.x(), newMouseY = newMousePosition.y(); for (BuiltModelRecord record : textureRecords) { for (VertexData[] primitive : record.primitives()) { - if (VertexData.containsUV(primitive, newMouseX, newMouseY)) { + if (VertexData.containsUV(primitive, mouseU, mouseV)) { focusedRecord = record; focusedPolyhedron.add(primitive); break; @@ -241,8 +236,7 @@ public void drawFocusedInModelArea(GuiGraphicsExtractor graphics) { focusedPolyhedron.forEach(primitive -> GUIHelper.polygon(graphics, primitive, z1, focusedArgb)); } - public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics) { - Matrix4f positionMatrix = texturePose.last().pose(); + public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics, Matrix4f texturePose) { int length = 0; VertexData[] transformed = new VertexData[0], reversed = new VertexData[0]; Vector3f position = new Vector3f(); @@ -254,7 +248,7 @@ public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics) { } for (int i = 0; i < length; i++) { VertexData vertex = primitive[i]; - position.set(vertex.u(), vertex.v(), 0).mulPosition(positionMatrix); + position.set(vertex.u(), vertex.v(), 0).mulPosition(texturePose); transformed[i] = reversed[length - 1 - i] = VertexData.immutable(position.x(), position.y(), 0, vertex.argb(), vertex.u(), vertex.v(), vertex.overlay(), vertex.light(), 0, 0, 1); } GUIHelper.polygon(graphics, transformed, 0, focusedArgb); @@ -266,7 +260,7 @@ public void updateModel(Minecraft client, Entity entity, float partialTicks, Pos EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); client.gameRenderer.getLighting().setupFor(Lighting.Entry.ENTITY_IN_UI); dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, vertexCatcher.initCollector()); - vertexCatcher.endCatching(this::computeBindResult); + vertexCatcher.forEachBuffer(this::computeBindResult); } public void computeBindResult(BuiltIterableBuffer builtBuffer) { diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 7c3f292b..bf4bd894 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -56,7 +56,7 @@ public final class ModelViewScreen extends Screen { private int x, y, page = 0; private InputConstants.Key modifierKey = ConfigFile.config().getScreenModifierKey(); private boolean initialized; - private int modelScale = 80, textureScale = 80, layers = 0, selectionRadius = 10; + private int modelScale = 80, textureScale = 80, layers = 0, selectionRadius = 10; private double modelX, modelY, textureX, textureY, clickedX = -1, clickedY = -1; private float xRot, yRot; private String focusedTextureId; @@ -466,7 +466,10 @@ private void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mouseY analyser.applyDisableConfigs(textureId, hiddenNames); if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) analyser.computeFocusedOnModel(mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius); - if (inTextureViewArea(mouseX, mouseY)) analyser.computeFocusedOnTexture(mouseX, mouseY); + if (inTextureViewArea(mouseX, mouseY)) { + Vec2 mouseUV = translateXYToUV(mouseX, mouseY, textureViewArea); + analyser.computeFocusedOnTexture(mouseUV.x, mouseUV.y); + } if (inModelViewArea(mouseX, mouseY)) analyser.computeFocusedOnModel(mouseX, mouseY, layers); if (toggleCategoryButton.getValue() == Category.CONFIGS || selectionModeButton.getValue() == 1) analyser.computeFocusedPolyhedron(); focusedPolyhedron = analyser.focusedPolyhedron.toArray(new VertexData[0][]); @@ -478,7 +481,13 @@ private void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mouseY graphics.disableScissor(); if (textureViewArea != null) { GUIHelper.enableScissor(graphics, textureViewArea); - analyser.drawFocusedInTextureArea(graphics); + Matrix4f texturePose = new Matrix4f(); + int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); + float scale = (float) (textureScale * textureViewArea.width()) / 80; + texturePose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); + texturePose.scale(scale, scale, -scale); + texturePose.translate((float) textureX - 0.5f, (float) textureY - 0.5f, 0); + analyser.drawFocusedInTextureArea(graphics, texturePose); graphics.disableScissor(); } } @@ -506,7 +515,7 @@ private void renderModelViewArea(GuiGraphicsExtractor graphics, LivingEntity ent } private void renderEntityWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset, Quaternionf rotation, LivingEntity entity) { - PoseStack modelPose = analyser.modelPose; + PoseStack modelPose = new PoseStack(); modelPose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); modelPose.scale(scale, scale, -scale); modelPose.translate(offset.x(), offset.y(), offset.z()); @@ -525,14 +534,26 @@ private void renderTextureViewArea(GuiGraphicsExtractor graphics) { if (textureViewArea == null) return; int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); Vector3f offset = new Vector3f((float) textureX - 0.5f, (float) textureY - 0.5f, 0); - renderTextureWithAnalyser(graphics, x1, y1, x2, y2, (float) (textureScale * textureViewArea.width()) / 80, offset); + float scale = (float) (textureScale * textureViewArea.width()) / 80; + GUIHelper.flattenedModels(graphics, analyser.textureRecords, offset, x1, y1, x2, y2, scale); } - private void renderTextureWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset) { - analyser.texturePose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); - analyser.texturePose.scale(scale, scale, -scale); - analyser.texturePose.translate(offset.x(), offset.y(), offset.z()); - GUIHelper.flattenedModels(graphics, analyser.textureRecords, offset, x1, y1, x2, y2, scale); + private Vec2 translateUVToXY(float u, float v, ScreenRectangle screenArea) { + int x1 = screenArea.left(), y1 = screenArea.top(), x2 = screenArea.right(), y2 = screenArea.bottom(); + Vector3f vector3f = new Vector3f(u, v, 0) + .add((float) textureX - 0.5f, (float) textureY - 0.5f, 0) + .mul((float) (textureScale * screenArea.width()) / 80) + .add((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); + return new Vec2(vector3f.x(), vector3f.y()); + } + + private Vec2 translateXYToUV(float x, float y, ScreenRectangle screenArea) { + int x1 = screenArea.left(), y1 = screenArea.top(), x2 = screenArea.right(), y2 = screenArea.bottom(); + Vector3f vector3f = new Vector3f(x, y, 0) + .add(-(float) (x1 + x2) / 2.0f, -(float) (y1 + y2) / 2.0f, 0) + .mul((float) 80 / (textureScale * screenArea.width())) + .add((float) -textureX + 0.5f, (float) -textureY + 0.5f, 0); + return new Vec2(vector3f.x(), vector3f.y()); } private void importBindTarget(Button button) { @@ -878,24 +899,6 @@ public boolean mergeWith(UVRectangleWidget other) { return false; } - private Vec2 translateUVToXY(float u, float v, ScreenRectangle screenArea) { - int x1 = screenArea.left(), y1 = screenArea.top(), x2 = screenArea.right(), y2 = screenArea.bottom(); - Vector3f vector3f = new Vector3f(u, v, 0) - .add((float) textureX - 0.5f, (float) textureY - 0.5f, 0) - .mul((float) (textureScale * screenArea.width()) / 80) - .add((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); - return new Vec2(vector3f.x(), vector3f.y()); - } - - private Vec2 translateXYToUV(float x, float y, ScreenRectangle screenArea) { - int x1 = screenArea.left(), y1 = screenArea.top(), x2 = screenArea.right(), y2 = screenArea.bottom(); - Vector3f vector3f = new Vector3f(x, y, 0) - .add(-(float) (x1 + x2) / 2.0f, -(float) (y1 + y2) / 2.0f, 0) - .mul((float) 80 / (textureScale * screenArea.width())) - .add((float) -textureX + 0.5f, (float) -textureY + 0.5f, 0); - return new Vec2(vector3f.x(), vector3f.y()); - } - @Override protected void extractWidgetRenderState(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { Vec2 minXY = translateUVToXY(uMin, vMin, textureViewArea), maxXY = translateUVToXY(uMax, vMax, textureViewArea); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java index f9dae213..070215ed 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java @@ -39,7 +39,7 @@ public static NumberField ofInt(Font font, int width, int height, int d public T getNumber() { try { - return getNumberInternal(); + return getNumberInternal(getValue()); } catch (NumberFormatException e) { return defaultValue; } catch (Exception e) { @@ -69,14 +69,15 @@ public NumberField setOnValueChange(Consumer consumer) { return this; } - abstract protected T getNumberInternal() throws NumberFormatException; + abstract protected T getNumberInternal(String str) throws NumberFormatException; protected void checkText() { super.setTooltip(tooltip); setTextColor(EditBox.DEFAULT_TEXT_COLOR); - if (getValue().isEmpty()) return; + String str = getValue(); + if (str.isEmpty()) return; try { - T value = getNumberInternal(); + T value = getNumberInternal(str); if (value.compareTo(minimum) < 0) throw new RuntimeException("< " + minimum); if (value.compareTo(maximum) > 0) throw new RuntimeException("> " + maximum); } catch (Exception e) { @@ -113,27 +114,27 @@ public void extractWidgetRenderState(@NonNull GuiGraphicsExtractor graphics, int super.extractWidgetRenderState(graphics, mouseX, mouseY, partialTicks); } - private static class FloatField extends NumberField { + private static final class FloatField extends NumberField { FloatField(Font font, int width, int height, float defaultValue, @Nullable NumberField copyFrom) { super(font, width, height, defaultValue, Float.MAX_VALUE, -Float.MAX_VALUE, copyFrom); setMaxLength(16); } @Override - protected Float getNumberInternal() throws NumberFormatException { - return Float.parseFloat(getValue()); + protected Float getNumberInternal(String str) throws NumberFormatException { + return Float.parseFloat(str); } } - private static class IntField extends NumberField { + private static final class IntField extends NumberField { IntField(Font font, int width, int height, int defaultValue, @Nullable NumberField copyFrom) { super(font, width, height, defaultValue, Integer.MAX_VALUE, Integer.MIN_VALUE, copyFrom); setMaxLength(8); } @Override - protected Integer getNumberInternal() throws NumberFormatException { - return Integer.parseInt(getValue()); + protected Integer getNumberInternal(String str) throws NumberFormatException { + return Integer.parseInt(str); } } } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index c6b2586f..a2f817a7 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -3,35 +3,25 @@ import com.mojang.blaze3d.vertex.MeshData; import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.renderer.state.VertexData.UV; -import com.xtracr.realcamera.util.RenderTypeUtil; +import com.xtracr.realcamera.util.RenderTypeCache; +import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.client.renderer.rendertype.RenderType; import org.jspecify.annotations.Nullable; -import java.util.Map; - public record BuiltIterableBuffer(RenderType renderType, String textureId, IterableVertexBuffer vertexBuffer) { public static BuiltIterableBuffer buildFrom(RenderType renderType, MeshData meshData) { - return new BuiltIterableBuffer(renderType, RenderTypeUtil.getTextureId(renderType), new IterableVertexBuffer(meshData)); - } - - public boolean anyNotCached(UV[] uvs) { - Map cache = RenderTypeUtil.getPrimitiveCache(renderType); - if (cache == null) return true; - for (UV uv : uvs) { - if (!cache.containsKey(uv)) return true; - } - return false; + return new BuiltIterableBuffer(renderType, RenderTypeCache.getTextureId(renderType), new IterableVertexBuffer(meshData)); } public VertexData[] @Nullable [] findPrimitivesInCache(UV[] uvs) { - Map cache = RenderTypeUtil.getPrimitiveCache(renderType); + Object2IntMap cache = RenderTypeCache.getPrimitiveCache(renderType); int uvsLength = uvs.length; VertexData[][] primitives = new VertexData[uvsLength][]; if (cache == null) return primitives; for (int i = 0; i < uvsLength; i++) { if (uvs[i] == null) continue; - Integer primitiveIndex = cache.get(uvs[i]); - if (primitiveIndex == null) continue; + int primitiveIndex = cache.getInt(uvs[i]); + if (primitiveIndex == -1) continue; VertexData[] primitive = vertexBuffer.readPrimitiveAt(primitiveIndex); if (!VertexData.containsUV(primitive, uvs[i].u(), uvs[i].v())) continue; primitives[i] = primitive; @@ -54,7 +44,7 @@ public boolean anyNotCached(UV[] uvs) { allFound = false; continue; } - RenderTypeUtil.cachePrimitive(renderType, uv, idx); + RenderTypeCache.cachePrimitive(renderType, uv, idx); primitives[i] = VertexData.asImmutable(primitive); } return allFound; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java index b1a778ef..3b4e65ce 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java @@ -25,7 +25,8 @@ public final class MultiVertexCatcher { private final SubmitNodeStorage storage = new SubmitNodeStorage(); private final MeshCatcher meshCatcher = new MeshCatcher(); - private MultiVertexCatcher() { } + private MultiVertexCatcher() { + } public static MultiVertexCatcher create() { return new MultiVertexCatcher(); @@ -44,7 +45,7 @@ private static void renderModel(PoseStack poseStack, SubmitNodeStorage.Model private static void renderModelParts(PoseStack poseStack, Map> modelPartSubmitsMap, MultiBufferSource.BufferSource bufferSource) { poseStack.pushPose(); - for (Map.Entry> entry : modelPartSubmitsMap.entrySet()) { + for (var entry : modelPartSubmitsMap.entrySet()) { RenderType renderType = entry.getKey(); List modelPartSubmits = entry.getValue(); VertexConsumer buffer = bufferSource.getBuffer(renderType); @@ -60,7 +61,7 @@ private static void renderModelParts(PoseStack poseStack, Map> customGeometrySubmits, MultiBufferSource.BufferSource bufferSource) { - for (Map.Entry> entry : customGeometrySubmits.entrySet()) { + for (var entry : customGeometrySubmits.entrySet()) { VertexConsumer buffer = bufferSource.getBuffer(entry.getKey()); for (SubmitNodeStorage.CustomGeometrySubmit customGeometrySubmit : entry.getValue()) { customGeometrySubmit.customGeometryRenderer().render(customGeometrySubmit.pose(), buffer); @@ -68,11 +69,13 @@ private static void renderCustomGeometry(Map>> entry : ((ModelFeatureRenderer$StorageAccessor) collection.getModelSubmits()).getSolidModelSubmits().entrySet()) { + for (var entry : ((ModelFeatureRenderer$StorageAccessor) collection.getModelSubmits()).getSolidModelSubmits().entrySet()) { VertexConsumer buffer = meshCatcher.getBuffer(entry.getKey()); for (SubmitNodeStorage.ModelSubmit submit : entry.getValue()) { renderModel(poseStack, submit, buffer); @@ -83,11 +86,13 @@ private void renderSolidFeatures() { } } - /** @see FeatureRenderDispatcher#renderTranslucentFeatures() */ + /** + * @see FeatureRenderDispatcher#renderTranslucentFeatures() + */ private void renderTranslucentFeatures() { for (SubmitNodeCollection collection : storage.getSubmitsPerOrder().values()) { PoseStack poseStack = new PoseStack(); - for (SubmitNodeStorage.TranslucentModelSubmit submit : ((ModelFeatureRenderer$StorageAccessor) collection.getModelSubmits()).getTranslucentModelSubmits()) { + for (var submit : ((ModelFeatureRenderer$StorageAccessor) collection.getModelSubmits()).getTranslucentModelSubmits()) { renderModel(poseStack, submit.modelSubmit(), meshCatcher.getBuffer(submit.renderType())); } renderModelParts(poseStack, ((ModelPartFeatureRenderer$StorageAccessor) collection.getModelPartSubmits()).getTranslucentModelPartSubmits(), meshCatcher); @@ -100,12 +105,14 @@ public SubmitNodeCollector initCollector() { return storage; } - public void endCatching(Consumer consumer) { - if (storage.getSubmitsPerOrder().isEmpty()) return; - renderSolidFeatures(); - renderTranslucentFeatures(); - storage.clear(); - meshCatcher.endCatching(consumer); + public void forEachBuffer(Consumer consumer) { + if (!storage.getSubmitsPerOrder().isEmpty()) { + renderSolidFeatures(); + renderTranslucentFeatures(); + storage.clear(); + meshCatcher.endBatch(); + } + meshCatcher.forEachBuffer(consumer); } static final class MeshCatcher extends MultiBufferSource.BufferSource { @@ -136,11 +143,9 @@ public void initialize() { bufferPools.values().forEach(ByteBufferBuilderPool::release); } - public void endCatching(Consumer consumer) { - endBatch(); - for (Map.Entry entry : caughtMeshes.entrySet()) { - MeshData meshData = entry.getKey(); - consumer.accept(BuiltIterableBuffer.buildFrom(entry.getValue(), meshData)); + public void forEachBuffer(Consumer consumer) { + for (var entry : caughtMeshes.entrySet()) { + consumer.accept(BuiltIterableBuffer.buildFrom(entry.getValue(), entry.getKey())); } } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java index 7ef9788e..c5ff03e4 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java @@ -53,6 +53,6 @@ protected float getTranslateY(final int height, final int guiScale) { @Override protected @NonNull String getTextureLabel() { - return "realcamera.culled_model"; + return "realcamera.culled_models"; } } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java index 0c95b6c0..0664466b 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiFlattenedModelsRenderer.java @@ -44,6 +44,6 @@ protected float getTranslateY(final int height, final int guiScale) { @Override protected @NonNull String getTextureLabel() { - return "realcamera.texture"; + return "realcamera.flattened_models"; } } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java index 18730375..5f57de5e 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java @@ -134,7 +134,12 @@ public int hashCode() { } } - record ImmutableVertex(float x, float y, float z, int argb, float u, float v, int overlay, int light, float normalX, float normalY, float normalZ) implements VertexData { } + record ImmutableVertex(float x, float y, float z, int argb, float u, float v, int overlay, int light, float normalX, float normalY, float normalZ) implements VertexData { + @Override + public VertexData asImmutable() { + return this; + } + } final class MutableVertex implements VertexData { public float x, y, z; @@ -143,7 +148,8 @@ final class MutableVertex implements VertexData { public int overlay, light; public float normalX, normalY, normalZ; - private MutableVertex() { } + private MutableVertex() { + } @Override public float x() { diff --git a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java index 9b75ffdb..d69f24d0 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java @@ -5,8 +5,6 @@ import org.joml.Matrix4fc; import org.joml.Vector4f; -import java.awt.*; - public final class MathUtil { public static double round(double d, int digits) { return Math.round(d * Math.pow(10, digits)) / Math.pow(10, digits); @@ -45,11 +43,8 @@ public static boolean pointInTriangle(float x, float y, float x0, float y0, floa return beta + gamma <= 1; } - public static boolean pointInQuad(float x, float y, - float x0, float y0, float x1, float y1, - float x2, float y2, float x3, float y3) { - return pointInTriangle(x, y, x0, y0, x1, y1, x2, y2) - || pointInTriangle(x, y, x1, y1, x2, y2, x3, y3); + public static boolean pointInQuad(float x, float y, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) { + return pointInTriangle(x, y, x0, y0, x1, y1, x2, y2) || pointInTriangle(x, y, x1, y1, x2, y2, x3, y3); } public static Vec3 getEulerAngleYXZ(Matrix3f normal) { diff --git a/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java b/common/src/main/java/com/xtracr/realcamera/util/RenderTypeCache.java similarity index 81% rename from common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java rename to common/src/main/java/com/xtracr/realcamera/util/RenderTypeCache.java index 8f5f9e9a..bbe55c13 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/RenderTypeUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/RenderTypeCache.java @@ -6,24 +6,25 @@ import com.xtracr.realcamera.RealCamera; import com.xtracr.realcamera.mixin.accessor.RenderTypeAccessor; import com.xtracr.realcamera.renderer.state.VertexData.UV; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minecraft.client.renderer.rendertype.RenderSetup; import net.minecraft.client.renderer.rendertype.RenderType; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; -public final class RenderTypeUtil { +public final class RenderTypeCache { @Nullable private static final Field TEXTURES_FIELD; private static final LoadingCache TEXTURE_ID_CACHE = CacheBuilder.newBuilder() .maximumSize(64) .expireAfterAccess(60, TimeUnit.SECONDS) .build(new TextureIdCacheLoader()); - private static final LoadingCache> PRIMITIVE_CACHE = CacheBuilder.newBuilder() + private static final LoadingCache> PRIMITIVE_CACHE = CacheBuilder.newBuilder() .maximumSize(64) .expireAfterAccess(60, TimeUnit.SECONDS) .build(new PrimitiveCacheLoader()); @@ -43,7 +44,7 @@ public static String getTextureId(RenderType renderType) { return TEXTURE_ID_CACHE.getUnchecked(renderType); } - public static @Nullable Map getPrimitiveCache(RenderType renderType) { + public static @Nullable Object2IntMap getPrimitiveCache(RenderType renderType) { return PRIMITIVE_CACHE.getIfPresent(renderType); } @@ -67,10 +68,12 @@ private static class TextureIdCacheLoader extends CacheLoader> { + private static class PrimitiveCacheLoader extends CacheLoader> { @Override - public @NonNull Map load(@NonNull RenderType renderType) { - return new HashMap<>(4); + public @NonNull Object2IntMap load(@NonNull RenderType renderType) { + Object2IntOpenHashMap map = new Object2IntOpenHashMap<>(4); + map.defaultReturnValue(-1); + return map; } } } diff --git a/gradle.properties b/gradle.properties index 16bf9fb3..d91b01e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ neoforge_version=26.1.2.36-beta moddev_version=2.0.141 ## Mod Properties mod_id=realcamera -mod_version=0.7.7-beta +mod_version=0.7.8-beta mod_group_id=com.xtracr.realcamera ## Dependencies fabric_api_version=0.147.0+26.1.2 From 2fb24c10b591d7d34c1e58960bb8be0da0d109ab Mon Sep 17 00:00:00 2001 From: xTracr Date: Wed, 13 May 2026 14:52:39 +0800 Subject: [PATCH 16/34] Replace Object[] sort with record; make focusedPolyhedron private; fix pointInQuad MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace Object[] sort entries with a typed ZEntry record in ModelAnalyser - Make focusedPolyhedron private, add getFocusedPolyhedron() accessor - Pass modelScale as parameter instead of storing field in ModelAnalyser - Replace List indexes with boolean[] visited for polyhedron building - Rename GUIHelper.polygon → triangleOrQuad, MeshCatcher.initialize → clear --- .../com/xtracr/realcamera/gui/GUIHelper.java | 13 ++-- .../xtracr/realcamera/gui/ModelAnalyser.java | 78 +++++++++---------- .../realcamera/gui/ModelViewScreen.java | 6 +- .../renderer/MultiVertexCatcher.java | 5 +- .../com/xtracr/realcamera/util/MathUtil.java | 2 +- 5 files changed, 53 insertions(+), 51 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java b/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java index 340bdd8c..98cde370 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/GUIHelper.java @@ -44,12 +44,13 @@ public static void outline(GuiGraphicsExtractor graphics, float x, float y, floa fill(graphics, x + width - 1, y + 1, x + width, y + height - 1, argb); } - public static void polygon(GuiGraphicsExtractor graphics, VertexData[] polygon, float z, int argb) { - if (polygon.length < 3) return; - float x0 = polygon[0].x(), y0 = polygon[0].y(); - float x1 = polygon[1].x(), y1 = polygon[1].y(); - float x2 = polygon[2].x(), y2 = polygon[2].y(); - float x3 = polygon.length > 3 ? polygon[3].x() : x2, y3 = polygon.length > 3 ? polygon[3].y() : y2; + public static void triangleOrQuad(GuiGraphicsExtractor graphics, VertexData[] vertices, float z, int argb) { + if (vertices.length < 3) return; + float x0 = vertices[0].x(), y0 = vertices[0].y(); + float x1 = vertices[1].x(), y1 = vertices[1].y(); + float x2 = vertices[2].x(), y2 = vertices[2].y(); + boolean isQuad = vertices.length > 3; + float x3 = isQuad ? vertices[3].x() : x2, y3 = isQuad ? vertices[3].y() : y2; ((GuiGraphicsExtractorAccessor) graphics).getGuiRenderState().addGuiElement(new ColoredFloatQuadRenderState( RenderPipelines.GUI, TextureSetup.noTexture(), new Matrix3x2f(graphics.pose()), x0, y0, z, x1, y1, z, x2, y2, z, x3, y3, z, argb, ((GuiGraphicsExtractorAccessor) graphics).getScissorStack().peek())); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index a5bd282b..51594bf0 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -35,14 +35,13 @@ public final class ModelAnalyser { private static final Set UNFOCUSABLE_RENDER_TYPES = ImmutableSet.of(RenderTypes.armorEntityGlint(), RenderTypes.glintTranslucent(), RenderTypes.glint(), RenderTypes.entityGlint()); private static final int planeArgb = 0x6F3333CC, forwardArgb = 0xFF00CC00, upwardArgb = 0xFFCC0000, leftArgb = 0xFF0000CC, focusedArgb = 0x4FFFFFFF; private static final int z1 = 210, z2 = z1 + 10; - public final List focusedPolyhedron = new ArrayList<>(); + private final List focusedPolyhedron = new ArrayList<>(); final List modelRecords = new ArrayList<>(), textureRecords = new ArrayList<>(); private VertexData[][] targetPrimitives = new VertexData[3][]; private BindResult bindResult = BindResult.EMPTY; private BindTarget target = BindTarget.EMPTY; @Nullable private BuiltModelRecord focusedRecord, currentRecord; - private double modelScale; private static boolean haveCommonVertex(VertexData[] p1, List primitives) { final float precision = 1e-5f; @@ -56,7 +55,6 @@ private static boolean haveCommonVertex(VertexData[] p1, List prim public void initialize(BindTarget target, int modelScale) { this.target = target; - this.modelScale = modelScale; modelRecords.clear(); textureRecords.clear(); focusedPolyhedron.clear(); @@ -70,6 +68,10 @@ public String getFocusedTextureId() { return focusedRecord == null ? null : focusedRecord.textureId(); } + public VertexData[][] getFocusedPolyhedron() { + return focusedPolyhedron.toArray(new VertexData[0][]); + } + public void applyDisableConfigs(String textureId, Set hiddenNames) { for (BuiltModelRecord record : modelRecords) { if (record.containsTextureId(textureId)) textureRecords.add(record); @@ -114,7 +116,7 @@ public void computeFocusedOnTexture(float mouseU, float mouseV) { public void computeFocusedOnModel(int mouseX, int mouseY, int layers) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; - List sortByZ = new ArrayList<>(); + List sortByZ = new ArrayList<>(); for (BuiltModelRecord record : modelRecords) { if (UNFOCUSABLE_RENDER_TYPES.contains(record.renderType())) continue; VertexData[][] primitives = record.primitives(); @@ -122,19 +124,19 @@ public void computeFocusedOnModel(int mouseX, int mouseY, int layers) { if (!VertexData.containsXY(primitive, mouseX, mouseY)) continue; VertexData vertex = primitive[0]; float deltaZ = vertex.normalZ() == 0 ? 0 : (vertex.normalX() * (mouseX - vertex.x()) + vertex.normalY() * (mouseY - vertex.y())) / vertex.normalZ(); - sortByZ.add(new Object[]{record, primitive, vertex.z() - deltaZ}); + sortByZ.add(new ZEntry(record, primitive, vertex.z() - deltaZ)); } } if (sortByZ.isEmpty()) return; - sortByZ.sort(Comparator.comparingDouble(array -> -(float) array[2])); - Object[] result = sortByZ.get(Math.min(sortByZ.size() - 1, layers)); - focusedRecord = (BuiltModelRecord) result[0]; - focusedPolyhedron.add((VertexData[]) result[1]); + sortByZ.sort(Comparator.comparingDouble(ZEntry::z).reversed()); + ZEntry result = sortByZ.get(Math.min(sortByZ.size() - 1, layers)); + focusedRecord = result.record(); + focusedPolyhedron.add(result.primitive()); } public void computeFocusedOnModel(int minX, int minY, int maxX, int maxY) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; - List sortByZ = new ArrayList<>(); + List sortByZ = new ArrayList<>(); for (BuiltModelRecord record : modelRecords) { if (UNFOCUSABLE_RENDER_TYPES.contains(record.renderType())) continue; VertexData[][] primitives = record.primitives(); @@ -146,19 +148,19 @@ public void computeFocusedOnModel(int minX, int minY, int maxX, int maxY) { if (x < minX || y < minY || x > maxX || y > maxY) continue primitiveFor; if (vertex.z() > maxZ) maxZ = vertex.z(); } - sortByZ.add(new Object[]{record, primitive, maxZ}); + sortByZ.add(new ZEntry(record, primitive, maxZ)); } } if (sortByZ.isEmpty()) return; - sortByZ.sort(Comparator.comparingDouble(array -> -(float) array[2])); - focusedRecord = (BuiltModelRecord) sortByZ.getFirst()[0]; + sortByZ.sort(Comparator.comparingDouble((ZEntry entry) -> -entry.z())); + focusedRecord = sortByZ.getFirst().record(); while (!sortByZ.isEmpty()) { - VertexData[] first = (VertexData[]) sortByZ.getFirst()[1]; + VertexData[] first = sortByZ.getFirst().primitive(); focusedPolyhedron.add(first); sortByZ.removeFirst(); - sortByZ.removeIf(array -> { - if (array[0] != focusedRecord) return true; - VertexData[] primitive = (VertexData[]) array[1]; + sortByZ.removeIf(entry -> { + if (entry.record() != focusedRecord) return true; + VertexData[] primitive = entry.primitive(); primitiveFor: for (VertexData vertex : primitive) { for (VertexData[] focused : focusedPolyhedron) @@ -184,32 +186,27 @@ public void computeFocusedPolyhedron() { if (focusedIndex == -1) return; List polyhedron = new ArrayList<>(); polyhedron.add(focused); - List indexes = new ArrayList<>(List.of(focusedIndex)); - final int primitiveCount = primitives.length; + boolean[] visited = new boolean[primitives.length]; + visited[focusedIndex] = true; boolean added; do { added = false; - for (int i = 0; i < primitiveCount; i++) { + for (int i = 0; i < primitives.length; i++) { VertexData[] primitive = primitives[i]; - if (indexes.contains(i) | !haveCommonVertex(primitive, polyhedron)) continue; + if (visited[i] | !haveCommonVertex(primitive, polyhedron)) continue; polyhedron.add(primitive); - indexes.add(i); + visited[i] = true; added = true; } } while (added); - List resultIndexes = new ArrayList<>(List.of(focusedIndex)); - for (int i = focusedIndex + 1; i < primitiveCount; i++) { - if (!indexes.contains(i)) break; - resultIndexes.add(i); - } - for (int i = focusedIndex - 1; i >= 0; i--) { - if (!indexes.contains(i)) break; - resultIndexes.add(i); - } - resultIndexes.forEach(i -> focusedPolyhedron.add(primitives[i])); + for (int i = focusedIndex + 1; i < primitives.length && visited[i]; i++) + focusedPolyhedron.add(primitives[i]); + for (int i = focusedIndex - 1; i >= 0 && visited[i]; i--) + focusedPolyhedron.add(primitives[i]); + focusedPolyhedron.add(focused); } - public void drawCameraDirections(GuiGraphicsExtractor graphics) { + public void drawCameraDirections(GuiGraphicsExtractor graphics, double modelScale) { if (targetPrimitives[0] == null || targetPrimitives[1] == null || targetPrimitives[2] == null) return; Vec3 start = bindResult.getPosition(); Matrix3f normal = bindResult.getRotation(); @@ -219,10 +216,10 @@ public void drawCameraDirections(GuiGraphicsExtractor graphics) { GUIHelper.vector(graphics, start, new Vec3(normal.m00(), normal.m01(), normal.m02()).scale(modelScale / 6), z2, leftArgb); } - public void drawBindTarget(GuiGraphicsExtractor graphics) { + public void drawBindTarget(GuiGraphicsExtractor graphics, double modelScale) { if (currentRecord == null) return; TargetConfig config = target.targetConfig(); - if (targetPrimitives[0] != null) GUIHelper.polygon(graphics, targetPrimitives[0], z1, planeArgb); + if (targetPrimitives[0] != null) GUIHelper.triangleOrQuad(graphics, targetPrimitives[0], z1, planeArgb); if (targetPrimitives[1] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[1], config.forwardU(), config.forwardV()), VertexData.normal(targetPrimitives[1]).scale(-modelScale / 2), z2, forwardArgb); if (targetPrimitives[2] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[2], config.upwardU(), config.upwardV()), VertexData.normal(targetPrimitives[2]).scale(-modelScale / 2), z2, upwardArgb); } @@ -232,8 +229,8 @@ public void drawFocusedInModelArea(GuiGraphicsExtractor graphics) { VertexData[] focused = focusedPolyhedron.getFirst(); VertexData[] reversed = new VertexData[focused.length]; for (int i = 0; i < focused.length; i++) reversed[i] = focused[focused.length - 1 - i]; - GUIHelper.polygon(graphics, reversed, z1, focusedArgb); - focusedPolyhedron.forEach(primitive -> GUIHelper.polygon(graphics, primitive, z1, focusedArgb)); + GUIHelper.triangleOrQuad(graphics, reversed, z1, focusedArgb); + focusedPolyhedron.forEach(primitive -> GUIHelper.triangleOrQuad(graphics, primitive, z1, focusedArgb)); } public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics, Matrix4f texturePose) { @@ -251,8 +248,8 @@ public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics, Matrix4f tex position.set(vertex.u(), vertex.v(), 0).mulPosition(texturePose); transformed[i] = reversed[length - 1 - i] = VertexData.immutable(position.x(), position.y(), 0, vertex.argb(), vertex.u(), vertex.v(), vertex.overlay(), vertex.light(), 0, 0, 1); } - GUIHelper.polygon(graphics, transformed, 0, focusedArgb); - GUIHelper.polygon(graphics, reversed, 0, focusedArgb); + GUIHelper.triangleOrQuad(graphics, transformed, 0, focusedArgb); + GUIHelper.triangleOrQuad(graphics, reversed, 0, focusedArgb); } } @@ -289,4 +286,7 @@ public void computeBindResult(BuiltIterableBuffer builtBuffer) { bindResult = result.computeCamera(true); } } + + private record ZEntry(BuiltModelRecord record, VertexData[] primitive, float z) { + } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index bf4bd894..2a8ff320 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -472,12 +472,12 @@ private void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mouseY } if (inModelViewArea(mouseX, mouseY)) analyser.computeFocusedOnModel(mouseX, mouseY, layers); if (toggleCategoryButton.getValue() == Category.CONFIGS || selectionModeButton.getValue() == 1) analyser.computeFocusedPolyhedron(); - focusedPolyhedron = analyser.focusedPolyhedron.toArray(new VertexData[0][]); + focusedPolyhedron = analyser.getFocusedPolyhedron(); focusedTextureId = analyser.getFocusedTextureId(); GUIHelper.enableScissor(graphics, modelViewArea); if (toggleCategoryButton.getValue() != Category.PREVIEW) analyser.drawFocusedInModelArea(graphics); - if (toggleCategoryButton.getValue() == Category.CONFIGS) analyser.drawBindTarget(graphics); - else analyser.drawCameraDirections(graphics); + if (toggleCategoryButton.getValue() == Category.CONFIGS) analyser.drawBindTarget(graphics, modelScale); + else analyser.drawCameraDirections(graphics, modelScale); graphics.disableScissor(); if (textureViewArea != null) { GUIHelper.enableScissor(graphics, textureViewArea); diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java index 3b4e65ce..c80ee12b 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java @@ -101,7 +101,8 @@ private void renderTranslucentFeatures() { } public SubmitNodeCollector initCollector() { - meshCatcher.initialize(); + meshCatcher.clear(); + storage.clear(); return storage; } @@ -135,7 +136,7 @@ private MeshCatcher() { return bufferBuilder; } - public void initialize() { + public void clear() { for (MeshData meshData : caughtMeshes.keySet()) { meshData.close(); } diff --git a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java index d69f24d0..65c2e3f5 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java @@ -44,7 +44,7 @@ public static boolean pointInTriangle(float x, float y, float x0, float y0, floa } public static boolean pointInQuad(float x, float y, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) { - return pointInTriangle(x, y, x0, y0, x1, y1, x2, y2) || pointInTriangle(x, y, x1, y1, x2, y2, x3, y3); + return pointInTriangle(x, y, x0, y0, x1, y1, x2, y2) || pointInTriangle(x, y, x0, y0, x2, y2, x3, y3); } public static Vec3 getEulerAngleYXZ(Matrix3f normal) { From 1ca1f249f0fbbd5c40ad031aeea3ba6cc4c5045d Mon Sep 17 00:00:00 2001 From: xTracr Date: Wed, 13 May 2026 17:18:46 +0800 Subject: [PATCH 17/34] Refactor ModelAnalyser to stateless design; consolidate render pipeline in ModelViewScreen --- .../xtracr/realcamera/gui/ModelAnalyser.java | 75 ++++------ .../realcamera/gui/ModelViewScreen.java | 131 +++++++++--------- 2 files changed, 96 insertions(+), 110 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index 51594bf0..606922f7 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -36,46 +36,12 @@ public final class ModelAnalyser { private static final int planeArgb = 0x6F3333CC, forwardArgb = 0xFF00CC00, upwardArgb = 0xFFCC0000, leftArgb = 0xFF0000CC, focusedArgb = 0x4FFFFFFF; private static final int z1 = 210, z2 = z1 + 10; private final List focusedPolyhedron = new ArrayList<>(); - final List modelRecords = new ArrayList<>(), textureRecords = new ArrayList<>(); private VertexData[][] targetPrimitives = new VertexData[3][]; private BindResult bindResult = BindResult.EMPTY; - private BindTarget target = BindTarget.EMPTY; @Nullable private BuiltModelRecord focusedRecord, currentRecord; - private static boolean haveCommonVertex(VertexData[] p1, List primitives) { - final float precision = 1e-5f; - for (VertexData[] p2 : primitives) - for (VertexData v1 : p1) - for (VertexData v2 : p2) - if (Math.abs(v1.x() - v2.x()) < precision && Math.abs(v1.y() - v2.y()) < precision && Math.abs(v1.z() - v2.z()) < precision) - return true; - return false; - } - - public void initialize(BindTarget target, int modelScale) { - this.target = target; - modelRecords.clear(); - textureRecords.clear(); - focusedPolyhedron.clear(); - targetPrimitives[0] = targetPrimitives[1] = targetPrimitives[2] = null; - bindResult = BindResult.EMPTY; - focusedRecord = currentRecord = null; - target.offsets().setScale(target.offsets().getScale() * modelScale); - } - - public String getFocusedTextureId() { - return focusedRecord == null ? null : focusedRecord.textureId(); - } - - public VertexData[][] getFocusedPolyhedron() { - return focusedPolyhedron.toArray(new VertexData[0][]); - } - - public void applyDisableConfigs(String textureId, Set hiddenNames) { - for (BuiltModelRecord record : modelRecords) { - if (record.containsTextureId(textureId)) textureRecords.add(record); - } + public static void applyDisableConfigs(List modelRecords, BindTarget target, String textureId, Set hiddenNames) { for (int i = 0; i < modelRecords.size(); i++) { BuiltModelRecord record = modelRecords.get(i); List primitives = new ArrayList<>(); @@ -101,7 +67,25 @@ public void applyDisableConfigs(String textureId, Set hiddenNames) { } } - public void computeFocusedOnTexture(float mouseU, float mouseV) { + private static boolean haveCommonVertex(VertexData[] p1, List primitives) { + final float precision = 1e-5f; + for (VertexData[] p2 : primitives) + for (VertexData v1 : p1) + for (VertexData v2 : p2) + if (Math.abs(v1.x() - v2.x()) < precision && Math.abs(v1.y() - v2.y()) < precision && Math.abs(v1.z() - v2.z()) < precision) + return true; + return false; + } + + public VertexData[][] getFocusedPolyhedron() { + return focusedPolyhedron.toArray(new VertexData[0][]); + } + + public String getFocusedTextureId() { + return focusedRecord == null ? null : focusedRecord.textureId(); + } + + public void computeFocusedOnTexture(List textureRecords, float mouseU, float mouseV) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; for (BuiltModelRecord record : textureRecords) { for (VertexData[] primitive : record.primitives()) { @@ -114,7 +98,7 @@ public void computeFocusedOnTexture(float mouseU, float mouseV) { } } - public void computeFocusedOnModel(int mouseX, int mouseY, int layers) { + public void computeFocusedOnModel(List modelRecords, int mouseX, int mouseY, int layers) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; List sortByZ = new ArrayList<>(); for (BuiltModelRecord record : modelRecords) { @@ -134,7 +118,7 @@ public void computeFocusedOnModel(int mouseX, int mouseY, int layers) { focusedPolyhedron.add(result.primitive()); } - public void computeFocusedOnModel(int minX, int minY, int maxX, int maxY) { + public void computeFocusedOnModel(List modelRecords, int minX, int minY, int maxX, int maxY) { if (focusedRecord != null && !focusedPolyhedron.isEmpty()) return; List sortByZ = new ArrayList<>(); for (BuiltModelRecord record : modelRecords) { @@ -216,8 +200,7 @@ public void drawCameraDirections(GuiGraphicsExtractor graphics, double modelScal GUIHelper.vector(graphics, start, new Vec3(normal.m00(), normal.m01(), normal.m02()).scale(modelScale / 6), z2, leftArgb); } - public void drawBindTarget(GuiGraphicsExtractor graphics, double modelScale) { - if (currentRecord == null) return; + public void drawBindTarget(GuiGraphicsExtractor graphics, BindTarget target, double modelScale) { TargetConfig config = target.targetConfig(); if (targetPrimitives[0] != null) GUIHelper.triangleOrQuad(graphics, targetPrimitives[0], z1, planeArgb); if (targetPrimitives[1] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[1], config.forwardU(), config.forwardV()), VertexData.normal(targetPrimitives[1]).scale(-modelScale / 2), z2, forwardArgb); @@ -230,7 +213,7 @@ public void drawFocusedInModelArea(GuiGraphicsExtractor graphics) { VertexData[] reversed = new VertexData[focused.length]; for (int i = 0; i < focused.length; i++) reversed[i] = focused[focused.length - 1 - i]; GUIHelper.triangleOrQuad(graphics, reversed, z1, focusedArgb); - focusedPolyhedron.forEach(primitive -> GUIHelper.triangleOrQuad(graphics, primitive, z1, focusedArgb)); + for (VertexData[] primitive : focusedPolyhedron) GUIHelper.triangleOrQuad(graphics, primitive, z1, focusedArgb); } public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics, Matrix4f texturePose) { @@ -253,14 +236,16 @@ public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics, Matrix4f tex } } - public void updateModel(Minecraft client, Entity entity, float partialTicks, PoseStack poseStack) { + public List captureModel(Minecraft client, Entity entity, float partialTicks, PoseStack poseStack, BindTarget target) { EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); client.gameRenderer.getLighting().setupFor(Lighting.Entry.ENTITY_IN_UI); dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, poseStack, vertexCatcher.initCollector()); - vertexCatcher.forEachBuffer(this::computeBindResult); + List records = new ArrayList<>(); + vertexCatcher.forEachBuffer(buf -> computeRecord(buf, records, target)); + return records; } - public void computeBindResult(BuiltIterableBuffer builtBuffer) { + private void computeRecord(BuiltIterableBuffer builtBuffer, List records, BindTarget target) { VertexData[] vertices = builtBuffer.vertexBuffer().stream().map(VertexData::asImmutable).toArray(VertexData[]::new); VertexFormat.Mode drawMode = builtBuffer.renderType().mode(); final int primitiveLength = drawMode.primitiveLength, primitiveStride = drawMode.primitiveStride; @@ -272,7 +257,7 @@ public void computeBindResult(BuiltIterableBuffer builtBuffer) { System.arraycopy(vertices, k + 1, primitives[i], 1, primitiveLength - 1); } BuiltModelRecord record = new BuiltModelRecord(builtBuffer.renderType(), builtBuffer.textureId(), vertices, primitives); - modelRecords.add(record); + records.add(record); if (!builtBuffer.textureId().contains(target.textureId()) || currentRecord != null) return; BindResult result = new BindResult(target); BindTarget.TargetConfig config = target.targetConfig(); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 2a8ff320..bda127fe 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -15,6 +15,7 @@ import com.xtracr.realcamera.gui.components.DoubleSlider; import com.xtracr.realcamera.gui.components.NumberField; import com.xtracr.realcamera.gui.components.SimpleIconButton; +import com.xtracr.realcamera.renderer.state.BuiltModelRecord; import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.util.LocUtil; import com.xtracr.realcamera.util.MathUtil; @@ -51,7 +52,6 @@ import java.util.zip.InflaterInputStream; public final class ModelViewScreen extends Screen { - public final ModelAnalyser analyser = new ModelAnalyser(); private final int xSize = 450, ySize = 206, middleWidth = xSize - 200, widgetWidth = (xSize - middleWidth) / 4 - 8, widgetHeight = 18; private int x, y, page = 0; private InputConstants.Key modifierKey = ConfigFile.config().getScreenModifierKey(); @@ -454,88 +454,89 @@ public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX graphics.fill(x, y, x + (xSize - middleWidth) / 2 - 4, y + ySize, 0xFF444444); graphics.fill(x + (xSize - middleWidth) / 2, y, x + (xSize + middleWidth) / 2, y + ySize, 0xFF222222); graphics.fill(x + (xSize + middleWidth) / 2 + 4, y, x + xSize, y + ySize, 0xFF444444); - analyser.initialize(genBindTarget(), modelScale); - renderModelViewArea(graphics, minecraft.player); - renderTextureViewArea(graphics); - applyAnalyser(graphics, mouseX, mouseY); - } - private void applyAnalyser(GuiGraphicsExtractor graphics, int mouseX, int mouseY) { + ModelAnalyser analyser = new ModelAnalyser(); + BindTarget target = genBindTarget(); + target.offsets().setScale(target.offsets().getScale() * modelScale); String textureId = toggleCategoryButton.getValue() == Category.DISABLE ? disabledIdField.getValue() : ""; Set hiddenNames = hiddenNameMap.getOrDefault(nameField.getValue(), Set.of()); - analyser.applyDisableConfigs(textureId, hiddenNames); + List modelRecords = captureRotatedEntity(analyser, target, minecraft.player); + List textureRecords = modelRecords.stream().filter(record -> record.containsTextureId(textureId)).toList(); + ModelAnalyser.applyDisableConfigs(modelRecords, target, textureId, hiddenNames); + computeFocusedPrimitives(analyser, modelRecords, textureRecords, mouseX, mouseY); + renderCulledModels(graphics, analyser, target, modelRecords); + if (textureViewArea != null) renderFlattenedModels(graphics, analyser, textureRecords); + } + + private List captureRotatedEntity(ModelAnalyser analyser, BindTarget target, LivingEntity entity) { + float entityBodyYaw = entity.yBodyRot; + float entityYaw = entity.getYRot(); + float entityPitch = entity.getXRot(); + float entityPrevHeadYaw = entity.yHeadRotO; + float entityHeadYaw = entity.yHeadRot; + entity.yBodyRot = 180.0f; + entity.setYRot(180.0f + (float) entityYawSlider.getDouble()); + entity.setXRot((float) entityPitchSlider.getDouble()); + entity.yHeadRot = entity.getYRot(); + entity.yHeadRotO = entity.getYRot(); + try { + int x1 = modelViewArea.left(), y1 = modelViewArea.top(), x2 = modelViewArea.right(), y2 = modelViewArea.bottom(); + Quaternionf rotation = new Quaternionf().rotateX((float) Math.PI / 6 + xRot).rotateY((float) Math.PI / 6 + yRot).rotateZ((float) Math.PI); + PoseStack modelPose = new PoseStack(); + modelPose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); + modelPose.scale(modelScale, modelScale, -modelScale); + modelPose.translate(modelX, modelY, 0); + modelPose.mulPose(rotation); + modelPose.translate(0, -entity.getBbHeight() / 2.0f, 0); + return analyser.captureModel(minecraft, entity, 1.0f, modelPose, target); + } finally { + entity.yBodyRot = entityBodyYaw; + entity.setYRot(entityYaw); + entity.setXRot(entityPitch); + entity.yHeadRotO = entityPrevHeadYaw; + entity.yHeadRot = entityHeadYaw; + } + } + + private void computeFocusedPrimitives(ModelAnalyser analyser, List modelRecords, List textureRecords, int mouseX, int mouseY) { if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) - analyser.computeFocusedOnModel(mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius); + analyser.computeFocusedOnModel(modelRecords, mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius); if (inTextureViewArea(mouseX, mouseY)) { Vec2 mouseUV = translateXYToUV(mouseX, mouseY, textureViewArea); - analyser.computeFocusedOnTexture(mouseUV.x, mouseUV.y); + analyser.computeFocusedOnTexture(textureRecords, mouseUV.x, mouseUV.y); } - if (inModelViewArea(mouseX, mouseY)) analyser.computeFocusedOnModel(mouseX, mouseY, layers); + if (inModelViewArea(mouseX, mouseY)) analyser.computeFocusedOnModel(modelRecords, mouseX, mouseY, layers); if (toggleCategoryButton.getValue() == Category.CONFIGS || selectionModeButton.getValue() == 1) analyser.computeFocusedPolyhedron(); focusedPolyhedron = analyser.getFocusedPolyhedron(); focusedTextureId = analyser.getFocusedTextureId(); + } + + private void renderCulledModels(GuiGraphicsExtractor graphics, ModelAnalyser analyser, BindTarget target, List modelRecords) { + int x1 = modelViewArea.left(), y1 = modelViewArea.top(), x2 = modelViewArea.right(), y2 = modelViewArea.bottom(); GUIHelper.enableScissor(graphics, modelViewArea); + float invScale = 1.0f / modelScale; + Matrix4f modelTransform = new Matrix4f(); + modelTransform.scale(invScale, invScale, -invScale); + modelTransform.translate(-(float) (x1 + x2) / 2.0f, -(float) (y1 + y2) / 2.0f, 0); + GUIHelper.culledModels(graphics, modelRecords, modelScale, modelTransform, x1, y1, x2, y2); if (toggleCategoryButton.getValue() != Category.PREVIEW) analyser.drawFocusedInModelArea(graphics); - if (toggleCategoryButton.getValue() == Category.CONFIGS) analyser.drawBindTarget(graphics, modelScale); + if (toggleCategoryButton.getValue() == Category.CONFIGS) analyser.drawBindTarget(graphics, target, modelScale); else analyser.drawCameraDirections(graphics, modelScale); graphics.disableScissor(); - if (textureViewArea != null) { - GUIHelper.enableScissor(graphics, textureViewArea); - Matrix4f texturePose = new Matrix4f(); - int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); - float scale = (float) (textureScale * textureViewArea.width()) / 80; - texturePose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); - texturePose.scale(scale, scale, -scale); - texturePose.translate((float) textureX - 0.5f, (float) textureY - 0.5f, 0); - analyser.drawFocusedInTextureArea(graphics, texturePose); - graphics.disableScissor(); - } } - private void renderModelViewArea(GuiGraphicsExtractor graphics, LivingEntity entity) { - int x1 = modelViewArea.left(), y1 = modelViewArea.top(), x2 = modelViewArea.right(), y2 = modelViewArea.bottom(); - Quaternionf rotation = new Quaternionf().rotateX((float) Math.PI / 6 + xRot).rotateY((float) Math.PI / 6 + yRot).rotateZ((float) Math.PI); - float entityBodyYaw = entity.yBodyRot; - float entityYaw = entity.getYRot(); - float entityPitch = entity.getXRot(); - float entityPrevHeadYaw = entity.yHeadRotO; - float entityHeadYaw = entity.yHeadRot; - entity.yBodyRot = 180.0f; - entity.setYRot(180.0f + (float) entityYawSlider.getDouble()); - entity.setXRot((float) entityPitchSlider.getDouble()); - entity.yHeadRot = entity.getYRot(); - entity.yHeadRotO = entity.getYRot(); - Vector3f offset = new Vector3f((float) modelX, (float) modelY, 0); - renderEntityWithAnalyser(graphics, x1, y1, x2, y2, modelScale, offset, rotation, entity); - entity.yBodyRot = entityBodyYaw; - entity.setYRot(entityYaw); - entity.setXRot(entityPitch); - entity.yHeadRotO = entityPrevHeadYaw; - entity.yHeadRot = entityHeadYaw; - } - - private void renderEntityWithAnalyser(GuiGraphicsExtractor graphics, int x1, int y1, int x2, int y2, float scale, Vector3f offset, Quaternionf rotation, LivingEntity entity) { - PoseStack modelPose = new PoseStack(); - modelPose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); - modelPose.scale(scale, scale, -scale); - modelPose.translate(offset.x(), offset.y(), offset.z()); - modelPose.mulPose(rotation); - modelPose.translate(0, -entity.getBbHeight() / 2.0f, 0); - analyser.updateModel(minecraft, entity, 1.0f, modelPose); - Matrix4f transform = new Matrix4f(); - transform.translate(offset.x(), offset.y(), offset.z()); - transform.rotate(rotation); - transform.translate(0, -entity.getBbHeight() / 2.0f, 0); - transform.mul(modelPose.last().pose().invert(new Matrix4f())); - GUIHelper.culledModels(graphics, analyser.modelRecords, scale, transform, x1, y1, x2, y2); - } - - private void renderTextureViewArea(GuiGraphicsExtractor graphics) { - if (textureViewArea == null) return; + private void renderFlattenedModels(GuiGraphicsExtractor graphics, ModelAnalyser analyser, List textureRecords) { int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); - Vector3f offset = new Vector3f((float) textureX - 0.5f, (float) textureY - 0.5f, 0); + GUIHelper.enableScissor(graphics, textureViewArea); float scale = (float) (textureScale * textureViewArea.width()) / 80; - GUIHelper.flattenedModels(graphics, analyser.textureRecords, offset, x1, y1, x2, y2, scale); + Vector3f offset = new Vector3f((float) textureX - 0.5f, (float) textureY - 0.5f, 0); + GUIHelper.flattenedModels(graphics, textureRecords, offset, x1, y1, x2, y2, scale); + Matrix4f texturePose = new Matrix4f(); + texturePose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); + texturePose.scale(scale, scale, -scale); + texturePose.translate(offset); + analyser.drawFocusedInTextureArea(graphics, texturePose); + graphics.disableScissor(); } private Vec2 translateUVToXY(float u, float v, ScreenRectangle screenArea) { From 9d52edd84078c5117256d2a89b4d117983dc4aba Mon Sep 17 00:00:00 2001 From: xTracr Date: Wed, 13 May 2026 19:51:46 +0800 Subject: [PATCH 18/34] Extract config inner classes to top level; replace getter delegation with direct field access --- .../com/xtracr/realcamera/KeyMappings.java | 16 +- .../com/xtracr/realcamera/RealCameraCore.java | 14 +- .../com/xtracr/realcamera/api/BindResult.java | 13 +- .../realcamera/compat/DisableHelper.java | 16 +- .../realcamera/compat/LegacyBindingMode.java | 2 +- .../xtracr/realcamera/config/BindTarget.java | 229 +----------------- .../xtracr/realcamera/config/ConfigFile.java | 34 +-- .../realcamera/config/ConfigScreen.java | 6 +- .../realcamera/config/DisableConfig.java | 127 ++++++++++ .../xtracr/realcamera/config/ModConfig.java | 127 +--------- .../realcamera/config/OffsetConfig.java | 45 ++++ .../xtracr/realcamera/config/UVRectangle.java | 20 ++ .../xtracr/realcamera/gui/ModelAnalyser.java | 2 +- .../realcamera/gui/ModelViewScreen.java | 61 +++-- .../xtracr/realcamera/mixin/MixinCamera.java | 2 +- .../realcamera/mixin/MixinGameRenderer.java | 2 +- .../com/xtracr/realcamera/mixin/MixinGui.java | 4 +- .../xtracr/realcamera/mixin/MixinItem.java | 2 +- .../realcamera/mixin/MixinLevelRenderer.java | 4 +- .../realcamera/mixin/MixinLocalPlayer.java | 4 +- .../mixin/MixinStuckInBodyLayer.java | 2 +- .../renderer/BuiltIterableBuffer.java | 2 +- .../renderer/IterableVertexBuffer.java | 3 +- 23 files changed, 304 insertions(+), 433 deletions(-) create mode 100644 common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java create mode 100644 common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java create mode 100644 common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java diff --git a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java index 0fa37732..896b7ef8 100644 --- a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java +++ b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java @@ -19,13 +19,13 @@ public final class KeyMappings { static { MODEL_VIEW_SCREEN = createKeyMapping("modelViewScreen", client -> client.setScreen(new ModelViewScreen())); createKeyMapping("togglePerspective", InputConstants.KEY_F6, _ -> { - boolean enabled = ConfigFile.config().enabled(); + boolean enabled = ConfigFile.config().enabled; ConfigFile.load(); - ConfigFile.config().setEnabled(!enabled); + ConfigFile.config().enabled = !enabled; RealCameraCore.reset(); }); createKeyMapping("toggleAdjustMode", _ -> ConfigFile.config().cycleAdjustMode()); - createKeyMapping("toggleCameraMode", _ -> ConfigFile.config().setClassic(!ConfigFile.config().isClassic())); + createKeyMapping("toggleCameraMode", _ -> ConfigFile.config().isClassic = !ConfigFile.config().isClassic); createKeyMapping("adjustFRONT", _ -> ConfigFile.config().adjustOffsetX(1)); createKeyMapping("adjustBACK", _ -> ConfigFile.config().adjustOffsetX(-1)); createKeyMapping("adjustUP", _ -> ConfigFile.config().adjustOffsetY(1)); @@ -53,11 +53,15 @@ public static void register(Consumer registerer) { public static void handle(Minecraft client) { if (client.player == null) return; - KEY_MAPPINGS.forEach((keyMapping, whenPressed) -> { + boolean anyPressed = false; + for (var entry : KEY_MAPPINGS.entrySet()) { + KeyMapping keyMapping = entry.getKey(); + Consumer whenPressed = entry.getValue(); while (keyMapping.consumeClick()) { whenPressed.accept(client); - ConfigFile.save(); + anyPressed = true; } - }); + } + if (anyPressed) ConfigFile.save(); } } diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index e7ea9f67..4cd9e7ba 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -5,8 +5,8 @@ import com.xtracr.realcamera.api.RealCameraAPI; import com.xtracr.realcamera.compat.DisableHelper; import com.xtracr.realcamera.config.BindTarget; -import com.xtracr.realcamera.config.BindTarget.DisableConfig; import com.xtracr.realcamera.config.ConfigFile; +import com.xtracr.realcamera.config.DisableConfig; import com.xtracr.realcamera.renderer.BuiltIterableBuffer; import com.xtracr.realcamera.renderer.MultiVertexCatcher; import com.xtracr.realcamera.renderer.RoutingSubmitCollector; @@ -45,8 +45,8 @@ public static BindTarget currentTarget() { public static void initialize(Minecraft client, boolean renderLevel) { Entity entity = client.getCameraEntity(); - active = renderLevel && ConfigFile.config().enabled() && client.options.getCameraType().isFirstPerson() && entity != null && !DisableHelper.MAIN_FEATURE.disabled(entity); - rendering = ConfigFile.config().renderModel() && !DisableHelper.RENDER_MODEL.disabled(entity); + active = renderLevel && ConfigFile.config().enabled && client.options.getCameraType().isFirstPerson() && entity != null && !DisableHelper.MAIN_FEATURE.disabled(entity); + rendering = ConfigFile.config().renderModel && !DisableHelper.RENDER_MODEL.disabled(entity); } public static void reset() { @@ -84,8 +84,8 @@ public static void computeCamera(Minecraft client, float partialTicks) { } else { failureFrames++; Player player = client.player; - int retentionFrames = ConfigFile.config().getBindResultRetentionFrames(); - if (!ConfigFile.config().hideBindingFailureMessage() && failureFrames == retentionFrames + 1 && player != null) { + int retentionFrames = ConfigFile.config().binding.bindResultRetentionFrames; + if (!ConfigFile.config().binding.hideFailureMessage && failureFrames == retentionFrames + 1 && player != null) { player.sendSystemMessage(LocUtil.MESSAGE("bindingFailed", LocUtil.MOD_NAME(), LocUtil.MODEL_VIEW_TITLE(), KeyMappings.MODEL_VIEW_SCREEN.getTranslatedKeyMessage())); } if (!lastResult.available() || failureFrames > retentionFrames) { @@ -94,8 +94,8 @@ public static void computeCamera(Minecraft client, float partialTicks) { return; } } - smoothedCamera.lerpPosition(lastResult.getPosition(), 1 - ConfigFile.config().getDisplacementSmoothFactor()); - smoothedCamera.slerpRotation(lastResult.getRotation(), 1 - ConfigFile.config().getRotationSmoothFactor()); + smoothedCamera.lerpPosition(lastResult.getPosition(), 1 - ConfigFile.config().binding.displacementSmoothFactor); + smoothedCamera.slerpRotation(lastResult.getRotation(), 1 - ConfigFile.config().binding.rotationSmoothFactor); } public static void renderCameraEntity(Minecraft client, float partialTicks, SubmitNodeCollector submitNodeCollector, Matrix4f modelView) { diff --git a/common/src/main/java/com/xtracr/realcamera/api/BindResult.java b/common/src/main/java/com/xtracr/realcamera/api/BindResult.java index dd4051a2..61a6fd37 100644 --- a/common/src/main/java/com/xtracr/realcamera/api/BindResult.java +++ b/common/src/main/java/com/xtracr/realcamera/api/BindResult.java @@ -2,6 +2,7 @@ import com.xtracr.realcamera.config.BindTarget; import com.xtracr.realcamera.config.ConfigFile; +import com.xtracr.realcamera.config.OffsetConfig; import com.xtracr.realcamera.util.CameraTransform; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; @@ -18,7 +19,7 @@ public BindResult(BindTarget target) { } public static BindResult getOrCreate(String name) { - List fixedTargets = ConfigFile.config().getFixedTargetList(); + List fixedTargets = ConfigFile.config().binding.fixedTargetList; BindTarget target = fixedTargets.stream() .filter(t -> t.name().equals(name)) .findFirst() @@ -60,12 +61,12 @@ public BindResult computeCamera(boolean mirrored) { upward = forward.cross(upward.cross(forward)).normalize(); Vec3 left = upward.cross(forward).scale(orientation); rotation.set(left.toVector3f(), upward.toVector3f(), forward.toVector3f()); - BindTarget.OffsetConfig offsets = target.offsets(); - Vector3f offset = new Vector3f(offsets.getZ(), offsets.getY(), offsets.getX()).mul(offsets.getScale()).mul(rotation); + OffsetConfig offsets = target.offsets(); + Vector3f offset = new Vector3f(offsets.z, offsets.y, offsets.x).mul(offsets.scale).mul(rotation); position = position.add(offset.x(), offset.y(), offset.z()); - rotation.rotateLocal(orientation * (float) Math.toRadians(offsets.getYaw()), rotation.m10, rotation.m11, rotation.m12); - rotation.rotateLocal(orientation * (float) Math.toRadians(offsets.getPitch()), rotation.m00, rotation.m01, rotation.m02); - rotation.rotateLocal(orientation * (float) Math.toRadians(offsets.getRoll()), rotation.m20, rotation.m21, rotation.m22); + rotation.rotateLocal(orientation * (float) Math.toRadians(offsets.yaw), rotation.m10, rotation.m11, rotation.m12); + rotation.rotateLocal(orientation * (float) Math.toRadians(offsets.pitch), rotation.m00, rotation.m01, rotation.m02); + rotation.rotateLocal(orientation * (float) Math.toRadians(offsets.roll), rotation.m20, rotation.m21, rotation.m22); return this; } } diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index 0be9eb8f..5d4ff186 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -26,15 +26,15 @@ public final class DisableHelper { MAIN_FEATURE = new Entry("mainFeature", player -> player.isSleeping() || player.isSpectator()); RENDER_MODEL = new Entry("renderModel", FALSE, Player::isScoping); RENDER_HANDS = new Entry("renderHands", _ -> RealCameraCore.isRendering()); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSneaking() && player.isCrouching()); - MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSneaking() && player.isCrouching()); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenSwimming() && checkCondition(player, player.isSwimming(), ConfigFile.config().getBindingOutTick())); - MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classicDisableWhenSwimming() && checkCondition(player, player.isSwimming(), ConfigFile.config().getClassicOutTick())); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().bindingDisableWhenCrawling() && checkCondition(player, player.isVisuallyCrawling(), ConfigFile.config().getBindingOutTick())); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenSneaking && player.isCrouching()); + MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classic.disableWhenSneaking && player.isCrouching()); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenSwimming && checkCondition(player, player.isSwimming(), ConfigFile.config().binding.outTick)); + MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classic.disableWhenSwimming && checkCondition(player, player.isSwimming(), ConfigFile.config().classic.outTick)); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenCrawling && checkCondition(player, player.isVisuallyCrawling(), ConfigFile.config().binding.outTick)); MAIN_FEATURE.registerOrInBinding(player -> { Item mainHand = player.getMainHandItem().getItem(); Item offHand = player.getOffhandItem().getItem(); - for (String pattern : ConfigFile.config().getDisableMainFeatureItems()) + for (String pattern : ConfigFile.config().binding.disableMainFeatureItems) if (matchesItemPattern(mainHand, pattern) || matchesItemPattern(offHand, pattern)) return true; return false; @@ -42,7 +42,7 @@ public final class DisableHelper { RENDER_MODEL.registerOrInBinding(player -> { Item mainHand = player.getMainHandItem().getItem(); Item offHand = player.getOffhandItem().getItem(); - for (String pattern : ConfigFile.config().getDisableRenderItems()) + for (String pattern : ConfigFile.config().binding.disableRenderItems) if (matchesItemPattern(mainHand, pattern) || matchesItemPattern(offHand, pattern)) return true; return false; @@ -134,7 +134,7 @@ public void registerOrInBinding(Predicate predicate) { public boolean disabled(Entity cameraEntity) { if (!(cameraEntity instanceof Player player)) return false; - return ConfigFile.config().isClassic() ? predicateInClassic.test(player) : predicateInBinding.test(player); + return ConfigFile.config().isClassic ? predicateInClassic.test(player) : predicateInBinding.test(player); } } } \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java b/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java index 5cc4b2fb..4d19147a 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/LegacyBindingMode.java @@ -22,7 +22,7 @@ public static void register() { @SuppressWarnings("unchecked") private static BindResult computeBindResult(Minecraft client, float partialTicks) { - if (!ConfigFile.config().legacyBindingMode()) return BindResult.EMPTY; + if (!ConfigFile.config().binding.legacyMode) return BindResult.EMPTY; PoseStack poseStack = new PoseStack(); AbstractClientPlayer player = client.player; // WorldRenderer.render diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index 8e91c4b8..87956e33 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -1,16 +1,7 @@ package com.xtracr.realcamera.config; -import com.google.gson.TypeAdapter; -import com.google.gson.annotations.JsonAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; -import com.xtracr.realcamera.renderer.state.VertexData; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; -import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @@ -62,7 +53,8 @@ private static BindTarget vanillaTarget(String name, int priority, boolean shoul String textureId = name.contains("skin") ? "minecraft:skins/" : "minecraft:textures/entity/player/"; TargetConfig targetConfig = new TargetConfig(0.1875f, 0.2f, 0.1875f, 0.075f, 0.1875f, 0.2f); BindConfig bindConfig = new BindConfig(shouldBind, true, shouldBind, shouldBind); - OffsetConfig offsets = new OffsetConfig().setX(-0.1f); + OffsetConfig offsets = new OffsetConfig(); + offsets.x = -0.1f; DisableConfig playerHead = new DisableConfig("player_head", textureId, false, new UVRectangle[]{new UVRectangle(0, 0, 1.0f, 0.25f)}); DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, new UVRectangle[0]); DisableConfig[] disableConfigs = new DisableConfig[]{playerHead, dragonHead}; @@ -126,221 +118,4 @@ public void write(FriendlyByteBuf byteBuf) { byteBuf.writeByte(bindFlags); } } - - public static final class OffsetConfig { - private float scale = 1, x = 0, y = 0, z = 0, pitch = 0, yaw = 0, roll = 0; - - public static OffsetConfig read(FriendlyByteBuf byteBuf) { - return new OffsetConfig().setScale(byteBuf.readFloat()).setX(byteBuf.readFloat()).setY(byteBuf.readFloat()).setZ(byteBuf.readFloat()).setPitch(byteBuf.readFloat()).setYaw(byteBuf.readFloat()).setRoll(byteBuf.readFloat()); - } - - public float getScale() { - return scale; - } - - public OffsetConfig setScale(float scale) { - this.scale = scale; - return this; - } - - public float getX() { - return x; - } - - public OffsetConfig setX(float x) { - this.x = Mth.clamp(x, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); - return this; - } - - public float getY() { - return y; - } - - public OffsetConfig setY(float y) { - this.y = Mth.clamp(y, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); - return this; - } - - public float getZ() { - return z; - } - - public OffsetConfig setZ(float z) { - this.z = Mth.clamp(z, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); - return this; - } - - public float getPitch() { - return pitch; - } - - public OffsetConfig setPitch(float pitch) { - this.pitch = Mth.wrapDegrees(pitch); - return this; - } - - public float getYaw() { - return yaw; - } - - public OffsetConfig setYaw(float yaw) { - this.yaw = Mth.wrapDegrees(yaw); - return this; - } - - public float getRoll() { - return roll; - } - - public OffsetConfig setRoll(float roll) { - this.roll = Mth.wrapDegrees(roll); - return this; - } - - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeFloat(scale); - byteBuf.writeFloat(x); - byteBuf.writeFloat(y); - byteBuf.writeFloat(z); - byteBuf.writeFloat(pitch); - byteBuf.writeFloat(yaw); - byteBuf.writeFloat(roll); - } - } - - @JsonAdapter(DisableConfig.Adapter.class) - public static final class DisableConfig { - private final LongOpenHashSet disabledUVs = new LongOpenHashSet(), enabledUVs = new LongOpenHashSet(); - private final String name; - private final String textureId; - private final boolean disableAll; - private final UVRectangle[] rectangles; - - public DisableConfig(String name, String textureId, boolean disableAll, UVRectangle[] rectangles) { - this.name = name; - this.textureId = textureId; - this.disableAll = disableAll; - this.rectangles = rectangles; - } - - public static DisableConfig read(FriendlyByteBuf byteBuf) { - String name = byteBuf.readUtf(); - String textureId = byteBuf.readUtf(); - boolean disableAll = byteBuf.readBoolean(); - UVRectangle[] rectangles = new UVRectangle[byteBuf.readVarInt()]; - for (int i = 0; i < rectangles.length; i++) { - rectangles[i] = UVRectangle.read(byteBuf); - } - return new DisableConfig(name, textureId, disableAll, rectangles); - } - - public String name() { - return name; - } - - public String textureId() { - return textureId; - } - - public boolean disableAll() { - return disableAll; - } - - public UVRectangle[] rectangles() { - return rectangles; - } - - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeUtf(name); - byteBuf.writeUtf(textureId); - byteBuf.writeBoolean(disableAll); - byteBuf.writeVarInt(rectangles.length); - for (UVRectangle rect : rectangles) { - rect.write(byteBuf); - } - } - - public boolean disable(VertexData vertex) { - final float u = vertex.u(), v = vertex.v(); - final long packed = (long) Float.floatToIntBits(u) << 32 | Float.floatToIntBits(v); - if (enabledUVs.contains(packed)) return false; - if (disabledUVs.contains(packed)) return true; - for (UVRectangle rect : rectangles) { - if (!rect.contains(u, v)) continue; - disabledUVs.add(packed); - return true; - } - enabledUVs.add(packed); - return false; - } - - public static final class Adapter extends TypeAdapter { - @Override - public void write(JsonWriter out, DisableConfig value) throws IOException { - out.beginObject(); - out.name("name").value(value.name()); - out.name("textureId").value(value.textureId()); - out.name("disableAll").value(value.disableAll()); - out.name("rectangles"); - out.beginArray(); - for (UVRectangle rect : value.rectangles()) { - out.beginObject(); - out.name("uMin").value(rect.uMin()); - out.name("vMin").value(rect.vMin()); - out.name("uMax").value(rect.uMax()); - out.name("vMax").value(rect.vMax()); - out.endObject(); - } - out.endArray(); - out.endObject(); - } - - @Override - public DisableConfig read(JsonReader in) throws IOException { - in.beginObject(); - in.nextName(); - String name = in.nextString(); - in.nextName(); - String textureId = in.nextString(); - in.nextName(); - boolean disableAll = in.nextBoolean(); - in.nextName(); - in.beginArray(); - ArrayList rectangles = new ArrayList<>(); - while (in.hasNext()) { - in.beginObject(); - in.nextName(); - float uMin = (float) in.nextDouble(); - in.nextName(); - float vMin = (float) in.nextDouble(); - in.nextName(); - float uMax = (float) in.nextDouble(); - in.nextName(); - float vMax = (float) in.nextDouble(); - in.endObject(); - rectangles.add(new UVRectangle(uMin, vMin, uMax, vMax)); - } - in.endArray(); - in.endObject(); - return new DisableConfig(name, textureId, disableAll, rectangles.toArray(UVRectangle[]::new)); - } - } - } - - public record UVRectangle(float uMin, float vMin, float uMax, float vMax) { - public static UVRectangle read(FriendlyByteBuf byteBuf) { - return new UVRectangle(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); - } - - public boolean contains(float u, float v) { - return u >= uMin && u <= uMax && v >= vMin && v <= vMax; - } - - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeFloat(uMin); - byteBuf.writeFloat(vMin); - byteBuf.writeFloat(uMax); - byteBuf.writeFloat(vMax); - } - } } diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java index 0325871b..5ef4f551 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java @@ -1,45 +1,51 @@ package com.xtracr.realcamera.config; +import com.google.common.base.Suppliers; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.xtracr.realcamera.RealCamera; import net.minecraft.client.Minecraft; +import org.jspecify.annotations.Nullable; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; +import java.util.function.Supplier; public final class ConfigFile { - private static final ModConfig modConfig = new ModConfig(); private static final String FILE_NAME = RealCamera.MODID + ".json"; private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - private static final Path PATH; + private final static Supplier path = Suppliers.memoize(ConfigFile::getPath); + @Nullable + private static ModConfig config; - static { + private static Path getPath() { File configDir = new File(Minecraft.getInstance().gameDirectory, "config"); if (!configDir.exists()) configDir.mkdirs(); - PATH = configDir.toPath().resolve(FILE_NAME); + return configDir.toPath().resolve(FILE_NAME); } public static ModConfig config() { - return modConfig; + if (config == null) load(); + return config; } public static void load() { - try (BufferedReader reader = Files.newBufferedReader(PATH)) { - modConfig.set(GSON.fromJson(reader, ModConfig.class)); - modConfig.clamp(); + try (BufferedReader reader = Files.newBufferedReader(path.get())) { + config = GSON.fromJson(reader, ModConfig.class); + config.clamp(); } catch (Exception exception) { - RealCamera.LOGGER.warn("Failed to load " + FILE_NAME); + RealCamera.LOGGER.warn("Failed to load " + FILE_NAME, exception); + config = new ModConfig(); save(); } } public static void save() { - try (BufferedWriter writer = Files.newBufferedWriter(PATH)) { - GSON.toJson(modConfig, writer); + try (BufferedWriter writer = Files.newBufferedWriter(path.get())) { + GSON.toJson(config, writer); } catch (Exception exception) { RealCamera.LOGGER.warn("Failed to save " + FILE_NAME, exception); reset(); @@ -47,9 +53,9 @@ public static void save() { } public static void reset() { - try (BufferedWriter writer = Files.newBufferedWriter(PATH)) { - modConfig.set(new ModConfig()); - GSON.toJson(modConfig, writer); + try (BufferedWriter writer = Files.newBufferedWriter(path.get())) { + config = new ModConfig(); + GSON.toJson(config, writer); } catch (Exception exception) { RealCamera.LOGGER.warn("Failed to reset " + FILE_NAME, exception); } diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 137a18b0..adedb4f8 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -140,16 +140,16 @@ public static Screen create(Screen parent) { binding.addEntry(entryBuilder.startTextDescription(LocUtil.CONFIG_OPTION("toModelViewScreen", LocUtil.MODEL_VIEW_TITLE().withStyle(ChatFormatting.BLUE))) .build()); - binding.addEntry(entryBuilder.startKeyCodeField(LocUtil.CONFIG_OPTION("screenModifierKey", LocUtil.MODEL_VIEW_TITLE()), config.getScreenModifierKey()) + binding.addEntry(entryBuilder.startKeyCodeField(LocUtil.CONFIG_OPTION("screenModifierKey", LocUtil.MODEL_VIEW_TITLE()), InputConstants.getKey(config.binding.screenModifierKey)) .setDefaultValue(InputConstants.Type.KEYSYM.getOrCreate(InputConstants.KEY_LALT)) .setAllowMouse(false) .setAllowModifiers(false) .setKeySaveConsumer(k -> config.binding.screenModifierKey = k.getName()) .build()); - binding.addEntry(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("legacyBindingMode"), config.binding.legacyBindingMode) + binding.addEntry(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("legacyBindingMode"), config.binding.legacyMode) .setDefaultValue(false) .setTooltip(LocUtil.CONFIG_TOOLTIP("legacyBindingMode", LocUtil.MODEL_VIEW_TITLE())) - .setSaveConsumer(b -> config.binding.legacyBindingMode = b) + .setSaveConsumer(b -> config.binding.legacyMode = b) .build()); binding.addEntry(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("adjustOffset"), config.binding.adjustOffset) .setDefaultValue(true) diff --git a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java new file mode 100644 index 00000000..4a144e99 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java @@ -0,0 +1,127 @@ +package com.xtracr.realcamera.config; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import com.xtracr.realcamera.renderer.state.VertexData; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import net.minecraft.network.FriendlyByteBuf; + +import java.io.IOException; +import java.util.ArrayList; + +@JsonAdapter(DisableConfig.Adapter.class) +public final class DisableConfig { + private final LongOpenHashSet disabledUVs = new LongOpenHashSet(), enabledUVs = new LongOpenHashSet(); + private final String name; + private final String textureId; + private final boolean disableAll; + private final UVRectangle[] rectangles; + + public DisableConfig(String name, String textureId, boolean disableAll, UVRectangle[] rectangles) { + this.name = name; + this.textureId = textureId; + this.disableAll = disableAll; + this.rectangles = rectangles; + } + + public static DisableConfig read(FriendlyByteBuf byteBuf) { + String name = byteBuf.readUtf(); + String textureId = byteBuf.readUtf(); + boolean disableAll = byteBuf.readBoolean(); + UVRectangle[] rectangles = new UVRectangle[byteBuf.readVarInt()]; + for (int i = 0; i < rectangles.length; i++) rectangles[i] = UVRectangle.read(byteBuf); + return new DisableConfig(name, textureId, disableAll, rectangles); + } + + public String name() { + return name; + } + + public String textureId() { + return textureId; + } + + public boolean disableAll() { + return disableAll; + } + + public UVRectangle[] rectangles() { + return rectangles; + } + + public void write(FriendlyByteBuf byteBuf) { + byteBuf.writeUtf(name); + byteBuf.writeUtf(textureId); + byteBuf.writeBoolean(disableAll); + byteBuf.writeVarInt(rectangles.length); + for (UVRectangle rect : rectangles) rect.write(byteBuf); + } + + public boolean disable(VertexData vertex) { + final float u = vertex.u(), v = vertex.v(); + final long packed = (long) Float.floatToIntBits(u) << 32 | Float.floatToIntBits(v); + if (enabledUVs.contains(packed)) return false; + if (disabledUVs.contains(packed)) return true; + for (UVRectangle rect : rectangles) { + if (!rect.contains(u, v)) continue; + disabledUVs.add(packed); + return true; + } + enabledUVs.add(packed); + return false; + } + + public static final class Adapter extends TypeAdapter { + @Override + public void write(JsonWriter out, DisableConfig value) throws IOException { + out.beginObject(); + out.name("name").value(value.name()); + out.name("textureId").value(value.textureId()); + out.name("disableAll").value(value.disableAll()); + out.name("rectangles"); + out.beginArray(); + for (UVRectangle rect : value.rectangles()) { + out.beginObject(); + out.name("uMin").value(rect.uMin()); + out.name("vMin").value(rect.vMin()); + out.name("uMax").value(rect.uMax()); + out.name("vMax").value(rect.vMax()); + out.endObject(); + } + out.endArray(); + out.endObject(); + } + + @Override + public DisableConfig read(JsonReader in) throws IOException { + in.beginObject(); + in.nextName(); + String name = in.nextString(); + in.nextName(); + String textureId = in.nextString(); + in.nextName(); + boolean disableAll = in.nextBoolean(); + in.nextName(); + in.beginArray(); + ArrayList rectangles = new ArrayList<>(); + while (in.hasNext()) { + in.beginObject(); + in.nextName(); + float uMin = (float) in.nextDouble(); + in.nextName(); + float vMin = (float) in.nextDouble(); + in.nextName(); + float uMax = (float) in.nextDouble(); + in.nextName(); + float vMax = (float) in.nextDouble(); + in.endObject(); + rectangles.add(new UVRectangle(uMin, vMin, uMax, vMax)); + } + in.endArray(); + in.endObject(); + return new DisableConfig(name, textureId, disableAll, rectangles.toArray(UVRectangle[]::new)); + } + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index c7be2871..1b92df36 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -20,46 +20,12 @@ public final class ModConfig { public Classic classic = new Classic(); public Binding binding = new Binding(); - public void set(ModConfig modConfig) { - enabled = modConfig.enabled; - isClassic = modConfig.isClassic; - dynamicCrosshair = modConfig.dynamicCrosshair; - renderModel = modConfig.renderModel; - adjustStep = modConfig.adjustStep; - classic = modConfig.classic; - binding = modConfig.binding; - } - public void clamp() { adjustStep = Mth.clamp(adjustStep, 0.0, MAX_OFFSET_D); classic.clamp(); binding.clamp(); } - public boolean enabled() { - return enabled; - } - - public void setEnabled(boolean value) { - enabled = value; - } - - public boolean isClassic() { - return isClassic; - } - - public void setClassic(boolean value) { - isClassic = value; - } - - public boolean dynamicCrosshair() { - return dynamicCrosshair; - } - - public boolean renderModel() { - return renderModel; - } - public void cycleAdjustMode() { if (isClassic) classic.adjustMode = classic.adjustMode.cycle(); else binding.adjustOffset = !binding.adjustOffset; @@ -75,8 +41,9 @@ public void adjustOffsetX(int count) { classic.clamp(); } else { BindTarget target = RealCameraCore.currentTarget(); - if (binding.adjustOffset) target.offsets().setX(target.offsets().getX() + count * (float) adjustStep); - else target.offsets().setRoll(target.offsets().getRoll() + count * 100 * (float) adjustStep); + if (binding.adjustOffset) target.offsets().x += count * (float) adjustStep; + else target.offsets().roll += count * 100 * (float) adjustStep; + target.offsets().clamp(); } } @@ -90,8 +57,9 @@ public void adjustOffsetY(int count) { classic.clamp(); } else { BindTarget target = RealCameraCore.currentTarget(); - if (binding.adjustOffset) target.offsets().setY(target.offsets().getY() + count * (float) adjustStep); - else target.offsets().setYaw(target.offsets().getYaw() + count * 100 * (float) adjustStep); + if (binding.adjustOffset) target.offsets().y += count * (float) adjustStep; + else target.offsets().yaw += count * 100 * (float) adjustStep; + target.offsets().clamp(); } } @@ -105,24 +73,12 @@ public void adjustOffsetZ(int count) { classic.clamp(); } else { BindTarget target = RealCameraCore.currentTarget(); - if (binding.adjustOffset) target.offsets().setZ(target.offsets().getZ() + count * (float) adjustStep); - else target.offsets().setPitch(target.offsets().getPitch() + count * 100 * (float) adjustStep); + if (binding.adjustOffset) target.offsets().z += count * (float) adjustStep; + else target.offsets().pitch += count * 100 * (float) adjustStep; + target.offsets().clamp(); } } - // classic - public boolean classicDisableWhenSneaking() { - return classic.disableWhenSneaking; - } - - public boolean classicDisableWhenSwimming() { - return classic.disableWhenSwimming; - } - - public int getClassicOutTick() { - return classic.outTick; - } - public double getClassicX() { return classic.cameraX * classic.scale; } @@ -159,70 +115,7 @@ public float getClassicRoll() { return classic.roll; } - // binding - public InputConstants.Key getScreenModifierKey() { - return InputConstants.getKey(binding.screenModifierKey); - } - - public boolean legacyBindingMode() { - return binding.legacyBindingMode; - } - - public boolean renderStuckObjects() { - return binding.renderStuckObjects; - } - - public boolean hideBindingFailureMessage() { - return binding.hideFailureMessage; - } - - public boolean bindingDisableWhenCrawling() { - return binding.disableWhenCrawling; - } - - public boolean bindingDisableWhenSneaking() { - return binding.disableWhenSneaking; - } - - public boolean bindingDisableWhenSwimming() { - return binding.disableWhenSwimming; - } - - public int getBindingOutTick() { - return binding.outTick; - } - - public int getBindResultRetentionFrames() { - return binding.bindResultRetentionFrames; - } - - public double getDisplacementSmoothFactor() { - return binding.displacementSmoothFactor; - } - - public double getRotationSmoothFactor() { - return binding.rotationSmoothFactor; - } - - public List getDisableMainFeatureItems() { - return binding.disableMainFeatureItems; - } - - public List getDisableRenderItems() { - return binding.disableRenderItems; - } - - public List getFixedTargetList() { - return binding.fixedTargetList; - } - - public List getBindTargetList() { - binding.clamp(); - return binding.targetList; - } - public List getBindTargetList(String textureId) { - binding.clamp(); int activeConfigIndex = binding.activeConfigIndex; List matchedTargets = binding.targetList.stream().filter(target -> textureId.contains(target.textureId())).toList(); if (activeConfigIndex <= 0 || matchedTargets.isEmpty()) return matchedTargets; @@ -291,7 +184,7 @@ public AdjustMode cycle() { public static class Binding { protected static final List defaultDisableRenderItems = List.of("minecraft:filled_map"); public String screenModifierKey = InputConstants.Type.KEYSYM.getOrCreate(InputConstants.KEY_LALT).getName(); - public boolean legacyBindingMode = false; + public boolean legacyMode = false; public boolean adjustOffset = true; public boolean hideFailureMessage = false; public boolean renderStuckObjects = true; diff --git a/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java b/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java new file mode 100644 index 00000000..ea9cce32 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java @@ -0,0 +1,45 @@ +package com.xtracr.realcamera.config; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.util.Mth; + +public final class OffsetConfig { + public float scale = 1; + public float x, y, z, pitch, yaw, roll; + + public OffsetConfig() { + } + + public OffsetConfig(float scale, float x, float y, float z, float pitch, float yaw, float roll) { + this.scale = scale; + this.x = x; + this.y = y; + this.z = z; + this.pitch = pitch; + this.yaw = yaw; + this.roll = roll; + } + + public static OffsetConfig read(FriendlyByteBuf byteBuf) { + return new OffsetConfig(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); + } + + public void clamp() { + x = Mth.clamp(x, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); + y = Mth.clamp(y, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); + z = Mth.clamp(z, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); + pitch = Mth.wrapDegrees(pitch); + yaw = Mth.wrapDegrees(yaw); + roll = Mth.wrapDegrees(roll); + } + + public void write(FriendlyByteBuf byteBuf) { + byteBuf.writeFloat(scale); + byteBuf.writeFloat(x); + byteBuf.writeFloat(y); + byteBuf.writeFloat(z); + byteBuf.writeFloat(pitch); + byteBuf.writeFloat(yaw); + byteBuf.writeFloat(roll); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java b/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java new file mode 100644 index 00000000..1a0708a4 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java @@ -0,0 +1,20 @@ +package com.xtracr.realcamera.config; + +import net.minecraft.network.FriendlyByteBuf; + +public record UVRectangle(float uMin, float vMin, float uMax, float vMax) { + public static UVRectangle read(FriendlyByteBuf byteBuf) { + return new UVRectangle(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); + } + + public boolean contains(float u, float v) { + return u >= uMin && u <= uMax && v >= vMin && v <= vMax; + } + + public void write(FriendlyByteBuf byteBuf) { + byteBuf.writeFloat(uMin); + byteBuf.writeFloat(vMin); + byteBuf.writeFloat(uMax); + byteBuf.writeFloat(vMax); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index 606922f7..61651d97 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.VertexFormat; import com.xtracr.realcamera.api.BindResult; import com.xtracr.realcamera.config.BindTarget; -import com.xtracr.realcamera.config.BindTarget.DisableConfig; import com.xtracr.realcamera.config.BindTarget.TargetConfig; +import com.xtracr.realcamera.config.DisableConfig; import com.xtracr.realcamera.renderer.BuiltIterableBuffer; import com.xtracr.realcamera.renderer.MultiVertexCatcher; import com.xtracr.realcamera.renderer.state.BuiltModelRecord; diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index bda127fe..667c5e55 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -6,11 +6,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.compat.CompatibilityHelper; -import com.xtracr.realcamera.config.BindTarget; -import com.xtracr.realcamera.config.BindTarget.*; -import com.xtracr.realcamera.config.ConfigFile; -import com.xtracr.realcamera.config.ConfigScreen; -import com.xtracr.realcamera.config.ModConfig; +import com.xtracr.realcamera.config.*; +import com.xtracr.realcamera.config.BindTarget.BindConfig; +import com.xtracr.realcamera.config.BindTarget.TargetConfig; import com.xtracr.realcamera.gui.components.CycleIconButton; import com.xtracr.realcamera.gui.components.DoubleSlider; import com.xtracr.realcamera.gui.components.NumberField; @@ -54,7 +52,7 @@ public final class ModelViewScreen extends Screen { private final int xSize = 450, ySize = 206, middleWidth = xSize - 200, widgetWidth = (xSize - middleWidth) / 4 - 8, widgetHeight = 18; private int x, y, page = 0; - private InputConstants.Key modifierKey = ConfigFile.config().getScreenModifierKey(); + private InputConstants.Key modifierKey = InputConstants.getKey(ConfigFile.config().binding.screenModifierKey); private boolean initialized; private int modelScale = 80, textureScale = 80, layers = 0, selectionRadius = 10; private double modelX, modelY, textureX, textureY, clickedX = -1, clickedY = -1; @@ -146,7 +144,7 @@ protected void init() { super.init(); x = (width - xSize) / 2; y = (height - ySize) / 2; - modifierKey = ConfigFile.config().getScreenModifierKey(); + modifierKey = InputConstants.getKey(ConfigFile.config().binding.screenModifierKey); initWidgets(page); if (!initialized) loadBindTarget(RealCameraCore.currentTarget()); initialized = true; @@ -378,8 +376,8 @@ private void initRightWidgets() { } } else { widgetsPerPage = 8; - List fixedTargetList = ConfigFile.config().getFixedTargetList().stream().filter(target -> target.name().equals(RealCameraCore.currentTarget().name())).toList(); - List targetList = ConfigFile.config().getBindTargetList(); + List fixedTargetList = ConfigFile.config().binding.fixedTargetList.stream().filter(target -> target.name().equals(RealCameraCore.currentTarget().name())).toList(); + List targetList = ConfigFile.config().binding.targetList; final int fixedTargetCount = fixedTargetList.size(); size = fixedTargetCount + targetList.size(); for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { @@ -457,7 +455,7 @@ public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX ModelAnalyser analyser = new ModelAnalyser(); BindTarget target = genBindTarget(); - target.offsets().setScale(target.offsets().getScale() * modelScale); + target.offsets().scale *= modelScale; String textureId = toggleCategoryButton.getValue() == Category.DISABLE ? disabledIdField.getValue() : ""; Set hiddenNames = hiddenNameMap.getOrDefault(nameField.getValue(), Set.of()); List modelRecords = captureRotatedEntity(analyser, target, minecraft.player); @@ -621,19 +619,19 @@ private void loadBindTarget(BindTarget target) { bindYButton.setValue(target.bindConfig().bindY() ? 0 : 1); bindZButton.setValue(target.bindConfig().bindZ() ? 0 : 1); bindRotButton.setValue(target.bindConfig().bindRotation() ? 0 : 1); - scaleField.setNumber(target.offsets().getScale()); - offsetXSlider.setDouble(target.offsets().getX()); - offsetXField.setNumber(target.offsets().getX()); - offsetYSlider.setDouble(target.offsets().getY()); - offsetYField.setNumber(target.offsets().getY()); - offsetZSlider.setDouble(target.offsets().getZ()); - offsetZField.setNumber(target.offsets().getZ()); - offsetPitchSlider.setDouble(target.offsets().getPitch()); - offsetPitchField.setNumber(target.offsets().getPitch()); - offsetYawSlider.setDouble(target.offsets().getYaw()); - offsetYawField.setNumber(target.offsets().getYaw()); - offsetRollSlider.setDouble(target.offsets().getRoll()); - offsetRollField.setNumber(target.offsets().getRoll()); + scaleField.setNumber(target.offsets().scale); + offsetXSlider.setDouble(target.offsets().x); + offsetXField.setNumber(target.offsets().x); + offsetYSlider.setDouble(target.offsets().y); + offsetYField.setNumber(target.offsets().y); + offsetZSlider.setDouble(target.offsets().z); + offsetZField.setNumber(target.offsets().z); + offsetPitchSlider.setDouble(target.offsets().pitch); + offsetPitchField.setNumber(target.offsets().pitch); + offsetYawSlider.setDouble(target.offsets().yaw); + offsetYawField.setNumber(target.offsets().yaw); + offsetRollSlider.setDouble(target.offsets().roll); + offsetRollField.setNumber(target.offsets().roll); disableConfigs.clear(); disableConfigs.addAll(List.of(target.disableConfigs())); } @@ -641,14 +639,15 @@ private void loadBindTarget(BindTarget target) { private BindTarget genBindTarget() { TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); - OffsetConfig offsets = new OffsetConfig() - .setScale(scaleField.getNumber()) - .setX(toggleSliderButton.getValue() == 0 ? (float) offsetXSlider.getDouble() : offsetXField.getNumber()) - .setY(toggleSliderButton.getValue() == 0 ? (float) offsetYSlider.getDouble() : offsetYField.getNumber()) - .setZ(toggleSliderButton.getValue() == 0 ? (float) offsetZSlider.getDouble() : offsetZField.getNumber()) - .setPitch(toggleSliderButton.getValue() == 0 ? (float) offsetPitchSlider.getDouble() : offsetPitchField.getNumber()) - .setYaw(toggleSliderButton.getValue() == 0 ? (float) offsetYawSlider.getDouble() : offsetYawField.getNumber()) - .setRoll(toggleSliderButton.getValue() == 0 ? (float) offsetRollSlider.getDouble() : offsetRollField.getNumber()); + OffsetConfig offsets = new OffsetConfig( + scaleField.getNumber(), + toggleSliderButton.getValue() == 0 ? (float) offsetXSlider.getDouble() : offsetXField.getNumber(), + toggleSliderButton.getValue() == 0 ? (float) offsetYSlider.getDouble() : offsetYField.getNumber(), + toggleSliderButton.getValue() == 0 ? (float) offsetZSlider.getDouble() : offsetZField.getNumber(), + toggleSliderButton.getValue() == 0 ? (float) offsetPitchSlider.getDouble() : offsetPitchField.getNumber(), + toggleSliderButton.getValue() == 0 ? (float) offsetYawSlider.getDouble() : offsetYawField.getNumber(), + toggleSliderButton.getValue() == 0 ? (float) offsetRollSlider.getDouble() : offsetRollField.getNumber() + ); DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toArray(UVRectangle[]::new)); DisableConfig[] disableConfigArray = disableConfigs.toArray(new DisableConfig[0]); for (int i = 0; i < disableConfigArray.length; i++) { diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java index dae4e34b..e9d20c15 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java @@ -61,7 +61,7 @@ public abstract class MixinCamera { if (!RealCameraCore.isActive()) return; ModConfig config = ConfigFile.config(); Vec3 startVec = position; - if (config.isClassic()) { + if (config.isClassic) { double scale = entity instanceof LivingEntity livingEntity ? livingEntity.getScale() : 1; Vec3 offset = new Vec3(config.getClassicX(), config.getClassicY(), -config.getClassicZ()).scale(scale); Vec3 center = new Vec3(config.getCenterX(), config.getCenterY(), -config.getCenterZ()).scale(scale); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java index feafd99b..897705e6 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java @@ -28,7 +28,7 @@ public abstract class MixinGameRenderer { float partialTicks = deltaTracker.getGameTimeDeltaPartialTick(true); CompatibilityHelper.NEA_setDeltaTick(partialTicks); RealCameraCore.initialize(minecraft, renderLevel); - if (RealCameraCore.isActive() && !ConfigFile.config().isClassic()) { + if (RealCameraCore.isActive() && !ConfigFile.config().isClassic) { minecraft.getEntityRenderDispatcher().prepare(mainCamera, minecraft.crosshairPickEntity); RealCameraCore.computeCamera(minecraft, partialTicks); } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java index d5a25a84..5f1ccacd 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGui.java @@ -15,7 +15,7 @@ public abstract class MixinGui { @Inject(method = "extractCrosshair", at = @At("HEAD")) private void realcamera$atRenderCrosshairHEAD(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { - if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + if (ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { graphics.pose().pushMatrix(); CrosshairUtil.translateMatrices(graphics.pose()); } @@ -23,7 +23,7 @@ public abstract class MixinGui { @Inject(method = "extractCrosshair", at = @At("RETURN")) private void realcamera$atRenderCrosshairRETURN(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { - if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + if (ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { graphics.pose().popMatrix(); } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java index 2d99dcb1..1ae0dbd8 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java @@ -19,7 +19,7 @@ public abstract class MixinItem { @Inject(method = "getPlayerPOVHitResult", at = @At("HEAD"), cancellable = true) private static void realcamera$coverHitResult(Level level, Player player, ClipContext.Fluid fluid, CallbackInfoReturnable cir) { - if (!ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + if (!ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { double interactionRange = player.blockInteractionRange(); Pair fromAndTo = RaycastUtil.getFromAndTo(player, interactionRange * interactionRange, 1.0f); cir.setReturnValue(level.clip(new ClipContext(fromAndTo.getFirst(), fromAndTo.getSecond(), ClipContext.Block.OUTLINE, fluid, player))); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java index c293afb3..7defc800 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLevelRenderer.java @@ -38,7 +38,7 @@ public abstract class MixinLevelRenderer { @Inject(method = "renderLevel", at = @At("HEAD")) private void realcamera$atRenderLevelHead(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { - if (ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + if (ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { CrosshairUtil.update(minecraft, cameraState.pos, modelViewMatrix, cameraState.projectionMatrix); } } @@ -50,7 +50,7 @@ public abstract class MixinLevelRenderer { TickRateManager tickManager = minecraft.level.tickRateManager(); float partialTicks = minecraft.getDeltaTracker().getGameTimeDeltaPartialTick(!tickManager.isEntityFrozen(entity)); CameraRenderState cameraState = levelRenderState.cameraRenderState; - if (!ConfigFile.config().isClassic()) + if (!ConfigFile.config().isClassic) RealCameraCore.renderCameraEntity(minecraft, partialTicks, output, cameraState.viewRotationMatrix); else { Vec3 cameraPos = cameraState.pos; diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java index 307d0788..1e69cefa 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java @@ -37,7 +37,7 @@ public MixinLocalPlayer(ClientLevel world, GameProfile profile) { @WrapOperation(method = "pick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ProjectileUtil;getEntityHitResult(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;D)Lnet/minecraft/world/phys/EntityHitResult;")) private static @Nullable EntityHitResult realcamera$wrapGetEntityHitResult(Entity except, Vec3 from, Vec3 to, AABB box, Predicate matching, double maxValue, Operation original, Entity cameraEntity, double blockInteractionRange, double entityInteractionRange, float partialTicks) { - if (!ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + if (!ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { double interactionRange = Math.max(blockInteractionRange, entityInteractionRange); Pair fromAndTo = RaycastUtil.getFromAndTo(cameraEntity, interactionRange * interactionRange, partialTicks); Vec3 newFrom = fromAndTo.getFirst(); @@ -58,7 +58,7 @@ public MixinLocalPlayer(ClientLevel world, GameProfile profile) { @Override public @NonNull HitResult pick(double maxDistance, float partialTicks, boolean includeFluids) { - if (!ConfigFile.config().dynamicCrosshair() && RealCameraCore.isActive()) { + if (!ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { Pair fromAndTo = RaycastUtil.getFromAndTo(this, maxDistance * maxDistance, partialTicks); return level().clip(new ClipContext(fromAndTo.getFirst(), fromAndTo.getSecond(), ClipContext.Block.OUTLINE, includeFluids ? ClipContext.Fluid.ANY : ClipContext.Fluid.NONE, this)); } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java index c0cba4bd..fcbaea64 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinStuckInBodyLayer.java @@ -16,7 +16,7 @@ public abstract class MixinStuckInBodyLayer { @Inject(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/AvatarRenderState;FF)V", at = @At("HEAD"), cancellable = true) private void realcamera$cancelRender(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, AvatarRenderState state, float yRot, float xRot, CallbackInfo ci) { - if (RealCameraCore.isRendering() && state.id == Minecraft.getInstance().getCameraEntity().getId() && !ConfigFile.config().isClassic() && !ConfigFile.config().renderStuckObjects()) { + if (RealCameraCore.isRendering() && state.id == Minecraft.getInstance().getCameraEntity().getId() && !ConfigFile.config().isClassic && !ConfigFile.config().binding.renderStuckObjects) { ci.cancel(); } } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index a2f817a7..2f307a72 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -21,7 +21,7 @@ public static BuiltIterableBuffer buildFrom(RenderType renderType, MeshData mesh for (int i = 0; i < uvsLength; i++) { if (uvs[i] == null) continue; int primitiveIndex = cache.getInt(uvs[i]); - if (primitiveIndex == -1) continue; + if (primitiveIndex == -1 || primitiveIndex >= vertexBuffer.primitiveCount) continue; VertexData[] primitive = vertexBuffer.readPrimitiveAt(primitiveIndex); if (!VertexData.containsUV(primitive, uvs[i].u(), uvs[i].v())) continue; primitives[i] = primitive; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java index ddcfa043..8ade0765 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java @@ -20,9 +20,10 @@ public final class IterableVertexBuffer implements Iterable { private static final boolean IS_LITTLE_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN; private static final float NORMAL_SCALE = 1.0f / 127.0f; - public final int vertexSize, vertexCount, primitiveLength, primitiveStride, primitiveCount; + public final int vertexCount, primitiveCount; private final Iterable primitives; private final ByteBuffer buffer; + private final int vertexSize, primitiveLength, primitiveStride; private final int positionOffset, colorOffset, uvOffset, overlayOffset, lightOffset, normalOffset; private final boolean hasPosition, hasColor, hasUV, hasOverlay, hasLight, hasNormal, fullFormat; private final boolean startWithFirst; From aa91a985965f46c043ddfc2222821943b76fbf61 Mon Sep 17 00:00:00 2001 From: xTracr Date: Thu, 14 May 2026 14:19:39 +0800 Subject: [PATCH 19/34] Create NumberWidgetPair and optimize polyhedron vertex lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- Replace O(n²) haveCommonVertex with LongOpenHashSet quantized-key lookup for -- polyhedron expansion. Extract MutableVertex from VertexData inner class. -- Create NumberWidgetPair combining DoubleSlider and NumberField for offset -- controls. Replace varargs MathUtil.floor/ceil with fixed arity overloads. -- Rename DoubleSlider getDouble/setDouble to getNumber/setNumber. --- .../xtracr/realcamera/gui/ModelAnalyser.java | 45 ++-- .../realcamera/gui/ModelViewScreen.java | 232 +++++++----------- .../gui/components/CycleIconButton.java | 4 +- .../gui/components/DoubleSlider.java | 6 +- .../gui/components/NumberField.java | 32 +-- .../gui/components/NumberWidgetPair.java | 133 ++++++++++ .../renderer/IterableVertexBuffer.java | 2 +- .../renderer/state/MutableVertex.java | 67 +++++ .../realcamera/renderer/state/VertexData.java | 66 ----- .../com/xtracr/realcamera/util/MathUtil.java | 26 +- 10 files changed, 352 insertions(+), 261 deletions(-) create mode 100644 common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java create mode 100644 common/src/main/java/com/xtracr/realcamera/renderer/state/MutableVertex.java diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index 61651d97..d4339b85 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -12,6 +12,7 @@ import com.xtracr.realcamera.renderer.MultiVertexCatcher; import com.xtracr.realcamera.renderer.state.BuiltModelRecord; import com.xtracr.realcamera.renderer.state.VertexData; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; @@ -34,12 +35,11 @@ public final class ModelAnalyser { private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); private static final Set UNFOCUSABLE_RENDER_TYPES = ImmutableSet.of(RenderTypes.armorEntityGlint(), RenderTypes.glintTranslucent(), RenderTypes.glint(), RenderTypes.entityGlint()); private static final int planeArgb = 0x6F3333CC, forwardArgb = 0xFF00CC00, upwardArgb = 0xFFCC0000, leftArgb = 0xFF0000CC, focusedArgb = 0x4FFFFFFF; - private static final int z1 = 210, z2 = z1 + 10; - private final List focusedPolyhedron = new ArrayList<>(); + private final List focusedPolyhedron = new ArrayList<>(); private static final int z1 = 210, z2 = z1 + 10; private VertexData[][] targetPrimitives = new VertexData[3][]; private BindResult bindResult = BindResult.EMPTY; @Nullable - private BuiltModelRecord focusedRecord, currentRecord; + private BuiltModelRecord focusedRecord; public static void applyDisableConfigs(List modelRecords, BindTarget target, String textureId, Set hiddenNames) { for (int i = 0; i < modelRecords.size(); i++) { @@ -67,14 +67,11 @@ public static void applyDisableConfigs(List modelRecords, Bind } } - private static boolean haveCommonVertex(VertexData[] p1, List primitives) { - final float precision = 1e-5f; - for (VertexData[] p2 : primitives) - for (VertexData v1 : p1) - for (VertexData v2 : p2) - if (Math.abs(v1.x() - v2.x()) < precision && Math.abs(v1.y() - v2.y()) < precision && Math.abs(v1.z() - v2.z()) < precision) - return true; - return false; + private static long quantizedKey(VertexData vertex) { + int x = Math.round(vertex.x() * 1e5f); + int y = Math.round(vertex.y() * 1e5f); + int z = Math.round(vertex.z() * 1e5f); + return ((long) x & 0x1FFFFF) | (((long) y & 0x1FFFFF) << 21) | (((long) z & 0x1FFFFF) << 42); } public VertexData[][] getFocusedPolyhedron() { @@ -136,7 +133,7 @@ public void computeFocusedOnModel(List modelRecords, int minX, } } if (sortByZ.isEmpty()) return; - sortByZ.sort(Comparator.comparingDouble((ZEntry entry) -> -entry.z())); + sortByZ.sort(Comparator.comparingDouble(ZEntry::z).reversed()); focusedRecord = sortByZ.getFirst().record(); while (!sortByZ.isEmpty()) { VertexData[] first = sortByZ.getFirst().primitive(); @@ -168,19 +165,22 @@ public void computeFocusedPolyhedron() { } } if (focusedIndex == -1) return; - List polyhedron = new ArrayList<>(); - polyhedron.add(focused); + LongOpenHashSet vertexSet = new LongOpenHashSet(); + for (VertexData vertex : focused) vertexSet.add(quantizedKey(vertex)); boolean[] visited = new boolean[primitives.length]; visited[focusedIndex] = true; boolean added; do { added = false; for (int i = 0; i < primitives.length; i++) { - VertexData[] primitive = primitives[i]; - if (visited[i] | !haveCommonVertex(primitive, polyhedron)) continue; - polyhedron.add(primitive); - visited[i] = true; - added = true; + if (visited[i]) continue; + for (VertexData vertex : primitives[i]) { + if (!vertexSet.contains(quantizedKey(vertex))) continue; + visited[i] = true; + for (VertexData vertex2 : primitives[i]) vertexSet.add(quantizedKey(vertex2)); + added = true; + break; + } } } while (added); for (int i = focusedIndex + 1; i < primitives.length && visited[i]; i++) @@ -258,7 +258,7 @@ private void computeRecord(BuiltIterableBuffer builtBuffer, List priorityField, focusedRectWidgetNumberField; private NumberField forwardUField, forwardVField, upwardUField, upwardVField, posUField, posVField; private NumberField uMinField, vMinField, uMaxField, vMaxField; - private NumberField offsetXField, offsetYField, offsetZField, offsetPitchField, offsetYawField, offsetRollField, scaleField, depthField; + private NumberField scaleField, depthField; private final List disableConfigs = new ArrayList<>(); private final List rectWidgets = new ArrayList<>(); private final Map> hiddenNameMap = new HashMap<>(); @@ -79,52 +83,39 @@ public final class ModelViewScreen extends Screen { private final CycleIconButton bindYButton = new CycleIconButton(16, 16, 0, 2); private final CycleIconButton bindZButton = new CycleIconButton(16, 16, 1, 2); private final CycleIconButton bindRotButton = new CycleIconButton(16, 16, 1, 2); - private final DoubleSlider entityPitchSlider = createSlider("pitch", widgetWidth * 2 + 4, -90.0, 90.0); - private final DoubleSlider entityYawSlider = createSlider("yaw", widgetWidth * 2 + 4, -60.0, 60.0); - private final DoubleSlider offsetXSlider = createSlider("offsetX", widgetWidth * 2 - 18, ModConfig.MIN_OFFSET_D, ModConfig.MAX_OFFSET_D); - private final DoubleSlider offsetYSlider = createSlider("offsetY", widgetWidth * 2 - 18, ModConfig.MIN_OFFSET_D, ModConfig.MAX_OFFSET_D); - private final DoubleSlider offsetZSlider = createSlider("offsetZ", widgetWidth * 2 - 18, ModConfig.MIN_OFFSET_D, ModConfig.MAX_OFFSET_D); - private final DoubleSlider offsetPitchSlider = createSlider("pitch", widgetWidth * 2 - 18, -180.0, 180.0); - private final DoubleSlider offsetYawSlider = createSlider("yaw", widgetWidth * 2 - 18, -180.0, 180.0); - private final DoubleSlider offsetRollSlider = createSlider("roll", widgetWidth * 2 - 18, -180.0, 180.0); + private final DoubleSlider entityPitchSlider = createSlider("pitch", wideWidgetWidth, -90.0, 90.0); + private final DoubleSlider entityYawSlider = createSlider("yaw", wideWidgetWidth, -60.0, 60.0); + private final NumberWidgetPair offsetXPair = new NumberWidgetPair(font, "offsetX", compactWidgetWidth, widgetHeight, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); + private final NumberWidgetPair offsetYPair = new NumberWidgetPair(font, "offsetY", compactWidgetWidth, widgetHeight, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); + private final NumberWidgetPair offsetZPair = new NumberWidgetPair(font, "offsetZ", compactWidgetWidth, widgetHeight, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); + private final NumberWidgetPair offsetPitchPair = new NumberWidgetPair(font, "pitch", compactWidgetWidth, widgetHeight, -180.0f, 180.0f); + private final NumberWidgetPair offsetYawPair = new NumberWidgetPair(font, "yaw", compactWidgetWidth, widgetHeight, -180.0f, 180.0f); + private final NumberWidgetPair offsetRollPair = new NumberWidgetPair(font, "roll", compactWidgetWidth, widgetHeight, -180.0f, 180.0f); + private final List widgetPairs = List.of(offsetXPair, offsetYPair, offsetZPair, offsetPitchPair, offsetYawPair, offsetRollPair); private final CycleButton selectingButton = createCyclingButtonBuilder(ImmutableSortedMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("forwardVector").withStyle(ChatFormatting.GREEN), 1, LocUtil.MODEL_VIEW_WIDGET("upwardVector").withStyle(ChatFormatting.RED), 2, LocUtil.MODEL_VIEW_WIDGET("position").withStyle(ChatFormatting.BLUE)), 0) .withTooltip(_ -> createTooltip("selecting", modifierKey.getDisplayName(), modifierKey.getDisplayName())) - .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selecting")); + .create(0, 0, wideWidgetWidth, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selecting")); private final CycleButton disableModeButton = createCyclingButtonBuilder(ImmutableMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("all").withStyle(ChatFormatting.GREEN), 1, LocUtil.MODEL_VIEW_WIDGET("part").withStyle(ChatFormatting.BLUE)), 0) .withTooltip(_ -> createTooltip("disableMode", modifierKey.getDisplayName())) - .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("disableMode")); + .create(0, 0, wideWidgetWidth, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("disableMode")); private final CycleButton selectionModeButton = createCyclingButtonBuilder(ImmutableSortedMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("single"), 1, LocUtil.MODEL_VIEW_WIDGET("multiple"), 2, LocUtil.MODEL_VIEW_WIDGET("range").withStyle(ChatFormatting.BLUE)), 0) .withTooltip(_ -> createTooltip("selectionMode", modifierKey.getDisplayName(), modifierKey.getDisplayName())) - .create(0, 0, widgetWidth * 2 + 4, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selectionMode")); + .create(0, 0, wideWidgetWidth, widgetHeight, LocUtil.MODEL_VIEW_WIDGET("selectionMode")); private final CycleButton toggleSliderButton = createCyclingButtonBuilder(ImmutableMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("toggleSliderToField"), 1, LocUtil.MODEL_VIEW_WIDGET("toggleFieldToSlider")), 0) - .withTooltip(_ -> createTooltip("toggleSlider")) .displayOnlyValue() - .create(0, 0, widgetWidth * 2 + 4, widgetHeight, CommonComponents.EMPTY, (_, i) -> { - if (i == 1) { - offsetXField.setNumber((float) offsetXSlider.getDouble()); - offsetYField.setNumber((float) offsetYSlider.getDouble()); - offsetZField.setNumber((float) offsetZSlider.getDouble()); - offsetPitchField.setNumber((float) offsetPitchSlider.getDouble()); - offsetYawField.setNumber((float) offsetYawSlider.getDouble()); - offsetRollField.setNumber((float) offsetRollSlider.getDouble()); - } else { - offsetXSlider.setDouble(offsetXField.getNumber()); - offsetYSlider.setDouble(offsetYField.getNumber()); - offsetZSlider.setDouble(offsetZField.getNumber()); - offsetPitchSlider.setDouble(offsetPitchField.getNumber()); - offsetYawSlider.setDouble(offsetYawField.getNumber()); - offsetRollSlider.setDouble(offsetRollField.getNumber()); - } + .create(0, 0, wideWidgetWidth, widgetHeight, CommonComponents.EMPTY, (_, i) -> { + boolean useSlider = i == 0; + for (NumberWidgetPair pair : widgetPairs) pair.syncAndSwitch(useSlider); initWidgets(page); }); private final CycleButton toggleCategoryButton = createCyclingButtonBuilder(ImmutableSortedMap.of( @@ -133,7 +124,7 @@ public final class ModelViewScreen extends Screen { Category.DISABLE, LocUtil.MODEL_VIEW_WIDGET(Category.DISABLE.next().id)), Category.CONFIGS) .withTooltip(category -> createTooltip(category.next().id)) .displayOnlyValue() - .create(0, 0, widgetWidth * 2 - 18, widgetHeight, CommonComponents.EMPTY, (_, _) -> initWidgets(0)); + .create(0, 0, compactWidgetWidth, widgetHeight, CommonComponents.EMPTY, (_, _) -> initWidgets(0)); public ModelViewScreen() { super(LocUtil.MODEL_VIEW_TITLE()); @@ -168,9 +159,9 @@ private void initWidgets(int page) { addRenderableWidget(showTextureButton).setPosition(x + (xSize - middleWidth) / 2 + 4, y + 4); addRenderableWidget(pauseButton).setPosition(x + (xSize + middleWidth) / 2 - 38, y + 4); addRenderableWidget(new SimpleIconButton(x + (xSize + middleWidth) / 2 - 20, y + 4, 16, 16, 0, 0, _ -> { - modelScale = textureScale = 80; - entityYawSlider.setDouble(0); - entityPitchSlider.setDouble(0); + modelScale = textureScale = DEFAULT_SCALE; + entityYawSlider.setNumber(0); + entityPitchSlider.setNumber(0); modelX = modelY = textureX = textureY = 0; xRot = yRot = 0; layers = 0; @@ -186,19 +177,13 @@ private void initLeftWidgets() { upwardVField = createFloatField(widgetWidth, 0, upwardVField); posUField = createFloatField(widgetWidth, 0, posUField); posVField = createFloatField(widgetWidth, 0, posVField); - textureIdField = createTextField(widgetWidth * 2 + 4, 1024, textureIdField); - disabledIdField = createTextField(widgetWidth * 2 + 4, 1024, disabledIdField); + textureIdField = createTextField(wideWidgetWidth, 1024, textureIdField); + disabledIdField = createTextField(wideWidgetWidth, 1024, disabledIdField); focusedRectWidgetNumberField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, focusedRectWidgetNumberField).setMin(0).setMax(rectWidgets.size()); uMinField = createFloatField(widgetWidth * 2 - 24, 0, uMinField).setMin(-1f).setMax(2f); uMaxField = createFloatField(widgetWidth * 2 - 24, 0, uMaxField).setMin(-1f).setMax(2f); vMinField = createFloatField(widgetWidth * 2 - 24, 0, vMinField).setMin(-1f).setMax(2f); vMaxField = createFloatField(widgetWidth * 2 - 24, 0, vMaxField).setMin(-1f).setMax(2f); - offsetXField = createFloatField(widgetWidth * 2 - 20, 0, offsetXField).setMin(ModConfig.MIN_OFFSET_F).setMax(ModConfig.MAX_OFFSET_F); - offsetYField = createFloatField(widgetWidth * 2 - 20, 0, offsetYField).setMin(ModConfig.MIN_OFFSET_F).setMax(ModConfig.MAX_OFFSET_F); - offsetZField = createFloatField(widgetWidth * 2 - 20, 0, offsetZField).setMin(ModConfig.MIN_OFFSET_F).setMax(ModConfig.MAX_OFFSET_F); - offsetPitchField = createFloatField(widgetWidth * 2 - 20, 0, offsetPitchField).setMin(-180.0f).setMax(180.0f); - offsetYawField = createFloatField(widgetWidth * 2 - 20, 0, offsetYawField).setMin(-180.0f).setMax(180.0f); - offsetRollField = createFloatField(widgetWidth * 2 - 20, 0, offsetRollField).setMin(-180.0f).setMax(180.0f); scaleField = createFloatField(widgetWidth, 1.0f, scaleField).setMax(64.0f); depthField = createFloatField(widgetWidth, 0.2f, depthField).setMax(16.0f); GridLayout grid = new GridLayout(); @@ -221,40 +206,19 @@ private void initLeftWidgets() { rows.addChild(textureIdField, 2, smallSettings).setTooltip(createTooltip("textureId")); } case PREVIEW -> { - boolean useSliderOffset = toggleSliderButton.getValue() == 0; rows.addChild(toggleSliderButton, 2); - LayoutSettings sliderSettings = grid.newCellSettings().padding(-20, 2, 0, 0); - LayoutSettings fieldSettings = grid.newCellSettings().padding(-17, 3, 1, 1); + LayoutSettings numericControlSettings = grid.newCellSettings().padding(-20, 2, 0, 0); rows.addChild(bindXButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetXSlider, sliderSettings); - else rows.addChild(offsetXField, fieldSettings); + rows.addChild(offsetXPair, numericControlSettings); rows.addChild(bindYButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetYSlider, sliderSettings); - else rows.addChild(offsetYField, fieldSettings); + rows.addChild(offsetYPair, numericControlSettings); rows.addChild(bindZButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetZSlider, sliderSettings); - else rows.addChild(offsetZField, fieldSettings); + rows.addChild(offsetZPair, numericControlSettings); rows.addChild(bindRotButton, smallSettings).setTooltip(createTooltip("bindButtons")); - if (useSliderOffset) rows.addChild(offsetPitchSlider, sliderSettings); - else rows.addChild(offsetPitchField, fieldSettings); - if (useSliderOffset) rows.addChild(offsetYawSlider, 2, grid.newCellSettings().padding(26, 2, 0, 0)); - else rows.addChild(offsetYawField, 2, grid.newCellSettings().padding(29, 3, 1, 1)); - rows.addChild(new SimpleIconButton(0, 0, _ -> { - offsetXField.setNumber(0f); - offsetYField.setNumber(0f); - offsetZField.setNumber(0f); - offsetPitchField.setNumber(0f); - offsetYawField.setNumber(0f); - offsetRollField.setNumber(0f); - offsetXSlider.setDouble(0); - offsetYSlider.setDouble(0); - offsetZSlider.setDouble(0); - offsetPitchSlider.setDouble(0); - offsetYawSlider.setDouble(0); - offsetRollSlider.setDouble(0); - }), smallSettings); - if (useSliderOffset) rows.addChild(offsetRollSlider, sliderSettings); - else rows.addChild(offsetRollField, fieldSettings); + rows.addChild(offsetPitchPair, numericControlSettings); + rows.addChild(offsetYawPair, 2, grid.newCellSettings().padding(26, 2, 0, 0)); + rows.addChild(new SimpleIconButton(0, 0, _ -> widgetPairs.forEach(pair -> pair.setNumber(0))), smallSettings); + rows.addChild(offsetRollPair, numericControlSettings); rows.addChild(scaleField, smallSettings).setTooltip(createTooltip("scale")); rows.addChild(depthField, smallSettings).setTooltip(createTooltip("depth")); } @@ -309,14 +273,14 @@ else if (index > 0 && index <= rectWidgets.size()) { initWidgets(page); })); rows.addChild(priorityField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, priorityField), smallSettings).setTooltip(createTooltip("priority")); - rows.addChild(nameField = createTextField(widgetWidth * 2 + 4, 20, nameField), 2, smallSettings).setTooltip(createTooltip("targetName")); + rows.addChild(nameField = createTextField(wideWidgetWidth, 20, nameField), 2, smallSettings).setTooltip(createTooltip("targetName")); grid.arrangeElements(); FrameLayout.alignInRectangle(grid, x, y + 2, x + (xSize - middleWidth) / 2 - 4, y + ySize, 0, 0); grid.visitWidgets(this::addRenderableWidget); } private void initRightWidgets() { - disabledNameField = createTextField(widgetWidth * 2 - 18, 20, disabledNameField); + disabledNameField = createTextField(compactWidgetWidth, 20, disabledNameField); GridLayout grid = new GridLayout(); grid.defaultCellSetting().padding(4, 2, 0, 0); LayoutSettings smallSettings = grid.newCellSettings().padding(5, 3, 1, 1); @@ -360,7 +324,7 @@ private void initRightWidgets() { else hiddenNames.add(config.name()); }) .setPosition(x + (xSize + middleWidth) / 2 - 20, y + 5 + (widgetHeight + 2) * (2 + i % widgetsPerPage)); - rows.addChild(createButton(LocUtil.literal(config.name()), widgetWidth * 2 - 18, _ -> { + rows.addChild(createButton(LocUtil.literal(config.name()), compactWidgetWidth, _ -> { disabledNameField.setValue(config.name()); disabledIdField.setValue(config.textureId()); disableModeButton.setValue(config.disableAll() ? 0 : 1); @@ -383,7 +347,7 @@ private void initRightWidgets() { for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { BindTarget target = i < fixedTargetCount ? fixedTargetList.get(i) : targetList.get(i - fixedTargetCount); String name = target.name(); - rows.addChild(createButton(LocUtil.literal(name), widgetWidth * 2 - 18, _ -> loadBindTarget(target)), 3) + rows.addChild(createButton(LocUtil.literal(name), compactWidgetWidth, _ -> loadBindTarget(target)), 3) .setTooltip(Tooltip.create(name.equals(RealCameraCore.currentTarget().name()) ? LocUtil.literal(name + "\n").append(LocUtil.MODEL_VIEW_WIDGET("currentConfig")) : LocUtil.literal(name)) @@ -406,18 +370,6 @@ private void initRightWidgets() { addRenderableWidget(new SimpleIconButton(x + xSize - 21, y + ySize - 20, 16, 16, 32, 0, _ -> initWidgets((page + 1) % pages))); } - public @NonNull UVRectangleWidget addRectWidget(@NonNull UVRectangleWidget rectWidget) { - UVRectangleWidget foundRectWidget = rectWidgets.stream().filter(r -> r.contains(rectWidget)).findFirst().orElse(null); - if (foundRectWidget == null) { - rectWidgets.add(rectWidget); - focusedRectWidgetNumberField.setMax(rectWidgets.size()); - rectWidgetsSizeWidget.setMessage(LocUtil.literal(String.valueOf(rectWidgets.size()))); - if (textureViewArea != null) addRenderableWidget(rectWidget); - return rectWidget; - } - return foundRectWidget; - } - public boolean deleteFocusedRectWidget() { if (focusedRectWidget == null) return false; rectWidgets.remove(focusedRectWidget); @@ -433,13 +385,13 @@ public void extractRenderState(@NonNull GuiGraphicsExtractor graphics, int mouse super.extractRenderState(graphics, mouseX, mouseY, partialTicks); if (toggleCategoryButton.getValue() == Category.DISABLE && selectionModeButton.getValue() == 2 && inModelViewArea(mouseX, mouseY)) { GUIHelper.enableScissor(graphics, modelViewArea); - GUIHelper.fill(graphics, mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius, 400, 0x4F3333CC); + GUIHelper.fill(graphics, mouseX - selectionRadius, mouseY - selectionRadius, mouseX + selectionRadius, mouseY + selectionRadius, 400, SELECTION_COLOR); graphics.disableScissor(); } if (textureViewArea != null) { GUIHelper.enableScissor(graphics, textureViewArea); if (clickedX >= 0 && clickedY >= 0) - graphics.fill(Math.min((int) clickedX, mouseX), Math.min((int) clickedY, mouseY), Math.max((int) clickedX, mouseX), Math.max((int) clickedY, mouseY), 0x4F3333CC); + graphics.fill(Math.min((int) clickedX, mouseX), Math.min((int) clickedY, mouseY), Math.max((int) clickedX, mouseX), Math.max((int) clickedY, mouseY), SELECTION_COLOR); if (disableModeButton.getValue() == 0) new UVRectangleWidget(0f, 0f, 1f, 1f).extractWidgetRenderState(graphics, mouseX, mouseY, partialTicks); graphics.disableScissor(); @@ -449,9 +401,9 @@ public void extractRenderState(@NonNull GuiGraphicsExtractor graphics, int mouse @Override public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { super.extractBackground(graphics, mouseX, mouseY, partialTicks); - graphics.fill(x, y, x + (xSize - middleWidth) / 2 - 4, y + ySize, 0xFF444444); - graphics.fill(x + (xSize - middleWidth) / 2, y, x + (xSize + middleWidth) / 2, y + ySize, 0xFF222222); - graphics.fill(x + (xSize + middleWidth) / 2 + 4, y, x + xSize, y + ySize, 0xFF444444); + graphics.fill(x, y, x + (xSize - middleWidth) / 2 - 4, y + ySize, SIDE_PANEL_BG); + graphics.fill(x + (xSize - middleWidth) / 2, y, x + (xSize + middleWidth) / 2, y + ySize, CENTER_PANEL_BG); + graphics.fill(x + (xSize + middleWidth) / 2 + 4, y, x + xSize, y + ySize, SIDE_PANEL_BG); ModelAnalyser analyser = new ModelAnalyser(); BindTarget target = genBindTarget(); @@ -473,15 +425,15 @@ private List captureRotatedEntity(ModelAnalyser analyser, Bind float entityPrevHeadYaw = entity.yHeadRotO; float entityHeadYaw = entity.yHeadRot; entity.yBodyRot = 180.0f; - entity.setYRot(180.0f + (float) entityYawSlider.getDouble()); - entity.setXRot((float) entityPitchSlider.getDouble()); + entity.setYRot(180.0f + (float) entityYawSlider.getNumber()); + entity.setXRot((float) entityPitchSlider.getNumber()); entity.yHeadRot = entity.getYRot(); entity.yHeadRotO = entity.getYRot(); try { int x1 = modelViewArea.left(), y1 = modelViewArea.top(), x2 = modelViewArea.right(), y2 = modelViewArea.bottom(); Quaternionf rotation = new Quaternionf().rotateX((float) Math.PI / 6 + xRot).rotateY((float) Math.PI / 6 + yRot).rotateZ((float) Math.PI); PoseStack modelPose = new PoseStack(); - modelPose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); + modelPose.translate((x1 + x2) / 2.0f, (y1 + y2) / 2.0f, 0); modelPose.scale(modelScale, modelScale, -modelScale); modelPose.translate(modelX, modelY, 0); modelPose.mulPose(rotation); @@ -515,7 +467,7 @@ private void renderCulledModels(GuiGraphicsExtractor graphics, ModelAnalyser ana float invScale = 1.0f / modelScale; Matrix4f modelTransform = new Matrix4f(); modelTransform.scale(invScale, invScale, -invScale); - modelTransform.translate(-(float) (x1 + x2) / 2.0f, -(float) (y1 + y2) / 2.0f, 0); + modelTransform.translate(-(x1 + x2) / 2.0f, -(y1 + y2) / 2.0f, 0); GUIHelper.culledModels(graphics, modelRecords, modelScale, modelTransform, x1, y1, x2, y2); if (toggleCategoryButton.getValue() != Category.PREVIEW) analyser.drawFocusedInModelArea(graphics); if (toggleCategoryButton.getValue() == Category.CONFIGS) analyser.drawBindTarget(graphics, target, modelScale); @@ -526,11 +478,11 @@ private void renderCulledModels(GuiGraphicsExtractor graphics, ModelAnalyser ana private void renderFlattenedModels(GuiGraphicsExtractor graphics, ModelAnalyser analyser, List textureRecords) { int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); GUIHelper.enableScissor(graphics, textureViewArea); - float scale = (float) (textureScale * textureViewArea.width()) / 80; + float scale = (textureScale * textureViewArea.width()) / (float) DEFAULT_SCALE; Vector3f offset = new Vector3f((float) textureX - 0.5f, (float) textureY - 0.5f, 0); GUIHelper.flattenedModels(graphics, textureRecords, offset, x1, y1, x2, y2, scale); Matrix4f texturePose = new Matrix4f(); - texturePose.translate((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); + texturePose.translate((x1 + x2) / 2.0f, (y1 + y2) / 2.0f, 0); texturePose.scale(scale, scale, -scale); texturePose.translate(offset); analyser.drawFocusedInTextureArea(graphics, texturePose); @@ -538,21 +490,19 @@ private void renderFlattenedModels(GuiGraphicsExtractor graphics, ModelAnalyser } private Vec2 translateUVToXY(float u, float v, ScreenRectangle screenArea) { - int x1 = screenArea.left(), y1 = screenArea.top(), x2 = screenArea.right(), y2 = screenArea.bottom(); - Vector3f vector3f = new Vector3f(u, v, 0) - .add((float) textureX - 0.5f, (float) textureY - 0.5f, 0) - .mul((float) (textureScale * screenArea.width()) / 80) - .add((float) (x1 + x2) / 2.0f, (float) (y1 + y2) / 2.0f, 0); - return new Vec2(vector3f.x(), vector3f.y()); + int left = screenArea.left(), width = screenArea.width(), top = screenArea.top(), height = screenArea.height(); + float scale = (textureScale * width) / (float) DEFAULT_SCALE; + float x = (u + (float) textureX - 0.5f) * scale + left + width / 2.0f; + float y = (v + (float) textureY - 0.5f) * scale + top + height / 2.0f; + return new Vec2(x, y); } private Vec2 translateXYToUV(float x, float y, ScreenRectangle screenArea) { - int x1 = screenArea.left(), y1 = screenArea.top(), x2 = screenArea.right(), y2 = screenArea.bottom(); - Vector3f vector3f = new Vector3f(x, y, 0) - .add(-(float) (x1 + x2) / 2.0f, -(float) (y1 + y2) / 2.0f, 0) - .mul((float) 80 / (textureScale * screenArea.width())) - .add((float) -textureX + 0.5f, (float) -textureY + 0.5f, 0); - return new Vec2(vector3f.x(), vector3f.y()); + int left = screenArea.left(), width = screenArea.width(), top = screenArea.top(), height = screenArea.height(); + float invScale = (float) DEFAULT_SCALE / (textureScale * width); + float u = (x - left - width / 2.0f) * invScale - (float) textureX + 0.5f; + float v = (y - top - height / 2.0f) * invScale - (float) textureY + 0.5f; + return new Vec2(u, v); } private void importBindTarget(Button button) { @@ -619,19 +569,14 @@ private void loadBindTarget(BindTarget target) { bindYButton.setValue(target.bindConfig().bindY() ? 0 : 1); bindZButton.setValue(target.bindConfig().bindZ() ? 0 : 1); bindRotButton.setValue(target.bindConfig().bindRotation() ? 0 : 1); - scaleField.setNumber(target.offsets().scale); - offsetXSlider.setDouble(target.offsets().x); - offsetXField.setNumber(target.offsets().x); - offsetYSlider.setDouble(target.offsets().y); - offsetYField.setNumber(target.offsets().y); - offsetZSlider.setDouble(target.offsets().z); - offsetZField.setNumber(target.offsets().z); - offsetPitchSlider.setDouble(target.offsets().pitch); - offsetPitchField.setNumber(target.offsets().pitch); - offsetYawSlider.setDouble(target.offsets().yaw); - offsetYawField.setNumber(target.offsets().yaw); - offsetRollSlider.setDouble(target.offsets().roll); - offsetRollField.setNumber(target.offsets().roll); + OffsetConfig offsets = target.offsets(); + scaleField.setNumber(offsets.scale); + offsetXPair.setNumber(offsets.x); + offsetYPair.setNumber(offsets.y); + offsetZPair.setNumber(offsets.z); + offsetPitchPair.setNumber(offsets.pitch); + offsetYawPair.setNumber(offsets.yaw); + offsetRollPair.setNumber(offsets.roll); disableConfigs.clear(); disableConfigs.addAll(List.of(target.disableConfigs())); } @@ -641,12 +586,12 @@ private BindTarget genBindTarget() { BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); OffsetConfig offsets = new OffsetConfig( scaleField.getNumber(), - toggleSliderButton.getValue() == 0 ? (float) offsetXSlider.getDouble() : offsetXField.getNumber(), - toggleSliderButton.getValue() == 0 ? (float) offsetYSlider.getDouble() : offsetYField.getNumber(), - toggleSliderButton.getValue() == 0 ? (float) offsetZSlider.getDouble() : offsetZField.getNumber(), - toggleSliderButton.getValue() == 0 ? (float) offsetPitchSlider.getDouble() : offsetPitchField.getNumber(), - toggleSliderButton.getValue() == 0 ? (float) offsetYawSlider.getDouble() : offsetYawField.getNumber(), - toggleSliderButton.getValue() == 0 ? (float) offsetRollSlider.getDouble() : offsetRollField.getNumber() + offsetXPair.getNumber(), + offsetYPair.getNumber(), + offsetZPair.getNumber(), + offsetPitchPair.getNumber(), + offsetYawPair.getNumber(), + offsetRollPair.getNumber() ); DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toArray(UVRectangle[]::new)); DisableConfig[] disableConfigArray = disableConfigs.toArray(new DisableConfig[0]); @@ -657,6 +602,19 @@ private BindTarget genBindTarget() { return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, disableConfigArray); } + @NonNull + private UVRectangleWidget addRectWidget(@NonNull UVRectangleWidget rectWidget) { + UVRectangleWidget foundRectWidget = rectWidgets.stream().filter(r -> r.contains(rectWidget)).findFirst().orElse(null); + if (foundRectWidget == null) { + rectWidgets.add(rectWidget); + focusedRectWidgetNumberField.setMax(rectWidgets.size()); + rectWidgetsSizeWidget.setMessage(LocUtil.literal(String.valueOf(rectWidgets.size()))); + if (textureViewArea != null) addRenderableWidget(rectWidget); + return rectWidget; + } + return foundRectWidget; + } + private Tooltip createTooltip(String key, Object... args) { return Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP(key, args)); } @@ -822,11 +780,11 @@ public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmou selectionRadius = Mth.clamp(selectionRadius + (int) verticalAmount * 2, 2, 48); else layers = Math.max(0, layers + (int) verticalAmount); } else { - modelScale = Mth.clamp(modelScale + (int) verticalAmount * modelScale / 16, 16, 1024); + modelScale = Mth.clamp(modelScale + (int) verticalAmount * modelScale / 16, MIN_SCALE, MAX_SCALE); } return true; } else if (inTextureViewArea(mouseX, mouseY)) { - textureScale = Mth.clamp(textureScale + (int) verticalAmount * textureScale / 16, 16, 1024); + textureScale = Mth.clamp(textureScale + (int) verticalAmount * textureScale / 16, MIN_SCALE, MAX_SCALE); } return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); } @@ -857,7 +815,7 @@ public Category next() { } } - public final class UVRectangleWidget extends AbstractWidget { + private final class UVRectangleWidget extends AbstractWidget { private float uMin, vMin, uMax, vMax; public UVRectangleWidget(float uMin, float vMin, float uMax, float vMax) { @@ -908,10 +866,10 @@ protected void extractWidgetRenderState(@NonNull GuiGraphicsExtractor graphics, setWidth((int) width); setHeight((int) height); GUIHelper.enableScissor(graphics, textureViewArea); - GUIHelper.fill(graphics, x1, y1, x2, y2, 0x4F3333CC); - if (isHoveredOrFocused()) GUIHelper.fill(graphics, x1, y1, x2, y2, 0x2F3333CC); + GUIHelper.fill(graphics, x1, y1, x2, y2, SELECTION_COLOR); + if (isHoveredOrFocused()) GUIHelper.fill(graphics, x1, y1, x2, y2, SELECTION_HOVER_COLOR); if (isFocused() || this == focusedRectWidget) - GUIHelper.outline(graphics, x1, y1, width, height, 0xAAFFFFFF); + GUIHelper.outline(graphics, x1, y1, width, height, OUTLINE_COLOR); graphics.disableScissor(); } @@ -922,7 +880,7 @@ public boolean keyPressed(@NonNull KeyEvent event) { if (event.isSelection() && uMin < uMax && vMin < vMax) { textureX = 0.5 * (1 - uMin - uMax); textureY = 0.5 * (1 - vMin - vMax); - textureScale = (int) Mth.clamp(2560d / (textureViewArea.width() * Math.sqrt((uMax - uMin) * (vMax - vMin))), 16, 1024); + textureScale = (int) Mth.clamp(32d * DEFAULT_SCALE / (textureViewArea.width() * Math.sqrt((uMax - uMin) * (vMax - vMin))), MIN_SCALE, MAX_SCALE); return true; } return super.keyPressed(event); diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java b/common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java index d251f011..02e97764 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/CycleIconButton.java @@ -67,7 +67,7 @@ public void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouse } @Override - protected void updateWidgetNarration(@NonNull NarrationElementOutput builder) { - defaultButtonNarrationText(builder); + protected void updateWidgetNarration(@NonNull NarrationElementOutput output) { + defaultButtonNarrationText(output); } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/DoubleSlider.java b/common/src/main/java/com/xtracr/realcamera/gui/components/DoubleSlider.java index fc319fd2..52862444 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/components/DoubleSlider.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/DoubleSlider.java @@ -17,17 +17,17 @@ public DoubleSlider(int width, int height, double value, double min, double max, this.max = max; } - public double getDouble() { + public double getNumber() { return min + (max - min) * value; } - public void setDouble(double value) { + public void setNumber(double value) { setValue((value - min) / (max - min)); } @Override protected void updateMessage() { - setMessage(textFactory.apply(getDouble())); + setMessage(textFactory.apply(getNumber())); } @Override diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java index 070215ed..c102c7d1 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberField.java @@ -29,14 +29,14 @@ public abstract class NumberField> extends EditBox { if (copyFrom != null) setNumber(copyFrom.getNumber()); } - public static NumberField ofFloat(Font font, int width, int height, float defaultValue, @Nullable NumberField copyFrom) { - return new FloatField(font, width, height, defaultValue, copyFrom); - } - public static NumberField ofInt(Font font, int width, int height, int defaultValue, @Nullable NumberField copyFrom) { return new IntField(font, width, height, defaultValue, copyFrom); } + public static NumberField ofFloat(Font font, int width, int height, float defaultValue, @Nullable NumberField copyFrom) { + return new FloatField(font, width, height, defaultValue, copyFrom); + } + public T getNumber() { try { return getNumberInternal(getValue()); @@ -114,18 +114,6 @@ public void extractWidgetRenderState(@NonNull GuiGraphicsExtractor graphics, int super.extractWidgetRenderState(graphics, mouseX, mouseY, partialTicks); } - private static final class FloatField extends NumberField { - FloatField(Font font, int width, int height, float defaultValue, @Nullable NumberField copyFrom) { - super(font, width, height, defaultValue, Float.MAX_VALUE, -Float.MAX_VALUE, copyFrom); - setMaxLength(16); - } - - @Override - protected Float getNumberInternal(String str) throws NumberFormatException { - return Float.parseFloat(str); - } - } - private static final class IntField extends NumberField { IntField(Font font, int width, int height, int defaultValue, @Nullable NumberField copyFrom) { super(font, width, height, defaultValue, Integer.MAX_VALUE, Integer.MIN_VALUE, copyFrom); @@ -137,4 +125,16 @@ protected Integer getNumberInternal(String str) throws NumberFormatException { return Integer.parseInt(str); } } + + private static final class FloatField extends NumberField { + FloatField(Font font, int width, int height, float defaultValue, @Nullable NumberField copyFrom) { + super(font, width, height, defaultValue, Float.MAX_VALUE, -Float.MAX_VALUE, copyFrom); + setMaxLength(16); + } + + @Override + protected Float getNumberInternal(String str) throws NumberFormatException { + return Float.parseFloat(str); + } + } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java new file mode 100644 index 00000000..a610039d --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java @@ -0,0 +1,133 @@ +package com.xtracr.realcamera.gui.components; + +import com.xtracr.realcamera.util.LocUtil; +import com.xtracr.realcamera.util.MathUtil; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.network.chat.CommonComponents; +import org.jspecify.annotations.NonNull; + +public final class NumberWidgetPair extends AbstractWidget { + private final DoubleSlider slider; + private final NumberField field; + private boolean useSlider; + + public NumberWidgetPair(Font font, String translationKey, int width, int height, float min, float max) { + super(0, 0, width, height, CommonComponents.EMPTY); + this.slider = new DoubleSlider(width, height, 0, min, max, d -> LocUtil.MODEL_VIEW_WIDGET(translationKey, MathUtil.round(d, 2))); + this.field = NumberField.ofFloat(font, width - 2, height - 2, 0, null).setMin(min).setMax(max); + setUseSlider(true); + } + + public void setNumber(float value) { + slider.setNumber(value); + field.setNumber(value); + } + + public float getNumber() { + return isUseSlider() ? (float) slider.getNumber() : field.getNumber(); + } + + public void setUseSlider(boolean useSlider) { + this.useSlider = useSlider; + slider.active = useSlider; + field.active = !useSlider; + } + + public boolean isUseSlider() { + return useSlider; + } + + public void syncAndSwitch(boolean useSlider) { + setUseSlider(useSlider); + if (useSlider) slider.setNumber(field.getNumber()); + else field.setNumber((float) slider.getNumber()); + } + + private AbstractWidget getActiveWidget() { + return isUseSlider() ? slider : field; + } + + @Override + public void setX(int x) { + super.setX(x); + slider.setX(x); + field.setX(x); + } + + @Override + public void setY(int y) { + super.setY(y); + slider.setY(y); + field.setY(y); + } + + @Override + public void setWidth(int width) { + super.setWidth(width); + slider.setWidth(width); + field.setWidth(width - 2); + } + + @Override + public void setHeight(int height) { + super.setHeight(height); + slider.setHeight(height); + field.setHeight(height - 2); + } + + @Override + public void extractWidgetRenderState(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTicks) { + getActiveWidget().extractRenderState(graphics, mouseX, mouseY, partialTicks); + } + + @Override + public boolean mouseClicked(@NonNull MouseButtonEvent event, boolean doubleClick) { + return getActiveWidget().mouseClicked(event, doubleClick); + } + + @Override + public boolean mouseDragged(@NonNull MouseButtonEvent event, double dx, double dy) { + return getActiveWidget().mouseDragged(event, dx, dy); + } + + @Override + public boolean mouseReleased(@NonNull MouseButtonEvent event) { + return getActiveWidget().mouseReleased(event); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + return getActiveWidget().mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); + } + + @Override + public boolean keyPressed(@NonNull KeyEvent event) { + return getActiveWidget().keyPressed(event); + } + + @Override + public boolean charTyped(@NonNull CharacterEvent event) { + return getActiveWidget().charTyped(event); + } + + @Override + public void setFocused(boolean focused) { + super.setFocused(focused); + if (focused) getActiveWidget().setFocused(true); + else { + slider.setFocused(false); + field.setFocused(false); + } + } + + @Override + protected void updateWidgetNarration(@NonNull NarrationElementOutput output) { + getActiveWidget().updateNarration(output); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java index 8ade0765..552056bf 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java @@ -5,7 +5,7 @@ import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormatElement; import com.xtracr.realcamera.renderer.state.VertexData; -import com.xtracr.realcamera.renderer.state.VertexData.MutableVertex; +import com.xtracr.realcamera.renderer.state.MutableVertex; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/MutableVertex.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/MutableVertex.java new file mode 100644 index 00000000..82b2cb2c --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/MutableVertex.java @@ -0,0 +1,67 @@ +package com.xtracr.realcamera.renderer.state; + +public final class MutableVertex implements VertexData { + public float x, y, z; + public int argb; + public float u, v; + public int overlay, light; + public float normalX, normalY, normalZ; + + MutableVertex() { + } + + @Override + public float x() { + return x; + } + + @Override + public float y() { + return y; + } + + @Override + public float z() { + return z; + } + + @Override + public int argb() { + return argb; + } + + @Override + public float u() { + return u; + } + + @Override + public float v() { + return v; + } + + @Override + public int overlay() { + return overlay; + } + + @Override + public int light() { + return light; + } + + @Override + public float normalX() { + return normalX; + } + + @Override + public float normalY() { + return normalY; + } + + @Override + public float normalZ() { + return normalZ; + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java index 5f57de5e..c8c2a089 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/VertexData.java @@ -140,70 +140,4 @@ public VertexData asImmutable() { return this; } } - - final class MutableVertex implements VertexData { - public float x, y, z; - public int argb; - public float u, v; - public int overlay, light; - public float normalX, normalY, normalZ; - - private MutableVertex() { - } - - @Override - public float x() { - return x; - } - - @Override - public float y() { - return y; - } - - @Override - public float z() { - return z; - } - - @Override - public int argb() { - return argb; - } - - @Override - public float u() { - return u; - } - - @Override - public float v() { - return v; - } - - @Override - public int overlay() { - return overlay; - } - - @Override - public int light() { - return light; - } - - @Override - public float normalX() { - return normalX; - } - - @Override - public float normalY() { - return normalY; - } - - @Override - public float normalZ() { - return normalZ; - } - } } diff --git a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java index 65c2e3f5..72d08346 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java +++ b/common/src/main/java/com/xtracr/realcamera/util/MathUtil.java @@ -10,20 +10,22 @@ public static double round(double d, int digits) { return Math.round(d * Math.pow(10, digits)) / Math.pow(10, digits); } - public static double floor(double... ds) { - double d = ds[0]; - for (int i = 1; i < ds.length; i++) { - d = Math.min(d, ds[i]); - } - return Math.floor(d); + public static double floor(double d1, double d2) { + return Math.floor(Math.min(d1, d2)); } - public static double ceil(double... ds) { - double d = ds[0]; - for (int i = 1; i < ds.length; i++) { - d = Math.max(d, ds[i]); - } - return Math.ceil(d); + public static double floor(double d1, double d2, double d3, double d4) { + double min = Math.min(Math.min(Math.min(d1, d2), d3), d4); + return Math.floor(min); + } + + public static double ceil(double d1, double d2) { + return Math.ceil(Math.max(d1, d2)); + } + + public static double ceil(double d1, double d2, double d3, double d4) { + double max = Math.max(Math.max(Math.max(d1, d2), d3), d4); + return Math.ceil(max); } public static float cross(float a, float b, float c, float d) { From 688ba60dd9dfb6af075b799821485551d3365d72 Mon Sep 17 00:00:00 2001 From: xTracr Date: Wed, 20 May 2026 13:51:28 +0800 Subject: [PATCH 20/34] Move import/export serialization to BindTarget - Extract compressed Base64 serialization from ModelViewScreen into BindTarget.fromCompressedBase64()/toCompressedBase64() using DataResult. - Rename static fields to UPPER_CASE across all files (entries, defaultTargets, serialVersion, colors, Z values). - Add FALSE-predicate short-circuit in DisableHelper.Entry to avoid unnecessary predicate wrapping. --- .../realcamera/compat/DisableHelper.java | 12 +-- .../xtracr/realcamera/compat/YSMCompat.java | 22 +++--- .../xtracr/realcamera/config/BindTarget.java | 73 ++++++++++++++++-- .../realcamera/config/ConfigScreen.java | 2 +- .../xtracr/realcamera/config/ModConfig.java | 10 +-- .../xtracr/realcamera/gui/ModelAnalyser.java | 26 ++++--- .../realcamera/gui/ModelViewScreen.java | 76 ++++++------------- .../renderer/IterableVertexBuffer.java | 2 +- .../renderer/gui/GuiCulledModelsRenderer.java | 6 +- 9 files changed, 134 insertions(+), 95 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index 5d4ff186..20f6f84f 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -19,7 +19,7 @@ public final class DisableHelper { public static final Entry MAIN_FEATURE, RENDER_MODEL, RENDER_HANDS; private static final Pattern MULTI_STAR = Pattern.compile("\\*+"); private static final Predicate FALSE = _ -> false; - private static final Map entries = new HashMap<>(); + private static final Map ENTRIES = new HashMap<>(); private static int exitTick = 0; static { @@ -66,7 +66,7 @@ private static boolean checkCondition(Player player, boolean condition, int outT @Deprecated public static void registerOr(String name, Predicate predicate) { - entries.get(name).registerOrInBinding(predicate::test); + ENTRIES.get(name).registerOrInBinding(predicate::test); } public static boolean matchesItemPattern(Item item, String pattern) { @@ -116,7 +116,7 @@ protected Entry(String name, Predicate predicate) { protected Entry(String name, Predicate predicateInClassic, Predicate predicateInBinding) { this.predicateInClassic = predicateInClassic; this.predicateInBinding = predicateInBinding; - entries.put(name, this); + ENTRIES.put(name, this); } public void registerOr(Predicate predicate) { @@ -125,11 +125,13 @@ public void registerOr(Predicate predicate) { } public void registerOrInClassic(Predicate predicate) { - this.predicateInClassic = this.predicateInClassic.or(predicate); + if (predicateInClassic == FALSE) predicateInClassic = predicate; + else predicateInClassic = predicateInClassic.or(predicate); } public void registerOrInBinding(Predicate predicate) { - this.predicateInBinding = this.predicateInBinding.or(predicate); + if (predicateInBinding == FALSE) predicateInBinding = predicate; + else predicateInBinding = predicateInBinding.or(predicate); } public boolean disabled(Entity cameraEntity) { diff --git a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java index 1b1223b7..a342c325 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/YSMCompat.java @@ -20,16 +20,16 @@ import java.util.Map; public final class YSMCompat { - private static final Map resultMap = new HashMap<>(); - private static final TransformedVertexRecorder[] transformedRecorders = new TransformedVertexRecorder[4]; + private static final Map RESULT_MAP = new HashMap<>(); + private static final TransformedVertexRecorder[] TRANSFORMED_RECORDERS = new TransformedVertexRecorder[4]; private static BindResult bindResult = BindResult.EMPTY; static { final float pitch = 1.9106332f, yaw = 2.0943951f; - transformedRecorders[0] = new TransformedVertexRecorder(); - transformedRecorders[1] = new TransformedVertexRecorder().setRotation(pitch, 0); - transformedRecorders[2] = new TransformedVertexRecorder().setRotation(pitch, yaw); - transformedRecorders[3] = new TransformedVertexRecorder().setRotation(pitch, 2 * yaw); + TRANSFORMED_RECORDERS[0] = new TransformedVertexRecorder(); + TRANSFORMED_RECORDERS[1] = new TransformedVertexRecorder().setRotation(pitch, 0); + TRANSFORMED_RECORDERS[2] = new TransformedVertexRecorder().setRotation(pitch, yaw); + TRANSFORMED_RECORDERS[3] = new TransformedVertexRecorder().setRotation(pitch, 2 * yaw); } public static void register() { @@ -37,12 +37,12 @@ public static void register() { } private static BindResult computeBindResult(Minecraft client, float partialTicks) { - resultMap.clear(); + RESULT_MAP.clear(); bindResult = BindResult.EMPTY; EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); EntityRenderState renderState = dispatcher.extractEntity(client.getCameraEntity(), partialTicks); PoseStack poseStack = new PoseStack(); - for (TransformedVertexRecorder recorder : transformedRecorders) { + for (TransformedVertexRecorder recorder : TRANSFORMED_RECORDERS) { poseStack.pushPose(); poseStack.mulPose(recorder.matrix4f.invert(new Matrix4f())); dispatcher.submit(renderState, new CameraRenderState(), 0, 0, 0, poseStack, recorder.vertexCatcher.initCollector()); @@ -50,7 +50,7 @@ private static BindResult computeBindResult(Minecraft client, float partialTicks poseStack.popPose(); if (bindResult.available()) return bindResult; } - for (TransformedVertexRecorder recorder : transformedRecorders) { + for (TransformedVertexRecorder recorder : TRANSFORMED_RECORDERS) { recorder.vertexCatcher.forEachBuffer(recorder::computeBindResult); if (bindResult.available()) return bindResult; } @@ -71,7 +71,7 @@ public TransformedVertexRecorder setRotation(float pitch, float yaw) { public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { - BindResult result = resultMap.computeIfAbsent(target, BindResult::new); + BindResult result = RESULT_MAP.computeIfAbsent(target, BindResult::new); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = new VertexData.UV(config.posU(), config.posV()); VertexData.UV forwardUV = new VertexData.UV(config.forwardU(), config.forwardV()); @@ -95,7 +95,7 @@ public void computeBindResultInCache(BuiltIterableBuffer builtBuffer) { public void computeBindResult(BuiltIterableBuffer builtBuffer) { if (bindResult.available()) return; for (BindTarget target : ConfigFile.config().getBindTargetList(builtBuffer.textureId())) { - BindResult result = resultMap.computeIfAbsent(target, BindResult::new); + BindResult result = RESULT_MAP.computeIfAbsent(target, BindResult::new); BindTarget.TargetConfig config = target.targetConfig(); VertexData.UV posUV = result.getPosition() == Vec3.ZERO ? new VertexData.UV(config.posU(), config.posV()) : null; VertexData.UV forwardUV = result.getForward() == Vec3.ZERO ? new VertexData.UV(config.forwardU(), config.forwardV()) : null; diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index 87956e33..c36ab77e 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -1,10 +1,18 @@ package com.xtracr.realcamera.config; +import com.mojang.serialization.DataResult; +import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.util.Arrays; +import java.util.Base64; import java.util.List; import java.util.function.Predicate; +import java.util.zip.Deflater; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.InflaterInputStream; public record BindTarget( String name, String textureId, int priority, float disablingDepth, @@ -12,12 +20,12 @@ public record BindTarget( BindConfig bindConfig, OffsetConfig offsets, DisableConfig[] disableConfigs) { - public static final List defaultTargets; + public static final List DEFAULT_TARGETS; public static final BindTarget EMPTY = blank(null, null); - private static final short serialVersion = 703; // 0.7.3 + private static final short SERIAL_VERSION = 703; // 0.7.3 static { - defaultTargets = List.of( + DEFAULT_TARGETS = List.of( BindTarget.vanillaTarget("minecraft_head", 5, false), BindTarget.vanillaTarget("skin_head", 5, false), BindTarget.vanillaTarget("minecraft_head_2", 1, true), @@ -33,8 +41,8 @@ public static BindTarget blank(String name, String textureId) { public static BindTarget read(FriendlyByteBuf byteBuf) throws IllegalArgumentException { short version = byteBuf.readShort(); - if (version != serialVersion) - throw new IllegalArgumentException("Invalid version: " + version + ", expected " + serialVersion); + if (version != SERIAL_VERSION) + throw new IllegalArgumentException("Invalid version: " + toSemVer(version) + ", expected " + toSemVer(SERIAL_VERSION)); String name = byteBuf.readUtf(); String textureId = byteBuf.readUtf(); int priority = byteBuf.readVarInt(); @@ -49,6 +57,40 @@ public static BindTarget read(FriendlyByteBuf byteBuf) throws IllegalArgumentExc return new BindTarget(name, textureId, priority, disablingDepth, targetConfig, bindConfig, offsets, disableConfigs); } + public static DataResult fromCompressedBase64(String base64) { + FriendlyByteBuf byteBuf = null; + try { + byte[] compressed = Base64.getDecoder().decode(base64); + InflaterInputStream inflaterStream = new InflaterInputStream(new ByteArrayInputStream(compressed)); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int length; + while ((length = inflaterStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, length); + } + byte[] bytes = outputStream.toByteArray(); + byteBuf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes)); + BindTarget target = BindTarget.read(byteBuf); + if (target.isEmpty()) return DataResult.error(() -> "Invalid config format"); + return DataResult.success(target); + } catch (Exception e) { + return DataResult.error(() -> { + String message = e.getClass().getSimpleName(); + if (e instanceof IllegalArgumentException) message += ": " + e.getMessage(); + return message; + }); + } finally { + if (byteBuf != null) byteBuf.release(); + } + } + + private static String toSemVer(short version) { + int major = version / 10000; + int minor = version % 10000 / 100; + int patch = version % 100; + return major + "." + minor + "." + patch; + } + private static BindTarget vanillaTarget(String name, int priority, boolean shouldBind) { String textureId = name.contains("skin") ? "minecraft:skins/" : "minecraft:textures/entity/player/"; TargetConfig targetConfig = new TargetConfig(0.1875f, 0.2f, 0.1875f, 0.075f, 0.1875f, 0.2f); @@ -70,7 +112,7 @@ public DisableConfig[] filteredDisableConfigs(Predicate filter) { } public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeShort(serialVersion); + byteBuf.writeShort(SERIAL_VERSION); byteBuf.writeUtf(name); byteBuf.writeUtf(textureId); byteBuf.writeVarInt(priority); @@ -84,6 +126,25 @@ public void write(FriendlyByteBuf byteBuf) { } } + public DataResult toCompressedBase64() { + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + try { + write(byteBuf); + byte[] bytes = new byte[byteBuf.readableBytes()]; + byteBuf.getBytes(byteBuf.readerIndex(), bytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (DeflaterOutputStream deflaterStream = new DeflaterOutputStream(outputStream, new Deflater(Deflater.BEST_COMPRESSION))) { + deflaterStream.write(bytes); + } + String base64 = Base64.getEncoder().encodeToString(outputStream.toByteArray()); + return DataResult.success(base64); + } catch (Exception e) { + return DataResult.error(() -> e.getClass().getSimpleName() + ": " + e.getMessage()); + } finally { + byteBuf.release(); + } + } + public record TargetConfig(float forwardU, float forwardV, float upwardU, float upwardV, float posU, float posV) { public static TargetConfig read(FriendlyByteBuf byteBuf) { return new TargetConfig(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index adedb4f8..77c91e68 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -217,7 +217,7 @@ public static Screen create(Screen parent) { .setSaveConsumer(l -> config.binding.disableMainFeatureItems = l) .build()); disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableRenderItems"), config.binding.disableRenderItems) - .setDefaultValue(ModConfig.Binding.defaultDisableRenderItems) + .setDefaultValue(ModConfig.Binding.DEFAULT_DISABLE_RENDER_ITEMS) .setTooltip(LocUtil.CONFIG_TOOLTIP("disableRenderItems")) .setSaveConsumer(l -> config.binding.disableRenderItems = l) .build()); diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index 1b92df36..55b69d56 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -182,7 +182,7 @@ public AdjustMode cycle() { } public static class Binding { - protected static final List defaultDisableRenderItems = List.of("minecraft:filled_map"); + protected static final List DEFAULT_DISABLE_RENDER_ITEMS = List.of("minecraft:filled_map"); public String screenModifierKey = InputConstants.Type.KEYSYM.getOrCreate(InputConstants.KEY_LALT).getName(); public boolean legacyMode = false; public boolean adjustOffset = true; @@ -197,9 +197,9 @@ public static class Binding { public double displacementSmoothFactor = 0.4; public double rotationSmoothFactor = 0.4; public List disableMainFeatureItems = List.of(); - public List disableRenderItems = defaultDisableRenderItems; + public List disableRenderItems = DEFAULT_DISABLE_RENDER_ITEMS; public List fixedTargetList = new ArrayList<>(); - public List targetList = new ArrayList<>(BindTarget.defaultTargets); + public List targetList = new ArrayList<>(BindTarget.DEFAULT_TARGETS); private void clamp() { try { @@ -216,10 +216,10 @@ private void clamp() { if (disableRenderItems == null) disableRenderItems = List.of(); if (fixedTargetList == null) fixedTargetList = new ArrayList<>(); else fixedTargetList.removeIf(BindTarget::isEmpty); - if (targetList == null) targetList = new ArrayList<>(BindTarget.defaultTargets); + if (targetList == null) targetList = new ArrayList<>(BindTarget.DEFAULT_TARGETS); else { targetList.removeIf(BindTarget::isEmpty); - if (targetList.isEmpty()) targetList = new ArrayList<>(BindTarget.defaultTargets); + if (targetList.isEmpty()) targetList = new ArrayList<>(BindTarget.DEFAULT_TARGETS); } } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index d4339b85..f963e14d 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -10,6 +10,7 @@ import com.xtracr.realcamera.config.DisableConfig; import com.xtracr.realcamera.renderer.BuiltIterableBuffer; import com.xtracr.realcamera.renderer.MultiVertexCatcher; +import com.xtracr.realcamera.renderer.gui.GuiCulledModelsRenderer; import com.xtracr.realcamera.renderer.state.BuiltModelRecord; import com.xtracr.realcamera.renderer.state.VertexData; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; @@ -34,8 +35,9 @@ public final class ModelAnalyser { private static final MultiVertexCatcher vertexCatcher = MultiVertexCatcher.create(); private static final Set UNFOCUSABLE_RENDER_TYPES = ImmutableSet.of(RenderTypes.armorEntityGlint(), RenderTypes.glintTranslucent(), RenderTypes.glint(), RenderTypes.entityGlint()); - private static final int planeArgb = 0x6F3333CC, forwardArgb = 0xFF00CC00, upwardArgb = 0xFFCC0000, leftArgb = 0xFF0000CC, focusedArgb = 0x4FFFFFFF; - private final List focusedPolyhedron = new ArrayList<>(); private static final int z1 = 210, z2 = z1 + 10; + private static final int PLANE_ARGB = 0x6F3333CC, FORWARD_ARGB = 0xFF00CC00, UPWARD_ARGB = 0xFFCC0000, LEFT_ARGB = 0xFF0000CC, FOCUSED_ARGB = 0x4FFFFFFF; + private static final int Z_QUAD = GuiCulledModelsRenderer.MAX_Z + 10, Z_LINE = Z_QUAD + 10; + private final List focusedPolyhedron = new ArrayList<>(); private VertexData[][] targetPrimitives = new VertexData[3][]; private BindResult bindResult = BindResult.EMPTY; @Nullable @@ -195,16 +197,16 @@ public void drawCameraDirections(GuiGraphicsExtractor graphics, double modelScal Vec3 start = bindResult.getPosition(); Matrix3f normal = bindResult.getRotation(); if (normal.m00() == 0 && normal.m11() == 0 && normal.m22() == 0) return; - GUIHelper.vector(graphics, start, new Vec3(normal.m20(), normal.m21(), normal.m22()).scale(modelScale / 3), z2, forwardArgb); - GUIHelper.vector(graphics, start, new Vec3(normal.m10(), normal.m11(), normal.m12()).scale(modelScale / 6), z2, upwardArgb); - GUIHelper.vector(graphics, start, new Vec3(normal.m00(), normal.m01(), normal.m02()).scale(modelScale / 6), z2, leftArgb); + GUIHelper.vector(graphics, start, new Vec3(normal.m20(), normal.m21(), normal.m22()).scale(modelScale / 3), Z_LINE, FORWARD_ARGB); + GUIHelper.vector(graphics, start, new Vec3(normal.m10(), normal.m11(), normal.m12()).scale(modelScale / 6), Z_LINE, UPWARD_ARGB); + GUIHelper.vector(graphics, start, new Vec3(normal.m00(), normal.m01(), normal.m02()).scale(modelScale / 6), Z_LINE, LEFT_ARGB); } public void drawBindTarget(GuiGraphicsExtractor graphics, BindTarget target, double modelScale) { TargetConfig config = target.targetConfig(); - if (targetPrimitives[0] != null) GUIHelper.triangleOrQuad(graphics, targetPrimitives[0], z1, planeArgb); - if (targetPrimitives[1] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[1], config.forwardU(), config.forwardV()), VertexData.normal(targetPrimitives[1]).scale(-modelScale / 2), z2, forwardArgb); - if (targetPrimitives[2] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[2], config.upwardU(), config.upwardV()), VertexData.normal(targetPrimitives[2]).scale(-modelScale / 2), z2, upwardArgb); + if (targetPrimitives[0] != null) GUIHelper.triangleOrQuad(graphics, targetPrimitives[0], Z_QUAD, PLANE_ARGB); + if (targetPrimitives[1] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[1], config.forwardU(), config.forwardV()), VertexData.normal(targetPrimitives[1]).scale(-modelScale / 2), Z_LINE, FORWARD_ARGB); + if (targetPrimitives[2] != null) GUIHelper.vector(graphics, VertexData.position(targetPrimitives[2], config.upwardU(), config.upwardV()), VertexData.normal(targetPrimitives[2]).scale(-modelScale / 2), Z_LINE, UPWARD_ARGB); } public void drawFocusedInModelArea(GuiGraphicsExtractor graphics) { @@ -212,8 +214,8 @@ public void drawFocusedInModelArea(GuiGraphicsExtractor graphics) { VertexData[] focused = focusedPolyhedron.getFirst(); VertexData[] reversed = new VertexData[focused.length]; for (int i = 0; i < focused.length; i++) reversed[i] = focused[focused.length - 1 - i]; - GUIHelper.triangleOrQuad(graphics, reversed, z1, focusedArgb); - for (VertexData[] primitive : focusedPolyhedron) GUIHelper.triangleOrQuad(graphics, primitive, z1, focusedArgb); + GUIHelper.triangleOrQuad(graphics, reversed, Z_QUAD, FOCUSED_ARGB); + for (VertexData[] primitive : focusedPolyhedron) GUIHelper.triangleOrQuad(graphics, primitive, Z_QUAD, FOCUSED_ARGB); } public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics, Matrix4f texturePose) { @@ -231,8 +233,8 @@ public void drawFocusedInTextureArea(GuiGraphicsExtractor graphics, Matrix4f tex position.set(vertex.u(), vertex.v(), 0).mulPosition(texturePose); transformed[i] = reversed[length - 1 - i] = VertexData.immutable(position.x(), position.y(), 0, vertex.argb(), vertex.u(), vertex.v(), vertex.overlay(), vertex.light(), 0, 0, 1); } - GUIHelper.triangleOrQuad(graphics, transformed, 0, focusedArgb); - GUIHelper.triangleOrQuad(graphics, reversed, 0, focusedArgb); + GUIHelper.triangleOrQuad(graphics, transformed, 0, FOCUSED_ARGB); + GUIHelper.triangleOrQuad(graphics, reversed, 0, FOCUSED_ARGB); } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 8fd1c0ba..3a3a3cca 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -4,21 +4,17 @@ import com.google.common.collect.ImmutableSortedMap; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.serialization.DataResult; import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.compat.CompatibilityHelper; import com.xtracr.realcamera.config.*; import com.xtracr.realcamera.config.BindTarget.BindConfig; import com.xtracr.realcamera.config.BindTarget.TargetConfig; -import com.xtracr.realcamera.gui.components.CycleIconButton; -import com.xtracr.realcamera.gui.components.DoubleSlider; -import com.xtracr.realcamera.gui.components.NumberField; -import com.xtracr.realcamera.gui.components.NumberWidgetPair; -import com.xtracr.realcamera.gui.components.SimpleIconButton; +import com.xtracr.realcamera.gui.components.*; import com.xtracr.realcamera.renderer.state.BuiltModelRecord; import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.util.LocUtil; import com.xtracr.realcamera.util.MathUtil; -import io.netty.buffer.Unpooled; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.*; @@ -31,7 +27,6 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.input.KeyEvent; import net.minecraft.client.input.MouseButtonEvent; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; @@ -43,12 +38,7 @@ import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.util.*; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.InflaterInputStream; public final class ModelViewScreen extends Screen { private static final int SELECTION_COLOR = 0x4F3333CC, SELECTION_HOVER_COLOR = 0x2F3333CC, OUTLINE_COLOR = 0xAAFFFFFF; @@ -506,50 +496,33 @@ private Vec2 translateXYToUV(float x, float y, ScreenRectangle screenArea) { } private void importBindTarget(Button button) { - FriendlyByteBuf byteBuf = null; - try { - String base64 = minecraft.keyboardHandler.getClipboard(); - byte[] compressed = Base64.getDecoder().decode(base64); - InflaterInputStream inflaterStream = new InflaterInputStream(new ByteArrayInputStream(compressed)); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[4096]; - int length; - while ((length = inflaterStream.read(buffer)) > 0) { - outputStream.write(buffer, 0, length); + String base64 = minecraft.keyboardHandler.getClipboard(); + DataResult result = BindTarget.fromCompressedBase64(base64); + switch (result) { + case DataResult.Success success -> { + BindTarget target = success.value(); + loadBindTarget(target); + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("importSucceeded", LocUtil.literal("'" + target.name() + "'").withStyle(ChatFormatting.WHITE)).withStyle(ChatFormatting.GREEN))); + } + case DataResult.Error error -> { + String message = error.message(); + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("importFailed", message).withStyle(ChatFormatting.RED))); } - byte[] bytes = outputStream.toByteArray(); - byteBuf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes)); - BindTarget target = BindTarget.read(byteBuf); - if (target.isEmpty()) throw new IllegalArgumentException("Invalid config format"); - loadBindTarget(target); - button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("importSucceeded", LocUtil.literal("'" + target.name() + "'").withStyle(ChatFormatting.WHITE)).withStyle(ChatFormatting.GREEN))); - } catch (Exception e) { - String message = e.getClass().getSimpleName(); - if (e instanceof IllegalArgumentException) message += ": " + e.getMessage(); - button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("importFailed", message).withStyle(ChatFormatting.RED))); - } finally { - if (byteBuf != null) byteBuf.release(); } } private void exportBindTarget(Button button) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - try { - genBindTarget().write(byteBuf); - byte[] bytes = new byte[byteBuf.readableBytes()]; - byteBuf.getBytes(byteBuf.readerIndex(), bytes); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try (DeflaterOutputStream deflaterStream = new DeflaterOutputStream(outputStream, new Deflater(Deflater.BEST_COMPRESSION))) { - deflaterStream.write(bytes); + DataResult result = genBindTarget().toCompressedBase64(); + switch (result) { + case DataResult.Success success -> { + String base64 = success.value(); + minecraft.keyboardHandler.setClipboard(base64); + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("exportSucceeded").withStyle(ChatFormatting.GREEN))); + } + case DataResult.Error error -> { + String message = error.message(); + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("exportFailed", message).withStyle(ChatFormatting.RED))); } - String base64 = Base64.getEncoder().encodeToString(outputStream.toByteArray()); - minecraft.keyboardHandler.setClipboard(base64); - button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("exportSucceeded").withStyle(ChatFormatting.GREEN))); - } catch (Exception e) { - String message = e.getClass().getSimpleName() + ": " + e.getMessage(); - button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("exportFailed", message).withStyle(ChatFormatting.RED))); - } finally { - byteBuf.release(); } } @@ -602,8 +575,7 @@ private BindTarget genBindTarget() { return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, disableConfigArray); } - @NonNull - private UVRectangleWidget addRectWidget(@NonNull UVRectangleWidget rectWidget) { + private UVRectangleWidget addRectWidget(UVRectangleWidget rectWidget) { UVRectangleWidget foundRectWidget = rectWidgets.stream().filter(r -> r.contains(rectWidget)).findFirst().orElse(null); if (foundRectWidget == null) { rectWidgets.add(rectWidget); diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java index 552056bf..b39ade48 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.MeshData; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormatElement; -import com.xtracr.realcamera.renderer.state.VertexData; import com.xtracr.realcamera.renderer.state.MutableVertex; +import com.xtracr.realcamera.renderer.state.VertexData; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java index c5ff03e4..9898fd0b 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/gui/GuiCulledModelsRenderer.java @@ -12,6 +12,8 @@ import org.jspecify.annotations.NonNull; public final class GuiCulledModelsRenderer extends PictureInPictureRenderer { + public static final int MIN_Z = 0, MAX_Z = 200; + public GuiCulledModelsRenderer(MultiBufferSource.BufferSource bufferSource) { super(bufferSource); } @@ -25,14 +27,14 @@ public GuiCulledModelsRenderer(MultiBufferSource.BufferSource bufferSource) { protected void renderToTexture(@NonNull GuiCulledModelsRenderState renderState, @NonNull PoseStack poseStack) { poseStack.mulPose(renderState.transform()); - float minEntityZ = 0f, maxEntityZ = 200f; + float minEntityZ = MIN_Z, maxEntityZ = MAX_Z; for (BuiltModelRecord record : renderState.records()) { for (VertexData vertex : record.vertices()) { if (vertex.z() < minEntityZ) minEntityZ = vertex.z(); if (vertex.z() > maxEntityZ) maxEntityZ = vertex.z(); } } - Matrix4f positionMatrix = poseStack.last().pose().scale(1, 1, 200 / (maxEntityZ - minEntityZ)).translate(0, 0, -minEntityZ); + Matrix4f positionMatrix = poseStack.last().pose().scale(1, 1, MAX_Z / (maxEntityZ - minEntityZ)).translate(0, 0, -minEntityZ); Matrix3f normalMatrix = new Matrix3f(positionMatrix); for (BuiltModelRecord record : renderState.records()) { VertexConsumer buffer = bufferSource.getBuffer(record.renderType()); From 9d1e2b0707b49bcf54aba2c4b53628c4b09a13f0 Mon Sep 17 00:00:00 2001 From: xTracr Date: Thu, 21 May 2026 12:50:30 +0800 Subject: [PATCH 21/34] Extract serialization to config.serialization package; inline widgets initialization - Move BindTarget/DisableConfig/OffsetConfig/UVRectangle read methods and DisableConfigAdapter to a versioned serialization package for forward compatibility. - Inline allModelViewScreen widget field initialization to declaration site. --- .../xtracr/realcamera/config/BindTarget.java | 94 ------------------- .../xtracr/realcamera/config/ConfigFile.java | 12 +-- .../realcamera/config/DisableConfig.java | 70 +------------- .../realcamera/config/OffsetConfig.java | 4 - .../xtracr/realcamera/config/UVRectangle.java | 4 - .../serialization/ConfigSerializer.java | 93 ++++++++++++++++++ .../serialization/ConfigSerializer703.java | 78 +++++++++++++++ .../serialization/DisableConfigAdapter.java | 62 ++++++++++++ .../realcamera/gui/ModelViewScreen.java | 79 +++++++--------- .../renderer/IterableVertexBuffer.java | 1 - 10 files changed, 276 insertions(+), 221 deletions(-) create mode 100644 common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer.java create mode 100644 common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java create mode 100644 common/src/main/java/com/xtracr/realcamera/config/serialization/DisableConfigAdapter.java diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index c36ab77e..2e226b8a 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -1,18 +1,10 @@ package com.xtracr.realcamera.config; -import com.mojang.serialization.DataResult; -import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.util.Arrays; -import java.util.Base64; import java.util.List; import java.util.function.Predicate; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.InflaterInputStream; public record BindTarget( String name, String textureId, int priority, float disablingDepth, @@ -22,7 +14,6 @@ public record BindTarget( DisableConfig[] disableConfigs) { public static final List DEFAULT_TARGETS; public static final BindTarget EMPTY = blank(null, null); - private static final short SERIAL_VERSION = 703; // 0.7.3 static { DEFAULT_TARGETS = List.of( @@ -39,58 +30,6 @@ public static BindTarget blank(String name, String textureId) { return new BindTarget(name, textureId, 0, 0.2f, targetConfig, bindConfig, new OffsetConfig(), new DisableConfig[0]); } - public static BindTarget read(FriendlyByteBuf byteBuf) throws IllegalArgumentException { - short version = byteBuf.readShort(); - if (version != SERIAL_VERSION) - throw new IllegalArgumentException("Invalid version: " + toSemVer(version) + ", expected " + toSemVer(SERIAL_VERSION)); - String name = byteBuf.readUtf(); - String textureId = byteBuf.readUtf(); - int priority = byteBuf.readVarInt(); - float disablingDepth = byteBuf.readFloat(); - TargetConfig targetConfig = TargetConfig.read(byteBuf); - BindConfig bindConfig = BindConfig.read(byteBuf); - OffsetConfig offsets = OffsetConfig.read(byteBuf); - DisableConfig[] disableConfigs = new DisableConfig[byteBuf.readVarInt()]; - for (int i = 0; i < disableConfigs.length; i++) { - disableConfigs[i] = DisableConfig.read(byteBuf); - } - return new BindTarget(name, textureId, priority, disablingDepth, targetConfig, bindConfig, offsets, disableConfigs); - } - - public static DataResult fromCompressedBase64(String base64) { - FriendlyByteBuf byteBuf = null; - try { - byte[] compressed = Base64.getDecoder().decode(base64); - InflaterInputStream inflaterStream = new InflaterInputStream(new ByteArrayInputStream(compressed)); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[4096]; - int length; - while ((length = inflaterStream.read(buffer)) > 0) { - outputStream.write(buffer, 0, length); - } - byte[] bytes = outputStream.toByteArray(); - byteBuf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes)); - BindTarget target = BindTarget.read(byteBuf); - if (target.isEmpty()) return DataResult.error(() -> "Invalid config format"); - return DataResult.success(target); - } catch (Exception e) { - return DataResult.error(() -> { - String message = e.getClass().getSimpleName(); - if (e instanceof IllegalArgumentException) message += ": " + e.getMessage(); - return message; - }); - } finally { - if (byteBuf != null) byteBuf.release(); - } - } - - private static String toSemVer(short version) { - int major = version / 10000; - int minor = version % 10000 / 100; - int patch = version % 100; - return major + "." + minor + "." + patch; - } - private static BindTarget vanillaTarget(String name, int priority, boolean shouldBind) { String textureId = name.contains("skin") ? "minecraft:skins/" : "minecraft:textures/entity/player/"; TargetConfig targetConfig = new TargetConfig(0.1875f, 0.2f, 0.1875f, 0.075f, 0.1875f, 0.2f); @@ -112,7 +51,6 @@ public DisableConfig[] filteredDisableConfigs(Predicate filter) { } public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeShort(SERIAL_VERSION); byteBuf.writeUtf(name); byteBuf.writeUtf(textureId); byteBuf.writeVarInt(priority); @@ -126,30 +64,7 @@ public void write(FriendlyByteBuf byteBuf) { } } - public DataResult toCompressedBase64() { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - try { - write(byteBuf); - byte[] bytes = new byte[byteBuf.readableBytes()]; - byteBuf.getBytes(byteBuf.readerIndex(), bytes); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try (DeflaterOutputStream deflaterStream = new DeflaterOutputStream(outputStream, new Deflater(Deflater.BEST_COMPRESSION))) { - deflaterStream.write(bytes); - } - String base64 = Base64.getEncoder().encodeToString(outputStream.toByteArray()); - return DataResult.success(base64); - } catch (Exception e) { - return DataResult.error(() -> e.getClass().getSimpleName() + ": " + e.getMessage()); - } finally { - byteBuf.release(); - } - } - public record TargetConfig(float forwardU, float forwardV, float upwardU, float upwardV, float posU, float posV) { - public static TargetConfig read(FriendlyByteBuf byteBuf) { - return new TargetConfig(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); - } - public void write(FriendlyByteBuf byteBuf) { byteBuf.writeFloat(forwardU); byteBuf.writeFloat(forwardV); @@ -161,15 +76,6 @@ public void write(FriendlyByteBuf byteBuf) { } public record BindConfig(boolean bindX, boolean bindY, boolean bindZ, boolean bindRotation) { - public static BindConfig read(FriendlyByteBuf byteBuf) { - byte bindFlags = byteBuf.readByte(); - boolean bindX = (bindFlags & 0x01) != 0; - boolean bindY = (bindFlags & 0x02) != 0; - boolean bindZ = (bindFlags & 0x04) != 0; - boolean bindRotation = (bindFlags & 0x08) != 0; - return new BindConfig(bindX, bindY, bindZ, bindRotation); - } - public void write(FriendlyByteBuf byteBuf) { byte bindFlags = 0; if (bindX) bindFlags |= 0x01; diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java index 5ef4f551..548ee8f9 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java @@ -21,12 +21,6 @@ public final class ConfigFile { @Nullable private static ModConfig config; - private static Path getPath() { - File configDir = new File(Minecraft.getInstance().gameDirectory, "config"); - if (!configDir.exists()) configDir.mkdirs(); - return configDir.toPath().resolve(FILE_NAME); - } - public static ModConfig config() { if (config == null) load(); return config; @@ -60,4 +54,10 @@ public static void reset() { RealCamera.LOGGER.warn("Failed to reset " + FILE_NAME, exception); } } + + private static Path getPath() { + File configDir = new File(Minecraft.getInstance().gameDirectory, "config"); + if (!configDir.exists()) configDir.mkdirs(); + return configDir.toPath().resolve(FILE_NAME); + } } diff --git a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java index 4a144e99..e4958ac2 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java @@ -1,17 +1,12 @@ package com.xtracr.realcamera.config; -import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; +import com.xtracr.realcamera.config.serialization.DisableConfigAdapter; import com.xtracr.realcamera.renderer.state.VertexData; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.network.FriendlyByteBuf; -import java.io.IOException; -import java.util.ArrayList; - -@JsonAdapter(DisableConfig.Adapter.class) +@JsonAdapter(DisableConfigAdapter.class) public final class DisableConfig { private final LongOpenHashSet disabledUVs = new LongOpenHashSet(), enabledUVs = new LongOpenHashSet(); private final String name; @@ -26,15 +21,6 @@ public DisableConfig(String name, String textureId, boolean disableAll, UVRectan this.rectangles = rectangles; } - public static DisableConfig read(FriendlyByteBuf byteBuf) { - String name = byteBuf.readUtf(); - String textureId = byteBuf.readUtf(); - boolean disableAll = byteBuf.readBoolean(); - UVRectangle[] rectangles = new UVRectangle[byteBuf.readVarInt()]; - for (int i = 0; i < rectangles.length; i++) rectangles[i] = UVRectangle.read(byteBuf); - return new DisableConfig(name, textureId, disableAll, rectangles); - } - public String name() { return name; } @@ -72,56 +58,4 @@ public boolean disable(VertexData vertex) { enabledUVs.add(packed); return false; } - - public static final class Adapter extends TypeAdapter { - @Override - public void write(JsonWriter out, DisableConfig value) throws IOException { - out.beginObject(); - out.name("name").value(value.name()); - out.name("textureId").value(value.textureId()); - out.name("disableAll").value(value.disableAll()); - out.name("rectangles"); - out.beginArray(); - for (UVRectangle rect : value.rectangles()) { - out.beginObject(); - out.name("uMin").value(rect.uMin()); - out.name("vMin").value(rect.vMin()); - out.name("uMax").value(rect.uMax()); - out.name("vMax").value(rect.vMax()); - out.endObject(); - } - out.endArray(); - out.endObject(); - } - - @Override - public DisableConfig read(JsonReader in) throws IOException { - in.beginObject(); - in.nextName(); - String name = in.nextString(); - in.nextName(); - String textureId = in.nextString(); - in.nextName(); - boolean disableAll = in.nextBoolean(); - in.nextName(); - in.beginArray(); - ArrayList rectangles = new ArrayList<>(); - while (in.hasNext()) { - in.beginObject(); - in.nextName(); - float uMin = (float) in.nextDouble(); - in.nextName(); - float vMin = (float) in.nextDouble(); - in.nextName(); - float uMax = (float) in.nextDouble(); - in.nextName(); - float vMax = (float) in.nextDouble(); - in.endObject(); - rectangles.add(new UVRectangle(uMin, vMin, uMax, vMax)); - } - in.endArray(); - in.endObject(); - return new DisableConfig(name, textureId, disableAll, rectangles.toArray(UVRectangle[]::new)); - } - } } diff --git a/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java b/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java index ea9cce32..22208f55 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java @@ -20,10 +20,6 @@ public OffsetConfig(float scale, float x, float y, float z, float pitch, float y this.roll = roll; } - public static OffsetConfig read(FriendlyByteBuf byteBuf) { - return new OffsetConfig(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); - } - public void clamp() { x = Mth.clamp(x, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); y = Mth.clamp(y, ModConfig.MIN_OFFSET_F, ModConfig.MAX_OFFSET_F); diff --git a/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java b/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java index 1a0708a4..252d269f 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java +++ b/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java @@ -3,10 +3,6 @@ import net.minecraft.network.FriendlyByteBuf; public record UVRectangle(float uMin, float vMin, float uMax, float vMax) { - public static UVRectangle read(FriendlyByteBuf byteBuf) { - return new UVRectangle(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); - } - public boolean contains(float u, float v) { return u >= uMin && u <= uMax && v >= vMin && v <= vMax; } diff --git a/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer.java b/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer.java new file mode 100644 index 00000000..f10e4dd4 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer.java @@ -0,0 +1,93 @@ +package com.xtracr.realcamera.config.serialization; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.DataResult; +import com.xtracr.realcamera.config.BindTarget; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.DecoderException; +import io.netty.handler.codec.EncoderException; +import net.minecraft.network.FriendlyByteBuf; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.Base64; +import java.util.Map; +import java.util.zip.Deflater; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.InflaterInputStream; + +public interface ConfigSerializer { + ConfigSerializer SERIALIZER_703 = new ConfigSerializer703(); + Map SERIALIZERS = ImmutableMap.of( + SERIALIZER_703.version(), SERIALIZER_703 + ); + + static BindTarget readWithVersion(FriendlyByteBuf byteBuf) throws DecoderException, IllegalArgumentException { + short version = byteBuf.readShort(); + ConfigSerializer serializer = SERIALIZERS.get(version); + if (serializer == null) throw new IllegalArgumentException("Incompatible version: " + toSemVer(version)); + return serializer.readBindTarget(byteBuf); + } + + static void writeWithVersion(BindTarget bindTarget, FriendlyByteBuf byteBuf) throws EncoderException { + byteBuf.writeShort(SERIALIZER_703.version()); + bindTarget.write(byteBuf); + } + + static DataResult fromCompressedBase64(String base64) { + FriendlyByteBuf byteBuf = null; + try { + byte[] compressed = Base64.getDecoder().decode(base64); + InflaterInputStream inflaterStream = new InflaterInputStream(new ByteArrayInputStream(compressed)); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int length; + while ((length = inflaterStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, length); + } + byte[] bytes = outputStream.toByteArray(); + byteBuf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes)); + BindTarget target = readWithVersion(byteBuf); + if (target.isEmpty()) return DataResult.error(() -> "Invalid config format"); + return DataResult.success(target); + } catch (Exception e) { + return DataResult.error(() -> { + String message = e.getClass().getSimpleName(); + if (e instanceof IllegalArgumentException) message += ": " + e.getMessage(); + return message; + }); + } finally { + if (byteBuf != null) byteBuf.release(); + } + } + + static DataResult toCompressedBase64(BindTarget bindTarget) { + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + try { + writeWithVersion(bindTarget, byteBuf); + byte[] bytes = new byte[byteBuf.readableBytes()]; + byteBuf.getBytes(byteBuf.readerIndex(), bytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (DeflaterOutputStream deflaterStream = new DeflaterOutputStream(outputStream, new Deflater(Deflater.BEST_COMPRESSION))) { + deflaterStream.write(bytes); + } + String base64 = Base64.getEncoder().encodeToString(outputStream.toByteArray()); + return DataResult.success(base64); + } catch (Exception e) { + return DataResult.error(() -> e.getClass().getSimpleName() + ": " + e.getMessage()); + } finally { + byteBuf.release(); + } + } + + private static String toSemVer(short version) { + int major = version / 10000; + int minor = version % 10000 / 100; + int patch = version % 100; + return major + "." + minor + "." + patch; + } + + short version(); + + BindTarget readBindTarget(FriendlyByteBuf byteBuf) throws DecoderException; +} diff --git a/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java b/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java new file mode 100644 index 00000000..9aa1b153 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java @@ -0,0 +1,78 @@ +package com.xtracr.realcamera.config.serialization; + +import com.xtracr.realcamera.config.BindTarget; +import com.xtracr.realcamera.config.DisableConfig; +import com.xtracr.realcamera.config.OffsetConfig; +import com.xtracr.realcamera.config.UVRectangle; +import io.netty.handler.codec.DecoderException; +import net.minecraft.network.FriendlyByteBuf; + +final class ConfigSerializer703 implements ConfigSerializer { + private static BindTarget.TargetConfig readTargetConfig(FriendlyByteBuf byteBuf) { + float forwardU = byteBuf.readFloat(); + float forwardV = byteBuf.readFloat(); + float upwardU = byteBuf.readFloat(); + float upwardV = byteBuf.readFloat(); + float posU = byteBuf.readFloat(); + float posV = byteBuf.readFloat(); + return new BindTarget.TargetConfig(forwardU, forwardV, upwardU, upwardV, posU, posV); + } + + private static BindTarget.BindConfig readBindConfig(FriendlyByteBuf byteBuf) { + byte bindFlags = byteBuf.readByte(); + boolean bindX = (bindFlags & 0x01) != 0; + boolean bindY = (bindFlags & 0x02) != 0; + boolean bindZ = (bindFlags & 0x04) != 0; + boolean bindRotation = (bindFlags & 0x08) != 0; + return new BindTarget.BindConfig(bindX, bindY, bindZ, bindRotation); + } + + private static OffsetConfig readOffsetConfig(FriendlyByteBuf byteBuf) { + float scale = byteBuf.readFloat(); + float x = byteBuf.readFloat(); + float y = byteBuf.readFloat(); + float z = byteBuf.readFloat(); + float pitch = byteBuf.readFloat(); + float yaw = byteBuf.readFloat(); + float roll = byteBuf.readFloat(); + return new OffsetConfig(scale, x, y, z, pitch, yaw, roll); + } + + private static DisableConfig readDisableConfig(FriendlyByteBuf byteBuf) { + String name = byteBuf.readUtf(); + String textureId = byteBuf.readUtf(); + boolean disableAll = byteBuf.readBoolean(); + UVRectangle[] rectangles = new UVRectangle[byteBuf.readVarInt()]; + for (int i = 0; i < rectangles.length; i++) rectangles[i] = readUVRectangle(byteBuf); + return new DisableConfig(name, textureId, disableAll, rectangles); + } + + private static UVRectangle readUVRectangle(FriendlyByteBuf byteBuf) { + float uMin = byteBuf.readFloat(); + float vMin = byteBuf.readFloat(); + float uMax = byteBuf.readFloat(); + float vMax = byteBuf.readFloat(); + return new UVRectangle(uMin, vMin, uMax, vMax); + } + + @Override + public short version() { + return 703; // 0.7.3 + } + + @Override + public BindTarget readBindTarget(FriendlyByteBuf byteBuf) throws DecoderException { + String name = byteBuf.readUtf(); + String textureId = byteBuf.readUtf(); + int priority = byteBuf.readVarInt(); + float disablingDepth = byteBuf.readFloat(); + BindTarget.TargetConfig targetConfig = readTargetConfig(byteBuf); + BindTarget.BindConfig bindConfig = readBindConfig(byteBuf); + OffsetConfig offsets = readOffsetConfig(byteBuf); + DisableConfig[] disableConfigs = new DisableConfig[byteBuf.readVarInt()]; + for (int i = 0; i < disableConfigs.length; i++) { + disableConfigs[i] = readDisableConfig(byteBuf); + } + return new BindTarget(name, textureId, priority, disablingDepth, targetConfig, bindConfig, offsets, disableConfigs); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/config/serialization/DisableConfigAdapter.java b/common/src/main/java/com/xtracr/realcamera/config/serialization/DisableConfigAdapter.java new file mode 100644 index 00000000..4ec8383a --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/serialization/DisableConfigAdapter.java @@ -0,0 +1,62 @@ +package com.xtracr.realcamera.config.serialization; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import com.xtracr.realcamera.config.DisableConfig; +import com.xtracr.realcamera.config.UVRectangle; + +import java.io.IOException; +import java.util.ArrayList; + +public final class DisableConfigAdapter extends TypeAdapter { + @Override + public void write(JsonWriter out, DisableConfig value) throws IOException { + out.beginObject(); + out.name("name").value(value.name()); + out.name("textureId").value(value.textureId()); + out.name("disableAll").value(value.disableAll()); + out.name("rectangles"); + out.beginArray(); + for (UVRectangle rect : value.rectangles()) { + out.beginObject(); + out.name("uMin").value(rect.uMin()); + out.name("vMin").value(rect.vMin()); + out.name("uMax").value(rect.uMax()); + out.name("vMax").value(rect.vMax()); + out.endObject(); + } + out.endArray(); + out.endObject(); + } + + @Override + public DisableConfig read(JsonReader in) throws IOException { + in.beginObject(); + in.nextName(); + String name = in.nextString(); + in.nextName(); + String textureId = in.nextString(); + in.nextName(); + boolean disableAll = in.nextBoolean(); + in.nextName(); + in.beginArray(); + ArrayList rectangles = new ArrayList<>(); + while (in.hasNext()) { + in.beginObject(); + in.nextName(); + float uMin = (float) in.nextDouble(); + in.nextName(); + float vMin = (float) in.nextDouble(); + in.nextName(); + float uMax = (float) in.nextDouble(); + in.nextName(); + float vMax = (float) in.nextDouble(); + in.endObject(); + rectangles.add(new UVRectangle(uMin, vMin, uMax, vMax)); + } + in.endArray(); + in.endObject(); + return new DisableConfig(name, textureId, disableAll, rectangles.toArray(UVRectangle[]::new)); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 3a3a3cca..76431770 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -10,6 +10,7 @@ import com.xtracr.realcamera.config.*; import com.xtracr.realcamera.config.BindTarget.BindConfig; import com.xtracr.realcamera.config.BindTarget.TargetConfig; +import com.xtracr.realcamera.config.serialization.ConfigSerializer; import com.xtracr.realcamera.gui.components.*; import com.xtracr.realcamera.renderer.state.BuiltModelRecord; import com.xtracr.realcamera.renderer.state.VertexData; @@ -58,15 +59,25 @@ public final class ModelViewScreen extends Screen { private VertexData[][] focusedPolyhedron = new VertexData[0][]; @Nullable private UVRectangleWidget focusedRectWidget; - private StringWidget rectWidgetsSizeWidget; - private EditBox textureIdField, nameField, disabledNameField, disabledIdField; - private NumberField priorityField, focusedRectWidgetNumberField; - private NumberField forwardUField, forwardVField, upwardUField, upwardVField, posUField, posVField; - private NumberField uMinField, vMinField, uMaxField, vMaxField; - private NumberField scaleField, depthField; - private final List disableConfigs = new ArrayList<>(); - private final List rectWidgets = new ArrayList<>(); - private final Map> hiddenNameMap = new HashMap<>(); + private final StringWidget rectWidgetsSizeWidget = new StringWidget(widgetWidth - 22, widgetHeight, CommonComponents.EMPTY, font); + private final EditBox nameField = createTextField(wideWidgetWidth, 20); + private final EditBox textureIdField = createTextField(wideWidgetWidth, 1024); + private final EditBox disabledNameField = createTextField(compactWidgetWidth, 20); + private final EditBox disabledIdField = createTextField(wideWidgetWidth, 1024); + private final NumberField priorityField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, null); + private final NumberField focusedRectWidgetNumberField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, null).setMin(0); + private final NumberField forwardUField = createFloatField(widgetWidth, 0); + private final NumberField forwardVField = createFloatField(widgetWidth, 0); + private final NumberField upwardUField = createFloatField(widgetWidth, 0); + private final NumberField upwardVField = createFloatField(widgetWidth, 0); + private final NumberField posUField = createFloatField(widgetWidth, 0); + private final NumberField posVField = createFloatField(widgetWidth, 0); + private final NumberField uMinField = createFloatField(widgetWidth * 2 - 24, 0).setMin(-1f).setMax(2f); + private final NumberField uMaxField = createFloatField(widgetWidth * 2 - 24, 0).setMin(-1f).setMax(2f); + private final NumberField vMinField = createFloatField(widgetWidth * 2 - 24, 0).setMin(-1f).setMax(2f); + private final NumberField vMaxField = createFloatField(widgetWidth * 2 - 24, 0).setMin(-1f).setMax(2f); + private final NumberField scaleField = createFloatField(widgetWidth, 1.0f).setMax(64.0f); + private final NumberField depthField = createFloatField(widgetWidth, 0.2f).setMax(16.0f); private final CycleIconButton showTextureButton = new CycleIconButton(48, 16, 0, 2).setOnValueChange(_ -> initWidgets(page)); private final CycleIconButton pauseButton = new CycleIconButton(0, 16, 0, 2); private final CycleIconButton bindXButton = new CycleIconButton(16, 16, 1, 2); @@ -81,6 +92,9 @@ public final class ModelViewScreen extends Screen { private final NumberWidgetPair offsetPitchPair = new NumberWidgetPair(font, "pitch", compactWidgetWidth, widgetHeight, -180.0f, 180.0f); private final NumberWidgetPair offsetYawPair = new NumberWidgetPair(font, "yaw", compactWidgetWidth, widgetHeight, -180.0f, 180.0f); private final NumberWidgetPair offsetRollPair = new NumberWidgetPair(font, "roll", compactWidgetWidth, widgetHeight, -180.0f, 180.0f); + private final List disableConfigs = new ArrayList<>(); + private final List rectWidgets = new ArrayList<>(); + private final Map> hiddenNameMap = new HashMap<>(); private final List widgetPairs = List.of(offsetXPair, offsetYPair, offsetZPair, offsetPitchPair, offsetYawPair, offsetRollPair); private final CycleButton selectingButton = createCyclingButtonBuilder(ImmutableSortedMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("forwardVector").withStyle(ChatFormatting.GREEN), @@ -160,22 +174,6 @@ private void initWidgets(int page) { } private void initLeftWidgets() { - rectWidgetsSizeWidget = new StringWidget(x + 4 + widgetWidth + 5 + font.width("/"), y + 4 + (widgetHeight + 2) * 3, widgetWidth - 22, widgetHeight, LocUtil.literal(String.valueOf(rectWidgets.size())), font); - forwardUField = createFloatField(widgetWidth, 0, forwardUField); - forwardVField = createFloatField(widgetWidth, 0, forwardVField); - upwardUField = createFloatField(widgetWidth, 0, upwardUField); - upwardVField = createFloatField(widgetWidth, 0, upwardVField); - posUField = createFloatField(widgetWidth, 0, posUField); - posVField = createFloatField(widgetWidth, 0, posVField); - textureIdField = createTextField(wideWidgetWidth, 1024, textureIdField); - disabledIdField = createTextField(wideWidgetWidth, 1024, disabledIdField); - focusedRectWidgetNumberField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, focusedRectWidgetNumberField).setMin(0).setMax(rectWidgets.size()); - uMinField = createFloatField(widgetWidth * 2 - 24, 0, uMinField).setMin(-1f).setMax(2f); - uMaxField = createFloatField(widgetWidth * 2 - 24, 0, uMaxField).setMin(-1f).setMax(2f); - vMinField = createFloatField(widgetWidth * 2 - 24, 0, vMinField).setMin(-1f).setMax(2f); - vMaxField = createFloatField(widgetWidth * 2 - 24, 0, vMaxField).setMin(-1f).setMax(2f); - scaleField = createFloatField(widgetWidth, 1.0f, scaleField).setMax(64.0f); - depthField = createFloatField(widgetWidth, 0.2f, depthField).setMax(16.0f); GridLayout grid = new GridLayout(); grid.defaultCellSetting().padding(4, 2, 0, 0); LayoutSettings smallSettings = grid.newCellSettings().padding(5, 3, 1, 1); @@ -217,7 +215,7 @@ private void initLeftWidgets() { rows.addChild(disableModeButton, 2); rows.addChild(disabledIdField, 2, smallSettings).setTooltip(createTooltip("textureId")); rows.addChild(selectionModeButton, 2); - rows.addChild(focusedRectWidgetNumberField, smallSettings).setOnValueChange(index -> { + rows.addChild(focusedRectWidgetNumberField.setMax(rectWidgets.size()), smallSettings).setOnValueChange(index -> { if (index == 0) focusedRectWidget = null; else if (index > 0 && index <= rectWidgets.size()) { focusedRectWidget = rectWidgets.get(index - 1); @@ -228,6 +226,8 @@ else if (index > 0 && index <= rectWidgets.size()) { } }).setTooltip(createTooltip("focusedRectangleNumber")); addRenderableWidget(new StringWidget(x + 4 + widgetWidth + 3, y + 4 + (widgetHeight + 2) * 3, 6, widgetHeight, LocUtil.literal("/"), font)); + rectWidgetsSizeWidget.setPosition(x + 4 + widgetWidth + 5 + font.width("/"), y + 4 + (widgetHeight + 2) * 3); + rectWidgetsSizeWidget.setMessage(LocUtil.literal(String.valueOf(rectWidgets.size()))); addRenderableWidget(rectWidgetsSizeWidget); rows.addChild(new SimpleIconButton(48, 0, _ -> deleteFocusedRectWidget()), grid.newCellSettings().padding(5 + widgetWidth - 18, 3, 1, 1)) .setTooltip(createTooltip("deleteSelectedRectangle")); @@ -262,15 +262,14 @@ else if (index > 0 && index <= rectWidgets.size()) { loadBindTarget(bindTarget); initWidgets(page); })); - rows.addChild(priorityField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, priorityField), smallSettings).setTooltip(createTooltip("priority")); - rows.addChild(nameField = createTextField(wideWidgetWidth, 20, nameField), 2, smallSettings).setTooltip(createTooltip("targetName")); + rows.addChild(priorityField, smallSettings).setTooltip(createTooltip("priority")); + rows.addChild(nameField, 2, smallSettings).setTooltip(createTooltip("targetName")); grid.arrangeElements(); FrameLayout.alignInRectangle(grid, x, y + 2, x + (xSize - middleWidth) / 2 - 4, y + ySize, 0, 0); grid.visitWidgets(this::addRenderableWidget); } private void initRightWidgets() { - disabledNameField = createTextField(compactWidgetWidth, 20, disabledNameField); GridLayout grid = new GridLayout(); grid.defaultCellSetting().padding(4, 2, 0, 0); LayoutSettings smallSettings = grid.newCellSettings().padding(5, 3, 1, 1); @@ -497,7 +496,7 @@ private Vec2 translateXYToUV(float x, float y, ScreenRectangle screenArea) { private void importBindTarget(Button button) { String base64 = minecraft.keyboardHandler.getClipboard(); - DataResult result = BindTarget.fromCompressedBase64(base64); + DataResult result = ConfigSerializer.fromCompressedBase64(base64); switch (result) { case DataResult.Success success -> { BindTarget target = success.value(); @@ -512,7 +511,8 @@ private void importBindTarget(Button button) { } private void exportBindTarget(Button button) { - DataResult result = genBindTarget().toCompressedBase64(); + BindTarget target = genBindTarget(); + DataResult result = ConfigSerializer.toCompressedBase64(target); switch (result) { case DataResult.Success success -> { String base64 = success.value(); @@ -557,15 +557,7 @@ private void loadBindTarget(BindTarget target) { private BindTarget genBindTarget() { TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); - OffsetConfig offsets = new OffsetConfig( - scaleField.getNumber(), - offsetXPair.getNumber(), - offsetYPair.getNumber(), - offsetZPair.getNumber(), - offsetPitchPair.getNumber(), - offsetYawPair.getNumber(), - offsetRollPair.getNumber() - ); + OffsetConfig offsets = new OffsetConfig(scaleField.getNumber(), offsetXPair.getNumber(), offsetYPair.getNumber(), offsetZPair.getNumber(), offsetPitchPair.getNumber(), offsetYawPair.getNumber(), offsetRollPair.getNumber()); DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toArray(UVRectangle[]::new)); DisableConfig[] disableConfigArray = disableConfigs.toArray(new DisableConfig[0]); for (int i = 0; i < disableConfigArray.length; i++) { @@ -607,14 +599,13 @@ private DoubleSlider createSlider(String key, int width, double min, double max) return new DoubleSlider(width, widgetHeight, 0, min, max, d -> LocUtil.MODEL_VIEW_WIDGET(key, MathUtil.round(d, 2))); } - private NumberField createFloatField(int width, float defaultValue, @Nullable NumberField copyFrom) { - return NumberField.ofFloat(font, width - 2, widgetHeight - 2, defaultValue, copyFrom).setMax(1.0f).setMin(0f); + private NumberField createFloatField(int width, float defaultValue) { + return NumberField.ofFloat(font, width - 2, widgetHeight - 2, defaultValue, null).setMax(1.0f).setMin(0f); } - private EditBox createTextField(int width, int maxLength, @Nullable EditBox copyFrom) { + private EditBox createTextField(int width, int maxLength) { EditBox editBox = new EditBox(font, 0, 0, width - 2, widgetHeight - 2, CommonComponents.EMPTY); editBox.setMaxLength(maxLength); - if (copyFrom != null) editBox.setValue(copyFrom.getValue()); return editBox; } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java index b39ade48..9395c67d 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/IterableVertexBuffer.java @@ -289,7 +289,6 @@ public int characteristics() { return ORDERED | SIZED | SUBSIZED | NONNULL; } } - } private final class FastQuadReader implements Iterable { From 279e2b1d422dd319d9f8d6b9038e43eeedc6a9db Mon Sep 17 00:00:00 2001 From: xTracr Date: Sun, 14 Jun 2026 00:52:18 +0800 Subject: [PATCH 22/34] Refactor serialization to StreamCodec - Simplify renderCameraEntity matrix transform - Migrate from FriendlyByteBuf manual read/write to Minecraft StreamCodec - Rename config.serialization package to config.codec - Change array fields in config classes to list fields - Remove all manual write(FriendlyByteBuf) methods from config classes - DisableConfigAdapter: suppress unused nextName() returns with String _ --- .../com/xtracr/realcamera/RealCameraCore.java | 8 +- .../xtracr/realcamera/config/BindTarget.java | 45 ++------- .../realcamera/config/DisableConfig.java | 19 ++-- .../realcamera/config/OffsetConfig.java | 11 --- .../xtracr/realcamera/config/UVRectangle.java | 9 -- .../ConfigCodec.java} | 31 +++--- .../config/codec/ConfigCodec703.java | 95 +++++++++++++++++++ .../DisableConfigAdapter.java | 20 ++-- .../serialization/ConfigSerializer703.java | 78 --------------- .../realcamera/gui/ModelViewScreen.java | 22 ++--- gradle.properties | 8 +- gradle/wrapper/gradle-wrapper.properties | 3 +- 12 files changed, 151 insertions(+), 198 deletions(-) rename common/src/main/java/com/xtracr/realcamera/config/{serialization/ConfigSerializer.java => codec/ConfigCodec.java} (76%) create mode 100644 common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java rename common/src/main/java/com/xtracr/realcamera/config/{serialization => codec}/DisableConfigAdapter.java (84%) delete mode 100644 common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 4cd9e7ba..673c8ffc 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -99,12 +99,8 @@ public static void computeCamera(Minecraft client, float partialTicks) { } public static void renderCameraEntity(Minecraft client, float partialTicks, SubmitNodeCollector submitNodeCollector, Matrix4f modelView) { - Vec3 targetEulerAngle = MathUtil.getEulerAngleYXZ(lastResult.getRotation()); - Matrix4f invertedCameraPose = new Matrix4f() - .rotateZ((float) targetEulerAngle.z()) - .rotateX((float) targetEulerAngle.x()) - .rotateY((float) (Math.PI - targetEulerAngle.y())) - .transpose() + Matrix4f invertedCameraPose = new Matrix4f(lastResult.getRotation()) + .scale(-1f, 1f, -1f) .invert() .translate(Vec3.ZERO.subtract(lastResult.getPosition()).toVector3f()); PoseStack poseStack = new PoseStack(); diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index 2e226b8a..10fb3f06 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -1,8 +1,5 @@ package com.xtracr.realcamera.config; -import net.minecraft.network.FriendlyByteBuf; - -import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @@ -11,7 +8,7 @@ public record BindTarget( TargetConfig targetConfig, BindConfig bindConfig, OffsetConfig offsets, - DisableConfig[] disableConfigs) { + List disableConfigs) { public static final List DEFAULT_TARGETS; public static final BindTarget EMPTY = blank(null, null); @@ -27,7 +24,7 @@ public record BindTarget( public static BindTarget blank(String name, String textureId) { TargetConfig targetConfig = new TargetConfig(0, 0, 0, 0, 0, 0); BindConfig bindConfig = new BindConfig(false, true, false, false); - return new BindTarget(name, textureId, 0, 0.2f, targetConfig, bindConfig, new OffsetConfig(), new DisableConfig[0]); + return new BindTarget(name, textureId, 0, 0.2f, targetConfig, bindConfig, new OffsetConfig(), List.of()); } private static BindTarget vanillaTarget(String name, int priority, boolean shouldBind) { @@ -36,9 +33,9 @@ private static BindTarget vanillaTarget(String name, int priority, boolean shoul BindConfig bindConfig = new BindConfig(shouldBind, true, shouldBind, shouldBind); OffsetConfig offsets = new OffsetConfig(); offsets.x = -0.1f; - DisableConfig playerHead = new DisableConfig("player_head", textureId, false, new UVRectangle[]{new UVRectangle(0, 0, 1.0f, 0.25f)}); - DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, new UVRectangle[0]); - DisableConfig[] disableConfigs = new DisableConfig[]{playerHead, dragonHead}; + DisableConfig playerHead = new DisableConfig("player_head", textureId, false, List.of(new UVRectangle(0, 0, 1.0f, 0.25f))); + DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, List.of()); + List disableConfigs = List.of(playerHead, dragonHead); return new BindTarget(name, textureId, priority, 0.2f, targetConfig, bindConfig, offsets, disableConfigs); } @@ -47,42 +44,12 @@ public boolean isEmpty() { } public DisableConfig[] filteredDisableConfigs(Predicate filter) { - return Arrays.stream(disableConfigs).filter(filter).toArray(DisableConfig[]::new); - } - - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeUtf(name); - byteBuf.writeUtf(textureId); - byteBuf.writeVarInt(priority); - byteBuf.writeFloat(disablingDepth); - targetConfig.write(byteBuf); - bindConfig.write(byteBuf); - offsets.write(byteBuf); - byteBuf.writeVarInt(disableConfigs.length); - for (DisableConfig disableConfig : disableConfigs) { - disableConfig.write(byteBuf); - } + return disableConfigs.stream().filter(filter).toArray(DisableConfig[]::new); } public record TargetConfig(float forwardU, float forwardV, float upwardU, float upwardV, float posU, float posV) { - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeFloat(forwardU); - byteBuf.writeFloat(forwardV); - byteBuf.writeFloat(upwardU); - byteBuf.writeFloat(upwardV); - byteBuf.writeFloat(posU); - byteBuf.writeFloat(posV); - } } public record BindConfig(boolean bindX, boolean bindY, boolean bindZ, boolean bindRotation) { - public void write(FriendlyByteBuf byteBuf) { - byte bindFlags = 0; - if (bindX) bindFlags |= 0x01; - if (bindY) bindFlags |= 0x02; - if (bindZ) bindFlags |= 0x04; - if (bindRotation) bindFlags |= 0x08; - byteBuf.writeByte(bindFlags); - } } } diff --git a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java index e4958ac2..4572c856 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java @@ -1,10 +1,11 @@ package com.xtracr.realcamera.config; import com.google.gson.annotations.JsonAdapter; -import com.xtracr.realcamera.config.serialization.DisableConfigAdapter; +import com.xtracr.realcamera.config.codec.DisableConfigAdapter; import com.xtracr.realcamera.renderer.state.VertexData; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import net.minecraft.network.FriendlyByteBuf; + +import java.util.List; @JsonAdapter(DisableConfigAdapter.class) public final class DisableConfig { @@ -12,9 +13,9 @@ public final class DisableConfig { private final String name; private final String textureId; private final boolean disableAll; - private final UVRectangle[] rectangles; + private final List rectangles; - public DisableConfig(String name, String textureId, boolean disableAll, UVRectangle[] rectangles) { + public DisableConfig(String name, String textureId, boolean disableAll, List rectangles) { this.name = name; this.textureId = textureId; this.disableAll = disableAll; @@ -33,18 +34,10 @@ public boolean disableAll() { return disableAll; } - public UVRectangle[] rectangles() { + public List rectangles() { return rectangles; } - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeUtf(name); - byteBuf.writeUtf(textureId); - byteBuf.writeBoolean(disableAll); - byteBuf.writeVarInt(rectangles.length); - for (UVRectangle rect : rectangles) rect.write(byteBuf); - } - public boolean disable(VertexData vertex) { final float u = vertex.u(), v = vertex.v(); final long packed = (long) Float.floatToIntBits(u) << 32 | Float.floatToIntBits(v); diff --git a/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java b/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java index 22208f55..e3dded99 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/OffsetConfig.java @@ -1,6 +1,5 @@ package com.xtracr.realcamera.config; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; public final class OffsetConfig { @@ -28,14 +27,4 @@ public void clamp() { yaw = Mth.wrapDegrees(yaw); roll = Mth.wrapDegrees(roll); } - - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeFloat(scale); - byteBuf.writeFloat(x); - byteBuf.writeFloat(y); - byteBuf.writeFloat(z); - byteBuf.writeFloat(pitch); - byteBuf.writeFloat(yaw); - byteBuf.writeFloat(roll); - } } diff --git a/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java b/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java index 252d269f..320a906a 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java +++ b/common/src/main/java/com/xtracr/realcamera/config/UVRectangle.java @@ -1,16 +1,7 @@ package com.xtracr.realcamera.config; -import net.minecraft.network.FriendlyByteBuf; - public record UVRectangle(float uMin, float vMin, float uMax, float vMax) { public boolean contains(float u, float v) { return u >= uMin && u <= uMax && v >= vMin && v <= vMax; } - - public void write(FriendlyByteBuf byteBuf) { - byteBuf.writeFloat(uMin); - byteBuf.writeFloat(vMin); - byteBuf.writeFloat(uMax); - byteBuf.writeFloat(vMax); - } } diff --git a/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java similarity index 76% rename from common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer.java rename to common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java index f10e4dd4..61900302 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java @@ -1,12 +1,13 @@ -package com.xtracr.realcamera.config.serialization; +package com.xtracr.realcamera.config.codec; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.DataResult; import com.xtracr.realcamera.config.BindTarget; +import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.EncoderException; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -16,26 +17,26 @@ import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; -public interface ConfigSerializer { - ConfigSerializer SERIALIZER_703 = new ConfigSerializer703(); - Map SERIALIZERS = ImmutableMap.of( +public interface ConfigCodec extends StreamCodec { + ConfigCodec SERIALIZER_703 = new ConfigCodec703(); + Map SERIALIZERS = ImmutableMap.of( SERIALIZER_703.version(), SERIALIZER_703 ); - static BindTarget readWithVersion(FriendlyByteBuf byteBuf) throws DecoderException, IllegalArgumentException { + static BindTarget readWithVersion(ByteBuf byteBuf) throws DecoderException, IllegalArgumentException { short version = byteBuf.readShort(); - ConfigSerializer serializer = SERIALIZERS.get(version); + ConfigCodec serializer = SERIALIZERS.get(version); if (serializer == null) throw new IllegalArgumentException("Incompatible version: " + toSemVer(version)); - return serializer.readBindTarget(byteBuf); + return serializer.decode(byteBuf); } - static void writeWithVersion(BindTarget bindTarget, FriendlyByteBuf byteBuf) throws EncoderException { + static void writeWithVersion(ByteBuf byteBuf, BindTarget bindTarget) throws EncoderException { byteBuf.writeShort(SERIALIZER_703.version()); - bindTarget.write(byteBuf); + SERIALIZER_703.encode(byteBuf, bindTarget); } static DataResult fromCompressedBase64(String base64) { - FriendlyByteBuf byteBuf = null; + ByteBuf byteBuf = null; try { byte[] compressed = Base64.getDecoder().decode(base64); InflaterInputStream inflaterStream = new InflaterInputStream(new ByteArrayInputStream(compressed)); @@ -46,7 +47,7 @@ static DataResult fromCompressedBase64(String base64) { outputStream.write(buffer, 0, length); } byte[] bytes = outputStream.toByteArray(); - byteBuf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes)); + byteBuf = Unpooled.wrappedBuffer(bytes); BindTarget target = readWithVersion(byteBuf); if (target.isEmpty()) return DataResult.error(() -> "Invalid config format"); return DataResult.success(target); @@ -62,9 +63,9 @@ static DataResult fromCompressedBase64(String base64) { } static DataResult toCompressedBase64(BindTarget bindTarget) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + ByteBuf byteBuf = Unpooled.buffer(); try { - writeWithVersion(bindTarget, byteBuf); + writeWithVersion(byteBuf, bindTarget); byte[] bytes = new byte[byteBuf.readableBytes()]; byteBuf.getBytes(byteBuf.readerIndex(), bytes); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); @@ -88,6 +89,4 @@ private static String toSemVer(short version) { } short version(); - - BindTarget readBindTarget(FriendlyByteBuf byteBuf) throws DecoderException; } diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java new file mode 100644 index 00000000..59a681e2 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java @@ -0,0 +1,95 @@ +package com.xtracr.realcamera.config.codec; + +import com.xtracr.realcamera.config.BindTarget; +import com.xtracr.realcamera.config.BindTarget.BindConfig; +import com.xtracr.realcamera.config.BindTarget.TargetConfig; +import com.xtracr.realcamera.config.DisableConfig; +import com.xtracr.realcamera.config.OffsetConfig; +import com.xtracr.realcamera.config.UVRectangle; +import io.netty.buffer.ByteBuf; +import io.netty.handler.codec.DecoderException; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import org.jspecify.annotations.NonNull; + +import java.util.List; + +final class ConfigCodec703 implements ConfigCodec { + static final StreamCodec TARGET_CONFIG_CODEC = StreamCodec.composite( + ByteBufCodecs.FLOAT, TargetConfig::forwardU, + ByteBufCodecs.FLOAT, TargetConfig::forwardV, + ByteBufCodecs.FLOAT, TargetConfig::upwardU, + ByteBufCodecs.FLOAT, TargetConfig::upwardV, + ByteBufCodecs.FLOAT, TargetConfig::posU, + ByteBufCodecs.FLOAT, TargetConfig::posV, + TargetConfig::new + ); + static final StreamCodec BIND_CONFIG_CODEC = StreamCodec.composite( + ByteBufCodecs.BYTE, + bindConfig -> { + byte bindFlags = 0; + if (bindConfig.bindX()) bindFlags |= 0x01; + if (bindConfig.bindY()) bindFlags |= 0x02; + if (bindConfig.bindZ()) bindFlags |= 0x04; + if (bindConfig.bindRotation()) bindFlags |= 0x08; + return bindFlags; + }, + bindFlags -> { + boolean bindX = (bindFlags & 0x01) != 0; + boolean bindY = (bindFlags & 0x02) != 0; + boolean bindZ = (bindFlags & 0x04) != 0; + boolean bindRotation = (bindFlags & 0x08) != 0; + return new BindConfig(bindX, bindY, bindZ, bindRotation); + } + ); + static final StreamCodec OFFSET_CONFIG_CODEC = StreamCodec.composite( + ByteBufCodecs.FLOAT, offsets -> offsets.x, + ByteBufCodecs.FLOAT, offsets -> offsets.x, + ByteBufCodecs.FLOAT, offsets -> offsets.y, + ByteBufCodecs.FLOAT, offsets -> offsets.z, + ByteBufCodecs.FLOAT, offsets -> offsets.pitch, + ByteBufCodecs.FLOAT, offsets -> offsets.yaw, + ByteBufCodecs.FLOAT, offsets -> offsets.roll, + OffsetConfig::new + ); + static final StreamCodec> UV_RECTANGLES_CODEC = StreamCodec.composite( + ByteBufCodecs.FLOAT, UVRectangle::uMin, + ByteBufCodecs.FLOAT, UVRectangle::vMin, + ByteBufCodecs.FLOAT, UVRectangle::uMax, + ByteBufCodecs.FLOAT, UVRectangle::vMax, + UVRectangle::new + ).apply(ByteBufCodecs.list()); + static final StreamCodec> DISABLE_CONFIGS_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, DisableConfig::name, + ByteBufCodecs.STRING_UTF8, DisableConfig::textureId, + ByteBufCodecs.BOOL, DisableConfig::disableAll, + UV_RECTANGLES_CODEC, DisableConfig::rectangles, + DisableConfig::new + ).apply(ByteBufCodecs.list()); + static final StreamCodec BIND_TARGET_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, BindTarget::name, + ByteBufCodecs.STRING_UTF8, BindTarget::textureId, + ByteBufCodecs.VAR_INT, BindTarget::priority, + ByteBufCodecs.FLOAT, BindTarget::disablingDepth, + TARGET_CONFIG_CODEC, BindTarget::targetConfig, + BIND_CONFIG_CODEC, BindTarget::bindConfig, + OFFSET_CONFIG_CODEC, BindTarget::offsets, + DISABLE_CONFIGS_CODEC, BindTarget::disableConfigs, + BindTarget::new + ); + + @Override + public short version() { + return 703; // 0.7.3 + } + + @Override + public @NonNull BindTarget decode(@NonNull ByteBuf byteBuf) throws DecoderException { + return BIND_TARGET_CODEC.decode(byteBuf); + } + + @Override + public void encode(@NonNull ByteBuf byteBuf, @NonNull BindTarget bindTarget) { + BIND_TARGET_CODEC.encode(byteBuf, bindTarget); + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/config/serialization/DisableConfigAdapter.java b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java similarity index 84% rename from common/src/main/java/com/xtracr/realcamera/config/serialization/DisableConfigAdapter.java rename to common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java index 4ec8383a..9f51eb65 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/serialization/DisableConfigAdapter.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java @@ -1,4 +1,4 @@ -package com.xtracr.realcamera.config.serialization; +package com.xtracr.realcamera.config.codec; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; @@ -33,30 +33,30 @@ public void write(JsonWriter out, DisableConfig value) throws IOException { @Override public DisableConfig read(JsonReader in) throws IOException { in.beginObject(); - in.nextName(); + String _ = in.nextName(); String name = in.nextString(); - in.nextName(); + String _ = in.nextName(); String textureId = in.nextString(); - in.nextName(); + String _ = in.nextName(); boolean disableAll = in.nextBoolean(); - in.nextName(); + String _ = in.nextName(); in.beginArray(); ArrayList rectangles = new ArrayList<>(); while (in.hasNext()) { in.beginObject(); - in.nextName(); + String _ = in.nextName(); float uMin = (float) in.nextDouble(); - in.nextName(); + String _ = in.nextName(); float vMin = (float) in.nextDouble(); - in.nextName(); + String _ = in.nextName(); float uMax = (float) in.nextDouble(); - in.nextName(); + String _ = in.nextName(); float vMax = (float) in.nextDouble(); in.endObject(); rectangles.add(new UVRectangle(uMin, vMin, uMax, vMax)); } in.endArray(); in.endObject(); - return new DisableConfig(name, textureId, disableAll, rectangles.toArray(UVRectangle[]::new)); + return new DisableConfig(name, textureId, disableAll, rectangles); } } diff --git a/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java b/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java deleted file mode 100644 index 9aa1b153..00000000 --- a/common/src/main/java/com/xtracr/realcamera/config/serialization/ConfigSerializer703.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.xtracr.realcamera.config.serialization; - -import com.xtracr.realcamera.config.BindTarget; -import com.xtracr.realcamera.config.DisableConfig; -import com.xtracr.realcamera.config.OffsetConfig; -import com.xtracr.realcamera.config.UVRectangle; -import io.netty.handler.codec.DecoderException; -import net.minecraft.network.FriendlyByteBuf; - -final class ConfigSerializer703 implements ConfigSerializer { - private static BindTarget.TargetConfig readTargetConfig(FriendlyByteBuf byteBuf) { - float forwardU = byteBuf.readFloat(); - float forwardV = byteBuf.readFloat(); - float upwardU = byteBuf.readFloat(); - float upwardV = byteBuf.readFloat(); - float posU = byteBuf.readFloat(); - float posV = byteBuf.readFloat(); - return new BindTarget.TargetConfig(forwardU, forwardV, upwardU, upwardV, posU, posV); - } - - private static BindTarget.BindConfig readBindConfig(FriendlyByteBuf byteBuf) { - byte bindFlags = byteBuf.readByte(); - boolean bindX = (bindFlags & 0x01) != 0; - boolean bindY = (bindFlags & 0x02) != 0; - boolean bindZ = (bindFlags & 0x04) != 0; - boolean bindRotation = (bindFlags & 0x08) != 0; - return new BindTarget.BindConfig(bindX, bindY, bindZ, bindRotation); - } - - private static OffsetConfig readOffsetConfig(FriendlyByteBuf byteBuf) { - float scale = byteBuf.readFloat(); - float x = byteBuf.readFloat(); - float y = byteBuf.readFloat(); - float z = byteBuf.readFloat(); - float pitch = byteBuf.readFloat(); - float yaw = byteBuf.readFloat(); - float roll = byteBuf.readFloat(); - return new OffsetConfig(scale, x, y, z, pitch, yaw, roll); - } - - private static DisableConfig readDisableConfig(FriendlyByteBuf byteBuf) { - String name = byteBuf.readUtf(); - String textureId = byteBuf.readUtf(); - boolean disableAll = byteBuf.readBoolean(); - UVRectangle[] rectangles = new UVRectangle[byteBuf.readVarInt()]; - for (int i = 0; i < rectangles.length; i++) rectangles[i] = readUVRectangle(byteBuf); - return new DisableConfig(name, textureId, disableAll, rectangles); - } - - private static UVRectangle readUVRectangle(FriendlyByteBuf byteBuf) { - float uMin = byteBuf.readFloat(); - float vMin = byteBuf.readFloat(); - float uMax = byteBuf.readFloat(); - float vMax = byteBuf.readFloat(); - return new UVRectangle(uMin, vMin, uMax, vMax); - } - - @Override - public short version() { - return 703; // 0.7.3 - } - - @Override - public BindTarget readBindTarget(FriendlyByteBuf byteBuf) throws DecoderException { - String name = byteBuf.readUtf(); - String textureId = byteBuf.readUtf(); - int priority = byteBuf.readVarInt(); - float disablingDepth = byteBuf.readFloat(); - BindTarget.TargetConfig targetConfig = readTargetConfig(byteBuf); - BindTarget.BindConfig bindConfig = readBindConfig(byteBuf); - OffsetConfig offsets = readOffsetConfig(byteBuf); - DisableConfig[] disableConfigs = new DisableConfig[byteBuf.readVarInt()]; - for (int i = 0; i < disableConfigs.length; i++) { - disableConfigs[i] = readDisableConfig(byteBuf); - } - return new BindTarget(name, textureId, priority, disablingDepth, targetConfig, bindConfig, offsets, disableConfigs); - } -} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 76431770..e7d5fe46 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -10,7 +10,7 @@ import com.xtracr.realcamera.config.*; import com.xtracr.realcamera.config.BindTarget.BindConfig; import com.xtracr.realcamera.config.BindTarget.TargetConfig; -import com.xtracr.realcamera.config.serialization.ConfigSerializer; +import com.xtracr.realcamera.config.codec.ConfigCodec; import com.xtracr.realcamera.gui.components.*; import com.xtracr.realcamera.renderer.state.BuiltModelRecord; import com.xtracr.realcamera.renderer.state.VertexData; @@ -291,7 +291,7 @@ private void initRightWidgets() { button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyTextureId").withStyle(ChatFormatting.RED))); } else { button.setTooltip(createTooltip("saveAs")); - DisableConfig disableConfig = new DisableConfig(name, textureId, disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toArray(UVRectangle[]::new)); + DisableConfig disableConfig = new DisableConfig(name, textureId, disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); for (int i = 0; i < disableConfigs.size(); i++) { if (disableConfigs.get(i).name().equals(name)) { disableConfigs.set(i, disableConfig); @@ -496,7 +496,7 @@ private Vec2 translateXYToUV(float x, float y, ScreenRectangle screenArea) { private void importBindTarget(Button button) { String base64 = minecraft.keyboardHandler.getClipboard(); - DataResult result = ConfigSerializer.fromCompressedBase64(base64); + DataResult result = ConfigCodec.fromCompressedBase64(base64); switch (result) { case DataResult.Success success -> { BindTarget target = success.value(); @@ -512,7 +512,7 @@ private void importBindTarget(Button button) { private void exportBindTarget(Button button) { BindTarget target = genBindTarget(); - DataResult result = ConfigSerializer.toCompressedBase64(target); + DataResult result = ConfigCodec.toCompressedBase64(target); switch (result) { case DataResult.Success success -> { String base64 = success.value(); @@ -551,20 +551,20 @@ private void loadBindTarget(BindTarget target) { offsetYawPair.setNumber(offsets.yaw); offsetRollPair.setNumber(offsets.roll); disableConfigs.clear(); - disableConfigs.addAll(List.of(target.disableConfigs())); + disableConfigs.addAll(target.disableConfigs()); } private BindTarget genBindTarget() { TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); OffsetConfig offsets = new OffsetConfig(scaleField.getNumber(), offsetXPair.getNumber(), offsetYPair.getNumber(), offsetZPair.getNumber(), offsetPitchPair.getNumber(), offsetYawPair.getNumber(), offsetRollPair.getNumber()); - DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toArray(UVRectangle[]::new)); - DisableConfig[] disableConfigArray = disableConfigs.toArray(new DisableConfig[0]); - for (int i = 0; i < disableConfigArray.length; i++) { - if (disableConfigArray[i].name().equals(currentDisableConfig.name())) - disableConfigArray[i] = currentDisableConfig; + DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); + List newDisableConfigs = new ArrayList<>(disableConfigs); + for (int i = 0; i < newDisableConfigs.size(); i++) { + if (newDisableConfigs.get(i).name().equals(currentDisableConfig.name())) + newDisableConfigs.set(i, currentDisableConfig); } - return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, disableConfigArray); + return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, newDisableConfigs); } private UVRectangleWidget addRectWidget(UVRectangleWidget rectWidget) { diff --git a/gradle.properties b/gradle.properties index d91b01e5..1539e38e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,14 +7,14 @@ java_version=25 minecraft_version=26.1.2 enabled_platforms=fabric,neoforge loom_version=1.16-SNAPSHOT -fabric_loader_version=0.19.2 -neoforge_version=26.1.2.36-beta +fabric_loader_version=0.19.3 +neoforge_version=26.1.2.73 moddev_version=2.0.141 ## Mod Properties mod_id=realcamera mod_version=0.7.8-beta mod_group_id=com.xtracr.realcamera ## Dependencies -fabric_api_version=0.147.0+26.1.2 +fabric_api_version=0.150.0+26.1.2 cloth_config_version=26.1.154 -modmenu_version=18.0.0-alpha.8 +modmenu_version=18.0.0-beta.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 358d405e..1a704683 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Tue May 12 13:08:14 CST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From d1b16d4c4bb503e6083dfb892b3d62b332bec319 Mon Sep 17 00:00:00 2001 From: xTracr Date: Tue, 16 Jun 2026 13:05:06 +0800 Subject: [PATCH 23/34] Some minor improvements --- .../xtracr/realcamera/config/ConfigFile.java | 1 + .../com/xtracr/realcamera/config/ModConfig.java | 4 ++-- .../realcamera/config/codec/ConfigCodec.java | 17 ++++++++--------- .../realcamera/config/codec/ConfigCodec703.java | 2 +- .../gui/components/NumberWidgetPair.java | 12 ++++++------ .../xtracr/realcamera/mixin/MixinCamera.java | 4 ++-- .../realcamera/mixin/MixinGameRenderer.java | 4 ++-- .../realcamera/mixin/MixinLocalPlayer.java | 5 +++-- .../renderer/BuiltIterableBuffer.java | 1 + gradle.properties | 2 +- 10 files changed, 27 insertions(+), 25 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java index 548ee8f9..e5af6e36 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java @@ -55,6 +55,7 @@ public static void reset() { } } + @SuppressWarnings("ResultOfMethodCallIgnored") private static Path getPath() { File configDir = new File(Minecraft.getInstance().gameDirectory, "config"); if (!configDir.exists()) configDir.mkdirs(); diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index 55b69d56..4fea0a8f 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -12,13 +12,13 @@ public final class ModConfig { public static final double MIN_OFFSET_D = -1.0, MAX_OFFSET_D = 1.0; public static final float MIN_OFFSET_F = -1.0f, MAX_OFFSET_F = 1.0f; + public final Classic classic = new Classic(); + public final Binding binding = new Binding(); public boolean enabled = false; public boolean isClassic = false; public boolean dynamicCrosshair = false; public boolean renderModel = true; public double adjustStep = 0.01; - public Classic classic = new Classic(); - public Binding binding = new Binding(); public void clamp() { adjustStep = Mth.clamp(adjustStep, 0.0, MAX_OFFSET_D); diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java index 61900302..bde2f41f 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java @@ -1,38 +1,37 @@ package com.xtracr.realcamera.config.codec; -import com.google.common.collect.ImmutableMap; import com.mojang.serialization.DataResult; import com.xtracr.realcamera.config.BindTarget; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.EncoderException; +import it.unimi.dsi.fastutil.shorts.Short2ReferenceMap; import net.minecraft.network.codec.StreamCodec; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Base64; -import java.util.Map; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; public interface ConfigCodec extends StreamCodec { - ConfigCodec SERIALIZER_703 = new ConfigCodec703(); - Map SERIALIZERS = ImmutableMap.of( - SERIALIZER_703.version(), SERIALIZER_703 + ConfigCodec CODEC_703 = new ConfigCodec703(); + Short2ReferenceMap CODECS = Short2ReferenceMap.ofEntries( + Short2ReferenceMap.entry(CODEC_703.version(), CODEC_703) ); static BindTarget readWithVersion(ByteBuf byteBuf) throws DecoderException, IllegalArgumentException { short version = byteBuf.readShort(); - ConfigCodec serializer = SERIALIZERS.get(version); - if (serializer == null) throw new IllegalArgumentException("Incompatible version: " + toSemVer(version)); + ConfigCodec serializer = CODECS.get(version); + if (serializer == null) throw new IllegalArgumentException("Incompatible version: " + toSemVer(version)); return serializer.decode(byteBuf); } static void writeWithVersion(ByteBuf byteBuf, BindTarget bindTarget) throws EncoderException { - byteBuf.writeShort(SERIALIZER_703.version()); - SERIALIZER_703.encode(byteBuf, bindTarget); + byteBuf.writeShort(CODEC_703.version()); + CODEC_703.encode(byteBuf, bindTarget); } static DataResult fromCompressedBase64(String base64) { diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java index 59a681e2..b662afc7 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java @@ -43,7 +43,7 @@ final class ConfigCodec703 implements ConfigCodec { } ); static final StreamCodec OFFSET_CONFIG_CODEC = StreamCodec.composite( - ByteBufCodecs.FLOAT, offsets -> offsets.x, + ByteBufCodecs.FLOAT, offsets -> offsets.scale, ByteBufCodecs.FLOAT, offsets -> offsets.x, ByteBufCodecs.FLOAT, offsets -> offsets.y, ByteBufCodecs.FLOAT, offsets -> offsets.z, diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java index a610039d..6013ab89 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/NumberWidgetPair.java @@ -24,13 +24,17 @@ public NumberWidgetPair(Font font, String translationKey, int width, int height, setUseSlider(true); } + public float getNumber() { + return isUseSlider() ? (float) slider.getNumber() : field.getNumber(); + } + public void setNumber(float value) { slider.setNumber(value); field.setNumber(value); } - public float getNumber() { - return isUseSlider() ? (float) slider.getNumber() : field.getNumber(); + public boolean isUseSlider() { + return useSlider; } public void setUseSlider(boolean useSlider) { @@ -39,10 +43,6 @@ public void setUseSlider(boolean useSlider) { field.active = !useSlider; } - public boolean isUseSlider() { - return useSlider; - } - public void syncAndSwitch(boolean useSlider) { setUseSlider(useSlider); if (useSlider) slider.setNumber(field.getNumber()); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java index e9d20c15..3f84c012 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java @@ -119,10 +119,10 @@ public abstract class MixinCamera { protected abstract float calculateFov(float partialTicks); @Shadow - protected abstract void move(float x, float y, float z); + protected abstract void move(float forwards, float up, float right); @Shadow - protected abstract void setRotation(float yaw, float pitch); + protected abstract void setRotation(float yRot, float xRot); @Shadow protected abstract void setPosition(Vec3 position); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java index 897705e6..9818279f 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java @@ -24,10 +24,10 @@ public abstract class MixinGameRenderer { private Camera mainCamera; @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;update(Lnet/minecraft/client/DeltaTracker;)V")) - private void realcamera$atCameraUpdate(DeltaTracker deltaTracker, boolean renderLevel, CallbackInfo ci) { + private void realcamera$atCameraUpdate(DeltaTracker deltaTracker, boolean advanceGameTime, CallbackInfo ci) { float partialTicks = deltaTracker.getGameTimeDeltaPartialTick(true); CompatibilityHelper.NEA_setDeltaTick(partialTicks); - RealCameraCore.initialize(minecraft, renderLevel); + RealCameraCore.initialize(minecraft, advanceGameTime); if (RealCameraCore.isActive() && !ConfigFile.config().isClassic) { minecraft.getEntityRenderDispatcher().prepare(mainCamera, minecraft.crosshairPickEntity); RealCameraCore.computeCamera(minecraft, partialTicks); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java index 1e69cefa..fe437128 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java @@ -36,7 +36,7 @@ public MixinLocalPlayer(ClientLevel world, GameProfile profile) { } @WrapOperation(method = "pick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ProjectileUtil;getEntityHitResult(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;D)Lnet/minecraft/world/phys/EntityHitResult;")) - private static @Nullable EntityHitResult realcamera$wrapGetEntityHitResult(Entity except, Vec3 from, Vec3 to, AABB box, Predicate matching, double maxValue, Operation original, Entity cameraEntity, double blockInteractionRange, double entityInteractionRange, float partialTicks) { + private static @Nullable EntityHitResult realcamera$wrapGetEntityHitResult(Entity except, Vec3 from, Vec3 _to, AABB box, Predicate matching, double maxValue, Operation original, Entity cameraEntity, double blockInteractionRange, double entityInteractionRange, float partialTicks) { if (!ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { double interactionRange = Math.max(blockInteractionRange, entityInteractionRange); Pair fromAndTo = RaycastUtil.getFromAndTo(cameraEntity, interactionRange * interactionRange, partialTicks); @@ -48,7 +48,7 @@ public MixinLocalPlayer(ClientLevel world, GameProfile profile) { CrosshairUtil.capturedEntityHitResult = ProjectileUtil.getEntityHitResult(except, newFrom, newTo, newBox, matching, sqDistance); return CrosshairUtil.capturedEntityHitResult; } - return original.call(except, from, to, box, matching, maxValue); + return original.call(except, from, _to, box, matching, maxValue); } @Inject(method = "getRopeHoldPosition", at = @At("HEAD"), cancellable = true) @@ -56,6 +56,7 @@ public MixinLocalPlayer(ClientLevel world, GameProfile profile) { if (DisableHelper.RENDER_HANDS.disabled(this)) cir.setReturnValue(super.getRopeHoldPosition(partialTickTime)); } + @SuppressWarnings("resource") @Override public @NonNull HitResult pick(double maxDistance, float partialTicks, boolean includeFluids) { if (!ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java index 2f307a72..45f27f86 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/BuiltIterableBuffer.java @@ -29,6 +29,7 @@ public static BuiltIterableBuffer buildFrom(RenderType renderType, MeshData mesh return primitives; } + @SuppressWarnings("ResultOfMethodCallIgnored") public VertexData[] @Nullable [] findPrimitives(UV[] uvs) { int uvsLength = uvs.length; VertexData[][] primitives = new VertexData[uvsLength][]; diff --git a/gradle.properties b/gradle.properties index 1539e38e..4a404320 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -# Done to increase the memory available to gradle. +# Done to increase the memory available to Gradle. org.gradle.jvmargs=-Xmx4G -XX:+UseG1GC org.gradle.parallel=true org.gradle.configuration-cache=false From f37a309389da40dc8ade5f78bd686a065924e53a Mon Sep 17 00:00:00 2001 From: rsdadada Date: Tue, 23 Jun 2026 19:14:50 +0800 Subject: [PATCH 24/34] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=8B=89=E5=8F=96?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=20#213?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix model view config interactions * Clarify disable setting add tooltip --- .../realcamera/gui/ModelViewScreen.java | 167 ++++++++++++++---- .../assets/realcamera/lang/be_by.json | 4 +- .../assets/realcamera/lang/en_us.json | 4 +- .../assets/realcamera/lang/es_es.json | 4 +- .../assets/realcamera/lang/fr_fr.json | 4 +- .../assets/realcamera/lang/ja_jp.json | 4 +- .../assets/realcamera/lang/ko_kr.json | 4 +- .../resources/assets/realcamera/lang/lzh.json | 4 +- .../assets/realcamera/lang/pl_pl.json | 4 +- .../assets/realcamera/lang/pt_br.json | 4 +- .../assets/realcamera/lang/pt_pt.json | 4 +- .../assets/realcamera/lang/ru_ru.json | 4 +- .../assets/realcamera/lang/tr_tr.json | 4 +- .../assets/realcamera/lang/uk_ua.json | 4 +- .../assets/realcamera/lang/zh_cn.json | 4 +- .../assets/realcamera/lang/zh_hk.json | 4 +- .../assets/realcamera/lang/zh_tw.json | 4 +- 17 files changed, 168 insertions(+), 63 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index e7d5fe46..7c071f39 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -45,6 +45,7 @@ public final class ModelViewScreen extends Screen { private static final int SELECTION_COLOR = 0x4F3333CC, SELECTION_HOVER_COLOR = 0x2F3333CC, OUTLINE_COLOR = 0xAAFFFFFF; private static final int SIDE_PANEL_BG = 0xFF444444, CENTER_PANEL_BG = 0xFF222222; private static final int DEFAULT_SCALE = 80, MIN_SCALE = 16, MAX_SCALE = 1024; + private static final int CONFIG_NAME_MAX_LENGTH = 20; private final int xSize = 450, ySize = 206, middleWidth = xSize - 200, widgetWidth = (xSize - middleWidth) / 4 - 8, widgetHeight = 18, wideWidgetWidth = widgetWidth * 2 + 4, compactWidgetWidth = widgetWidth * 2 - 18; private int x, y, page = 0; private InputConstants.Key modifierKey = InputConstants.getKey(ConfigFile.config().binding.screenModifierKey); @@ -60,9 +61,9 @@ public final class ModelViewScreen extends Screen { @Nullable private UVRectangleWidget focusedRectWidget; private final StringWidget rectWidgetsSizeWidget = new StringWidget(widgetWidth - 22, widgetHeight, CommonComponents.EMPTY, font); - private final EditBox nameField = createTextField(wideWidgetWidth, 20); + private final EditBox nameField = createTextField(wideWidgetWidth, CONFIG_NAME_MAX_LENGTH); private final EditBox textureIdField = createTextField(wideWidgetWidth, 1024); - private final EditBox disabledNameField = createTextField(compactWidgetWidth, 20); + private final EditBox disabledNameField = createTextField(compactWidgetWidth, CONFIG_NAME_MAX_LENGTH); private final EditBox disabledIdField = createTextField(wideWidgetWidth, 1024); private final NumberField priorityField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, null); private final NumberField focusedRectWidgetNumberField = NumberField.ofInt(font, widgetWidth - 2, widgetHeight - 2, 0, null).setMin(0); @@ -255,14 +256,21 @@ else if (index > 0 && index <= rectWidgets.size()) { button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyName").withStyle(ChatFormatting.RED))); return; } + if (textureIdField.getValue().isBlank()) { + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyTextureId").withStyle(ChatFormatting.RED))); + return; + } + if (toggleCategoryButton.getValue() == Category.DISABLE && !syncDisableDraft(button, true)) return; button.setTooltip(null); BindTarget bindTarget = genBindTarget(); ConfigFile.config().putBindTarget(bindTarget); ConfigFile.save(); - loadBindTarget(bindTarget); initWidgets(page); })); rows.addChild(priorityField, smallSettings).setTooltip(createTooltip("priority")); + boolean editableName = toggleCategoryButton.getValue() == Category.CONFIGS; + nameField.setEditable(editableName); + if (!editableName && nameField.isFocused()) nameField.setFocused(false); rows.addChild(nameField, 2, smallSettings).setTooltip(createTooltip("targetName")); grid.arrangeElements(); FrameLayout.alignInRectangle(grid, x, y + 2, x + (xSize - middleWidth) / 2 - 4, y + ySize, 0, 0); @@ -284,22 +292,8 @@ private void initRightWidgets() { size = disableConfigs.size(); rows.addChild(disabledNameField, 3, smallSettings).setTooltip(createTooltip("disabledName")); rows.addChild(new SimpleIconButton(64, 0, button -> { - String name = disabledNameField.getValue(), textureId = disabledIdField.getValue(); - if (name.isBlank()) { - button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyName").withStyle(ChatFormatting.RED))); - } else if (textureId.isBlank()) { - button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyTextureId").withStyle(ChatFormatting.RED))); - } else { + if (syncDisableDraft(button, false)) { button.setTooltip(createTooltip("saveAs")); - DisableConfig disableConfig = new DisableConfig(name, textureId, disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); - for (int i = 0; i < disableConfigs.size(); i++) { - if (disableConfigs.get(i).name().equals(name)) { - disableConfigs.set(i, disableConfig); - initWidgets(page); - return; - } - } - disableConfigs.add(disableConfig); initWidgets(page); } }), smallSettings).setTooltip(createTooltip("saveAs")); @@ -314,16 +308,13 @@ private void initRightWidgets() { }) .setPosition(x + (xSize + middleWidth) / 2 - 20, y + 5 + (widgetHeight + 2) * (2 + i % widgetsPerPage)); rows.addChild(createButton(LocUtil.literal(config.name()), compactWidgetWidth, _ -> { - disabledNameField.setValue(config.name()); - disabledIdField.setValue(config.textureId()); - disableModeButton.setValue(config.disableAll() ? 0 : 1); - rectWidgets.clear(); - for (UVRectangle rect : config.rectangles()) rectWidgets.add(createRectWidget(rect)); + loadDisableConfig(config); initWidgets(page); }), 3).setTooltip(Tooltip.create(LocUtil.literal(config.name()))); rows.addChild(new SimpleIconButton(48, 0, _ -> { disableConfigs.removeIf(disableConfig -> disableConfig.name().equals(config.name())); - if (disabledNameField.getValue().equals(config.name())) rectWidgets.clear(); + hiddenNameMap.values().forEach(names -> names.remove(config.name())); + if (disabledNameField.getValue().equals(config.name())) clearDisableDraft(); initWidgets(page * widgetsPerPage > size - 2 && size > 1 ? page - 1 : page); }), smallSettings); } @@ -335,6 +326,7 @@ private void initRightWidgets() { size = fixedTargetCount + targetList.size(); for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { BindTarget target = i < fixedTargetCount ? fixedTargetList.get(i) : targetList.get(i - fixedTargetCount); + final int targetIndex = i; String name = target.name(); rows.addChild(createButton(LocUtil.literal(name), compactWidgetWidth, _ -> loadBindTarget(target)), 3) .setTooltip(Tooltip.create(name.equals(RealCameraCore.currentTarget().name()) ? @@ -345,6 +337,7 @@ private void initRightWidgets() { rows.addChild(new SimpleIconButton(48, 0, _ -> { targetList.remove(target); ConfigFile.save(); + if (nameField.getValue().equals(target.name())) loadAdjacentBindTarget(fixedTargetList, targetList, targetIndex); initWidgets(page * widgetsPerPage > size - 2 && size > 1 ? page - 1 : page); }), smallSettings); } @@ -526,6 +519,123 @@ private void exportBindTarget(Button button) { } } + private void clearDisableDraft() { + disabledNameField.setValue(""); + disabledIdField.setValue(""); + focusedRectWidget = null; + rectWidgets.clear(); + focusedRectWidgetNumberField.setMax(0); + focusedRectWidgetNumberField.setNumber(0); + rectWidgetsSizeWidget.setMessage(LocUtil.literal("0")); + uMinField.setNumber(0f); + vMinField.setNumber(0f); + uMaxField.setNumber(0f); + vMaxField.setNumber(0f); + } + + private void loadDisableConfig(DisableConfig config) { + disabledNameField.setValue(config.name()); + disabledIdField.setValue(config.textureId()); + disableModeButton.setValue(config.disableAll() ? 0 : 1); + focusedRectWidget = null; + rectWidgets.clear(); + for (UVRectangle rect : config.rectangles()) rectWidgets.add(createRectWidget(rect)); + focusedRectWidgetNumberField.setMax(rectWidgets.size()); + focusedRectWidgetNumberField.setNumber(0); + rectWidgetsSizeWidget.setMessage(LocUtil.literal(String.valueOf(rectWidgets.size()))); + } + + private boolean syncDisableDraft(Button button, boolean autoName) { + String name = disabledNameField.getValue(); + String textureId = disabledIdField.getValue(); + if (name.isBlank()) { + if (!autoName) { + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyName").withStyle(ChatFormatting.RED))); + return false; + } + if (!hasMeaningfulDisableDraft()) { + if (textureId.isBlank() && !rectWidgets.isEmpty()) { + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyTextureId").withStyle(ChatFormatting.RED))); + return false; + } + return true; + } + name = generateDisableConfigName(textureId); + disabledNameField.setValue(name); + } + if (textureId.isBlank()) { + button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyTextureId").withStyle(ChatFormatting.RED))); + return false; + } + DisableConfig disableConfig = new DisableConfig(name, textureId, disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); + upsertDisableConfig(disableConfig); + return true; + } + + private boolean hasMeaningfulDisableDraft() { + return !disabledIdField.getValue().isBlank() && (disableModeButton.getValue() == 0 || !rectWidgets.isEmpty()); + } + + private void upsertDisableConfig(DisableConfig disableConfig) { + for (int i = 0; i < disableConfigs.size(); i++) { + if (disableConfigs.get(i).name().equals(disableConfig.name())) { + disableConfigs.set(i, disableConfig); + return; + } + } + disableConfigs.add(disableConfig); + } + + private String generateDisableConfigName(String textureId) { + String base = textureId.trim(); + int separatorIndex = Math.max(base.lastIndexOf('/'), base.lastIndexOf(':')); + if (separatorIndex >= 0 && separatorIndex < base.length() - 1) base = base.substring(separatorIndex + 1); + int extensionIndex = base.lastIndexOf('.'); + if (extensionIndex > 0) base = base.substring(0, extensionIndex); + base = sanitizeDisableConfigName(base); + if (base.length() > CONFIG_NAME_MAX_LENGTH) base = base.substring(0, CONFIG_NAME_MAX_LENGTH); + + String candidate = base; + for (int suffix = 2; disableConfigNameExists(candidate); suffix++) { + String suffixText = "_" + suffix; + int baseLength = Math.min(base.length(), Math.max(1, CONFIG_NAME_MAX_LENGTH - suffixText.length())); + candidate = base.substring(0, baseLength) + suffixText; + } + return candidate; + } + + private String sanitizeDisableConfigName(String name) { + StringBuilder builder = new StringBuilder(); + boolean lastWasSeparator = false; + for (int i = 0; i < name.length(); i++) { + char c = Character.toLowerCase(name.charAt(i)); + if (Character.isLetterOrDigit(c)) { + builder.append(c); + lastWasSeparator = false; + } else if ((c == '_' || c == '-') && builder.length() > 0 && !lastWasSeparator) { + builder.append(c); + lastWasSeparator = true; + } else if (builder.length() > 0 && !lastWasSeparator) { + builder.append('_'); + lastWasSeparator = true; + } + } + while (!builder.isEmpty() && (builder.charAt(builder.length() - 1) == '_' || builder.charAt(builder.length() - 1) == '-')) + builder.deleteCharAt(builder.length() - 1); + return builder.isEmpty() ? "disable" : builder.toString(); + } + + private boolean disableConfigNameExists(String name) { + return disableConfigs.stream().anyMatch(disableConfig -> disableConfig.name().equals(name)); + } + + private void loadAdjacentBindTarget(List fixedTargetList, List targetList, int deletedIndex) { + List targets = new ArrayList<>(fixedTargetList); + targets.addAll(targetList); + if (targets.isEmpty()) loadBindTarget(BindTarget.blank("", "")); + else loadBindTarget(targets.get(Math.min(deletedIndex, targets.size() - 1))); + } + private void loadBindTarget(BindTarget target) { if (target.isEmpty()) return; nameField.setValue(target.name()); @@ -552,19 +662,14 @@ private void loadBindTarget(BindTarget target) { offsetRollPair.setNumber(offsets.roll); disableConfigs.clear(); disableConfigs.addAll(target.disableConfigs()); + clearDisableDraft(); } private BindTarget genBindTarget() { TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); OffsetConfig offsets = new OffsetConfig(scaleField.getNumber(), offsetXPair.getNumber(), offsetYPair.getNumber(), offsetZPair.getNumber(), offsetPitchPair.getNumber(), offsetYawPair.getNumber(), offsetRollPair.getNumber()); - DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); - List newDisableConfigs = new ArrayList<>(disableConfigs); - for (int i = 0; i < newDisableConfigs.size(); i++) { - if (newDisableConfigs.get(i).name().equals(currentDisableConfig.name())) - newDisableConfigs.set(i, currentDisableConfig); - } - return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, newDisableConfigs); + return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, new ArrayList<>(disableConfigs)); } private UVRectangleWidget addRectWidget(UVRectangleWidget rectWidget) { diff --git a/common/src/main/resources/assets/realcamera/lang/be_by.json b/common/src/main/resources/assets/realcamera/lang/be_by.json index 7c8ee0ce..9d9bcf82 100644 --- a/common/src/main/resources/assets/realcamera/lang/be_by.json +++ b/common/src/main/resources/assets/realcamera/lang/be_by.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпарт %s паспяховы!", "screen.tooltip.xtracr_realcamera.modelView_preview": "У рэжыме прадпрагляду вы можаце наладжваць зрух і паварот камеры", "screen.tooltip.xtracr_realcamera.modelView_priority": "Прыярытэт пры прывязцы, чым больш значэнне, тым вышэй прыярытэт і размяшчэнне справей у спісе", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Захаваць як\n(Калі існуе канфігурацыя з такой жа назвай, вы таксама можаце націснуць кнопку захавання злева)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Дадаць/абнавіць гэту наладу адключэння\nНацісніце Захаваць злева, каб захаваць канфігурацыю", "screen.tooltip.xtracr_realcamera.modelView_scale": "Маштаб, які кіруе памерам зрухаў", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Левы клік каб атрымаць UV-каардынаты пад паказальнікам мышы\nТры наборы UV-каардынат ніжэй, зверху ўніз, гэта UV-каардынаты вектара наперад, вектара уверх і пункту прывязкі на мэтавай плоскасці\nЗаўвага: %s+Пракрутка каб пераключацца паміж рознымі слаямі мадэлі. Увод UV-каардынат уручную дазваляе дакладней прывязацца да мэтавай пазіцыі", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Вызначае рэжым хуткага выбару %s+Левы клік\n(%s+Пракрутка каб змяніць дыяпазон выбару ў рэжыме дыяпазону)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектар уверх", "screen.widget.xtracr_realcamera.modelView_yaw": "Рысканне = %s", "screen.xtracr_realcamera.modelView_title": "Прагляд мадэлі" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index 73f7e51a..6742f95a 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s succeeded!", "screen.tooltip.xtracr_realcamera.modelView_preview": "In the preview mode, you can adjust the camera's offset and rotation", "screen.tooltip.xtracr_realcamera.modelView_priority": "Priority when binding, the larger the value the higher the priority, and the higher the sorting on the right side", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Save as\n(When there is a setting with the same name, you can also press the save button on the left)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Add/update this disable setting\nPress Save on the left to save the config", "screen.tooltip.xtracr_realcamera.modelView_scale": "Scale, which controls the size of the offsets", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Left Click to get the UV coordinates at the mouse pointer\nThe three sets of UV coordinates below are, from top to bottom, the UV coordinates of the forward vector, the upward vector, and the binding point on the target plane\nNote: %s+Scroll to switch between the different layers of the model. Manually inputting UV coordinates allows you to bind more accurately to the target position", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Decide the mode of %s+Left Click quick selection\n(%s+Scroll to change the selection range in the range mode)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Upward Vector", "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", "screen.xtracr_realcamera.modelView_title": "Model View" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/es_es.json b/common/src/main/resources/assets/realcamera/lang/es_es.json index 5139d5df..34a28c5f 100644 --- a/common/src/main/resources/assets/realcamera/lang/es_es.json +++ b/common/src/main/resources/assets/realcamera/lang/es_es.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "¡Importación %s exitosa!", "screen.tooltip.xtracr_realcamera.modelView_preview": "En el modo de vista previa, puedes ajustar el desplazamiento y rotación de la cámara", "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridad al vincular, cuanto mayor sea el valor, mayor será la prioridad y más alto será el orden en el lado derecho", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Guardar como\n(Cuando existe una configuración con el mismo nombre, también puede usar el botón guardar a la izquierda)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Añadir/actualizar este ajuste de desactivación\nPulsa Guardar a la izquierda para guardar la configuración", "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla el tamaño de los desplazamientos", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clic izquierdo para obtener las coordenadas UV en el puntero del ratón\nLos tres conjuntos de coordenadas UV a continuación son, de arriba a abajo, las coordenadas UV del vector adelante, el vector arriba y el punto de vinculación en el plano objetivo\nNota: %s+Desplazarse para cambiar entre las diferentes capas del modelo. Ingresar manualmente las coordenadas UV permite vincular con mayor precisión a la posición objetivo", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina el modo de selección rápida %s+Clic izquierdo\n(%s+Desplazarse para cambiar el rango de selección en el modo de rango)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vector Arriba", "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", "screen.xtracr_realcamera.modelView_title": "Vista de Modelo" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/fr_fr.json b/common/src/main/resources/assets/realcamera/lang/fr_fr.json index a174e7ea..627a22e0 100644 --- a/common/src/main/resources/assets/realcamera/lang/fr_fr.json +++ b/common/src/main/resources/assets/realcamera/lang/fr_fr.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importation %s réussie !", "screen.tooltip.xtracr_realcamera.modelView_preview": "En mode aperçu, vous pouvez ajuster le décalage et la rotation de la caméra", "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorité lors de la liaison, plus la valeur est grande, plus la priorité est élevée et plus le tri est haut sur le côté droit", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Enregistrer sous\n(Lorsqu'il existe une configuration avec le même nom, vous pouvez également utiliser le bouton enregistrer à gauche)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Ajouter/mettre à jour ce paramètre de désactivation\nCliquez sur Enregistrer à gauche pour enregistrer la configuration", "screen.tooltip.xtracr_realcamera.modelView_scale": "Échelle, qui contrôle la taille des décalages", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clic gauche pour obtenir les coordonnées UV au niveau du pointeur de la souris\nLes trois ensembles de coordonnées UV ci-dessous sont, de haut en bas, les coordonnées UV du vecteur avant, du vecteur haut et du point de liaison sur le plan cible\nNote : %s+Défilement pour basculer entre les différentes couches du modèle. La saisie manuelle des coordonnées UV permet de se lier plus précisément à la position cible", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Détermine le mode de sélection rapide %s+Clic gauche\n(%s+Défilement pour changer la plage de sélection en mode plage)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vecteur Haut", "screen.widget.xtracr_realcamera.modelView_yaw": "Lacet = %s", "screen.xtracr_realcamera.modelView_title": "Vue Modèle" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/ja_jp.json b/common/src/main/resources/assets/realcamera/lang/ja_jp.json index 0858a1fb..51fee066 100644 --- a/common/src/main/resources/assets/realcamera/lang/ja_jp.json +++ b/common/src/main/resources/assets/realcamera/lang/ja_jp.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%sのインポートに成功しました!", "screen.tooltip.xtracr_realcamera.modelView_preview": "プレビューモードでカメラの様々なオフセットを調整できます", "screen.tooltip.xtracr_realcamera.modelView_priority": "バインディング時の優先度、値が大きいほど優先度が高く右側のソートで上位に表示", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "名前を付けて保存\n(同名設定がある場合も左の保存ボタンを使用できます)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "この無効化設定を追加/更新\n左の保存を押して設定を保存", "screen.tooltip.xtracr_realcamera.modelView_scale": "スケール、オフセットのサイズを制御", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左クリックでマウスポインタ位置のUV座標を取得\n下の3組のUV座標は上から順に前方ベクトル、上方ベクトル、ターゲット平面上のバインディング点のUV座標\n注: %s+スクロールでモデルの異なるレイヤー間を切り替えられます。手動でUV座標を入力するとターゲット位置に正確にバインドできます", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+左クリッククイック選択のモードを決定\n(%s+スクロールで範囲モードの選択範囲を変更)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "上方ベクトル", "screen.widget.xtracr_realcamera.modelView_yaw": "ヨー = %s", "screen.xtracr_realcamera.modelView_title": "モデルビュー" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/ko_kr.json b/common/src/main/resources/assets/realcamera/lang/ko_kr.json index af9931ee..69abb565 100644 --- a/common/src/main/resources/assets/realcamera/lang/ko_kr.json +++ b/common/src/main/resources/assets/realcamera/lang/ko_kr.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s 가져오기 성공!", "screen.tooltip.xtracr_realcamera.modelView_preview": "미리보기 모드에서 카메라의 다양한 오프셋 조정 가능", "screen.tooltip.xtracr_realcamera.modelView_priority": "바인딩 시 우선순위, 값이 클수록 우선순위가 높으며 오른쪽 정렬에서 위쪽에 표시", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "다른 이름으로 저장\n(동일 이름 설정이 있을 때 왼쪽 저장 버튼도 사용 가능)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "이 비활성화 설정 추가/업데이트\n왼쪽 저장을 눌러 구성을 저장", "screen.tooltip.xtracr_realcamera.modelView_scale": "크기 조절, 오프셋 크기 제어", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+왼쪽 클릭으로 마우스 포인터 위치의 UV 좌표 얻기\n아래 세 가지 UV 좌표는 위에서부터 전방 벡터, 상향 벡터, 대상 평면의 바인딩 지점 UV 좌표입니다\n참고: %s+스크롤로 모델의 다른 레이어 간 전환, 수동 UV 좌표 입력으로 대상 위치에 더 정확하게 바인딩 가능", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+왼쪽 클릭 빠른 선택 모드 결정\n(%s+스크롤로 범위 모드에서 선택 범위 변경)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "상향 벡터", "screen.widget.xtracr_realcamera.modelView_yaw": "요 = %s", "screen.xtracr_realcamera.modelView_title": "모델 뷰" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/lzh.json b/common/src/main/resources/assets/realcamera/lang/lzh.json index a0ed305b..9288909d 100644 --- a/common/src/main/resources/assets/realcamera/lang/lzh.json +++ b/common/src/main/resources/assets/realcamera/lang/lzh.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "入%s成!", "screen.tooltip.xtracr_realcamera.modelView_preview": "於覽式可調鏡觀諸偏移", "screen.tooltip.xtracr_realcamera.modelView_priority": "系定之先級,值愈大愈先,且右列愈前", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "存為\n(當有同名設時,亦可用左存鈕)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "增/更新此禁用設\n再按左存鈕以存目前設", "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放之度,控偏移量之大小", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左鍵可取光標處UV座標\n下三組UV座標自上而下為前向矢、上向矢與的平面上系點之UV座標\n註:%s鍵+滾輪可易模型之層,手輸UV座標可精系的位", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "定%s+左鍵速擇之法\n(%s鍵+滾輪可易域擇之範)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "上向矢", "screen.widget.xtracr_realcamera.modelView_yaw": "偏航 = %s", "screen.xtracr_realcamera.modelView_title": "模型觀象" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/pl_pl.json b/common/src/main/resources/assets/realcamera/lang/pl_pl.json index 0b75ce8a..307450a5 100644 --- a/common/src/main/resources/assets/realcamera/lang/pl_pl.json +++ b/common/src/main/resources/assets/realcamera/lang/pl_pl.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Import %s powiódł się!", "screen.tooltip.xtracr_realcamera.modelView_preview": "W trybie podglądu możesz dostosować przesunięcie i obrót kamery", "screen.tooltip.xtracr_realcamera.modelView_priority": "Priorytet powiązania: im większa wartość, tym wyższy priorytet i wyższe sortowanie po prawej stronie", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Zapisz jako\n(Gdy istnieje konfiguracja o tej samej nazwie, możesz również użyć przycisku zapisu po lewej stronie)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Dodaj/zaktualizuj to ustawienie wyłączenia\nKliknij Zapisz po lewej, aby zapisać konfigurację", "screen.tooltip.xtracr_realcamera.modelView_scale": "Skala, która kontroluje rozmiar przesunięć", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+LKliknij, aby uzyskać współrzędne UV w miejscu wskaźnika myszy\nTrzy zestawy współrzędnych UV poniżej, od góry do dołu, to współrzędne UV wektora do przodu, wektora w górę i punktu wiązania na płaszczyźnie docelowej\nUwaga: %s+Przewiń, aby przełączać się między różnymi warstwami modelu. Ręczne wprowadzanie współrzędnych UV pozwala dokładniej powiązać z pozycją docelową", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Określa tryb szybkiego wyboru %s+LKliknięcia\n(%s+Przewiń, aby zmienić zakres wyboru w trybie zakresu)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Wektor w górę", "screen.widget.xtracr_realcamera.modelView_yaw": "Odchylenie = %s", "screen.xtracr_realcamera.modelView_title": "Widok modelu" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/pt_br.json b/common/src/main/resources/assets/realcamera/lang/pt_br.json index 8b604596..307cd322 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_br.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_br.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Adicionar/atualizar esta configuração de desativação\nPressione Salvar à esquerda para salvar a configuração", "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla o tamanho dos deslocamentos", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clique Esquerdo para obter as coordenadas UV no ponteiro do mouse\nOs três conjuntos de coordenadas UV abaixo são, de cima para baixo, as coordenadas UV do vetor de frente, do vetor para cima e do ponto de vinculação no plano alvo\nNota: %s+Rolar para alternar entre as diferentes camadas do modelo. Inserir manualmente as coordenadas UV permite vincular com mais precisão à posição alvo", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina o modo de seleção rápida %s+Clique Esquerdo\n(%s+Rolar para alterar o intervalo de seleção no modo de intervalo)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vetor para Cima", "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", "screen.xtracr_realcamera.modelView_title": "Visualização de Modelo" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/pt_pt.json b/common/src/main/resources/assets/realcamera/lang/pt_pt.json index ccbb4f41..fa3e5579 100644 --- a/common/src/main/resources/assets/realcamera/lang/pt_pt.json +++ b/common/src/main/resources/assets/realcamera/lang/pt_pt.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Importação %s bem-sucedida!", "screen.tooltip.xtracr_realcamera.modelView_preview": "No modo de pré-visualização, você pode ajustar o deslocamento e rotação da câmera", "screen.tooltip.xtracr_realcamera.modelView_priority": "Prioridade ao vincular, quanto maior o valor maior a prioridade e maior a ordenação no lado direito", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Salvar como\n(Quando existe uma configuração com o mesmo nome, você também pode usar o botão salvar à esquerda)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Adicionar/atualizar esta configuração de desativação\nPrima Salvar à esquerda para salvar a configuração", "screen.tooltip.xtracr_realcamera.modelView_scale": "Escala, que controla o tamanho dos deslocamentos", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Clique Esquerdo para obter as coordenadas UV no ponteiro do mouse\nOs três conjuntos de coordenadas UV abaixo são, de cima para baixo, as coordenadas UV do vetor de frente, do vetor para cima e do ponto de vinculação no plano alvo\nNota: %s+Rolar para alternar entre as diferentes camadas do modelo. Inserir manualmente as coordenadas UV permite vincular com mais precisão à posição alvo", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Determina o modo de seleção rápida %s+Clique Esquerdo\n(%s+Rolar para alterar o intervalo de seleção no modo de intervalo)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Vetor para Cima", "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", "screen.xtracr_realcamera.modelView_title": "Visualização de Modelo" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/ru_ru.json b/common/src/main/resources/assets/realcamera/lang/ru_ru.json index eb8eec98..b9475e1e 100644 --- a/common/src/main/resources/assets/realcamera/lang/ru_ru.json +++ b/common/src/main/resources/assets/realcamera/lang/ru_ru.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Импорт %s успешен!", "screen.tooltip.xtracr_realcamera.modelView_preview": "В режиме предпросмотра вы можете настроить смещение и вращение камеры", "screen.tooltip.xtracr_realcamera.modelView_priority": "Приоритет при привязке: чем больше значение, тем выше приоритет и выше сортировка на правой стороне", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Сохранить как\n(При наличии настройки с тем же именем вы также можете использовать кнопку сохранения слева)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Добавить/обновить эту настройку отключения\nНажмите Сохранить слева, чтобы сохранить конфигурацию", "screen.tooltip.xtracr_realcamera.modelView_scale": "Масштаб, который контролирует размер смещений", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Левый клик чтобы получить UV-координаты в месте указателя мыши\nТри набора UV-координат ниже, сверху вниз, это UV-координаты вектора направления, вектора вверх и точки привязки на целевой плоскости\nПримечание: %s+Прокрутка для переключения между различными слоями модели. Ручной ввод UV-координат позволяет более точно привязаться к целевой позиции", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Определяет режим быстрого выбора %s+Левый клик\n(%s+Прокрутка для изменения диапазона выбора в режиме диапазона)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектор вверх", "screen.widget.xtracr_realcamera.modelView_yaw": "Рыскание = %s", "screen.xtracr_realcamera.modelView_title": "Просмотр Модели" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/tr_tr.json b/common/src/main/resources/assets/realcamera/lang/tr_tr.json index 2dd336f2..21ac2edc 100644 --- a/common/src/main/resources/assets/realcamera/lang/tr_tr.json +++ b/common/src/main/resources/assets/realcamera/lang/tr_tr.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "%s içe aktarma başarılı!", "screen.tooltip.xtracr_realcamera.modelView_preview": "Önizleme modunda kameranın çeşitli ofsetlerini ayarlayabilirsiniz", "screen.tooltip.xtracr_realcamera.modelView_priority": "Bağlama önceliği, değer ne kadar büyükse öncelik o kadar yüksektir ve sağ taraftaki sıralama da o kadar yukarıdadır", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Farklı Kaydet\n(Aynı isimde bir ayar olduğunda, soldaki kaydet düğmesini de kullanabilirsiniz)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Bu devre dışı bırakma ayarını ekle/güncelle\nYapılandırmayı kaydetmek için soldaki Kaydet'e basın", "screen.tooltip.xtracr_realcamera.modelView_scale": "Ölçek, ofsetlerin boyutunu kontrol eder", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Sol Tık ile fare işaretçisindeki UV koordinatlarını alın\nAşağıdaki üç UV koordinat seti, yukarıdan aşağıya doğru, ileri vektör, yukarı vektör ve hedef düzlemdeki bağlama noktasının UV koordinatlarıdır\nNot: %s+Kaydırma ile modelin farklı katmanları arasında geçiş yapabilirsiniz. UV koordinatlarını manuel olarak girerek hedef konuma daha hassas bir şekilde bağlanabilirsiniz", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "%s+Sol Tık hızlı seçim modunu belirler\n(%s+Kaydırma ile aralık modundaki seçim aralığını değiştirin)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Yukarı Vektörü", "screen.widget.xtracr_realcamera.modelView_yaw": "Yaw = %s", "screen.xtracr_realcamera.modelView_title": "Model Görünümü" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/uk_ua.json b/common/src/main/resources/assets/realcamera/lang/uk_ua.json index 27307c1b..4efac461 100644 --- a/common/src/main/resources/assets/realcamera/lang/uk_ua.json +++ b/common/src/main/resources/assets/realcamera/lang/uk_ua.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "Імпорт %s успішний!", "screen.tooltip.xtracr_realcamera.modelView_preview": "У режимі попереднього перегляду ви можете налаштувати зміщення та обертання камери", "screen.tooltip.xtracr_realcamera.modelView_priority": "Пріоритет при прив'язці: чим більше значення, тим вищий пріоритет і вище сортування на правій стороні", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Зберегти як\n(При наявності налаштування з тим же ім'ям ви також можете використовувати кнопку збереження зліва)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "Додати/оновити це налаштування вимкнення\nНатисніть Зберегти ліворуч, щоб зберегти конфігурацію", "screen.tooltip.xtracr_realcamera.modelView_scale": "Масштаб, який контролює розмір зміщень", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+Лівий клік щоб отримати UV-координати в місці вказівника миші\nТри набори UV-координат нижче, зверху вниз, це UV-координати вектора напрямку, вектора вгору та точки прив'язки на цільовій площині\nПримітка: %s+Прокрутка для перемикання між різними шарами моделі. Ручний ввід UV-координат дозволяє точніше прив'язатися до цільової позиції", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "Визначає режим швидкого вибору %s+Лівий клік\n(%s+Прокрутка для зміни діапазону вибору в режимі діапазону)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "Вектор вгору", "screen.widget.xtracr_realcamera.modelView_yaw": "Рискання = %s", "screen.xtracr_realcamera.modelView_title": "Перегляд Моделі" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 3ffd60e7..61b86c8a 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "导入%s成功!", "screen.tooltip.xtracr_realcamera.modelView_preview": "在预览模式可以调整相机的各个偏移量", "screen.tooltip.xtracr_realcamera.modelView_priority": "绑定时的优先级,值越大优先级越高,并且在右侧排序越靠上", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "保存为\n(当存在同名设置时,也可使用左侧保存按钮)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "添加/更新此禁用设置\n再点左侧保存以保存到当前配置", "screen.tooltip.xtracr_realcamera.modelView_scale": "缩放比例,控制偏移量的大小", "screen.tooltip.xtracr_realcamera.modelView_selecting": "%s+左键可获取鼠标指针处的UV坐标\n下方三组UV坐标由上到下依次为向前矢量、向上矢量和目标平面上绑定点的UV坐标\n注:%s键+滚轮可在模型的不同层间切换,手动输入UV坐标可以更加精确地绑定到目标位置", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "决定%s+左键快速选择的模式\n(%s键+滚轮可改变范围模式下的选择范围)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上矢量", "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", "screen.xtracr_realcamera.modelView_title": "模型视图" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/zh_hk.json b/common/src/main/resources/assets/realcamera/lang/zh_hk.json index c75986e5..a33d49f0 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_hk.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_hk.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "新增/更新此禁用設定\n再按左側儲存以儲存到目前設定", "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放比例,控制偏移量的大小", "screen.tooltip.xtracr_realcamera.modelView_selecting": "左Alt+左鍵可獲取鼠標指針處的UV座標\n下方三組UV座標由上到下依次為向前向量、向上向量和目標平面上綁定點的UV座標\n註:左Alt鍵+滾輪可在模型的不同層間切換,手動輸入UV座標可以更加精確地綁定到目標位置", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "決定左Alt+左鍵快速選擇的模式\n(左Alt鍵+滾輪可改變範圍模式下的選擇範圍)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上向量", "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", "screen.xtracr_realcamera.modelView_title": "模型視圖" -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/realcamera/lang/zh_tw.json b/common/src/main/resources/assets/realcamera/lang/zh_tw.json index c75986e5..a33d49f0 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_tw.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_tw.json @@ -91,7 +91,7 @@ "screen.tooltip.xtracr_realcamera.modelView_importSucceeded": "導入%s成功!", "screen.tooltip.xtracr_realcamera.modelView_preview": "在預覽模式可以調整相機的各個偏移量", "screen.tooltip.xtracr_realcamera.modelView_priority": "綁定時的優先級,值越大優先級越高,並且在右側排序越靠上", - "screen.tooltip.xtracr_realcamera.modelView_saveAs": "儲存為\n(當存在同名設置時,也可使用左側儲存按鈕)", + "screen.tooltip.xtracr_realcamera.modelView_saveAs": "新增/更新此禁用設定\n再按左側儲存以儲存到目前設定", "screen.tooltip.xtracr_realcamera.modelView_scale": "縮放比例,控制偏移量的大小", "screen.tooltip.xtracr_realcamera.modelView_selecting": "左Alt+左鍵可獲取鼠標指針處的UV座標\n下方三組UV座標由上到下依次為向前向量、向上向量和目標平面上綁定點的UV座標\n註:左Alt鍵+滾輪可在模型的不同層間切換,手動輸入UV座標可以更加精確地綁定到目標位置", "screen.tooltip.xtracr_realcamera.modelView_selectionMode": "決定左Alt+左鍵快速選擇的模式\n(左Alt鍵+滾輪可改變範圍模式下的選擇範圍)", @@ -125,4 +125,4 @@ "screen.widget.xtracr_realcamera.modelView_upwardVector": "向上向量", "screen.widget.xtracr_realcamera.modelView_yaw": "偏航角 = %s", "screen.xtracr_realcamera.modelView_title": "模型視圖" -} \ No newline at end of file +} From b7791326bf475ce61459bc30c51f0afb2faecf3e Mon Sep 17 00:00:00 2001 From: xTracr Date: Tue, 23 Jun 2026 23:31:51 +0800 Subject: [PATCH 25/34] Refactor ConfigCodec to final class and fix entity hit result - Rename MODID to MOD_ID across all usages for consistent naming - Convert ConfigCodec from interface to final class, removing redundant version() method - Make ModelViewScreen dimensions responsive to window size - Fix y-axis bounds bug in ColoredFloatLineRenderState --- .gitignore | 3 +++ .../com/xtracr/realcamera/RealCamera.java | 6 ++--- .../com/xtracr/realcamera/RealCameraCore.java | 4 ++-- .../xtracr/realcamera/config/ConfigFile.java | 2 +- .../realcamera/config/codec/ConfigCodec.java | 23 +++++++++---------- .../config/codec/ConfigCodec703.java | 21 ++--------------- .../realcamera/gui/ModelViewScreen.java | 16 ++++++++----- .../gui/components/SimpleIconButton.java | 2 +- .../realcamera/mixin/MixinLocalPlayer.java | 6 ++--- .../gui/ColoredFloatLineRenderState.java | 2 +- gradle.properties | 2 +- .../xtracr/realcamera/RealCameraNeoForge.java | 2 +- settings.gradle.kts | 4 ++++ 13 files changed, 42 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 87beff70..42fee5a2 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,9 @@ replay_*.log *.hprof *.jfr +# local docs and resources +.local/ + # agent AGENTS.md CLAUDE.md \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/RealCamera.java b/common/src/main/java/com/xtracr/realcamera/RealCamera.java index 94ede4e8..29c931c1 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCamera.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCamera.java @@ -7,9 +7,9 @@ import org.slf4j.LoggerFactory; public interface RealCamera extends PlatformHelper { - String MODID = "realcamera"; - String FULL_ID = "xtracr_" + MODID; - Logger LOGGER = LoggerFactory.getLogger(MODID); + String MOD_ID = "realcamera"; + String FULL_ID = "xtracr_" + MOD_ID; + Logger LOGGER = LoggerFactory.getLogger(MOD_ID); default void initialize() { ConfigFile.load(); diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 673c8ffc..5f1a60ba 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -43,9 +43,9 @@ public static BindTarget currentTarget() { return lastResult.target; } - public static void initialize(Minecraft client, boolean renderLevel) { + public static void initialize(Minecraft client, boolean advanceGameTime) { Entity entity = client.getCameraEntity(); - active = renderLevel && ConfigFile.config().enabled && client.options.getCameraType().isFirstPerson() && entity != null && !DisableHelper.MAIN_FEATURE.disabled(entity); + active = advanceGameTime && ConfigFile.config().enabled && client.options.getCameraType().isFirstPerson() && entity != null && !DisableHelper.MAIN_FEATURE.disabled(entity); rendering = ConfigFile.config().renderModel && !DisableHelper.RENDER_MODEL.disabled(entity); } diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java index e5af6e36..61c6fba5 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigFile.java @@ -15,7 +15,7 @@ import java.util.function.Supplier; public final class ConfigFile { - private static final String FILE_NAME = RealCamera.MODID + ".json"; + private static final String FILE_NAME = RealCamera.MOD_ID + ".json"; private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private final static Supplier path = Suppliers.memoize(ConfigFile::getPath); @Nullable diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java index bde2f41f..035c9488 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java @@ -16,25 +16,26 @@ import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; -public interface ConfigCodec extends StreamCodec { - ConfigCodec CODEC_703 = new ConfigCodec703(); - Short2ReferenceMap CODECS = Short2ReferenceMap.ofEntries( - Short2ReferenceMap.entry(CODEC_703.version(), CODEC_703) +public final class ConfigCodec { + static final short CURRENT_VERSION = 703; + static final StreamCodec CODEC_703 = ConfigCodec703.CODEC; + static final Short2ReferenceMap> CODECS = Short2ReferenceMap.ofEntries( + Short2ReferenceMap.entry(CURRENT_VERSION, CODEC_703) ); - static BindTarget readWithVersion(ByteBuf byteBuf) throws DecoderException, IllegalArgumentException { + public static BindTarget readWithVersion(ByteBuf byteBuf) throws DecoderException, IllegalArgumentException { short version = byteBuf.readShort(); - ConfigCodec serializer = CODECS.get(version); + StreamCodec serializer = CODECS.get(version); if (serializer == null) throw new IllegalArgumentException("Incompatible version: " + toSemVer(version)); return serializer.decode(byteBuf); } - static void writeWithVersion(ByteBuf byteBuf, BindTarget bindTarget) throws EncoderException { - byteBuf.writeShort(CODEC_703.version()); + public static void writeWithVersion(ByteBuf byteBuf, BindTarget bindTarget) throws EncoderException { + byteBuf.writeShort(CURRENT_VERSION); CODEC_703.encode(byteBuf, bindTarget); } - static DataResult fromCompressedBase64(String base64) { + public static DataResult fromCompressedBase64(String base64) { ByteBuf byteBuf = null; try { byte[] compressed = Base64.getDecoder().decode(base64); @@ -61,7 +62,7 @@ static DataResult fromCompressedBase64(String base64) { } } - static DataResult toCompressedBase64(BindTarget bindTarget) { + public static DataResult toCompressedBase64(BindTarget bindTarget) { ByteBuf byteBuf = Unpooled.buffer(); try { writeWithVersion(byteBuf, bindTarget); @@ -86,6 +87,4 @@ private static String toSemVer(short version) { int patch = version % 100; return major + "." + minor + "." + patch; } - - short version(); } diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java index b662afc7..71704076 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java @@ -7,14 +7,12 @@ import com.xtracr.realcamera.config.OffsetConfig; import com.xtracr.realcamera.config.UVRectangle; import io.netty.buffer.ByteBuf; -import io.netty.handler.codec.DecoderException; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; -import org.jspecify.annotations.NonNull; import java.util.List; -final class ConfigCodec703 implements ConfigCodec { +final class ConfigCodec703 { static final StreamCodec TARGET_CONFIG_CODEC = StreamCodec.composite( ByteBufCodecs.FLOAT, TargetConfig::forwardU, ByteBufCodecs.FLOAT, TargetConfig::forwardV, @@ -66,7 +64,7 @@ final class ConfigCodec703 implements ConfigCodec { UV_RECTANGLES_CODEC, DisableConfig::rectangles, DisableConfig::new ).apply(ByteBufCodecs.list()); - static final StreamCodec BIND_TARGET_CODEC = StreamCodec.composite( + static final StreamCodec CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, BindTarget::name, ByteBufCodecs.STRING_UTF8, BindTarget::textureId, ByteBufCodecs.VAR_INT, BindTarget::priority, @@ -77,19 +75,4 @@ final class ConfigCodec703 implements ConfigCodec { DISABLE_CONFIGS_CODEC, BindTarget::disableConfigs, BindTarget::new ); - - @Override - public short version() { - return 703; // 0.7.3 - } - - @Override - public @NonNull BindTarget decode(@NonNull ByteBuf byteBuf) throws DecoderException { - return BIND_TARGET_CODEC.decode(byteBuf); - } - - @Override - public void encode(@NonNull ByteBuf byteBuf, @NonNull BindTarget bindTarget) { - BIND_TARGET_CODEC.encode(byteBuf, bindTarget); - } } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 7c071f39..784c30f6 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -46,8 +46,8 @@ public final class ModelViewScreen extends Screen { private static final int SIDE_PANEL_BG = 0xFF444444, CENTER_PANEL_BG = 0xFF222222; private static final int DEFAULT_SCALE = 80, MIN_SCALE = 16, MAX_SCALE = 1024; private static final int CONFIG_NAME_MAX_LENGTH = 20; - private final int xSize = 450, ySize = 206, middleWidth = xSize - 200, widgetWidth = (xSize - middleWidth) / 4 - 8, widgetHeight = 18, wideWidgetWidth = widgetWidth * 2 + 4, compactWidgetWidth = widgetWidth * 2 - 18; - private int x, y, page = 0; + private final int widgetWidth = 42, widgetHeight = 18, wideWidgetWidth = widgetWidth * 2 + 4, compactWidgetWidth = widgetWidth * 2 - 18; + private int x, y, xSize, ySize, middleWidth, page = 0; private InputConstants.Key modifierKey = InputConstants.getKey(ConfigFile.config().binding.screenModifierKey); private boolean initialized; private int modelScale = DEFAULT_SCALE, textureScale = DEFAULT_SCALE, layers = 0, selectionRadius = 10; @@ -138,6 +138,9 @@ public ModelViewScreen() { @Override protected void init() { super.init(); + xSize = Math.clamp(width - 10, 10, 450); + ySize = Math.clamp(height - 10, 10, 206); + middleWidth = Math.max(10, xSize - 200); x = (width - xSize) / 2; y = (height - ySize) / 2; modifierKey = InputConstants.getKey(ConfigFile.config().binding.screenModifierKey); @@ -397,7 +400,7 @@ public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX ModelAnalyser.applyDisableConfigs(modelRecords, target, textureId, hiddenNames); computeFocusedPrimitives(analyser, modelRecords, textureRecords, mouseX, mouseY); renderCulledModels(graphics, analyser, target, modelRecords); - if (textureViewArea != null) renderFlattenedModels(graphics, analyser, textureRecords); + renderFlattenedModels(graphics, analyser, textureRecords); } private List captureRotatedEntity(ModelAnalyser analyser, BindTarget target, LivingEntity entity) { @@ -458,6 +461,7 @@ private void renderCulledModels(GuiGraphicsExtractor graphics, ModelAnalyser ana } private void renderFlattenedModels(GuiGraphicsExtractor graphics, ModelAnalyser analyser, List textureRecords) { + if (textureViewArea == null) return; int x1 = textureViewArea.left(), y1 = textureViewArea.top(), x2 = textureViewArea.right(), y2 = textureViewArea.bottom(); GUIHelper.enableScissor(graphics, textureViewArea); float scale = (textureScale * textureViewArea.width()) / (float) DEFAULT_SCALE; @@ -598,7 +602,7 @@ private String generateDisableConfigName(String textureId) { String candidate = base; for (int suffix = 2; disableConfigNameExists(candidate); suffix++) { String suffixText = "_" + suffix; - int baseLength = Math.min(base.length(), Math.max(1, CONFIG_NAME_MAX_LENGTH - suffixText.length())); + int baseLength = Math.clamp(CONFIG_NAME_MAX_LENGTH - suffixText.length(), 1, base.length()); candidate = base.substring(0, baseLength) + suffixText; } return candidate; @@ -612,10 +616,10 @@ private String sanitizeDisableConfigName(String name) { if (Character.isLetterOrDigit(c)) { builder.append(c); lastWasSeparator = false; - } else if ((c == '_' || c == '-') && builder.length() > 0 && !lastWasSeparator) { + } else if ((c == '_' || c == '-') && !builder.isEmpty() && !lastWasSeparator) { builder.append(c); lastWasSeparator = true; - } else if (builder.length() > 0 && !lastWasSeparator) { + } else if (!builder.isEmpty() && !lastWasSeparator) { builder.append('_'); lastWasSeparator = true; } diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java b/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java index e3de55a2..b6634bb2 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java @@ -8,7 +8,7 @@ import net.minecraft.resources.Identifier; public class SimpleIconButton extends Button { - public static final Identifier ICON_TEXTURE = Identifier.fromNamespaceAndPath(RealCamera.MODID, "textures/gui/icon.png"); + public static final Identifier ICON_TEXTURE = Identifier.fromNamespaceAndPath(RealCamera.MOD_ID, "textures/gui/icon.png"); protected final Identifier texture; protected final int textureWidth, textureHeight, u, v; diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java index fe437128..ff623676 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java @@ -9,7 +9,6 @@ import com.xtracr.realcamera.config.ConfigFile; import com.xtracr.realcamera.util.CrosshairUtil; import com.xtracr.realcamera.util.RaycastUtil; -import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.LocalPlayer; @@ -42,9 +41,8 @@ public MixinLocalPlayer(ClientLevel world, GameProfile profile) { Pair fromAndTo = RaycastUtil.getFromAndTo(cameraEntity, interactionRange * interactionRange, partialTicks); Vec3 newFrom = fromAndTo.getFirst(); Vec3 newTo = fromAndTo.getSecond(); - Minecraft client = Minecraft.getInstance(); - double sqDistance = client.hitResult != null ? client.hitResult.getLocation().distanceToSqr(newFrom) : newTo.distanceToSqr(newFrom); - AABB newBox = cameraEntity.getBoundingBox().expandTowards(cameraEntity.getViewVector(partialTicks).scale(interactionRange)).inflate(1.0, 1.0, 1.0); + double sqDistance = newTo.distanceToSqr(newFrom); + AABB newBox = cameraEntity.getBoundingBox().expandTowards(newTo.subtract(newFrom)).inflate(1.0, 1.0, 1.0); CrosshairUtil.capturedEntityHitResult = ProjectileUtil.getEntityHitResult(except, newFrom, newTo, newBox, matching, sqDistance); return CrosshairUtil.capturedEntityHitResult; } diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java index 565a5289..14423344 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/state/gui/ColoredFloatLineRenderState.java @@ -41,7 +41,7 @@ public ColoredFloatLineRenderState( ) { this(pipeline, textureSetup, pose, x, y, z, vectorX, vectorY, vectorZ, argb, scissorArea, GUIHelper.getBounds((int) MathUtil.floor(x, x + vectorX), (int) MathUtil.floor(y, y + vectorY), - (int) MathUtil.ceil(x, x + vectorX), (int) MathUtil.ceil(x, x + vectorX), pose, scissorArea)); + (int) MathUtil.ceil(x, x + vectorX), (int) MathUtil.ceil(y, y + vectorY), pose, scissorArea)); } @Override diff --git a/gradle.properties b/gradle.properties index 4a404320..88e0b1cd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.configuration-cache=false java_version=25 minecraft_version=26.1.2 enabled_platforms=fabric,neoforge -loom_version=1.16-SNAPSHOT +loom_version=1.17-SNAPSHOT fabric_loader_version=0.19.3 neoforge_version=26.1.2.73 moddev_version=2.0.141 diff --git a/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java b/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java index 0b9c01cf..d2c9e86a 100644 --- a/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java +++ b/neoforge/src/main/java/com/xtracr/realcamera/RealCameraNeoForge.java @@ -17,7 +17,7 @@ import java.util.Map; -@Mod(value = RealCamera.MODID, dist = Dist.CLIENT) +@Mod(value = RealCamera.MOD_ID, dist = Dist.CLIENT) public final class RealCameraNeoForge implements RealCamera { private final ModContainer modContainer; private final Map modIdMap = Map.of("cloth-config", "cloth_config"); diff --git a/settings.gradle.kts b/settings.gradle.kts index 6c49b8d6..ea77fc0b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,6 +17,10 @@ pluginManagement { } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} + rootProject.name = "RealCamera" include("common") From 3598405cbe926fcfacc725db1ec66ea1c293828b Mon Sep 17 00:00:00 2001 From: xTracr Date: Thu, 25 Jun 2026 13:00:27 +0800 Subject: [PATCH 26/34] Improve json adapter copied from #214 --- .../com/xtracr/realcamera/RealCameraCore.java | 15 +++--- .../config/codec/DisableConfigAdapter.java | 54 +++++++++++-------- .../realcamera/mixin/MixinLocalPlayer.java | 5 +- .../renderer/MultiVertexCatcher.java | 4 +- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 5f1a60ba..a08d45c8 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -71,13 +71,16 @@ public static void computeCamera(Minecraft client, float partialTicks) { Entity entity = client.getCameraEntity(); boolean invisible = entity.isInvisible(); entity.setInvisible(false); - newResult = RealCameraAPI.computeBindResult(client, partialTicks); - if (!newResult.available()) { - EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); - dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, new PoseStack(), vertexCatcher.initCollector()); - vertexCatcher.forEachBuffer(RealCameraCore::computeBindResult); + try { + newResult = RealCameraAPI.computeBindResult(client, partialTicks); + if (!newResult.available()) { + EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); + dispatcher.submit(dispatcher.extractEntity(entity, partialTicks), new CameraRenderState(), 0, 0, 0, new PoseStack(), vertexCatcher.initCollector()); + vertexCatcher.forEachBuffer(RealCameraCore::computeBindResult); + } + } finally { + entity.setInvisible(invisible); } - entity.setInvisible(invisible); if (newResult.available()) { failureFrames = 0; lastResult = newResult.computeCamera(false); diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java index 9f51eb65..86166def 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.List; public final class DisableConfigAdapter extends TypeAdapter { @Override @@ -32,31 +33,42 @@ public void write(JsonWriter out, DisableConfig value) throws IOException { @Override public DisableConfig read(JsonReader in) throws IOException { + String name = ""; + String textureId = ""; + boolean disableAll = false; + List rectangles = new ArrayList<>(); + in.beginObject(); - String _ = in.nextName(); - String name = in.nextString(); - String _ = in.nextName(); - String textureId = in.nextString(); - String _ = in.nextName(); - boolean disableAll = in.nextBoolean(); - String _ = in.nextName(); - in.beginArray(); - ArrayList rectangles = new ArrayList<>(); while (in.hasNext()) { - in.beginObject(); - String _ = in.nextName(); - float uMin = (float) in.nextDouble(); - String _ = in.nextName(); - float vMin = (float) in.nextDouble(); - String _ = in.nextName(); - float uMax = (float) in.nextDouble(); - String _ = in.nextName(); - float vMax = (float) in.nextDouble(); - in.endObject(); - rectangles.add(new UVRectangle(uMin, vMin, uMax, vMax)); + switch (in.nextName()) { + case "name" -> name = in.nextString(); + case "textureId" -> textureId = in.nextString(); + case "disableAll" -> disableAll = in.nextBoolean(); + case "rectangles" -> { + in.beginArray(); + while (in.hasNext()) rectangles.add(readRectangle(in)); + in.endArray(); + } + default -> in.skipValue(); + } } - in.endArray(); in.endObject(); return new DisableConfig(name, textureId, disableAll, rectangles); } + + private UVRectangle readRectangle(JsonReader in) throws IOException { + float uMin = 0, vMin = 0, uMax = 0, vMax = 0; + in.beginObject(); + while (in.hasNext()) { + switch (in.nextName()) { + case "uMin" -> uMin = (float) in.nextDouble(); + case "vMin" -> vMin = (float) in.nextDouble(); + case "uMax" -> uMax = (float) in.nextDouble(); + case "vMax" -> vMax = (float) in.nextDouble(); + default -> in.skipValue(); + } + } + in.endObject(); + return new UVRectangle(uMin, vMin, uMax, vMax); + } } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java index ff623676..a8646b2d 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinLocalPlayer.java @@ -44,9 +44,10 @@ public MixinLocalPlayer(ClientLevel world, GameProfile profile) { double sqDistance = newTo.distanceToSqr(newFrom); AABB newBox = cameraEntity.getBoundingBox().expandTowards(newTo.subtract(newFrom)).inflate(1.0, 1.0, 1.0); CrosshairUtil.capturedEntityHitResult = ProjectileUtil.getEntityHitResult(except, newFrom, newTo, newBox, matching, sqDistance); - return CrosshairUtil.capturedEntityHitResult; + } else { + CrosshairUtil.capturedEntityHitResult = original.call(except, from, _to, box, matching, maxValue); } - return original.call(except, from, _to, box, matching, maxValue); + return CrosshairUtil.capturedEntityHitResult; } @Inject(method = "getRopeHoldPosition", at = @At("HEAD"), cancellable = true) diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java index c80ee12b..e91727da 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java @@ -32,17 +32,18 @@ public static MultiVertexCatcher create() { return new MultiVertexCatcher(); } + @SuppressWarnings("resource") private static void renderModel(PoseStack poseStack, SubmitNodeStorage.ModelSubmit submit, VertexConsumer buffer) { poseStack.pushPose(); poseStack.last().set(submit.pose()); Model model = submit.model(); - //noinspection resource VertexConsumer wrappedBuffer = submit.sprite() == null ? buffer : submit.sprite().wrap(buffer); model.setupAnim(submit.state()); model.renderToBuffer(poseStack, wrappedBuffer, submit.lightCoords(), submit.overlayCoords(), submit.tintedColor()); poseStack.popPose(); } + @SuppressWarnings("resource") private static void renderModelParts(PoseStack poseStack, Map> modelPartSubmitsMap, MultiBufferSource.BufferSource bufferSource) { poseStack.pushPose(); for (var entry : modelPartSubmitsMap.entrySet()) { @@ -51,7 +52,6 @@ private static void renderModelParts(PoseStack poseStack, Map Date: Wed, 1 Jul 2026 15:36:15 +0800 Subject: [PATCH 27/34] Update issue templates (#218) - Merged disableWhenSneaking and disableWhenCrawling setting, added disableWhenFlying --- .github/ISSUE_TEMPLATE/bug_report_cn.yml | 30 +++++++++---- .github/ISSUE_TEMPLATE/bug_report_en.yml | 28 +++++++++--- .github/ISSUE_TEMPLATE/feature_request_cn.yml | 43 +++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request_en.yml | 43 +++++++++++++++++++ .../com/xtracr/realcamera/KeyMappings.java | 4 +- .../realcamera/compat/DisableHelper.java | 6 +-- .../realcamera/config/ConfigScreen.java | 20 ++++----- .../xtracr/realcamera/config/ModConfig.java | 10 ++--- .../realcamera/config/codec/ConfigCodec.java | 2 +- .../assets/realcamera/lang/en_us.json | 22 +++++----- .../assets/realcamera/lang/zh_cn.json | 22 +++++----- 11 files changed, 172 insertions(+), 58 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/feature_request_cn.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request_en.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.yml b/.github/ISSUE_TEMPLATE/bug_report_cn.yml index 6e50b14e..d38034fe 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_cn.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.yml @@ -7,41 +7,55 @@ body: - type: markdown attributes: value: | - 请确保您使用的是最新版的RC,您反馈的bug很可能已经在更新版本中修复 + 请确保您使用的是最新版的RealCamera,您反馈的bug很可能已经在更新版本中修复 (查看尾缀是否与最新工件相同) 在反馈bug前,请先尝试搜索是否已有相似的问题,请不要重复打开相同的issue 所有有关YSM的问题,请您优先寻求他人的帮助,或者观看配置模型教程 - 而不是直接在issue中提问。 + 而不是直接在issue中提问 - type: checkboxes id: preliminary attributes: label: 我已确认 ... options: - - label: 我正在使用最新版的RC + - label: 我正在使用最新版的RealCamera required: true - - label: 无法在关闭主要功能时复现 + - label: issues里没有相关的问题 required: true - type: input - id: minecraft-version-loader + id: minecraft-version attributes: - label: Minecraft版本和加载器 + label: Minecraft版本 description: | - 请填写游戏版本与所使用的加载器. + 你所使用的Minecraft的版本. 你可以在游戏主界面作下角或者游戏启动时的日志开头等地方找到. validations: required: true + - type: checkboxes + id: bug-type + attributes: + label: 问题类型 + options: + - label: 开启时主功能时出现bug + required: false + - label: 与其他模组的兼容问题 + required: false + - label: 在fabric端出现 + required: false + - label: 在(neo)forge端出现 + required: false + - type: textarea id: incompatible-mods attributes: label: 不兼容的mod description: >- 和bug相关的模组 -
    请在反馈问题前尝试尽可能移除不相干的模组的情况下复现bug +
    请在反馈问题前移除不相干的模组的情况下复现bug placeholder: 'Mods list here' render: 'raw' validations: diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml index 2be682d9..f24fce85 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_en.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml @@ -12,7 +12,7 @@ body: Before reporting a bug, please search for similar issues first and avoid opening duplicate issues For all YSM-related questions, please seek help from others or watch configuration model tutorials first - instead of asking directly in the issue. + instead of asking directly in the issue - type: checkboxes id: preliminary @@ -21,27 +21,41 @@ body: options: - label: I am using the latest version of RealCamera required: true - - label: Unable to reproduce when main feature is disabled + - label: No related issues found in the issue tracker. required: true + - label: Appears on Fabric + required: false + - label: Appears on (Neo)Forge + required: false - type: input - id: minecraft-version-loader + id: minecraft-version attributes: - label: Minecraft Version and Loader + label: Minecraft Version description: | - Please specify the game version and your mod loader. + The Minecraft version you are using. You can find them at the corner of main menu or in the log while startup. validations: required: true + - type: checkboxes + id: bug-type + attributes: + label: 问题类型 + options: + - label: Bug occurs when enabling main feature + required: false + - label: Incompatibility with other mods + required: false + - type: textarea id: incompatible-mods attributes: label: Incompatible Mods description: >- - The mods related to the bug. -
    Try to remove unrelated plugins and mods before reporting + The mods related to the bug +
    Reproduce the bug with unrelated mods removed before reporting placeholder: 'Mods list here' render: 'raw' validations: diff --git a/.github/ISSUE_TEMPLATE/feature_request_cn.yml b/.github/ISSUE_TEMPLATE/feature_request_cn.yml new file mode 100644 index 00000000..f960b8d0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request_cn.yml @@ -0,0 +1,43 @@ +name: 新功能建议 +description: 为我们提供新的想法 +title: "[new feature]:" +labels: [ "new feature" ] +body: + - type: markdown + attributes: + value: | + 感谢您花时间提出新的功能想法! + 请确保最新版本内没有这个功能! + + - type: textarea + id: feature-description + attributes: + label: 这个功能是什么? + description: 请清晰地描述您希望添加的功能 + placeholder: 我希望... + validations: + required: true + + - type: textarea + id: problem-and-solution + attributes: + label: 这个功能可以解决什么问题? + description: 请详细说明其作用 + placeholder: 这个功能可以帮助解决... + validations: + required: true + + - type: textarea + id: ideal-solution + attributes: + label: 这个功能理想中的解决方案是什么样的? + description: 例如新的按钮应该在何处,哪里需要新的配置选项 + placeholder: 我希望... + validations: + required: true + + - type: textarea + id: additional-context + attributes: + label: 其他信息 + description: 任何关于功能的上下文或截图 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request_en.yml b/.github/ISSUE_TEMPLATE/feature_request_en.yml new file mode 100644 index 00000000..0ae65664 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request_en.yml @@ -0,0 +1,43 @@ +name: New Feature Request +description: Suggest an idea for this project +title: "[new feature]: " +labels: [ "new feature" ] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to suggest a new feature! + Check the latest build to confirm the feature is missing. + + - type: textarea + id: feature-description + attributes: + label: What is this feature about? + description: A clear and concise description of what the feature is. + placeholder: I would like to... + validations: + required: true + + - type: textarea + id: problem-and-solution + attributes: + label: What problem does this feature solve? + description: Please elaborate on its purpose + placeholder: This feature helps resolve... + validations: + required: true + + - type: textarea + id: ideal-solution + attributes: + label: What does your ideal solution look like? + description: For example, where new buttons or config options should be placed + placeholder: I would like... + validations: + required: true + + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Any relevant information or screenshots regarding the feature \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java index 896b7ef8..9c6fd98a 100644 --- a/common/src/main/java/com/xtracr/realcamera/KeyMappings.java +++ b/common/src/main/java/com/xtracr/realcamera/KeyMappings.java @@ -26,12 +26,12 @@ public final class KeyMappings { }); createKeyMapping("toggleAdjustMode", _ -> ConfigFile.config().cycleAdjustMode()); createKeyMapping("toggleCameraMode", _ -> ConfigFile.config().isClassic = !ConfigFile.config().isClassic); - createKeyMapping("adjustFRONT", _ -> ConfigFile.config().adjustOffsetX(1)); - createKeyMapping("adjustBACK", _ -> ConfigFile.config().adjustOffsetX(-1)); createKeyMapping("adjustUP", _ -> ConfigFile.config().adjustOffsetY(1)); createKeyMapping("adjustDOWN", _ -> ConfigFile.config().adjustOffsetY(-1)); createKeyMapping("adjustLEFT", _ -> ConfigFile.config().adjustOffsetZ(1)); createKeyMapping("adjustRIGHT", _ -> ConfigFile.config().adjustOffsetZ(-1)); + createKeyMapping("adjustFRONT", _ -> ConfigFile.config().adjustOffsetX(1)); + createKeyMapping("adjustBACK", _ -> ConfigFile.config().adjustOffsetX(-1)); createKeyMapping("activeConfigIndexNEXT", _ -> ConfigFile.config().binding.activeConfigIndex += 1); createKeyMapping("activeConfigIndexPREV", _ -> ConfigFile.config().binding.activeConfigIndex -= 1); createKeyMapping("activeConfigIndexRESET", _ -> ConfigFile.config().binding.activeConfigIndex = 0); diff --git a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java index 20f6f84f..2f59cdfa 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/DisableHelper.java @@ -28,9 +28,9 @@ public final class DisableHelper { RENDER_HANDS = new Entry("renderHands", _ -> RealCameraCore.isRendering()); MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenSneaking && player.isCrouching()); MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classic.disableWhenSneaking && player.isCrouching()); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenSwimming && checkCondition(player, player.isSwimming(), ConfigFile.config().binding.outTick)); - MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classic.disableWhenSwimming && checkCondition(player, player.isSwimming(), ConfigFile.config().classic.outTick)); - MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenCrawling && checkCondition(player, player.isVisuallyCrawling(), ConfigFile.config().binding.outTick)); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenSwimming && checkCondition(player, player.isVisuallySwimming(), ConfigFile.config().binding.exitTick)); + MAIN_FEATURE.registerOrInClassic(player -> ConfigFile.config().classic.disableWhenSwimming && checkCondition(player, player.isVisuallySwimming(), ConfigFile.config().classic.exitTick)); + MAIN_FEATURE.registerOrInBinding(player -> ConfigFile.config().binding.disableWhenFlying && player.isFallFlying()); MAIN_FEATURE.registerOrInBinding(player -> { Item mainHand = player.getMainHandItem().getItem(); Item offHand = player.getOffhandItem().getItem(); diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 77c91e68..a0ed7953 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -60,12 +60,12 @@ public static Screen create(Screen parent) { .setDefaultValue(false) .setSaveConsumer(b -> config.classic.disableWhenSwimming = b) .build()); - classic.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("outTick"), config.classic.outTick) + classic.addEntry(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("exitTick"), config.classic.exitTick) .setDefaultValue(13) .setMin(0) .setMax(40) - .setTooltip(LocUtil.CONFIG_TOOLTIP("outTick")) - .setSaveConsumer(i -> config.classic.outTick = i) + .setTooltip(LocUtil.CONFIG_TOOLTIP("exitTick")) + .setSaveConsumer(i -> config.classic.exitTick = i) .build()); classic.addEntry(entryBuilder.startDoubleField(LocUtil.CONFIG_OPTION("scale"), config.classic.scale) .setDefaultValue(8.0) @@ -196,20 +196,20 @@ public static Screen create(Screen parent) { .setDefaultValue(false) .setSaveConsumer(b -> config.binding.disableWhenSneaking = b) .build()); - disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenCrawling"), config.binding.disableWhenCrawling) - .setDefaultValue(false) - .setSaveConsumer(b -> config.binding.disableWhenCrawling = b) - .build()); disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenSwimming"), config.binding.disableWhenSwimming) .setDefaultValue(false) .setSaveConsumer(b -> config.binding.disableWhenSwimming = b) .build()); - disableConfig.add(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("outTick"), config.binding.outTick) + disableConfig.add(entryBuilder.startBooleanToggle(LocUtil.CONFIG_OPTION("disableWhenFlying"), config.binding.disableWhenFlying) + .setDefaultValue(false) + .setSaveConsumer(b -> config.binding.disableWhenFlying = b) + .build()); + disableConfig.add(entryBuilder.startIntField(LocUtil.CONFIG_OPTION("exitTick"), config.binding.exitTick) .setDefaultValue(13) .setMin(0) .setMax(40) - .setTooltip(LocUtil.CONFIG_TOOLTIP("outTick")) - .setSaveConsumer(i -> config.binding.outTick = i) + .setTooltip(LocUtil.CONFIG_TOOLTIP("exitTick")) + .setSaveConsumer(i -> config.binding.exitTick = i) .build()); disableConfig.add(entryBuilder.startStrList(LocUtil.CONFIG_OPTION("disableMainFeatureItems"), config.binding.disableMainFeatureItems) .setDefaultValue(List.of()) diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index 4fea0a8f..87e9abdd 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -143,7 +143,7 @@ public static class Classic { public AdjustMode adjustMode = AdjustMode.CAMERA; public boolean disableWhenSneaking = false; public boolean disableWhenSwimming = false; - public int outTick = 13; + public int exitTick = 13; public double scale = 8.0; public double cameraX = -0.5; public double cameraY = 0.04; @@ -157,7 +157,7 @@ public static class Classic { private void clamp() { if (adjustMode == null) adjustMode = AdjustMode.CAMERA; - outTick = Mth.clamp(outTick, 0, 40); + exitTick = Mth.clamp(exitTick, 0, 40); scale = Mth.clamp(scale, 0.0, 64.0); cameraX = Mth.clamp(cameraX, MIN_OFFSET_D, MAX_OFFSET_D); cameraY = Mth.clamp(cameraY, MIN_OFFSET_D, MAX_OFFSET_D); @@ -188,10 +188,10 @@ public static class Binding { public boolean adjustOffset = true; public boolean hideFailureMessage = false; public boolean renderStuckObjects = true; - public boolean disableWhenCrawling = false; public boolean disableWhenSneaking = false; public boolean disableWhenSwimming = false; - public int outTick = 13; + public boolean disableWhenFlying = false; + public int exitTick = 13; public int bindResultRetentionFrames = 2; public int activeConfigIndex = 0; public double displacementSmoothFactor = 0.4; @@ -207,7 +207,7 @@ private void clamp() { } catch (Exception e) { screenModifierKey = InputConstants.Type.KEYSYM.getOrCreate(InputConstants.KEY_LALT).getName(); } - outTick = Mth.clamp(outTick, 0, 40); + exitTick = Mth.clamp(exitTick, 0, 40); bindResultRetentionFrames = Math.max(bindResultRetentionFrames, 0); activeConfigIndex = Math.max(activeConfigIndex, 0); displacementSmoothFactor = Mth.clamp(displacementSmoothFactor, 0.0, 1.0); diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java index 035c9488..bfc0d1fd 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java @@ -32,7 +32,7 @@ public static BindTarget readWithVersion(ByteBuf byteBuf) throws DecoderExceptio public static void writeWithVersion(ByteBuf byteBuf, BindTarget bindTarget) throws EncoderException { byteBuf.writeShort(CURRENT_VERSION); - CODEC_703.encode(byteBuf, bindTarget); + CODECS.get(CURRENT_VERSION).encode(byteBuf, bindTarget); } public static DataResult fromCompressedBase64(String base64) { diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index 6742f95a..dcfac604 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -14,17 +14,17 @@ "config.option.xtracr_realcamera.classicAdjustMode": "Adjust Mode", "config.option.xtracr_realcamera.disableConfig": "Disable Config", "config.option.xtracr_realcamera.disableMainFeatureItems": "Disable main feature when holding", - "config.option.xtracr_realcamera.disableRenderItems": "Disable rendering when holding", - "config.option.xtracr_realcamera.disableWhenCrawling": "Disable main feature when crawling", + "config.option.xtracr_realcamera.disableRenderItems": "Disable body rendering when holding", "config.option.xtracr_realcamera.disableWhenSneaking": "Disable main feature when sneaking", - "config.option.xtracr_realcamera.disableWhenSwimming": "Disable main feature when swimming", + "config.option.xtracr_realcamera.disableWhenSwimming": "Disable main feature when swimming(crawling)", + "config.option.xtracr_realcamera.disableWhenFlying": "Disable main feature when flying", "config.option.xtracr_realcamera.displacementSmoothFactor": "Displacement Smooth Factor", "config.option.xtracr_realcamera.dynamicCrosshair": "Dynamic Crosshair", "config.option.xtracr_realcamera.enabled": "Mod Enabled", "config.option.xtracr_realcamera.hideBindingFailureMessage": "Hide Binding Failure Message", "config.option.xtracr_realcamera.isClassic": "Classic Mode", "config.option.xtracr_realcamera.legacyBindingMode": "Legacy Binding Mode", - "config.option.xtracr_realcamera.outTick": "Restriction exit delay (in ticks)", + "config.option.xtracr_realcamera.exitTick": "Restriction exit delay (in ticks)", "config.option.xtracr_realcamera.pitch": "Pitch", "config.option.xtracr_realcamera.renderModel": "Render Player Model", "config.option.xtracr_realcamera.renderStuckObjects": "Render Stuck Objects", @@ -50,7 +50,7 @@ "config.tooltip.xtracr_realcamera.dynamicCrosshair": "When enabled, the crosshair will follow the player's view, ensuring consistent hit result\nRecommended to enable when Jade, WTHIT or similar mods are installed", "config.tooltip.xtracr_realcamera.isClassic": "Classic mode only makes simple changes to the position and rotation of camera", "config.tooltip.xtracr_realcamera.legacyBindingMode": "Using the binding mode of legacy version (v0.5), only vanilla model and actions based on vanilla model are supported\nIts properties can be set in 'LEGACY_MODE' of the %s screen when enabled", - "config.tooltip.xtracr_realcamera.outTick": "The time before re-enabling main feature after exiting restricted states (e.g., swimming, crawling) (1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.exitTick": "The time before re-enabling main feature after exiting restricted states (e.g., swimming, crawling) (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.renderModel": "Render player model in first-person perspective", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Arrows, bee stings and other objects that can be stuck in the player's body", "config.tooltip.xtracr_realcamera.rerenderModel": "Render the model again at the original rendering time to avoid some visual problems caused by rendering early", @@ -61,12 +61,12 @@ "key.xtracr_realcamera.activeConfigIndexNEXT": "Switch to next configuration", "key.xtracr_realcamera.activeConfigIndexPREV": "Switch to previous configuration", "key.xtracr_realcamera.activeConfigIndexRESET": "Reset configuration index", - "key.xtracr_realcamera.adjustBACK": "Adjust BACK", - "key.xtracr_realcamera.adjustDOWN": "Adjust DOWN", - "key.xtracr_realcamera.adjustFRONT": "Adjust FRONT", - "key.xtracr_realcamera.adjustLEFT": "Adjust LEFT", - "key.xtracr_realcamera.adjustRIGHT": "Adjust RIGHT", - "key.xtracr_realcamera.adjustUP": "Adjust UP", + "key.xtracr_realcamera.adjustUP": "Adjust UP (Rotate Up)", + "key.xtracr_realcamera.adjustDOWN": "Adjust DOWN (Rotate Down)", + "key.xtracr_realcamera.adjustLEFT": "Adjust LEFT (Rotate Left)", + "key.xtracr_realcamera.adjustRIGHT": "Adjust RIGHT (Rotate Right)", + "key.xtracr_realcamera.adjustFRONT": "Adjust FRONT (Roll Right)", + "key.xtracr_realcamera.adjustBACK": "Adjust BACK (Roll Left)", "key.xtracr_realcamera.modelViewScreen": "Open Model View Screen", "key.xtracr_realcamera.toggleAdjustMode": "Toggle Adjust Mode", "key.xtracr_realcamera.toggleCameraMode": "Toggle Camera Mode", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 61b86c8a..0f4ebc19 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -14,17 +14,17 @@ "config.option.xtracr_realcamera.classicAdjustMode": "调整模式", "config.option.xtracr_realcamera.disableConfig": "禁用配置", "config.option.xtracr_realcamera.disableMainFeatureItems": "在手持...时禁用主要功能", - "config.option.xtracr_realcamera.disableRenderItems": "在手持...时禁用渲染", - "config.option.xtracr_realcamera.disableWhenCrawling": "爬行时禁用主要功能", + "config.option.xtracr_realcamera.disableRenderItems": "在手持...时禁用身体渲染", "config.option.xtracr_realcamera.disableWhenSneaking": "潜行时禁用主要功能", - "config.option.xtracr_realcamera.disableWhenSwimming": "游泳时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenSwimming": "游泳(爬行)时禁用主要功能", + "config.option.xtracr_realcamera.disableWhenFlying": "飞行时禁用主要功能", "config.option.xtracr_realcamera.displacementSmoothFactor": "位移平滑系数", "config.option.xtracr_realcamera.dynamicCrosshair": "动态十字准心", "config.option.xtracr_realcamera.enabled": "开启功能", "config.option.xtracr_realcamera.hideBindingFailureMessage": "隐藏绑定失败消息", "config.option.xtracr_realcamera.isClassic": "经典模式", "config.option.xtracr_realcamera.legacyBindingMode": "旧绑定模式", - "config.option.xtracr_realcamera.outTick": "禁用状态退出延迟(单位:tick)", + "config.option.xtracr_realcamera.exitTick": "禁用状态退出延迟(单位:tick)", "config.option.xtracr_realcamera.pitch": "俯仰角", "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物体", @@ -50,7 +50,7 @@ "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在开启状态下,十字准心会随着玩家的视线移动,确保命中结果不受影响\n在安装了Jade、WTHIT或类似模组时建议启用", "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", "config.tooltip.xtracr_realcamera.legacyBindingMode": "使用旧版本(v0.5)的绑定模式,仅支持原版模型和基于原版模型的动作\n开启后可在%s界面的'LEGACY_MODE'中设置属性", - "config.tooltip.xtracr_realcamera.outTick": "玩家停止某些状态(如游泳、爬行)后重启主要功能的时间(1 tick = 0.05s)", + "config.tooltip.xtracr_realcamera.exitTick": "玩家停止某些状态(如游泳、爬行)后重启主要功能的时间(1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.renderModel": "在第一人称视角下渲染玩家模型", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它会卡在玩家身体里的物体", "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染时机重新渲染模型,以避免一些因提前渲染导致的视觉问题", @@ -61,12 +61,12 @@ "key.xtracr_realcamera.activeConfigIndexNEXT": "切换到下一个配置", "key.xtracr_realcamera.activeConfigIndexPREV": "切换到上一个配置", "key.xtracr_realcamera.activeConfigIndexRESET": "重置配置索引", - "key.xtracr_realcamera.adjustBACK": "向后调整", - "key.xtracr_realcamera.adjustDOWN": "向下调整", - "key.xtracr_realcamera.adjustFRONT": "向前调整", - "key.xtracr_realcamera.adjustLEFT": "向左调整", - "key.xtracr_realcamera.adjustRIGHT": "向右调整", - "key.xtracr_realcamera.adjustUP": "向上调整", + "key.xtracr_realcamera.adjustUP": "向上调整(向上旋转)", + "key.xtracr_realcamera.adjustDOWN": "向下调整(向下旋转)", + "key.xtracr_realcamera.adjustLEFT": "向左调整(向左旋转)", + "key.xtracr_realcamera.adjustRIGHT": "向右调整(向右旋转)", + "key.xtracr_realcamera.adjustFRONT": "向前调整(向右滚转)", + "key.xtracr_realcamera.adjustBACK": "向后调整(向左滚转)", "key.xtracr_realcamera.modelViewScreen": "打开模型视图界面", "key.xtracr_realcamera.toggleAdjustMode": "切换调整模式", "key.xtracr_realcamera.toggleCameraMode": "切换摄像头模式", From 120cf424e2da4f7ae3a7f97332b8b62dfbae6dfa Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Thu, 2 Jul 2026 23:48:44 +0800 Subject: [PATCH 28/34] Added compatibility with Entity_Model_Features (#219) * Added compatibility with Entity_Model_Features * Fix: Update issue template --- .github/ISSUE_TEMPLATE/bug_report_cn.yml | 6 +++--- .github/ISSUE_TEMPLATE/bug_report_en.yml | 2 +- .../realcamera/compat/CompatibilityHelper.java | 14 ++++++++++++++ .../com/xtracr/realcamera/gui/ModelViewScreen.java | 2 ++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.yml b/.github/ISSUE_TEMPLATE/bug_report_cn.yml index d38034fe..0d86254e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_cn.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.yml @@ -31,7 +31,7 @@ body: description: | 你所使用的Minecraft的版本. - 你可以在游戏主界面作下角或者游戏启动时的日志开头等地方找到. + 你可以在游戏主界面左下角或者游戏启动时的日志开头等地方找到. validations: required: true @@ -40,7 +40,7 @@ body: attributes: label: 问题类型 options: - - label: 开启时主功能时出现bug + - label: 开启主功能时出现bug required: false - label: 与其他模组的兼容问题 required: false @@ -89,5 +89,5 @@ body: description: >- 你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能
    你可以日志上传到类似 https://paste.ubuntu.com/ 或者 https://mclo.gs/ 的网站并在此贴出链接 -
    **请不要在此此处直接粘贴大段的日志文本!!** +
    **请不要在此处直接粘贴大段的日志文本!!** placeholder: '把日志文件往这丢或者使用外部链接' \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml index f24fce85..72032021 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_en.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml @@ -42,7 +42,7 @@ body: - type: checkboxes id: bug-type attributes: - label: 问题类型 + label: Question Type options: - label: Bug occurs when enabling main feature required: false diff --git a/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java index 17776f4f..117d43dd 100644 --- a/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java +++ b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java @@ -6,8 +6,10 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.function.Function; public final class CompatibilityHelper { + public static boolean isRenderInScreen; private static PlatformHelper platformHelper; private static Method NEA_playerTransformer_setDeltaTick; private static Field NEA_NEAnimationsLoader_INSTANCE; @@ -50,6 +52,18 @@ public static void initialize(PlatformHelper platformHelper) { } catch (Exception e) { RealCamera.LOGGER.warn("Compatibility with SuperbWarfare is outdated: [{}] {}", e.getClass().getName(), e.getMessage()); } + if (isModLoaded("entity_model_features")) try { + Class EMF_EMFAnimationApi = Class.forName("traben.entity_model_features.EMFAnimationApi"); + if ((int) EMF_EMFAnimationApi.getMethod("getApiVersion").invoke(null) >= 9) { + Function function = _ -> isRenderInScreen; + Method EMF_registerPauseCondition = EMF_EMFAnimationApi.getMethod("registerPauseCondition", Function.class); + EMF_registerPauseCondition.invoke(null, function); + } else { + throw new IllegalStateException("EntityModelFeatures API is outdated, players‘s heads in the modelView may flicker"); + } + } catch (Exception e) { + RealCamera.LOGGER.warn("Compatibility with EntityModelFeatures is outdated: [{}] {}", e.getClass().getName(), e.getMessage()); + } } private static boolean SBW_gunsIsZooming() { diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 784c30f6..434a2886 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -404,6 +404,7 @@ public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX } private List captureRotatedEntity(ModelAnalyser analyser, BindTarget target, LivingEntity entity) { + CompatibilityHelper.isRenderInScreen = true; float entityBodyYaw = entity.yBodyRot; float entityYaw = entity.getYRot(); float entityPitch = entity.getXRot(); @@ -425,6 +426,7 @@ private List captureRotatedEntity(ModelAnalyser analyser, Bind modelPose.translate(0, -entity.getBbHeight() / 2.0f, 0); return analyser.captureModel(minecraft, entity, 1.0f, modelPose, target); } finally { + CompatibilityHelper.isRenderInScreen = false; entity.yBodyRot = entityBodyYaw; entity.setYRot(entityYaw); entity.setXRot(entityPitch); From a0e473ea206d1131e0f661ab6664bd0e11d041fd Mon Sep 17 00:00:00 2001 From: rsdadada Date: Sat, 4 Jul 2026 10:34:37 +0800 Subject: [PATCH 29/34] [codex] Restore live disable draft preview (#223) * Fix live disable draft preview * Apply suggestion from @xTracr Co-authored-by: xTracr <57320980+xTracr@users.noreply.github.com> Signed-off-by: rsdadada * Inline disable preview config overlay * Simplify live disable draft handling * Remove redundant disable draft helper --------- Signed-off-by: rsdadada Co-authored-by: xTracr <57320980+xTracr@users.noreply.github.com> --- .../java/com/xtracr/realcamera/gui/ModelViewScreen.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 434a2886..eeaeba5f 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -268,6 +268,7 @@ else if (index > 0 && index <= rectWidgets.size()) { BindTarget bindTarget = genBindTarget(); ConfigFile.config().putBindTarget(bindTarget); ConfigFile.save(); + if (toggleCategoryButton.getValue() != Category.DISABLE) loadBindTarget(bindTarget); initWidgets(page); })); rows.addChild(priorityField, smallSettings).setTooltip(createTooltip("priority")); @@ -672,10 +673,16 @@ private void loadBindTarget(BindTarget target) { } private BindTarget genBindTarget() { + DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); + List newDisableConfigs = new ArrayList<>(disableConfigs); + for (int i = 0; i < newDisableConfigs.size(); i++) { + if (newDisableConfigs.get(i).name().equals(currentDisableConfig.name())) + newDisableConfigs.set(i, currentDisableConfig); + } TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); OffsetConfig offsets = new OffsetConfig(scaleField.getNumber(), offsetXPair.getNumber(), offsetYPair.getNumber(), offsetZPair.getNumber(), offsetPitchPair.getNumber(), offsetYawPair.getNumber(), offsetRollPair.getNumber()); - return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, new ArrayList<>(disableConfigs)); + return new BindTarget(nameField.getValue(), textureIdField.getValue(), priorityField.getNumber(), depthField.getNumber(), targetConfig, bindConfig, offsets, newDisableConfigs); } private UVRectangleWidget addRectWidget(UVRectangleWidget rectWidget) { From e85f6461fb029e7e394ef8449bdb78cd8060246c Mon Sep 17 00:00:00 2001 From: xTracr Date: Sat, 4 Jul 2026 12:16:47 +0800 Subject: [PATCH 30/34] Bump version and upgrade gradle --- .../java/com/xtracr/realcamera/config/codec/ConfigCodec.java | 3 +-- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java index bfc0d1fd..78b492e7 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java @@ -18,9 +18,8 @@ public final class ConfigCodec { static final short CURRENT_VERSION = 703; - static final StreamCodec CODEC_703 = ConfigCodec703.CODEC; static final Short2ReferenceMap> CODECS = Short2ReferenceMap.ofEntries( - Short2ReferenceMap.entry(CURRENT_VERSION, CODEC_703) + Short2ReferenceMap.entry(CURRENT_VERSION, ConfigCodec703.CODEC) ); public static BindTarget readWithVersion(ByteBuf byteBuf) throws DecoderException, IllegalArgumentException { diff --git a/gradle.properties b/gradle.properties index 88e0b1cd..728a8b62 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ neoforge_version=26.1.2.73 moddev_version=2.0.141 ## Mod Properties mod_id=realcamera -mod_version=0.7.8-beta +mod_version=0.7.9-beta mod_group_id=com.xtracr.realcamera ## Dependencies fabric_api_version=0.150.0+26.1.2 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1a704683..7e7d24f6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From d40d7a50c29b323e5f13834f080127bf19e84948 Mon Sep 17 00:00:00 2001 From: dqsk_zze <1935752350@qq.com> Date: Sun, 5 Jul 2026 19:40:10 +0800 Subject: [PATCH 31/34] Update README.md (#226) Signed-off-by: dqsk_zze <1935752350@qq.com> --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 82d22a72..78beb517 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### [中文](README_ZH.md) Make the camera more realistic in the first-person view. -Supported versions: 1.18.2 - 1.20.4 Forge, 1.18.2 - 26.1 Fabric, 1.21 - 26.1 NeoForge. +Supported versions: 1.18.2 - 1.20.4 Forge, 1.18.2 - 26.2 Fabric, 1.21 - 26.2 NeoForge. Download the mod from [Releases](https://github.com/xTracr/RealCamera/releases), [Modrinth](https://modrinth.com/mod/real-camera) or [CurseForge](https://curseforge.com/minecraft/mc-mods/real-camera) Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/build.yml) @@ -31,11 +31,14 @@ Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/buil * Configs can have their priority adjusted - higher priority configs appear higher in the right-side list * Disable depth in `Preview` section to hide models blocking the view * About `Disable` section (current version still rough, complex operations): - * When texture ID field is empty, use Left Alt+Left Click to select texture + * When texture ID field is empty, use Left Alt+Mouse Left Click to select texture * Model parts contained by blue boxes won't be rendered * Left-click drag to select in texture view, other keys cancel selection * Left Alt+Left Click quickly selects hovered parts - * In `All` mode, entire texture's model won't render (blue box containing the texture in left panel indicates this) + * When Selection mode is `range` , texture in blue box will be hidden. By using Left Alt+Mouse Wheel, you can change the range of the blue box + * When Selection mode is `multiple` , it's better to disable player's part and armor but Mod models can't use it sometimes + * When Disable mode is `part` , you can choose the texture you want to hide + * When Disable mode is `All` , entire texture's model won't render (blue box containing the texture in left panel indicates this) * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) ## Dependencies @@ -57,8 +60,8 @@ Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/buil * Why does it show binding failed when use YSM models? * Snapshot 0.6.15 "try" to fix problems, but it didn't fix completely * If Minecraft version is 1.20.1, then bind upward vector to head left (or right) side, and set roll angle to 90 (or -90) in preview section -* Why does the head of YSM model disappear when in the Model View Screen? - * You downloaded Better Combat, just put it away +* Why does the disabled texture appear when i downloaded Better Combat and attack? + * Open settings of Better Combat and change Auto to False in First person player animation ### Compatibility From c561d0cfcfc180ef5522709535858db698bc674f Mon Sep 17 00:00:00 2001 From: dqsk_zze <1935752350@qq.com> Date: Sun, 5 Jul 2026 19:40:17 +0800 Subject: [PATCH 32/34] Update README_ZH.md (#227) Signed-off-by: dqsk_zze <1935752350@qq.com> --- README_ZH.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README_ZH.md b/README_ZH.md index 6f2ae5d0..fc04e1c0 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -3,7 +3,7 @@ ### [English](README.md) 使第一人称视角下的摄像头更加真实。 -支持的版本: 1.18.2 - 1.20.4 Forge,1.18.2 - 26.1 Fabric,1.21 - 26.1 NeoForge +支持的版本: 1.18.2 - 1.20.4 Forge,1.18.2 - 26.2 Fabric,1.21 - 26.2 NeoForge 从[Releases](https://github.com/xTracr/RealCamera/releases)、[Modrinth](https://modrinth.com/mod/real-camera)或[CurseForge](https://curseforge.com/minecraft/mc-mods/real-camera)下载 快照版在[这里](https://github.com/xTracr/RealCamera/actions/workflows/build.yml) @@ -35,7 +35,10 @@ * 被蓝框包含的部分不会被渲染。 * 在左侧材质视图中鼠标左键框选,其它键取消选择 * Alt+左键可快速选中被鼠标指针指向的部分 - * `全部`模式下,整个材质所对应的模型都不会被渲染(左侧会有一个包含整个材质的蓝框来表示这一点) + * 选择模式为范围,蓝框范围内被选中的面会被禁用,使用「Alt+鼠标滚轮」切换选中范围 + * 选择模式为多选,可以更好禁用原版玩家的部位,穿戴的盔甲等,但部分Mod 模型不一定适用 + * 禁用模式为部分,可以禁用被选择的贴图 + * 禁用模式为全部,整个材质所对应的模型都不会被渲染(左侧会有一个包含整个材质的蓝框来表示这一点) * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) ## 依赖项目 @@ -57,8 +60,8 @@ * 为什么ysm模型有时候会弹出绑定失败? * 快照0.6.15“尝试”修复了ysm问题,但没有修复透彻 * 如果Minecraft版本为1.20.1,那么需要将向上矢量绑定在头部的左面(或右面),并在预览界面中将翻滚角设置为90度(或-90度) -* 为什么配置ysm时候,模型视图界面中ysm模型头部消失? - * 安装了Better Combat模组,去掉就可以了 +* 为什么装了Better Combat模组后,禁用的材质在挥舞武器时会重新出现? + * 前往该模组的设置界面,把First person player animation 的Auto 改为False ### 兼容性 From 10b19a4e3033580b12ee5ed9fe6eab756f6da4b8 Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Fri, 10 Jul 2026 16:15:38 +0800 Subject: [PATCH 33/34] Update readme and issues templates (#230) --- .github/ISSUE_TEMPLATE/bug_report_cn.yml | 18 +++++++---- .github/ISSUE_TEMPLATE/bug_report_en.yml | 12 ++++--- .github/workflows/build.yml | 1 + README.md | 32 ++++++++++++------- README_ZH.md | 32 ++++++++++++------- .../assets/realcamera/lang/en_us.json | 2 -- .../assets/realcamera/lang/zh_cn.json | 2 -- 7 files changed, 60 insertions(+), 39 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.yml b/.github/ISSUE_TEMPLATE/bug_report_cn.yml index 0d86254e..62cef475 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_cn.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.yml @@ -55,8 +55,8 @@ body: label: 不兼容的mod description: >- 和bug相关的模组 -
    请在反馈问题前移除不相干的模组的情况下复现bug - placeholder: 'Mods list here' +
    请在反馈问题前移除所有不相干的模组的情况下复现bug + placeholder: '与问题有关的模组列表' render: 'raw' validations: required: true @@ -66,7 +66,8 @@ body: attributes: label: 错误描述 description: >- - 请尽可能详细的描述遇到的问题. + 请尽可能详细的描述遇到的问题 +
    同时也请务必携带复现时的视频或截图,这对于我们理解问题非常有帮助
    越清晰和详尽的描述会使该bug的处理优先级更高 validations: required: true @@ -76,9 +77,9 @@ body: attributes: label: 复现步骤 placeholder: | - 1. Join the game... + 1. 进入游戏... - 2. Change some settings... + 2. 做出某些改变... 3. ... @@ -87,7 +88,10 @@ body: attributes: label: 日志和崩溃报告 description: >- - 你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能 + 如果为非崩溃问题,请不要上传日志,这样会不利于我们理解问题 +
    你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能
    你可以日志上传到类似 https://paste.ubuntu.com/ 或者 https://mclo.gs/ 的网站并在此贴出链接 -
    **请不要在此处直接粘贴大段的日志文本!!** +
    **请不要在此处直接粘贴大段的日志文本!!!** +
    **请不要在此处直接粘贴大段的日志文本!!!** +
    **请不要在此处直接粘贴大段的日志文本!!!** placeholder: '把日志文件往这丢或者使用外部链接' \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml index 72032021..92e716d9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_en.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml @@ -55,7 +55,7 @@ body: label: Incompatible Mods description: >- The mods related to the bug -
    Reproduce the bug with unrelated mods removed before reporting +
    Reproduce the bug with all unrelated mods removed before reporting placeholder: 'Mods list here' render: 'raw' validations: @@ -66,7 +66,8 @@ body: attributes: label: Bug Description description: >- - Please describe the issue you encountered in as much detail as possible. + Please describe the issue you encountered in as much detail as possible +
    Please also attach screenshots or reproduction videos, as they help us diagnose the problem effectively
    Clearer and more detailed descriptions will receive higher processing priority validations: required: true @@ -87,7 +88,10 @@ body: attributes: label: Logs & Crash Reports description: >- - You can find error reports in /logs/latest.log and /crash-reports, or use the launcher's export function + If your issue is not a crash, please do not upload log files, as they will hinder our understanding of the problem +
    You can find error reports in /logs/latest.log and /crash-reports, or use the launcher's export function
    You can upload logs to sites like https://paste.ubuntu.com/ or https://mclo.gs/ and post the link here -
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!** +
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!!** +
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!!** +
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!!** placeholder: 'Drag log file here or use external link' \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7414c951..1de9b1fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,7 @@ name: Build on: pull_request: paths-ignore: + - '**/ISSUE_TEMPLATE/**' - '**/lang/**' - '**.md' - 'LICENSE' diff --git a/README.md b/README.md index 78beb517..33594776 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/buil * Bind the camera to a specific part of the body. * Customize the position and rotation of the camera. * Render player model in first-person perspective. -* Use F6 to toggle the feature on or off and other hotkeys to adjust the camera. +* Use 「F6」 to toggle the feature on or off and other hotkeys to adjust the camera. * Configure these features in the Config Screen (Cloth Config required) and the Model View Screen (0.6+). ### Configuration (0.6+) @@ -25,20 +25,27 @@ Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/buil * From the top right button, enter the `Preview` section, where you can see the relative relationship between the camera and the model and make certain adjustments (you can also adjust through key bindings). * ![gui_preview](https://cdn.modrinth.com/data/fYYSAh4R/images/44c87a6f1750f8d1b03422120e6042d1098896cb.png) * Enter a name and save. +* ~~If you have difficulty configuring the settings, you can also enable `Mod Settings > Binding Mode > Legacy Binding Mode` +
    Note: This setting is exclusive to vanilla Minecraft.~~ #### Tips * Configs can have their priority adjusted - higher priority configs appear higher in the right-side list +* In the mod settings, you can manually switch between available configurations by modifying the configuration index. You can also set it to a non-zero value to lock the active configuration +* When the main feature is enabled, hover over the configuration entries. The one annotated with `Current Config` is the configuration currently in use * Disable depth in `Preview` section to hide models blocking the view -* About `Disable` section (current version still rough, complex operations): - * When texture ID field is empty, use Left Alt+Mouse Left Click to select texture - * Model parts contained by blue boxes won't be rendered - * Left-click drag to select in texture view, other keys cancel selection - * Left Alt+Left Click quickly selects hovered parts - * When Selection mode is `range` , texture in blue box will be hidden. By using Left Alt+Mouse Wheel, you can change the range of the blue box - * When Selection mode is `multiple` , it's better to disable player's part and armor but Mod models can't use it sometimes - * When Disable mode is `part` , you can choose the texture you want to hide - * When Disable mode is `All` , entire texture's model won't render (blue box containing the texture in left panel indicates this) +* About `Disable` section: + * When texture ID field is empty, use 「Left Alt + Left Click」 to select a texture + * Selection modes: + * Single & Multiple selection: Press 「Left Alt + Left Click」 to select the faces to disable + * Range selection: Press 「Left Alt + Left Click」 to confirm the selection area, and use 「Alt + Scroll Wheel」 to adjust the size of the selection area + * In the left texture view of the player rendering area: + * Press 「Left Click」 to start/end drag selection, press any other key to cancel the selection + * Faces selected via drag selection have the same effect as faces disabled via Multiple selection + * Notably, disabling faces this way is generally more performance-efficient than other methods + * Disable modes: + * In `part` mode, selected faces will not be rendered (you can preview the effect by toggling off the visibility of the disable configuration on the right pane) + * In `All` mode, entire texture's model won't render (blue box containing the texture in left panel indicates this) * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) ## Dependencies @@ -58,8 +65,9 @@ Snapshots are [here](https://github.com/xTracr/RealCamera/actions/workflows/buil * Why can't i open the Config Screen? * Please downlowd [Cloth Config API](https://modrinth.com/mod/cloth-config) * Why does it show binding failed when use YSM models? - * Snapshot 0.6.15 "try" to fix problems, but it didn't fix completely - * If Minecraft version is 1.20.1, then bind upward vector to head left (or right) side, and set roll angle to 90 (or -90) in preview section + * Snapshot 0.6.15 "try" to fix problems, but it didn't fully fix completely + * When your model rotates to a specific angle, the position you bound may disappear due to YSM's `face culling feature`, resulting in binding failure + * You can alleviate this problem by increasing the `Bind Result Retention Frames` * Why does the disabled texture appear when i downloaded Better Combat and attack? * Open settings of Better Combat and change Auto to False in First person player animation diff --git a/README_ZH.md b/README_ZH.md index fc04e1c0..64ae27ad 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -12,7 +12,7 @@ * 将摄像头绑定到身体的特定部位 * 自定义摄像头的位置和旋转角度 * 在第一人称视角下渲染玩家模型 -* 按下F6来开关,另外一些键来调整摄像头 +* 按下「F6」来开关,另外一些键来调整摄像头 * 在配置界面(需要Cloth Config)和模型视图(0.6+)界面,配置以上特性 ### 配置(0.6+) @@ -25,20 +25,27 @@ * 从右上角的按钮进入`预览`界面,在这里可以看到摄像头与模型的相对关系,并进行一定的调整(也可以通过按键绑定调整) * ![gui_preview](https://cdn.modrinth.com/data/fYYSAh4R/images/44c87a6f1750f8d1b03422120e6042d1098896cb.png) * 输入名称并保存 +* ~~如果实在不会配置,也可以将`模组设置 > 绑定模式 > 旧绑定模式`打开 +
    注意:该设置仅限原版~~ #### Tips * 可以更改配置的优先级,优先级越高的配置,在右侧排序越靠上 +* 在模组设置中,你可以通过修改配置索引来主动切换允许的配置,也可以调整到非0的数来锁定配置 +* 当开启主功能时,将鼠标放到配置上方,其中有注释`当前配置`的即为此时使用的配置 * 在`预览`界面可以更改禁用深度来禁用眼前的模型的渲染 -* 关于`禁用`界面(当前版本尚不完善,操作较为繁琐): - * 在左侧材质id输入框为空时,可以使用Alt+左键选择材质 - * 被蓝框包含的部分不会被渲染。 - * 在左侧材质视图中鼠标左键框选,其它键取消选择 - * Alt+左键可快速选中被鼠标指针指向的部分 - * 选择模式为范围,蓝框范围内被选中的面会被禁用,使用「Alt+鼠标滚轮」切换选中范围 - * 选择模式为多选,可以更好禁用原版玩家的部位,穿戴的盔甲等,但部分Mod 模型不一定适用 - * 禁用模式为部分,可以禁用被选择的贴图 - * 禁用模式为全部,整个材质所对应的模型都不会被渲染(左侧会有一个包含整个材质的蓝框来表示这一点) +* 关于`禁用`界面: + * 在左侧材质id输入框为空时,使用「Alt+左键」选择材质 + * 选择模式: + * 单选、多选:按下「Alt+左键」以选择需要禁用的面 + * 范围:按下「Alt+左键」以确定被选择区域,使用「Alt+滚轮」以更改被选择区域的大小 + * 在玩家渲染左侧材质视图中: + * 按下「鼠标左键」开始/结束框选,其它键取消选择 + * 被框选中的面效果与多选禁用的面效果相同 + * 值得一提的是,使用这种方式被禁用面,通常比使用其他方法更加节省性能 + * 禁用模式: + * `部分`模式下,被选择的面不会渲染(可以通过关闭右侧禁用配置的可见性来预览) + * `全部`模式下,整个材质所对应的模型都不会渲染(会有一个包含整个材质的蓝框来表示这一点) * ![gui_disable](https://cdn.modrinth.com/data/fYYSAh4R/images/b49ac4da6bf8a59f13c7e93ca1ef76b73e5d23b4.png) ## 依赖项目 @@ -58,8 +65,9 @@ * 为什么打不开配置界面(模组设置)? * 没有安装[Cloth Config API](https://modrinth.com/mod/cloth-config) * 为什么ysm模型有时候会弹出绑定失败? - * 快照0.6.15“尝试”修复了ysm问题,但没有修复透彻 - * 如果Minecraft版本为1.20.1,那么需要将向上矢量绑定在头部的左面(或右面),并在预览界面中将翻滚角设置为90度(或-90度) + * 快照0.6.15“尝试”修复了ysm问题,但没有完全修复透彻 + * 当你的模型旋转到特定角时,由于ysm的`面剔除功能`,你绑定的位置可能消失,导致绑定失败 + * 可以通过增加`绑定结果保留帧数`来缓解这个问题 * 为什么装了Better Combat模组后,禁用的材质在挥舞武器时会重新出现? * 前往该模组的设置界面,把First person player animation 的Auto 改为False diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index dcfac604..50fd10fe 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -28,7 +28,6 @@ "config.option.xtracr_realcamera.pitch": "Pitch", "config.option.xtracr_realcamera.renderModel": "Render Player Model", "config.option.xtracr_realcamera.renderStuckObjects": "Render Stuck Objects", - "config.option.xtracr_realcamera.rerenderModel": "Rerender Model", "config.option.xtracr_realcamera.roll": "Roll", "config.option.xtracr_realcamera.rotationSmoothFactor": "Rotation Smooth Factor", "config.option.xtracr_realcamera.scale": "Scale", @@ -53,7 +52,6 @@ "config.tooltip.xtracr_realcamera.exitTick": "The time before re-enabling main feature after exiting restricted states (e.g., swimming, crawling) (1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.renderModel": "Render player model in first-person perspective", "config.tooltip.xtracr_realcamera.renderStuckObjects": "Arrows, bee stings and other objects that can be stuck in the player's body", - "config.tooltip.xtracr_realcamera.rerenderModel": "Render the model again at the original rendering time to avoid some visual problems caused by rendering early", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "Smooth factor of camera rotation, the higher the value, the smoother the movement", "config.tooltip.xtracr_realcamera.scale": "Control the size of the offsets", "general.xtracr_realcamera.modName": "Real Camera", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 0f4ebc19..b5f22c3d 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -28,7 +28,6 @@ "config.option.xtracr_realcamera.pitch": "俯仰角", "config.option.xtracr_realcamera.renderModel": "渲染玩家模型", "config.option.xtracr_realcamera.renderStuckObjects": "渲染卡在身上的物体", - "config.option.xtracr_realcamera.rerenderModel": "重新渲染模型", "config.option.xtracr_realcamera.roll": "翻滚角", "config.option.xtracr_realcamera.rotationSmoothFactor": "旋转平滑系数", "config.option.xtracr_realcamera.scale": "缩放比例", @@ -53,7 +52,6 @@ "config.tooltip.xtracr_realcamera.exitTick": "玩家停止某些状态(如游泳、爬行)后重启主要功能的时间(1 tick = 0.05s)", "config.tooltip.xtracr_realcamera.renderModel": "在第一人称视角下渲染玩家模型", "config.tooltip.xtracr_realcamera.renderStuckObjects": "箭,蜂刺和其它会卡在玩家身体里的物体", - "config.tooltip.xtracr_realcamera.rerenderModel": "在原本的渲染时机重新渲染模型,以避免一些因提前渲染导致的视觉问题", "config.tooltip.xtracr_realcamera.rotationSmoothFactor": "相机旋转平滑系数,值越大越平滑", "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", "general.xtracr_realcamera.modName": "Real Camera", From 6fa653fe353980435d94a8561b1876c7f9d2d0d0 Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Wed, 12 Aug 2026 21:19:13 +0800 Subject: [PATCH 34/34] Migrate build.gradle to Kotlin DSL --- .github/ISSUE_TEMPLATE/bug_report_cn.yml | 50 ++-- .github/ISSUE_TEMPLATE/bug_report_en.yml | 40 ++- .github/ISSUE_TEMPLATE/feature_request_cn.yml | 43 +++ .github/ISSUE_TEMPLATE/feature_request_en.yml | 43 +++ .github/workflows/build.yml | 2 +- .github/workflows/publish.yml | 2 +- build.gradle | 53 ---- build.gradle.kts | 22 ++ common/build.gradle | 12 - common/build.gradle.kts | 63 +++++ .../gui/components/SimpleIconButton.java | 1 + .../realcamera/mixin/MixinGameRenderer.java | 2 +- .../renderer/MultiVertexCatcher.java | 2 +- .../resources/realcamera-common.mixins.json | 3 +- fabric/build.gradle | 68 ----- fabric/build.gradle.kts | 103 +++++++ forge/.gitignore | 1 + forge/build.gradle | 66 ----- forge/build.gradle.kts | 251 ++++++++++++++++++ ...ial-1.20.1-20230612.114412-map2srg.tsrg.gz | Bin 0 -> 1609730 bytes .../xtracr/realcamera/RealCameraForge.java | 1 + .../resources/META-INF/accesstransformer.cfg | 7 + gradle.properties | 26 +- gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 48462 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 6 +- gradlew.bat | 35 +-- settings.gradle | 14 - settings.gradle.kts | 34 +++ 29 files changed, 669 insertions(+), 283 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/feature_request_cn.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request_en.yml delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 common/build.gradle create mode 100644 common/build.gradle.kts delete mode 100644 fabric/build.gradle create mode 100644 fabric/build.gradle.kts create mode 100644 forge/.gitignore delete mode 100644 forge/build.gradle create mode 100644 forge/build.gradle.kts create mode 100644 forge/libs/mappings_official-1.20.1-20230612.114412-map2srg.tsrg.gz create mode 100644 forge/src/main/resources/META-INF/accesstransformer.cfg delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.yml b/.github/ISSUE_TEMPLATE/bug_report_cn.yml index 8999102c..62cef475 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_cn.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.yml @@ -7,42 +7,56 @@ body: - type: markdown attributes: value: | - 请确保您使用的是最新版的RC,您反馈的bug很可能已经在更新版本中修复 + 请确保您使用的是最新版的RealCamera,您反馈的bug很可能已经在更新版本中修复 (查看尾缀是否与最新工件相同) 在反馈bug前,请先尝试搜索是否已有相似的问题,请不要重复打开相同的issue 所有有关YSM的问题,请您优先寻求他人的帮助,或者观看配置模型教程 - 而不是直接在issue中提问。 + 而不是直接在issue中提问 - type: checkboxes id: preliminary attributes: label: 我已确认 ... options: - - label: 我正在使用最新版的RC + - label: 我正在使用最新版的RealCamera required: true - - label: 无法在关闭主要功能时复现 + - label: issues里没有相关的问题 required: true - type: input - id: minecraft-version-loader + id: minecraft-version attributes: - label: Minecraft版本和加载器 + label: Minecraft版本 description: | - 请填写游戏版本与所使用的加载器. + 你所使用的Minecraft的版本. - 你可以在游戏主界面作下角或者游戏启动时的日志开头等地方找到. + 你可以在游戏主界面左下角或者游戏启动时的日志开头等地方找到. validations: required: true + - type: checkboxes + id: bug-type + attributes: + label: 问题类型 + options: + - label: 开启主功能时出现bug + required: false + - label: 与其他模组的兼容问题 + required: false + - label: 在fabric端出现 + required: false + - label: 在(neo)forge端出现 + required: false + - type: textarea id: incompatible-mods attributes: label: 不兼容的mod description: >- 和bug相关的模组 -
    请在反馈问题前尝试尽可能移除不相干的模组的情况下复现bug - placeholder: 'Mods list here' +
    请在反馈问题前移除所有不相干的模组的情况下复现bug + placeholder: '与问题有关的模组列表' render: 'raw' validations: required: true @@ -52,7 +66,8 @@ body: attributes: label: 错误描述 description: >- - 请尽可能详细的描述遇到的问题. + 请尽可能详细的描述遇到的问题 +
    同时也请务必携带复现时的视频或截图,这对于我们理解问题非常有帮助
    越清晰和详尽的描述会使该bug的处理优先级更高 validations: required: true @@ -62,9 +77,9 @@ body: attributes: label: 复现步骤 placeholder: | - 1. Join the game... + 1. 进入游戏... - 2. Change some settings... + 2. 做出某些改变... 3. ... @@ -73,7 +88,10 @@ body: attributes: label: 日志和崩溃报告 description: >- - 你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能 + 如果为非崩溃问题,请不要上传日志,这样会不利于我们理解问题 +
    你可以在/logs/lastest.log 和 /crash-report 中找到错误报告,或者使用启动器的导出功能
    你可以日志上传到类似 https://paste.ubuntu.com/ 或者 https://mclo.gs/ 的网站并在此贴出链接 -
    **请不要在此此处直接粘贴大段的日志文本!!** - placeholder: '把日志文件往这丢或者使用外部链接' +
    **请不要在此处直接粘贴大段的日志文本!!!** +
    **请不要在此处直接粘贴大段的日志文本!!!** +
    **请不要在此处直接粘贴大段的日志文本!!!** + placeholder: '把日志文件往这丢或者使用外部链接' \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.yml b/.github/ISSUE_TEMPLATE/bug_report_en.yml index 000632d0..92e716d9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_en.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_en.yml @@ -12,7 +12,7 @@ body: Before reporting a bug, please search for similar issues first and avoid opening duplicate issues For all YSM-related questions, please seek help from others or watch configuration model tutorials first - instead of asking directly in the issue. + instead of asking directly in the issue - type: checkboxes id: preliminary @@ -21,27 +21,41 @@ body: options: - label: I am using the latest version of RealCamera required: true - - label: Unable to reproduce when main feature is disabled + - label: No related issues found in the issue tracker. required: true + - label: Appears on Fabric + required: false + - label: Appears on (Neo)Forge + required: false - type: input - id: minecraft-version-loader + id: minecraft-version attributes: - label: Minecraft Version and Loader + label: Minecraft Version description: | - Please specify the game version and your mod loader. + The Minecraft version you are using. You can find them at the corner of main menu or in the log while startup. validations: required: true + - type: checkboxes + id: bug-type + attributes: + label: Question Type + options: + - label: Bug occurs when enabling main feature + required: false + - label: Incompatibility with other mods + required: false + - type: textarea id: incompatible-mods attributes: label: Incompatible Mods description: >- - The mods related to the bug. -
    Try to remove unrelated plugins and mods before reporting + The mods related to the bug +
    Reproduce the bug with all unrelated mods removed before reporting placeholder: 'Mods list here' render: 'raw' validations: @@ -52,7 +66,8 @@ body: attributes: label: Bug Description description: >- - Please describe the issue you encountered in as much detail as possible. + Please describe the issue you encountered in as much detail as possible +
    Please also attach screenshots or reproduction videos, as they help us diagnose the problem effectively
    Clearer and more detailed descriptions will receive higher processing priority validations: required: true @@ -73,7 +88,10 @@ body: attributes: label: Logs & Crash Reports description: >- - You can find error reports in /logs/latest.log and /crash-reports, or use the launcher's export function + If your issue is not a crash, please do not upload log files, as they will hinder our understanding of the problem +
    You can find error reports in /logs/latest.log and /crash-reports, or use the launcher's export function
    You can upload logs to sites like https://paste.ubuntu.com/ or https://mclo.gs/ and post the link here -
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!** - placeholder: 'Drag log file here or use external link' +
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!!** +
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!!** +
    **DO NOT PASTE LARGE LOGS DIRECTLY HERE!!!** + placeholder: 'Drag log file here or use external link' \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request_cn.yml b/.github/ISSUE_TEMPLATE/feature_request_cn.yml new file mode 100644 index 00000000..f960b8d0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request_cn.yml @@ -0,0 +1,43 @@ +name: 新功能建议 +description: 为我们提供新的想法 +title: "[new feature]:" +labels: [ "new feature" ] +body: + - type: markdown + attributes: + value: | + 感谢您花时间提出新的功能想法! + 请确保最新版本内没有这个功能! + + - type: textarea + id: feature-description + attributes: + label: 这个功能是什么? + description: 请清晰地描述您希望添加的功能 + placeholder: 我希望... + validations: + required: true + + - type: textarea + id: problem-and-solution + attributes: + label: 这个功能可以解决什么问题? + description: 请详细说明其作用 + placeholder: 这个功能可以帮助解决... + validations: + required: true + + - type: textarea + id: ideal-solution + attributes: + label: 这个功能理想中的解决方案是什么样的? + description: 例如新的按钮应该在何处,哪里需要新的配置选项 + placeholder: 我希望... + validations: + required: true + + - type: textarea + id: additional-context + attributes: + label: 其他信息 + description: 任何关于功能的上下文或截图 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request_en.yml b/.github/ISSUE_TEMPLATE/feature_request_en.yml new file mode 100644 index 00000000..0ae65664 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request_en.yml @@ -0,0 +1,43 @@ +name: New Feature Request +description: Suggest an idea for this project +title: "[new feature]: " +labels: [ "new feature" ] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to suggest a new feature! + Check the latest build to confirm the feature is missing. + + - type: textarea + id: feature-description + attributes: + label: What is this feature about? + description: A clear and concise description of what the feature is. + placeholder: I would like to... + validations: + required: true + + - type: textarea + id: problem-and-solution + attributes: + label: What problem does this feature solve? + description: Please elaborate on its purpose + placeholder: This feature helps resolve... + validations: + required: true + + - type: textarea + id: ideal-solution + attributes: + label: What does your ideal solution look like? + description: For example, where new buttons or config options should be placed + placeholder: I would like... + validations: + required: true + + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Any relevant information or screenshots regarding the feature \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 74d7b95e..2c1ce2a5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,7 +28,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Make Gradle Wrapper Executable if: ${{ runner.os != 'Windows' }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f297d1ca..6096f2cd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -26,7 +26,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Make Gradle Wrapper Executable if: ${{ runner.os != 'Windows' }} diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 4a6dc1fa..00000000 --- a/build.gradle +++ /dev/null @@ -1,53 +0,0 @@ -plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false -} - -architectury { - minecraft = rootProject.minecraft_version -} - -subprojects { - apply plugin: "dev.architectury.loom" - - loom { - silentMojangMappingsLicense() - accessWidenerPath = project(":common").file("src/main/resources/realcamera.accesswidener") - } - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.officialMojangMappings() - //mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - base { - archivesName = rootProject.archives_base_name - } - - version = rootProject.mod_version + (findProperty("commitSHA") ? "-${(commitSHA as String).substring(0,7)}" : "") - group = rootProject.maven_group - - repositories { - maven { url "https://maven.shedaniel.me/" } - maven { url "https://maven.terraformersmc.com/releases/" } - maven { url "https://api.modrinth.com/maven" } - //maven { url "https://cursemaven.com" } - //maven { url "https://www.jitpack.io" } - } - - tasks.withType(JavaCompile).configureEach { - options.encoding = "UTF-8" - options.release = 17 - } - - java { - withSourcesJar() - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..2db443ba --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,22 @@ +plugins { + id("java-library") + id("maven-publish") +} + +allprojects { + val commitSHA = findProperty("commitSHA")?.let { "-${it.toString().take(7)}" }.orEmpty() + group = property("mod_group_id") as String + version = "${property("mod_version")}$commitSHA" + + repositories { + mavenCentral() + maven("https://libraries.minecraft.net/") + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/") + maven("https://maven.fabricmc.net/") + maven("https://maven.minecraftforge.net/") + maven("https://api.modrinth.com/maven/") + // maven("https://cursemaven.com") + // maven("https://www.jitpack.io" + } +} diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index f4d27d6a..00000000 --- a/common/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -architectury { - common(rootProject.enabled_platforms.split(",")) -} - -dependencies { - modCompileOnly "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - - // Cloth Config - modCompileOnly("me.shedaniel.cloth:cloth-config:${rootProject.cloth_config_version}") { - exclude(group: "net.fabricmc.fabric-api") - } -} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 00000000..01cb7847 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,63 @@ +plugins { + id("net.fabricmc.fabric-loom-remap") + id("maven-publish") +} + +repositories { + maven("https://libraries.minecraft.net/") + maven("https://maven.fabricmc.net/") + maven("https://maven.shedaniel.me/") + gradlePluginPortal() +} + +val modId = project.property("mod_id") as String +val javaVersion = project.property("java_version") as String +val minecraftVersion = project.property("minecraft_version") as String +val fabricLoaderVersion = project.property("fabric_loader_version") as String + +val clothConfigVersion = project.property("cloth_config_version") as String + +base { + archivesName = "$modId-$minecraftVersion-fabric" +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersion)) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(javaVersion.toInt()) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraftVersion") + mappings(loom.officialMojangMappings()) + + compileOnly("org.spongepowered:mixin:0.8.5") + compileOnly("io.github.llamalad7:mixinextras-common:0.5.3") + annotationProcessor("io.github.llamalad7:mixinextras-common:0.5.3") + // We depend on Fabric Loader here to use the Fabric @Environment annotations, + modCompileOnly("net.fabricmc:fabric-loader:$fabricLoaderVersion") + + // Cloth Config + modCompileOnly("me.shedaniel.cloth:cloth-config-fabric:$clothConfigVersion") { + exclude(group = "net.fabricmc.fabric-api") + } +} + +loom { + accessWidenerPath.set(file("src/main/resources/realcamera.accesswidener")) +} + +publishing { + publications { + register("commonJar") { + artifactId = base.archivesName.get() + from(components["java"]) + } + } +} diff --git a/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java b/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java index 51073e18..a8b0bf00 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/components/SimpleIconButton.java @@ -9,6 +9,7 @@ import java.util.function.Consumer; +@SuppressWarnings("removal") public class SimpleIconButton extends AbstractButton { public static final ResourceLocation ICON_TEXTURE = new ResourceLocation(RealCamera.MOD_ID, "textures/gui/icon.png"); protected final ResourceLocation texture; diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java index 892e3d16..34af123b 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java @@ -31,7 +31,7 @@ public abstract class MixinGameRenderer { @Shadow @Final private Camera mainCamera; - @ModifyVariable(method = "pick", at = @At("STORE"), name = "entityHitResult") + @ModifyVariable(method = "pick", at = @At("STORE"), ordinal = 0) private EntityHitResult realcamera$modifyEntityHitResult(EntityHitResult entityHitResult) { CrosshairUtil.capturedEntityHitResult = entityHitResult; if (!ConfigFile.config().dynamicCrosshair && RealCameraCore.isActive()) { diff --git a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java index 3f996134..c9e6be43 100644 --- a/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java +++ b/common/src/main/java/com/xtracr/realcamera/renderer/MultiVertexCatcher.java @@ -57,7 +57,7 @@ protected MeshCatcher() { } @Override - protected @NotNull BufferBuilder getBuilderRaw(RenderType renderType) { + public @NotNull BufferBuilder getBuilderRaw(RenderType renderType) { return bufferPools.computeIfAbsent(renderType, type -> new BufferBuilderPool(type.bufferSize())).getBuffer(); } diff --git a/common/src/main/resources/realcamera-common.mixins.json b/common/src/main/resources/realcamera-common.mixins.json index a853b9c0..e550d9f7 100644 --- a/common/src/main/resources/realcamera-common.mixins.json +++ b/common/src/main/resources/realcamera-common.mixins.json @@ -27,5 +27,6 @@ ], "injectors": { "defaultRequire": 1 - } + }, + "refmap": "realcamera-common.refmap.json" } diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index 6cff5c4d..00000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,68 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "8.1.1" -} - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common - shadowCommon - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - - // Cloth Config - modRuntimeOnly "me.shedaniel.cloth:cloth-config-fabric:${rootProject.cloth_config_version}" - // Modmenu - modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { - exclude(group: "net.fabricmc.fabric-api") - } - -// modImplementation "org.antlr:antlr4-runtime:4.13.1" -// modImplementation "io.github.douira:glsl-transformer:2.0.1" -// modImplementation "org.anarres:jcpp:1.4.14" -// modImplementation "maven.modrinth:iris:1.8.8+1.21.1-fabric" -// modImplementation "maven.modrinth:sodium:mc1.21.1-0.6.13-fabric" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} - -processResources { - inputs.property "version", project.version - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -shadowJar { - exclude "architectury.common.json" - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - injectAccessWidener = true - inputFile.set shadowJar.archiveFile - dependsOn shadowJar -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 00000000..673fea80 --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,103 @@ +plugins { + id("net.fabricmc.fabric-loom-remap") + id("maven-publish") +} + +val modId = project.property("mod_id") as String +val javaVersion = project.property("java_version") as String +val minecraftVersion = project.property("minecraft_version") as String +val fabricLoaderVersion = project.property("fabric_loader_version") as String +val fabricApiVersion = project.property("fabric_api_version") as String + +val clothConfigVersion = project.property("cloth_config_version") as String +val modMenuVersion = project.property("modmenu_version") as String + +base { + archivesName = "$modId-$minecraftVersion-fabric" +} + +val commonProject = project(":common") + +project.evaluationDependsOn(commonProject.path) + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersion)) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(javaVersion.toInt()) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraftVersion") + mappings(loom.officialMojangMappings()) + + modImplementation("net.fabricmc:fabric-loader:$fabricLoaderVersion") + modImplementation("net.fabricmc.fabric-api:fabric-api:$fabricApiVersion") + + // Cloth Config + modRuntimeOnly("me.shedaniel.cloth:cloth-config-fabric:$clothConfigVersion") + // Modmenu + modImplementation("com.terraformersmc:modmenu:$modMenuVersion") { + exclude(group = "net.fabricmc.fabric-api") + } + + implementation(commonProject.sourceSets.main.get().output) +} + +loom { + accessWidenerPath.set(project(":common").file("src/main/resources/realcamera.accesswidener")) + + mods { + create(modId) { + sourceSet(sourceSets.main.get()) + } + } +} + +sourceSets { + named("main") { + resources { + srcDir(commonProject.sourceSets.main.get().resources) + } + } +} + +tasks.processResources { + inputs.property("version", project.version) + filesMatching("fabric.mod.json") { + expand("version" to project.version) + } +} + +tasks.jar { + from(sourceSets.main.get().output) + from(commonProject.sourceSets.main.get().output) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +val sourcesJarTask = tasks.named("sourcesJar") { + from(sourceSets.main.get().allSource) + from(commonProject.sourceSets.main.get().allSource) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier.set("sources") +} + +artifacts { + archives(tasks.jar) + archives(sourcesJarTask) +} + +publishing { + publications { + register("fabricJar") { + artifactId = base.archivesName.get() + artifact(tasks.jar) + artifact(sourcesJarTask) + } + } +} diff --git a/forge/.gitignore b/forge/.gitignore new file mode 100644 index 00000000..a14cdf7f --- /dev/null +++ b/forge/.gitignore @@ -0,0 +1 @@ +!libs/ \ No newline at end of file diff --git a/forge/build.gradle b/forge/build.gradle deleted file mode 100644 index 260b4d7f..00000000 --- a/forge/build.gradle +++ /dev/null @@ -1,66 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "8.1.1" -} - -architectury { - platformSetupLoomIde() - forge() -} - -loom { - forge { - convertAccessWideners = true - extraAccessWideners.add loom.accessWidenerPath.get().asFile.name - mixinConfig "realcamera-common.mixins.json" - mixinConfig "realcamera.mixins.json" - } -} - -configurations { - common - shadowCommon - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common -} - -dependencies { - forge "net.minecraftforge:forge:${rootProject.forge_version}" - - // Cloth Config - modRuntimeOnly "me.shedaniel.cloth:cloth-config-forge:${rootProject.cloth_config_version}" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive false } -} - -processResources { - inputs.property "version", project.version - filesMatching("META-INF/mods.toml") { - expand "version": project.version - } -} - -shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - inputFile.set shadowJar.archiveFile - dependsOn shadowJar -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts new file mode 100644 index 00000000..ce6c4ac6 --- /dev/null +++ b/forge/build.gradle.kts @@ -0,0 +1,251 @@ +buildscript { + repositories { mavenCentral() } + dependencies { classpath("org.ow2.asm:asm:9.5") } +} + +plugins { + id("java-library") + id("net.minecraftforge.gradle") + id("net.minecraftforge.renamer") + id("maven-publish") +} + +val modId = project.property("mod_id") as String +val javaVersion = project.property("java_version") as String +val minecraftVersion = project.property("minecraft_version") as String +val forgeVersion = project.property("forge_version") as String + +val clothConfigVersion = project.property("cloth_config_version") as String + +val mapFile = file("libs/mappings_official-1.20.1-20230612.114412-map2srg.tsrg.gz") +renamer.mappings.setFrom(mapFile) + +base { + archivesName = "$modId-$minecraftVersion-forge" +} + +val commonProject = project(":common") + +project.evaluationDependsOn(commonProject.path) + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersion)) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(javaVersion.toInt()) +} + +dependencies { + implementation(minecraft.dependency("net.minecraftforge:forge:$forgeVersion")) + compileOnly("org.spongepowered:mixin:0.8.5") + compileOnly("io.github.llamalad7:mixinextras-forge:0.5.0") + annotationProcessor("io.github.llamalad7:mixinextras-forge:0.5.0") + + // Cloth Config + implementation(renamer.dependency("me.shedaniel.cloth:cloth-config-forge:$clothConfigVersion")) + + implementation(commonProject.sourceSets.main.get().output) +} + +configurations.named("annotationProcessor") { + extendsFrom(configurations.named("implementation").get()) +} + +// Merge mappings from TSRG into the refmap. +// Multi-module Mixin AP combined with Forge's SRG mappings necessitates these workarounds. +// If FG7 resolves these issues in the future, they may no longer be needed +tasks.named("compileJava", JavaCompile::class).configure { + doLast { + val tsrg = layout.buildDirectory.file("tmp/compileJava/compileJava-mappings.tsrg").get().asFile + val refmap = layout.buildDirectory.file("tmp/compileJava/compileJava-refmap.json").get().asFile + if (!tsrg.exists() || !refmap.exists()) return@doLast + val lines = tsrg.readLines().map { it.trim().split(" ") } + val fieldsByClass = mutableMapOf>() + lines.filter { it.size == 3 && "(" !in it.joinToString() } + .forEach { fieldsByClass.getOrPut(it[0]) { mutableMapOf() }[it[1]] = it[2] } + val methodsByClass = mutableMapOf>() + lines.filter { it.size == 4 } + .forEach { methodsByClass.getOrPut(it[0]) { mutableMapOf() }[it[1]] = it[3] } + if (fieldsByClass.isEmpty() && methodsByClass.isEmpty()) return@doLast + var text = refmap.readText() + val allClasses = (fieldsByClass.keys + methodsByClass.keys).toSet() + + fun buildInsert(fields: Map, methods: Map): String { + val entries = mutableListOf() + fields.forEach { (name, srg) -> entries.add(""""$name": "$srg"""") } + methods.forEach { (name, srg) -> entries.add(""""$name": "$srg"""") } + return entries.joinToString(",\n") + } + + allClasses.forEach { cls -> + val fields = fieldsByClass[cls] ?: emptyMap() + val methods = methodsByClass[cls] ?: emptyMap() + val insert = buildInsert(fields, methods) + if (insert.isEmpty()) return@forEach + text = text.replace(Regex(""""\Q$cls\E":\s*\{""")) { "${it.value}\n$insert," } + } + + val seargeKey = """"searge": {""" + val seargeIdx = text.indexOf(seargeKey) + if (seargeIdx >= 0) { + allClasses.forEach { cls -> + val seargeSection = text.substring(seargeIdx) + if (!seargeSection.contains(""""$cls":""")) { + val fields = fieldsByClass[cls] ?: emptyMap() + val methods = methodsByClass[cls] ?: emptyMap() + val entries = mutableListOf() + fields.forEach { (name, srg) -> entries.add(""""$name": "$srg"""") } + methods.forEach { (name, srg) -> entries.add(""""$name": "$srg"""") } + if (entries.isNotEmpty()) { + val newEntry = """"$cls": {${entries.joinToString(",\n")}},""" + text = text.substring(0, seargeIdx + seargeKey.length) + newEntry + text.substring(seargeIdx + seargeKey.length) + } + } + } + } + refmap.writeText(text) + } +} + +// Never use Forge for debugging modifications unless absolutely necessary!!! +minecraft { + mavenizer(repositories) + mappings("official", minecraftVersion) + useDefaultAccessTransformer() + accessTransformers.setFrom(file("src/main/resources/META-INF/accesstransformer.cfg")) + + runs { + configureEach { + workingDir.convention(layout.projectDirectory.dir("run")) + //systemProperty("forge.logging.console.level", "debug") + systemProperty("eventbus.api.strictRuntimeChecks", "true") + } + register("client") { + systemProperty("forge.enabledGameTestNamespaces", modId) + workingDir.convention(layout.projectDirectory.dir("run/client")) + } + register("server") { + systemProperty("forge.enabledGameTestNamespaces", modId) + workingDir.convention(layout.projectDirectory.dir("run/server")) + args("--nogui") + } + } +} + +sourceSets.named("main") { + java { srcDir(commonProject.sourceSets.main.get().java.srcDirs) } + resources { srcDir(commonProject.sourceSets.main.get().resources.srcDirs) } +} + +tasks.named("processResources") { + inputs.property("version", project.version) + filesMatching("META-INF/mods.toml") { + expand("version" to project.version) + } +} + +tasks.named("build") { + dependsOn(tasks.named("renameJar")) +} + +tasks.named("assemble") { + dependsOn(tasks.named("renameJar")) +} + +tasks.named("jar") { + from(sourceSets.main.get().output) + from(commonProject.sourceSets.main.get().output) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + doFirst { + // Same root cause as above — fixes the same category of issue, but not the same problem. + // Rename @Shadow fields/methods in compiled classes to SRG names via ASM + val tsrg = layout.buildDirectory.file("tmp/compileJava/compileJava-mappings.tsrg").get().asFile + if (!tsrg.exists()) return@doFirst + val lines = tsrg.readLines().map { it.trim().split(" ") } + val fieldRenames = mutableMapOf>() + val methodRenames = mutableMapOf>>() + for (parts in lines) { + when (parts.size) { + 3 if "(" !in parts.joinToString() -> fieldRenames.getOrPut(parts[0]) { mutableMapOf() }[parts[1]] = parts[2] + 4 -> methodRenames.getOrPut(parts[0]) { mutableMapOf() } + .getOrPut(parts[1]) { mutableMapOf() }[parts[2]] = parts[3] + } + } + for (cls in (fieldRenames.keys + methodRenames.keys)) { + val classFile = File(tasks.named("compileJava").get().destinationDirectory.get().asFile, "$cls.class") + if (!classFile.exists()) continue + val fMap = fieldRenames[cls] ?: emptyMap() + val mMap = methodRenames[cls] ?: emptyMap() + val cr = org.objectweb.asm.ClassReader(classFile.readBytes()) + val cw = org.objectweb.asm.ClassWriter(cr, org.objectweb.asm.ClassWriter.COMPUTE_MAXS) + cr.accept(object : org.objectweb.asm.ClassVisitor(org.objectweb.asm.Opcodes.ASM9, cw) { + override fun visitField(acc: Int, name: String, desc: String, sig: String?, value: Any?) = + super.visitField(acc, fMap[name] ?: name, desc, sig, value) + override fun visitMethod(acc: Int, name: String, desc: String, sig: String?, exs: Array?): org.objectweb.asm.MethodVisitor { + val dMap = mMap[name] ?: emptyMap() + val mv = super.visitMethod(acc, dMap[desc] ?: name, desc, sig, exs) + return object : org.objectweb.asm.MethodVisitor(org.objectweb.asm.Opcodes.ASM9, mv) { + override fun visitFieldInsn(op: Int, owner: String, name: String, desc: String) = + super.visitFieldInsn(op, owner, fMap[name] ?: name, desc) + override fun visitMethodInsn(op: Int, owner: String, name: String, desc: String, itf: Boolean) { + val dm = mMap[name] ?: emptyMap() + super.visitMethodInsn(op, owner, dm[desc] ?: name, desc, itf) + } + } + } + }, 0) + classFile.writeBytes(cw.toByteArray()) + } + } +} + +renamer.classes(tasks.named("jar", Jar::class)) { + archiveClassifier.set("renamed") + accessTransformers.set(true) +} + +tasks.named("renameJar") { + doLast { + // Replace the original jar with the renamed jar and delete the renamed file. + val jarTask = tasks.named("jar").get() + val jarFile = jarTask.archiveFile.get().asFile + val renamedFile = File(jarFile.parentFile, jarFile.name.replace(".jar", "-renamed.jar")) + if (renamedFile.exists()) { + renamedFile.copyTo(jarFile, overwrite = true) + renamedFile.delete() + } + } +} + +renamer.enableMixinRefmaps { + config("realcamera-common.mixins.json") + refMap.set("realcamera-common.refmap.json") +} + +val sourcesJarTask = tasks.named("sourcesJar") { + from(sourceSets.main.get().allSource) + from(commonProject.sourceSets.main.get().allSource) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier.set("sources") +} + +artifacts { + archives(tasks.named("jar")) + archives(sourcesJarTask) +} + +publishing { + publications { + register("forgeJar") { + artifactId = base.archivesName.get() + artifact(tasks.named("jar")) + artifact(sourcesJarTask) + } + } +} \ No newline at end of file diff --git a/forge/libs/mappings_official-1.20.1-20230612.114412-map2srg.tsrg.gz b/forge/libs/mappings_official-1.20.1-20230612.114412-map2srg.tsrg.gz new file mode 100644 index 0000000000000000000000000000000000000000..89ed94d346fdb8bd26eafea3803245f0e3290f0b GIT binary patch literal 1609730 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%0AfWwSh_+pTKVJEBckXOaI{0Yl;m9UA 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,dK1HFU6E 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

    ZAewZfG=5c0|VNB)NGoA;D^)Y*>$<^>H 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

    7(^^!@ZhNuo-|rcS|5SDpA2bb9S^3%cW> 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 ->qrpwqrOane{&c8nz+ z8^UJe3LYEo!wV~%&EO|^A$Q~V&Ii7Y;TH4R_}i*S7jytN$G;zMEBw8nGGgF-pWJpU z-O+ptNAobd`|`Nv_m_a(3>}FDu{JK~0bEH4b9_j@EkB7o#?+0_sB$>Jt?BjS)Qqs3 z0{-+A4Uv%!-9)gFqn!mw|%brkhoXK8@b?LwpkSum+*#~%-JZP=w1^M6jQDB43 zpVK`E$eo;OzV-3iPPMcn-j) z$e9stg+qOobl@r#IGmIWh8GA~!a;fd{MwNx!(Sv2!7DkkaStCbzqU$+3|Jh@ zEfz^ybRR8Drw&Wqmks7wV`O;~)pliv6TnS$tR(HS!l<5IpfHs{VJdIAiDsLyqJ8L? zEL03D!o<`kUkx*aV5D#m9P9{K3WOljXjGaD70X!~yR5xRRQm zQVWV^OHIV}Blyz{lW}cb*O+I%LN!btE$wb&%Bn=rNC|_l+yq~d;0s4e^27sJe*ex| zLJ@Npa|<>7^o!X|-T_di@x!c6F5(TfjRc!dXWtDqd6T$oQ6!LMQ3*jpzk-ySY7+Yjw{J55dyF4>xQK<36ma89f3v5xtM3J0ykuD8?oE0V1 zH=I0zQSxrB&(pTK7njWf?>^8`XgMG%vBV0sPO+7>xQi>VE9wwS90sLjCYqP18MUir z!grpg*x7$xonL0}I=%i$cVsnx5xTQb=G}|8^aMq@^6z@(_xIiQ=!}1^%#-VYli@>^ zXl4bv8a}fgE6q)~8|k`0XZY}X$hM{IycAcq)yxkM!g+;Rd5=4z_Z{=QjLeW9i5jRg z%Md*TZPsv)i7u%E;0tfdGGlQwFzxIaFp_ zjfByR5?7%fB{Jj*4>_cE*?AyV5$5o=NKzO90B<2#Wap`^T&CKKv!Vn7Gl-aGgMFIj zJ&M#A-p{s(7{Cv1lrF7ntG4k9D{dtz2SMu8v3`3VdkSOeDcwq7GOOnyk$FJ9%DOIW zgKAl!d+XIP+NROFeOS{87}nCp9!txDKlg9jWk-X;|*oGKn}+ha04*0;dme z3)M}RR*btxw_&@~TQPAZ{&5rw;~c9ET?h}kVk!>@?fF?zdfJrLQCyikA`&HSgi6{S zT%w#25Q1Hq<1>my8jEY8^<&G!ud|t@tabTPr^@SBC#})RS=Iu87&KTrd4_S|fu40* z7N7-iR!%I3r_p+5e>yjeAArwfr>&Dwf51-!mVv#x7<5`EXUDxx*-$?Oc9pE_P$f(# zwF$C#{j1SRXW-1W4Xo`ks+R2wTNQ5>)gd9%$vYi+k6Je(L30)|%GE^G!Piow?D{JltE5aE%?K9jfNGhFoKGR=e8L`wlIkferFv2!ON~?_+z~4Yj%E$e zig)SgN9t%8B~C{}D_>HHJ8G^7)!UYy4rjCYkX3|Dm{&3H>(Eto=}=`wsnD`$u}f$k z-)BWM#TN^wS0s7Bt0XH*ZkN-nDE(^pJlIMy(%RF)FaX-Pz<9bY`S z(pgb@R$oV0ZSwL!m)4`~vjQO)uVkMQO4-Bg{wez!lm=Gbt&-Bf${ts)!ve!lQR$F< zUB3`Y{S{@kj$9WaEy`*gg{A(=!a-#<8HJu~Y=hD|5RI=cX?(S4e05Y>2a(K0lpM6L zYsa?SUoCU1OSDM~RnWfMUoCS{F9vX#M>ewYE|p%tIx_Oo!}Ztm@%@o$;7A%c!Um40 zfg@_*2pTwY8*rR7DP&}eR&$3w(kphYSdq?ZNtk%Ebp85OyMNJn1AkC*aGoq(8KJ?* z6NYiOO#7SiWz%d`)!k>=GcIW>_DEJ$#bC#>_Tmy9h=mTI5WZ)2nROqyCbR38>b8E;z})bJ-qTtfD|J#L;-baZsKq~=_jK&>(Ho{GTZ@VPLY!>1cx-9H``qGW`?(<~Q!U>%X57;f z<1W@7ot7AP@fX#or2Xt<4<_+CR*Ch6Y=Jku^Ei3`aeC99&+a=v?#=3Q z62@yE<>$lZ6kl^D5bAm{*OWc|I|%D;MFNOL_Y@NX-G2TZgjQDZmLw}mPip~>!%9DhSb14ddRi-DtSTeQ zVo^-SsF>Wp0$QquX8$rv>Vn=7^7lPejQ+T3HN88f9?*m;mM%W zItM!Nw%;02D$fvCJY260AjYR6eyV5$a%`M*_yO2`;>Wg<2m>DpR;5?GuU4g3ybm9K zbS8|$?5?%3?a53aI z{bXtgGkeM_oj&v~Sg{S{QdrYr4W+@B$lM#lWZF0L1fa71?||IZfLz#jS}2V!r3}=P zGEkRN25LzeNXaikzLG4S=v-5)ZOkQX}E*>8;cu`V1U}W&3^w)pIGJjP4 zEwL<|BDff@WZ@hjxcK=pBjC!FT%X!%{Yse;YKfq=mU*H}Lzzl)*;GBd_6!eenKM>` zZVH<|pG?0s%ol-YhgGc&#<%9_FaNTE@-~#LjTx;QU|5kiev%ef%tWd z`nshvA)+Q10|3%r{*72wz>^+Bk5F!)pRqT~X{?_{b%r}d79J|AUZCm>`zBN>E-`nB zFn7q@K66ktzE>Fcq{O%cZq zuXp89827^m*+LX?8<9t7QNzoMQWNR9mUhc|dJTjuycs=t=+{B(Jp28kfAae=2-2th z!HGPiS<2q<4B})}1iImmDq9=qhQ9|Zzq9cce}*Z9SHmNY6Egnh^KadYmER)!+vT8h z*&0An%X9h7v%guyu#^5pyE`gmZiT*tb-{A6!uo(WiK4^j)|k#jptm#!usqHIt) zS>G%D6up9N8duv|#N{qV@o`PB;-(jm;T%IXJ5cl?bUdYKugr$9c6M^s83Mx_dV~Yjy?96W3_v)e#glBR?qHKqWK00>{`op37fFGhRiH^x(uRqHAr>DaXAC{=o=kxWn*Lpj|^EE=%T<8B@ zbuTfnzM>)wEL6zMyIBK+I}~qHWIo@H_;&vi6ixjr(XQc{fIkge?RJkfPe=gh_NaBy zcAApcj#{ElLyOR9zu!i{d;Wr$I0Vyu@LZ|*g2b{A$E{(f#6h5YIQ)W@T7&aGD}PV` zl3z+)MyCeQ5uSBgJqrCWgYPlQ7U~s;qe185E&oXAUg1XpFu?hxUkQB>6pN(>(S;fA zRx}u*QW$=$YS2eT+Ij!{{Dajy(y+obiWm+l_5r7V&F$!D5 zGobWiKx!*{B-?w?gUJF^3`MU{T$nvRe0BN|x%apins1gnff-M~-w_gnwlEF%k~8%( zCk&wL@ie!+K&?L*ZXZf5`I3Xt=}G9`%hPvI$z`TTf3#K0w z$xQ`0=_B$OrosVvV+(^u1#I^?|2qC-Vh(;cKWI#YSmiEN*Uc&Pv}gHnUHB8jMVv{2 z( zxS!8K8#Tzs^Ky1-?&5p%OKW~R<0KF&)gS{1`2vh+L+4^pxe+2&%LYubxn@(&fx$^iC0- z3OT??3=X)_XPdV7w@a`bT%%dEi9C^#fWU)qa}3#%JNPOqO58h_!)d);-0R*o`g@J&QX*C3d5W zgV-YTQfa${J0occGBP(2u51`bvG&dAg;w?8ykGPd1*|7=zsD#=ocR492^aehAMHyZ-Hb|2RIqBERkr8ACC)Wkhe6FyOqLjUdm zxa$812O`VXk)x=yP{dTQv;!{UObV8Azy+TUk@!8r1+yJ^aDJWvXM8@pz5OW+hbE6I zbLbfI2cR+PqLy^yocPkrt4l}R@>Fx zc>c404^Km~gi}j>g9;~RLvvH1zG>vV#wPu!{~dmsRM=GFkmGi#wBkOByW@}XlwHw$ z&nrI!yz@7=RVfNZOyddhuojLFY}*`oLQ6DR(-)PsgZaUMV{-%8F_J5l<+Go ze!dYUzKE`K3olf%@W7_jtV=yX?{CWpw=ElCHL2~%;ua*F-s~D3DNbi|=Ys-?6D{OGW*VuRgNhUoPTEv!PCK!1D zC!P1#e^vWX+5!O*U_0H@D{IAt4y96Q*RFkhcI*+9C$^+OALCDFSkKOG$%}t z$CVV~p?Rv87A^67-YV*g%I7G&g#{_;SM_~*KWH7xqe2DtsD-^6I{#oiK^a9TM=oPQ z46O}EtSm|J5fgkAi#yEB{>a{CCKS0wID4aLb{rvw2wHZ=5=%iL<_AkGO2Eb2b!6DE znE{HzCXM6B67cV!(XUb$gQ>7E}eu=#e`Q_eBFK8OmJR_J-` z-Gr9)dOAtWRp^r#3yf{k94o7dIj+!12zC$~P_JyB-3V(F!elTN@nIKX)DNg*W**3! zSAZ|ly}!>tPo@Rj0D-l$Ex33(#NI*GGb0$;f@cZ#gDR^$gDKa1##Tu4s6-ntZSmSz zr)@O8my_Y*T>=ODn`mr>=5L2RkC;)&sDN6>8o7W{$GS8(tWQ zaC@C2?3JoF>7El0?lf^*7vq~kJ2r#<2_qE@>!ivm*eWbt38D62%Z&bJa{GgK(JpVJ z(v(H$o7gaSe9K1T$yAu~%!6|+@lNhPOWxyx@RQGa*?4iMwGptsaJq+zrFDo_&J=YIoSu`%Tb+FOmW*!A%x|jgN zGfiJ_3wK{L4u}RsB@OyKBUt~(^bYnH8BT&e?q^O}GPXLFH)0FpYkshm3T)gD`2sv+ z15DuGEf3ZZ8BZ=W?VXd6hN2LYBrHOv;v|eX)Dp`fA>Hd=BvfGQ*fBUkTC|QCgA+zP zrw}kd&%R8IQYoE+u>+#u0t_`bMRZOiy+aY({}7XQ!P>I8T&n01tLPEsfU$yXLw^!U zsR@hfi4@fn7S(xt-9nrx1}S|BY|uoYU42KDKc=R+sBxeVM)>UE8~e50CU_~&afJZm zyAgS1pe4LMB*$W_@cKltH6x;((I=}V_v4WT1ie0fz}v5nxptKkwj+P!@EPM+U<@@V zEOYDPj>Qa?cVZd0mUof>56%fr2HgH2^(4tUJB{55~ikPe-A}f+@3nG-H zA2R8OMEb?vNS6oFn;!DMg+SWiI)HS@E3L9kt^pgQ7?!+K@tq1GxQ!9`R`ck^1h>!+ zWCjNR%Z=bym=>)U3TzBLtDbqaYX0C{we#86>__eIikCk}SP=nU zW1|SZQGRM0#|o#3*i;s=sq7#~lfS3~$+z245f1>rY=jPb&Im9#Zj940)RM;C2 zK;d0Ir$wCogYddL0+jv^1E~rFA@pBt zSehg3Uu@Vg5XI>jgeL3L52ho>qOh4CDz%Ll-6@#(YDyV;#Gdyj*ki2V<(C96-wIyr z%l%*2W0Xfc5~~7$H+*gonRbSz%3Xx-VKSfzG|TnFcs?1=82HJYB*H9C2uOhb=l^8a z7%mfsVX$^(-2u@pvZF)&Q;K8ImH(6CDwz$5d6Fx6lFK~FrW+j5GD=ai*f_E!&tlKV zZg^Bn9wC%t1M$oo5C_^1L=i3XgJ&MN3U??p<3>FPvS;2qd@?JQmQ~l@6Ulpc5An$= zW3O+#gz(eEK~$97i@b=8X4qPJ!rF4K?t(D>u_e1`&29=N)OftjnHJlFq!V8`%oiO; ztR#oY1~LVXY6d|w2K;ZOj%H%~%FV{ofuH0SC?Vd*&LOB^Mdl`?a%|Lo%idIPShZgZ zt|tA1Q`b^bO%N#_Pkn5?Ee=O~m^78*4CD@$)BXT+9CGSJY8(gwSU7a9X?aG#)8=Zg zI0{}jJPJ|%lbhkggeE)qIr63y+d~mQoT)fuDh}PF>O~xQqY^TlY|L6Zg2JTO8H313 zKVc$L=v#A{FCkh(-&*5+n`dHv1=jolz$M4f^c4Fo5z+YR5S@J|_DWF&e=C*yD3u&L zrj+pID#fI(Y(ZA@gVo0(E6M!etsjLnQYtxqPk|JKxdjjiK(Uk%gc8PJi{6rX@VC{n zLZb|9=v^QYL&Lyont}iFZ?V3yZg?B(Xb8g6+t~1_fP!Vu#O~NYH?z;yEW;(8_o(>* zhhRki(Bj;*wj!|kBJPOZvoa7W=0K>J!;k+oW`mfGUoj&wABcDZyvV}b)X26-{Dkcl zo1*vYqUhKhDl$>TT)1uc-Go`x|H_SUx8e299SAvsP?FR*A@5*JP5~2Eqvm zX_*69V=$~tW^_&*caLDHi8(7H_R;WjP;_w2CBc+nZTB#wA82SR=)eP)a5%DNa_xVj#N_pPoHLPq8OTB~lOLph*QmlP?jXXQW00JQtulZV#eslTvMicBnEAtGE2&Lo&LNQL)I1t!a3SV^`K9j9nXK z>QaPW(I;En;z05oP85j)GAQEaQDg7mH!B%(IWhrZLH97Pg@mSwtvzjk<-MlbjOX!l z5D;VmpR0bPIL)Oebk^7-WhM3sY|JBB+3=0vf8Ru32uqVz-F{ z7Oz-yI0v1qh}s4jMqySA#p%zo?|Y)8R-{qKNe~i@FSPcV;O1t`s+-GZ%s7yBC-*1h za!GPcyrCuIut8{(7_gDQPk)TYbN#jUC8*Utj!9CSHV}ibcs-t(6*ZYXW~2Q5f<>0t z2^t{Qm1ec!`_f&nU!8nt_1<@eZ|JYVrt5#ad;|aMAD_^Ct3QkfA+2ZqcIS)^fNB9~ z`=8$6pVzP64qBhynEzhC`uMIp>b!yfwWxJNHv!k4nZQl_4O_C7B&|*X_4r(^P?Dfh5QkY-3eNpT6tIt2W zH@os+cTNW4^sg`${RGD@HHUS>8wOf1cacInq`ElS4TjnNbA3iY5d<3oe82u})l}~N z64YnaD^Q#)w&>{xQ4jV|JgTV^tM=;S8>$vw4~mlZN5eNovsi+fbwF0aW&g7C#{9Rk z!r%|yUNrgedAHMRzY%R(k)~5`&jl!>4!|y@j>gk&cW8+KaaVUQQ%{nVz|}9QFkQ_zh={H zna`TV443YD{c1F5T|u#{UiX~9ZNtzSz7V@L1`Ef6ZZwBMM8;F*LoW59(d0g(LtafG z|G)*xm=JLyylrv9{4Ak5%Exh!Cmh&`2z>j%iaw$DHgQYB+Tk@Y(i4|)kMhq5{IGSV=qhlZSqz-IZj=3YIU_f& ze*(k-U4U2y`vVdJT>c3|EfWs(P8`8I5)SlEAkcePns_mVTy)VZeN{KLjUz`^dTv^@ zj%nUaI7BXS$PkKOlnuCvC$J0>k0;T@jx^nW>^8FRjjvz9aoBSbnEA%$meO8WvBeO; z12(|yB8@G6QF{fq;OYlg1h&+d;LDkc^bJI$W5N!A#4jR*__gW}XwUI%eUJNmW?Tby zl4a_v^1@JR~wwH{nR#1l;{Hlh-kExOHa$ z!azO0NV*I6xW|NELFRKi(>w-=+plXiJxriV{3NxF;%jiEXc8PX4=ds5#sqYMY9Mw! z3kwV}<2?oJOGgAMk2-aB8Va=-@W-lKi%rm zKbG_Se*EKeR?seOp5c)^7U- ztbB_`TYl4yU%#5dmjkW|mPshr(Hk$8=$xT5J}~%ut%Hy6ALv-Hw`ZynA;8wVMTnd# z(P3eb2k zcQ|>>D9qNvzfk(n%b?luu`uH%AYS!*G(s-Oqk~uovg|+}K*0S>ePz z&m!8ftt^qYvV?7A3ERrH*|eU}e&ssO|BU@AvS=8Qt=#~>Y#e&T;mm&y`<4E9D8)hJ zAp6zNXe-ih<)*g5Ye)a^QrkGTdB>Ka^cn<5HLUr&ep8JnHGD?H-WM~iDjACb{;lzV zl{+YPus!Hsr9)G(t~E+WT`k~1NjyZ$qIAU8s6$7==-TeSeQPQzo}Q-fI^DPLMD;)~ z4kJ)~`I>h3qH{Uy_AiHY76cS~);=72fB_7tC?9A5eC1VZpwIO>!?bll^$5*)Kv-D6 zrrqhaK9xEHu3T~9`$21@M<=iKKy4mgcF)f{gY>keg}c_v!;i|Vz@##tEH?DwV?^e)`Ha<9IKac;!)~|&aqeF_Khr=C zQv43KSi)02@p5WuiOrN0znbUYFgCbW1@aTV9vC~8qO^tS+LJF=6mM*$FyJoz2UIH& zk>5o-wlSkjY(}Nh^0Xt4ZjGO&TijRz&3P)M_x3Pb@fazgy0auAM1N>uQmAI|ZKO%w z2dXY>$f`1 z|2WU*XOEC@wl&|V)jB^WDSa zEs7cwHA+@&eH~=GqGknrB2`p1i6aIN!Pa`b$3BjL4KX32O1!E0XIWc7nsDcjhpA?Y zH_UMtWtO{GYF=}1R9pRr*MUp-n(Rtort7m^X0#Za?+0OVpXBfxDcqKY(KmCh-ZKjS zu=T}h(c+{&^8%j+IU@(f4%-lnxAZ6SAA2S;r=bJ;+3Tnnnjpt3w!}gU8J*Y< zeLKG8E(NHXm!2ROrXBq75*Y>qIpo@y5g5THi!1%?>#qW6K@%+%=@@3?`SqPR6+1qS z!lY_0vm3G7f+_VskM|Gf^Zed;5Ui&>a(z+9ph|Qx`3@V*SSuxuw0jYeiuSiV>_uclcv=jj$l^A-!vzHR)fv+poVY06}EV z>{Z`kou!;<>4@n}e5(TZHqM6mk&MGJ47j-B`LaRH$e7uCNfCi&c#&rd5JQB&;SDfJix#1{pWSKw$?OmyL?2CjUQsD=dP6x=Dj{1Mw(Q4JF{`l9GQK!XDXWs+ zuB~JLwO!Ja9G7bkV9kRH5c&CdhC>?VFY%2%$1e>yv5YsV<+WTLP92!|wR>K_IvIYS zEU)h_#t$d@{u6uu3EY2z_n+YXCkuXcIR#{-!ZgI~2BbYFd5<@P`zn01WZHW}e_y{k z?{s>`*7vS;b@k~@>DTL5-M0Dl2LHT%HRuk_PyF-x)$puyIWh;hp$~OhgR^&Vj9X+P zgk#ib>UrHN%&HQQ$^jnObz_`GBvgb*$kIUK*ewN=<^%nb8{ThIwwZn^E8);;=%L*9 zv__uFm5y4I=5*ScynfZ|zkS;okQo-hV<2^)-~TObcZZ|aw`vZ9#vq72Y(zAZQ*Y1BT*{~6xX?SH!>lg2PqwZDDpq+nw*SSoI_|e21 zZoclSb*VeFmj+Ors`^s95^#L5D_37R>ReonI*{k8v{=>zJW$Xv)!$rNX<@Un2M094 zYAN}PDN{j;xe?IH#pO)bXL`?SX+ip%{<1sv4ps}Yz9$0VA=Eko6|4`3Teo56+R@GBd)w7kBe5$lW zRmbcK^Kpe8akQmXS3TI+3Ocb6fP5-MLM=O3FQV#x*xKupdwYFyud#Esf-({>q-6{( z`?`tiGM97RBY%UkzFGAV5|`-}TE(cGgf<#z*^iI}vE|9}b5l&>+lTwHCk7itJhed- z%E3l%TD10}7=JH{@mH0Ba;+{4k+t>Y8V%_!$YbNGBdh~@Zz6znY&|pANj#rv#S^Gr z<|9RE(JDTR>sy-hkIWe%vfn=vE7MCHtK&n#fhQj4CK0b{#DSGa0>R>aU)j(AE}8j!l1gN2okxz?x_!ms z7PN$iL`#zz{fp0&XugKmpclg7h`^YWTl756T|icyO9J+l0|3@ z3Wyx>jLgrXnkqsywcE67-KMS(Gd$&6vBW>_Ser0E&$ZmamCVnx(Jmf_KhO*--v(a! zwLmW`c$a2SCS&#xiF&0E!2&A;>m;ySDA>tglGFLh8Um>@2TizZrB2tE6CSd`1X?e` z={&m%J-G_C*l7(_j^uO+N1}U}4*S9av{tk&=S@V!ys;OjMeAo0pd)M2ixN+cm_-$6 zJ+lBEyGdHK1gl`d8d}0GX+u*2@5mN{CIYl_m@g|w@MXP2*nA1cEAizdEn3ejK!?`< z6e>xniO&>_upD-!dG@%cUT_bwLYgZjp(u#cq9r6D#|qHSo&q!nm+iHA@XfpIF|n0N zWBFQvwHpLM_|n^nHRbw&w5IyX@@y=vY6a)SZZpY~?1j7SF-d3zB56bS602}0(q-U> zj@Xo>B_XTAaDcJ|s4Z1%xHcUOkkyy*7eT8o@3EpooHT7`-dNv&2W ziX88S%=M8a+DOVk%9`D<0Ba!wS%atd6KoH@<1$}!T*=o|Xca%$_I{e}!4DGVxKI~G zXd6~<3ZL6zhqj@t zF-19Y5h~xx8~%%H8?JSgxFuIfU^TsTrHxnCJ?W`ZG?-%*IVbt4j8|TwtRAPNN*XEaQvfZ5B0&uo*%g4g;py8GWo!^` z34yH$!nF!=N&WBx84Dz%N{K@qzSl`MpY z0btfbLN(Y;nv@{3-N5q!W9II$g1PNNmpI2QDu@y}E+@5(f+#$OT=TFLNu5Yx z!W8lgXcT?F&mH;Lk$G!bw)68_qunA@olkMTNRjci6 z{zLC6Td{Mu+(x)(r=8YCI%*Bx0NFeQV?oLq05qmsVoj#-u&L78xt}Z+TQF!!b9l0P7qbjE`Kee=$W#_e zDhrv)!fl-5t5%s9-~@vguK|efb;M!|9+Y;m-)Rd8R9yjacwLNIP?O*EqTBCRAsC&^#f9rgrx?DiTbOGEa&Oz|i+d=?_?@6m{oQzxU5saXvCrwSnSh6Uag|RDybV3sPmAjD^b|}U zn=FlM9NEPnyUr#?hQN-1{2xC9-<|N-02OdKo=jb$rV%+0)-#N{9w+K991_U7c(}X-;UM|H{&3|Nds++m(?oy zA>~(tv+CH*z>PgJS5u4L7k-6l(b`x*1*@Dl$>>GCTObkxcd>OL7P8d zY8y|Be(px4MCBb~oyi_Mn`)hKvAoR992;4>iybLRxm08p8g`wy%1dp-O4F|LQ`@L` z1osbegE?!`*o^sn%ldt=nQp(BPBv(;YuB2dXybaZ6gGTW-3_b2Tk$4-b)#&0X zI23oZEw-!;Umf4#hF61;3yeGH# z5%kP=m2;_hE|tWa9M6}Z7;Ulp@Akjj0D)*`F_zzfm!^}5@8I%caUJm;T&6(REuLea z!QF?X9y}{(y&E!LXLC$XuW!BY>nYc-fBw&Zx9R02Ut-XA*YP9~^5SvWwo(tn@=8hw z+xf|wvUXZopTqSfh4S|X>mxm_$QSNu&4aZZx3m|rp#c#hw+wUJi|+Ma`k9_&=xh~p zJ;~5L9-k)}I@|kPLiIEv>q7zRsb9wNlSYc}*O_KWrzlKpm^WX}o6q9{%TYd~4cuzW z%?-}f!**xWehN6I#M+5w{^-fQ#^b%llY5QFdyR)+i)Nx};>;w2DDqT@iDq(nP~cKM zo~^+3dA%T_f2IYgAMf^GqejXpNq9^hk>sQiQ!PYn%(H7#LvsFjy+nDVfwb|Yf{7<5 z%Hs{ulN+MX8zQ9e>o)=U(O@95&tR9!;LG?v`{itE$9|m(5J&!RsPuBj2jKrFmbLFAJ{?Vx-o!zmW2n-JxDSfb)a@~^PD*iCQ`95bTjRP}8 z%h64a3vg5z6eBD&c9WxXxpW3BFj-M78cjn++@Jm!K47heb2y<-M49s#y4y38W4i#ZruU*~Y@J z?8dxo2`_rjeGWcA7)$;dv&a@pkuB!UFWw#{U2o;kr-lV|_&SumJ@ zeT0NLZ6bDP&!HXKH1_!j_=0D5X89s@?)?QebY+Te8oxn0=$!RGbPSSa_kzvtV2Kt+ zdk+-VWto}a2`@!Q?r@@6D?WwJ_(!tnHY5R$%{CsGZ7Lb>CieQ2+!R0HaWwH?F&Kf$ z?{09it&WC74PgN`KjPFj_9s*jiw>mFqK|4yb4wuu9tccNK|U;IVV#vD?c0Ao!rJ>g zzRRaKP#$Wz%;vKLiK3#j*RL)+AIayr;`+qA^=l(2e4i|cP(XFQew>?7HPH0%Xt;r) zf&TpxY>SmT#AR#5wu};anSHmx7_`uXpPIm4&Bos*U$ovj$}h7&;M0&lfQRq@Ri#Rg z%~zf;3={3OVWL&_C}?+YQbdKP+K=Smm;w6R^C)($+;0a9 zEkz&IYc;4_SH0<4Yyosg)DZ38;t`EnSJE{)HJq>*+<(EB5KjdaVTvwzww>Aai0yz z!Ds)o5B}%>S($UQ(P{6Gdaxm}(t!A9wB|kcC;OkW6Z)KK;=97D=d&T-cZFBaXAKi8 zACg4pvmqa=SRc_u<+IP)mp*Hseb%P2|N5d&jFDi6^We(vUcVaj^>)v-$Js^&(eHer zSzH*Zh!NpW!KK+n?t_c`cwG7?Q{d?voKMI1NBf|%v)8ZAd##Jk+V?cG!EwQOMQb!_ zo&7dU&!~dExeR#7$JXHD{gt#>0{gt3a(gt=>5$K z{c*O8C*tf-yX3r>LYCG19oXu%2x53Wp3RO%UZviwWxK2!_S$vLF^1-guR4INUBBku|S@wNba{2Zw(?$`@P++&Be3hxAOT`_a#RWQjcPSimt zf}W_#D>n9DDx>k&EWf=yaFxhjD#$v*p!xX%H*q``ZJ<}knRyC&R4i$zBe@QIj@|x~ z(xci>LRo#{K4i1n2T3Dl=fCQ;J~8tI*`WQ&3Mar_-}QTKxKIlooxvrZ0bl$(Pjn2XYc5KDOaOJQ`{z{9V2rWXS@p8g-(I&Ga9tcJEd0wg>2ON ztlxgmN|=FG&85@q@B>1M)A;OKr z&+AlJ)A)@<;Bnx%scm4c`H$|6L47~o6#B_}DNS>f_nw60)-#S0&LNGW_^R{lc52e` z#0A{5;#*N|>e3sQiX-at=9TP8@JHuJD&+?e`Mlw?$KY(77;?O>O0r=9Sv|a40xN~X zZjrxB*CplE9zcrE3&?ZeY4`F2t}@8x zfum?68PZ|5d^l~Jl7*=kKl+po zJH5`?s87rT0{gA;COzwGvBnq*X_OE%VO|xo@93Br;SD+zzyYwZ@;Fu{nA}V=lOTv0 zGQ@1aNI26HWO0U0m?8c#$l(NE?9;KnJZRSOkCh7pI##;ySYbtn<+leM+!07fnSdc> zg5yHU1RN(FfVle-`Ryt#S~9;qPK(yY{PxqV1q0daqS`cKhKmweNdb$KK|%nZJJa0B zL$)uYG5oOK?6IK3t)CSGbA2Pf2r977s977xEVY5ob*+_4apeNlYW zC8~*_w(edmJH|4zok6x%(Ki61IliE~$ioaYY8gprvCQvL2XB>V%>iz)BP;)AoOkD^yX-!e-6yGSJb%V}$O#XjLz&&(*|*2(ESsC`U-Y)I zu7h=W00``}*~fOU0lErS8MvN~m(5Kzr?DZ(pSdHf-O1uA|DMe)#GXPt9}8=17|t%= z!@3K>OoLy+nnTvs5tjIV{56v^X-!-qXp`pjaQS%swL1gezt2ulCu=}OrJanyKLQE< z5is}%a+rr~ew)wl2WE@AVW605NRKUs;UE;r3IRvW1z{|n%jV($0y3(f+itfRGmN0C zd6DtWMMZVflaty;!2lV>Ex-z`KK zjBSHte!PtBK=DSQFk}16WTBb=+q?kH(R&pCAH zv%}pg>b8RW@i0SI>>(ken1rrHp&n-0?DWTmVD1VCVi}bbl^0CRa~(7O@`0Vp4;eEB z#x+uh*0j^h&LwAz~A=X1^LwItB=hS#r7Tc@AWcK4!lIkXyh z2)ppvyUuWw_Rr6U9d;3euzJ?(YOUUQ6W*p5t-)_#5`?qC%Gt|)dfFOxu6nHzhfKh# zlGgxoY-?~q#)HUNyWpbL>+wlz);R6AKc!cFLO%>af`Sv`R(cr_z~S7xPOB|%iugpY zb3QVIkSF8P$zJEJI2l@d$)Nl8-P)~5`E2=KFg>(8=dJg>(duh}m4nZ%j25gMe6C`^ zU{oocFFzM;Idr~i*kE=kU$D{xOk{Tm2A`|<=sJ@0fkFgdF>3v`dO-*~NaqsH7au(Y zh55YGStU2{nVD%QKLvbYowvi4tIZcff?OwP^MFCO4G+HPUUtq}gAt!IALL{I6wO#R z;0#oXu~{hwQg%VtCMm*I8dz=m+TeekEX+=DGo0p2x)e0%JH5u_?PiDua8le3BIxYf zWHB+~A09*bbFq9kS<=ThH%_zLrCz$?-hhtwvMywvLqUY0(B!~Ni+mW^k`IzXYxV>7!hP|Aqfm%85l=B9%kwj~rkd@3g4A;()^nr4n%z)J(J!J!E&(bP zk>Sh)Wte5N;rS~-&!n|Q@|kS#j9|%Kj~^Eq4s;K_lHVzo@5EnBsudBd6;bHaF#63gmKuiS%+l>f5?v$BWHGtqCUxKVa*xpf0 zCX=(N7Iu-(?aoKv`ey%qoIDu3Z_^b$LKlPXIF$7T@M0O`O1|`GfZs*4SnOuOux$x%6s>CKc3~28+|2$MEXQN7eA_zE{}oy z5BF=ucxIUGARAwA3vxpl;(n}&d@`Q?B5#3dP$7N1ffTQ5e!WE8+VJzy8V8llEZ!g4 zyKD={n&f7U7!3k+1`>%e;<$-O7T$^2mL7pE-H5r<47)?8?LSU&&x$?C8ri0Wu@XxNe{vB-VJ<4T!l*l=n^4v`K3A7EtJ7-A$uo78SEBvuv*QP3n$R;n^4?4qUGv%W zVgO6`NGmo5G1q!nF&NQqxcoGQ{a)s$>AmdQ-MSbApBF z2xn?|KL!+3Itt?HIxuP@H^Yj9A+GZMhKvt}c_&YY9vU&8F`8w}3OEJrfn_u@hr)|L z=-GpA5$qS?75(E@D2dodg%*Oj6-w%KWyDWmS&di$j6xjb?L1rDm0bDo4j$G-)AIDh zFum^Y|2(C)F0mnII7$?a3E9gMDp8s!WG_nyLghkA>f84UehulAjMyoO<>nSrRIAk+ zn*1zhVg3!a7BqvC;etxGXsJgq{D>i0qlk*Uz$V>L;;N+sqGBacVnddZLkaB{a>xp1 zZ!J~?v3gVNNm1P64HDF|#fp4ZuR~coAmZ8qQ9!g+s10;^EH`Lg?@>$yQ{ry+p3+L; zeKArL?pGFQYR-b}k%4R@Pxjbw8bbMA?01Vodar`h7B3|Qe0I`A?4%(MY_E3YXJbEX zrv$oBeyhV{8bcvl}~0Vm9Lj8k7b<*WSxe^ib8hBg;)>Nlt$A03^Jz2 zbItCj*+OtwpyaQU2lPA&8KFtYk6Y3&nQy@ExA;DO*kX^VF9YqpzUzrhyf4bQiI_#e zSc-rNbL2!gfWw42av~hSAqP{TIbnJCXg;Db%^s=Lsa_{01N1bXE}4({@(q}-v3!c% zJ=n|uGR<1iDmY>&)POe_XD!I~VdP8p%ud-Tkg`2HWg{>dFXwtop4I~&R8EOAvcWY1 zgX<$mAGBjkruyAYe8OYlUIzcd_qqP^)wlxy&7Vr+v~(_>?u2OU%xsTexEF_ z?=HprY}RBu#or}=lYG|uP7t-Z%RPjAr&KMlra zVvA!l&968uS`DoFReQ)LFc3J|p3E~;-m8X(RY#~LhKC+|Y7uXMUtU_YxRNVys0KDk z6Hy$H{RudF?<{mGmG`~QADY)`Qk zWUu#yFV@^ybE%Z>dHw2L>+)?8%1&#!grDpAF_u1p&{)`&zEP<-1**sm6C&LWaZLGw zel^K|dpZxC;^ZRqsF`|wj*O5 zf*O&%yCo;-<_SaTo>Q#ADc5=vn3k%IhXvDvfXa|6$5iB5KQhT^Lf6>BPs(hFW^G5 zr6y7%Ra_cIfsfws&+WrBHF4*gSJH~~6$MhqQ|we$t`K|`m(0crP5JHZq6j!vPU&Ot zm9RY;;U4yjdlA=78R!8Sc(9rr5OE^y28!iOCFM-Ta;6G|MN%;|rwWc+lSVOIkK&># zl47)eLPiR3zL z8dV+{as(gPDf^hQNJG5hn)S*fLk{o({(2FL;&$SgkbFrdbwtrPW|2Dvk^8AdV>V)Ax#33Lu}L^~JUM(nwGB%+F>64v!+}=i zT51)Bs?}<2RCEmtaADEQA;yE2{#N;y{^RoDv4Eh6z2FF@g(nU#C~H&fq*2mIqu5EK zIPUBi<__rNM(;L&%OT28_8*Y;yEqr7{2l8@8`LHww7P>ZABIdu5X&;YnSj|7%c1hL z9~|cLXSU|p9#FAma;B+4kKuN77;_D}tFd1XNi*L9ZVsi^uVlpZcjgYiD2P zS;k++Gx$c)X03O;umoj;6Exu@N7abg_OGPvU$O09VLSuL)(3lM4hTWfx=tilH4iXW za#gd|0TS`XSco~$qMcl$%VTa8z%mx~Dh<{m6@^SN-|LArYR(5%vL2ga|Er>S3$p|; z^M6x7OqK5%Xs1+*6GanhJ!K$=O89HRzI=$LAG5hCcEyK}8TvX#kE%yMlGHYis_Ap6 zlLD7ZJx%{vN~{9+iPEBFo?IgK1{7l^P6}U~X&7Us;ei%{g!RNkL~b-2og%gLxDL z^E7n#D^BZG!2ByM2o3eq+FH4|LnKxj`t<8&R#x>^slfPFQSnJ0Y9#7l&Bw(?0Me?w z5OZ6RR}GI2)1uXQTD`{8>TNM}n1y&^7vf3lkI8~3zeZkGy^-{?@#5}0)5Q1NEMGSA zgjL=8`W0r~rJs1D$8+MYEAz3>T+J7IZp`(yVt=Qd;V9;gm<^_}C$jNl4tk2cqvnIf z9QqW4q3cjZIc7|#m;>&QqrpC>o*1(cI+jN0n2peJu-(nopP#}0ZpipxBCW{^s}>Jw zgB94~=4hDOhImEZI9c;QR8Jh_51A>u*fa$s5h7O1ft@jzrK-@7em=b{qSs zB_yAJXbrlp%Td~GnVDiiBTb zTC|?Wl3sPz@Cif*Ss%Gdict=z+wREgG!&zSC1TC|w>%&#~tTB}2J*TKftpK0iJJx2-- zduh><1n;Ls%RY0Ok8fytwF0<0H*+%QE`AwMi-Qu@B$f3`f6G89^g`vk>zMCe5c|YX zv1RZ+<`1JB3~=Y?WYdU((sE%VTq2Ed2^--OX@pDI2$#5)E1PxZq_**zG0zgNkCveO zF{B?}Y8(1!L_hr0HuRv23Ea&@H?glMalj<8GDXUDFjR?JXa=@ZMEG`6?n+p1OFW@W zBpe`=_#&buVFfhtMNUA%3TWaBP`HE(JSV>Ygce(1yVf`i^6m4{6wWi3$iw_zM@s~YUp^z;{_7*H++wl{!V-J~?bvEd9#33k()4%+!^C|tU5A|lCGe8Av4My+yv4#lG4Fp+d zFyxDZ6bqQ~HRcn(9kkxHF1U9yrr$cJEjxO1%SCH+#{I&Qx$3?ho^>v{A276D^{k?Z z8{t)7tC$$vZ>|a9P@mr(_P=4L#Xq57&TpMwXVmA(2CFE{SlYU5r-S~mW8VZy?`Rd& z4#B+c@cremm?$&y4}I2aaqs!4JL(MVpum0fu{9iZOkE&8h}AQTp@UHIv1=~?=g`OQ z=w0!0egh3ytd!4rzFcTNv+lFP>`s6Xo&Tt9FIypAmbilosmL5=K`jx`<0bCBp(@X2 z5zO>eQS{Fo4%4Dla|zc4f821(wx@vVV4!;#{$RIJf5R&KUCbIsp}fVkuQZ z?Inx@mxKbKH(`|B1W|TL`sKvV1d;Se`eh`&1k||WSy0$Rn_!NWCXW6LktSLu;{F_x zym!tF%*jpz-8~RlA#1}g8+I9%!Y)JW%?uGI_HmJ&ThcW-w+$nJ*kOrqmG=384dW~j zmEo5S<18?h;g@xA!b095On~-udNv;$xTuGGzC6>T z{F2Yt3wu;tLnNOl;ipJAjyj2oRMR6Eyox#8j)1jc-obg5FnXH_r84Sf=YFzSY*8^v zob+V%E;f8|RfC~H$gZ1}mMAi}83v6Q-<#%T1>_s1h0uUnt9Y9cu8bX-W-IG`qtR?j z#9v)=D6Hjm;~5;bN!CFr$vUt})CT!(zaGQH~<7j zzH$=+2q*QNfJp#U$Lsvz#}0X> zB3V@54a-&U_z!y2A10qsvF8X0V_ywxlmolf0(bZR{?TG%hp}~h8pQ(BBlPD>gjlC{ znA2>Ue;;W<2T>ds7e83qsv%8j(&du44YOPHKo|%1Nkqb?f}K)4p8oe4pg-252qVk0 z6l#_aN@?2@SxAyI-v~46&CL%J2&y{A$#G&qW=@jYMx!JY1D2|H$M>{5{(~17>@&y8 zH_`eG^E}rVE7N73=LS0@=7N*(0F@}Fb+6B6ruNFEF_~*IZob&%YhGiMpd*{Qd*yn3 zRPPa5SU2n3g2-k)uucMe73gq! zqvekoFk0(TbWP9kc}jiK_$bb&%s+Yh2+gtc$I^sB-t;E78Q77FE2x*I2{8J_LixHp zj{zkyTxO>H7K}+e%wl*}kCw7pN+-K^fywXY@~Yr;Ag-q-!Ykgt@3z_F90dgwv;L)! zFsX$dkk(b*gAoHf@%)gF8OZY*DJ13e9d%nuP1!pr zsM-)tnS-Q*7a#2VsH19G7?N^L$5nkxF&`HI?4A?z(vKa%^kSyixQMjTKX}WFi%1*& zgQ+W)p8O}%Up+_hXBUaM`UfjA>X~*a>Pls`#>!DRm_BowzQ@O z#=36owTrj)e6NW}Gx=XypG^S4^|Cvi>f7eq`rmNNbF6)rjXSPWB|JZ{w)1A?x47V4zt?_K`b8%@bhx7rTz1}%2Cd#3`uqCT@T$}6owbJWWcfqC*0=HW z5iA4$J`N!m>7g7SU0ZBe3$s~^q0nyt&~nhWY0yi@tinK zW2luJcW$w_*L5;=H+4A}PqZ-Hf5>L-JfH8Xo?E{cSv^<3dtGz&h6ikw8|M1qzu*X} z*eY9rU1dRR2g)+pvn3%f2Evw9?2t|9%X# z%?C?rcI`pmSh`QtDbUa6mkZ^~h5T}%I!v6|U4rffDzE9+;w2Ua@~v4IWhaMO_e~(T z6eebx%2iNMKmb(0gFrfS-kU1|& zzzGydQD@ft3OWBW36E<$bwmCrV9e7UFBY0};${FlpS3bjB+n*I;MH93`=dhLjL=l` ztTmvF_bjyyv32s7_nWCKEE{YG*V%kmS@w!{0;lZga4UkmeK6cGR+7Cz7S#djP6Ckf9OTbl_KFk^eB}A8dk0K2)_y%FQ(yn5fg9}%D0PB+o-j2=b7F; z>MdKmlmo!E!1UHcb(7Qtn-!nA>VNDE?3sYi3_o^yy|mpO;0cgnO={mmb~F6?IGrx& z2A>_1=Isgb8qYxF()f?z_iQ?)LuO9$>5VvqIGExR=jV{d6zLP568eP4UT#kv69>@q zIo8+*ZCdXtCQD1N(*;bml>@L$%9G`v#Wv_XE+s<5Ht0MqrI^Gv=p3BBPbrA{Zb=Z` zmFjj3w#`ur9(YcmTnC81AcgkwjcV=YX(tdD6$o5f&r6tZC7z(Pg!xwD3(lAD_6ULE z6c4~`ffaWD&n7SX94zZ|uT!W#pUAXl|tWB&2e`P|a>~Vz!>NzYn|IFZp z8^d8&F%TQZ-Whsb$LKIenRUf-gH3pYO%PAVj_+l$9F;4ngFl%}Ckv28I~ns;BSCj63ygnm^tM za)oG+XD&*mUzlex7M6T3W>Gkw*j=FM(HG7|p8$)YQ7mn? z<@$astQ3Z{>FI2)h}?2-yo~@z#Ntlx(R@eotq=Xe4PxkpPxtaoFWfK#mKX$Nt^VPswjt(#MPnH^?{nO|?}cIx zyePE|s{;BQegNWK4Q`?L{qHkP|Mf3@{pzyye$?%~AEv{1Mr}HK*Sb98xLuT~=4Q{i z9Dkd9vGwgdAB!hu;51s^O5TH8C#?sR`z z&Xv+Ygl<-?v<5#IG^hQ)lVa+Iv8OF zkJD`3p}7a$)HYAmFgtDa`mQ@$8T6CDYSv(!LJR3u#1X(R3+WcxFbVh-r$y_vg)B}& z>y-^{sD$|yS+6XR6U;HZTi-bD9=BCL6>DywWmZNojS$0(zbrfKd@zSxPxD1K$}h7& z2rz>*4iNsX^O^n(%SCr4jsGeHz432jW0kSdXCJ4pgv#x+kJDE|<@OaXGQ{nsoksB@ zLp_#u8qOW?6&LUOUvPK%EbIF*tLJ33s>9gcKt^qx?ib>Mm=vJ*Pa4&u3quF>^>&s$ zbY}VEm%CBEdzoxqAS);!v`WiSZI*YlP!dVWH)1g`!pNPg$HiTCbNb_a`Zy`7O@k?W zvcQbu=@0Yj_eFe9gc(%%*XFt=^A-7VSsnHffA;7xLq5lR`7-9qXQzn|oce{Mb3%(j zSRkpvuOKa2Xb@PH<*Z{>metTdSh7b;!sCNMidsN5Pa6fyoE-Bx=3`BH8|HeYnw@fF z{-w`GLm!NWkKlF`G($=rAg3BEQN0ZGNwLd#O{C@%`rFL?yYXf)yn-}tMBl)vEBda= zn^j>k0h^ElM{ENDqk#mD*aiZ&&%!u{&p+cY5PTL7S$1=g-%M^Nlsy`F9xeFn z=3jJWVvl^HYaDyzcRErx5`HBrt%7b?g%?&Y^CL=aV;{OPXv}6-Dv{+@xg{{T0L&=s zAG!G_F=>isxbu9U4=V0nS+2Fy4_23J#jJCRK>#TRB@3*#*Grqt;{C&(L|ojw`pO|1 zMtTKVgNd+$kbPW`j}*@r>@HKciMdszHU$h`5CkH0GT^wVAP}LG0mnH92rbl@cAqTd zXJyt$CSrHCJZOtv>tp2u22H<$6e)pabk8e32WKe+q5K>ne~wUo4vugRLJ>*A`{J?~l+ZxH_JT)R8G z>a{+lz3xSq5yin4#OL3eY(@)J4rVMm1*qpAS`2g!n8JiH4p=Ngl$sTGJz$MatoXZ;ODh$1Y ztp?}QykUX~=NCV#y&+&NIf!JrptWhQaIsf7JEij+Y8TlU5GY857C>y(TJ<3E)Lig% zEk#_NwFZMv2BLjL3k-lT@YJBwxgwzqtWy@vz0*!xBRT=GTL!N)J?)G>b~=}IA6}Ra z`|qJT0Qe-JVnX*aZFgF4-wry%p=J{jYy`}QSDnGII~;W`H5*i#53V}; z`4{~*FsQW1zQ*CZTP{frpbT|o<8?LT&5(@n1X&yw#sjbS8sp#|F-E9)0H(y;k0-_z zeYJ8S#|H-xtA*I29Q$ui{Uj_bW?49vvM}4#0D$QrrDUiObwr1Ge`iC$7WYKIBd@?1Z1%;;TK{r zV~fL7&95LWS{$ZoeuZh#g7g{_F!@7FDS84l?=Weyt>wjzIEj_8JMKjowL{JT!U)@4 zIXX{=>KC$sD|ET!vDjrfNGt^Z%kg69LdK*EA;@K0?kFY0APcuE_PS8XJW3`#&Gfes z%YjDj)9EtL+%s?3%!FL1RPhiR2*+2=kScNVBCLYNeX*G|bSQRkJDDHb2qDblA1U#a7U$II}9bm=k%>mrf-F8nF(e3R>+o_P^NE%9BdWJ z^sSK7w?Ztl5Yi9kAyKe_aF0W!dR3n1WFgp}P*-~~^)kN9bE}1hV8*y6TX74{p|+aO za5u(`su1i$LvUr&(lbqT{K~Wry6RN%3uxu=vW#4zWd(P>eV zV3;zsIGRBJLRSN|p3obxMxmqe*8`bxsfSe>t&QAThZnP@B#bwG;=QNDfDPAvdvmd= zIr=ZCqQgcrGp6a}mR3t#ce6gsdK5BDXedgqcp>MNp)!9o>rup>{m9*DJu>l-c9xDC zb^5aLrcq`2<0P_iqEQLGN7*=0Wj8?h<)%eT#G5KFEm|VpRN43=Rn$Oz8tYu-mTDLL zuf#A$tXf4p@0W%y?@)`Gj8cj51?`Blv6r&(P?+zU+~75l+IoDFYT78N@s=_Ehs$> zr?yv7w=eQd>&~@65%9{_ufFF~{ZGimQEhb8!*=S3E!>erLX9~2D*`i|O{u9Xpu$_N zF}?L&jP@{9UHV$t($`8P_P9?riuI^yIBYXC5NIDq;XT5HHvsW zCkYN)DFHmGG>YKKMp0dVJ+`t3$nnRMBiXoz1y9FX82Mo!gijw$?Z|(yPcD|h=n+ilkL5Vyjl9M2>UBIcAX(InEL1m_|ReY&!_mblt zKHlr&`@i?f{pHsN)6}=@k2C!V$!&?IYIAO9P2k#7!r=@U;I<(_;O|wi`(xs+us<=Z z++QLF1=a$og)u3p+EtZzl7eC@fZ`Gf%`-{NM1CC4?;jsZw7{S2uSiGr9VAt$qspnO ze5%-FjBy9MNcHJFA8+sUi^G+mU+k^yPam&%k0LWwSOK@ zH>K_Gc#iH7GqqP3k2xHtMayp5B|X3S_6^xD){0sE3cq zSPDwU9x0AJQX#>;(Qd0X%hO;ELPy$^@|k zM1-g*fB|$>waIh5l#09!0&Gp7`Mm`xe9eYQ&((Lnesw#|$4i^khI0i{xR|@9y20kT zi&NVmz$7O2(rpjz?290fm~R&KFtpm|!Y0Srw$9peEl=`Lu~! zz_i&IL@Yjk(f?ree9&~X0&ldO$qm(|u^cl-ARv4CY;05|x~K>(hyg{YxNP_^`I;?S z#*<=qx)`D=HeS=Gi@efBqw!=~?nXgM;)W~wbV;)LlA*!Ypl3Pd%koF_a&PB0H#Y`D z-5ix=vx84?)sYB^jYKF`H2kvhidegV?Hq}X8NliVZ0ATUUK(;LwsR!bj*?i+(qrOj#tft! zdr!S3#9=Au8y_VQe0S%I9E5NiIlgc(#~fo3LyScYqt3O-Q7kdBW}xC`0*--wDQ{l2 zue%OcsD*JB{Ofvb5U#oIL+lF2Ys`6&F=M9hfYCUs;`>ynEea5f=zjujBW4(#n5X7q z{Kq@J)cyrwjPyx-KKHXl&93gZ1$jsuxR^^Z#Suf8zJMSX2TY`ahz^L^z>XM=0QWDq ze(^@Wd?UUq;*ghT68~a0#>Ku6|6&f^iZOwGyr|?gzY`DPwDY4F4Pyqph&?F@aIkHR zrC=7Cl%&ZphFGDeOU;hCu6yk7D6qSzX3QL661$S+GmJp&Qt59d9q0;29r>8 z{rtrZBGr>S%%)f* z+_Y%zC~Rbi0x7T|QSa`#$L8sMb8=_&D_S9(5x*T>#h?sZw z8)r>{W_kJkBIOJ1iLhi%^}|2T^ZD5$RUF*{ zH{NQUoK@2dxyqKYhM@z5=Qn$w2i~Fc@i#Lm;eI# z@hhbytlB4TEO}>=+Qv3BLZglFq-dUM;=Y+_j@Bp`yk=Jj{EBj17hOvUM2v}W@g!*K zI4_=9wZXAHEeZb45!e-Yz3-R4n9S$-{BVj{>8DH=Vbg%1?R3EW; zy1f1srbSEY@=;o}q%N=0qV)tG-Gq}PQB-(Bjlm}?MWHcZb@<_bA18}DHV+^cdEr(B znTPy^DrBe9pGM?j%SghH|9_A75AAF^{$U-Zj5}k_G!sDCqyR<4;XAi8gHxw3&`WS~ zP3|f5wYt7_C|~K#X>vWysvV55KpyCl#V>qu{{c|#(ACI}WBhgvM~y(f`V&qU_VfOZ z-yZAn^=Br;(ngAa8RI{CcFyPdJ%!E?gsKauz~)?c)|>nnYWuB>Vmbb@_(f}Kzhwm4 z>N&nIY7;ntgW2QM!s>I7ZD1AelDNwOsfnz4nQ%Tb087yFD7pJyygjBNqYUc8t4_b9^`1KtU8lEW@#dloZ0z`dBpVlTeU{fE@zt*n- zT!ZQCEv;AcYuEB?x5Teq%dg!MzjiIZb`hyY>xSkd7_fPOAs*~>ZdcSeh!VfF2BOq9 z>ZM)rMf3cj^M_VCCj#g{a)YFF1y*w5DhcMnSh@BxZ-Mqe8a6uTqIx0aS7QiO*3-~H zj#;}&E6i}H2V`eV5xxTfTX?t#{?>;*dw5D12l`-L@B4v5QNSN4hy?8iDz%N{rGfiS z#49bLoRrgyCWyu4giz-HUp|@Pq!y<<78BNH`>!O9d12-9_UzX0MRIw2cI!vCwH3$g z)(@+y5XX|VXbDllx9kJVJ%2m3Dx6xr0aCS%V!2R)H#FF(rGL1oZLm{I|6na7EFkRl z4_+7$8E$IgUP(Sdl}z-yp)Gv}&g;s}TPc$|hG5F^V&%@?=`1EjUrCl$oK)iER76Mm z2!e97j9@)GVQL#YO2*vh-=J#7`FP&?ZcGwbX(Upy+@BQByP^^?-P2f z)n)5L_bpTxP0w51UZv-gy?$-4*QD0{vS1hof(OJ*nsF$2K+L2PZ^~;e*1947@eIl< zl&Y8Y^u*FC1x1Du`KxZMTd!dKO{pG1K*kX)Ll7_sIkwE4f6H*!n*JzOc~Z9k`d)FS zS9jytGQY1yn0V>ySLeOfRod>n9dtUw^a^THp8duoX9m)3L#0|I6o@^6ARV~Y+|1WP z9LwzbE}vg%frJD$(6%sqSU+)*(b0$|2>F1#{--D)>AO_Y2pX1fT{erk@a3BV3)7U> zMUd6fMJcq#iZ{O1Mtm`h+Q`Dqhf!^i@vT7yl=fm6Pc@FPdOAWo9ig0#r<;$kdOkus zAEB6!+EB~QKTEan>s#R$cxF?q<>tevKvXe@txW9;5boMw%gu*Tt?36=REMY(8bGLa0A}Mf-RZZlmZ1Vz?%ChDhKGWtCda*2p@oktHkAPQi{VAgT2V@Kf7(epiaiMiVzYJcambyjWzW6yBoRghCb; z;)DX5Pd{G$1;P0=CG%488IZiM_2y-?Pz)~RH74l@*|E(RT4G=N%pt>y5)bGEVw zdzLRB!5e!28|y`qjyYR_}dh_=f(zes$Iz zob@_y@Xza4!;k&`)f@Ob%ht{-&S>5EA+GS)u_`|fy_LUNe{wIk1&haMe(Et{m@_P4t$4bGO2BU ztkaQA@Rr!&z6-nOEc;_Q)N&%^OXFe4=CxtN`asigaw|En(*uEQL1T|h?|o-PlapTS zUw#}kt+ErExbIo^U}w&A%7OU$!0~3zqtbEE*nm=}1u(GBwLV+Zo8@O7c($L~GRYHG zA?5Ee?G?S0=htmoDV67Uhon?B|CERa4a>9ErpoV^3*SK99MTAz$tD@kIK zLzcsAJior9y&O)UD__e-^X#U7dp2J3iD-oqgMBHnYG#wvHjaZ-d#nw9g4tBHz6V{a zXMWHh4o~|Z)2sf+&VW3LpaXX=KXfif{lO=8KAJPIyhQzwl<&uh1{CvQuRlur=jTJf zBZdCV;mOR{OY->-x-|JI{EQyKMM0zB931=QMaL`=X#)3C+o%UHU}~MEwjo9sr?vr< zW>PhZpxuwz_+ev05=7;$UTdOse`QdLNIXAg-U@H>l!-}xxj4WMTXLq4>tzbY)$C@& z3$ObEFcH~v1E-i}u>D(~NLY$l3vJ9=__qanlLgz0c^SoW8O6Me(C*{W4;FJUCdH>8 zyk%ibN1tv-^wGD(Wuxx$9qz)(d4^xmB$CDYY^w4+7hFq(< z%rpmZz^w$TufbJ@Ml%scfAy_h+*z;yRLHga)^l>@;VjFU074Oubf zY@RO`pY!il?DHKoaq|f>Nny%##wmSa3{un4K_5)HuGBV)`QYG24}u#Xv;g$}!E8y} zpJww*cw#VmJ{BGWFJTq}a^XY%@Ho}$w4L3KHOuY%_i^%I;8qO*tvjdIw~x9UoOT&M z3Cg>Sjc5)NxywY>2YuYaGzLW@wT-%kX$qS8o%1^*$ppOAHo)wkFZqt0X+u?HQYUq2 zYifsmsE}%i_(Ft5x5UT0jFLto4wChht!`$1u;8U^Z8P(Omov=rcP)V|w$SNnmelWL z(hq_XcM8*@RY%yD>ru-Cb!7gPTb^QR`>slD!_KZxC@;{c_j2FrDl&Abt&-4wKY$2c zQam6~j80wjKXfj%Mw1S&Ivs{V0|)A9YuMRv+PubPKOM9_wBB|GY3s6`wtC$U7>kLJ z%)`<9%S#9r?)6!L3f4}fr@i;AM1eoBeAWbi+CjT(rw4XK;8QjyS6>wac?c$!?A<obzgl9IPEXyQFQ&#G;J_WiQw2A7Yet5&$)1Z=pI!R z_XAeZf*ttyX3MrtGaqaWntkW9FTc(7`+VLhsmYzgkY^$X!S5V6BnfnGZ?(uQo@a;) zgKvlrolnPKiXnRSa+66mJE6Z9nj>b-+y>iwDB1XZ)zo`JomNR9tR(oV#Oa}?;_$!o zCMyh>QB?W>tX7ytop~JIJx;&Y6Nl;2*RRgBG^>Tiv^BWU;^RfX-97JudEXF&d8z6P z()aJXZMw>kC=?L``T1RX-a6}~_N>QeQ9!lFeLk+G=->Eo0AUvG&Ux#7Z&VVL!C`RT zAAD>LSi%L1`$g+tX|LN(`&U*hhNMq(eAMZ6uKI&f+U^cVt;;hjRwpQ|m-;uP+#kKu zuQq)5zW1B{+v{F**)ajqQ~C7ptaYj7{dV^~gB^oH4zIJ4oCSNm9nEmmx#C;GBG#Zk zMcwL7bFB$gHiMhX#nwiewjc8O5@7fq@~JI?rsotKO^@@rzVs@~zP9c)k6F?=RdudU zCx42vW%}zA+Y21w)()I7wTDS8ek*W;<73#JH=Dk~Iub2v$h7IrYv`po!d z^0=^RJ?t30n&)5Unyt0QpFdZxyn{x?p z(pcd^Mm&9-PO}oTKW3dqKk%3tAkDKo;{n`dI4oN%6Q$&Ks+3*Gpg6Fl(0-E>Z<~MAZbb6Ko&H#& zfF5~h4_*<_BQL}nr_`#jPyVx)&%gZgpZtDm_M2rs_iv%c&{J-SAx*W;Z9*^F?e_UO z`FNrr6v=7<=T`@={E{wzNw=sFqkph`?-mte^bb~p-J(K_{=sT6W-WyDBT8*UAC2e- z?^)npy&r$gMBSFH+ik({JP$lK2K#0E2RA#^e6uXNQadvWq@^?9?0~?NDnEPo0`Tsw z)1X|3Pn(7raHxF%q4vh|ydvIF>@C0@J{nl`y7pG}|JnPt?zVAc-RI<2{ReiC?5*X}hQ?pfnCdRPt3(J~{oBP|&X_8DDkcLo2QSFJyB~)6xtkR`N?MWG!A< z4l5x{uGu5E#X%Yv7i=`6gV{s=UGMPRIVa&uH^vRSyceI1jcOh!hC6s~{?@ZvYj(6#}6a|V&KDLS~^IP3atwp=O6I1YV5b8+W$G)R- zJ^CZRdOUMjhojY`g*z<@oz3Rv9*rd0!xjaTLpN(P-CKuOGS@6O4d8UPoZLQtdYTu0 zuma66d$DYP=tZL!Ri&Xb&w@+l#piZ^0Qm=o&5uSzL`^w5R1Svy=I@#FP^ZPuzy}O_ z!)Dk0dDuAz&&W_lF;du@*;J3vf)fpyR|%Qna`qjP7ffg0-QQjZ61+&5TqiEM<}?(7 zJk^fln+2a8S#?ijG#_X4JpX_By8QPyfs6_aPC1q>2wSpN-pJ&JS?|`DV)>OU#5OcuAuoVO$@<#u*tetd zcCn6B(Hh87)r0;Xh)&f9%lR-Uat7SO3zQm#$K-kEqI3_o!p!72rZ+Lita}3>eYEIJP0m}o8@&$d$mjyXMHdi^E+Eiob~Mjb$#yCk*d*gPDgQy@dk}b?k`1b~ zDHY;-VAG-oftz4FuxU|)z)dh7*tDoY;3gOkY+BR+)xzU^bkA9t>xGKy*@>K>N6DTx z5PMkz+=_<7oYBy_t-Sy*Pv!4KsMBw|#H;(;CaCv)^UMDvos(o|D;YQ}uw-W|$^2>s<(+e6p(-tT%Nxd9+x8i%G$;~+=&P780!-;8ov9>a z#go?vCE6VV=H&K|SjossLlQ>rEb@Ltr@KS^uq5XVkjC@jSbkWNQS4=dyrFLA`Qpwc zn)G2|(Ach0qb!hBzVCe>9vy*-b5S@>g;Lp59~s^xD@rI57`T6iuyBJ?Mam*$>WYjE z1}<>XS4sk~w*c@S|E+1s^}VP!_8b%$bBOJKFbNhVMwl<|*_bHf+6p{)*TaF!nE9)C zKi%E_UO0Q{rivjuyPu6J1KIlCD-Ecq8-TrWKsj-$6bBC3f#dUAo@K zyGf#3gaohbqS~^Rxu+&; zFlDkYI<+&>w|7xbB8Jv1a5ww<|4jz(lz zUni6Fm}~qozrVj3LAg^MJ$d~tR?%O!yWQ-xIT!*ovH?FZX@e<7A73@M(LWfjPjyv* z&aFS-)Q0va!Rr7>PS|ZDab5WncI8jPy`uNmMsU02IGTKzj{cl{Lx(g-2z+;8FFC$b zctgyTu=+`HL_-1Kjqtc2n|WYfyqCqMrS(~Kazyg zbqz}U;GvLQ4R-i~zrpn2i}~@mynMnj6$#4Anv!=`8a~FCo5LV+k;xMF2T1m3qPI7@ zA7Lw1;mLn>((PQdF4}{^J6qB>e<#`(%8&-K)fqG|FWb%jJ6n4D=B#<~aqtfR1=yC0 z_B;6J?VG{X`FZam``rH5yQ28^&2_J<|9eM&^ok%gJRvj^6~%aGx(Q=gGyPVD^@>EK zq#QmV6<4R_%h#T8@<0N5WNORK6a;8#)P;#)3M3pH?S#2!!VWX)!bHf-7HpVV!a>l4 zlk@etGv0->TyJ}e^>Adkn`X996IHD89s}y3*B^!VtVRw-jnt%y$I{^m&UTK*#$;y+ zyCx96(UI5e9*NI9bvn0PYFL@atW{&l!&SHI+NnU|+6F2#C?z~$^L-*r| zW9!z&!AIAl`NNYVZ&C0S@bd+nrNf0H2k*`Zvj4}Q5k^%`lKqq@hRva`b2tdqV8jEn z&=6ot?~CI1r1X2~UB%7;$7OtyP`VXg&hy97ydF|$1Fi4|!rA4XEZYz@j;J(xoQ$i= zM)0JOht9gqj{_?Qp>}+5*=YgF+GYE+)9hyLv$OW;5Yow595*Fihh;tC)DwxD88hL` zm3&pB*3V?n|A8r+tAUUb2Laf@25`37* zCL6AiTCqV?p+WR-tfoCo%>c4u3&nzE{C@+nVtB`t`OMU!G{FV)nW@ESf(zy|SseUd z;UcEkgs1}Z*)N~R`)8O+6OO-3QYX4yai%JT24%n~ndn)!UTiQd@NED>F<3s`{Lvwp zlC8UOgMWIJ2>wJiN_}S9oVv7`y$2Gc60<4x8F0kjF>W&DH2Klq_KICNlpD*Z*oA{Y zXLe-fu*1)qX%oh2S_pZ%LT^lb<&*n8{i$h&^S@e`Pn?XsyrE*a90K3oi#I$bfUjcR zCpu@>9UkHV7M70J9^cgp-o7CQ1DP!2wC%7?W-Jki0`&C^_PpC4?lb$t*)s;OI4W(g zbyY8U=7v}IT33!_e|oQ}v2UTV`cFlU^2PYpQeoem*N~a|xzZ=YgFk}3RqPN!ZtnJD zlgt*_!4tZ4TnEp}Y}pICd4^sH+#uvA%AkPk!mBVVN{*XnXx&0X>$Hbg)-5!&ZhLrT z-9kfl+&e6z-5k<1c?WML_s|AFJa)z@awxHF0qZt-DI6=PV$^;WyDKN=l@lM1Bl%+) zJqGe26Vl$X0M&MPWkH%AHInp6uQwQSNDuVXqO%X0tyb3pvnv$w>4&Scv)*YFOp)d% z_~x@-ua$L%?el@TN%@4@?LL?+9iVuW#Gx{-r=4wlEOs7S`8`Y`3M=sa&T#Ykp%mp^ z-LK1Gse70VZZw_T*eG@-$QvflK|gD55m3;>f1S-141XjkMU+0jbW=`JnJWHtq^NL%Xj9%asW46_D7*BgXZKH&P1}}6>OphK z^U3J`13qe)W~9mu6RJkUxDhkd7?sR%bT+!Tj`6K82TL0(Ad2J~7dv07IQ~qz@n?#? zH&o(?)rxZ)s>Bhi6}ycnbQ?K(QYOV2dX*}YJ`wr&Pm0S3z0mnVXc^Mb&8Qee43j{b zPXQ|{;MzKsW-ep&8$b9x_b7`8N zM2ar4;H&pI&?L^26Vd}sORp*yd{eP?fMV|cR{#0be~LBJN;yCSisQqSQVyNs_%NkX zhfc8qQKc4G1TL7;p#t$1oIjb5;ZW%`ZXAJ^J(=hE7&K##b06a10w;5QX17j2^IHxI zAOyv#BrVdH8CVV3D4|A5>q{hExN396o6=AJ6z4hbR}j{KDLG#uEI=5iUwbWC=vtEn z0y%bPH%P3`X7h>+Oj(z+L(zz8M&)d&lrgZN@Z$xOlwHiy$Y`Lu`Dk%xb;lJxCuJP% zs@d`;<8eOiOdp?isGiHQ8@n{PyL%cYaZ~_ThlvWwanF?aTu+2Ba7k2hIz4#IH=E$R z0Vkjf4`U(X#A(;$ur;M03QVIo+`?oRH58n6-3XEQX0kZR!AuRpj)NJVnppF**=*Aw z_)-x|mAdPlCHpj{rZhW0v4E?RQd3VBmmrV*;o1UHO<dLkyvb4?f)RwO?hvIv z=E?M#&Yrj+gFyKsK6|3bIeSz{2eK*EQ24z!e?QKKv+n56QDpB3u!9c4a+X1sgV1c;UFYtIO8PF-tcBidysjQbgJodcQW3Z`+5C<-LB^` zKy5CWVwGGfo#38SG7m;^Nx1#{`OWBF??gZuAK83u3UdtBpVhJ;zQ?jCSFqnQ*h90K zvKM749mj!`)nzHF%SeX-Jv^ICQDofUUrcR1>IZM}!4JhdBn-GFh?MnggdT7=q7?$K zkcURKCTKaBmlmw%l&%tlW4qGCFf2>pZdy6`+WD0-zJ(UWrOxw4N~#$TKj;6hvMTgr zKEJyZgRDQ1W;ZT^xI|DYJcpv+k=%Hr=*_lcUqvf@130u+Cy^e4=MSn zevn>)I{1|sHP8Bl?#(CPCIpz5;%R{?vL7@fI_^$xbJIPby!XXja6ny{pO7*7K4l_@ z>dl|8(ogvSOO@l!k@5kSs(nJD^z2nmSQ(V{gjN+AF_LV6{CM4DroJw$DiAr>q7&GO z>_FV`z~;bRBC1%ZpV#!j9!rdgZh59K@YfV$^H!;Un106eARx77Bt=9!Vm{Dw% z+Oab);$^zv&8`~6)({>$`$fJ?7rcnfL2MzHVrMNRKW24C!nZn&S4K=M)3NM=da;Yl z7GBhd5jV=K{%=>_`nr5g3c}15_=M3HOiUYvIHfP*%obRj(ic48jUo(8U-0s390Tp~ z#5v@5bMv~@@UP_>qC3nZ9vbkbE_mhQB5dW4kil`PW&dxJ8>1N{onm18Fm~f{_mH{S z=}?S{e9eN^c&kvsJ1_ot|KdU=Qa>UQ7j|Kotwgkjq7sv9_{2RN>&p+fd*Rru2N z@DUd8r-u63NzZt&W{=OfZtA&2Z+;sPzDqZacU;^MZt?WnH?3Z;pPlsE&EG&vcG+*Y zI^Zu$LxNh+Ve@15Ywy#=#qX>mOOQ|bb#^zMKAQ)F*Pz_e{oq5?0gu-gyn&Owlv{SR zs>|%<6hoGQ5!Ou)so2pZN7{ zyB-+n@nZN;`F;L%t`})NeBY??*AnIfR-Xh7!s%_^>m4jj?sIj!RC~!a7-t#&N~Ql#iiwcPc8%qH-~MSQqZu zW#;B?WZIm<;vnf=q^|UsGSg8p6=`v(y)TLKY&;fE!b z@_rNXIyD8$Dizh_I2~5RGh9h#3okt&=bG%+6|^hVQ{u=e%5l%}Iea)nUVWjX#tvAi z8n9CJh|$@x39zI>mASb_H2kU$8Vmc?01-Zi?Q=8CK)ME(?RKjOZfo^B7r&Y4yO?s> zZ+L>^;NUSd``~zx2a`?T8dJQ=T|T-8zO?)c%<|KM;ftuISAid@`(_Av5IORM(L+)} ze{hLe4e*ey#DNDfAHhy;$=Fy}sbD~Qy66@3j-mR~7iY~y$-Y+s|ML*$@K6>GS*zx) zUgl`c(A?u}{&kQ1muJLXmu4uzREEIxD0+y#fjg9`uDZA&?FW8Az_Iq9-6^AI;}= z(nXfv_#p(Gm2rV|mzw0ICSL#tEe=?A4ser?XRyb&I)Hkmwa}H;BoiWZSA41Li*djT zw7^xM1*|{|oa~GGg2xtN75~=H`1CVD!t^Oo?tt=iCXRk4VBMQBHAm)x`2pqVX9AY6 z19cqz%#TLm&>iP7Q102vI;tT3tDUVWZ<6%q<&M&W$(vHS1Wz%+Q;b=@U&hc)nw+*~ z4M)=@6kkT6V}n3ZU1MF}g!NUxE9*ikUV*oQupl}jF7?uSF^KKZX%$Y?FSBo2EUI$$ z(vxrBG>60H>2F!9dEWfUprv>M@DEr0=CISd;GbmiQ|DsX?tgA}`KP$}>9>pC>2D`Z z>v@faqm$;z@0qu~Xyw<{nr+@_e8`BGA)c|erL5l`bOu8QdlijPkWKYdyV)In;=4dy z&fDj`{_olF_sjOcR0cgf?|p8cw=aen$+p*@+85bb=i{eg;be{u=!5pfpx1X^4^l^F zzUmG;mtByFv4T#k>%6Y4NZg!G9!3;^_b}3I3MI{0nEGCaz#FnZUg&`R=?jtB!V%3@ zA&b`-k>nMmF;XudpF9ulCi(r25ZU!~qB3!bW5|L>i1b9uoRjJ0eDQ zV-RI4DgZ(@5`<_ZxO>COp_iaF;1rNMVr8v1XdAJ|>LG ziR5JTmD7#N0F@_`1#NK(#IL8Bfz9u(4U>8V3k3ITHfr}~_Mlm#{{}?O1p<0a{vRO= zwVtP=hsn*(*a*9oRim^`!XUGS7YvNo_47(ZC`LG0n$vIdXC@_PZp6=sn%B#UMap7o^U-BdycD*tHCjTnZfZ^jrE5o4aeR7y{-9U;Bm8N>({Hn5cppR zixd(ef#0AnScYz4rOXBx1;5UeqaOy|ZuNWD7n&bF?Ol9s_Xk>rC>{#3BFh}+P5@TA z_!$=IHb*oH*zC7E7iYcxDY5KYbO6A`0e7#l_C&vV@v)t0fq)+gHa*f|aR-$tD~2xk zT+<7W84L%*n!rMIwEWULKk2lyZo3KTBFdwP@uej@J5_Dqd9Cq$VeVsow%Js3Wgzog z3t5Qz%*hmiN1VIjb%+rO@BhTz{|WE^WTy}BuKM|KMmDOhM;~p7>fU_PAF(Q}x&b%A z(Zr&Ng@6c!0A24%emDAaqWk1338WD&JyKJ7A@P|TMMhfrG`k;@C7_DJk2v+x!5T3o zkC2kn`dkiYG_YHu*wTd>tHI#U;BCm{!zmlTnrGH3H6L?G6whp2cN z&#u5P9Y6cj5&_d}LW!+k%oY%`V_=xNo0yFoVQQhI;etv7c|$C_oNlFh1GBPt9@C{`aG1rgJ?x{rvlAJ~nbP#1zWLPY_xo z=C~pb-aJ5P-4P8r_~U7FnynR*3WG+;GBJ&oUN%jXgnHv~6~(kgm6iSgd1(XWrEyaF z8K#Jc;S-|3u~|nfS4V+$L8xhppj6?cA8-l(8J{JtOI5^9HW51698W*Mj@O~3X*y!nBl$@GaDh28fO1%H_6qk3RY5=5o+Yi_ zN|vH;rH#HtnPkqH)%*EmdOOn%qgC+q4(hh7OLANdK*Sb`s6slT%@TUlV9vY2-q~eN z`imto(s_%uX%TAE(8<=%w{=*?FKI8>86ZSc)k3qPGtKRmow1qcRjUzVgfI7fq=$Go zyVO5iJ=S9DWBd7m3S;6gOsTpS;ywK_dKFD#@ALMzZ&e+GchymH3Xae#vW`=*k@mKp zccl=}R%cz}jMxDyaviWDR*FZ26BC*XUW~MX4DZIqrwENtAhQApYHLEf&hQh8;#+|L z;R4vkD!DT9RuV<1{)OIRR< zdt3|VWrZVjM1ti_7@fLHs#dxx|C^K~!U4s^rHB;VobhzS4I%yV#j}hAlM0czpU0CS z>gfJHPbe;``e*SQMj1z%I?QTf^j8ti1^)QC)9p4tf}^*-q90Ki)$M)!NZC;u0WsTP za%a8XNw){6YNx#`)GDINOOn>C_&w`4Tb(Pbxr33gtvTAm>t<)@s_(?s=L#L3Dyhr{ zK#mE7O@9GOA+yC|^0+W}Fcf}18t0m?&*yv>HsPOUv`*L6ZxJQDHV^#k(cF9$$zOFp zcsWUTZ?g+wB-5j6t5~XyP^#Uktoa*HX%DqQ#4d!9>p~bY*ATfbgb}+CMy?BC#4d!9 z>p~c@3t@y>Z$0>v#huHoR240lCraH;v;HDV(XPkP26A! zcyHCgexfsg6&ccHHsQAQIeonO;69EOQE-Y=(Z3$ej35bSNTk{1CcnfOC4(1E0qPZP z`w<%qqJ$)8k4zjRGLI2Ey+rMOu#>ELezw#O5;!FuEW`$)9uy^(h~O&BijwWzH2>}q zh>;@#g?v7L-_P|4loukHh$*`&H7NA|NC>CW>x7Zl8=iUM)N!1M*gG~##c?G+c5RK2 zkC^8GlXZQUPtQj4=J$~n^jZeYU%7jbwNP0_V=f!nVzvjsv_Ds9wS`;@y}(ulHwAwu=eqP&4S_7ztsW@B4~#x@jh-HqrtVu2m> z7h8#PD`8Deq})}Zcvbju)2lMJx08H)IjQanTYBZ~n`T#Y!LAdk9)EP-pdZLc%;+cR z@^{wh4~7}s?`H$e>$b91yW9NTyb51<3C!tWh?Z)6jPoDrsrAHLk|Qh!T*m0fu<4P) z+#I8}2+hsG9;mY?X}_!;}3va^%2fpJ#N!w6FjzzeT#a@&LwA) z`GS7N^QJR3y)!$KJm)S~Dq>zbwg~x)D?L&77x}-J&3nDNOe5i|V5(y_CB&g4xy7N% zY~hGZb<7fBEKI#yO~5c(J&3L1AM}ealCCe-ADY>MseffZ{U@dEOV+j0c-y-6CneYZ z#HvV(Kq1h=tK@VG%R|58{s5gTQfC>ix58?RaK;d95YRcH;_mrv1O)&>6+#_%mIu7 zGOwEJti|gZ5*E3$$I*;2&MAuy1r6O55xjwqU{e;w0NbS!WwzjLY+X93-WWzAdq@-n zA`>a1lDFaT(1wc{g;t`hD0$n9_H6Gnw-=V$i?gBxzP-<1^QQM44Eg8Fbxy^3EXb@E z?fQ?f&404_EwP4HN7#fbiz!DowVz>ri`ljj$408yK=D=y9&s^g=x$H8sl>4n&9)Q5 zj!_&WF8jpRjW{+axBEH!%EWa`i&+53KsUb;N5IJ_2zk0Rx6B!S*3nFJVOEr?NJe)U z@%Q0VKcGatORVnm;23Q*Oz2gTf46JgQJI91JPtjv7^H)&VO!g%H_M;|&Gp zR1ggVRtp*GJJas0a7{{uO;Xg^h^S~G4ZF{H|DFN}yde#+50rAQTghg6Fys`qJ zvY9OK$_j*N9eqg|PL#1|UqPH_%#Ot|CFTCx>gTcg2~IsA8V*qv?4TqXj@3^vmZu0D ztDj&mdJ#BQKfxMi5gf(pCrYG{;{qt*-CrdJ_Z25RH~DW(>8(w8o;HH4DE+7TZ42h# z1?Tpzm;xLtrFORuLJ{DjWg+v4gYT1vdgI4Kk8kS3c2RTu8%96$gOYUXJt-t0 z%~S+6kk?{{oQ+W^IGSU%V5DQwh+M)KXST2&PAtSm1FWA|;5*#hS(Zp~+p#o1)zDB^0S;gUY1IjOAzX-?k0X|}Gq!|bfr z?e?z85R9U?K#JvsOiCLLE>aoTC`I9OGw@N0tX``<==9sItYy?2*;&7L&NkXLgrO8Y zM0UT^Zx8$J=FoW$rmo+vz8NE`~+l!mZDvBk5`JbX0o! zvU%D$``uCcq3nU~raC<3{O{1@p}qztlV6B8zEB$8Almrc zIfbfsd!PBEf^g%*YvUi(Ntxm(UB1p|qw&pXQ3J)mySi&c1krYt(RwaaxNG*UEON5J zh0JWh>2p6{f~fmLy4&#OD3z@6Fl@HzE{Fd}3ZF)C91u|;QxNFSjrDzAK{Eep9{tdN zn)ar-5yF#_5WXGSsQ%b&217FJ-|8r^Xea~bVBw58o6W01z|^0i1*j9A02R_SP)#h* zBd2_+nT2AOLb)sjI~fUU7B!!B`ZS+|j{bnJ+dRf56T@m3*$+;nrZb->i-{KXkaML< zcPP+ycceR6m~oQfI!FQBHG-6+qD>;97&T0;uXn;4@^k1+C$>8aTs2a zZ1_Gya@Jbe;Lk9`YR^^zFZp2sOriibS)l5{r*x>Y5WX0??45ZA#+C*c8|Y0xf6VXi zef)Ku=6oAcMp0%9Xt*EUpcVI!mKwf&C0P=bMiSJlJA9j=rw4uF_Gl#|+bQ3~3dUU( zF7B#e=Tw2tsm3VoJ;8VR0hEroJ%-e5;lxW#6Q-t#OHJADQ=pz~wex0o)Phgnzu(G7 z76hA^gbN`o7(!U2PG+Oche1_Gh#zs-rQXlvSPGFkpD7s&LZV{ORW?*2Q&sg1F#p~a z&z{5ry(7@WLazzU&S>80hcI}dmmg(ZG#R@5C`;uMrSjSI)1;CS<2XGPq@q|`y}V9~ z%+hedT6;82J)#rLqW83%K0SQR=ZEkOhN^~M`pr5Ti8`7&ZSJ%A?7`60A1G%8-VQRF zgmlp)B&)w9`| z4w~H*RjoV7E#%3jo66)0B;qNr1=Cfqpj!`e~?!3v(mcDP1x?SiStbW=+ys zbhGkC9QeBnEA3|l9fSb~9fW}!bYSpzObPo}1ZY&Hi0HQ$lcuF?nwBPAy2msv3B+{) z;lKJm=EA(rM~{vrSxTyNyS-UTiveBsw=qfN8B)gdAs@THCnSFy&n79^x+tqz7k8Km zrR&)(8CezzH3)BQf@@<#*L|7O&}KK;6l94{!RHb9FL(`Kx0`)17qy$GpR#8Eym!^- z9Gv(x%+YDTHyE7suCvSDHDavbFBUx61zwhk#bfRa0AslS5o+fe%rmj`OiTBK159P& zbCyn#k%YUK&B34zVXK2opD?`(um{3%!Civ3*PN;)DwlRURj0_rS8}RODVBD_qt~6` zC;P=&=VCByH(U6`b+6yz8W4VF)h$~p$6&aI^emH|NY64c4zttQ5~)4iB=t0CbY}Bs zb5FgFW0OrL(lwb#Hkn8?nH=rdOc=*0LHAQ#?{L)B+UU)s!Rd<1N+fAv{t?-vG=bX+nLPFIlxVk2WR(h`q8 z9By)>bf}IDT|JgXHQX6u7t|zh7`TKLJV_88)-5~ci96;hvjyYL{+}1Foce*vQyWg4 zT3=$kO0%N$)_Svt4fdg;ELrT$9yWrkD804b>|rC!iqgw^vnMMN$=DQ*qh*|Gkd5$g z#{9+LwC0U87*46Xwi}_1QI9mZ;yJPM}5L>u1S!%WQPeu;0$QOZgolEz;7q4 zXC#+l<58cmo-ql7V@qm@keMwUBhBY=#k`-A_Ug4ct0(ODm`DRM?(hiyp&3jb9`AF# zMwWVD3~3V)`{Gpfb^i&N-U*up64xw{uvs8sRIuUf(SAjxFrm)YHB<=Mx{b(XrP!j9 zxQT`m4ns*$^1Xv}7t?b+)ZoWlk%#zfcnEhhGOtXi3skM1oIPrFmk)amBIBP8HY=z4tVJbK>6w2X#P#Ftkd~yvG@v!ftjUB$ho7X4**w@k)V6qkMMU-*iM;* zl+x?@EAYT`O`c}ER+<~IUx|0!&3Lg7dVvatS2lVuEkzHeHhM5EMGvMndN6&pPW%aj z8Yi)EcRnxPnC$AjWXPs+na^)$^9LJ~D-@=EdpR8Ug#GLjbccJS_Vt{7%Z-y|4RZ+P z6Oa^f!VR$ZQQ{^@O&ESWL8sG4jP>6lu$b2Da&yfp2^s$Fu=9FHYtJqv-u_V(X$fp1 zwehKF$@}3^6bT1_B`!R5!tm4y!BhWSKn`W4r^5RPN6bc`q{r2(ChXdhgoL43Db^!l zxSJ%|nV~M>*!m2@2p8 z;)Bm!w9f&kr2Ld>SPQ~gw_S7~Yn}~ts~_7#1ZDr!VOv5>wf6O|h}KSa185HVdfM)` zPfQJtH8|cJP1L>^f-=1nQ)Ax3a7q7L_M6S4C~iUg&S|gLZS}5sm~cny&S(1jF1yX& z^(V2hK=-b9#b1Rd_ov=<*6rz!g5SVkt=nv#blaJkoa<&6!)!Wd*=Z9}HlhK=v78`F zfq_&_Cm@NNfFHr4VZTJT09C?Yw-UC8bbGzu@L{fC?T75F*XPgrq`#YEfLd;SD6Ye6 z{8hd-`5FAp?Vv6J?r3RR5U{2VtHqe4RtFu8FP)3bojaO0U7KD~G~3)`$54cCqe}pN z6fJ#s6wwi7#R}stx>fOnJSK`WI%Hin=8%vOI=`m}s-cR^G4QmPK zHAzi&f-S*j{9&6T!3xtFKDar4?PCwdUe7R(URy7nQDP-o)jCOTnlB3idZ^)U@+`A&!Dde)Z{EdUTn|{+!!bA;dL8UrEYs*CZtXZ zQ^(9T8b3_t`N!?4Ew?x`(X_2PGr@@2f^Gy98sHK8^_fnQ9Y%w)gvN}G^1zD1T_akk z#1SnNvu_I7w-NYTIx!BFqtQ5m4U|sv8AdLJB9Y~g9<1F0@Eu&cQOa=bUp3!}{-PK8 zL%x{QiKX+`AD8_iq5i?_AqVFrP@Uz#=ou&M+x0-Uw^LJo_EUYf2r92 zQn~(@iVX>b!M0y4W{GvG-QCpdB%QL8bm}@ur>xRTarM~lUQH*UQ6JqmcPkaQ4>pgX zH-12|kVWWyX!ZrdaJ5+J})@4&JEOlwCMdR7;OFh5BuBuQ$Z= z`D~t>&=3gXy}sKi3s>4AsW(<6WgRT}0qsdcs0q;sJiAcerCo@HW5i3Zw7n^oS2P-) zcxin%$ZUZuY2f2mi3Qj((B5EPlC0Loon28=$-Owv>9aYsIrWBqr5yT|CTx|g8wOHw zKJ-eL-i?rCwm_ChO!C#w7mvDu95!9OY1uv-M55?wr#pd~g00$~>ir9Nlv(7wa3$Y70un(=;wkb3z^b+m{6K*`&??#J44P5&W z47?HEw4%+mF=r|+hjEr8Xx9FTd)xN@_eLss97GFxzr z&3BuP&4=@%ED3v0eU9)aMTq6r^os+YWp4kl*!Th#AV;gyJTYZK4KZMtxGa_TgS!g_JFuscYFx*|JGEQ->jMC@+AB zVhfV803zr4!)!j;<&jxwBsLrELk~a@-e%ipSU?2fRgx8@BOrv3&UI}XICz4zWZ24N zY?%8!8}h1~QdT#m2_q_!1lgJ_fN9x_$}mauiPoYK^4SoIQj5D~q#dn!dG?TbcG_j= z=|c7}GJx*e9>f%Q*+Hg{X=K_1mXsKQn>y~|Xj)l6;qf*e@usu~swKX;u4#bVi3OTP z7h4;Z1U2k(bE-B=UdAwF#xSHXDWEO~amr?nys@(>dsC1lZ?f1WqHi3-b<%;iWmc3J zbmvgn$P8b@%Oy0JOK3#do+v*XX3N`L$jyaCbB@0FfGy>vh3wXxqE(feJC+WhHaF_i z48$p0$Wzxsp0b6UP!n~>XUkQk&~f&Zmtzf?V-0E8j-{1S$}4NKTclESkbpm)eiuwJ zd$i#N08{K1p$GtMQE|~ZK^wMypDeG~MME_lpr&IvP+q@v3lWb( z;s60D#*tAJWE7eUW-`&8Z1We1gMAEltNAc}(>hCl*_(*lq7rjkaFt|5sX(9FY~p#Z zc5+2lLp;crv@$>wOeDnC`W|2(c6{pk!o@FKUs=$9lemdW&KH`*O;qxLgB7~H_vw)_ zwzepJ@k2aeM9@u};;VoO!z-JLYb#J#P!VTq`?;=s+L@H|$finc>%oo`WXBvwz45%L zEsEn!RN#0vDpqPJR5Gl7K-u>7KB$c{OUt)O${)d`_jVD`Cp6gsGbh-K!$0nr_g4DtQ$L ziWLW{5tmypX*H^5RXmVO^Fpnqd_<-$)LP0%Wa=J~eu=v(NT6rjLXkv)CrP7FDd%%n zr7DTPhAuQ7*8hVgrnFfh{cr)q8oQep*#VJ&yxC#5~#^;3ia7 zlw5uz&5DxYqVPy-WJRem%;F(Rx~hROdhorPQpK856+0q{;>67=wh1w7!ZjYrb;YL# z(06%3x#_hP`yMD1bSekN)F1wr4W)rm_kJ~lVo_X-ohtt7*zpWk9Q>dt_@QEqN&TVl zMx{WrUgFQVV=8u?);L&5#S{;NqDK3Fo<{e*`F>cI8%!r&&0oNpKlG1zd|GyoR zW;+pHy%PsJq{6kG2-d)&Y(()Ky(yYb0C}^RgPLJPRr+i8qOZ4#{X5hVus{!V9E-ij zIcHp?W77^NALoL=Df6Q#KGMWzxJVP$@+2nol)^kJsL_;`KI=EOSWZ&I)U6k&9X^XOCw08D;0b2bOi6_I5^bXO!C+ z#hp>MGmvQQASX%D@X2NRE}Jn>E<^auy`7L&-7V~=d$~P!3RBYM_Bdae!Yx(wXE+1M zggqRR>hn+=zCw7vf@!xB?pH9c zMV#SEk@d)Yjb!->^`EO>Lze3!eG_kJFTi%n_)Dn^u$?l%HYH5j2SnNHYplEmAH@bA zg$5rJS=ge~^)Dy*dUNC`_OdpyoUEwhB^j*5K0a-VeLS4CG~M*5W#KN9KH-u+_99Ti z8OYjb)Eg|3UZYckjZTe~7OTXd)+aVAQ|Qf2r8qa0a&uED&P}B-YN{q~_F-qK^5$w$ zoU27e?i_OHk&4oypVj=_{66Jg8!P9~fI|JaTLUPx=X-D8y#L(nUbP4B%wH3dYhzqX zR}98!p&uz6^19u;>|MOu@|y#!i9ng{cPrP<0}vniu5<+mniSq={z7={SrbypnZNoo z{)D`(5KHiXYcC=PSqZ%_N+(KX+(;z#_kg!DSc3KSm(Cglq-aFEN29`iC>jRS2McfC z;Ft7neN`TS8f9wr&<&%P!h&i2z;UEHil*vTbTWTh)?d>2mLD%R;XvOK*eV*!RzXzt zFyQUoAgbt@zlv+BU#}BBSj+>cn8^3z^x%4*?<53oFiS!Qie>zs;XrKqmNlhECdv*z^OT zm2{tZyb6aKxL^eaDp-Clv{Kk$Xr-{>LMw%V1*S!j?I_4IdY+gLfz#Dq$NnDhGv+2(7U>5W!=ti?QZ8&uh+^h+xlehoc_iKKBk=Z!O|dF`KR7_J3H<62JNhU z(YyNi$s&rFr_gf-pBfDNy>2&a_OZp)$0R>C?Dev9D`-jg;i%wZ--ch3 zY(~u}L0F&&fzNGDVcVm(r~3v3h`@5Y5WqpYs`b)sSQ7=I`*uo9MfIJQe7SaKWz4dT2Ztq5UzsyVz2Pw_vo{8s^(8iaO{J0E>t1D_VkTX=iiDJz^p(V` z9y(FepX$J`2)ss{fQ>eR<4mV7RAviDc4ynYV!gfhhExX}QXK?t?*s0A;P!sAN7=E` z4*M66$2y|#GWV=vXYnXr{jLiyvestAkwf0)0k`L{d)zb)#qfsR1RQn~G$ME9#F;G| z<|gexaXlsxDKV9{u zChDWx$-ndY;=>;k(7!ex9~r{Y>r!jVZm>?!LS7s}5h4N` zJLUAfv6ID4q*2W2ej}ogW|0MEu~LZ_nMh5(HB%}UnFx3hi@;0u_nQAh$-ZiMkolmG zA&-U#Q};}h_DlntRZU_J)^$w|43_R8FCT~V?M?H+-OS=~mbE)~AdgI!`FJl#FkjfQ zZbNxQXQW5=l#Tr7%c={e<5hDqo89N5DKjbl2~7o`V1yU6PRo2wo)B}Gcu&McHnO7h z(oD?jAWFwL5dHpt_GC;vXn1;zgP6BnP{c<811b1KYlwzRv?6{!ii(p_U}ol`R1mEo zW#VK~P#L0?7;ph9to!6Z zZ$ws<{sMx|3vkUx6m+CV?GIxcGLINLJg96$A@h_`C>(Mw?cps+kz}@DYz3E?1Q+H( z1Lj#J1z{L+9yRQ-Ki-+*@hekaQ7F`!2-k?1O=?83GlPlM2T%qnrs=8G z2T=MA-t<9(C2wOjGc?_x{hCri(`AG2OM(tGG`(R(1_}julbCg6CHs&hdu3V+`Q#^e zn-@LkTCR%P6< zoJ_;jc14Phz=#adW>pHs^h|gxPjICDlrt?!JuW6FA=#5WaZhqKtO+)(h0M0u;RY3V zy`#wm%Dugqb!Xr=VDs@Dv91?28<)ZFcb!+q*P(#1)kC1c)M)_}RS7^*SpY?4!^82) z;uPZII0`{L{>Jwq0-=)GO6S44=H}-a8NC+Nz@Cv%sl_rzUBWlncmK7>=5_0 zDy=~TeLnqwjy$+LtF*QDk}pd2V`tbLwp;JGfS&pN-{0ZCZ{M6YyXWuVpSN!Yy*?ys z?6yC*yAY#?(F;I|M{ZP-xsQ66iSEW!Z}-wKK%{lYCl5~#lmN}#ha} z%fZP9gr2T(ace^gG&ILtTb17gozWD`qx@~7Z!yBslt z%AtYQp7pjN${L%rAyw!Mb1=o&BgopV<$N^NgdCz}>XPK*O-*Kd7oXex0j3~scbmT( zqKHZt6Ps_c8MoS}{dRNE<|jBJ8-L}SFl~dY!DaiDU%PB}?5{Te>&f%rY4MofEcutX z_~q(p!Xz90@NO{lZ!wuoTlxLynSTO`a67qQS~`wapu5SpyWAi@^OKm$othiW=FSU2 z@xy{2hGkWcY@^-q_GyZMg&!{G`FL^zfrB2a;u<*?mW+zn-Cn|yQM5Z>(98D;KY(4oFyrMWf8C-qy8pF#pQuIbNK`T@BTCd&^`noXK~7%wIt zZbyqHRzLgt-#~~z^zd)knJ&*qkMDKI<~91|^8kU{HX&8wuv{x!bQg3vj}dcko*YJa z+b+K}+T7NTR10=Ks_JNYOZXR1Y8Q|jS5~4J064u>0c9F;SS+Yf(x=tiaE!O~G#Vp^o70$?TEo4V_x zD_M@zC|WxAnZodfrn#@69&s17h&#zOT2zY-)Hw42{{r1Mc5L!-5`K zfnk>&A;5GV7C{woq8&$UnOoh`*6L5yKwdT->`ujc|2&Q`YkWan=xq39{f_2j%=5)U zjcgjisFa2WomRUxojI zA5i~ee)#R8clz5&6G1)jH<;VgZU<^4krNe#{3|S_RuE$T-NQJcZU2# zT6&_u1;HLQ+#eCL<8zbiMkR&)vEOWUt_J+mn*7W^z%;iyA3p-}#$~gw$DrFDWX<#5 z)dlwm)eGy-taJ^HTI)~s&dvsHt_j6>J78JAJt%-k@Y{i1>h?Ys{X=bN31|(UgNfOJ zsD{tM*Yz&4Pgi}OjFVn(U_T6|>aySawS7A5blc^D5uV>%;1v8G81a7l6nf!2iwkM^ zNq-(<51I;L%?vw;!jfGL+6K>14|AuR4SE-yQ|Q|{_Z(^-_O4DpSyUCQ)=ns_qtBfa zngahbs8aQk$_P;tMi@2T)T}SE5r{9uzrz5JC*Qv5t>}FK^&MjZUHUkB$Wi-9>Pl8< zL}-7~tO0P;2M2RKcq4Bsm9#2Sj zF&O=s zxzmg{Ktd8!9RXz97E(Kg#1HPL1dT&iw-tvx0WqHYdjIR!T10p+HT|3DW_F;{l*yQF zC{j^rd@N^&+NPJo(!|LvZC`5ZV)W?9UbTbUNAmv=?oh_Bcnv!|UnyEIUg z+J)^o9z8tf)5T||*b8SDpjv#K-|CJHo~HmYLL|q$kDfo{8Gt8LL76D;l+f*TY_$QD zOL9EBd|KR9Uug;PJ_U)l3_p_Azwt}g@k?Q>8+;PR4fiCB8$ni-3c4CM>@1OcdBj&y zR+I{RbZq6TxDk7_{j30w1^+r8)2v=o53NpI#gLo*;L4-MmI za4Ogz1h>SLogq;RN_@M;kBx&8!453JMwjlp(R6%oY#q2v-u>f*&PkInjdzaK>_@2C zKN8Y0vRzh~Qm(60r0iZr`{Cr^9#pYEsm z9E6qOtUevVQI(0yBXcZRU}C{03*fn+0iFeddF0INKIzlrFty5}cz(8GDGH!okuQ#9 zR+OBT9@$Pu$*#_=yUNz>oCmlNZ`)23(1mzqNt_GTqF0))cNGC7H(Lm3Ev6;8C$(~q zJ9is;uqlkXF3F|7BxxEI+@%T(Agw9=2w-z$H0`=UtHU(^_tMBbc?qBU zQE&ZdW>#~7g3p{85&cHtL~X#yOC;L*a>ht%0sL>xuaTD*3MW4pKpnS^Juaf4w7G2G zQMvA4HdQrFNlDZQL{^lbY7&#d8Ht(wUA#Ul$PdJ~eucJHqywG^ zO0VzoDF;peqebK{DXCauVK+IN(HEN0Y2{y^zENw7LW&j{p)FQMxb@_FhE_^!rahTs zJegq?dRTV*E=(gCpQ%>_6ii@>txbAsuhY%R&`QH>#5Bn^}!+c88$8msXh(^@0+jUSL5Ff)b)$U=j5KgQ!Q_0kk`3 zlj(Si(>C?vQ9pQ#4}K`#AsH-kIlS1aJTYFV{>bk&U3S6(GhwKG-h0B{2ivB^8H$V9 zSTAwSgO8RFis_ps%YT}f8=fZXwni~GcABgrF-Aq=ctXmattaP7k7{)O7b81qQdOd! zR^1z`5;tVM9-&l!cEkE}8&-Akz??H?_SJ67PwkGB1-rvufBWWR^Sqt4KZ9kn+Zhbo z7wx{y%m7v`lqMdvjDoxmGSzI>f~8$hC$NBp2T`ZBRja~=iDah|87A_ZeDY^*KVxru zO=Sk7;0NtVQuFcm5V5BjGGo-xQo3W6QlUuVtSIp+S7BtrV5r1ZX8VyCT^${bAOm5CJ$8cS=-UEhgx~UKRyA<+3!kg~(RlK-U_Fp( zkU3F5a9LhI6_pX?x42Q1|7Wjx8Ps;&IU{~Ub5xF}pb8k9gi6k`Fhr3`c3Fg>0d1s` zT^2!Xpw6hoT57#WI1Cd@ZyBpLk|~>Cp;VhdRZFR}@=D=S;v|;=5{fj1e=ED9#At@m zzZGr~gZ6O9t{tL5uMUP+{S$EJ$hy5#a-(Sf>#_s6`#R@st_rxu_IbPivAx#Hw){8v z0EVQL(*a`pFbVx$v%gj&{IHS$5MO|n1{a;PGvCK<&azYXhKbP`dPhDUd@kDj+{Nei zVA%QCbgPYbA7;KV=XwcQ%85TQ;o+N(s_R?Uxs(I>YZ7X|LC`u*w}{L<{&T&5BapyfB{O_YaHJdx?mLr8E6A zUo62Aymw=y@>3bxUkE-Trhg3Y8UGFwc#f_4NGJa@bP>{$AiKe?AWksoW9;6kTbv#oC@GzzHbtwBT8e5fPHJ zxt5;g+F)TqK#CUk2JL45^iwH{L?8v@7f(O6AuOiTJZ~4GHPW(jH#!%lcV+3Akcw~2 zG9FHD{#fu2!kBIrg9)s>(PF8G0j!1m0IZbnbc^gh=6)SPwA1lv!-e(95wgTw*cfyn zUDpL+ou33cKi$k8pS>o*dXro%#*!1Su)23ay7!!%Hm=>Vur@H+Flso+6!`TSQoZH# z8W;!Lx2+$YaH3HdtGr!c>n`1@|{SfXUd z64s6-5|Y-oPlm%kug=NF=$`#(Yyiui5-pZnnm~P=I{v zd1FYn^d$1c+brJ8MzYqQ9W3Nw{qded(t7U7M!eRadY&sa`{QMBr1eN9tkH6RR-({f z3?M>yQXArJOD&ZniY@1`ai<=Ix4NTv@V}+Y005zi>2Pm4-k~9 z|NO!|@bCrDZk!dRwI0YrSH>~U5$L>UmuU)M{N1U<)Bvu6tSGI0)DB>Z+8?!LQf&V{ zyAp<6WJRgyKZkr!3E2FCUuJSofbjEtfxfb#{$71Dn#`qQ5P)I^V+u7rjIu^ z>(A%O{r%|McBb3+JVa6to7vUHr{?A5@0xkNx*#?;5(Mt_xzp`7Ato4XA{Rq2@(em( zz;1-8TT71&y1ii$35~y#Z32viv-z{B7U;+9_7=D_x{7o1i%RBopfcM4DKo6+JU5EB+aM#bs%NdD2kq z`#YR&J)92K883^%vkWex%odzo5NEbvG|X_pbE|A(Ke&*YEuhfYv4nJk3&~*e@OYnt zx6MfZGNowdyqqAJl%%KjmP_su0&! zE3A#&(~UniZ*@L!+4pqzS>gn%<2bAD>TWkkpXFKH*?9&G2#auSfG+qR^x@S&+x`0Auix5C>d@c6SlhKvMnn11RJxRpH!4bGPW7AO2Ao#l;2eNcxH;gHAaYl(%xpn3LYhv_ z^@sA_s=c+S^I_rW4}E6Jk+@C3ICl({4+D1rgqbZ+T*7I7pMz&v?nW*^m&ud_D#!Zi<8mZEbK&~pUh%8dn{Hwc7fI@SptYt<6lr`vxCPw9WC)d+bt>- zPXeHigBgYNk%MeNrH$-5MdEuLpjc-Eb#XAM)6 zof~8AjgmY|STGCr6^9$p<9|Pzi>hAYYvgA|E{$Sdk#YRG7`!9#5Bu;3$L0f~m{03? zh0Qpa4-mXX@W6TrJ|K#@iP&voBOf4ni^;|d9F~Gd5}j+doq9X=pA~~nNBVnqA7rb~ z>*K8XvCwCMSyhA-t9_u5^{DCG)gvYe+&WkrgUz<|dg}{zxve-s$iVC9DT6R8N`(eg zTI;__;~DamH47o910103A84jDe^-tF3xUZjAbW)Mwx`nDH{a*_TWsCKS&f<@f}p55 zj!m8tD(zZS7mqi)){%Z>S1nc5u!Z{dq~C70z>VOn*K3u~6p_tB#|O~RS|ux7(Mf`e zcYN)#*SQ!D=q?)WKlTQL&ZX;%5Qs(tHHzk^R{OMBa+|;hVEjJyuCuddKWkp=2Zp_D z*zEoWe|y7Ex_R!$AZwoVu7=siUblTd;P+$m{(1A_cjwUyaI)7`G(YOEg~H&nd3}*J z>1}?wjEdO^$eIIQ9H!61-eu?1wncFXrLY6|d>Ao39vS}B;oGRc>bEbih6YLU69jo> zm->q^`im>Yn1FI<0#xb*AM{$CvkrCLd8;X=mb@U6nfUXu=_CQdjTYoW zf^A{Cj@fL?{v%Ks9?~;i$D`p_5^^jjyMECCzSEo1IcJ_E)8AtG5#Mj+H>2m_jkoAg@a-|d2D;f|%!yU6;k;125 z-hg5-VW{AAj+t~+n;y-85_4;mbWac32|PWTKV!n(+-fr#l{WgGrj*WXOro2(V4o;O~*WlfQ&DOlL*}}!zAv)CHx_ljW{rhp%^tY z6|=R&zRTIdAbx$T#Vquk=XWpFQ2*J5vJF__qzkXG4i2 zo{l1{L|?>4AR$0AL%-sfH+XErJmDhDY{A-4;yB7|;c$?^{bBcTM{7xK@kpTX$B2q( ze#;?Z8H9i_Z0Mh2MIN%sY3Cv!7V85&zalMCsNs)A2-JIkEl4q2kcgA&=Z{az3U2Q!BEC643fK|2Fx!m+ zus{{0iOj|5!4vd8H84M#Co_a(%7ZPFq^tqjh7;&n9!z7BAP%;xlD^IE^9LkOdWMMm zSe%2W)UW33jisX?F}TiDU?%!FyP&kXe>Eotf%@4KiyIFdGqVBZp+Z3-*)S2KxLyes zP%~mF^Jyu82`<|IhI7XpaE2K%H7?FZbA5{EERRW&X91I$6Q3tOb8xxQOa|+i38i{4ZW&g za$MY;)Lb1L1WCr=au4w~(R3;?EmSfhPe@a8J+)U!!7lH|RSHLf2~CY8-=(!)MT8@4 zO15=(F}+VKDpb)xl%#3w^ZyPS#xs&i4j$e;%DA(M$79v(+jG7_TX$F7-2;Z$nMk|y z+4$)`_c2yzNcng_`#QR};XpVJRwIm8aaNSvSrb`NGP@kFWLA{QmbQ;T**doudQkK6 z`=FsoT4nmf(?}T(J&P;Mic--{lY`BaYC6}KI#9(j7<$7Pqz#yop&P~^Lzxw&nvVAM z`{viW+NeAkmb9)m-LnkW$8CqxeeJ#lUSD=;(F|memilHbt>JnA=Z;wP`hD|;>`5CM zPZp*^TWy0U0@o`(zrVkpEFq;uz8GrmqH{f3oIlNVOL`|%@|E9xUe}KH{>)oyec9q| zkrgF(OUbM#6+7R!2$|B4z}N&4N@TVGO+J6kQ3LqV@Iic-qk;Be_7x&Lz}L7ASLuC{ zE7BkFNwYE=KEQdZpD(mHOs-Ce%R{jTCuJMplRM$_9QA=yIEQ@dAVyx|BNACDuzu`3 zDUFKp!^*omC2)7~NLA$N06Ce3;K5vs)cCYddekI=Q|-plSm z6jORU_n=ttM=CXz zbY~{yZ4wgTDY6{RdwuRt77oW77eDG>b~d<)&#+x^$1P-S3M%(1A)ms&6`3ti$jH<< zpAToNCVfKw6$-857+rF)qJ($oLBP)p9`hSbkS^zwo7{OIpkDHR0K7~Z?s{hz&p0%J zKZm&)z~D)DNSQb!gqV9&#{q+cLIu~$&RHtvhqAt)mb!qdilfqr$DUS%Ild_C5ehxA zGZcCVGFw0|ho}2-$4I{%EXxN<@x9JsRSzuhe%dhcX*zhp`mxsH$wH64;I4(W~~P$o{lK#p_RA+;BHcklDf(x7Ih`H4R#v>t(j0juQOaaCV9O zP7MV@62_6+71mzHQBmo@Zo)z$o?`#`bUR|kD$S|tBm&PCco@2S2s{sd5!NZh zIuXDr1WVw&bFtx9*diD0e+><8#lJ2Kr;~xH9_{$nV?dxj>(N?3%}tC1)f|YqJeJXX z&DdS_;lf0_4gd`uWEvqHH&wwtc!UXJ2%iva>k}qhAa2Ghr1@sqDW76caLfZ(ytHuc9sB!wyeiz~P9{cee?FP|U-x#3r5lQ6165x!mDP3X&hVPX zIFAslf$H_(oKg)QM5x9dHNmPbV@mF=+#yb2uMVsSZsYAZD@q>C&Yr`M6^hNDTthEY z?~^^<@Tdskwzb8D;o67q00H!L&kGxYX0i_N}1ULNd`zR>bX1Z(}~3G1QSrX+Yi*O zi`0{Kj%j*>OpYVHtfoa0IybF6tPdqPZ=v&KP0Hg|auieP!s$(2mo(@O9}27z9BCs)JMPxcNxbK2|=dmsDF%i=bWo6~N)-!Xh5O3`P!GJXR6%g#Cj z{mOas!rVhI;%?iiAGzCZy9o}z*S-F4_CCx&7qYSUJNES$dC@_SuVH8}I>YPE(An^_^uiS>3rX%A^N;pIF{C}Rb#GQ{p9$1(kh+^K%&{q&ta&#L-0juhydvy@l zoP|DEg4@h5zU(`fTF{)_K;otyzrxY;Z8rOMpX;OQ;Q>#q`+L2AK6D-)o|c%@I$u_Q zZkHEHnU!7{N6kiW7;w!>Z=I(%(YuY4@Fsq@VIJOycfP4uZ>f~|(=&{2S9CW>{Rm{z z8qo@P6TDJcQCjcWx><7np82t+rNx?-C9G*_v8JVqHEnyg&iwA*GapWRq(X9YG9~UA zT*X;YTJPC9-@9kepaGAm6mH9`D7igLvZA!xH1BWHGfi+i&5DvCwI!yueyxqYU{= z4v`;>(8Bl2I4%v5_3?;>J480IfHY>QEuVbI8T^7HA^amD>_~{xNC-O;qBIi1j)a3` z4p)}gqZ;hRM(8iJJ%#`95q2Aj(&1zCGfLTTM_k%%=p-M4E4vM4=x$GG`3Pw^8*^o6 zTE^>~>OcNjb;vd`wY6(NJ@1Sbg`ckTuP&cl#jV;ha8(6OvI^9C8uaGp=e-LGr^^Oc zmzUk&jVc`dR9fw`=2drC{ssBMPo0mSvLWOIy3`U?+es2+p29$bZtr^gL$Des+>bsO z1-z?^E!~1QuA3JvEy!Jb%<$cQR;mJ)?7uFJ20zG7uI#%}`IkYv%Zh*W2(dqf?n|Ql zi~CaS{uH?{CFNh-m!$hs?7ozie{o+beUqT?f);b}T~n0y#7CLeA`izT)WzQCZ$3`x>}M@=`@ z-C5yokl8}L-SWQmoR6FHhuQpWhH1t}_v4yd$XmtRH(*br<%o;qVf62-MQ+46Tmg`e z(+G>W!dBueC9a^YCLwFG`^5ueu4~|s9~nE|T#~JLhN}q8MV#5fTMinM?9xVzMAgoC zy29~G(v4q|9KS?@3Il9ZGAOS+f~%%KnvQ1=8v;Of`og@UoW9b9T9+2`R3@ck&O)9_ zWx7s{>$R}f{aSs~72qJ6)7J;s3%4x*&_FN0pOREp$(iM9mZ)B=bY>p(HpEaamb74z zk1m!yvfHI)PieiuEPnoUznow!r1{0S0YtoO&5=U@;c)(uZ`cKF*_5tjQ?g}Kx|U7J zmQBOdm|eiQAH>qU#${@=_sUZCUTL%ULTSHsvd~lQsqm;!1%oP?C9ySh zBlfHl=@Lr42Fd{;o`7p9d77n5jTp>RCQdY^O!#a`oM=kPjvqK_&$`rDMr zQaO(P)BO7i0{}x;&%{Bdf0?Wc3~-l+JaLDdL2rqQI(?~Oly>YZU{mw}qJbqb%!*Ro zjWETrKAFw_*q=%8SF*mC(W%%jX3yGX9}3An6t8dPSM#f04VJ@2PEemJPT{p zynXX^w8+iXsijER{|Wm@q1`m&t@(CX+^^=uN_q-bur1=-?vEY~gh- z^wjD!Qa8JpOzml$)+RO%sCdn_?Y#L)hs!b}#k$2StI|p9Dm(C_7tQIIH}Y_{4^z9L zmbY*66^f9cPw4G@_J9zkbPv5pZw>yuxusT!1VP*Rh(v-On#-9}A%=-8XGL{^hmIsc zefD@CYLf(pe@+62e@+-*Itd*9Ibqb0ByjlWgz;Px^8PjZo4tP%a*-0|f_FWI07`Qa zWwucBqxbq|j!{X9AW688nJpCG%mAMW0etc|^Z10y{bn8?GV+>lX6Vi&dad$>P0&RL zMzM9R9GcdaLvf4kf0VDj?%AxURw*Cf$(k}IK|KpYWEHmd1eG-29g8}Q)$NE1xk{d1R}R!mq`O_&1ul{9c4av+ zK{>J7c#`}4hK>rJOyOwc62?nNgrkv57%w3ajz%sK{Ha2?gUX*Os`GP2M?G9!!upX! zD7U9PAj0M9SU-|Tm#dS!oTbavu?J>C<{m=EuynQo%niFo#ErB4QJCFXxns?M>x z-$}>fbmEHB35(N-D^4dYPA9H7ov=7fVRTIDI88}H5r&4;vACR&xNI0)7MGJWeXXlp zWJSqcLyf;Rdu*RYQ3^S2&c;` z3|Gc_Ir_GMkZN>L+U3{eGF^+&pZOSKH$FU!9v7etZb8HcK_8*U)sr|GK7|AVD)B0T zE0q-`b_;>4G%HH%7NW0ALS-tkTL@eQSy5uQ5V#7nqV!5PkjjdZyMfZIC{D} z`}WPr@7YPGcTR5RDx{3zgLa?X&=m^ozg}H@?D7*Z?w8$W=VD-Pz<>{$pPLsKO>+l^ zdT`OZHkSwvece32G}k~lht1AMejKrg*+ZK0x9smFzD~#$%h3wu=&#Qwli9<%Ikx1x zSv#Vn5jT8ENZ~fAv8Ytbxk5!=g2x$EROEtic*mlCbfJpYU3cMbnAt*Qzos3HUymTJ zTR(_|bZ5NK%Hwa}TwI->wEJ1_jGSH|gJ!$WFy}F0;vy74E5A3m)(S=F?^x4tG}q+7 z+}_Q`x};%WL}$g~xr!Z@La}(RV)Dud@WA(tMg`=rl`+`~Q8XR>Ir&BbdzYi--G#k0 zlOL~J$@EHT9~hOQ(x8Zc)>pCd{-Dx^)++d3Y;G+qwU%T>$wJ~S z2-=;Q9|U!Hm2h~9)v8K3I&j4fWy-_|91G4(v36LMB2o|rHzqr#{x@Aw- zeZJN5Fv6_uQm%7|Vr`dlokLP~4oO|-kd&Q6QgjZv8BMPi405f=m431q&SrKaY+XJr zqhd;3^tY5XOKE{B3>PA^1sZ<42~oOmk)hDtzutIN%rfeK%ZbatOi?!VsAe^U8@5qS zObWk3*8v-eUW7bPryNIs<|jZ#^8E&TwUES2f~w)LeSSG)Sq!P9`)<~`IPJHa16xUK zALw1cui3v=T0vw*)V<&eP7S1;W#^E#(l1DH5SsqZ?uis#Csu^PG~nrS?^U!u>Up07 zH0hw+2anK~GN^ot7L41;bd0mb+xsFPZPG_M(qupPZNBm%`1FjCYgRCf-D`DcC<;u&>in6vxQd0GJMQ7gNXrmeW@Nb}~091>T=e_xkVwQP|ujXPV~|=SlK>d)D=u z8xl2f_kWa|DQV&yVmca+>+#S~m%FanZzYY5gm>nA;XnR)W?l(dN^?3^{EEb8Hmcth z;V4B?hG$NN!44{Q<;-^9@myj3 zl%9Y4=Kbep_o_X3Xa1sTp+i_TDIVZwSKaPA_y>YSTdnrRJNl!~{@(|hV|Yh@^olZz z0U3usa`{FXoaHU9JzS|MR} zdbhQW5&jOF+C2T`IGYsBdWWnDdbem|cLhZ?#1L$_Cw@<&AOFKDE2&?IGUR z46u!8M$@Owx10?+Uzi`p8M)9;pY^UTTAE>Qwg1IGQ6ksN4701YuKJj`m48G=yWMS{ zVm4Q&MpT?p2hPqk>)qlvV7ZJSij_7Ys@-lhg&WP65Bk#<<~E)V)=4r&Q`hYF7E&mg zJLoo9q##WbV&Nh9mx({Be3p}k95NbBzwvE~eK`V1>aNuADF@M{s7KIe&bsN`uQEm6 zOg0>ZUfD2yo3i2fZOVr6+msXrk4@BRLBviA#_3Oze5C7Q;E{@TcBoD%ojMIAkPWs3 z6m?b`3R7vExI>{bTX2RV&1^w0s(UR6LHec~G5shlJ2J}nOK*-oLg$dSQe>#!Y9 z!{6Z|MHKhd$>t>+hSik@o7D8xu)2}}Nr_&|M#vKo(zd{g*Rh>lcMB2{z#4416TFgH zQQA_~*2Pgc7QhAf7&rZRK6`8ySv8G9^LBE7k5%MjGxF7dsaM|lg)0r*^&jy14+55Z z?`Ne6thY@6KYQ=iowky-3tz{-A{V*n_hOGAsY)e{zQP7#dfCPsaMCO9g$B0egm+Nsm2o;hbEE04JHsH*b2>1u(_T!(!^$pKV6 zfQn*8f;0ctqj#-J+OBeCXAa0&PPy627t8tV2XT0Nk0FT?}m@YU{ZB0r>4PKuYN^r1u385)E#+cyV% zNNkDESv~TxeA&_kF~;ualBL@{XUE{vc=@%TKieq*&U(9IW6ScvT`mr`a~v26*zcqGvi~SZbO| zl^VlR)0Cy$O6k_Q5*Ctej8SkrRpv26Cz-J&MKsj>bRwVT^B;5zwg(U3`+sgnuat7T z&S)1|W=zQhZ@j79n9?#zvZD0bj~Cxg<+l?bO*_Hpea<@P5?>VrZNsL#jiLofsASSZ zdqv22C~@rv9CQthrQ$|szX}Rq;GqkxMbnXO_ ze+_w2Q4S}VSx4AwF*bhU{rEIwIoyQq#HikfJ^p2LW)y2u@h| zlezXZ$BE4QlCqgCEnHSymzV%y+M0an(t;esL@^U6d7glI9#E$*ETca8IGT+2WQSR! zW?;hBO4i%pX-0d`x6#Y3JsOwJ;7znIk(#iCy9~Yw!bBG#UZZYXYKZ*!;Mtpte(&z$ zGCM!dF5BG?mqQY$0rAjk4x8ESRrB|DKWm;3di`6F$5C4rBQQ!nbKUITWF(c_76X=~ z^n0(>&Mxi-!`^jwzyiO05PAy_4la8AcJYD4-@okLU9}+DNoPp42OB^3sRQm;Hw$b= zZ2#Ua_YPXtb}`s8RwfMEzUyugcCLQUnirSd_Q&>h`^Fh6+ig}hz?ZLjA3i`BIAV zwXGT0U+FzqJ%dl(>udMx#w4a|zkceriY7n|?&fdp>~8a;AgFsCJvPzJ_WkUhrlwJd zfBF16pRQ=!Q7oKI9%tXC^d_vO$NXuunm8S@SEI)`3^_)%aB7-C@k;=|Jm&L@uU5b) zPCERG8XP7ff=D zwt^U^!SOk*u~Q6%afBYAQ1liU|*7|DsCkFBjvC0bp{~G&dzDB7wlLXIVh_8KG5_|18YZS z5E-qOUnk@H_aBNCwV~1rb%WC2QHlL4bR(p&Ggu-)BGdu9?O}mR8e=J9QfTCaIsgSvGNQg}+K)nYX^e8t)S}-pWq2HhY z_1%u=32&p0DlRtz#Q3WX;O~=o6BjC)? zP@~R;(qrh5;`Cw3zOjTz0JSsLX(QRfNO9jm={a(6x_>cy}58IzNMc4k*d*N zP;bMcx0UtmXdcUhVOVM)4}jFXhOBuFLGyal=ls{?24GEC2%4~3!_g(Jv_NOZ0mZ_E zf^T)e+JgXw4m5O429+-7W0d}0M-6wp?P#J1z7_|Gkn)0r7DA8+ZG1p1avT)o&|VOJ z84A>oJD1mW@O7L|_Hgl4=~Y9yl~blcaEd>Srsw(PczOQAl5-c{)$s_ZzX?r%PLlA9 zWoD+$MSGe*vwkN~AzCr)?`=1SpP5DpglQb5OkshEwa;FT=FdkYTLqO8p8h3<-tH6;^G#40&-eMjh{oAK)rWMiIC8etlN2*+);$UFAD z!ehvi#m=Fyd>Ut6D13lr_iDPdq^3)~nl3G==~Azzqd9l&vTS1e`&U~84voPKaU@5W z)2hapR`ua){_w~3?9UvyTgPSCmmh4mTdfwqF1Kk!fd-*aoURmTFs8FHq>CW)1^QHf z?4ZwEJ|uTn#Jek!yDQ?|70KNd@$QOXcRfsIi`?4;Sn5Z>m&=5^%$rL~JMLFYFm~^8 z1RD8g-}~1Fs~7OSe@DsLPzw>M5?&2I<(A-u7dQ54-u;uP0fLc#m{+81-F2i2wR51E zeroiZ1}EdZRrpAITfrvxBTWj|7*x8jEbKHuY&?zUMj(k+!2Acm$*lBcs~Y^UqE`M$ zNyG?|kHQ()a6Vd=1calD)qGI|rKjZs2gl=ho3UZXo`eMw$C9{{vj7ypsT|_c6Se;A zSFDmNmgz}?4S_Mfm^h!TYb)Xby{Kol!TNO^m-w1E^M&GA515Mp1mEMVxmwPez=rjv z!`bR#kG`(*Y?0fLZQ~JGksfCkRhugf!KnB+`{V?tf$jI=D~2iI49Ms)`Z&uM?dS2b z{jb&d1zdghENu52P^QUj$+*zS6c!Gr+fW`3ir<*eYUbeGqBN#&`-f?8kO2^R$L$4; zeNgDc-37A+uzL?^&cW?5K`NIlljcB@=733aAW3t;q&Y}<%=}pMl%>Ea08xGM+kog@l7Qr;qkH2N*4!zP-z19SHzS5HW#?LNPBC@gE9|T(cJ{^Mx}CfMPFrWDsdO&+WNZ2U_hmb3<-% zKBn2iT7X}7pN{MJS3(A&b_VKM%;qpc&1VQqg9uPkhcFVr?d?Sw5Z7HI3>JLGf|&9S zBUu|P=lS%@^6TJX0oV$y7zN#4 z(-AY~APPf%U{h7RZKd%8Bq$ZH7LY5doKU8PGP4g(i1c}TRwf)%-w7?Soc3*M$q~GB zZ{b>mz3q~M(dzAt=eZluX+9jIoYcjw&3Kp%Sa@jcXmM*;qrIgqPUHQaAL7o^Ru+m% zp6?y1Onf(>X>!Wx{q%-L^^&yd)cjb5srcnrd1XUzIA1_S(Y_V5%@|Acxj{j&z)=4K zp#=x9VKvY37~^m-d11w7sA&+dHf#!i+jg`%=1x0DX$%hw-^_aF0z2)Y%O zYBehJ1;l$f7N#JmO5VPoA+@Xg%ECQi_m+Q<2}!zM!_C&Dk+#zj2S{gA63+fr{!|fo zVBKUut2C&pp+ElewSE=c2xkj(vpz3|BuMx-1PSe0y6%}K#7)7~8l+0%#R9aRPzh@V zvjbt5chN5*aj>yMB31GLh=YI*54)nKZez56)!d}kdAjSc|hsV1oK&)`kLOcp7 zxGEH|ZQsVvmt*IUX>|sn=BPl96@XbKHdCZq-VSlnqI-i2f|G&C8~>TN%XaMrstSYLrLR7x-2&c=X|<`<<2 zEKJ#=kfMj|^l?HKT~ZmGqgf`AR*xWLITx1R*U`c=OTCwT$_iu^#zDxxTYmjvIkfD& z?QqMAz}pzu-Mlo4R3*|Fro7fb_4@TV+a|zuR4mowngzik52w3eK@iS|SD;AQoGPtJ zEFFegNUtHQ$3jq#xlfY#Gx=e~?nhRXb=ZI=IuRvoiUn|kd-pP*JXge~sMlT>FQ`nz z8mvr5L6eo~K|^Il$-y9;iguCH0mH^L)euxeQJM@WxK}W$NpI8PxJn~i`N%8cr?@FD zDJfaiq@@Ll30(k$ZoFvTTR!E(oJa|201^!C&;%`A{&@bQGg*xv+1_C{3B5b{Hu|wB zHm=(yFZsN9Oo_*wB!J=U$jE_O`tjnzslvy9vKh)~usw_yXj!#r5nlpE$$1J;N*9&9|Gm{EOa* zXoT`5FsvK`N0Ra4cD4BGr-O$8JyOPt{yIjcuukEC+NJy=X27jk zUK|zAN?@X$L=yRsy-_J-Z{$PvMrFwRCgh|dk3A^tK1^o!b|pHE-42lm<*SYO2tGfx z0Ts>8?{8+SUuQone)d=xkjttY;Zs9XBz+znpBfs^d}`b-!_>RD$_;jx)HGQBm~4vL z6_327s9Ii5g;-h$Xu=Y=++LxPkxC`kf{LT>o!UYo)~Wx2&IquoDl@vf3>ig9E=L~# z7yJXL-LCGkI3mLb?hA?5F5-7G|6{7$F+#RJgfau&o^S67kS4$Vk!LU}&0vxhB@u-U z3l;_$Q(AtCa#Uf-MP~Riez-W)U@PG??A#Ut(CT^gM?P4toG(SS6{7}& zx<>-%AYFp#2~yUw3eT1}NZH(#QnWdYOHrKPG2XVj0F~f-j1g5ow#IXUb{&AA3#G|B zY%m(8Aq+-ggQby1k*&mDuu`hw1L!%=mEO~nJ8IgG6(-yD@!K`ePC-No6!+^vC_9Jm z2J_tw$#*k58Uj1&+&vIf>W$!FikwY_KKeGFKh5UPTP+3a8B1_MC&MAz*Gi? zja9%@&8BwyPC#s?wMvIP=*VYN^hlAmCG@EPyWY&oXqMtXTas9Jq0<=4x8%Muv6RRH z7AgbSr|xr?v$aVz;Zs)T<#~8+UlRfH^J_O_Qd0C0|17Q1vZ@7vrV_tjRosS&!p?KKC zLrbVY?n}abu^h|lVY!;;2aa9&z0#SHN+4U1@(cn-%ze@^)a}Qu$57SB#$TrLI|xBB z$TRp4@rD-}28~G~j6;egj81`pW2o7$`WO2rQ8CL-y*9w?quL|!pwl(#wtj3CQ8 z2aE`mhoid-?h!~RyBU+3QHtV70*NBt)=`}B7ix|Q^;xS_PIkn^Ba*};V&V}cqR;FZ z8n9>R4~O!u{(fyx>^40Zg5$MdkHR1%_6SOzmkw#gQt5<2UgMBKogu*e&?B-AGxo0U z9v!&=feVH@JIzvoNd&N^cY{rhuO2F}Cz^0J@yBskIDmf4zdBGppL^)TYnjq@V1v`5 z$SNp3fqkwX7~V)FY|QK=@D@-@EwH)?N)(1;I0T9sBVr62okYdWb@saUrjc5ah_xaS zXhr6h)DH_^L-LAR4F*V5M5K9lA<&r)k8! zZMm*#nU-`Q`T2n3$e^|XcJsP2&%;V3;}Y@d9;N<83SZ$c7=*qcu01NP0hT2rjr(P} zrs<9(d@xG+ph^>Zy29RB_XG^(n&D=|QB}qLN(125nkC|vov$Jg$`?@WdG5}SN1=oU zjvs#nBA}L5qr| zXs^h-3QP2^L*yW~MjSH!SJ2^hr{@)2TLS`0+>A>^^)&u&$sul$_IUXfF-FFee0>^x znl#W0efCn>oPd6mtsyGQ?mg^0#8P=EG0p72AEE<4*HnCjGQlmr*}FW59tB=Ra3yE9 z0G&SfVxc96?G##ah8fh0K1=p20n=zL)d~f`;yuZr2{6tq(c2ae_6t|ZZZREhxKj+@ z_`9HM0BR#GRU;~NN?~G;a#CqR$+Kb3^EN9=9C>zQm9Y%~9$C$olN{}JL+Sn>fo1^X zzjvhT>;dFmOvdbh z#w=nW;-dm%=p&*OG1=kD=hi8rvV(z!qnn`1`Zvp(EZi*2UJyJaj3~Ra-Iuh*?}FMP z7TyJCZ{FEKUp}~`S?}y?@BC};;I()7+B=vr=d7$iwYJAux%T%hec=6V<@)LxnyT?mZ4CA6DI)nB{uWdNFDhl4|Lv+h-Ms{JY^X!|Z@T!{kF z@^#DLh`ou>_uuj#x1({bP)ns3>_+Uh+7}c#2t@6d`S?%EefeH$LZn;dj!ho_8#5R_*cTpLKnE)XKDxIb$Z`1{jtMv>R11WEjGb1x`SQY`6SJAv z6mI)0?H~w@s+sX#r4>!%> zUBAumIx1=z)q!PHGr7}2$MA?@rr`S2;lkJY`K}_-&-&-lhu+zyM$QlhA@2x(w)RDk zfj1xIRhtyf|MXjhpuMdQA!Xm)bz8^KA?&PJg{{?`f~p*~)}L{rH`BPf+h~`k5{vux ziV#d#qH`RcQdv==lRQM+T~VU7an#<#-ph$Sj3A~SOa{>|wh+XhwuzznN9<&HuY8<> zPQZoSvzxitnw&wvK9PW)B>(<0wgjxX7wRHQ`_`uH)dwkCPwgKbHCV>S;3~nX89^Z3$?v4q8%4$mbP$ z5fmNTbygsnf8_Ac_UXssluv@j+Aoz`{WI@duUdpn7iUFj>+1fa@+e(9{VG<5WjoL1 z!2f61hNP@`@Y8@v-Kcc-W?`G1Ki-ahP~7A-!t1)?Mz9eU)=9V`LItJTgupT8a1w~Y zI`TxInQeqc4luZiv!dh)aU)E9d%*(p&Ccca*dP^KfrhmBmb;3xqI3+Aqu$wxZ-0Nt z!Af=v&8w(p?{43tHG-{?WJRe)_tw)f9Q=l5u&!^1ltU&6IGaRHxmseSB^eV<9z8rb zyX;{6{4&W0I|AZW$Ng2(@U9ptrZ9~NRb9VQ@6;l)DT7auFBDQfhfY_fan!f?Q!-YV zVrZA*SYcr0ILO8^w)=28ejdMnT#Vm8jTTGTcg}&#;oH#efhzJ+AV|dyXv)O0mpr1z z{KN)zeT(F{bA%QpBeW>SNGlnkMR9}{mH6B(-q@nRp!?)Ppu3TGX+Wlr`S*izYN!g} zzPrl`M)oy6cNVI}5=IGPAnjWaN6jCpc%`Gohp8g@n7zv@J0-0_k()s!!XU5M0Z##r=4G{nxb(EN zWbhru!FQAlzN0w!4kkHwVR)eeYMk`tRP6PywA8}0-UFPsi8qQh zIR$=kd5`Ra5OA1&2}-{#=q~tNK}4A1$tV*EyzDh-Hb%>@bcvue_kBD>fTJvuOxqjD zcILQ7=XMx5*O&dK_E$3;UN^*SQRH7N*ztN2>q^T^MVd1e>3|%WX=#7^~C;2!UpZrjCTOre=tyj!3q!Gda!4s_h1j z2Re}h%`XMw9MNo9)1f#=G+WkmNco2Q`C|NNrJ+*w(ok& zl9$JV-jdnpG#f;;G>B+6h-hgL(QFXWU=Uf(f7}8>qTcz!^Bl@~<_ZH5$yW#5^*|M$ zfuv-IoMbwbgTp`^ErB?ifjAm~IDfjCg?Xic3S0s1gqp3eu26&0*Usj<`S{M- zeLxiNywRM`XWw>yV#_;cZ<_sn?^AZ(9JI4m^Sb$gazA3=fzDO)Lw3>c4q0$8#m(Me zaNhgGKcxJ_P4D*d_d)k!z`wZd(rsn#M@*w&fF9p=+x-idr{QD!if+3n??;QA!qK{$ z==L%uPh5H~61RL9evB0Q$8`4a$Gu~j@NM)FTmVd%YXnct@e^MH$ltEH)eF_5;YL1x z$RC^2$KMKXTu#n_G2r15$MJlb&gK--q5H^BAWF|N6QY5D^74pyy4g5H$yLvhu+?hq zKmt-fzgpp`x z!|)4JhF`p*8CBlZM-9Bmd_fF+lKFxd_%!o{6Gr|w%>1Ll%SFK+FSod$SHcXzfj*XD z3k@G21`d#YF>z2d6bC0nh=&5`aMoK+^>;Jd^-px?s8i62N|ctHLR| z4t%<-K{G4{lG6t72<{sCb~;MD%hwV<0S^>(hy6`T+mDZ7(1p$R68K7j#(?!w#XS3( z{Uz;)><6e<#Did;BdVCgqZ&{mpU$n$uSUG7za`TWBnPdE$q_j79 znI+`9BX%G=!x-sHV%V3&urG;lbf;qwJojsy!=(d}b0rw*o?tlph*5Iyvf9EZ$}iZN zjJ{am%ePpH{f5PUBgKBhVn6!VE=uIL>+6wiVeu7%%GfsqP4ZtZtul6bH!1mQ^}bE_ zW#}k*8OJj3jbZZuBAOO!6!_dvm+U+{znZx4DO$P-x|q)vi~G_%OWm(w-LGM%Cwa8( zJ=y$Z%Hd#19>c^hzRsM}8qikq(U)HFhW+1-5t>iKCIw?e6bZv71%zucWo4HUgByt` zE1Liem;e?V!{LvY!lTJKV~8J;tng-XZWhhu;9v9B7!9&+r=f#VQaUHN-RNJ)E*{ct z2aVemjx+X7tK{$*rj~UK63o46=>_`)m86PyY-g-xQ7MBujqnj7PUB9%Og?a`rHryvGM2xKFIvkz`%Ur~6kZQEGp5DZFockiGo&uG1lY5-36YpDqt~ zi+^slFPgt+!|pYkouH@PR@Uxx+84v@qIcEn^WuCm3Louwmh1wOCr|9e+Fk!G)*P25Zi6 zD~yTwIu&`%xcLcVL6cZShus)Y2NXwGOX!pz6@Dj{Lq%;5l`wc|acXw`EXQ)7d1aat zA5E;kNkD(&6orL$@PM?j+~!i%JYt4)cb$T27TuJHyMz&U2^=?@N*0W6!HbM)aLT-T z$4F~F`ZAlka6tD?S9HuvXKx0#SIxm?)^FZ;L_>5cyYC+I$spk*6?U$KqYYvl$J3L~ z%F`$17&mD{NF*sIluH{v4X?YSVwl*Mb<1L3@+nO^QeQYzJ;Hwx31fN&i=^foze8mZq$F}8)t8t!(sE{x2$#7 zZ#sU9cYPg%E+?$<4>@ra%3uzvMeqLk(JRLbiq%j>C>*Hf0)Qz@^fEU%|hUQbzG zPo=z`vb>H02x(hVwx_1B=ugIgr3@HJ2{1CE#N=D^V{B!BTpdc*%%lyoD(@HOU4&%U zqucrH%RFB!iqxEGBu@O4WvrBQuaQ-%2BH9S5E@1R*LktjQSo|B?kMFPt7)W9%Acfc zjY4Lvo^h^n)*@Le>jl!N(wI||9RA3APmpx7F8%Z`oV{r^hs~@zY+q*sM=X)>C?;}v ziQx!W^FPOb=1u3I578RwH^8)hrwg~%mp|wNj86Zii}0t*p(&>ZOJjK)vUHlpB2rPx z(rFrt=)x&Wr)j*GgE)l4WUr^idvR5rPh`2ueh)1W*UhBjM77h&cL%#zuQDDwqo$?S#7 zeBsww`O=iPVk(ah2IZuwJU&U*e*jt5whM$%B!sQ3)9trE_4>aJfGXkxAj!f5gUjB~ z){`}FK3uiwZBP)q!__W^;fxxKKPkZ++RKnGm*fUQ0d!Bs?A4hfyX8MukXpqHTt$Lz zDW)$<3A#lB6ch@&rI=W&SkNuS#2OtTiEfdJ77B+kvo%-YdiNqGz)?eVFXELM1)_Tq z6W}Nm-HUjDqDXWv;sM%k&OdabY6y*6=2CNKwd}0s&T83N&7IYaRx2@= znpcA^$g{oR)u4ZgX2$L$UTC2aoep`Sg$FIPdSid=TI8XLBv%u0`y(UQBDX(E9Iu(NubH_khJ>8*hc;%9iH=4A+ zzf5M%p~Jh|(1C_g!ge3~xqJChzSMXHGf+>BV;V7URS?86P80Tlfwi_FLIRYBRPjKv zQ$!pu9Jsl;Y)-%UpWLtsvzn7z(30k}2^MjTTn<4DN`u|u$|+5 zgLzs`$6gtpunoBrDKhHOj1uO#wtPM91g@^DUgQ71Y(RIIh5$ZrEEdU0u6oXF;bMU`T$s)b z1JU*FhFPzZeQFNDq*1_1+{(NkJ6t7lVIZqLV5(E^9Bgm9F?g~~!*!4MASt+Qr;CX| zw@O?dCgz^3(CgU#3LeI*d5&p0@SbbobbNo$wSv*zWj6!wE_w(u53ZKIC%DP3!v=%t zFDw-v_l{$E#lc7&9naI_(U%3Vn$MbW%YW*5<8@n@`H|?o>ShBzMOhE^q zPVY)>pk6B@XOef55{zx2c!jDheW~V!eolL1xsC}?XfSz~17-o;sbhgG6Dq1Zsn5G| zb~%Hdp5ujYEcL*%n#fENtGQ(*>`UxjYk*!|!Kvmbs_?Keob}QK0vv5PSE#{6dV77V z?QrusAZ6u%Wn}~&^XU-sC&N^n4y;c>94|?r0qau`xJwdf!1@%#T#i#zB58K>qmX?@++LBp&HN90;_PK zh{766|e77DxC}5fzMv224>dLNw0`@E4ukiXk@137Jl>z;A5y*ab*ZAk`4e1WL zH>^Hbzj2Ju@74yg<1Z>Qe}?0)2@)o*N#RXmI7_?1EbS-o!rjrwZLYZX<9r^1a_W@h zdYnJ*_9g$y_pAKR&wC%+sCIfQ$}VxqpxfeK^+n%8C-}@7$HjiV{gW zaHX@NM6wQC#aU7M6^73sWdThhjzUHpg^iQi%tCUxhr%meBTPtf0ibY7X)L6Otx!0n zJQIdItYK{rrmM;5c{F$#@6IGy@%)Ll%gDjkC-1+`<_oI4Vikp~&I}_hRuP-3!|2y6 z=8!xopine}MTRh}fyOoJ^ zk34{&DP*@k&-1A>GxKe*s^w2he%6f_=z^rTkiGXy{Gjc3m{v)>ZpeDwP@U9D60#jO zjP;2O79pd8LQsf+iQ&o*FDqI@6Q9zCfS#%7m{;Eq#?C%FCm-iQLyF>ZANT2p<mhNQjFdHWnM5F=0Lgy%x!MX?u57eJnKmG@`M5mw(Jmm^!zX1XbNmkFnl zgp(02As}3yM?bn#%e#)Y`myggQ!31GfeOPl0%NkGB&?>fSB%8|q(7c*U_4M5pD-q- z-50#W^@+I=Hcy723~==8@%(^&4ErIF!)!bqhh=y|{wC)29f!a6Xfj@3%kCYo3F&Ct zA7#FqScJu47C!iX6$B&LJYNiXy{#f)uLj{Biu?lw7UD z!iu|5HdUuW!fQ2=OiRLRH4!MwFy*zHHpB`^`AkX!u|ine6Q-e9A*}5QQ#!rtjrxJW z+yCISbPk&qpk{hwUf{O39~Bwg;L0DM#?u_Q@&~B#R0pm+Hp+OqGgxc0v2(zVslOyc)nV@(R@fxOEtaG1m?T6~9+hac?Nx+Y z7%I_tyQj2&Ui%SuPodSHN;Ky1c90dN^7!_q4vl1cy4)K7=#arYWH72yUpwGTk`*N} z7?@FoO6#5YIL^PFtP{IVrHx)BjmlmmJmg_vv~q379YiHDrFf=LiLhn&6i2T`T1%x$?IxoOYgYIQtft&G**CeAQZXlZ)-fKY=gL1=<}VAn3!x(5u~t4=j{Zrvb@}%1bUQBJ{!F)xzukSLTd(&4s=eNJ zp8TLq@B{R&`F*^oP`X77GmE6#Uc@l7NV@Gs3^R+Q+g`*lvncu{aVks{@IfvT7@COf z26$kdOiviGP=F5jE{`}$(9 zM>c^6QLH0z$XPcz2Lg}5ue9fz3 zCz*(~f>A8M(-CV0qga5aBi0H=u>em;tQCxm08dBka2Oc@o{rey5E%iUj@XAVGQa3l zV=sXyRH4c$3B{2t9-QqC}mR&@&Ss9l*p-XWtGX2lV(WL#UZ3> zJN#-lkK+YgV-H4KZF##g)Sqo9?8*Ols6WMyc}fXewql7=sU!H@qk`KR#d;(a$(FDl zNkzh{t~mUYiiA~NF_uzA!m6%V0#YZ#Qr1?*?dx%p`GV*%Q;SGgi52^rDs@_F!2+uS zfpx!+`|-TNFAUA6v^p($VMT~il=|V|(0oe8vOYcwog(N!@^U<3l0@kjkQN5_C<*RS zEXJ$&2sYqI(!#(RrDaQ4hpV)J87W4iDJ@_|ilJmm3z(5&K%4?8?XN^y7*D2RNlY1> zrD91;S;wF_62XW0=ucpMK_yI1?*}TL6f0XWE$eGeV-S_L0U6<@N7 zkA<4gDVWiN^n4VXR`cHzzhft>1pqo%K|3~sdo5BS{tC^LeC)d_w&9D^Rx{WTyKJ?J za!tV^>^cX}0@aT%(!4k)ul4NN)X5=^yqGk7FE$G}sTyEG3s!3hXM#Z>tL6Apf#J)g zYQp(GGQZd_IC|%VuyH+*-z#yZPx;!D0(gXtMCRKd^+>eT@llF4$)RIqo)li%HZ4~L z&bO55HOs2*y)WDA&S%mEFPIKavptyZRMYmXCp&`1hN#8AXTLf)&UQa124@lJ({QuX z@YFfPX`;UWyMBxQZVWS;VJ3??X_EMKAr5@9f>1HExPq+I3@j83qV@F1_`&Ft5J9@B z9fH(TaqEB~h&)s#cP%q>E}NYj7pt-7PEAhuWD0;fkR1HovwgG=!wbrl-qV0@2aIS# zS|oiy#KnHILm%SM)m{HRbimk@0=f%)TNz30fU0HRX;QlA0G39>n%)#5#iVr&w#bv} z^Y-@6!q#@P=}-?1gA9-%&2BH3Ul${ljyM;rddim{_M}g#Z8$`^7)cH>7mW|Ce7=o& zkx2M%iTv5B2a}eDO*Ml}FO8nU#M??SQg@$_(HHFML|?SPkl--#O_R!;j&C&L7dIbI>g?*HaV1i+`KDLsdbpxite2}QYJHI<aH zRea3*uK96bO#9puyE0}Ni|t6Fd&pue+B_U-p;l?3oa$~Pi+>CPmd%%_&lxr?<0f7v@r;!C&}tS4OC``H^Sj(?wo`gH8T z88^|3G#Bk|v)yje!MS4`4&2-Bt|HDnncX)sY6s%pI78&=p@=rdQ~SO&fQXF1MEeT0 zz^Oe4ziTMraDfgu&I$*dXk%-71E8bCa||rk&2=7(8%EO~ayX-o3E5-lYZ(hp-6Gyc zv~PoO!Sjz4|HpLGO%9$KEp9UeDHwv}5Z<$>YhN-&BDkaShHZjatZx|(Cf%1P>C$`B zAAMtVv&UO?S07V8EdJh`4L{eV3;e*(?W>Co!)1Fdv7h})b^={F2(F!lx*Rh<_cc72 zH^82605H14ysgW&^_=6aB?c!+_L;1jYPYT4@!EC#4fRhIg51ulwg#dEQyvh&MZS4E zBc)c1sm8Qt5JyTLo1n(Ht*WZyuxG9JdxX@x-&u(37I)k1)5dS>Nj1vPxyPxd(?Y*x z_O3_ik5hj9bwHNha(8~7Pa#5nCA-_o+HULH8Cj9yt*k3_vD;QpLs<6J^R#SN-d3mi zJNue!5;f%B=IItJ;X3i-N4J~XB36IcrH}7a%!92x1I;K|*SVhC*G+74d*1q&;Ih3w zdl!2;0jMv`nfOMmZ|G3E?qjXJ7yA`9-kb{GLxUIN<&)ozJH=j@4m_Lh(r1;ez>V=k zCC07IZQlpa+NRRAp=IITU)*NL>W^u)6*#@Jm07N>tkf$7*TwI{viCvXj;kscY7nal zyDN#d%)SSBJ3Im_GB{jSDy&1XFfJL~h&?#pkX-)03+Gp3jGB0SjOMJbC~42wi(v1e z-`|M1w}a_E`#NoS$(G;i9^Ei-_W4Wx#!E!#GvoOI7QXtH%-lO{fca$ShmOP?Ry zHsffF1>{{<)c=^ugFb{{bh9FHvr6Y?P2^^s%E8)|%lQUv5_?n@&`xR=02KDF?&{mIL*0Cl# zT_hYIn}z6Z0aHH*eZy(P1ggIbM(Idt$PP$;%yuckTJyC4m70 zj$u0boqOc7*|$0ev1Mk@mR60-OWRz5uHrQdD*9KEp^7?rtp3DWvo=>-3d-(5$qH&1 zDaZE^DI=s>3=FEqqmm|??@|2*dr3Aspqh$8hMG~p>FZ?IFJkYjYjsUWaJNQ{OWh{K z6-A`XKm(Clg1;X`e*z(#3k-1x0&@tWbN-u-DeBYqQN%dO0A-mgY;t8h7d1~ zk<|P~zTkirR_2hCAas0(9k!F-%Ol~%*k*35AqwC@c+)NCCvVLiipbHwd%QxuraBI-%1%=W*tX!bH}lNZ}BgTr!TIX7c+^PELO%n%6o7oTu%h>IFN{b85M zhX~nHvGJe`T#0C?FZ8H``11r!U|8b{Sc3}mqR2;H?Cgi!or;#k2qTFg#blo{??4yK z7zDI#d>u!FHU{gUQ@D%01n3GBT5oh+l8U66;wsaZn-Je+0Q!&nN z%+(C+`IY(A{IR`2E+N9&@f|JZ%YLEF!uw%b!i7g@CM3P{6m~Ouk$Vi*wc6LIUg*F& zx!P1dzbxh*qaSR$@sL%C5id~uu_8H2M)#GpjFZS)ZIvUtpXtD_)eIR4o>q20g@F)% z7Fz*(Mf#Ju>^Fh|7)4UEJ_)_7Nv!^&>`0d1I-v%_b zTc4;J8?{v-E`kC3C4(-BU)O%tKk1eh{>IKyDsOexaQ@nbCCU2(d(8CU|6(eWO8?V8 z(tbd0;eYnEe%aao6^yo(A7Azz1uky;26I2QH7_F@-0*R^T!}8$KD3G6T~3!>-|pYj zetJEVy^P9w&M#h#*z&nuZg_l~ShC^(K86#gi`!-?RTeQs%Qf3tVcGw58TpY`_e&N7 zksE@_5utKGQad17>dCBjhvSi!Xidblio94fWL zZmcwO2xeZvK?T8+CdgCBK0M;nJnibL87z{5lWRSyO@<8hpz>2H(Jq?0`%Ar@5CR~L za*#0*+YIV;LVBJF@y)x%jN+Y|N3?8IH4?Cjs06^cw7IAydm{%1W$wB_-Hnp(vW-c> zDb7aaLHNnhvu6Rc$^Q3oVNj+3Mh(OI@av#$>?+RSLaBUt-r{8B-=^!<71{x!BC^xG z1rXH$XVkp0bY`#j4!m@ep#kS%XY>|V0965HM72ziQn8TF`f}=jT#3Hgke_$t ziho=Oxxz%=?a43ua)yg}dkBIY<)G3%F;ql8x>gt=XlqKfypr9|gCDnto|xlX+9ZXP z04o^Y=q!~Li91`Pw+wP%mXqt*B?=EC#@1qxVk#Bz1kY>|{0}|j*@M~5lW~cZri`1e z5fUm@e&fk6r=xI3yV7t4v08n=D5B*+k~s})43YBK%5(?g?}GpIdSlY3zI_hauxO$* zlRZhb$m>5?nzPvZVt*mfy(FSF-f>APzP;2fx#!Z;sYM-Kt}%VX>7^Gzo-wPyO?56h zND}?+>?27ri4#N}f zn_Oy^ced0{@niQ&SHXLh@ZT$zbWUS=9veuCJZFaRI)VzHDY6F?*&naS9ok42+!3R< zoq=IZBi%3Nc0;e3*k> zf;zJ;P%wM4LxGMHnLIf`gFKcfzWsA->2B9htcfox^T#0tu5?by0VQX zfM4}b+Dr*B^?wI;`V)Aax^=jZKa5?h9lTmjy&&>*>#WV}vziFv(~m|wNf#MQY?{>? zt0ULFOVqxHtNW0gp>j)=BFoJD&kk612j?re&ix$g3r2AefJjZ5RDwXO`*sDU1Ulb=t~%UNikoFou}wq+9$g6m`<`M01PO>0i*@tM*rUQczkpn z$>LLQv=4##`G==S$uXG9F&w3~(EnwdsAXskrfE&ir(Wnmer%5ideP5{(ze*%#;UV|(P-s7=!G*18a zCQHKXCic~^l(TMrXM;6=08gZ206J~xrq+XNwV12A&Ctp}P1v}6i{X^&P#&XdSQJhF z@Jw*Yl`!Yw#4Q9Uo;ioZ3Uj`?moT<4SXUQpsIy|EcIxqC!~YUj_L}{u(|jfxnsL-wZfC!DgmfCu;Z^iWXX6{w-~(=&zC|PNBd4Ye2U=hA!Sax|wT8V&NDsmKi>@ zyK!}Y^ubUlPz!rA6c_q!!-jt)YO@AiKhZ8gco7GFG1};v+Q~!gbSo4nqZ6SuJ{)td z6dd~8a~9{ZT+yNfbn(+Hg~Hr6L1)L)pWeOt=a7;S<LpWZ6GgJ_@7pmoi z8F?njfj%1?d8rKb%bPcH5~$pG%UJIiKk4fFy=%uPQVvRKgJ$0WmE#n0>rv-;>)5Nco0e{auK<*&4?ysfwGI4*|y7P_7zvQY+t zn^wsd6K(!R=OQ6RF8p$HFQ!VX`sZ`@iUcKrD%1Tdw;=X_`JAU>E6PK0O2!}vT480* z>Pw_CS8nH8Iy!t<>X>NNGmceDhwcY7-K=YJGPSamK*5hp3Wd?MY55YjXT~=rul!P z)=UQ9z~Jp5Z5Zt_LjMbyVqo2G`f+(;@bdjJW&1F?Xc#$J`}ZAi(|5ziUndYYl@0k1 z5n2tygL*$SWN=!KK^+!~T?}pNc=GtM!BqQ;3GlSn9#WzC?*7Z_|Cjh<#NIh~ILt^B zN~s5BJlr;hx$sVm=-(C-*7|E~bjc8lVDWnm$dH!HyRqb<590P8 z@c(jn?bFy#^}5EgC%(hoI9TPVyV|i~yjC=;xD7@G7XWyH_~)$j*!klffUrP+fO`{j z^q&}7V!wE+Uwc;0VAe_E{6_=v+q*9oZ55*bZq(T2={aQ8ea+GZ6F4^Q=5}AfuGhX_ zY;R37blGr!LH}I4LWmypocmZk@okyplsd^7G>oav{X@ReEN56wW=oR-`Rc}`Rd?EmAHU3sau{^LwxQNgAWyn8 zz9!mTg4P7ApOqM{lLeZ<%Oa?r!c*|LIU8qE2)SPS201$#z*3l!%pq;AlHHKl=hn#o zHLKXx5f%9(!mYsP`#(VoQY_mc-1CGOU4hY1f){9X0ZLDx5Gl=r))CC5{*#sUg|SNo zDtjBL`xQNTCHdjoPusL%PG6hyc{w8P-iI(p$$;sLGaSdNdgOk^C6(aYZsd*bJiGyU zly1zYlT;B@Gq|jG{aOP=ZTbR$DV)V-AhUy}SvmGkJ2nK=4EXbWZl;dWs~|(*w(#6) z)_C~A9c(5Hc`2^xtzm#;R|Ez)wGKj@$mjxJu3|syNq6%;jFQd_yk?F}8q9Ju4Nra19Ekv?rppA53OX zNM<*jn50a+bo1K%oU8n}6VqB%3AlU@G|)`akazR7snnLGYHq!boit@Hb2<^i$r8C}Rp8M1QneOaM?UeB&EiaKo1QHtbv=@A=#6uEjYoQ2OOT ze51`1d+;6!gN#Bn3K+}{G;s*v&<9Y6fcBfiZ{9l>jU@$b8+uk+Q0S%}Y;7rG z#02&fB3m*E@n)V_Lgtbl!%A?ty)1gSAHp5(BIpf1LmgLG_^}Dwm(bMv%p33LaG4-Q zO#SgF6gi34Kny5(aoSR0DMO%=GKozzU{w&10(j2U{BSLy9r2)BHnCU)obR)B!=qZ} z8&Jrts9n=g9J`cC9HoT7HXdsCN&@m82A5+cXyiwc%$c(HtJ@nbaoEc3Ef!SQJ|^8y zw@M?}ua%g?Q~Gygh2H$>e+=*M`x@_UuI*8u(;(8?r^+q^v2_g#z7uW7PQ@!sjNNJMLVc77>)QtP+a zZP8cqd)cSc%}@N+{tV(MIet_9phed~syi;j{($)6^}~m}!woW|Ux8D0t2BVg znyB~ZoD}$z3h0!IG4Qt94(Y|!M(Zzx#MFd^MkuAnod_lJV;OW2L z>YZ#*Y;S}nq~;d-k%XEn@_^Gg!-8UomlW?(x@YN9Y9c-)L<{>1e4pMr|66uRk9aWG zPrqf=Rc`Ik|oo;{PXfr}wH7F|xG@i#6H5D1NCNgYqO8Yd)S(h>$v20lEb= zyS3tm;4(x1OGlTW@`1WCa;G;#)?O_MGRx^IFlr5de?qw;M*Za9z{m$*ibm*=luG_! zixgP-{X4iXNRigs&K2Jp^r+LUK{trX9mt?GRICiV3%IZErO?k>2Or6~>rs+!5)3 z&X9EH)@-apuUvO6@a--NXL1R#xfn=X?hCUsJ0tK}6oLE^!uSb_Cn47b zyp8Ia`%PZfeErfmp?)P3?c4LclL^*(rk?Qz43b3CuKAWLLKXrI0p{QR&CJHi=`DQr zi*H9seIHVyl)w zl8>Jez?~Ok6+pP@WNtrmGgBi#fH*H!h&{o-AvR2EBMcY`A#DK}X9*##0TJ=L5`=G* z9zCtEsdf$BjAZpauMG`<+YHYR?bvr9#!Hu|q+K9ksIO23d{{dA?fz*>9xWjB?Y3=O za{;MGz3#ACom~I1(0^UmNxD&gajjsfPL&&ldq-aN7Q18>zu*9?}ZSvq2Vrk{_#k9|WpCSR&FfF}KX0}>N*S9JfcmEH7AJ<( z@Ery+d_#TMRjuBRVPn3xs2)w?zh`yv1Q?7+Qo|B|!xI>IDK0!oDM(EuB-5n`LkLL? zwGIp0(7gkTMd>`f2FM|@mC2DUh(=FE>s6nF1SoWvQULZ1wUrhfbVl7l8gY3bErwcK za!){TJwz@cj?stmqsj(SL=Gn*K+7MAm3%6@)OuX_ZTpba0^o>8%|r?SaK)y?MEb>e zyr=QMPov3@)vjCl@N0{=Y;^|mZIR;f8X^f2sRF}QK@wCDMXHIyiz5k)Pyyvw9}BsU z4i8zV>WT5licZkw3opuA8xDw*e-NRa5Fwo4B^q|i&9fCiHcrfm463V(pkZ5#U5xTr zfL;U3B5dchiXb2y>1IayTp;L?B51gui6*=SyOo9TL|_;QGOrk@jl!-`e$6XzZC{98 z4UonWi9ZanBt}JY#T8xP0bG|}FvFHVf9ah#cHG!ju9LO~p6khJxlxtF0yPYxXWC^P z)|@C3bA=JBK#A0#4PYo|v0oL_9FQY~BN92PMhir6TCP1GdjO2)W(hKo<<96KaU3^C z2o1kC5m=?@=_Tz*Jc$?VSE0#z115Y)m5%BlX2Ufi5JZKXV~F@jh_wv9*4VijOpG2x zsOJ7?yx}5RPUziEz+1q=kJgs>{{1-v?;4^`a+VrSSPqilTzHoQQE5Ajul$8e#)+pl zdk^Vi0{~}!sSPK&^!+8nRh%TBy$ysRU}G%C$Dv(UMmM*-W%69T8KcaAoa`(ML0y%i z1fj`afHY)M><8}(U$Ct}!N1J!dAm5D`{P zMG{;+2YNJ$B>=DMF<>uJ{1MoICL0TviZ}~ALrNbrTWl1V?hnTRZoLIEIMoBWf3P{P zm~vpvQv*3!2mGO69D!u#88|hU==eZ*xMaBp!imI{auA|gLopU%Oq49L4UuA@zmEJ1 zkg5mn9D(77lCeltMXZJ=R?U-4LleYSs9|@K9v7S5Kw?diMiKu9z)M{OFa&Q4AVH+T zq|*4>3ddAifFuDVK?H^-qNRB(%4GDF!zz|y;Mf4)YepF(uoFMw@M?o^W z1S)(c%jH}HLWuysJ+F?&68V1V8Uwc^cM0fWHz^Fr9b_6DRs%%jDV&SLGQ5UxtxlNx zlBII%tHv_0lU=iE!!OEj7b*L4`_F(W{6uXgdrjNp%jNWzY}M8*mwJyp-8d_so?{$- zGW;AoIMJWwSbYv8=>R;r$RWjQJVjW?Xezb1@?F*rPpYnFRG*@Bw#t5TSx&ouvHhDU zQ7`df)TzJ16pwk^|B)DGvQ|!dwzWTv>ASw7Cfjc7dR}pZ1h}k#0;fkzyLNuQXulov z8`M64{KR>EtJZ#KFIfG&CPRK{4((lU4okjKely!T?Dl+*zq(ud4g>XOA3QwV&F34s zb^AN{-!s;Igk3BxJP+wp2hj8qPm;mnWBGa3M4-rJBUmYURWx;jeo&EXT+t9LVMGSKRdh-(P_vh&3px`_T3-XCNvBkn1?EJBs7EsBSb zuYo?KXs;_3*me^ucac39MQjNW+{5QvmkugCH=mhe0T`>$7cSV6^&lh_8+Wz*Mt;vM z9KjO0-s31!UEl`4RmH?C!zQnT&GD{0P9t1~YEl`3O=je zW0cg_nk1%hu#W}EJ`Xp)SL-=Nflq_Wx2#}nOJ61h;(~rWGLb;NqAZnQY+CQ0vh(s) zm#6-Nf5&)MXJe`xGqGGG?l+M-m z*EQvi?jf6G`*LKAe_n^*)v&COPo65gqTb&JiZR>FGc z1fQm0!uunlHx^v3MBT!V|9q&v{)b@2M08mnX>DzHo>{$X62H}CKsJB82= z|2N-YVvo-?UdCU5TVy-TyJIuSq7vj_Q%-@90juCPxi+%07Gu7mxnGQGdK7>bVJtG> zLJFDaGntoK&VR*4he#aSVaDu|-wm5pQiY4U(2SgK!~-z|s&=rNB0&wM_BRtmu z%KMU`Kj+PcdGT5cjtUX@B!YqB2ATnC^jbY-&j~ebR+Y)ScHf;6N|JC|Z)%ia&bEsU zPE7udEBO^={hIed_xk%pYrZSFazZzsL#0b;@I;yMUYHWmPyGKYhe7$eIpa2L#JwoX($sWAiH< z^tD^Ftj0nQO?588N-$K)V!Qdtds_w|a8iyG1g5{GVKJ7eZ;0L(ujhHCG%aBQ^ka58hUhJB;}4n;)ot%ikPJabluY0^?Rj7`qkN!b$4) z&g@;bAUJIL{Au$66}3lzMZE2_+iv(`?6i8dWm3aNW(8m=Fp9UkYr!rXshN+>w9v2W z#4zRQHnh=2_ytAfyvEZVF!=|Zq-JH40h{9p0a<3hM> zJw83;;vl+SMkG;WhEb8mC^y3>2U``jRTFCBPf10zVHF2i5F`Tk@56!k(V4d6!D4_V zccNM$^rIbqh34+D4d{#vX-P86jYI43#=>-*c4*6!2>-#4*%~mheC}RmicURd(88*Y zZmQ4*ZU<3l>$c>nSAQ;YWin`)S}R%Z4Is;3%SO+pqvhC!GEmBrCFl2~M=v@f(BIyq zUyGvl$Cp3(TZnmb4mFne=61n;1;n5FsJ=w{ufZ-4r_!V5T?W<{1H535R{IF20!q zM;hmVa;DUmd5(x%!T+ZE_}3pLSQV;A3HLdp`vH{(K|$Nej{kn8*5)HT#&0I1rFe)2 zOBH=HBc1pgW&ddJ_yry7=Q^;U^CaYg=Phlo6~A; z`{#Y`lIxh6D0P#*YK5hIMb4e8X-{wrM>6}@Mn+QTBKZM6s(k ze)t`i_K7?5i5u&{Xc53c$0o)K2oC@c4FE7Znr{q8g3|7jl*N#->t+nr&@*Dqhu`j> z@ZOJpC1lXjt9{sSpDn9ojM{g^7$ZC!2ozKFLZ!fAdZ(Qp)sM|?H}kjJhpyS~fQyg5 z(#ltf$~D!izqS4x8lno(s6sGSAsEp{<29J=*M`g!oApRm`^C%?t9k#c_@Bde5b)D` zs-7R@(#e)_1ue>7g)t~%Ujw8#Qj;rIkc)3CW2_L3tDiUevU@VVCTAv~mMofNDS_?^ zFbS2k13a;sVw^YLO!Ta{gT@H#bHst-Xh)x{sYcPMZ6!M5UdT4N-}NF{WkSWMszw(U zG6dYpz}x9(4b7>FNy1`E$TmAZ2pl1!)ypz~E4hL9r3}7H(B%6~mph+r;nG3QWDJ{5 zuPN&8w)a1X>78TrgatzrPaMclg%L4IDdYbu7efEr8K)WX+@t8;LJ+%3E;>BK%1|A( z^?{f#I~HdQ6^~MiGksxZ4tai}T~rv)Dd*9I8&6qmaHQTtQHLL-7vjx~%__|Wmk-ll zlfj}~)jc-f?HbLLVFSl{+_|)7@}PA&Q;WV?Urxb+qN$hM9n%uB<}g}w856@(f+3BH z;VES!v9J|vT6xc88FxsZI2fT%{$R=HnYnP_ym^~`$tTUHz2t0SqTN4(1iq;)Yu|0I zWy!r*tzNfjYxaE=aAQ1oT?IHHHh=@Rzg{&FKpsgP4UgNq+N|Aw9|o2>XQIs%Qk9@o ztNf|@(674V@heVi3*D)B2U>>D7`^CjbZg!eHn-0ekK(tm=_l#TjQyE9>DLOS5?UF{ zncDPBaZ?ctVUEEC4IWj9fY--mi8oWIQ2Tj*L-!h-snQK>Ah=a8uLf5kvga^D($3hD^eOJdMYJ=0hdLrPVqA0q3x4`CK7mIF{66Oi55Fr`T zOW;kCGBSbFEde`F=hGni*wyn*=k4?R9Umxn(@;2|v_oki+2!S@#6&#j9ygs}WB6c# zR$fFazi1c9+uMgD4WKy>DM%61TzzSz%ubBhbZYS0yCiLGCyFH~_R~2D6DHKF*nq@j zRF)q~%p17$ZAsdIlSVS0Qur~LwxUagXbsEuYsFfX7c=FmTU4*spJgFn;pUgil(d`| zDLw7t_87~yKj^h%bjhRT?$r9Gpq8}IR|t<<_Q_Dd36V2A8vyC?Pg`gyyZ6wyX=|>^8b0Tl);S1tWPSa~q9=7m`+}RNE!pp0kC_ zYL@3vJF6v!Yddx&$I8=i76Dv`oEz9?)$rWfuoBgD!BHB*rRbn=lcA1P*Y8uOTZNwR z2;f4ez;V58=hTfRjnOVg`_OlI6MCOg9x{!^Iip^{iV?_3YozwfW8nf4W3Z&^kkNkZ zb&5l>rWmonWxexJPOr>k2xBXa{`J@%gr+fY;$s4J>m^5}*7K=Nwj^&^Sn6a1`;azRA8 z3X-@93Ti2TB0o*q2kVtrVSep#tKSavb$#OKNH}?ZqJ63^jZD)535|u0foMlHg&|tO zyt`Ift~($x(ldm#euRGi!ZK}R+zHKTveT@|Sii6btqg91Z>8nI$@t$lYmwX&@YizG z7_lTK^3lC+{=N}>pS~oH5?^6R1{HmJfzqG4Ywcc&RdNU_PXb`m=+z=Mg9wja;JKd9 zS)1q9LXTk1dt?J9$Xsb zVavCqr?6cEIo>VjAy>4b@N{&FC8CAy0V_o--&OqK1j>z-XZ%ho)m*9oV568$G| z)ub7E1@rkDn>oCN4RBH)6kv9}Uq}3*9H!;?-LIOK8j?yaYVn1ovGCC24V`;)(mE~K z>K!x`8YJ8}!=+RuTuxWNA%=hm4n_*}NYX&_O%$Z5orVto2Msx5sJ9)eXpaYimADe@{(O@VQfnV>@%MCs4(^%!Z zVd-XTLEgX-jbFDlOZ^c!onTo0x3_TI)(=PM+u5o^|MQ!NinaON#V%|YUisdj;?(#& zTz1XcS3Sw^W2N`D%`LTZ_N29z&)I!ZBz*+#HQgeH+Nb}-cQ-3IGMid-lBYT{%ii?i?$SbBH(j zpJZN#*}^+Jet}X9l&!Z*oh8!G5tt}*y@To<=r3qy`vUsr6m019cYR@Ryzj>HAsgjv-BhA&uj_OG7G2_;7t+BP560;=uRI^-*Xw(_e4Hm)gFZSsLXIoD;9u ziG9u~ci#V?;1+QV37vo_4&RR^rn{h9fPn&&fp!H6UtBNt9RXRjG=6(ceb@@|D8qZ6 z&m6w{CeL8b(=yPVIkS2E_7)fHbLyeUgjg96^9=QiB18`15xuC&F9In8VM&vBX=CC}A@f59G*8k`Ym4 z*2ZhoG-|zePS@94WeRYap5;-$qmCY@R!t2K$IG%>tlgysr&eiwT3L8{j@7lhmzzbZ zf7@ye({^>x4r}kr#xu|7>$j(CTvZ9TX#MgIw|JX69^568xseA4L-jO3*zxf`>d=A2 zkkfZ2A{bs(`jzdThIO;(g2bp8)~=E?^qAtg@dlLxZ)icL!O)iG4&J$Sgx$mQGZb(N ziNN`6R$q&DDmorp7;op*yW_T<+bPrVq+#C*_Ck%s<^)(zmv-k(>09@XUF#`UV=(K7 z&rf02aFp~UPMiH{>>K}KkF?tc#{xrltDh*E<`hluVmBbcY_*BD++(YK9EqE}CmK&= z&9LW2Do^6(8BgCgD3q#zVxWjpV$SsgEfP9q{BVgvxz|9>#rIV{&&|$rxuIPOg}ZA1 zQp;Jz4TgiJd)vJn$Kx5er+DIPR$AN89xJQd*H_lX_iQIU2NnnEZJO`NVemWH80>{omJ$)Dc6!Mj!0&Ba{y+$v?!>p)n$}Ldj@vGe;y}8Lh442=L zFU;*X=FoCQSr^;8@8?=|7{b_~GH#||s16S)Y-Tp>Z6_yN-yZh2^S#Kguh_Ik-qK3luA&|NKF%?>nmNI zF0-NoYFpHat%Bga+W;hH>w%&zPfkBee9RnI&*3HD5F}`JqJ2LJafCkeH*+V zBD4TsQ-9^@VGOyMDT~3dJkH!EQD#n%Asj=mwWA1T3}^rFENc&JvGVM>TUnv5;mh)0 zw@{cs{l4-*LTr8MLyO$r_bW?|ckl0a&}ohP3-3oO-=pXkGKHPXej<8e?px`{%9aEr zUxqL*$UhJBDmFtEq;_x}z5w-=(-Sq6T?jy<(oRm^+yOgo(~Ps&hkJl4>(U=#AJ&}j z`{;HXEQ%cKB1n6O&tOnFr$HN0It&1ZIYp}vfre-;q^$VGV6BO>b%hOt?gJ%@IY<09 zkeDtXvRKBxTkNc}#3dG{oYXEk%F3O!E5!SH=KHZ=BjF|P0FO$5H_0udSn!c~_eNEV zKZ!NZ0MIr~sqqx25o9$C?A!BZ_3`k>%kWj8uxx9_{aARj;(G0-rh2$o#VC*yyGGHI zvDVNq=IB{G^L`k+8u@*FacrY^G(238c^B*{P}UpusytkyAV|-NjF4Oe=O0=l(WL%? ziq2|hm0v$OJaQ-Va^y|hJMVDEWyxq#`&jYWY9K{%Wu?Ix6BLq6aEgqb@F0rJMp9f|P+W>#{RA4|YiIkeVro|7?AScvakH1Bd+GQ?inE3N zB6qO=A!gMw2=?zvs@xn_grOeEKprBA`6;8h4-DL z{3;JutA8tdAh)xjkUUh^W7)w;;?PtJCs!OeD=y-3!`xS}OGU@)dZ|oZ6UAbO@^;oWg>$^mz(c1qN z-HUYC7$E8rzPV%@o^0%a(n$Y*z7;$k~8Jt5-VlmDnMG&2*SEP=0G@Wf;4g z)8hs`&E(3m#4-G`yIc7@E0;aAc(EmiXk@JOk+r=IhHw-DDg_vhXM}Q$i3`FaJ5#D! zo_|Y}b%rL;oYCKSFsW8^lm2j=OzdSR4{?^B1n{M+UdrB#`DLPl>*Evedew#y?RH{^hHjvqiPR%-uON*< zkkAPr)oya84_^>(phz_W1Aj>s$uG-8wbM$$-&w|&guSwqF9=_{%ik{u+j)9pE@$G< zrnau*lzGVs9DL&8xX7C^Py5Rwx*aH(76eW`iB2gEq9*rtg=_w9Wwt_MD5UR%QsC;x z;kSfrQ>CgdERmEn0u>$1!vnJkZFCLDjTBFawmBQ)HkfAqb%b-FbJG4Rxh5=~vK@M1 zHz`k^N-qGbI@Rot^GE7lMe=Nw*fn&9tyZY&$bXyk4mfpHCACE~&ArUemy&4J+x70= z<;h>shq$mXBm%9XYVm8|%38CUUHph0KWe~%HE$)gPR#cTHnz!13Zp^9%kUR<8)h77 z)2fThO>s`S9W361lPEusba0Xi%!;xSJwHxC6Wlv37H?N730pP9__kr|ad(^7gKbyYqPRt*c3ndYYCyh6Z_}y8#a(R7kpLd0Z zjK5xLDTN}KhnSoZUMLKqcE`98_(kGQCdTo)o$Dz#yHu9`>3J zIE}D&s?bn@x6Q7c|4kU1RWPD@$QO!itT^tDm6vnz{-ZZWUdF}eVQ5Sx zTw6_V& z`#vTqs!l{@@+*+M5rkKVt58P&EwPqB9(Ml;V)Y;SH0@$1Dksa&+f+k}hhvNTmzSg8 zSL)t{F9~#Uob|dtNOd|KJwX|CI*iGvUb}~5!NE0cIe+YW;j^E|Ukx9}OrDwgzKyFD zt&R0k(O{fZt(QACaMrqmu=)@=M|a~%?kma~g*v@q63zR7srnw|C7=rPulCx)x*P9|Nh_pr(0gce`SSH<@x-;9zIHK>ZAdLXgS$3?5^TqKDa%ye!+Q=Lr5z$i6icz}#9{{C5TEBpx zJd_2*@z~^oX2ippBN?Q$H)p-5aL>{y8h}(DOolB;hBZJP4>A2?^4NrPpmxVcowKu^ z36twM{veUU&iKkt<-g0Di_U5H(pGxX&2nXZm6&2odNpqWh$Yc_|2GZo_Bf| zbTguxy{psf%bU)ycXH7!Z@T)!!%uYhOKQ~bVjW7jt^DnqPOo2Hc81-4kD?iEb$R~# zpmW;qom;P9Xkcdgtb20%p)}3tuH|)ZZijqQimY-sFdyJ%QZ(u)n?jl>$V3`0dlmZ!)s(AhQKTe-shC&EUUDbA-378uNKHnS;1y z%-g5_0mx3!&;f8y{zQMxsw4rR9j-5A>4057wu^cv)WN)T0PA2;I)F~_BEr&~0GN~Z z@$Ti(*h-D%bhH@X_hHUqs>vK)V7}_A=BGfJ&jRF~(wjcNz?pDnYHvY&$3_PgKTx~G zPoGIvs=ffMh8pQ|?*wDd9(ROi7}03E?Rss)qJX?%A-_`;fm7%wJdb$hqCQzIdUKUK%@CZVPowX~f$`sxJcSj-dPIdoNnd`$edRSvIkEW&9UuK+cAG}X zjV}p11(>*?0QTj;411_4XHl>8@hy*!-VeS_G;4M_dVa5;dheck4^O=}bNqfhy?Yo< zm&Uo|eV4)g(cJj@z_FAx2tL`~t&{QSZZ>Ve8~KI-WlFw5IRY--LFEW2`EEL&E?3kn z5bLz29RYvb4cZalcQx-mx zfG-2K@JA?#nX_;a;uj=_mViqyx;QlE;8etl+Ua)@b(5UBNm?+{;+S%?<{eyH1CcY0XX}R1%FK2SqEYHl(j-^99L!8e48wn;%f5Rz%ViKe}>Sk4l}`zmT$A_l(dW=NmXD zG{{qiGC84vH=&vfBE@+vJ9{!8f71-IUi;~Nll59@etcvD&evEpGw1xL3Wo+s5?47& z@cdsj&w*=4*gOZmAOQ}v*vNr`+G>r{EVgi(#a2$UuyK5TMl5;BS8sbJ6F66Wdp^FO zRQSw1-x(VN7*r6F7o6x6M0ASyuZsEwA$h^2+JcbWMvoxs7lh=Gd({ zOk>iL##~Dpla@4&d@(M4p-Klh^oU7~8AnuS^!1L-IHnbh`TH!-)!aT+*etWFs?iv8 zv;oj|9ea)hEp}PXmB;s7)tFW_=Bpahs>Xa(V_MaiuWC%I8o$A+CbX)_hCFFoChlft zsI;qIw?7%EoYt0^(G_nBeAZ>_@(*aWL#FR$jZ4)vSv836Qd^RP` zreqOrs1Vy|n0hUvk?w|I2AY_ZcQIGq#iYE8MZ)G+&{_yqU1~92zC3#en5GuKS8da7 zN)nZe+*c@5qz*@j^lge1;s_nPIPWOUOAnEYup+fILgXT>NHLAjk6`5$?G(j%8AT_i zq8vy2t88P^3&jek0fE5i#q1`E#B?=B^fhR6WBtWdVg3T4$50yWf|uTVjxu25`+NXHWwIbR`K zH%lz-3MHg{!f2ihFXGYx2UwvbN=paqvO;2)6%v&dNiP%ynq|r(uw$uqZ<|PqdYI4j=V!qU*rb?`lSKvibI$+fyYkO{l<{WbpGu|m7 zm$xKlhftDGpOfeyh)5cw1T;u*De?;!J}9D!$nU}j4OF)|9>$Ah6FHySS&PS@yy^Ch zIE^wiEOk|6PLj&K{_Gp>kfg;?>r-8}l4%2!Eg_YZtrqLhL6i>g=uRprbnrrSPiU!= zUE-MzY8VL)knla>_?{BJr_8q|NokL!%(o^X0^Q7F^5>gukU)k{eV1sIGv)>{ZH@kuV%oyr`K0!=9Yu>V_Fb-fm|fvBDUc)4>meM#FaEDjnkB`xy7%s zCGc`pdWf^BdFde#q+Z5QdbnY+@C_rv_pGj{`HstBXUjkDHe>dwjnjt(0cCo}GGn~;h!$ur_hJ#Q(kDH(EgpyzfTaidg1j)6(eIlr7pdtR^K4CpGF zj*UHXd~|htabd;Fyh){nt(D(fWKi5e6JyVuP-3bgA)RN!9qkg*c_yIq92>N;oe!iU zI+>g!_^&`|`1M=1H{9Bhk^(Q~?qew_@Y1MNCqmh)ZT8!Qg#aX^V6+9V$A6CRUN*nn zl+1m3a+wVELkWKs@%;ree&QQf>PLs(xi3b9hikeMl%2@yFe&&BBCo@wV9rVj>1GYE z!@jCF7X=>*)*d?W`lpz_6M$WYR%-$ZK4i7GF0GCJI%#yDXA8VjYbR-=q+B`2Qc||2 zJPJA`Wov2+vmSV=Nj;lxs>``0cWC2T#`ZRa(00>nT@ETrzh&}5@Fblg$x06~zS5=i z6<((YSF-ewwF>Xqv&OnxRiqhT0#Q1^FFScCrrbj@CH=Ainl4u*J>?G1*i@^SyU@3z>8a1WLZ-f0rosw^~_t9bCEHlJW%D!sT)lDNlecTrNieng}!U zf!krPzQOdkY~+$3motL+n!9l2WI$ha7p{`hLv69y` zQ&LQ)BHQ_6hcOJNq?${)YAz+!Tq+bho&<3)U=4YDS58yf)B(P;B%G(v_OFpktw<@z zGNmBPowB9<*o0^(P*v?Y8&j$@S>)IApiNas^_-IXWU4rRQ&4KEIDRX_Z{@QG>I>q~ z70agc<2;2^$>nzn5l(rCa7rP3PYlT)<_~wivXwk%ilNQsu z$631-CVdc82x&O>Iz6awXeVO=T%Vnb0w-vpTaLbt@h*>I`%lPaIHLeomIdEj5Pl{} zyJ3@`9#rgVIGQ?-c;65$b#`!x3{#Xgy)8-y)b)0!&GME6NRN^4#huYX4q9nl zQ3hpJ88lmt%wK6FqwUI5C;W|h=M=*!JjC^NpNsPnR-Yzl<3bd)IsVBr3 z+eFx!@-xISYS*S^2}9~y{Z_?HZy8D3HitL$fC4Ww#WFEvq$|ouSJYj>IMV#uL`Ozr zG<&?Sx(3@^M7(IJpU$S4c3V_(ZB{?&5XywCLPJQOlW~1cM*5tL>vJ;F=VV-;laW3L zv+Y{P_l*3BY_44lWXVY3XcLXvY7j+63P+o0bVVcd)(M9VHgn=lLYhsD?l7MQEek$D zG-$;N-Zs(*y~;x8%v&iVb&1XWO5-3WB%3Ri#z7h;o4@t#&t`Jv$+#;|Mj9rYi0nXT zGeuR}L}>e}3NlKAV5hP|W{npx70`+X7wuWNf%BzBc9=Ye(jBRdh ziQqu!=hoVLLH{S~uq3W@_1JPuHhLWTJe znG4#{-iydw5I&`~q!;I&rKoAyzT)^{Jxwe>W@RY2o7JY#ZqCBjZGF>3WEXmPUI-SlBTncgp!vuP8uS8cp0+aE}vl~P}DSC&C_wyL;{Rn*TLD}4!2 zS5`hc({he{HxjY^ku#nFIK`fOwpU}bZO=dd5An@ zaTTO45P7!x>L1~yBNWqR2-5Ef#dH~h^1TVgbQyvaTmlqaPviO5F|z*+Np~Y!)sV=T zrD8E)f>auUJIx4kni0hh$$>3MCn9*JDM79=)(3h8%bII?8&8zt#}KI#Mb3G9QYVU> z^Y)}p6#3zbvItU%*(8el>WKtt3N7tEn4U?+6QW6PL z5(%y(5~L&&yDN!SMp36DT5Y~E=oTu6l|k>qif z4Ur@bk&F(aaggKyV}N$+QKti1ZC+Uq8MV+l9AZ5vg_n#OQIez=k})GnlJr6{W(o&M zdLbDzg@Yu$kOaNZ{_8=`FtXkmW@Uowa`CM;udWBBCg3^VWZWYEQ|m=K40|R?lO(w& zNs=Z>a!ryXO_JoABuSbi$u&umG)dA1-3h#)?U$f}w)^Mvcs?0V@5Y@cYm=5LaXYEzRht-lBP)V1niPDMUp3Am!v6@pv-x5?p#vBEXk9ZOG;)g z4_Jv%Qj#cn*d$Ss5>?6iz`Kt#Enc{#ZG_gV4;UoY_bd*Bs}EdPOAgooowrjBUT-HCJDNx!|f6BBrrhhJyI*pg&wIgZ<3fd zws~X=-fjI0yYg>4Z50x*B@g716v!ocAeSVeS@K$sl3dFquk|QN^&}N%;Yjr)VF@P- zlkduCpY6ih&9*;hLS9+2zVu^Yed}c1&?8lppwv(tB~%L;_y?l|>4hY(ut-rOgSua=3Q-m)HGO zQvpmH`-K|{V4_bhu1|k1JHw04z#&zUfv8pm8=&h z*VjY(oD4NM{n#B0Z!S8+F1E@-tv+@yF1tf)k%n4abU%FPU45W$iBOxt$6oj13|m-x z&zfZ?uULF40}PvQV2j!}S8kh0gm?7LY^M|?s2X%4dmJ#YXcDq^i`9bIh$R&!@f{GV>RHPPEiS=AKT#&q? zIu0uKM!S7Q9z}{!n;WfVkbL2Svx`FnXDd>|tN5UnG(`$~1GHhDYDKSYQkMeFreU$^ zY)tfM6=l|2P>pI;ab&9@Nr&XPccm1ohbRoo7MimV?P_zCmmZ>BZLW&aL$s^)m9-5c zglsun#ifUkF^8+9^w6=5LV>Ha^iU1Uu7A9mnVsIdGtpK5yttb^{q!{Zza~4V36lOY z`Exv9SeJ{N(FBenW&O|$U$5!T%X4cC&7+t(4=7Sks_Y<@!jig1nqDA$T*V{E~dqJOH1)W%lw|MI-m18kR zfcy!UN7O!#_z8!FS`ebWpj#=|UO6Gvw2EB&DBBOM4}>omPKHn&zUY^o&YnI`rj0Bf ztIa{Q>Rt`6`zZTBVV=|Li`&a9z!({U92;t7%l9N&R0kr(ESw57PLt{Li)Z!53;Vt} zuKb1%fR`R~s8y<(Nv(&8226)+NbIVhBwJX%4_Q>FwP{t6R!u3+0g+ZsDQ0O=q*YUj zmAqEu(4_#AwLoQ9kDl&D&rfR`8Yr2`RFT%kZa3>}$5Nkc;QI!Xr{~9UMeZ<*?OnYR zsc5TNh~Dk`d^Y}KW@<8h6?+jm@J`5@@24 zalZ78Qt+CnNQ?eQA@L37_Hgz;B)|-3Ee!bvH$=f#&sv2Lg7@DpOnH+^?^7zjWPe-f zHY8fn@+$D&V8-9-0`S?i_{j)*X!IW#kl37*Gx+3J2APxSvgEd&gD{edsXCohDojkS@3n8G*Zda8lx8;Lf%OO{qPX_5y}N}8&*Za zXNnHoB0Zc2fGi6Nj<~&LcuFjwRDMtyp1g()(2|v`7vt9+s0bi=M8+}{+6~o>T9l<- zegFR6Z`%*J_v`0fRZ5W(aS0)kQlunl#6l#c=&MYW9wI44AC<}-n#xP;`mM^n-*Sfn zTZy#v(B7ghoO81DP+Qcf6-?J2SV4`~MT2#&J15gb&QsFmWSYo%x!Rm6DCE3cZBA;o zoR_Q3$=5ZH<6Vhc4-X;bcKPo-6qtpI&!qsvvstG8Mfx z%`L329729#RZO&1#aGjhusDgW)w^JxnRKa3XK6lm@z z6-h29@z_9nZ7V{By|x#HdR$a$Oj51A-`?3D8D=}2u#`hn!iUq@y*10x1=FgSQMTREX}n%$4mcX8 z9*e4udH>u#b>ZbR9cGiaoY}&f?rpr-<~#b;EVX|Smz!?bY2J>K7kXaD^JxPs32S+L zbaFc!USE}0-G2|uo6ZLe4S~Qu`pw)f|Ih8^P1)~UX^=UCNtiEc*YEyPd584B4Ld(~ zjd$M9^qbkcB{#GZJ6Do?X;Dzz}ErqKDY3L3Ck0vW6LQKPY&Daz&Sp1%94}wOu{(@UF9hn2#s&k#^X2;$eoib z)s0DvP3blBA5qyJZ2QjZAg_2GZ>BKK7p)pelu6E4jYQ|AdCDph=M*1i1xMNf6d#rYCr8=|%Kwww z{6DCjps22#4Ad*4Cjcjba_B}rRJ@~uP>M%Ds;=+lIf z*;wya*At?f5+&{vkC(L~o-cxt7kC(*AqKa4)}2QlL0dg9+v_d(<0S8|BYjx-H~TFn2~yYUTIX1_%c?0&OPp%(?O z7gdnvqDWW@sDgq`iiD+rDoEc@cn4u~L2Hs6B#BCq&`wEeLzUg6il(zKsNK zNb*#)QXe#5lEVl|1!)!vo_VGq%|em!WhBi)k@00D%|em!Wu$H3cf2B3q+d(yS2uVN88rI-@xKON-0Fo%@D@Az8>s%F-*|`u*#axhvqp0_bqCkQM zQ)ikTA9b#N>0MX?0V#M-x}DSOE4*PkadOca49oM|{#EC+i}%4w(C_}*yZT_%Tvum! z-z@xTr$4;@(C^%Q{8SD*Cl~mPPZ^*e!scc^x>u(kJ6FTY?$r?Qnue9nfjsx2d)4jt zPRsPq6x*fjZt-Vq@4{~IcN4suSMK5)Kpo@nX87Kya#!HpxN=wGU9*=z^m|ulgW>fR zb=Nfgcztuz?c)v8>Y{sUG>Uk~^!?)c`VueA#9wy%FcWyoO#R^F?ZwaCetB~JZ@gR`e*kwsFrBDb9!r(nD%aN3&i=YW$)UU7A^nI$M@%Y^SsP4Dn?k@ zdapSDb#!|VhS!(p=f}w=V)Ny3^z|p~im7@#7zY9sjng4TZbW_qf#*h1ddR!rwA3>0 zy2;I)GNG{`2ke5E1urO|#acVo%%g|xE4KvL9u~YSxgbyF0zH+jN}{5K zK(pvhC{WjV7Z-(dn}>Q%Nsz66-u0Z0!XkQ&p8uy2_O=?J@f?!tBQ()T1sU3tLU3$% z&b*e9LFWs-Cq(I?z!u-28x3tf&=v{^T-srt8lFRyXMV)4O9 za5CLaRT?v^Ysb}!}{q-yEiEfsF!Q>*t`npgas&dNi}6j5@U>ZhmCBT$$Is(@Pt_| z{T0f}>L#oj4UVDW=QLaP2lE`732gd}#@gFFN}MaS8Dm~Lz^K`~PtVKmm?%owK=sMu zX7rsR?MdryI*_pUBs6J>4+FuTHCHTSMRRYi3pn~LB;o3|vU%rH9BiXkepvd@gT5XvH zj*nhoW_5=i?a*CUYVF&E@C|I-ys2^A`2?2df1}kIlrRC~ce2s=omk`dC&P}%ELoKV zZ5sZN@E>4i*K%Ijbj-#S{)uitwyW;Ng=rM~E=qPg@wYb@_qG|CH(J_3gLXHX_Q#8* z33voT2TCBKi6Ft-`_?7oVfO82KKrWA#l^{Jj!&3j846TMNopR+=?A)TIAgZ?F5!8~ z@jN9wKXm2r#`HZU-1b$(&4nr*fZT_s{& zc_Sx_lE|Wr+2qKibbw8W038Fj6HnAY3VmZUs{X8?-6HsI5wyy}7oFPA?rGjdvxCkt z%TtEeztKF1O7Du&0r1FWg#!80$(ymwRMH8qFgAyob0kX0&B9wf)GHDaQ?( zQb`Bx3eogaP+6dirXa&9F!=00!8<0YW1vM^CCZ+3>|g4|bcZH6J79t;^E%osz!)s& z-!GBVTCia&PLdR%uxcP++2w6qB5?hIie#Wa3JM^X<;3)2y=W;f>qA}4IlU1k$=LB~Mu;uXvV9eh@Uli>v+tMykEctHmr=qV0a znK0A*JfdtI9iV`y?qfm21tIqkl?lzeXkH4%=DVPIDc(HPGj)jp(n?~0)FlQ;eQy38 zD-)W55k0BT>TAc;o$A9K^1L_I5o~;pbOknR{1-qG9!ko#h1IJJM_<=@m+9vvc%kVZ z;h+U0@zEE}X+ZNWtt}p?LUClxO9%K|%G>hV^AseA1b(bwTI<4Hm)@S0A%QCw)0^TE zb;xg8%58H6xG~Do0p<)D&6n5D<5o_ZxX%SU2jduzkQjV94kn$(QC2#@ym$7zTW?j) zCxP@0kVI=c0{bki4Fub2;~ny7tse#$tz-d5oMMvN<5-q|k)*q(GpcmJ-!)OLKA`U( z$8bzN!8C>wJO}fpuC!c?=YQy#vm15*7ZqNe+1kyV6{Q3GLMMc(iF3F%7jfx;L*{uk zUne4Hbz`kkvSI}#gc|Rx2BzO?o1{Kw%t$os#Ob* z`4Ulmz@VLH%s%Mf-{fiQp4$j(Y*Wo}d>hU0Zx`cxd%GFgBW7;J>m8|ITKJT5niOJ& z1q+eED^IYB4ML2@na*rg$gFNy%j2NZn!lsPo(IwsC5!=%NmCaS7gGD`EpA1dsa{LM zWctHTZPMn&T$>k@HZSJdyqL6kaeWDUdqgy4XjfXVShDm7v&d0om_K`S6KlK8rhPUm^kC)P7t}nV6cN(hhj-@mRs`7>~9^41yN7$TxTxQ z(g6qF=7JU-4(-D+>4I2P(csW;s0HHMpF796+TG-ox~Tt&rN=d||A{Nb+4q&(y=y3A zv$w=;*XVd+NyJQYVn*u3SaM<}iI_=OfX!Ucwy?SktK*4D5gXfhB7qmgFM^)_z&ajM zK|!LJ{dGLCqT#CiU^*U5XJP?A-#N_-s1#?@!MD*fe#yQ?W)$B~C_S{dPADeLZd|X~9Xz}|{yv_c%>Ha38dn>K>x5#u-HPcl1`Xz+ER``SJ7Zsv z-dxaD%8Q*pR(gAFq)6xMBClb<)*(~6AEF_UA9dH0@ zoJ6X0K;5)elb1u*i`Gw=%mH}NCzUenq3I$;UJ_$QY10h&9D=HoKv0$F4FYJHQ}O2ahjZqMpCCGT!tI^gvx z&OD43I7}=rsme`7Cnt-KldlhtM)zxiz46B+k5Z6H$bWqFWxO?hX-_uFAV2ONqyPDqcJr2Nz&uP&P~vi+x8`1B-c#=AoV zCFSIn)ISLb(Y3sKLW-dT6hm*yt7i_GGQp9|)PC!>H%QQIE1>QKQuWK}i@*$><0ZdFaG#pkn%*&}n~&MLB5=43Og zx=LtvTz5r8oJWguN-*V1LQX*mWko(j?IhGqA+#~$mGKqo6B4(YX|GPdem3mD=+Vt= z<&4kV8J{JUnN3R%v6;;rdCzJ+mIqIh<-=t9wTbk~njRl@&dz$n-t|@If}DpTbD~-L zm7mIgmp2!k(=G-ILJmhrWY`&W{j)LxLg#L-JtZTUm8!$Cxea_6yB+u*@J#UAr`5N{ zplKdG#s)h6{Jpg^%XL#dG*HL%n2!>6TzIV z5nqPtY{S~`J|iQn+L(BuJ?U!`qkuO1uIPh9XyeXuv@@}voA~%A>TKU=GFYr zSULqEvNoE`#d+x=H16naI+`xgr!$ztD@UiY1DAx7Dy7&~m0G#rz=fSO(vUJe0g(tr zi{RFIpYO}NZd&9m3m9jiY`{{w&1l&{T0rR%^;7gbg*p!AXMAM)@JOw^-0|+(wT=KdTrbV_Su;jT!?HoeRLqK22(nC!~khYmH z(;vsc!$rj|k~# zuk;CVVVgvyhgMU`$b+PkG1Pdyu7SBrY6ZzvixjJoNJ?CEfTC~ab;MXm&U%sUG?8y! z^i4X+#g8AZoaADoRUYP(>F@BS-ju>|ab6W4AenXzP%H4ves5IX);ByLm#%1q6$@ia z6!Gqgr`9{D>8&XfAIz(6dPW?p;v6eksS{sX+*}Z1`NHD*f{f2eef78%H(SlgKI`pc z6sS8sXMKMU=rubJG;Rpng{`(RY!|49%T{J)0SYKpZ8#9F1KF_g+GWQcI73cuxuj}hY<(XXdnRH- z;7&!v&V3c^9BuUs)DFN!Kne+Xl=rfA1bqx z89L!XK?wx~B?aI0WF1dHx%2iybxQu=X~J9y(j+MzaNxAu`lS&LI*pi1KuQ+blq|AW zFHg?j7Gr|bEGn7P;RcCRwat(2wXcp_P(5PC`Pj;cJ5ENuhst5j^prfV zQ|@t{lE-x_IE|xx45?t=RVleTr^02NHW##V)=Vn!f>usAANwY1SYV}JCA+Kc3eS&_ zlFXe-P8B2#Q69vBETvo=DX0V9)DEwl^-xu;hsw#|^rP)Apw}tlZQ3!#rX49*e$482}TJ5nSMJ7PL$HMy7BIJ84BR3LXliFNiszM8G zi_3X6VcL9K(0p2_rP>&vN@#6b*n?xg*dQ~NmK8+Ey>N@+hzJ~y=QZ82-eIp27X(O} zlpbP>uVm?=1I7lKFQuyV(5poU!I4K@2lG#Bn{Dde$6c-CkoyutZE zsfrJja=t(m>*+R6&1cX7MxoIAE8pDahkE59O$APZQ37gCYg*@eyy>xqUu%I1p+~}B zF&m_FZ=QRZk1uEUCMAXzE?cxkkKhGMiD4E$msX%N+BRr6Mq4!gMw&Qu3&6XEXe~!y zuSTGmgIg6J>-8Y(Rg^K0Sd_8Q@zH2L9_aVM*Eby^>!xrlhG$v3-th-ZmzP@L*#>Hu0-h}J#Cv)nQYg7!3ODr7{5ua*Kml|s263C&jJEh z_MET~QCM@ON)Hk9V6O7gLtD^xG6&jU*Wmc*^CKmDw5qkO3=|(LjIM?=et$EcJ&)(h z$v7wrkzp+5hOv|kW2sebKR=JB_aF7?IUkPy+{f*=BB-n|5u0C%1j**42EXN0aREk= zXrZ_~MDZAm>cyTwMfOWNZAFiaV`8KgJA1bWx{ApH)0@URA zsMEi^?w6O>XT9@Yw_o1g_Rh*14GcfsbkWle(D1A`xanREx@B+Jy(~|5-!=3EL-lg8o>bl3r47mh@iGd;%c6+T7;vGp z)HwV3WjXdpv6V^e{`Y0_Oldj)Wg|nr&Sqa9$9gPJPqV51^JsMOKV9m#Po754|FY2p zT;Qj)Vrk(!1K39@`z*qukliWd!!sZJ#pD2S0a*$K9Ow^a?Of^j!rWf`1iyC8;ZF=y z9tscth`1Q6Z2dsv?rXPkH* z;fZs&unenc<%xk(3QSE4PHZVKH7%Ium9GlHXnlA3@^q;Y20hMYCW1a?D$7a_9Ur|c zHff8tD8JgOlX_YzH!2B}P;@lC-w+DGT3PN8Yec?-IywAcB0FYU2tHRtXh1|Hf5FczpD+dvVzvzO#Q!DVz@6MHuvb4DuiSw(wSf_qrF-R$+~rd947(Q{N< zfo!#b;WA#(f+`p9K+Vnb5tf&0nHDRwMjJ9>nOR9x>7n|ZSR3D7mkw*~%&FN8)Qlg< z=d-yze;W4$|z6B<^!iQiyvr`UCFn%VSi~9<|HJ9L^oUcMMDf(1nA}I z$4>9+9sF-ncbs)kkYBe=+@TwArM85R zky0`+IgM8l#r~9Sk%BT{Xpz2~OUO7qpDk_D@$;9d{fpRb=R#U#^U8YL=OG*tP|;qC zHHj*N$D1D+Zn+%Wn;h!M*mSGH#;u+#>pSZFoIUmhr|c(RMQiPJ$rChySje3&c}%AW zK<;$OF|QFq?sUo1h~9&45Sb-V1;r~UEX^rwE7Am6NZ*(ER;pA5kiM_5mB>pE>H9gh z%A?Xl`hG#9k)?+YPJ;E>nv@=TB@(P$*)ByTC;tCPf(NkcCjUFW-}ZG?km)Q;vRg?? znD}nZyWg$4O@L8-WxUHUH5sa^9ai31(@znI;gFE>*F$UX+_|G6Z#sHuQq$3OO*eE; zlpb1pXS!=glPw+1YC0N@>kuyBNvwW;fOOQPuKwT z>MO;r-ISZVDQjj^g}dnjY(%uyO|@$`#pZ72HQkiKZe}h%C@a>wS?t=)O6c1j5*K4} zHs&A}r1}(*OMBdseQGCf4fIiT-$1$V+BH#o*K4T-%(nxd&%V{o4K_K@w2<4ffb-VI|G_tQRT?(YmZF;B zV)BPZ<1SWP*s6k@&;G9w9UjNd`w2P;Go2P0pJ`fWUNcaT$F+!A<}E>a$qcY%RsI~; ztch)43NZJ3H#esI^#J`OzEiJ zI3scnnwXXGnp%-|)tUEJsH9VP9zw+$%$Gv(=pv)DBI5@x72Oo1k2sw@&bF6+KKnj~ zM*qUEF%h!i@B(ylK3;%HZecQ_1N8Iw`@c3=NfNBCy~605+g4Rzq1N4sE5bz$>bPkL z8kDe?0Y!nios}LU^`E&CrH4rUXRc)Fp*k9KV?D!~kQ&zX_~E?1=S!Gg7a+@iX#N)+b9%A2+p@rD2@=g7b~l@z9;z- zAi_~J>e*yr4p&m$RiD#WdR)K%boVea4la+^~1p6tXtr<-p5GaalqNJ~_lT$iD;I zKn|ONJ8TMa*c9AhQ;@@^;0~LD95w|wY~GEg=aXe`x|pz%=VoLJj5mq1#Fh%xEo%#WkW*}7_Mw3Q9AAmjqR76>O z6{wn@cPA$;gla?SB&VRNbiiNb*rrrSwz{38>cn6uo{qsqyZAH37%H|CDVI=y`J+k- z{Ff0+&?3pbP)0T}&VOGf^YQ)pcw}OOHl`2#q7ST}u#q{u24m|smWdcM=IlmSYv&g+ zkjq;EfA&>!Y!TGZ+jUzW+%8HF9s7tKD~Tg?>?3xpERN9ektH^M(a$&3Q?7=Xzn;3i z74>gQhh$ViCL+2~%8@B69pK21q_i0_V)ZU06;_rIf^MhqRFftxQa4dy9K@Nq!GeSw zy$w+gsz#{XmEeWw1r?$fyb!&hDqw;aq8AifA@Y{9atPeoIi0|+WD!%_(UC@^nrDy_ zltD`H3{rx^Iz&-$oQg^Z98Wiu6}1E_=BxT-f` zT((-A8!#=!y28rbrJcZ&m# z`yCVbM?co*Ol`O|B=J}hP5Yh4M-y8%n=i-rH_qR7C2O4vL%T6P>vwo+XnNxeSCBWu zKi@aW-CSG~$$2-kZ{xWMtTLI}|Ix#&4z?8R8b?L;Ybnvbr-^uHI(gbw2eP(Y_{ z3J@(G0NeIFM|Z-wre~-q60X4|6+g=Zn~|e&Mt;V)9Hin0FXPP!K z^)BJq;O9r8G~-5x%Sr!s@UcAW4ThboQ-~&4g=HH}wT{YDaSEhr|0sr99imDK%u`?? z<970R_wuNZ8K>CWP8=I7-in^kreIAXmccc~YDx&b*_o55G((BdLI*l^^lU2Y{e%#! z@wYm?b#)YIYJnkEMG*>F&Eq)6LnF2|Qe8G~J(%I-?)SPgZY8ry;{}H!PUY4qWu;fD zh_KF`h3JSgS6S&HV3ZJJW|+_hQ(g6U{94_3f}c?_Xc8{hWbD{m*;60>SV*UfFt7|BF{P zY>tk;v$M16nO1#;M!M=-G`3Y=H2&|4Ni@S_eXlV?$8Gx!-vu0;dFLy#YVa?`ChCQ zI_wWgzrwoxcS%>NgMfe|(v2 zNJre5eGaFf>x*l0djQvqliRDai*DJwDiQjX zyFLJ)U?lkJU9%B}oez-QdO$ZDFk=T0+u>7=7?G#M0h8%s0S6`5Wlgy4$hoh>1XrT; z&|f^Z$MiCD1R^W=IE3??7ZE4u!X1Yq<^)~1;}8ru_j=`OPPg4D`ER&1$vT}jw^P^k zG~z=_UDs30@qA+H1w96GfNwzw%^-+^&!DSIr6>Wmek~T&Y4_T^@>1t|SHIbF;L*Q1n}`zO9tqbYp(@+Wo!^2gquQO@dm4Rh zY9`;*oh-?`q8Jw25h<#mup3f^$LNaeC}nF&>HYA_WHD)H@7KK+)m}@7tdiv_S=|@` z50x#W$T3CndN_u)&?3aY#!+aa8&5qFRYF6km`fnd8{BrGAz39fM7Yopp0LauHuK5- z_Q_yE;vv87RvV!_5nQ%#XCnbVHJl`A=u2|lXK&3xukuEUj!ScLp- zE2DJ-g<)@GzZPW$ygS(#o%lMxRotpXlTl*lW>KyK&Nls-42lz2W7) z93Wh|x?h>E*{EN{AE(3%Ux-B7^enB`5zVJGx%FNH7Lrnpm>FQMd9{}SGZS{ZxJ-Co9Ehu!=sL| zNu%SVi|Y>`y0&PS0%tO#^SHP^>kfw3SKacgciFufcy~F_zgL^wT$6ePLMp324*Q+c zpSx$&Ab%76Nk+Qa3{|tE`}>R8z2-7z)3N4B*9E|EQmZ!F=3qp${yvXGR1~zpj)#m+ zhm0Q%8J!Io9u4a$ELxDf)if7UF?TOT@hvJtS=>$4+2m1Q=A0B6)M~`NGFbFLPryomP`mqFkAP2^JzwzVi#G%>e<3N~# z`Dj#nNQ;rgj%@LfI3)2R@4w%$&Tr0@xCv3#gxdlr*{Rim5|UEjn^mHs`=6q~H>-Wc zC}Bl`Zz{31!p>)t#}+cP$m7aZDoO{Kw>kVl>ek}T8M0YxNJ>EoR`8(|bt|+aAdRhJ zYT##1A_A(uj5K{2SM+71=gUyd_r_5gilX;GC%yH2c^v;)e+Xft1Ce}+)ld|xVM}Y@ z7_s7&g4|k|$?}mtXl95ClyoBFQJDXgEB zKJUEgPfTc##)^zjEA(YUBDV}h4WD1rQj|*M&8aOMYZO1QU{N7d<(URKIaiW#Dk>e= zL-MgTJ@1NZhLx?Lpbyfo=6#P7k`ij`w+0CWt{ub!J&YEesr%?}w5$RSm=34>nB2@} zo<#PjvY8BT#8;@Nd;N9v2=1xfKkvrRZUngvc08Jo;RORnS3ydIF4%fxP)MQ0@cOo< zK_bi-fMPEPYef4WA=0M@v3PlMaXxwnvBcK{Ewq%`Ill;ivBO2UW8>R~Jjs$6Fwe;7*{mmXS~@irTAp|{J6TGQd_aMn>ZVlA@C=2f5<_BBwaZOq83`6t-F*BDe047SXq^N~FLQ-i@ z3pJlK*4fsq!1}YtM_($*QBl+fSFi=~&rYVZ>P(q6zl0+A6J2qaHjRf-OT? zT-VRuIIq$ngrT2%R)^sq>1CgR?ZKRA(M$@WI0MPe~yJ5GQ=51ds%2FWbl}~ z6F&IIOm06ynw#Cw-MutRq0Az*1Bz0HMb5S1svz z^KE3?x1%dWADC-~rcZ_Si$v%LQmQz|5*4VF@}2#2d^Ehid8hyBhD~bIZq%nK%fEY7L{nA88l?-VBa|dD z0sY^R`z!?M?hEj3-mRE#a8Mg6`Wi_Eizi#CSxw)~pJ-Cpce{3Ox5omQantE{uZCsk z>Z}}eJN?s-<*;)yco)9yn(K@5`s(7-yOrzXBj4IKSh?O2<*Hi~NrcE>4f*1nRJ#Cq zdYYi@YN10R-^%bdp)}bK z|IYq7KI&clqA|=gaS&k{BG;}s<*goh{CcQV#HmxOrd+L>OEPZdz`h&^m0(m`2w6h1 zyUkR+`^@c%IL(E;g^AnjU7Yo-Vmxv2{8)zr8v&Ih#5c)i;3zjEIUZ1LjS- zqbBvd#?k?K0puk|VYES*S6_98xBb=kf>HbWrgAd}?dVOXcQrH`4^?D~NjqO(y2>8r*b#y(+sOKG0_YFNfFH7Xz4w+hOmbH|%w(13&?rZVI*o zMvsrM-W9tgM0BEItQxlWc{W>`I^^q#wLvWFL$#jyR#)4Q!ak3ZQ1;zCjghIf5ZVJe z(C1fh1qgW|swm4ycFsVqw8i3o9)E8_2Es0@IOags^TZ_Zp)6cfL>82fW0us`Wt58T0EpId`1AwG zuKwJt zO{PnIpuEP!y{BV(omvI*9Pd4if#_yKyou-l#K?Z^$bQT*Gk4Qv%||qii90?L8MA2| zyeyt4caz!6Vz3;4`!QrI=*pMnWdF~6mefQ>5vDb>5YH-Yd}Q0ZK%h6}ifP?3aMtOo zv7z2Nx@>;iroisEu!v@XiX=e6MCl#vh!wn>~v8o*hvwkvh+}>^Xi9fygXdN#TY{E z#xwsB*Z}gIWs6G>@r6xF4+T2kjs{`W+s3I#ex#q7 zl%c87Jdr3p#OSjm!%D{US+l{k^S>+9b~H)0W|uiMnuHi8Ew>aH<4{;9U_8h5Ra$x| z)cLJ>cwTv7RoHW_Q>&PlI!$5}1xak$O19bedavh+}3 zEVA7>T$TIQ-nK5H1h=PJPtO5+-g$NM+z0;ct%&^IOny)c6FDtRlvJd*#7S>SaGqNU zC_ugb*xM#B!-t*4#Z_`xy*>bbU3;wzEd@N_YcEXXuV2uti>>Opd@76{L$C(s4cQ2Irmk*#RW*1MESLD>NTj zK%|f^L{MUgpqmfn=1El!BIV{uv4aRRIHa3cLrlhZKh~WbS%)K>vtLH@$;j{!J=$ww zwL;`L*2pFdqHJ=lJ!SH!TG7h#&7F{A^g2tOM`=}&x7_AUomLC9F6ZC-Hj`4lKl7nN zW0Rl`mG}$`G1}|QRZ+oDD&_nN6>N_`MvoI4*NbYmm7J*y(?$ zlzxVvq1;sOtQ=h5UY(UU-TrC!imFZl4>K5c`or+ghQ%`pmhG!4t#T1nZ;Ka| z9riA|l$sfY-lxg^#cXsBdDtOM&zANz(!{@(OV_s2lbF+N<}5pG zp2wvFjwwlKPW9h0e_4tbY3YFDqq|2<=GIoEY5qQ(?rdEGF?TVaX#sv;lo{|vGqP z7HiuVpWSeO>U=iZ@;f^ao1w6X*M$*t7gN&~Ug=>jWa$8hi$$zT2RK|TC|i3GW7bBC z9XnKMH~Tk~PPxcvduI{<#16)fJ#Kn-B-W~Bo>>I+di0KThxb3c0;Jj|9iCWGL+f2=YBFl=lE zK}YtxkjXqCx+KmTlb|)mp8w`bl^(KrFCS(z!>GaF8!pB<&i?wh&0RvlOu8@Ffdv*j zFtY!+p#@YciPLQ+sM|CjaEGW~wbh-rUilPPjAi4`1<@!$dFhE1eH=fwCr5;Lw~KLS zI(cfdoi;bZm%$fenfcxqRJ5R=bfmiJ4!byyeW@bzG9nM4v76A@(JIAzk*BpAg}ICD35z{9hZ7z6iV24cvtwBIHkqzgYsxe}bns-)1IjmZ zSCtN6L?tgBpnIwr&e}u%HP5@>esj|u!hl@T@h@3Tj$9JGl&mI4E{R@BSFXui$kGAF zRPF!+ye(jgoROqqXwX~p1;n65K{6Q;ne+*B%mtm)5i3$$M6?w_=|7w5{k^4T#j6dd z2O|>5!4n@sM|{k9;v$Yq2QWT_4(6Eg#08b!DZt%F3o~D4^Cvo%UVV&>cInDQoS)Mc z%|mro@|-rK7rxB}k(j(-*i9Af^CDu{U64#+6TcyL7j#Tn$60|Fw3iB7pGylBi!oGX zdV~54l?g@!5tXx5(e_n>Q&!r(iZQCWqV1~~ql%$oSwx8jm#vPX-`rY-_~<;R?&Z9D zIdw0`tihb(|0Qv<5#IiG?ol@op>OWebQF9#sG@pa@YSM<>UqIeiz=$;KC;wY5b|5~ zt3Y~2#KV>lka$7F!+Jp|yddHMJ`hJaUJ&uHq0t3ikn{`6L~w2zH4r*>ru2B$1>8E! zQA9gja;<@+9WMW#Med9yhgOf*EGnpGQNe2#6;!jx)?$MaI(;JfdoP z2HLEZJR5(0`8v>x^80qZWVPL4RB#xYond75-Duibnh`-sv#o3X*|hk{U=tQV8!R^l z@NU79tp(J!ppY#yU@I=uSR}2YWV)P!m^pN2z!fKE4vndJ*b_5nZEknp?;gi6tOL&k zf8yCK&ri5g-}Rx;{&SX_3&erwyCf)}Lk>=iqOG9#Rv?8~f$0pE#+<6<%;$~r_iN3< zraB%W&unv-m{Y0v>JxrTR3qtq4OW>-K9!y!DxV+6|60#)`rAL(@7ZpsplVYQVyTSJ zH6fM~e6ESh1~%hCQ@zJABXHZ#fd(XXubpZu1<%%AUEQ&(%An2U5$Ir2p^s_lp<`Et zG>@{3=-8FU#q^#C9lL77d8A4Y9lL77d6btP+PmyrK@6a^RX*uS+g!rF z$=XdfBwI&;Ehu*vBzG5F?k-5~w)W^ZE)7=@YXR{dn~$~0*RSJw&C%!D93PF~fI1sJ z=~+I}C-kF!01Q)D#KBsJ=qq9t+`?fUCIl5N-*$N=gq|qXe7IcmJ@; z)7bj&dEK;bG@pEaS&scIZm-$=-$PjEotm2P16Z|vg~tt45hfsyJ)ts_VM%&yjsJFUQP6CL zF|!XZ^JRBBe)_&g#~L&ELA4xI_rnqwG=p>&75pqBA(ec?5A9Boeb=4|#lQpr5#aurF?%!SEZkOAF0Fqv78N(T^^ z9b+JY1xN;uF^s?h+fIwc-T8d<)ex7uGo#w_5CRj}b&AqMe{rt>(@V^IkW}&>Brfkk zf_V?@k&?LJ&xC?MQ@V1NtrRU=&1>RazAO!UT`7$RZxY*=`q|W)h6lm=QqLxYpU|S* z!}#v^?w`x~2tA(;#9MFKp4*qax*=iV;w-_0u#QeT2G-}zfh)(r`m9xORg@lL46;>) zAar~*etKShukipo$V4=tI?oT^7q-dA$r3q9D=uV7q$=u^#Hmw~n9qh)-XO$gBXQzI zl2&HJi5JF1yBV2gFB*?NPQE@s_i8Y2y>Sh_;nW+R*@JV`L^CEz%M2Ycx_DdQ_((72 zUH!2{LV#U2^9V@-JD&b3V&`rGE38ByPp99LJhfT)r&v8Xw)v6_qVRXbc<*ICKAU{`qD4^nb%Bo< z#AuYPo7VMTs7a`Lmh6$ByBD~(1<{{0TF)n=$Db~7F7z7$+c6__&bY{sk;uRbcIyjS zI>0kY8F8*Q8W)))RM!H48jU0u6e?^XGF8NpAfjNsh812AQ2;~O=kMp0rC;|^*{}-w z1p#kqbC(!7P{V%y-U~UtY<_9TSt*VLO{lHqiA=}(+BNu0i>?Ihr}{3ffv=R{O|aF+XJc~ zO~KG@Z9kaU|FpKl|6!e_%okZy9Xji8^_pQz#dNg#5c)cHs29W%NmwGYwJ&as;ob!~ z0*({1K-v}3A&-=PiZ{mlx|jDR}29i?rY&|g1N!yefN$4C0;xh(ZL%8pjh zec#i;Zf_l?&aE5CUYu1WC*IqS{7$wFjCnZ6{1T2(u?tMPtA zFMz?vbqm{nHk)iszLQ+>o?{jU3z2?8sf>bz03!W_QiY)QnAt7GE6U>t&{kSyR1ux| z)2vRLu+p*#$$`d~ctCHVJMN{ncFGsQXr33teCA5qQ#bC4;a}UQH^D)y}gEHu0v^afPEN4$`Ui%vkgHI*tCu}C< zMXP@HXmMh}-zZB5Fa%bm12&^-_v_c~_=yb;;v}S}lDY~Q`#1Ck(>>2i2Qcg-oJ^S2 zB2Eb>(`|O^?&J66d{naxuFZi~A|>ojQ78jTD@Kbln9Q`B_{X407ffLp zSV<>~^T+R9TV}Z32Fupd1DU%-!a;X5S^Q$6ef#6*(Ztf^!$pKz<5tQ{y>Uw0JY{;D z7(-Y9_?zN?N^~Vvd|xFv6cj87+VoBndB6Ud0 zYI_zHv_#vSmP8FHb+^y2KR_lDNK}EvqNH})a~76C0EK5Fk#FQ2{^?XG@!WRUR$7Gf z`NNJAz-qnH8A#&FB!1D|AVFZ5Fm@y)L136Lb|fT0ph~pt1_miw+^7&mJGP`=6^W4P z3?9fUN5^Nq(d=BmS*Hk+nA^s@Z0iWJfJvF(+_2b6FFn{>;zOx8Hggk;LU!$yFNP#v z3{cJ4rT z64EPK4oR{crgZz+UOKz#*3{IWA7R;N^RLvk7d}X`h`x=>jqX|9dV5@YIg+`iQQDgH z<#vd&5kenIFSGmfpDN^ZucQP!gm>G%cqN>W5zK*P{H2SK5r|}MtX_G4bG-g8_xN_# z)Oo$vnlOP#sgM)2X7;s4R%tC^C+52*E1j;H^uh zOe4@sx_y`3datv;5!o3>aGce8YJBoC>qgC9Ml4E+{E=2BVU{i;qx1-j(tq$Z9g#PK zO0;j0{Q3JtPH(Zp(z;pq@ZfmTJDK&4hBnrnemow15hml~_vNg*81{}!C2FX~CnwWV z$F$263SL+Kb}<}JO`trK)j0)5MiJLbP}O3}^G5keuV1=#ie{bRKn|1?HXu85E6gUn z!H|m6X7R_1l1haxCHq3tZAb-R`bW9RtJpwvIS@r<5@Miv`I zWNI3P#sFCTpaT$+9XmQXk({FYlPei|m2PAcdj&K)GOzY}!sDrjA#^N%Oc{-C5NjPb zrhd)qB+`N1Ai*|}fG}j5n25B4Q55_Gn36PfDzOiyd^`O%e`ukmw|(KWS-zZ1XK&yy zw?D?fs>hSEypYIA|9^Negy5n_z2WeUO&%Uh&*guZZIc*N^o{ystb8L-JsXSO2y|tg z%yYL*iOhA~r*vP}T-SrrNKF>S5reUq&_NtC7$cQW6ekQxkjf_lw7uJiwQT`ZD?Uro zh}17ptlce{QD_u*vgV9HOZGhb!R=$-YEKxE<{|>k#mhjWvwa~op+f0(BSom@D_xOf zb{&D)HC~Zq3<(h_wG!2o+JB;9;CL{#m2*GiLARHk$jv(z&Bsh*B?NCIaG65v; zyzaNpp77|ZS=wjOW`}UH+Kk`AwTx+ zZ>Eon#SSTLqv|WcRY7pYUupsRuibONO9Ac;LUG_zKgJ|Ehy#W(VjbfP61AbWx*WXD zQ1K1G2DBGMP8S6qYEYTPk0+-|Vgx=)+aYSTx*6a1I>f`O*M#s@G!P}C1tK;MbcpfI z(;bMBbf^m~6VI}2XcZj8e_++?aSV$|_7evg-k?>?t=7facBvpjk@!S=us|s5utuP=ww`Z&UO7UJ8=nyZLvxTwV~o z1g6_xsu)+2PI!e7E};Asg>zjI$q=Rd^biRcG0kaA4hk_kD8%{)UB%#_@PjG#IHv11 zZo6(Z&QoZ<6LO@AuS4p*CPfs9P@ol)P7!E}Ak*QGFh$5h1QA+Y>J+dbZIH<@++;Do zd5yrG9x#lOGzyKOX(S>F_Jk=jt0>Z_4pU}U^4N>YrdqaswL^oiE67`LFdQm%@Dwk) z_{A3;qJ9;OanKU2vBMP?(;VHWi(t!!$qs388~QE1`B^VFp3B&uxcM~mlRT+L;JY!igcE*tzZ zF^*x`R`<8x2VZ*2b?@`)k4~Joe|0=+9LP2S=EOf>iWHNppGve{GWUz`U5o;26%P;k zlfmeH?XgXaoA4S!>X`hsVt~CbvUKweUN&h#uY0pWEfD91>g;HBTQ4K+p1+bQEY8P58h(%$^la%%vE8B6P|M&~+ep zo%+G_BcNA7zxt6XxocQRTP8m#Ol*I6jq}@l^X+(bgGPGv!zYtbw8h=(zf|iR9W@q4 zC#QF_xK?;U&htineSP$_RFi$nqCT*%Z|0BlFU!9c>&-jKI7$Xj0z0}N#=gJ{FirE` z0-T_=ejNQ|%T6}17vBNC&Rt`(^371|WH+P(816!QydF9M4Mx-17MXC7E^OW z+1azi7`2-G7lm1TYe*)4h1%H@Q$M>3SdLQT7)-HwglT0{gsarAtg@*?^9V+W z1~WQE5mNT`{&h619mO`V)E;tHWt%avH>1?AqOvJ;FR&=Iqs+w5)2TM&gs*RG)|b8V z{cW=GXtD_{rC#`B*ndFHEFHBiPym*|rnQ>(A|9?T}lA?CrXB#~48_nva4~ zOO;kOMI%$cvdX6T$Uvz0VJ`16iFj`m+w1It-8Q-bM;E5>bxXwIigi#R9);(+ETAspdf~uK`$Ltic%^9?Y zr|`?bqILI#Uj`Pz;j^*TuLO#!eGe$A1vJ;9eRLRpnTbTd=6lL8bhElq>`X4HY>LB` zxf7ypbp56ar6kGOUjKYBDXY_QZ&sa+CnKbYFdX2q@^5UEsB!ftW$(OMq|VSuS$aNF zpk*?-76}kR?v%nKEGTZCQVn(ZF2BpPpLLlB#*$`>i_aO{%Lwe|AO%sVwUanHwR<;<&GmW-x7^@H=c`TovRd6(#sLd*9inZyUda7f zDh}^ae*(`Q&i~@x74SNU%mcJKUH%`+4uFkYtLFw#Tn2odWL9OfHzyKQp4QM|l*Bn8 z{vQzrA*P2FV%UkFnxje7Q*o6^7%5;v!LO5ug+WN7xH1W2wUm%)Zvt3*zCoq+4t@kQ z$O%{z_yMnt{eC-Hd|9kj&>lF^3PABOpRTXXx9M)2A<9|BK9|ZQ(W=)3u<35MZq{Jp zd+#M78-OIy)_?e(Zr2&@qrZCY6MNfbdTC}uKB*}XOeGwq5`w9O!xRPKO%e`M^z2mv zH?CZbqeXx5aJzU^Iz=7!IRObZl$|}TACIQ2Dn^0 zQmj_J6aks!6@hK`YI*bcZQo{dr`e#gDRip#-d|l1m4Y=b`S|DFv6cWyMkKlWsP?nt z&EQkmbZPH+dbQ?io{%P}?_B#^;!6k-CEn_LNRR4GrWt##At4|7gna1#p+~+G@@YXe zjJZ$=y+^cc|Cq^ByJx+6aLy&zwm_94>)yFlHDpjbyZ4t~-iQldtmK#?=%KP0-nIM7 zJTO1dU>KPqOCFk1dP7gY^7jnk;r26-rBTWOFt1Dk`W&y1fnDizK-5fhXiB_TFUB9t zL$-fEkB?0q-!31tGX3qz?bC7_ukU+nR})KK+J-FS6K)xwkY#+rE#niij87<(%>)Vj zmr8!I8Cq%xqmNPE6l`jQ}hzn-rn^2I5#D;NIKj^dpwYR)i_tR?qeYR|WO!}2b zX1z*-PrwSNC@e9wFadMG3}TXi?(;zK$q`BmQa(9CX#sm{H=&>mNr2J$C4Kv036IO~ z5e`<-6AmiL3uChc%f8&G+v#@kmp*M7x>Ty{wQ^2WSnXuBR(>Jdh}GRsaObE+Hpic~ zSfD(oyun$S`2|b94LW8>O$aX2J7YEx-$o?237XR3%gA$4klkn&;2}OrV zK$fnW-T46fOV7;nod@^B#A(i7NJ}U_M#A4SOXxi_)WI2+l#W)&{OA&jJCUGvMIS?o z0hs_;t?uEfTHI`v8@wjo@%Z#)80OW;OlW=yi|3M%S4EPrcrFQfRU{x3U)^g~XDgqh z2Vo{ei~m8(FYH@?APqK_#vlP%-AhWL1wB7YTG3^}@wGcqMC_VQ$h$e=&#xuq-JI~} z*AjYuEs6OBM83!gsNIyQ-{_L9WB3fO0PBiGJa^*vKM|CKQtt)68dHA-0?;c z^vggW5LdK6W@})hUa~tsVC88^b<_iMu=2{L*plYvBF_tFNsSY05jaa~oLC_y+j?=k zm~R#!dHm5*M}0hkPBd4Ta0E^?7Z_PJG&yLP2d49@I9W zptcE^Y5ico&V(XdB$4qdoglRDLEEW4<60L_g zrF%0DU3%Oc@76a9K!X^zE0EuYhX-$`e=Z-dzn#w?-paafP2IOp_pPe?c4C#E3AhXG zP;hotYwj4Gt=Og&PJnatXn&JD_E7LxqPE1<{wBbtH?+TrHpR9J06rC7?QbGL4*0*= z(&&YO(c{o>c3&&Ilq_!>qEH^iB_Ux#0yo|b3h$K+=JWCvWCptwh@SQtZ6t`{7Qk@d zyrf~l5r!bfSO8=ErN(&eJ7&96(YF)eKT7<2iS5xJyJ%gL_1zNUdfAS z_2>N#tYWIEAe;1sI@kh;02Q3`SYqHuotOF#^!(9jUfGv zApH&Xa;^IWabkTyiI00PTdT}RNg6_*fJDl-; z^2#I-umFT`-8w__TS^)A>odPQJXlD&VyWLs5I|^c)H<@fm_hrX5e_!YQypPIr-->w zzlzGH+NaiEZWJ}D$+q_CxOIIGPUtr#qBO_&mBx)K%~3^mGMG$f)kQg(jz`t7JegHz zy;1*-Kf6|aq8_;M)VKNSgWpP3EdL%JoKD7!5e z8};Y#V0Jc`^qWKTXV4_6&tyQ@MulVaI~nRX2!A>~l+oM-{rVabf7V~ z(BVG=9U@%E@DnM$`zBJuQ9$55?Y;-8LlYHI$7a$gATu_P61#4|GT{?WE+9J$(4-#e z8Iulps$I$!H*IfSWChUe&wJ{^x9nRUxsWpnG96%4yNW$`V>>@^p*}uY&+m2wxN)le zz(Am&_as445%7RTMIb7h`c)z`3PBg4V5V+@l&wNAQ#V0c1tFNJn;;dcXpL&3hNytL zLonz@)gKxPT4Z#KXZ#kY2XsYFA%D7?4ej2y_QilIhX=jcY%(~yoR!u2xIZ`p@Qwx6lP;-5M{Vp6rYbB{UJVD+8MV!8!OM4*ykDBt=#e>i zn~pN+c{{X9r(AjtPtI31_)%vEg_~WCdgta7^R(XR_>Ah)z+gd6hP~4%)uvbT)Ql;Q zo~xUb7rntm4$}^up18Xl9ZkyKd$k8t1V+X;N{`>K_g#>{wK;(dBhbhLu z;k;P&d2QJUU}+GSOcoE4FO%uHiO3*8^t~j3h5)AWVfA1MGZ5rH&cEvFFYxd72$^ap zDGt0ue!E7tl6>Q=u zZ1vPo{i=MYZ=c6OMmE`5$e!oP$R;}r5wksf?`{PwzXG#;^;Pfw=J<9o_xN3G`#Q>U zv|CW0t5;G`IRg-Yl~Q_q)u}cblBc!4-V-=sB*m(44SlAc+mG;hYw; z{*-(>o@1Y`KBwo~_BK#gA8XkvJIN9+di1>7M3oU`Q(i19ZJsx%;gOW^(+l;wJn5OH+!Udf`se$&Cfj{IZ^#+zpM zS(aAY&F-^A0}+|P%YE{1BByxu^peJ>Ew^~5Hg)(YIxB=r3VM`C6ZCe6^dTb4^Nv>K zSwZ&Wd(1XApS*OIS%WJXU1$=+NN4=v_*st@@eIa0=68~B!(oJHh*F_fd+ zaVK;QRpGd<*6AqRDsFd@lGG*Tv1C({x}?H}bzuhg-HhqgRt4sBCyWyw2Y{vZ>Q6=g zXfiHkx{WL&>J2U6=bIk!sPZC3HdgM?$!hJl>U2HpJKh=(k~Cke@A38+++V3`ItE*i z=-3^^x9Qj&m?ExF!9!5lRCD0KVE^cWht9yG%BI-Bb&v^6p=-j^=5ck$(e5X`vpH5k zn_0s7ppdcUncN^upvz4uhax4Ny(K%vJL>h&EdA#f3`jCK+D4& zRa4T5rZ#4X`au-EjToYS&{9UUlx^-N`?`{NA3Vgk$A)huaRGOLPRRi}1qbLo+(v#b zmk>39j8B%tQati|N;b+VkNlpJ!$67-10B3Sp6A)2xH)EBou*l35{&bsk*CbMI!$Th zh`?jb0MW=ZbaiN#jL~7Uj}F2wBVtQaYQ%F8F4l{i<+bs-fcnm%P0gWAbN^txW&!H9 zjt!W?FXMX+_r9kgC$1l1;Lwgn{mLtws{6N?j+57SMp4ua)5T=uW{8jBEjLKBDz6hw zE9;Nam=)i!d>nqwi6sSzv&_DG0Ai4G(dWi-Z82Aey&DJN@~H^^6xsGQq8Z=G;gZb|6=8B=8ufJkwEj+dxc48&nBWaVjkfE;#sAYI!M&@Ln-n{E?F$#F2{FUc*(3NL=)blJfr}v znDV@D@B=~+i!6>jAS3cZo5WzMJ~;E5C0Nk+7uS+URhOjXRP7=6#YxCWOOyp@KK*$8 zZ7UD{d^Dd$z8B&%vf9hI)m}zcdl?WMs)OB;jDEN)qMwrI(STBl29)NUa3teb_TH=d zL4;$@2}d$MPJy9Zec7$~?XJG@JaVdX;JwLnV0BkPZpTYscv z{gG1mar{ACQjSKXFLGm4k|@JY!!Kh`6yXDCe}fyNk@dt(4waFAO~(CeGV-sn0}>|O&uCf!y?Wqo7&f- z@P~N|DmYCY_%*|}(RbljUfC2|mZ+#~s*_jXi$FfjxbP|?iA%Lo5De z>ywd=IRk;frlwOg-*Df6jC=z!kb`Zu>9#ruMQF>o!+A>KcTzYN?h1C(N9}V_@x>tT z&Mef6VKgviA-H5TBgtqcbbYSFHJ>CA-yK4>iH_e4Qrz7pSJ*k<1yU+xpj1E?(&@L= zpM!fX(cLEYY?J?LzS$FZTjkQmM4aRxr-c+w{pOoe&$8L`)0oj|%-}RidVjf(U54s| z3o|J~XbRBzKg%;#5g%O2OtD+joJ*N=k}~I9%A6C<1KsoA?i#BEl3d$G79}aL!>(_v zQCIAWW88qv4wkgMy2tUO*Y6Khfa2cpjZLa}+Qy>w4NGGI7_q)Fsl$W*$MTK*cX*(z zOM9c4dd6h>hW|J`AS>SK8OAV3M$b>kdAVz5>C{-B=To`GD} z)tXZ*f;2>Nh-pl{mIMRC5BCVgCdaE|qquSgiKn%e4paLq;4a7XdTsAwY=26s!{br{ zm?@hgxp7h?`fV6Yv2I>Z%uyRkptX)VMMDuGJyU}z{{B_R-Lr3G(X1n_9Kw{-WOLDc z4QQH2r`k9DQi9|TcU-8_0_!Ks+uOxWYkbNsd$8~8B}_Efm73Afr5gAusZ7EmRH9Au zkl7aJ6p{*Gr~Ek<;L|=U(0uSo<2)8 zf(SrO7xu^Cmz6{@_$=t$6G`Tl*isVJva8eHOqYRBOqWTj_*6ahG98?bFyaZmOQ4H~ zW$yz#ZJvY}4W07Gr%3;TnTpPo6!-|NeAC{=P>ul` z1lE-ba8OB<@aas4y(4TSWXm<3^#&8{+*zsFq<3LfD@fTKuEt}0H3j38^^RwQ553uV zQcZe;Ayh|&qHGtd!IA0>l{?$?qIWf_%F|Q5H=!;XT%P05aKPu~?Chi3Mf(VR0VbuU z9Cws7vq^6sGRy)38Ru- z;hUxk5g0!8B#`SIYzT5J=&J%?hkBnB5Fbfqb*492P5-F(zU-@EO4z~i>sNZtkH%vS zr=iI(pb&`^rPh>BXh0po$hM&Iz@&FF!@>xLtqV0|E2q+kWfLNh)k9F<^L)YtvM>fj zqzfCUATGerSr?y=r@g^3y@?ao3kc3smwbd&O3(&F&270s8nPfQ*t{E9LoH0o24t5c z#@P=9_y@iuWiJ*=qKPqE@ez_4ob$8U8_J)Y%1A*Vn z9KcH=0R~M+W$&2KK8SXY%Kn5NZOVZ=J1WZ){36po&jugxWT7p;%$ZHbV|}TBZiKR` zX<7C)ia;?&Lou6QSH7cjNja=xg`jBC^rN#^B{B<-qt@@LJJnX#_IzLctAP+ph z>|&eA@4D1vH?O+Dl(CyGF`4|L3*20O&qb!lbIk#Vh^6e7g9vPtO_v;q?=g?xal%f_ zd&Sw2u^TSR1KTmX;8!)$Q$Q!_+DOI zN8{hH3=bui$yFK2&t)r9y(^jUmsS@&z3O3Mr(Ww9AJW7kxphO_|5y*VU;3^=k?QS` zXXoT{GV19gfsO)4YJPk{1XvJa_GGL#BNryGe&TVmmnGlORBxWjrTx_VAhVq9L==J9 zb~h9AeQh&?dOja|tXD@C+pRR+Zre%I)j%&yoW_(jmS;r2nOE3~%^eq}$g|<0w~+03 zZq}f&-4T_r-G&*_5yen^>Zg6oFN#2751Hp>Z>U!Sc4|C+ulFO`vQM}erDm7Vkujm3!DCMq-%bcMvnq`dMIfEe6Dl>>4% zB%r`MV=~Y^;coL7e9^ z7`IK-fIMszxKN&%atr3dej4;M)=}F7Z3f8L0af+wb=k;1S35MssLz zATHTXvr7$}aFrcPzCfR3{5d>E4h`7346_FE6wT!NO^@XcNSbXl zMT#>^1rQy_a%e8&A_>?m#jnpVP6iXA2SdnWV+Nw~SaC@>WwblT3>Ec7vCMS7P(3Nj zX5&*yQJj6OW;$?+x=yg^$p^*eT%KRNA7~0rPohEJ>h-uBN`iKz&oj3FL0vNg^&D;e z6X@ftM@<6&!tZm*j7z{A&!!p^WKIc?j)v%p@MS++EK%S&Z8?}#*rK8ATy8!!YdVym zbAGOLI}Eaf?sRfICafD`YZACW8p<`(4+2uQVd=6k$yj}t-pzD$QC&z(N2cGP(%FWk zlbwWVE#I(oSr`Sv7S_q$OoDf4iw)hY3c`#P0Oc!l13og#s%2p)*nFC-nj8ln0<2)^ zUp4%UjgXIwwMg8Wtevn$u-savpU}|-oLiHFHlrh4_%>5URzI+FNF z;b(IJ%1g~@{9-&D$i@}Wx`cij@oNA3Qcm#`gKUi0W6CEA6-n5)4Mf1?mb^2kcp9{6r(3FYciFT=0HP3jF3E5bT-PWW|P5rH9a59&eY+WmFEWT zQ-NWoj>ktwzHQYV)CvjQ;bw^aH3;&dmDF2D6E^@pxv63IQWS}s%SorKUStTUut-I% zkdaY(C|4yml&3g;xm=Qf>WvT(FbwH2aUF==$Nh@m$U=wuY@9Cqw2qT8N|clD9^w>% zb9{c$n<%j^?j>F{DpON47(Z9#jI|(E@vYeQs8667&ym2BXI>X zk*fIcU&_io=#N*x-&kX1M%wg)Z4 zD7(Hsu$U5qsL-xlAcj}1E?{D>oMm&tS5nXCqOX(}UXD(QG!^`-rc?|)0ZsYGi?g0a zjRpU3^pP|j5k&De1&#`cH{}(O@g^rk;>j`c!7~vVug)+RUp7Zf=G2#18YhAXR%h3= zL%40@>6CcoOs~gBwM^rq>7YN*ECm{x9$(HXJT7#w++2&<<%J#Bia1IKD=by$yMhy6 z8CwEG6S6}6dZtE!vu>b#0K|_ymjMO|JLVb*PefTR`zvg=<$h!Hz03UK1bM#8`zBOu zSzpub7S7jp)nH)l*qZ!ngon0K$k|u(d4qcmsDv@E5Y7{#V!HHS4*8>gIUL|2mvsxw zJKdrY3$c9iz8d%5b0K=_pX9`j;`Rx+N?@k-n%;D|-=(x%EN51a~){y20> zj0QR4*$x76=Iq5F&RAVNa_$saEaHA*W$n%~I@)CCiyFpo=EQ{V=9`PjV0zx042%po zX_l~Iz$MTqW}^{UK_Xxk6ud9b(J>J>A>7`5c?(rdah~uLIl`0BSHTESfJVXMrcfsJ zl{t+^-WsNLxMy`ah=3F!Xp5-d&+HJW}=eOaMvhrmN@Muo^so+nd9v8 z$Q^IdEOFWmJmq%faa2c_r%Ygjo(BC=)t#aG`Hhw{VD%c?k?_nKEfzG(9EL>r${ltj z_tap_NbL5&SS}zg<63E*_)ML0c>zmux6djR?&QkzQm!AbkQPpb)3IBcIi-V%Bnw!n z+xW0|F_`kc-NDNX8gE(FfV(&ji5oSFoP|$4#m>4H%?fupl3o5pg0| zEYiaEe$zL0!RlFX4bj5N}2zTI5Kj|1zi87AJCE5`$x z(uEO;ra`?#xfc>V?Id~0^lbb=>-XcF&vJS-p7eD-?B`%SA#pv zf!o?(eG)oE^iwe$XSAg{viNazGU=TvZ-z?fdp^Wgrx)dDT9UyM?8ta{aW-fQtpK{l zqxa>r{ z$V(cGsqmIM3~I8aioJ9Kv}%#N*+moza-$Pjai|r$AzImDvXPESM5G5q*OIc1P+^p8Qi<{n+F( z>dnn`2)EoVvNT%?1yfiQV{8E;t&?FnJ3e#IW(JqwiDX{%r3l9XeuJ0MbXMwXDFKxQ zis3+W=~yquo-$^~s9rIMOclR8E3oAkMsWz!9RJn;Wav*pao?}phgnR6wzr*GH9@l3A(u8=uEG9Y}Q9RFS}yVZ;L=J}!e20d_R; ziH4e>AONxXsd_pC*ZjO3f^dpVP6QBfr^E44*<5ef5bSJxWe0>ep2@5Fms6Uw&;`{| zsSFQ^5CqZz@&_Zu1|QSanVNj{2nnH2&<@8`B*%INVrw8tO%K!meL3hiO=i{cJstOE zzyi_66_nYi9zjXtmP%RnZ%=B2b7)Q0FOiz~Jgv#BQ<`i7 zH9|ADC7hzf*Y0!yBPh|{kn#;Zi7$);OTtL(klHZ9c}1nutg6xF>8YL*zC*%T8l}a8 zm7MfO1Co;wmvC&n$T~K6>*g(Jw5XfWBtpFkFKCGGr304 z7*LigXpC((6EvFdYl6nKp6?18&0wsc(R8~_&}h193L4GWJc33%7>za13>-@ku4=rD|Gg{vxzRzAxd5mBk+1h;#4C!nv zudn6|p$EAdACJf9+Al_rN^*Oh1}~C#gY!H{Vc^R>TG;9^pZOuK0LdezOVIx(Jux>)W8WGj85d0g<9in z#uETIwqi}0kJO$m-m2ULU@`R?b|y|I=i}-0qpuCYYw1j>mhQ7UTqLJ8T7 z3jG*(+9u3%_M7dL_qoMR>zn{OcbeZ(S))b0ak7n%8_1~%3O41md{aQU_5t+LR3V* zn%{pYd-QRoOmT=s2;jK>$KZ6@yV8eCHTxfz?@NusC5R`Gqx{CW3XA7*1y*MBo9e63 z7P4IwHkYfe!df<0T*bDmskXvMNxIl^2Ps&-QCS5x(@|Kl8G6-KY<#Y=DrE&$RmH1Y zMHO2vN8QaPSaS6 zF|twx&=Z7IP&NED(zsSe^kI;?1+M9EQ7>dNIMOl#}Nh;=*4ChwEi$_xh-x&1Ge;hZBW~`r8a~nuT&eq&om=wslsXeT2l?~sc_5Lw%Ad&6UR7`p{83Ry@bP$ zM2&xtY;mbgQmOJsIYcdvE^vhBweu)Ut~rT0Wx1Oj+HAJX=KI+|(%qYAkDQ|5|6Jc1z;jnk!YmnT4U&nn$ zFypf(5LD4^v`_RTS|^+8xGI2%lKfC-R^vZ52M zj>FdmSiw1MJHAE2OUmJJd^XU9sarT!oYi#DhnrX_(`x-)3{K@D>A{4x2~5f%hBL|I zJgzO2H9-inddWmnc=*-{E4u2DA5$3COD6OU93Afa0gZe-E{#Eb01D?(PmxDG4G^Hn z8}%+{gW=^=0X8ic06uz0C{>L$Yf7DbCY1$nWF?jb2Bd9E>P&F%e#qHixFA@OvEs^{ zd@c>kof4Nh25V7U=-O+!6P_MV^reshR$?Vg8V0mDE3zW7!kx2@@Vec%%MM$~TXDY< zn^{?x^^`5N>$oCn`CNik)Z1c$pEzigaVPhpUdnK(oqttR6 zj1^m-+2wGcCAT09*V&BSf`R^~EVcT*!Bh(>09TEFll%IqVLlc+MGgD0%wOynkfqz| zI2L5;FkYa#is){X^Xp7Qr=cItgn#CzlPg%oG@XT|t}PMrn|M`blTkztBaE`~dQY!`^AbUJ--*T_`1yScmTGU#z0%|ES|;jU^*U+mCHVlfr#G?dlTgb-h`315j8 zf{ilH;O71c+<+F57V6lNsX48!hw{vBtB)Th1HDt%X=4o(LMDE~Wb(2kXQXzy|D5jj)aps|!S^ zfOMBx*&r)4W!~yQ_W0q-A=jpZsz9klMIBIVmT~CL9+TA<$&H;>Of1t0PYsh!cq^ zwKvld}99OVpt3A7qEPzk&JDod#$IufSD4qR%%y!(JXN^Q)IcY=~+CZjr`sI>UByUsmB zQJu;yY;GO8Q&vPG&a}V}G`2yvO!-qXtz8WF0BKHoAH3u(4*SYwcYuhtxo!mSRF^4P z3e}HUo?DyRA7C^zs2#98w>FHlJRW~gSi}aZ0r4!1sbprVNb4J~Q@-~xFBtaD5&MUM z;Q1s6DgY&z?3oIWsS9!}aKpN0lxc#x20F(zHV#cL3+PH8*9?v0TDBX^l|Hg)fpWIt zghZFuf+EJXY$qfl6*k3oQ5t&6I9ZT+%Q;P&`f4yK9hFbXTPlx3mc=82MD=`*Hbk?K z2M}l$voX*^iaDTLq)>WAx%=%6=J#FQpvp|!zL2NyRCv7%H*KnqTYNJ9KHo|Yz{fgC1QmGr@= zIvJKk2!Pmq+UxhpI|fG1qdLKH!wi>9VEJ{VmP3(&qd@=U!C_LK$Hf_mTflIB;C{p4 z28MFnJ2{c)k7PA5+{+N!QtuO7R2b{>xF<<9jJXLVi77ErFoEE=U&!-1DBqVxS1e4) zhjL)l{4wSdS^;REmObvZl3|u()*1mORk=#tpyNN~K*`JT%p@-E;O__*gQPPrI^9a> z8zu?G-ieoN1SU=uPl#?yFr&O^YzfqIP@VpCcVwhw!1){}XY!hW5P z-_w1aVoiyq&a5m1*x=L_Sb{PvKzHTj^P4Vd7V>K@w#ALBOEw*CDdzSA!PYvQ6J~?2 zcM^Mw_!Ru*d=_k&yy2vl&G9BQIvOapjXVkz?U}P|$K61MLWTB5<1L;%Knu&_%TAFe zsj(|fx)u7T4U-9U1G4nis{*Jr$n?5Ipz?V-z8qGyki!w>yT;%JWz+o=;p;V+H`dXy zkOqc4LvBV$M#BJ1s8B!*7v=FxdGy#vU(i#d;VmB8%=$4CSTyMp8UlmIO=XV6MUKfK zEXKunbgCf&>>^|aybLp*PJz&biCkQY`p?sgFla0@P7lVDs^qsuARe7@Ia-1O81Z#>< zHV3Br#MVC&F$>HY|=9jJqa zLz`_~rXyU=Nv{#PrqCt65aURk%_c^Z7=$_l<2KhHHY+@(3~&-&?0MS>Zv#`oeNZOJ znuVlEvT6t)D|q5r5y|H=#86jdIb*RY6p^5obk^%%jKS+qGp``c;w6n(APE#oqSr8P5q&W+ zUXnoO)kO**DV#|R(1m1zJ)NO;livYwkIeMhXEcYJm z#+Y+)rKqAaa`_7btT~q3th}hL&LXepyYh&}XN{pj1NHETfs^StbPKo0zUP78oDeUR zV8fG{geB@Nf)k}PnYm&NhHW~(K0x^7O5WuPSU$*oC7ULYH+3 zqNaNTZ06{o6PwS7R#uyP?uuGACt5RB#zR?)dVcd+6IR6&?3%ai#JXmmu~63nq!2pa z@%znLzE8u>+T(GqS@+EAmsMs266@L_czJCb7Kizp zF&J|c78xsbZN>uREbC?5U@R}Z6}YvS-a=Ky6ZI@W1x2mAF^;IE4j)euv{rP+m71zP zd%6JQJk%>RMwYZya)uVQ*L22a*W?P_j~lC2_-Zsp7q`}Oh8OOr>WmLz=Htl#;sEXz z4`N(A?_5HB9%Sn*LR6RT8b2PjIl?4D4c)=i0}nET5U!*(Pe%v1y~gHI5ag+}g(4ylrN7w!5YX+4ktO zsEhoi+%DEO(6FhqtHQNN_5)^B2SXeTJ6vo6>GdmRSl75a6D(0$Jf-B(=sdK!UO9B( zE3dUISe=?24g@DxV8a>9X>XEpV9ikmWND9M*9%0HHIB zPYPta%Aa8nH_BGC`lvj4u3Q*TSiS-B%x1aDV9r{p8Jxt;5*N@5Tfss)%iIR) ztjnhHC>y5_*wZb=+~9;Y(ExY0J`A$eh(7sZIi;|mpT_4$gOXc70Slqt*tZLvG{ zZu+=h-hX|i9rglXNB{^3*6gsTOrkM7x3l$PvwB)zFE;NcIyGEf%RW~3uQcq`JM647 z2{!D!GKsy1{eJQN6-F#~6kUXBz$jNTKw!ia0b?F3<2ai-+}gwY`_-Sfi<_^Dqtyx! z&ztU5RdkBeQ++q(a5qiL))Bh{p0fS`@4tR`S->8-39#TuQ|AvfH1#SV0kvbzuB^rtd@j|r`yM~ z)$NUJQtoSpkF}U7(6Nd5v5Dx|fF9u>(m&{|EB(aQbsH|`H|@JhHC}5M=&*q7?ep^f z1{d&r^?9?U>F(>@vUS(1^#U>I#cI=aBQ!DqiBJO>NcO-a>}JGtcY$h>HX|n3i#68l*W@(&RANn>UC9qLs-u8`_IDerK|HVqRwgW1fm0t-!VuD-H zOwS)47WX%2t3MX&nOuZjZBHNP+ei}!HsG#%dR)p3iL6@?@NBiZeOx}A+|IwM!O9bf z_8?}o1kNByH$YHSCSidfA%Fo}qJvofAbmUH;TT`=JeW0l&%_NQlmWJN;)r13AHU&JkfwaGi5Rm=hud z5hk61oB#*}bl2;}{ISb17z~a+ecC}C;c6fr&%H!lPK%v$qAsU{4YEfwd^*@5=%wKo zv;ZJ(JxKHqS^y9w9tiz|764cSoNDj>X8I`ar|JBU#Z7Rr56i+WtC0I{FHv>l}*X~ zjD8iBP0{j>7Ju$q*=MfWK(AWVWMd&atZa&{T4YueNKvzDky%X;c9~U+%xWUtN2?Z@ z)x_(bRxL8C3AQO_)grT+p!fc|csyR+uGZb44JMmJ7&4@Oh>B1j419JFT3)Xg*N^hs z$HmENeRBJ>yxGm@wp?$V6IQ)zY7RPh4zbtT9!?chm^8ycA7^~_QKN|>h$@pXXhI3f zO#)U!T~{|9*O@Wm>I(jfSFYN%*nc=<15Q9)%I-M0H(T4e{%s4kQBB{-rr+JoA2xIk zn+|EHQ4>la+ni6Nsp&)@Ev-|HDZB<6mIi1S~+5X}} z4t4Qr7kFnPus(PBOV2U#wnDHF6fL?C>dSQ8K+P(qEL|X z(N}y%n-9|J<>qL)x?5byjb49$^Kbw8X)yTrPf9owYHy61a3%!5Cz~SSjQSN9;9}v)srXWe>()Jdd(F)3;rl#ahz#dcafovHz|KuP9v*j0-MG7X;$~b(`z??P5C^?M-!>5qZgNLC8aJ za$68|2~KVc0t>Lj+9(=Xj$OQ!a)VUfC{>R3N8~Y2%Uqa-;WkU2wyA>XTuyr0 zxdEt&_?1}lA|mn+Nck_abo1?UBk`J7&j0#YYPkGEcBWydE6*#?4&BUw@L0t07zvfp zPm=H$36+b8D431pQu`|Uri_vuzKDme;zOsh0= z0Ek~v$W}yIWfE-j^2#LG<`Fj*wW)T_RpxxX^PJgQ_Ca2JfbXb0>wOq#Q@jF<2p+#b zEc8$DQq7KD>^~OYme;q7cfHS>N3~WoqPH{I*N!`K$EhaqZNbI21&MD95a0e_G+B@| zRVBJ@-rKO-_Pq@c4{jD;=Ca@Za`Ujb-z-%2(c;_ukL7BO+Xm8FkBP$Kuf_F~=MuEM z_7nso-H4Ws2rNsG+N7nSjY$f&T|!g$_-cVVnsOxfO?JC6Qq3wv{FssG6@r*;U)9y; zPInZqCYSK;;ZcuGUr)lG82Fv+x~?2rVmtgJ9=lVV$Z~%B4x}&jnj1Bc%{v%RshG7F z93>dMkuJp&0fXYE<;hHbbW%yYWW6D;)8zF!DIzhKkgzgx`aU)%8`tMp1_ zI&roIEd5enx14x>0Rrg`U_PS#HL1jZp^S^mr%4c5a6x22f=F~OA^K3Hl}Q*GS3#UP z_;GAqql@MB@AJPF?HkJ~b=lb2QZD4+ET zkqA}&iYuG?!PGr0by3+=E11bOJlkoW<<>)!1dQ)8)-fj(s?K&2mK|a4H9=FJG!nt1 z9||2>62W6+Z923hf-f?yR8zOd^CS_Z0J;7)e|&emx_emNEBaSK7Y2Vf<0F&^nvUD~ z-RGP6TX`ifzkHYXR_}}4@8N2G^EPOVc589tGjo1tN&60@%hu^x7+3C zcc*hD7G8Z>-Y)FzoHZ?XA=?mEnL}7*hOmMmHpjMeWJJl~)7Z8{LxE+jaN5CGjN6EL z#dL6yy~_Qc5r+uQDL*yuAO}fCCg|Ws;7>*-=uJrAPevx_(?@p}8JVEJ+OH{=%<10E zIpspqVsx0KRmh2Q0b3r41o|k?7~IPfbAK)IL1)ndK2ZTpY_8YK2Y}IMDCwxnE!cOx`mcp->UMFpm_O{q!=BoQ2M`XT8jpq$Vmn65Mx8mSRCuhb@#MWOOJ6F} z?S{x@Peo-C0K~o9+v(H8!)pDwxUm!2r~_~D@t3E2SXepL#m(|soARVdoH^LSem{{X zSRoAs@G1KB$!g`jqzvvK?pyKzmNb_`1C^uAzl==h1O7K~A7)Asm2*{_*3LPkQhk&9KbPDwC*p5boJQ;_X0G zCb9iYP3CJQCfHGac<}Z^Z+KZw-{}7j4^&82Nz&kdhX>`w;P{RDqaq_u$~WrI;lbrd zSEIz?!8I7+!TExF@$DZ9=G12R-PPDA$lNM-%u6~S(8eV;sC9TO3FMR2T3%U?s@QW* zwVO#CSk_YgpskFog-{%5WmSw1Si&sFUwp%8IR`Xv{k3P8wO>Yz?_TY*mRQ#|x&4F1 z^=iF?F|&0J4~{-o>is+1V_-+;_w(D;*YVTi!_%YAR;cB6asT!4+u&XqO>LB=d7Nh; z0NrS#O|(MZa<~Dcyx>z}6+D^9`c%yQhsL2-kls|4@hf z6A;3nJwdBC5MV1xSRb7(M-6pO>cjT)w&Nqvxy2FN=ae8kZL^I)wV7I;V~NIZR)5}a zS~jU!8TE||O_M>i@GYC>(bicz(#B>G;6cQT)jjoB-rp>C${qAAlsL^K#s&MTq4jBZ_!a-%@!alQIJ zeOT;XgPoMa77vksKS2=*-;SIH!US1ykP~hKLDq7kJ!2GwAxZ1LoZ2?W=k@`plbQ!b z$_GFYmNO1YwF=*D<~+;)h~y=kEE1<_tgiZ z!TIGmC@hW!!@=xh)$b|qVX6cXM|-F08G_PrK+bon+`8hooHj52`E?p`P!JL1I4B5>6e$D1g0NWe3@^p)mHOWo&=4{Y8gthWTSzkdkYx6MlX4&=`DRG+&GNsW zmJf=~n%=G+x2ZA6{Eyd#`AAMK`hiM@Sm_2#;?ue!IMxEFR`de>|P; z!0rT-E<7y=@fE*l*cdr-LLddB=)xeVOu`(=kkmXX(S~Ow{<++H4 zL#>kW*C2;vuO9bvl}kGrF>uzt=a~56!V~SEkBJuOT7JFnJv`hhor6UD9qSz)T+iX> z_t{F7bReqrs;b(vJ(nIFJF^TqFO-I6x#j?Lilm`gCbTpZQ-=qS>+f9$+L6L!GXXkM zQ;79A2D@jJW*7zoXOyM5V>)GLq+|5y6v=n9ETI*E6v=lb7mtQ`I@P}QJJ5=*@f_mn zZ?${^BEG*=yqyX|*ASK~pa?6QvWuCaG+C$YV#XPPO`Hk4n0cVxhB5WeFN6oDl3FO_ zYN3$SLLpZRg`^h3paCd#I)2(buI?Bp&*ooS96GkLO|N(>zg%SS39jahlToCs3Rw`b zIE)E(vmj!zj`M&Cd-uddvBuUjJq}~K(^^A*O_z5Mw~Le2@^-O{X{yzH9o8m{2~0o( zu-vE)_R#c-JdF5a5+KE`GTgi6<2Ol^&lYk@a$j~#+*AATpm%XG9F)^)Hm+ua*^nYE z7icG5Q6p$*^Qt%11qfob=Re$OL!D*&76ZA{>MF0Afg zbUG>fgK`A%`Qfbw1!U~Q>SR1Q$5**zDGY{}!m})@W%#Zx=X%HVwu{v1PEYqme=osUN}GGIMfX?b2wdc(f{79?)0)I6F2 zFQU~xJsZ<_MQyxtA;&Y?vD$Eky^FzA{{3`09MG7GT9xutJ=CCQjK1uw*v74fzH37^ zuNVS+C2pa4;JAM|r2&H2g4Hq6uT|@Dy-0%bP05(CawwA2ddKhHM{-!}qH&ZxN7s{}6)Bj0~jMmh5KqQQWP z)6>J(_55bhY!Y1Tp2=?A`>mya+FEr{R_%9#FiTS%AycP_FiSJ7=GQ4A%+#;EvMD0W zQhB#ieuU!JMAt&&U7b3_NL{kG4E2^eb%>F=RISw1Pk(wJNIA+lq;-mIh!nM&DB#m6 zvwmqF1(i*i^-Fbd5S=pN@z!^%^=!SoqdT}`SmhSEmhV=FILc`n2Tj{CHK2^P3J>7( zhh_p*KW}`YNB5ydm7666X+DL%d;GRo%O)=oF(^Eu_S!Y{gWbp0BjE)9@walW{fb*# z5?QgkCA)0TT#QsSJ5l>_r>sz5cXm%X_6*dtL37>NOq@7Ijmn@$-wbsm-)=$Un9itm zBnzP4w##Vih$3xPbL6>c_8UY*mZL|_TWKo*#8w^4Md(|^<05M1RPI-QexBd%5;?M3 zuf(Aw#Grwx)UPQ1)gHc>uskMNurc>u^@I4vR_EU7>UMe4B>+OLA{bU&FL(%qyv4er zqgdj#0~zGTr7Cv<8RW)SJ$C{bwzNuOGgB-(Z!q<)fC$0_Pmk zi@9djh4BNok5<4h;|E?ie&B`i123EquZ0PRP>8+Hzp8#=LF74R5uI!Y17W3{FjTXJ z#Sahp0=*iLE82Xorz&JX`E`d^J+B3}$N0Qz9D(P~XGt4=U906d)^_Kz+X!?(IyTHq zhwzafs4e-n{QB)y{(E%l@AJ@2t18n*G8xp3mG{Eb5$O)2zy?T))l=gpVbEMe+Se$s zah&5Q)VLlWX8rtqtHQTA_BQf`Z3pU}Bj2MaaYTA3d@OeH_3OqxECU5dk|fcM#Bq(@ z&}#C5wyKRnrf-hO2gKauu**ArLpx3%JB)JHVMI#|kzUt}|9)CZj`c(mS5Is7H1Re4 zMY0(0bS1@ZOff8Jln6AnfS?)UFJCqf3UQpQS9i3$FUGXG=K1P#hcJG=&^!Bu?f}&M zVR0RI447nTtnmYqfdou~Z*y9iggpeLpNv8#caK6k8ez^40qq;=dlJ2gbTlHvzp5W$ zWfFRCHd_ph8~)H8&($Xl?9AFXBJnu$_*Xv&!sB06Q6K4`d$GP9^u$P)qN6wH-6LI! ziQVuc6}gcPB?yVO`)YChxSrqk*6Y=uyDqI-)z_ilwId}aEY~jkc%`7Z-Hr8HVa@p9 znJ9NKNLcx}NI3A*zQ_EUBh^O~^J^}qvmCdo+a;uLzIAcruh)E~JtBXT=vRFLMUI@# z1NR4th?|PIKTt&eKvC-xDAR}UU*&4=GNxv=4i7G;Wi7Nq1ZH8M#^dwqWc;BzANSSs zg%c`#o$#p86p{TA7Vn^JV!?P9)Jz()S)O+@bmAq0hoR@v0Ah|geA^2(<8GMf_;7JQi_b3&q42a!iPI=O6c84PF>a4cw!5C4boI)m-#7OYROyQFa`Md)=cRqjE z`2r}oX=%Y6wNLDhU{c+PTtMO7i0x@`>85pIn<7#M-AGQ|8PU`p(xWa|()#&Nifs zHZ=&4J=dvUk|vW|MlPRG$|>uVDC?9{)+wDiIElA%8<1BizkHD>cAGH1K4VV=6p0x& zPj_T;9f=%mQtDdRK-)d)l-)XEwn)Ghsh1wkSD$fQFLBC-2Hu&b=7I91WG*p; zqTq{3!kskWi%DEr+Ug1L=gvqNri#9@fA7!l=3ljl8O*!1;Q4%Yv;4ALtT(!-+k1*H z4<0JJqIKauuMzpYMj2n1jMfGHd9>J!TyY~%&nruGm}=Lzy?5Q7ub~XuZuXsKS;meW zIl@HT5hfx>n5c-@Y7}%li40&|{|($`Ren+NfJ}0+*2~XNj|&R|?UHxL z0qWl&xZ>B<>g(-7F2voPJh9iS+gmsqvUSOhJphdxrhJ;@Hyr)Le#22t!W$L_Q2rp8 z1g+w?r}blbzqosa5DvQoGi-G>&9qeqtso7YJDW!2Y#MQA(}`7cN0XB_36 ztj!6_+I>6S|MExKlAU98psvoq1dE0a7vv2FwpGwEpMH=d<{5te%Oip<5uNrGn zjy$eR!tA56tuqO;k1_d@szl4)$ZMfxGh`{6Nih=RXm$Uz(U(q|(u+ddqWh(Rt^f;a zbM@_@-B69;ZL7^1WGvy)O{$Mtl$=8F;U%Mo#$N#&V^W6);4$z9{vIA&jmP~r>W?JCEma-^ zJTB@RgGInv!3n|NA&56>X9J5sunK^VzjeU%jsDp=*dZ)~j&&HhPs_d_*5P1qax(C7 zdn!EU?a~{>Cnkrjm^*C6q>+xf!&Xch>6klg#pJLRbBC>%9JXRKKo|N4VaC{)hpQiH zWfF(@__g|xRVML25EC{dj_%*7T%5!)_H6_ieO{aS_BNyEwwY~jGk$KH>Gn30=e8-f zw<(_6rXyQP45Uu2m9o$>J z9i3)Em6dy)9tn^PurJp%2sI_`nMEh&(Ncs`e~Blp+@8EHTkm@(i zrqY&eUN3JX`rd)%Y^B2k@ZIE*w9uAsdNx)bvEwUaq5`DT>`XNVFKjHvH1U-GunBBw&a(A=Bq1WQaB)&L#;NqD_diNkSLV{u4sn zm?T4S9(QCXe@uX^gluk;@D*R-NXR-j34d0ha9q%xU2qPGbP937IV934#07g(z)EVL zAwW&Mw)F|w)+Zn!Xh>?K{X2?t-x~ulNgrd7KI)FR71dti=RJ-(jmr15LQH`{?oLVBpVN%W7nGKrtfSWeBB$V?uK zF{W6IF^|OsFy4g5VkIG&8BQ&mI>{b<@7_6Wq_kJM%zKh*4f_9)p`l9EF7&?JB%mmHD8Aw zPRN2i0qM`({P)H5X$>#=qU3$IUm3dfB*GVjH6bImM8v-;(n*L;OZbH&2*L%wa7YrB z{1fk4BnhFs)(7tuAU!VbyFnbQczAH$`>i@HN2TMH0M7KPA%1>&U_vIFiOBc?$}5v# z2Z#=vVBWk5$qtiLKR$E1xL@qef64DNFGoSvLkU?A{q4`u#tGTbB)Oi_#r*5ySR&Pq z`)6j9d1pk63)Va@491s`$x4DIE6=|pvd}wNqQ^6IQ`xL;|A1@GtY24i&pOj_cQ;oN z1CB8o0(%6nNh&w1_`Lc9r=F>$*KN>27@Y8Obz~+_4jG z0P8FCL}!q{>ynV9Cjm*%XZVRW$GVe{my!YFDgX_e4*O;zoGZJ^_d9+^qsU#%(RX;rF4Ts|^Nv<7_N3-4lAGcRM ztL<-;O?9EVe2ymN)nIfAYJ+N8$~t|b-+%!zA64gr-%9#Y?druCoK<-CKCdq_SeoD5 zsIxnl^WFKB1qt)eSD+3Gf&^3o1XR4?$>MtHiRw{r{$<5xa6aBmkVH&yyFWp8e}dcn z36jhRkj%)5oG<@s8+`4!JbN0oc4$Ig$*~~GvEZ)*2znhr@YewZMc)wMQu=wddXy(? z{s4f0r^Gqi@;I5T+cEWLSgEOD_)v+USRNu`auz|cJOmhY$)Wu%BMN+ODS~uTg6pIN z>7)ecq~wTjzy6kSMLuD^pm-dD$Kwzbk3&Qlv|1r3YX-ar0Gn;{QHg@oYy!yYr3Dpk zc(oTa_^5tCQD8)fRR42Z4}6LTK>}5wA9T^C($DN8@}eAyMIyky@FfpZi^#h~6rf&2 zs3&<%`0HqrqB{2;W)hkTE;JP+G*yW`ujRMueC_|q;lY>n>JIKm0XqAoYYZwtuKKvr zKb*(08nzGn8I5^tCmJ-IAe%`Mr+l3VJYyCZNl-8q(HckIU5ZOdezh3#dMZ;OZuV#x z`lpV@6}rRXS{ZrO@#SqFr&R5{as?lycK&(=#|1Ey!_Pn!RzCPqgo3 zmU!N-k3^9oL9bJX#&^Sp z!H9%aLTFOFcYC|d6SWz5%}3OW)Qe>4VNsE0J3DG2r)-bMXm^1@iv0ueURfmA5L~b! zNU$MNZGo}Rdu}MP5?;3`K{6(hr5#(Y-@v+g;l-^aK@=oGq~`rArQ1rqqy)Jpi&RI& z#1~HX@=V^c7hVCGAOV@kqAneF1VFDWRFEuGkSuh+zC01yaV5RPA_-Ll_th07R1ulp zE5q5pY;hAWML>^$i-f{X_-Vgx@f5ep0)$skD@af)vi9Ehr8xXU@E#44L<^8aZ=MCt z+YnA?ipZ-y6r?>Af^(o`4K3gr-0Zhz-SJ8H!6)8zB@LkvoSY*KAy{{G97|_nL=qys ztM^y$_9m3J(*b@P0HTv%&v4~ip$=6)209^*6{N9z5c1@ zcz!wR_eOeYLGt8Tq8Nl?Y;{yao`q49tgVUAS+(U*OI2Hm0JGGvT}X;q0Rt!jl4V`s zZg*h|oMERn-!pplRc#U(D{%)Mv69*bCbr14g&>8ge}Y!e1HD1$kLBBb1%R;gdK3ly zZa{)+p#}u;^GJV+W#p48zXqoCT|;T)BLGtp#iab1xs*bqrohg#;ksS=Uk&+tW)P)C zD4N83lm+_vdYvM+Ckul>zq|;k-B|xYUM=&li~nzV|7Eos_4C>-ZL0?~&eC>~j!&MygsZ*izJdbSTq$Qk|lWm%mW(r&DC9 zp&v|nnZX8(XaeV9{k?ZBL4V^XzSZ*`X_M4f4;7_4s1&5ksM8|Tvw;+G>1n1z>+95h z4lh|4(Yr!n#CgYy`Rzh(;PmOsmv&(sKq5WivPI=3TTc@cxm;2=`i)$jLKk!e`QELs zujZbd29M>f-dV|;XihDue()1hcG0smt!xTqc>qj!~-1>Z0J1XqIQZPigLs&*#vU~f5D zdf_U=7%*mM$W;qc&PbZR1}z)%dMl-6GJ4!aOed>|*^6EBS5n!OGw%3>D;RoVI|~wx zP#|SjFi*{!Y-w#I$v?G%p|gTvWm9|wqspdy`UvIcbhr91wLlvf%JTm}H*yv?i)+=r zoX(B%<-0z5TBzn!GTq3~5dh_o0rLz3#Jv7yhpip0YR8bb)nwWD9m-RXMIk?NfupgOJ6eM$Fqv(0|zR{;{EGisicysX#w4UKjxfw)*7d}>267-QmIs*+AHnq%AAx_ z0k#fW`dU(suAEKlU4tbEQbCz%Q;$GCDE&KV^`K%k9?8`UE=!cDGOc(#tvfAXm0_`I z>|?N-_DFd}EwoqE3RNm1(AfGmn!Z1U=Y|i~)f($8(FJ+vB6yy`%b*v6tyvs!(AAQ+(8a^n7dy?WN(e_o*PF5 zccvDifsV0OHjhyU0ubVK{v>fw#p~LSJhK!$-hXPbGA#KFnf)trb)$f(x(S%ai<(jp zDm+p)7zIIy>)hh4$RlG*Ax=HHBn6YrebCM9sOsEsXsdo4uP!kchbYNx-EbtOtw8{O zrz8MvI)9QzZ)OiqpU2DZuuwKC9coomHW5CC%y?vro=1BLlV;GhG^_z8tOsbVF!?%4 zjCjo!6`<&+bE6dKqJpfesphc4pIOG0Wj}mgt@{SbeFDsUt!tFA1SrJXf1&vUOvE3% z`tgiuXPjQ6)7N5R#u5;Pd!1ABf;MEfF9*H9%+Nti-2d3P!dJA_yWcr)YqPrgE+~5X zm)+|Deg_P%SCSzigMwJtPRkl*R70QIf11l!n<0BvE=}P2ud~i&%Qg%K;m;i_yz)A% z>5u}YC(1&JWFZL z(NJ>9<@szT#l>%~@}K`34kfB>9t9ge;>-9`{tVLx*3xG_soWbk!%3|^sTd5{dNgm7 zpD}ppPE9g4MBAoV6r5E1>EWav3tsc0JdKdjifT%?a@$?gSgxRER}p1>HAUHb^sZ&p zyOyDMElWviLWcGASW1$&GjuLyDM{YW(7Bjt+sT0`{^M*u{*Ma&t4CQpjMBHaWO}ou zNx=dM-!pwS7%%$ryg0ob&Yx6Tts9c0RzAU>d3l_KJ1>xv@c8JY|Mz%#^ZjD@a3Vi* zVn1`D@Nm*9E+AIH*Q}Nhv%Tx|X?4P%YRM^slizpTAI-hgn1Nu0nR}p{wiO>TFwN`T z+}zk&M*6@aK(*~X!?5Cvh81TRR-DmPw;86o&BAaG4)?|do-B-W3lNMXxdjMD(%b@; z0cIHDo`H|MVSpJXyUj4!Ev!=1sjbVL4W0fpx{0;uks+%wOZ;r;OWIy$E~?o*IjmX} zYdX0)MW(AJ(8*$Z;}};a#`KvVh`lS)=u9__!54s%p>HGB_}EJ8<~7r*ChK+Yd6$6s zK)iV;=u8*mTjc)g`LN0cv6Tx}JN5dW-tcX8Lq#JuzA6pW&9bR?N0WzR$M=*3u^fGy z&7YKJOtCMmi-t!AW0OuNgB^AB>tQq>D_xAa358qcv&RR04X5L=Vfc}D%q+xZXXaq- zwg3nuUp_sUFIKF=Ylo!AFp%$WSHL*?K@B$(+mb;VB>gf7s~b69VX>T*Qk6z&fJQ0} zp;{;ru~GkM2-QM~Fj*E1bnMD<>$KPgLL*ojn&KS>LL*ojg*xewfsS=WAa%v;eO-h) z(_f8@;Zj4|AaeiJW6RJ(w<#v7IF47Y=gXasuB0bCGiC{~yh@qEn(skEk}`BteYG=f zNrIOg0VK^%$CP^v3SY!cEuouQf}2{RWpcBkDpjQMQI=A|C8^F_0DkChIsRrsf3p;G z(7RQM6;HDivk=1K^co$coE%^zb6u;I%5aaI)lvAmZSZn7y?mTZFwQm8i7%kElVSwg zl5#*AF#gz9XPKfy1W!$+DaA0VO%7o&YSg;0%KcDE;G=bcr)%lDyvboILrw{d=N2FY zhSFuSN$u)bz0#+)o<`O8hQbR6u*!NV-2eqr_b|MOBcqCl3riZ>Bn+WR!mydajHf>( zRmwJO!!N;dFh4@ZGRks7tHKAV^|g5;xZGIFW=btPp;kT`s2+F3dA7K?wQJm>&rf+~* zL=kq$l*B~is<4}@2x~Hn4A)VXQc^~d4TY25=w6OaPKfH?F6*q4P?EU7Gubv4kjX?? zqZ4~Ii51v0F8*0e60>t;oanhTtYVe%?Gn?$nIvXQ%{Zkjtje8jtjg_}-DJ2});V7n zU)YH){-aK&iO3>6X=a2gq+yU6-V2aBnF?+2Hjq7;h9(nNEXSZo>OCbmh}Op#r>!Iud}sEEbn<_Q{ScFhjuszIlNxih z_$Z(Pb8HUpAMVEUQC+3C_r3oOd$Xw$U?6uc!sES$aBogSZVnw9!o6AUq!I4fJYr;T z<}oT`xOQFAdvlnWPzw!Nt#PPIYdGkiwl{kwvI_B)-&$9ut*`5}^+{|-l0<;1vu?Nb zPW?GPy6E(q@6;b#>OelFokc4ZSlh02&KNKFrtVR7&EtVu*7b=1$x#FWA=3;+!XR@6 zJfeiBMhB>&A{pJTk2Y3ywqaM_t)|;%ysatpCi|Y61ST4)R_d)nTUF}6Z4}+A(5~k- zAMsvy&RZ(+7Xk$W)((E{|GMs6U9>L;?<`axWgF~?K!LhpFR4l0K513kRO0YZMFp#o zcZeqy;k+Ou@nRf~hTI7$PLSKi33~ureSie0)dx%-UorS6A!JoFR(l?Aa7cQY6J!`!>#{3^AlE~nWmp3}$E59J z1$_}yW)?(fvIzh;<3;~LPAa6-0l^#cr*6kaOU27cET|mjm5HeQ(yLNR7BeGJY6vMM ziv#0_prN;@YlyOlo9rMOa-ENKoooZW0c}GD3058Cx|#;qRb6SNvbG^op`_wO!aF#0Aq#_0;yC+5EDVr8^MJXtA8tVbgyQM1cy=%1r6 zkkpr%oN^i>i-_X{1+YQ9q|QJs3LfPSvfYY|j?O?8SlyXC`^)=3dUEbZ)tQ~|wd11? z*Oyn_&#iVZmx8VoRy#_j)%&LE{FRDyE&rs`_%=Mhr~}Ni$H(vEi6J5@zD7=bO@q)Z zUk$xQ7Aw(u>E?YW}>pzImU{POAi~4eO_u}C0^}>uMLkwpW!&rX@W~?5+*ony?gE>3z zH2?6(R}itcUNQr9HY6d*Pyfn0gZ71aP1yUTFG9kRUZZnf{^>yqPD50>OmYX+V`%8L#HrU3N3SK$tv}pLc+K0) z(oCR!?0}rKoZ`vlrTI8qd?%^l0xhPmrXmRwtY`qxGc#u_h|LA@apUMEs9hglm^lli z7D1^+Ahn1}K5ov?T!AUOhiSUMiFx`(`Q^-S{+Y9qXb zZUy>}2$-{q?SHA?0i_-ZJ&Btnp_;-H8bS`mxiBJ^hIHR9b)vU&MLClI?o7oO-A#?uApTO)ZA~v>U<50B8epTR_io(!C zh)}!akK^V0$LaWf{Qh<^et$PyEMX+$>2jf>d|lB$Ef9|v?fZx2lMO`GRb~vEMDl@J z1cxKw6Tq~lB9VCtlB?TBm#!h2<_jOcfrKEDycYMOoZ0|h2TDkQz0-9i0}3L~-9;;WP?PzNMH2Q<4YeRDbd zws=1neuLa(^?6T_gq~5sZLK!ckZ!ut%+w&*3lN=nLN8YG((Aeg-}HlTGw}8-U)r0yUhde=rCAb_ds+Uh!50e#zR0y6I=0m=8p~crw z#U^xi*_qxy|Fx0-nZ*#n3$-`3PX?`43|1G|`N)bcXPY;39MA5YBJ?C8mHgL4forIi zYXPDSXU<@;EyZ$PzkkbdI1+%}7)=`4NzIr1~ zD(NT4cqJ#?0ZaInq`BcYgCnsXM+Kg{dVE(5GtC|JhLE!ZW(-tVP%W6Rc1|JF`|FOv@4&*$r*=skPOoZ`D>WP?aV`!8~LYzx=HzewnpcF;YQSRbI5!F(I_^ zZalp`8_O;3_QI1ad^@TuJ0)d2%REQ-Or8miXAeM!W;A}+!{_Bc9QP8=>0(D64u5$Q znLvYu5X3}gYUyd90{^MZbCA!x_Bu!slm1-;ZnMPHP#UVYSqhv-;XEypK!=BD;2)9F z=y@X(lfcAjCK`D!=X#vlI*{q%?Lqs6Zyg||lgb1r&l?Yu(GpYrg^7~5*RwjKtfOyk zE_dKlw&<3Wx}~hdg4@9I4D_t*H8GVwH9!_%oLfL1(7w<9zML(`cVnAv6RI*~VHQ_% zJ=fU37*2=ZB;C|}{`lxaAL`4g?i32Vs~c+Ne|<8wFGI;jfMt9iF52_?Y`!p0>HNOx zqj+b>QXs>Jhsl#qm9>I=d8Yk2nnRMug@*;1p{>3JXXJ~1_!Xt)AsGzXDlu60#u z#wlaa5k(qs(`VG6034fitMWqR7FZd{y6U4ZHH;XC5z}GBIEEVqCoq6A4RF?&v9GSMGfoXyJh zU~0^$HRmNkNGT^o$_edet=`|EwS5`>{;NXGdE$KZ)s@H{ghHUaGNHQ~GOHD?!rVc} zCc<1@MY)4s7fl;jg0@NG#3F%(l)yqHurMQBDn#Cexg>Odjh%RtAv6iHn7*=6g{l}w zSa|xC@kbU#$|#>hETxpgr--GLa`+TEJeD;m3fQkQ!tElvipdvb#2Fr9h#oKrGCV?M zAsKOoQW(_b{XV?a(#!d5s5DI|n<{}&I3W~v@QTuBfrSxPEWvvysRu;$zH@*7xE#tu zrYbdHs_G$8daAa_ySROUcCgT~a8+dhK{Us&DBC8yXP&tS^ znX%kK{_(BzMW{1A@9g7H5|0ysx*g{ZB11{+5R-%sC9y+H(ltX#))Jz>NF+RVH5|_^ zm3T_PM>g|yWHMi`HZ58G2`>rQ8+ku`%P)eZRs>7Ar?JIJR=+9cu{q1zncc~=z}J+* zY5FSU@A2n?+g2or3nEEk2a*&-lEjK6Nw{u+Y}e8p{tvUA@4%u(xNg@x|^mG^D_83))&nlkJHq{JT^M;y?1qQs{ z=_xWkEGMSm0^HkLPG>!(tlFT|=PV<1>0398@&^#kqcCPpM+%Kw7D>#`>dLZ*tWqBJ zwWs9T^FiKyJ+yF3`@BH=+|qtEgXyX!w=y=|E5}ET-bJ^Ux1iv#k{Z=Soi;8n+w$i1 z)p@7c7?__R^5OKn(I0d!Kjgi3vvXyB0juC?xBExlJnvqrG(`GaYUwu{7guMUUOR8f z-%Bs5rO;|OyFJ-TE5GUv+|QENC7^s#Z-4Ig{>XdX<{#~W=}bg_QBjZPe!O}=KWnsb z1gg1<##OPKFbV2z`_Do9vgPh82Gna`H99>Tu$1V$nGmqlDhwsFRhG}&{eJN$2tEJU zX`i=pGuRI5Pr3f>`dr0Sop%3}XgcrqTp!eQ^e@`yWt@lbOK0#={W9n^F8gQQ-UXJ8 zj*Gu`E=(0?ra$PJ3V1`MeQI702B^)2sD}P^|EkmMbg%moq3zG6XKHc>ohyZhMz7b! z+i3+g?(3?nn67_gc7zZ$>tWz*hw>uHEwI@;zq(t&T9?OK-RD~8Zo8l679ibcxdjTf zmUl^?Sh5)HYGzUdN*cQJ`1ZV41Ana{{*$`n!Uyuc{(FZ!`$M8AD9CK9V}4pgmr z+^Ul>LXwCoRakIets%SV$F+!N65y!@3l6tilg_C(kg-0n8how|vi zFHlb2#a$txyF!AyLgLD-%L`-xi7T@%FHo{bwkLGj&y^rVWvveX!Oq6mf%v5}N~t!H zf?`TRXhBv$1s2%WV(a?*e^O$r15dwje6Zl2vxZ1LcUuzei5)7fTA*(JV2C97gK zZIw$7q8wu*TUab|N}e<@g=P(OZ0k}a9IF;2oYtif_P$ZtVZ}sDS{&*5GIc3eLK7LSp|`l(L+T#%CuW@N_bkH{piCFXef|BO@f5qt(_)!TTQ~#E z3w8E;hPxf3yB)*b4pgxR&H#HmUMyylpQEecQXVI!Dsr>D=!$#1?0Y3^a1{7Vnh`1h zBB}t0PyrAHu0XcDNOKF=Ej_~1b`)rz^Z8;a8}C0rF>B9Rp`#@X?la(;a<3Yw<7)d+ z?^&iWX`)%{|M;q++!j9L&r;6dGi=ljsfx30^iq}I-a9l^jTi%fv$DbjZj0POB=N^V z+P2t+@0Y0*Zl}3}j*otfo~kzOaW;rTpRgT;hW$h#u?il@(-)SFXINS8Ab*>6lP!=o z%lrp!$GL-Cn}m|UxnXz53iWA^SrcxDxr4N^ssihZ0`GjG$}9?AJQGh6W_U2qh%Z=} zWw`~O`LxBb1B`ZnVF%du4s60nr}IUpnUF&X=&*5%&gd46?n_}t52P8M2Qzvg&G0-3 zEB!(5yIU4>V?G}~{r)e{-mJSQ%BxG=MO;7u^({{9@^|^cA6@}qeZ$<_Fvo^@rI>ws zU_7a1Ut9C0*K_?ftRS?1Wm`yu%B?6SBpjhHcoeT>ae8&*O=Qw+06;p7d??0jMsL%2 z6QP18q6(S_6*M}{`RjLom1tH6A#w}2K_oac$+H=63jOk!a3YMwh-fTEgi1_ZLidHu zN>PN98zr<)c&@1CmI5Q6NV&P54$Qr=ss=Ns2&)Fu&VWYirJb_IarJf<1vnLw2d6ZL{(6B8Pt0k>#V=HvdR$BVnTgeUr zviIdTBO|XBHaTwHoNnEyuZuum_i94D!>Om|0-3jAompg4 ze778e`$^~-(p5%G)JEZ|fl5qrJeu6P`c^drb>EAx>#+k083$QQZWv&)BY@tftW_jrc(-(K@t3c39J6ClW}^f)X?OTk5oL{~VbrMq6D>ZFMo) z>f+$#JzC;`=N2Gc61fE`v5UvakJ0>e_NzIY%)n1@mzQ3*iVtTAmeXa4D^aLwM_b2^ zH(Cl(PL#hfD8A~9vSHDtXgVoVzr>)aHH zxj-7#E}5yhz#T$shMBoQib^Y`@H4Y+E_a9p-uwYcF;ZS!&L5QoppAqnxUkfh0M@i{ za;BvVpX+#FOlTTuaF5uw(kS z$S4h2gf$eIGwiDY*&?!8_%>vg@@%XOB@IxqmIhR@hK1KP^h~?kO7BX$oFs5z5)Ep| zo#?|1P1Yg!pT6kst0vx>?TsMUh4A%}wz`JMF`}Drj~h&?w2`kU3Nb znEhQtZna??h=wYmdMdeEt-#gQSE!3h5)v1cBrLk9=$jBWO*~W*a5G-GO;X>4f=D_S zi@MxB70WIfk!P02Y6@26<9LEO789CdF~J;*3C*#XV2;H^t3G0LA#w{?(I`P}OyZ)5 z)J2$E;Ptg_svkH|vehsqP*u-#p7a{Jwgfdn3DpE8s0m7)ePLx-f)N4<%@&`aiY%#Clb{Aq+K+dxe(lASV|9hG z9m!eIC>1zRHI<|(rDt5OS~X=PI8;rUY9~g5L)BDLQ8jfxnz&O%mB}i+@N!P%FQu$3 znaV|&q8c$wsi`~)Q1NAA>~wB~Ff{e=G-Q3sgBTCO06Cv>8Gpl@5 zYPQ%a+~VL_B(2>G%T%GC@$!2;f}=0gkl(?r99;sqvqz|_2+sr@6XCpeHJ!%o?N}`j zN3olvL&A9=5RWmFjvIZkW9u>nMx*iKbhsGp`t5i{(vNZnsc#QP_YV`fDtG<93B$zi zbNhW>i=+ng;dF5~o7YfU_}`SLSu-0Z6(g*SuM&g$nu8lF=rh!>Q6ahpaymk|lEI33 zD%nutc0ZL;B_{WrPp?->C;~Jo#56=)j&RK1s?kSRVBwUgcmIX0} z9R%@PP((mSSneP^d2&*_r|S!wLHnbK`Dvnf2XYH5$x@YkBEm8~Cn$C|`FCYZ!P&d6eFwHpYHEOO^HGNp#BktK{G^y-YF z=$~g~S1CY=>014&+NHUv5TV;_)qdd0>pVS2!o`|(T%MddePRBaL>%6>{jBQ} zbHgNp`ics4=z#Oz%LXzhm^&h&wYpNQ)un(6tYR>Jco^L_=JQ!~K2dt-mCG0jfxEmA zPL5OYGjZ;qx5*^Z&@lY8sGG#p0+~*v`}#~G3qpIw3#k%-WtMqlHIt&Gn8iP(HS$MJ)Dx<8qf z)!E9I&j_t4BSLG+L~a2f?Tg{B=4`Q)3j{K{%M&VbfK4$Yc$y{lahPjU2!W;CERl=x zwD=t!)9*yN1!~O5*?7L=e5}0r>a&4a)>4|2KE<5$+5>OvY+yFDlt)#Njz3T;_a}0=zU$e@tgLKfX#nx!WxJUVrszMiDusB65l%aw^ga=w~RtvLM)t z<6*kBbfaOSgxIU`XnrI2u-&G`^Y&}c3d1_NBtl+Y#JL5Yaq%(C$;JX+W%f~kV&Pu1 z&rpI?K(*OF9ZzqSwDmY&)aSfwUVint4{`28I`??uV4=>IJvHstFh??7lU*MTvH*SA zHB@DuMQ(u#(~06L3$JDoh)-^3`GF7W2w5erUiq(^YKsESk#68B#3y{k95G`mFXin zHjZ&%jHXIrm@0|I6vY_brqepeC8|mNbT)ld$N5cNxR`x~0EmB`sV1%4HZlIzdYlh6P1NTWYuT`;zvIDm1a4B|)^-)E1L+s?P?Y(8?+(VEX5sts(F_Mw7aZ#cc3-SM7_F7SuvP+N z2a#gbhj0{k68dR?^kU3vipy4=;oK7QFsW8S&GmWUJVc-v? zJNof)z7ECvcC&yZEP1K?=ksMO)Lfs|fvyPD6IqZ?fc z(%<4OJf}^1<`9H?pJH)Y6cidq8sPzLJj^Yi8!xb-H3@f;Bnu2?&K@U|>F|E!S&ry1 zCTVy1UeWz*YL}q4Wt+ZbSSmFO!YW)JOSLfJ9^ZxQqxTBS+zFU|M|H?3AiMJ>WJRcq z9&`uS+k^Qj^i=v8wpIBb!nk zFH9V=3b8?l&>AmpWTBo_ZCqJ6iTwLv@!BM~?+g3(j#YILCwiX@#TL0I%#d;2YT< zE2!=Q;^8LBm?cD5Wr@6m|egL6cXui^x9{m-4VLEgV?H~z@m ze-3(${H)O&bbBfXk21w8o#3GHA#YzcKjs~9z2Z><9!d5#xOCw!)M84|c{{R&Fi0=T zTK4JJ<$IO?e=z*!*Q;}nyMelk`yrgkwBgJ6t=-*?ZagjRWdQ>NmFR~cV?LtB6Wla#VKm*$2wCvkm=3H&I|KW zF>XtoZc7}uC5}}o8b62Q$*|ZhWtU;ec^B;BphXSnC6q&HDlC~Tqx9uk*2 zj)hiuWIRSrC$pO$lE%k3V~Lz~CV8)2O&cael`sS3yE$GqVa*_pYND zXC|iW2;Kj5!e+0*nO4hOYEzuQJ6mkfvXRuwf-ti>PbmvRSx_eq1Z(ue^1IsoZdKS} z{h9Gmv54Z_0?-QGh{0OCm7R1dQ89D_wy84N!fl>Ah`OMO+(DFA1i6DKuLyGot&T{U zsXdz**yA6kw|XNh{=PZanc7B^@}$CTm{kK+=tvbia_zo(O1Q%9ICs!$-;CA2e)sB< zB#*tz0ZloansPXra(K)u_P8{&9YhNEBSqv6T5X~toAQf6AZV4x8RZtx?jz&*sIhpE zd}oK{t?kFF%Nq^J0u9M$sE2562QbT$fQd(icW}a4hQZg5%yWG7)%}Ux3Rm zAY56XzE@y4o!p2X#`B?(oN6;MFA<{fDlj;!r<~4i*QU+z6S%jUxxk1Efg53eIvW0{ z!o0lWIMYH-9C!~zaexP+7=7aUe~(5F@&j62>?y?6ZBNPX-VG)~0t3v}}b2AJ%XeR!qjrAF%MFfKkc@nv&k9qse+6wC3|(aYLZE zAwb-apFf*Rx%cyM@}r)Zjg5Fo7(T&mM!(Bcdua)^8Y0rJmxaR!9`_4J{N`*j(Fe8q z2Yu`ePrbYxgMB!oyd3rC9BN@thWB4@hbL<^W+y?RuSy`?BBSmw22@h`=#Ha8m@|@+ ziDRUQNnvL8Bh>fmEMPdYvUctyJ*@hx{+K&fW9B_TptgZW^Z zSeVVfy&padZ@!P--^}jsXVV2JOyc+Vk4vR6d4Hk*J)6vio5d7V=IntC?iG{Kty|}> zN2);Q9nMLuJB|Sx+?51U7f3;%p;$$RQyHB^H89dyC$_EEChdb7FQ>zh87?TNLkAu% zsMLy~Bc|lHK@B?2=)AcOHARv3gw@+560baf(zHkjpPD~TK{==J-&NrKNw|XqtxYW_ zgCmzixQd;Ug zDWiR#r}U(ZWhiy|pYl{b=S2Dm5C`ESK#uOAJPqj}aAD|}-jNbZNb?7@%apAFpzieR zRfW~7ih^EMSiP#Cdet~Uy=oj#y=okUxr5aB>MP(nmgGGP8*YcWg9yp%ld^$U+g@yw zu{O>yOTA(f?h1^A@o|Q`0#m47NMagon&1uE*>ZT;3aSuKlKqZ?<$gVChAA!XEM}v5PDFqBaT^kZvY#H7*(-+WA$lJ7_ltovuzD zBVe&L{_DDtH_pyFmz}|1`aT>ubYM*XygTTdr`0^4HZI$F_be}Dtx>Nirghr6Y^j)+ z=5?>%HuqH%r{|6Spxio#pSsOI^0sWg*=b)kO$R_?)IXhddxPss^ED9vnjagNm+f=e zkiH4_xK{gW@GUhwZ3(zH@QaAY)Q3b}sd#6utqw z*&mk@HKz^i2t>`EcmHaf;|#*aebI*LFk?{fU35?L^KN%w?}9_f#r63>j-qSu0H^P( zPP^B1FDuksbw9Uzg}#8?Es^zag{*TA-r!5u%Fm_nn!5d8*Bv>#axQxx%;dtczSr(w zb$Si=4LB0_I#&ZZv8I1&_WJV0tIKvD$q(*z&i}{<-RtH@(~d$y|DrQMT2$TbcdyUs zWI=p?|8u*2rDm($!rp){4Ds;MPCYSLTm~Pzy-RFa=T?F^F^5+5Q61Q|vL3)Wp=ziV z;VN@T(F+=|8aei>8ZIlmqItc?u|(a)Qz>=R7wD$1fNHGH8QkbTzWb}MotZ>naDfnv zA_g^_qCzgT)ReB!!0r*{s`5o{fvWT2?1nqci1+1xY)+8W)G*Qj&Sn}IYinxC?nLH- zzd25pn9L=U$zj-nHS<4#XeUPRXUwHsh%Yz5o)og*s1=&B3VqD%u z!VLwPvj}W`Q*>ls&~I$pwrx*r+qP}nwmP;aP9~Yy6Wg|(-2A`qKHP`HlJ3phb!!_H9+Q;GeYvdY&ZoZjhbqYxb*G9h>kMmK5QS8lg5>vygM?31ixsYTs!Ni+ zL_j`$|La-H&uQ!V$VNfZQr8}+0Tl%&0~aXY2|Ao=G1N%cZ0}d@OT)jv03aOo_`QoS z?;pC)QvT{cn|gs-D(D<6eufEqfO?zO@J}QrhqzT{(W#?lI&*`CDq5?64!Q;{DjBsXUGg*0& zqNr{lp?9@!@61V6de0{1sS4iz$BxMwSQf|tnEa{dPh2k`-nlhJ$8HCk zXC#dyo`5V&cWfAxx}_z_;FsmAiUywt5)XIerJ(o#< zV#tOd@Dhb>-9!jE?#K|(Q_-*K9r@FSuX86luczl--w0#)FAoDfA)`@3Y;;8|do{Ht zrJrGfj&NH+U^4Mc6<(MteaBcx5P#+$CiiFB7>18wW~m7e0< znVR~|&bzHZZM{2vPnjNT_T@*_rb`rksw^u09#+S8w0N2+)k!o)dvRE$tj*dcd#yiC z(SRJ`Uwx(+U!0Pd~nw^ zu_Y7cszfQhC%Vy}W7K=>>=i!v)=rSKVq{crH9;AGUMGoBQDI9=R;AV`RC^GrCA@QQ za^$uN<*SeAYvS^c-NaO`2yEStcztxPFga%?L#d=KNcS0Q6ug0_T|QFL9CNYw2vl6W zlByUsQV|Jt6U0W`LS(cE_(FE*^yi>sQ%I8k<#~Pl7t|b~(!)sP*Gr(=(7|#d_i!qA zu?S6-vWBccST)CyPb1mFgjm{nbe0xd(LooA@av-nC5UQ|7@3HUe(29&aZ)DuKKX)^ zv0_C=I1vB8ED5pVwTB!-GRMVs}K81(dR6+EetBT->!YH3Qk}1Rrdk> zdQ}y>dTrv@)%60`aL0LbUKU)}7hcDCyWP#w_whUpqi6jb@{Cn9=!$mUF~p0l<(@yc zEHH&F?;>7~o#vyY9(8F>^=6tTS^zg!aH?|7s(Sj#ryGC7>&^PM?e~}^0$CS1pS8!O z^5KO^Ml(R7ZzWuukt~nX#!Gr6Nz;8Mz1Yl|b1iUReck&u3D{ypaXkW`?yhJNSGq=y zl8%&MH&WG-dtvH+B|g0WX3gK4sw&FqZS0M+-mZPBJ@l>U?%FblJ<{$`d6iOxc@&R1 zlwG7*>Os!o;O*sCAd@ zD;5}ZZFPCg3i3a)X7N>SbN*h2TjcNmb^X{piyJif%9bxn#&8@Ukhz$B3U-^UqA(mS zPdtLSBZMLcb6OkAWA?<9ovr`ia0HlBwNm5AUz8QJC3+BdlWCl{X$Uj$-hSy!)a=sY zu$Vto6kzYek|PXQ=D|r)GM2CxIo zXX_N+yq-tsjOB5ZQR+q&Psxh0ez45YJNl|-S4?@2k?d)Nn0~UO&CRc`Y&GI4*#pPe zqy$QVf-Otg1Fs$y06KUmc8x20)Y*CgY^9q<9pJjC(RXgo*fB6Ym>u9mJ6>jEi$waF z#fp^v{q;XUBO&aU=SANqI{|Gv`3RQ@w_>@*=B*+P3zwUh+qvak;}VVt2re_rl)rJ^ z0_@8$xm z@5><_?Kgcy%aRqSQ{eT3#@ta$2Hw9BPT}aDI0B8 zu{2bGOqRd#G!>ffqC-a@QX-U_vXkI-W|teO*|22tm-Bxgz-iQt6>IQtxWAkL&&5kO z`|Zpuq)XHeQ|(H~IOlBZ<{Mc2sOO=o<{QYy2zQD-OQIQoZgOWQTWB*I=y>`fTliL) z#`sK5Qh7&P9^IQdcMV-!F2P#}TvKXRyN>0GmuTTz_U<11$+v3TGtRF2 zQddy%Qe`-&-N7Ma*Lt~jHOGoR$cP7Asyo_u4gbZII+5O?IFG%`!!x%v**Mkq!JLgA zFYR+V*?(LAeBgN6hq7SBgKLLB4JWTPXnCg{hOtSebqQo!Zx_yDy;}KZ+S~w7nx`q; z8CuNRo1om@Rb`IMED5;U%;SkyfQ``igUlid#V)W1@w*Z(!p$lK0()>1(%5LRihvlY zVsx({84SGHGQiwru_u|b-(uJ6Knx=u&7g(4B9NA8_{8m=Jzpn(Z6@{aX(HGrLYj>I zR0NhGVG)1eYp#vAvVXYNvL>^cG^>v4nX>l?RMss;zb(QDA_T-nCw3E}t#EDRn9xnJ z?|z9t(}usJmr#0!l1Au-lzrQ(h&CGB)lmm9;Ds>QweD~j_Sg%V-k3_Q0xxTgFciBxcmY6mM%>WP%2u4j#{2mns5^%TQVVbIIm`^f=o1<%oo%a$@f$i}OWPF&Se0 z*Asw)ETJN|cohhE>hPHCCzAv zs5K>MF0m{PY+L%R3_^%na}4c2_gfc2hmjCO9bi37)A-sGHFNbPEQCxTc-d6yt-k@U zGjkhAQiKeyWuOfygpCR28nD5PHCeSsh9Uvw<=-lL(l-12#v~tn<#A-mf);$v!cACb z*#37{?B$c}?8eM#lVlyB-fB$C9!Bwpn2J64`PGB>gqXMpGVFAed6m-FFv6N|nYNM8SdIAdxjKdub?X6G zU;KIiKL&m`--WM*Uc7_P>fvLV2TYAo!E67QLe_&)o=+;iq~ACp;sTZxqBcs|OqogR zw<2*WUHfO8{WhomFXzr|xdDrPv2kZy!07QG@ZPgHW1Mod)-9m+!d(1m~TdY z^G_t3cE{g58M*i3QYho`>OswFlFz6VN@wcH+1gVnaIUtX6jQ6yLL(f8|4u^S$%f#V zL=lFi8&>K=Is<4P)Y0B7K$-LId33`%LQ;`Mr+#25;QvXhy{c%vBulXYipC%)E{5f?7 z0pnI8`51-cb=tNk?TK)OvJw4?ms@fN?I5PqhBqPt_~FssDn=|)R$S-SZY=SL4qb3) zlU1i2VgAaNGJ2$NXHOO#Iis1v7p-y}?X8h}*Y9BL9m^R!==tWu33%^Sy)Bw}ogX`X zz1am$7$ml6ytfUaO)1T?8fqW=M_2!ELwMAC0eu4B6teW-=ds_(a9Y?O$dJpy9tsbN z-j3n)pHV47w!hyHe)5sdR1IUQNZrVi72gg=^%~ZWU+Y^So=zt-b!r3y_6JAcjh?9r z5vpFSYB-|317F$UC&yW|i!Dn4#gTK+#ex&%h!8qJ;BlXOC^Fk4O7cnodq*yM76R@9 zEk7r3!gnP`IHPI9j|Jr^Txt4RF+Ef9xfROq>5V(G$rCyu;&DIhG{Mr|r zMB`mh0)wKZtLdfkNKB4M>X)9X<#*HAm>C>szbwPXIEb4a$8Gp61mh!CWCI(7apLJG zmI`{sQ!p7%GD<;%Sk&&qWDki(-KvtwJ9L9fJL`uPrDk|6bNSB1MA6EGo) zoy5%zycE4Dm)nW*U+;*9RC`T*Z56&8VX-5;WbW4W)u=_+UZ6OY079ex%W~mcDZP=e z%Obf9*@;7DZXi!w+y*?MddA^(4MLT}B4t%qjWzQ_^*!I|8_ud)*dDk#Kx$5bbVzb? zzGF?Yyl`oq?e?tFrGRk-2Bbxr2A@iZk_dgVWQ#%w3oqPWkSoWFOTwycMFF@Y+K z5s}0lPQ|hE<>8{uW18BTlxL!9wHP%`%bhXrr2+;(Mk)L zwW2}_5XpgbjIkoVSaq?cY36vhzR|5PPP%=O!Q(_5CCcs#s3Nt3Z`UF?lGuG$+LQUN zbDQFP+1#tv7DS*C=`MY_oZ9zgZbqawwfUlPg6bIA;qW|?qg41D>Ef+eVE%--WV``Z z9G$u#N2>+~AO5MtP{*CO50MpG%g@9SvAS|ku-xmAA*|QM_a7df8GD1v%J*48)0@#8 zhvh!%!V?EwFsw3&K#3!cV^2w&f)WR1d`mnHc=H1bVmnzZP~d|e_jZ*CE2EW7p3lEi zMBm?e?*f-50s?Z!^}3peAtWuQ3Y8{6r6do7$V9z}h;f@cqg^2FNPUnJ47;k{3dy{g zAgI-(Uh~}t10|i`>Y2v zx@xx9M+K||C1C;I{;FqX+vA}`9_*h06Wx>JbYtl8>nZG)NRO@EFtLVCEs>_KsK}?4 z7%F3E?{ro_#XB9an`JvPRXL;vlz!8XhODqr$XT+cKV_hVpIrLNem2>&{J?o{%Cpi{ z?rK9E#Z{L$1&8dLPGtaZL5)HaPmdz5){nmz%a$OzKD<-a_xZ0Jcw#oBROFq`V~aoi z7&+8DCuMP#@N%r)OqOJ3J~4w#)%O9iBM__XAyIi9fKGMC+0>SBZ^i!N7{grH;46}C ztPx7~T>=#jEA3g+0CW7R3EsY&PfwmyY8QMEsg@8N7_~TBnU;{ZBS+TM5uvbLbCe?g z!oe!ndjjIl)^pdKPibtl72FV;_z>HJr3`bitIcoq29xY@W1c0l-+}K`NRL~i47Dh$ z0*Do$I?+bi)SWn;<;!E&@?=GS+ki9@p4aw4F|h$LbQAQ2DlYN_BfsAf9`uLSe~Rko zD;vWdc@iG!aM)aQd5Guzp#hDl4HuBHflvgB!N>e0UtPyyV&rJ80oO@X-zrxA2$xZe z`0JZK)N9B*f8n`oZ84i{uFd>4aG_^SyYE#ae-5{X!d2;7b6R@Kw#-G_M#Iwm+k4ww zrSz9-$MPa(I?Kp(VZB4({P90&jcVq45Jp-?;;g&??5sJEEHA#lZK!Lz6xc|o$tlz| z#Eham6L!;Tu+Ieys{2Zfm_F8nJCP*SadVW^Vo#IL$G<61L8dZ7USXk3(=yFfr3_gtInyuuAs`EsOdIR+>bR|Wd#g=xTW9?n(&y%tZqChn=ijH=zSOK=Fv6-Rn8!Ci*Xz3 zv_iMnHUI%RrGpcdeYM3z|qw4@a$e%*@oEYy7Bp;)y*#@#N#PHlicgL;i99-6aj zAN9-0YbrJ5B)(N^AdeSSAe6VnD1xzG_w%Eej#p2SaG4I*6&=vxp=*6Fvtz*^hLREPfiUyHZ_hc_H~ zNOoOE#pRC+Yz1q-%KlUN>K{Ik4!&SIg6lNv(+S?^nseS^JX*u~lDBF0oTKIE?q;R_ zr(*NbNj6;zAwSR7R!6U?5IJOejr+OF7YNtZ!!t~&z$+RaQSh)#vPfr0Zej}Py$xaQ zypmxx@)uxz7T!5S^-uH^LY*|%*}DY2`g4eA2YZ1}F1w-hRr;yQ5@ICq+CME;Q-Cu{ zu@w(#dhMbV7(jeRSNa2sJ|j=HaM%ph4@1*px{= zxEVy*0z$az{(I1QmO3MJEb&prfyEfan(3UjEcU9^Xo%U6s&v)kD9tIw8uQ?a9_;XV zmOoTgi7L^-JRavaelY9HIK1U162VA+AySKclfeIPGLqW@Y(-f&5-bAZmd^hbR}G8F z%X%7Ds;V^m_-|RY`dlN;K4xjh#SBNdZ`nMrhXhs0Uw3)=F7y!OdN8bC{}ARR3V1%x zhhKR=6JSJ>UVi)I!{A3(w5i!>j|e3G!T7t%Ps6Ha+kFkOyUT@bo--pt@?(qfHzkY= ziyIcO0V0G^Kg8R{P;fL(q2e=SW+jp-7cSP){BzQf{wWve8h>PD7%i}nD)v9nBeqz~0BESV234!8M+Ww5|WOzoBYtaYx|+6?1-T7=Iy zX7F8+C=4rH`BD2zT(u@Wj6fdVTeE;x7igP6?uNhXYH{y@&0A(g!ox6{LSeWv7a8WY zE+?1bw)|mM*aT_w`_l?k5ytM<=Qg(LP@)^BK!3L#=Cj)UZqBcQ9=0Qw{|&3L6oTFW zcKo_NC(`lbDMd$UN@O5=y%+n$Fih3(w=!T?`lkjK=)_fUm^lI@&3|4m0;0D9t`rxn zTbH~$#x@yCrpYOgLxUpq#~_Z+Qi0X$O+#EzG50|<)Dh9O5Cz+tys2uVWN&}|f)b}P z-D>LHPq5K2g3YT{1^93wfVM?2{GmU<(Rw)nD>)!offY%X0Wa?F-)QuCS)bR=4{&s6`d@S}xNR*ffGOfYx&fN8WFvp(b)G*VzV%qa2 zL?bo;rg3~ziSEukZ#<~qDb#cfN`_d%SA~yprR=!trr2TfsfbdJ>vz|Yb|>&UghcvM za3R}`lv}f28$0ZxS*d0X46SUsS`g>SGJ|T#ycJBvX?|P#HE+JEI(MBwERSf*s-jrO z2*sw^2M9DBot<$*E~);Thgd#%Gz(Neg@9`=2NZ)T?nuWKR^L4ajLxSs$8XewfhIEt zSDGKF!52hFh^kS9cLZ+N2vg@sAq=`Jkei^^VP??_uO0FrP!k(~7mVQJ54*3A;CP&= zEA9ZyBg~3#w=45Z4r0a?HyY^jkq~>%ji)=~a_}3i0^QmmEkf|$@m$B!)#C6(?8<67 z4o%=7RQ4h1j9f z1I+-3gdI!ynrZx+DY&gRNJ7lvg}={N`+&=c#Dun$Xs_>Fkbp=DTHeZFW@a)s&6KBz z>=<5}Im`+Z4!VOcyK2|J2m24ZLC0uB8XNoSO|W?oNJPn$xTOsx)E_=yh2GoJhB7F& z+$p};{$nhZeO`@zh8+YRK*dYM0$WD@=I_f{TSHFYD+a)qNzUoh!7Dy;FwGW3EcMMR zXisoUR8%Va5TVL~sAA2L+Zp^nKA!IqNOH0p@Nm#=K)B&vN7iP%J;t>U=@_Sd8sL2D zbl;O?X6vV|;l7#fN9?dY?!Ofm5O);wEI3Sq@36lMoOIc2;>d@1=hmw9__F?tI8kn$ zv{;?s4dt~OHP|zhLIMjhF+XGnYvO+Tgw@dk~0#;b7rgEg|06spe>Y7+e01&5AIpz1@1ga zGXoCa)pjXk)F+)9?f3P1;n}5)*n_dnzQ~cn*?w#}qF7?~*R5eL%7C@-au3#P65n{lMulmCr`!H^?^ZI6PFm6l zJ&1vUgn|oAQ(f`eS~BG14{<}`0I|eg#tFFGD#NUV_^fvn$T@j5SM35lKYgiaT*zE8 z8bzOAXIk7!6pr-I0CEW$Fy@4cYn8{8VW6(}Q>BO9x?N|d>=t8X!+7NX7z&5Vi-z;j zkd_+;k&l8?{!eN(*eCAn3s+?k_lZQyMOG^rO$=t0{!?G9C|z4iLccc!>X7g~Xl2J94=$mg~dtY&^calBt}x7)MCIK@KE)EqrpaT5fim!z}{YWG9} z7=T>60AIUccXs7Cr*D24sMOfk&b!I+i5 zrR8k#9D9@>rO}8w&4Xwhh1GUI)OJYXt)I^wU9@~m+0@edMfymJy6~*^#P&woOA3}U z*5K!Le}nAXgHO59GF_>Ql4Z*pZq&|}DgF}qQL)KJCnIJ9ij?f$E3wrv-0~_?X75CS zK9eS!O_MAkKD?5Qpmr)oKd~ikNnb34Osgi5TbjP$*sYsx{}-FW#S`R&M^a);codI; zjQ-B#(Gn@bbIzrCY*oqN*r4S5qP1iC7XL)HK)Y=7JyGh^R{#!D3 zp%|Cfue0~61*R*qQz?V8fynW_tb0}u2q;;{61kEY`x{S*hk4jdIAH)(`f4oEe46?*jUJUcmMsA;Gtq9)+ThH|`&n1VC>~rKXecREy#{ zK_5=d^J5nd_i~H#21gR?8VV5V^LK=x%a#4D!YRA-%{%A-?b>EWwNziqa@rF{n^i5t z14H$WnW z3ZIdGJbdxCenUaq|8uEp4af6LkDUY#%qc}XW{4Z5E9LUAk~OCu>To&TT?C)b6IjgF zl6Ja!s9c&;UyvVMAzOmPGRwQ%vi-4v=dT~c^O zay(YClT7@7BQX8L=gmmP!H43Qlo6#=zpTBeI_98$Q{42-Ikr2xQSU?Y$bQx06{7cM z-&R(@W!#60#SODVYYzN7Zik!igG86#k1Sl}MNzB&HFK}_Y7xs{&nJd>xO5eWiKIWy zIWxwP%pwAVELi(W|fK+9K(?vPJgKOsWELE2-J)1b{vi96^(yLMSRC3|ZBmQU{fs zLE7&Mv#)vdeQw9EE(|u{L6=?ap+IrItrbj_+_=Hs9>#p#9G|$$s4-pNk4RYL-MepD zVaK6!3B%zK-Zk6TuMT$+$!_=Oc;^RMUOw$(Mo~1M{vPs4lV}s9AuQWz=FkjRQ5Yl9 zJ3*k$s*`4gsNZQnt`6$@kwZ}r-Ibr>*OqZx_x>A5=2fxRq$SBGqKQR(9?RkF=7+VF z;GK{%R~8NagpKQx^o)~HdnG1t!uCD-u3;wuZms5TsoQeD)moDE$3Ww6bvGh~ky1=}g2=aneWxbg__0nh)Td3=~N<;3xO4Xb$1omuM z?P*W^4B_lt4yis5`qG@#$RB0wtew{Skw_6j2eaJmc9~O}k)WFv`UGKY!3oIo5b$Lq zl-~H1?{lL0wk!B%KVd(377)I^KN{h%^jsYDecb&~=pDEve;Q$EL0mJQ*E{l0*}j1L zDi$=q8uUraQ<@zVd07VRTZTC{#vFCfYr6?9`*_j?tp-?aQ=dP7&(7hwOO zeJS$>zEgrg-NW!<*m7S69)q2B)A*ud8jw6n_hl-jc-MuPr*NmSTKRF-eXG$G@z-u7 zV9DlpUm{|EaRdLi;}*Z2ALig+^Xf}B|N zooq8XBE2pE{Su&xkx_YylMTru`_Y|EcEWF?x@y%~cGj_JRj3zqWtiza^5Bj5d@`HZ zIg(}Roe$SLN&ov!*i}HD1Sg>1^6s|^{I?!o@w@4r+kq`-8FSpUMEtwaZUq)8q|}7S zadlh$7)MaV--Z)%d}o1E)9P0grtfsTJJIW$H(QFEo8PJu7&-E0yQ}S58zlFSeU!mb z`n3hSv)R>KwU_-8k|x-3!_WcWb&CH zpKJvu$)sH~wofi+a7v8vvd!ym#4?WF?C{TGglxkR_}1)gcEvTcRBn5Be~A21ckaP| zttC3{1Zftpqg5j7(J}wOjW|8sM)oxwr!?fcg zQ3>F+w+ho_txN};YuJ==kugYoyn%r-|`z%ku(o2d*BGo zg`7~b1#$hIyKqHZRz9}|)q`S)O!duye3#q}UitX_1J_)KcA}C={>?8yW z92)-zC)CdXpz6P*7XnY+MP&!m>nS$rL?uc9Py6TlVArh~OluW&KpWRV?REcqwHqUx z#$@w{JrvXExqauq}rKSV!YlH7ZJ%i6ie6Hd5Kg^F?eJ4YQl)NRd4Kl z)g??C#q$c9O8zgBpq=z%YU)-%BrTjIQv+GA;I^j409(HHzMW zSfHwoB_RGzZd2XHxpzn&`cs)L3HcwKVQ{_C_Ex;S!Ovl-y*A+L7~cxVX`DB4%|!b0 zQxpKWRild-wf6rk$xA zFcco4obOA;@YZX=-9Ia*-=FCg1iMR9Z1*vsuh*AV`911OrcSh80IX|x0fE?$k+X8GB zls0s1H^fO^RS>yK77+X6vAT*|5mhMh$nMw5dvsDVBmT-j(@!FwFpY-^wS8iA((BNvrVWdS>Xx-jzL<@nd0u*=DGGJXR?UJEHrl$k6SL1GJ7G|YxiSd>Qfa;{z?D#RQ9iZ`-)FXJH20KS z%#WhV4IavIJwm(PA}hm4t;UQycMN!COb!I;SoTU*?Gc$x!UCx~)Y z4u4u+`Pi%Ox=Qgol{%mKF^M{KL{yJi#38kc{+r8vFx zEou;tJ>7Z?=v5t_l%b$lJqlJ2VBA*kWe9nTwP|BKx#G)ZR5sC7EQ^gF)O65gclTGOMA`Iu|WqUZDg0*WTM<-;=JFR_t zxbo?VE28V)tvP;hRXpdd@6#f8M{d_D5>IFNAoAAWtbH(s9jW{M3bZxykFDNdODE5( zzETBIHq>oOhr|YQAp=g{h;HuWe(tgHV$AS7am*)dM`Trk;@^Rq?cK9?AX<>Q6hB1f zAh+uLD9g-le;ekv+M&R!dWFD^H^>O-D){9rvYW~-lvop4kbyE(J|pr!M+{3=TNapd zH1N>I8%G@>8%2Yb><#(V(L2_0m^3pf1Xg3GZY`;C-<|>Y zewMmW<;lC!G7m-rk?&iI`e8B z_K*;QapBcJiCh@F5$7N>qg+j#RySvZlq#f6=19}zRsUo41ev#A^Ud|mot_)^K~$qI zY>{p0i?2X)FwU{Mc`@(4jpUjm1}{nX6e;Kt+P;LAW~ge0q8`s-@M_Bry5QTcX$xEE zhKN33fvV_njW3WBDo_v%=2xGRSiyvn@`@1Xmei;e?r(1cq9wbw zE6$3);T=p|*>4Cb7+^)!8)Ghfe^zM>y~77u>T1s3*P`a7KU9VNm}6fdHT_WB2X-8se0)Ij37@6$Lu>s;Ranw})|(sK`9W%`e$-s7hWTwg^|eJbIR z1oO2AUlWk`G<$kIKdRp5bNPeo;FX!H-Y2e|@0sS|y*2y*g59`}4Pu$_2z|8(_z!kf z{(43y`$_n%BD^)fRJ?Th(iRQla6R8d2%^cde$ZHizZREWa<|o#9PFLBDnU$e?sAif zphfEg)vieiEeh?{D)c_?4!6ng9a6!wA$XQfM-J4IcRf)2{?6P~^LflR$_tm}|C2BW1#Y&K{UQ*c zUw~GV?_YFeIG#oY2aEJ!>SNg2cj1{C-Fs%Fe^KxOJz>&qzGmWMVG?eEhm#98&rIrw z{E^H11v$76j7lbh`)h*f|4Dg(aRW4C#~- zWS9dh(~7#%lHDu@f~DRr+|5*c@29EL;&&2GUX3=@Mq5bRr8ip?Ug2wNuGr5!Gh5su+FqU7tyy|*ista| zM=Hs=6gRVA>8Q7|A-}Q#C-#xTm*Wq+Lbl|)&7L(s-F4r@2z zuU^S@nN80}{d^oe2vZm7IefCxDP0>9XY@Vv- zNYwn`_%ohb_{;nM@bz_~_sI_OjraKbVA!FlO+U;f39S>4vKhyA9_Dr(LYYnI>QMha ztQv(+trqW%HQVIogkFca3?dWV#8iPYJyaTZ34AWiQ`E41gHsb#HjRSBh+mTKKl|?w zpjIUj=>bQ2XC4q|b-1PPZO65qyYdWs+FH%_(j^sr2G^?cL3=c7IFPV+= zx+3IBAjRAl7<9vzZ2Zp^bk~bat{JQ^rNedfj=F461upbB3C(2-8)}A>`k=yPc0EV+ zT81I*N=CMw`V1x0YQD$?!WlKcEOLkK&~!j<7Z=vOH3tixNAq7mRgV zsW`QIPn9y5)tSE{_c_e`9RnIe2REdC8F4qh$QwrpK6G;=4i-qMni8dv`?H+J5u_^F zx8TK7n%QW$2R3P@EpYW$Nq_9ghV zRnirQr-h}b(^rh4|De~spPL9I-v>{x#8GWFRzS7>`-A>&7RBxsUFFFg;$+{>a|rT3ilefUAx-24HM+~Hrrk~) z!!p$LRq0|SX=4$h_RXrK^O*%-$4`S)2SENx$Bwgg&^V_>lDh~3&2|koP8c4WkTxvK zcxC3!K(<<=LE)j-!(X-q@kc1t0cq=W6m~R}O>bb@$scDl0+yEEK%G2>wL;x|XaV*U zwSHDO%!<{Pqsz@+NL8RK2Y>luO)}Ot6qF&7^N>NoWjj~%HG=fZ5i?&F(cuOKL)}2h zb^*{$X3>G4fqOhLO5Kc5gh$d%)VbaKzy(kBqbjma`3nKv|bWbYgl1Y+1`{F zlcu(f<#k~<3+z#rria9QZgQPU-3BH3W1LdXHL2!Bgw{KtoOhzHtShk-Rb=?0r1fFS zI8ijKqj{Hu!nOzUbd5-NxD?!&TlEb`x9Qlcl_Jjsk29?5+s)<-N;ZF0KXlsnst=7-wNiLZa;%#Soj7A^3%$&X8G z(@qEs0B6&zr>#z1mI(t9eFnqLm`__>bNuaejB)&+AW)vC+sZo?U>-7jK&G8qu~pequz411@8BS ztWjqU_GgebzU>Ctq5+D*krq7};0nr$FfHhNz|R=?YB+;|cGjPolR!7a^U$H(+h4qr}ZG}2Pjw^ADUm_W~9o;82pZ37+-yPDWC#^Ilxefc}K zDcphtadeqL5eXVqw2k><{Mw}79?s%LHsk;;@XiEWS4Kq?V5AH%*Noz$RW7WsIL4C^~EopSvT&3Hyut{nfwgO?iB!)rC&=N zD`TFd9fY<~yAN0|0xeg;9z(2it&Xv@*_Ca4lMipu58Bz7C%kn zldk_u)q_&9++R8Uh6oFdF*Me6wAdrVTm$pAw!4V3cS#|`72#d&T}H8FJ8wT@e~c=? zGfadScYKhj1crbO&TSgVZry}83Dg`1SdlSNvt!}0fxMKUtQktikaW#Td~lCY$!RKWq#fMsj02Q5ycGjA~pSkKx}d_26!S1rX)Dm^DrC_ zF4gbRstDxrHCoPrWADc~i1-Fjz#P-&0AQ~pDkFE2K)mFT3bir^ST>6pj4~~v`>7Dg z>X4Z67iODfbBJWPJgkLvOJYWm9>an6E=?|e=N>a!m{NU+^*2(l=cT=@dUe`SC)w8uQMDd0bm17pC9sY_$Qid(X2Wm!6o=JuK;{YXT@k`;u8WtUevh`>Zvf5I65lIGp zje|dHFw7cs?EGB4(PC~GbO;5QVH)n`>M^Shq~nuXXteOqI)^gDrxskaCD#S1Tdb&> zD~Inp`9+S*l^pKaOdB9ME*Ks8ySXRHl5Z7_nhLshV+sA8KRh|MAl^H@+jw2qiuCN< zI1F?|x^?ZCXx=9h#Y!orujC8$r=tL5R`4B||9hBz4bwassi;B^4x@v95JKGva*rJI21y?-wb;Wh0AC6~BUg!wLZO^_|M6v# z*UxIS8aU7_o?K-!a;8(lu+3KFWentU%`Hm@>_Q)vAHC$7R35&>*8V(zPQI0Ncq17+ zk2QxcsZD2Aki^hv)ZCNhOGaDC{UTir;*ehP3dMq)LKK01zJl7Zg0X*k=EPL7{1`)< zB9Kp=?&q`v-9Fnf`c3GDJ?;gE{|{a76s1WQY>QTR=_}i|ZQHhO+qP}9%eHOX>Mq;X zsekW#$2c$NAtQ2SK4-3o8FQ|gQ|ObuMbORzhzT$mF;~wh_(McBAm@A^<$cY(OAW0? z_?lRwIx;oVxAE~S4mA}H|Dnyix9T83_T*CK&eNFW=!jNngeQ$cR&%257?Ei)b#GLE z2?@CsS{>lx6`Zzs^ zB1tmWv`yG;fbp-xpA%Vi!Rx%5yq2Oru+)H)yc0wC`XX~x={5}nqTz|)koOdH3RTib zmtMBc`Zcc?bjwn?C2L>^=WP^juLk~AopbUYYd5{CgZzu2abPb4(f$^V{+=f84C)rd zV7v0hy-u`2W+`3aLgC?`Pi2dZ(o_omG_6{fIL@B1|K^3;d9fjZ3f9myJ=>JWtr54) zja@K{sfOQByJd=|p8*%FbaDP}#S@uhvU8EI(@egd2q{cN-xE7lZN#jIH<8zONY3Go zXdX}f4rC4SIjg#>+xm@Uukz*AUrTy}#+A!2eFt46Q>4MRL{feTG*Un&F_xCK>q*TD zPpy5Lz({SV*rR?NiFyc+hat?JtOk7dB9Q%Ly5cTg1{mqc|MnsPBU*;b^~$+%v$U|t z5Q7KXJ>e1&r%O`TxO0eblXb0R9?wdIaa>%E;BaG+q9n0J9Uv@($o|16x_E4$-zZ}NQgH#R5xO^RlhjCo z+>rn@=AEnz`SlQlT8>Qr`uBD%eden(w*Uz+OitYUHLrI~@36iSF&Uf7gZIUup|hLW z(f7DLdwO+j|LoNE{(3~uz*JdSw=UXp;JUGradQ6bL7pi2bhtiz+v^+9EB|K-nS$w5 zZ}z=6olk7GW~SD+{QHN9)l6bL6XKd0Ks7_u(8PLEj#@+lrf6lS#QN7261daGF_y=P zp#{cP$W`=SB0?d4rT1z6evQY7sB1VfwORrz=slNIFGhGVSos1v(LB>Wp+3V3zp@}* zRi@BFkg`N2$viVY(qfr7leE}SlO>`A0-_{B4jfr|T|?e~(3oy-wIK@^| z@nPI~u~gPu-~V^V9&e=R$<_Ow9tSuGnD!mgDGPtqu-z1#AgqGEJ0fUnf}g6I`=Kqj z)p@Jy=F*T+Zz$WVC05?VI~esAdq_-O8TTI%a!MHXlRy-^SYK}zzMvFIKI#`^hnIB) zUX;p_h|xVEfHeGUa%GWBT}30cO?m7p+=U_@=OAv4aGVm(!|KE|uc(ekcnpKcr0}n&OS^WNJqgtlu4 z$6es*xBeAtoMGH%ON#_g6p|_l1&{FB%rfpFhQ=!H1ERF)nO*dFqjHdJyCdFO)9OPu zts4N5boE60wp#A!sp3I!@9)iCkG-bw-5XF})B|n+o|FnCb!x{!t z{UKt3iCs#LU0Ny?2=Jc%sfT{`h(`dG7|#WxBJhh-)KAl09y54IN^g^Sobg7$4kVUd zC7s|?|F_^Y7*~3hSb~ts?T{;!T~mz3bIi=%R*Fpa==f8Pni3}7BcpgcZbQ)EWqHU= zNF(ezJ5)Z7?fhVU+IB+g?ad}JW{WdO?bV6ZB<@Y_;N0FM$|$e|7#F5-wMROikF*0`&e%nW*plL0`U3N7F%T#rK+*K*QLC_P_2 zPP7f@ma)e9U`*eR{$_NgecRq|v51%uiaCx(8Ep20+Cd1{f!(DU+P%f{>RE?F=?W5N zi+*#PrMZnRDQ^sLr6s3N$Da%tkP5WkB*{RU^xhxbgt0sV?Fq$c68C2&wjn#%v<+47 z-QB>qwQ;k#1+9BduXH1*Xwy?N%|vHL?zM-?LE@CZGbaS@SPR{^QSUGbPuriDv4Y`t zO)K|OE9$KOKyUKo$esEA02*fH46&iaeXgGSmTDhJZCo~I)Os@2nuiO|Cj3rQZh_du}Rp z#TpMkA_Hlr>NU(M5$6ME7<0UI5iGUUb5nadwpYxCaT%4Ceb@i)`d6b4sZ;+`dp?dC zA(jeN6DP&FLx!*u%!^O(Oe2%7D{zm;4iIxeN_-SFbWu1TDnKN$p}b+Ji}`(b^EA=X z=rFuTKZ81FJ|q&@NV}B|44XtQoom-Zk)~8R*{Y65wBc5O&0Q8Vm=PFuf~B0|C}SKh z6;lJLyIRWgw_B^sy2#du|IE8?&^N_MvBsl9vvhc|lzPsO} z3F*_UtmtgqGJBkKxR#Tf#Tb9b#OM}6a2h>D1y=w&&=ff#R2D=}qu?<{Du`Ka%O{u5 zzjo^lK`ZK;(mM0Iy8Os0GeLrksNFzmBR{6xV`sWXOf-GlBT^DWIw9)20Y0y=`0gh( z-OZ``G!1CGM6Px#s6UGe;G%eoty<$#LcnSiJLD%HUt_wj4;{~hp_&xm>t@Um28iGJ z(p*lyoc~r3ODrP-o|TZuOCsJFRXh5gAT2#(4h#N~$eOmSgA$tW3@;JAtfG z^err;YLl`!mQ|Miu2ej#&aWf=Bbm_}DCouj`apiN|8-`CtrpJ7UXvXMMfHo~hP@kf ziZ^T4&#%qS8DIBLp-I@9inm;JiN>i)+BaEqQ_# z(K6rw8@|U@?NfLtoc6s*L9Y9(pcMunC(_d`OYkeU%uu3}2f61mfJ1SSjmGhh$#N(0 zRFea4u&ox}qe&mj-H#5!+HVpJq)wP>kwVOcubdiT`O~}}TWAC~?%y$-TOPiGT#dJ}MDWFaJ&6haNk^1|bENnTeem~wk&;nvsxhh)3@Apm3 z7Id!q)sJ8d)AMH??@;cN(g$=sAL$5vf14u4!_rneWiPas%)AxGVH+!RBjPW~v&7RL zmXQ{#IUejbRYKesZmX&hWspp>nC0|HekfHx^&$Zgt)PiTHOD1%fhrGJ_85-6CiyP6 z@P@#Yhac8WvK@y2E)~wEG%`@e&VDh?r9n=J-ZCOsQ%H zvv6AW*nG`(h(TKv`RXcx>JJ;Ea+VU(c~CJlX7ba(BB=kpU-H7tj}i3Goo$nEMgVkJ zXbmmg==FXoe(!Q{M(BRXl{z;R5X&LN5UU(bNN57uw>l2H8mOE6m=Uq2LQjf3Ip!K= zr69dGOj2FLSs2eQ*zV;TD8>o>v7c=DoWywu?^joWf(!j&%10>xc4?KbyGm z;;da5K4es}f-rKp>Kg4jW?76s-)IO0#OQuu=D(Fyyw6QU^`EyK;)V!x4p^LY6D#62 z5-K{I!Be=I!CU^u^80z7J2t{-0J)m$g@9OQS!0B{V+USI;(YiuTIWerTj4{48X!? zI_;nYU#ZtZF=)(E!O>eCV2re44=r++S67_aI<460aYU-3RXLzkIf_(fG}T_Wepv7& z^fc9GcJBN0jg3)iwQp&vX;5H!Y~5->`)429S!vGeQ?FV59xUFQ@AkSm(4lJG_xn8> zZcYQ4zxwHd?$wqZt}DLJ{yEC$ojhs0rQ}v#KwRglPVdI)^>UT&2F$r}w_vOgL@q(0 zFaQgSg9B)64jOsu@oHjv5jnq|okHAMax)GNvMPwKMF*;(6n&iHkN4ZPqyf$Awm0;w zOI_Cb1ll80{-9EwCYr|bvp(&{i-j+pTWX4xTA&zKPxL!Gq3M`W->6PRP|bdsU!mn z<#?o(n-ZP4?&q#H$%R|G5zFm&)h@j~mLcjub?+`kWdQx{?=1NoQ~DiL8zXH2$S=%k zBsg-gdB8Ou2u&e^2j(2+PaLt3k?mLWnEBt-|39hy9q``Fa2e&`*$a$4@1rz^t>z^NRy+=EthvU3S;f-;1hgFY~gWmg@5>x zdVlI|%OZi6c$Q#v5cI7;bK+zKM>036Q6IJ4Dg>PYfor$vw$_@QZX!;hdyJr85sBBJ z0>}07-gE%YxR8Hd0&^Z0fpD}jWqyqH0wZcpRDT{!)gP#jIJ@9dEDilO6}kQHflRc_ zEo7@i6-XJh41H9TLEJ$m;Hy6zEHJ}Wzv`G_ge#{y3iPMh=&`k#Q|$W-H?vBM&g;v& z8$kA@sHo~aye>6+hj6=Xe}H9rH6NBrz)cd-%@`s_7IuJGD*4(0AX`@raQRtAO0*XX zOcYm1!N#$UtDd!fCtUS%T*I_+5IC(OOi-d(i}m9Y+pNnL&&aUsDN~Xd3FHh@iDe-I zG|fb4ATwduQR?&KqE@abCJCHTS;oAotra)E++_Nyz#=+o6<+7?IfBzPup&e!#4rJDe3S7Xe_*a9MTu)|9?3DE9utwRYVkAdL-!( z4FiWBLur_y9r`SgC$_Dbrf>6gVv8%2(ZJg5w3;bV#?se~wLPn=O+!}K8<$3{Z*+zr zW`5xh(*#)K^6;nolV=k%$G$5P5B{3giW45k7s-;|GyFP2^i$Ctd`*wV=?|Fs<}%ri zrv*^k{U2!att3SScVL;Vy6Xh!dmkO1>UuB_eR4Z%?(HB zj&F}7BQy^gh$|+|WU;l0^d7Zeq~s2oq}n zUyE67mF3p0Jy*V>OQvV+Dq@UFX}kE)zjm5VhP|9CU6do5z@thcq{K!eA4b+@r?nqM z`HAtMG;Q|U_)wP9kFo2>V}XL{3#6P+2j>Wrp{C&~Lmj5H$0=d#DO8kj423yArR1(d z@_W?4E(Y0sct=Z5BzlTfY*M&_$bbW4NG9PSdxW4x0z)>nJb81nR2vxNAO0GB7`DWy zYXPt-<5vWw@=4;tS!Sn@#lb?Hb1>PsRg)jsE^gKMf1=UbReCh>An&De6D55i1K?3lz( z%C+A2d2?hEn<^L z@iS3XggGC`^!nQOwRIt}*{@@Ru9vq-KHr#jC?gjOzS!)z|Ncq)@F>5wM-dj@u7n`+ zxI9}h>9`KLeIWl<0q%rWVKfl>j>J?z-~*&}bfAD-vstWIcJ?ud)~MA+TZ@L#I=Pep z7fooRtG#hCH8Y>`!F+R}vH@@zqCAIHY0%i=Zn=l}acuYYkxki4cvoT2e)O6o=@wbm zV_%l8i-Q-ozD%#&3~XKNH=aS&$tK5hl5s)i)`qg4pzT8*9$=crV$XNbO=GcFhZyDw zI5_EN2nttV#f0p+a(Gu8mb`VH(VIA1Fj<&jntbvyA)?b@76V40_u_CYLA8{2e1 z2I1*aoGyM_cba2NdFyVXQhx?kSm?|=S@`Swq^G6QU6<{8Bd643&w(zSJi!XD zWcPvfN-SSs%FtFYB+`CG9yf{B-M%+C5}vFs-7i<#$m3Dp@apgJ_{Aht*R3;Sj^c%E z2FG_5oGCQjaa2|{#@k*l+J!HA9^#ZW1J-x@u)uC&uMJ0lBnp#}F{1+{4R|vSwoGjM z<(B!5%}H;9>ejD(4v(L6L~@iDV>!vj+AU?FSZoQW*%C%%f;HI6y*@Q7-tLx7y>{RF zk)8!&{Z8&v9rId|eRiPhHnVxb*~r*{z4#)WE=w>AQ{}OnG_zmYH?sdV7cmHZij6$t zVVvLbD))nP&`!tJaz95W3ZZe`31rv=$vYYCn6;$8>QjPpL0d zbSS8Tym%sGoeMBG55<=-+sI5AQGwg45ZrFY=H@`tzK^N}ML8io#E&m{mf1#W(t8iP zw+}={=UAftj+nM|6?ttcQM5e81{A~mr8hhEZqb}74O-7#hF_gv^e%>bZ~AhPDm?zp zf6$&^chwRy<|Hr?d?lwXcF6`iCvrw0b*Ug1z6h)p?n&;1=BQsFDpzxagGTtMG5!~; z<1QWr29Aw!q&9;tUoC8jcew{6uJ63ve*DN)h{0YZ@y{K#_Git42fPMg$1^;k-OggT zH$@6F09v%9PL$+p$_u)Nwf=hl(R&3Hnxk|Lr`%bU@D{q#!yV>+bANK+4 z3jv-|8=g23?!hOEHS)*MHlEzwwF9iRle2`z&_tLcr@=6jq33aJQkXL8%J5#DPi=ybVC0af4s|(Io)NCUr=BIwG2%8(Ft>Q&R z#arne(e<*nV7UJZ4vR*WFYJ_h)@rC&mU83J<&~yT)f(L&D%TFE?rlV3p+ZvjOzrz< zRZ3l>hslXJjsqrJ>KnDAJDcO*ZG+l;J8Pqe66H^mQ1l=d<;m^RyLFe5@zmD>r#(^o zqAAlX36|nQI>S`XSa)uOt>7AclA>N88>#8R*cJlcK32wbn2{%0*=(BQ>|VDBiwv6E zV;P-co#=F}R7=4^L)be=b%#=SxkYOP{wq@Ro6%U6rjLGGBduq=J#-h~CzIL=cVU!+ zoA3KBFaXFrm4VXPaAtrNTrciPIyt*vzawQSP= zqnnaO&NR`R+5S=a5k%UCv5SDlrA?7b^EBJi^Lf8oJz?9ChV_HaM&+AU=Vvw(mT6Fx znN|ZVS0F1i&hNYr)+DLm+Kpm5Zd@63ZFQoaidk@uikp3hRk9SBgEXMmZ zG!Rk8eqv%HV_i!g*&>DhVgm{rC!BK-gga-Rk46uB<##40%cf2ckXI1lbY$0t^4@aE zSfvc8uFcQFALWBv4@kqEMHJYm(#+W1u2LrdFV=O(b(F3^ly~R6>LL@;HSTuqXf_nm zjHfO92ANR+YV10x5km)3W7Dqj>UGa4p2+*w%cA~=vPkk_aG>fBPL2fq(>+e3x!xh5 z1ZWo6vy3e1sAPrD^SLN+092%^zw^#t*v$%Qn}Cd52$Ozulm$c3b@TmG$X z_tg9@TQnwDQqM*cS)(w;-fl2L=t&eio<)-~8{r12sMwu7Te_bh<@du;-cw=d7$7=;`aNf}tYOkzt{4j)jSks;1VE{+4n zM}STO{+i7pJRHk5Lob~EBk)@W{HOHq{~`#KS(xwW`p1*<>Mbp5q7+?7F*)D(pEN!ZBKicI@nFa=AwWm>%H zi1%U~Y3~q2P%fcQ!KVF3#ioaCzJ;@u#+BZdi1j~Pwj*2Vwh~VhUr?r#N_z{ zMDO8_wNj{Zv5KO6T77g|y|9mFygCrrboA#F5WO{A8BVP)lXhds?!l8h7dgz1ZiP`m zNh-+ysb-gwahm2D)<3m7^16VXblB}o9kX@XVth&0Y4L+_pZA{Oe5>L-?>tu;e4km` ze_5XRrkX!v$BIRrZ+_`fZ7A`tud-nR>g*F7Gkm_ZlQ5sf&szSDyK}ys<<5nzhXe^Y z<8AO`f!F(-NQP+wFg`mD9ohcBtfC(7v3GCL|B^|#Ze^u~C+lr(^JO2W#gw-B?TYzn zhS&Vb5$nA1Iz9B`_6@ONTiCwsy7p?d9bs0>n$@8(1Wl{-lr1RY_F2%0Aor#uzmQjW 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

    {ebq{mvzbyN3s>^ySgs%YWktY|KvBVg$lX@z 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�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 modIdMap = Map.of("cloth-config", "cloth_config"); diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..5200bebe --- /dev/null +++ b/forge/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,7 @@ +public net.minecraft.client.renderer.MultiBufferSource$BufferSource getBuilderRaw(Lnet/minecraft/client/renderer/RenderType;)Lcom/mojang/blaze3d/vertex/BufferBuilder; +public net.minecraft.client.renderer.RenderType$CompositeRenderType +public net.minecraft.client.renderer.RenderType$CompositeState +public net.minecraft.client.renderer.RenderStateShard$EmptyTextureStateShard +public net.minecraft.client.renderer.RenderType$CompositeRenderType state()Lnet/minecraft/client/renderer/RenderType$CompositeState; +public net.minecraft.client.renderer.RenderType$CompositeState textureState +public net.minecraft.client.renderer.RenderStateShard$EmptyTextureStateShard cutoutTexture()Ljava/util/Optional; \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a98c0b66..c8cd5c3c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,22 @@ -# Done to increase the memory available to gradle. +# Done to increase the memory available to Gradle. org.gradle.jvmargs=-Xmx4G -XX:+UseG1GC org.gradle.parallel=true -org.gradle.caching=true -# Loader Properties +org.gradle.configuration-cache=false +## Environment Properties +java_version=21 minecraft_version=1.20.1 enabled_platforms=fabric,forge -forge_version=1.20.1-47.3.1 -fabric_loader_version=0.15.10 -#yarn_mappings=1.20.1+build.10 -# Mod Properties -mod_version=0.7.8-beta -maven_group=com.xtracr.realcamera -archives_base_name=realcamera -# Dependencies +loom_version=1.17-SNAPSHOT +fabric_loader_version=0.19.3 +forge_version=1.20.1-47.4.22 +forge_gradle_version=[7.0.29, 8.0) +forge_renamer_version=1.1.7 +moddev_version=2.0.141 +## Mod Properties +mod_id=realcamera +mod_version=0.7.9-beta +mod_group_id=com.xtracr.realcamera +## Dependencies fabric_api_version=0.92.2+1.20.1 cloth_config_version=11.1.118 modmenu_version=7.2.2 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..b1b8ef56b44f16b14dc800fa8103a6d89abb526f 100644 GIT binary patch delta 40165 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 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,29 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 1da00016..00000000 --- a/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } - maven { url "https://maven.minecraftforge.net/" } - gradlePluginPortal() - } -} - -include("common") -include("fabric") -include("forge") - -rootProject.name = "RealCamera" diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..9dc39e86 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,34 @@ +pluginManagement { + repositories { + maven { + name = "Fabric" + url = uri("https://maven.fabricmc.net/") + } + maven { + name = "Forge" + url = uri("https://maven.minecraftforge.net/") + } + maven { + name = "Minecraft" + url = uri("https://libraries.minecraft.net/") + } + gradlePluginPortal() + } + + plugins { + id("net.fabricmc.fabric-loom") version providers.gradleProperty("loom_version") + id("net.fabricmc.fabric-loom-remap") version providers.gradleProperty("loom_version") + id("net.minecraftforge.gradle") version providers.gradleProperty("forge_gradle_version") + id("net.minecraftforge.renamer") version providers.gradleProperty("forge_renamer_version") + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} + +rootProject.name = "RealCamera" + +include("common") +include("fabric") +include("forge")

    m?(HQtKlJW$f?=hXLO*|Djut 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 Sw2EmEV%nERYgSL&+O*`!CdfU+*KN|ZA* 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