Skip to content
This repository was archived by the owner on Mar 12, 2024. It is now read-only.

Commit d486911

Browse files
committed
Fix rotation issue when in 3rd person
Set the camera direction and position ourselves instead of relying on Minecraft to do it as it also moves the camera when in 3rd person Fixes #1
1 parent c9378fb commit d486911

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

src/main/java/nl/pascalroeleven/minecraft/mineshotrevived/client/OrthoViewHandler.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,16 @@
2323
import net.minecraftforge.client.event.InputEvent;
2424
import net.minecraftforge.event.TickEvent.ClientTickEvent;
2525
import net.minecraftforge.event.TickEvent.Phase;
26+
import net.minecraftforge.event.TickEvent.RenderTickEvent;
2627
import net.minecraftforge.eventbus.api.SubscribeEvent;
2728
import net.minecraftforge.fml.client.registry.ClientRegistry;
2829
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
2930

3031
import nl.pascalroeleven.minecraft.mineshotrevived.client.util.ChatUtils;
32+
import nl.pascalroeleven.minecraft.mineshotrevived.util.reflection.PrivateAccessor;
3133

3234
@EventBusSubscriber(bus = EventBusSubscriber.Bus.FORGE)
33-
public class OrthoViewHandler {
35+
public class OrthoViewHandler implements PrivateAccessor {
3436
private static final Minecraft MC = Minecraft.getInstance();
3537
private static final String KEY_CATEGORY = "key.categories.mineshotrevived";
3638
private static final float ZOOM_STEP = 0.5f;
@@ -75,6 +77,8 @@ public class OrthoViewHandler {
7577
private int tickPrevious;
7678
private double partialPrevious;
7779

80+
private int thirdPersonView;
81+
7882
public OrthoViewHandler() {
7983
ClientRegistry.registerKeyBinding(keyToggle);
8084
ClientRegistry.registerKeyBinding(keyZoomIn);
@@ -216,13 +220,46 @@ public void onClientTickEvent(final ClientTickEvent event) {
216220
tick++;
217221
}
218222

223+
@SubscribeEvent
224+
public void onRenderTickStart(RenderTickEvent evt) {
225+
if (!enabled || evt.phase != Phase.START) {
226+
return;
227+
}
228+
229+
if (!freeCam) {
230+
// Turn off thirdPersonView off temporary
231+
thirdPersonView = MC.gameSettings.thirdPersonView;
232+
MC.gameSettings.thirdPersonView = 0;
233+
}
234+
235+
}
236+
219237
@SubscribeEvent
220238
public void cameraSetup(CameraSetup event) {
221239
if (!enabled) {
222240
return;
223241
}
224242

225243
if (!freeCam) {
244+
// Execute the last part of ActiveRenderInfo->update (but don't care about the
245+
// renderViewEntity.isSleeping part) because we have overridden it by turning
246+
// thirdPersonView off temporarily.
247+
// However this time with our camera angles instead of the entity's.
248+
// We also don't need to distinguish between thirdPerson and thirdPersonReverse
249+
// cameras
250+
setDirection(MC, yRot + 180.0F, xRot);
251+
252+
if (thirdPersonView > 0) {
253+
movePosition(MC, -calcCameraDistance(MC, 4.0D), 0.0D, 0.0D);
254+
255+
// Make sure the player is rendered for this frame (side effect of temporarily
256+
// disabling thirdPersonView)
257+
setThirdPerson(MC, true);
258+
}
259+
260+
// Set thirdPersonView back to what it was
261+
MC.gameSettings.thirdPersonView = thirdPersonView;
262+
226263
event.setPitch(xRot);
227264
event.setYaw(yRot + 180);
228265
}

src/main/java/nl/pascalroeleven/minecraft/mineshotrevived/util/reflection/PrivateAccessor.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
package nl.pascalroeleven.minecraft.mineshotrevived.util.reflection;
22

3+
import java.lang.reflect.Field;
34
import java.lang.reflect.Method;
45

56
import org.apache.logging.log4j.LogManager;
67
import org.apache.logging.log4j.Logger;
78

89
import net.minecraft.client.MainWindow;
910
import net.minecraft.client.Minecraft;
11+
import net.minecraft.client.renderer.ActiveRenderInfo;
1012
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
1113

1214
public interface PrivateAccessor {
1315
static final Logger L = LogManager.getLogger();
1416

1517
final Method framebufferSizeUpdate = ObfuscationReflectionHelper.findMethod(MainWindow.class, "func_198102_b",
1618
long.class, int.class, int.class);
19+
final Method setDirection = ObfuscationReflectionHelper.findMethod(ActiveRenderInfo.class, "func_216776_a",
20+
float.class, float.class);
21+
final Method movePosition = ObfuscationReflectionHelper.findMethod(ActiveRenderInfo.class, "func_216782_a",
22+
double.class, double.class, double.class);
23+
final Method calcCameraDistance = ObfuscationReflectionHelper.findMethod(ActiveRenderInfo.class, "func_216779_a",
24+
double.class);
25+
static final Field thirdPerson = ObfuscationReflectionHelper.findField(ActiveRenderInfo.class, "field_216799_k");
1726

1827
default void framebufferSizeUpdate(Minecraft mc, int framebufferWidth, int framebufferHeight) {
1928
try {
@@ -23,4 +32,38 @@ default void framebufferSizeUpdate(Minecraft mc, int framebufferWidth, int frame
2332
L.error("onFramebufferSizeUpdate() failed", ex);
2433
}
2534
}
35+
36+
default void setDirection(Minecraft mc, float pitchIn, float yawIn) {
37+
try {
38+
setDirection.invoke(mc.gameRenderer.getActiveRenderInfo(), pitchIn, yawIn);
39+
} catch (Exception ex) {
40+
L.error("setDirection() failed", ex);
41+
}
42+
}
43+
44+
default void movePosition(Minecraft mc, double distanceOffset, double verticalOffset, double horizontalOffset) {
45+
try {
46+
movePosition.invoke(mc.gameRenderer.getActiveRenderInfo(), distanceOffset, verticalOffset,
47+
horizontalOffset);
48+
} catch (Exception ex) {
49+
L.error("movePosition() failed", ex);
50+
}
51+
}
52+
53+
default double calcCameraDistance(Minecraft mc, double startingDistance) {
54+
try {
55+
return (double) calcCameraDistance.invoke(mc.gameRenderer.getActiveRenderInfo(), startingDistance);
56+
} catch (Exception ex) {
57+
L.error("calcCameraDistance() failed", ex);
58+
}
59+
return -1;
60+
}
61+
62+
default void setThirdPerson(Minecraft mc, boolean thirdPersonIn) {
63+
try {
64+
thirdPerson.set(mc.gameRenderer.getActiveRenderInfo(), thirdPersonIn);
65+
} catch (Exception ex) {
66+
L.error("setLook() failed", ex);
67+
}
68+
}
2669
}

0 commit comments

Comments
 (0)