Skip to content

[VirtualInput] Patch vanilla getX() functions in EntityRenderer #253

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 18 additions & 7 deletions src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java
Original file line number Diff line number Diff line change
Expand Up @@ -378,13 +378,24 @@ public boolean checkInit() {
}
}));

// title = "cursor";
// y += 14;
// if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y);
// lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> {
// if (Minecraft.getMinecraft().currentScreen == this) return "Mouse Position";
// return String.format("Mouse Cursor: " + TASmodClient.virtual.getNextMouse().getPath().get(0).cursorX + " " + TASmodClient.virtual.getNextMouse().getPath().get(0).cursorY);
// })); TODO Remove?
title = "cursor";
y += 14;
if (configuration.getProperty(title + "_x", "err").equals("err"))
setDefaults(title, y);
lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title
+ "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> {
if (Minecraft.getMinecraft().currentScreen == this)
return "Mouse Position";

Integer xCursor = TASmodClient.virtual.MOUSE.getInterpolatedX(0, false);
Integer yCursor = TASmodClient.virtual.MOUSE.getInterpolatedY(0, false);

if (Minecraft.getMinecraft().currentScreen != null)
return String.format("Mouse Cursor: %s %s", xCursor == null ? "null" : xCursor, yCursor == null ? "null" : yCursor);
else
return "Mouse Cursor: 0 0";

}));

// title = "trajectories";
// y += 14;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,4 +211,16 @@ private float redirectCam(float pitch, float yaw) {
// Update yaw
return yaw2;
}

@Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lorg/lwjgl/input/Mouse;getX()I"))
public int redirect_updateCameraAndRendererX() {
int interpolatedX = TASmodClient.virtual.MOUSE.getInterpolatedX(Minecraft.getMinecraft().timer.renderPartialTicks, TASmodClient.controller.isPlayingback());
return interpolatedX;
}

@Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lorg/lwjgl/input/Mouse;getY()I"))
public int redirect_updateCameraAndRendererY() {
int interpolatedY = TASmodClient.virtual.MOUSE.getInterpolatedY(Minecraft.getMinecraft().timer.renderPartialTicks, TASmodClient.controller.isPlayingback());
return interpolatedY;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
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.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import com.minecrafttas.tasmod.TASmodClient;
import com.minecrafttas.tasmod.util.Ducks.GuiScreenDuck;
Expand Down Expand Up @@ -103,6 +105,11 @@ private static boolean redirectIsAltKeyDown(int i) {

// =====================================================================================================================================

@Inject(method = "drawScreen", at = @At("HEAD"))
private void injectDrawScreen(int i, int j, float f, CallbackInfo ci) {
TASmodClient.controller.onDrawScreen((GuiScreen) (Object) this, i, j); // TODO Replace with event
}

@Shadow
private int width;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,12 @@
import com.minecrafttas.tasmod.registries.TASmodPackets;
import com.minecrafttas.tasmod.util.Ducks.GuiScreenDuck;
import com.minecrafttas.tasmod.util.LoggerMarkers;
import com.minecrafttas.tasmod.util.PointerNormalizer;
import com.minecrafttas.tasmod.util.Scheduler.Task;
import com.minecrafttas.tasmod.virtual.VirtualCameraAngle;
import com.minecrafttas.tasmod.virtual.VirtualInput;
import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualCameraAngleInput;
import com.minecrafttas.tasmod.virtual.VirtualKeyboard;
import com.minecrafttas.tasmod.virtual.VirtualMouse;
import com.minecrafttas.tasmod.virtual.event.VirtualMouseEvent;

import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
Expand Down Expand Up @@ -100,9 +98,8 @@ public class PlaybackControllerClient implements

EventVirtualInput.EventVirtualKeyboardTick,
EventVirtualInput.EventVirtualMouseTick,
EventVirtualInput.EventVirtualCameraAngleTick,
EventVirtualInput.EventVirtualCameraAngleTick

EventVirtualInput.EventVirtualMouseSubtick
//@formatter:on
{
private Logger logger = TASmod.LOGGER;
Expand Down Expand Up @@ -406,35 +403,16 @@ public VirtualCameraAngle onVirtualCameraTick(VirtualCameraAngle vcamera) {
/**
* Updates the cursor location on screen
*/
@Override
public void onVirtualMouseSubtick(VirtualMouseEvent event) {
if (!isPlayingback() || event == null)
public void onDrawScreen(GuiScreen screen, int x, int y) {
if (!isPlayingback())
return;

Minecraft mc = Minecraft.getMinecraft();
if (!mc.gameSettings.pauseOnLostFocus && !Display.isActive()) // If pause on lost focus is on and the display is not active don't set the cursor position
return;

GuiScreen screen = mc.currentScreen;
if (screen == null)
return;

GuiScreenDuck duckedScreen = (GuiScreenDuck) mc.currentScreen;
//@formatter:off
Mouse.setCursorPosition(
duckedScreen.rescaleX(
PointerNormalizer.reapplyScalingX(
event.getCursorX()
)
),
duckedScreen.rescaleY(
PointerNormalizer.reapplyScalingY(
event.getCursorY()
)

)
);
//@formatter:on
GuiScreenDuck duckedScreen = (GuiScreenDuck) screen;
Mouse.setCursorPosition(duckedScreen.rescaleX(x), duckedScreen.rescaleY(y));
}

/**
Expand Down
71 changes: 69 additions & 2 deletions src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.minecrafttas.tasmod.mixin.playbackhooks.MixinEntityRenderer;
import com.minecrafttas.tasmod.mixin.playbackhooks.MixinMinecraft;
import com.minecrafttas.tasmod.util.Ducks;
import com.minecrafttas.tasmod.util.Ducks.GuiScreenDuck;
import com.minecrafttas.tasmod.util.Ducks.SubtickDuck;
import com.minecrafttas.tasmod.util.LoggerMarkers;
import com.minecrafttas.tasmod.util.PointerNormalizer;
Expand Down Expand Up @@ -295,7 +296,11 @@ public void nextKeyboardTick() {
* @return If a keyboard event is in {@link #keyboardEventQueue}
*/
public boolean nextKeyboardSubtick() {
boolean isPolled = (currentKeyboardEvent = keyboardEventQueue.poll()) != null;
VirtualKeyboardEvent newKeyboardEvent = keyboardEventQueue.poll();
boolean isPolled = newKeyboardEvent != null;
if (isPolled) {
currentKeyboardEvent = newKeyboardEvent;
}
EventListenerRegistry.fireEvent(EventVirtualInput.EventVirtualKeyboardSubtick.class, currentKeyboardEvent);
return isPolled;
}
Expand Down Expand Up @@ -420,6 +425,8 @@ public class VirtualMouseInput {
*/
private VirtualMouseEvent currentMouseEvent = new VirtualMouseEvent();

private final List<VirtualMouse> mousePointerInterpolationStates = new ArrayList<>();

/**
* Constructor to preload the {@link #currentMouse} with an existing mouse
* @param preloadedMouse The new {@link #currentMouse}
Expand Down Expand Up @@ -452,6 +459,8 @@ public void updateNextMouse(int keycode, boolean keystate, int scrollwheel, int
*/
public void nextMouseTick() {
nextMouse.deepCopyFrom((VirtualMouse) EventListenerRegistry.fireEvent(EventVirtualInput.EventVirtualMouseTick.class, nextMouse));
mousePointerInterpolationStates.clear();
nextMouse.getStates(mousePointerInterpolationStates);
currentMouse.getVirtualEvents(nextMouse, mouseEventQueue);
currentMouse.moveFrom(nextMouse);
}
Expand All @@ -464,7 +473,11 @@ public void nextMouseTick() {
* @return If a mouse event is in {@link #mouseEventQueue}
*/
public boolean nextMouseSubtick() {
boolean isPolled = (currentMouseEvent = mouseEventQueue.poll()) != null;
VirtualMouseEvent newMouseEvent = mouseEventQueue.poll();
boolean isPolled = newMouseEvent != null;
if (isPolled) {
currentMouseEvent = newMouseEvent;
}
EventListenerRegistry.fireEvent(EventVirtualInput.EventVirtualMouseSubtick.class, currentMouseEvent);
return isPolled;
}
Expand Down Expand Up @@ -537,6 +550,60 @@ public boolean willKeyBeDown(int keycode) {
return nextMouse.isKeyDown(keycode);
}

/**
* Gets the absolute coordinates of the camera angle
*
* @param partialTick The partial ticks of the timer
* @param pitch The original pitch of the camera
* @param yaw The original yaw of the camera
* @param enable Whether the custom interpolation is enabled. Enabled during playback.
* @return A triple of pitch, yaw and roll, as left, middle and right respectively
*/
public int getInterpolatedX(float partialTick, boolean enable) {

int interpolatedPointerX = nextMouse.getCursorX();

if (enable && !mousePointerInterpolationStates.isEmpty()) {
int index = (int) MathHelper.clampedLerp(0, mousePointerInterpolationStates.size() - 1, partialTick); // Get interpolate index

VirtualMouse interpolatedCamera = mousePointerInterpolationStates.get(index);

interpolatedPointerX = interpolatedCamera.getCursorX();

}
Minecraft mc = Minecraft.getMinecraft();
GuiScreenDuck gui = (GuiScreenDuck) mc.currentScreen;

if (gui != null) {
interpolatedPointerX = gui.rescaleX(PointerNormalizer.reapplyScalingX(interpolatedPointerX));
}

return interpolatedPointerX;
}

public int getInterpolatedY(float partialTick, boolean enable) {

int interpolatedPointerY = nextMouse.getCursorY();

if (enable && !mousePointerInterpolationStates.isEmpty()) {
int index = (int) MathHelper.clampedLerp(0, mousePointerInterpolationStates.size() - 1, partialTick); // Get interpolate index

VirtualMouse interpolatedCamera = mousePointerInterpolationStates.get(index);

interpolatedPointerY = interpolatedCamera.getCursorY();

}

Minecraft mc = Minecraft.getMinecraft();
GuiScreenDuck gui = (GuiScreenDuck) mc.currentScreen;

if (gui != null) {
interpolatedPointerY = gui.rescaleY(PointerNormalizer.reapplyScalingY(interpolatedPointerY));
}

return interpolatedPointerY;
}

/**
* Clears the {@link #nextMouse}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,4 +358,11 @@ public int getCursorY() {
public boolean isEmpty() {
return super.isEmpty() && scrollWheel == 0 && cursorX == 0 && cursorY == 0;
}

public void getStates(List<VirtualMouse> reference) {
if (isParent()) {
reference.addAll(subtickList);
reference.add(this.shallowClone());
}
}
}