diff --git a/common/src/main/java/com/xtracr/realcamera/RealCamera.java b/common/src/main/java/com/xtracr/realcamera/RealCamera.java index acc4991..db9f3af 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCamera.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCamera.java @@ -1,5 +1,6 @@ package com.xtracr.realcamera; +import com.xtracr.realcamera.compat.CompatibilityHelper; import com.xtracr.realcamera.config.ConfigFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,7 +10,8 @@ public class RealCamera { public static final String FULL_ID = "xtracr_" + MODID; public static final Logger LOGGER = LoggerFactory.getLogger(MODID); - public static void setup() { + public static void initialize() { ConfigFile.load(); + CompatibilityHelper.initialize(); } } diff --git a/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java new file mode 100644 index 0000000..5f8a70c --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/compat/CompatibilityHelper.java @@ -0,0 +1,49 @@ +package com.xtracr.realcamera.compat; + +import com.xtracr.realcamera.RealCameraCore; +import com.xtracr.realcamera.config.ConfigFile; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.function.Supplier; + +public class CompatibilityHelper { + private static Class NEA_NEAnimationsLoader = null; + private static Method NEA_playerTransformer_setDeltaTick = null; + + @SuppressWarnings("unchecked") + public static void initialize() { + if (isClassLoaded("net.bettercombat.BetterCombat")) try { + Class BetterCombat_CompatibilityFlags = Class.forName("net.bettercombat.compatibility.CompatibilityFlags"); + Field firstPersonRenderField = BetterCombat_CompatibilityFlags.getField("firstPersonRender"); + Supplier firstPersonRender = (Supplier) firstPersonRenderField.get(null); + Supplier newFirstPersonRender = () -> firstPersonRender.get() && !(RealCameraCore.isActive() && ConfigFile.modConfig.isRendering()); + firstPersonRenderField.set(null, newFirstPersonRender); + } catch (Exception ignored) { + } + if (isClassLoaded("dev.tr7zw.notenoughanimations.versionless.NEABaseMod")) try { + NEA_NEAnimationsLoader = Class.forName("dev.tr7zw.notenoughanimations.NEAnimationsLoader"); + Class NEA_PlayerTransformer = Class.forName("dev.tr7zw.notenoughanimations.logic.PlayerTransformer"); + NEA_playerTransformer_setDeltaTick = NEA_PlayerTransformer.getDeclaredMethod("setDeltaTick", float.class); + } catch (Exception ignored) { + } + } + + public static void NEA_setDeltaTick(float tickDelta) { + if (NEA_NEAnimationsLoader != null) try { + Object NEA_NEAnimationsLoader_INSTANCE = NEA_NEAnimationsLoader.getDeclaredField("INSTANCE").get(null); + Object NEA_playerTransformer = NEA_NEAnimationsLoader.getDeclaredField("playerTransformer").get(NEA_NEAnimationsLoader_INSTANCE); + NEA_playerTransformer_setDeltaTick.invoke(NEA_playerTransformer, tickDelta); + } catch (Exception ignored) { + } + } + + public static boolean isClassLoaded(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException exception) { + 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 a920d94..55244e3 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -137,11 +137,6 @@ public static Screen create(Screen parent) { .setTooltip(Text.translatable(TOOLTIP + "adjustOffset")) .setSaveConsumer(b -> config.binding.adjustOffset = b) .build()); - binding.addEntry(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "updateModel"), config.binding.updateModel) - .setDefaultValue(true) - .setTooltip(Text.translatable(TOOLTIP + "updateModel")) - .setSaveConsumer(b -> config.binding.updateModel = b) - .build()); return builder.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 516a30b..3a71215 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -150,10 +150,6 @@ public void adjustOffsetZ(int count) { } // binding - public boolean updateModelAgain() { - return binding.updateModel; - } - public List getTargetList() { binding.clamp(); return binding.targetList; @@ -208,7 +204,6 @@ public AdjustMode cycle() { public static class Binding { public boolean adjustOffset = true; - public boolean updateModel = true; public List targetList = new ArrayList<>(BindingTarget.defaultTargets); private void clamp() { 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 7f1dc69..bdaeac2 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java @@ -1,6 +1,7 @@ package com.xtracr.realcamera.mixin; 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; @@ -44,6 +45,7 @@ public abstract class MixinGameRenderer { @Inject(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;update(Lnet/minecraft/world/BlockView;Lnet/minecraft/entity/Entity;ZZF)V")) private void realcamera$onBeforeCameraUpdate(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo cInfo) { + CompatibilityHelper.NEA_setDeltaTick(tickDelta); RealCameraCore.init(client); if (RealCameraCore.isActive() && !ConfigFile.modConfig.isClassic()) { RealCameraCore.updateModel(client, tickDelta); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java index dae4182..bb3ab3b 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java @@ -3,7 +3,6 @@ import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.config.ConfigFile; import com.xtracr.realcamera.config.ModConfig; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; @@ -19,8 +18,6 @@ @Mixin(WorldRenderer.class) public abstract class MixinWorldRenderer { - @Shadow - @Final private MinecraftClient client; @Shadow @Final private BufferBuilderStorage bufferBuilders; @@ -31,10 +28,7 @@ public abstract class MixinWorldRenderer { if (!RealCameraCore.isActive() || !config.isRendering() || (camera.getFocusedEntity() instanceof PlayerEntity player && player.isUsingSpyglass())) return; VertexConsumerProvider.Immediate immediate = this.bufferBuilders.getEntityVertexConsumers(); Vec3d cameraPos = camera.getPos(); - if (!config.isClassic()) { - if (config.updateModelAgain()) RealCameraCore.updateModel(client, tickDelta); - RealCameraCore.renderCameraEntity(immediate); - } + if (!config.isClassic()) RealCameraCore.renderCameraEntity(immediate); else renderEntity(camera.getFocusedEntity(), cameraPos.getX(), cameraPos.getY(), cameraPos.getZ(), tickDelta, matrices, immediate); } 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 2da04ea..5d179a0 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -38,7 +38,6 @@ "config.option.xtracr_realcamera.roll": "Roll", "config.option.xtracr_realcamera.toModelViewGui": "For detailed settings, please go to the %s screen (key bind need to be set to open it)", "config.option.xtracr_realcamera.adjustOffset": "Adjust Camera Offset", - "config.option.xtracr_realcamera.updateModel": "Update Model State Again Before Rendering", "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", @@ -46,7 +45,6 @@ "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.adjustOffset": "When pressing the adjustment key, adjust the offset or rotation of camera", - "config.tooltip.xtracr_realcamera.updateModel": "Have some impact on performance, recommended to turn off, if no visible difference after turned off\nCode running order: update player model (advanced here by RealCamera) -> update camera -> some mods may be initialized here -> (update player model again) -> render player model", "screen.xtracr_realcamera.modelView_title": "Model View", "screen.widget.xtracr_realcamera.modelView_selectMode": "Selecting", 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 e27a113..febaa5b 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -38,7 +38,6 @@ "config.option.xtracr_realcamera.roll": "翻滚角", "config.option.xtracr_realcamera.toModelViewGui": "详细设置请前往%s界面(需设置快捷键来打开它)", "config.option.xtracr_realcamera.adjustOffset": "调整摄像头偏移", - "config.option.xtracr_realcamera.updateModel": "在渲染前再次更新模型状态", "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在开启状态下,十字准心会随着玩家的视线移动,确保命中结果不受影响\n在安装了Jade、WTHIT或类似模组时建议启用", "config.tooltip.xtracr_realcamera.renderModel": "在第一人称视角下渲染玩家模型", @@ -46,7 +45,6 @@ "config.tooltip.xtracr_realcamera.classicAdjustMode": "决定当前按下调整键时调整哪一个", "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", "config.tooltip.xtracr_realcamera.adjustOffset": "当前按下调整键时是调整摄像头的偏移还是旋转", - "config.tooltip.xtracr_realcamera.updateModel": "会对性能产生一定影响,建议关闭,如果关闭后没有可见的区别\n代码运行顺序:更新玩家模型(被RealCamera提前至此)->更新摄像头->部分模组可能在此处初始化->(再次更新玩家模型)->渲染玩家模型", "screen.xtracr_realcamera.modelView_title": "模型视图", "screen.widget.xtracr_realcamera.modelView_selectMode": "选择", diff --git a/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java b/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java index 912a5aa..bd2c0d1 100644 --- a/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java +++ b/fabric/src/main/java/com/xtracr/realcamera/RealCameraFabric.java @@ -11,7 +11,7 @@ public class RealCameraFabric implements ClientModInitializer { @Override public void onInitializeClient() { - RealCamera.setup(); + RealCamera.initialize(); KeyBindings.register(KeyBindingHelper::registerKeyBinding); ClientTickEvents.END_CLIENT_TICK.register(KeyBindings::handle); diff --git a/forge/src/main/java/com/xtracr/realcamera/RealCameraForge.java b/forge/src/main/java/com/xtracr/realcamera/RealCameraForge.java index 2403977..a743fad 100644 --- a/forge/src/main/java/com/xtracr/realcamera/RealCameraForge.java +++ b/forge/src/main/java/com/xtracr/realcamera/RealCameraForge.java @@ -23,7 +23,7 @@ public RealCameraForge() { @SubscribeEvent public void clientSetup(FMLClientSetupEvent event) { - RealCamera.setup(); + RealCamera.initialize(); MinecraftForge.EVENT_BUS.addListener(EventHandler::onKeyInput); MinecraftForge.EVENT_BUS.addListener(EventPriority.LOWEST, EventHandler::onCameraUpdate);