diff --git a/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Minecraft.java b/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Minecraft.java index 4d21f601..e56feda3 100644 --- a/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Minecraft.java +++ b/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Minecraft.java @@ -129,6 +129,13 @@ public static void toggleSprint() { sprintToggled = !sprintToggled; } + public static Player.KeyInput getKeyInput() { + return Interface.get().map(Interface::getKeyInput).orElseGet(() -> { + API.LOGGER.info(API.COMPATIBILITY_MARKER, "Failed to get inputs, are you playing on an unsupported minecraft version?"); + return null; + }); + } + public enum WorldState { MENU, @@ -165,5 +172,7 @@ static Optional get() { boolean isF3Enabled(); void sendPacket(MPKPacket packet); + + Player.KeyInput getKeyInput(); } } diff --git a/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Player.java b/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Player.java index c42e9449..afecf0cd 100644 --- a/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Player.java +++ b/common/src/main/java/io/github/kurrycat/mpkmod/compatibility/MCClasses/Player.java @@ -99,7 +99,7 @@ public Float getLast45() { } public Player constructKeyInput() { - keyInput = KeyInput.construct(); + keyInput = Minecraft.getKeyInput(); return this; } @@ -511,9 +511,7 @@ public static class KeyInput { public boolean sneak = false; public boolean jump = false; - public KeyInput() { - - } + public KeyInput() {} public KeyInput(boolean forward, boolean left, boolean back, boolean right, boolean sprint, boolean sneak, boolean jump) { this.forward = forward; @@ -525,19 +523,6 @@ public KeyInput(boolean forward, boolean left, boolean back, boolean right, bool this.jump = jump; } - public static KeyInput construct() { - KeyInput k = new KeyInput(); - for (Field f : KeyInput.class.getDeclaredFields()) { - KeyBinding b = KeyBinding.getByName("key." + f.getName()); - if (b == null) continue; - try { - f.set(k, b.isKeyDown()); - } catch (IllegalAccessException ignored) { - } - } - return k; - } - public String toString() { return "{W:" + forward + ", A:" + left + ", S:" + back + ", D:" + right + ", N:" + sneak + ", P:" + sprint + ", J:" + jump + "}"; } diff --git a/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/EventHandler.java b/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/EventHandler.java index e56ef2ae..b22eae4d 100644 --- a/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/EventHandler.java +++ b/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/EventHandler.java @@ -20,6 +20,7 @@ import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; import net.minecraft.util.Util; +import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -135,25 +136,30 @@ public void onClientTickStart(Minecraft mc) { public void onClientTickEnd(Minecraft mc) { if (mc.isPaused() || mc.level == null) return; - LocalPlayer mcPlayer = mc.player; - - if (mcPlayer != null) { - AABB playerBB = mcPlayer.getBoundingBox(); - new Player() - .setPos(new Vector3D(mcPlayer.getX(), mcPlayer.getY(), mcPlayer.getZ())) - .setLastPos(new Vector3D(mcPlayer.xo, mcPlayer.yo, mcPlayer.zo)) - .setMotion(new Vector3D(mcPlayer.getDeltaMovement().x, mcPlayer.getDeltaMovement().y, mcPlayer.getDeltaMovement().z)) - .setRotation(mcPlayer.getRotationVector().y, mcPlayer.getRotationVector().x) - .setOnGround(mcPlayer.onGround()) - .setSprinting(mcPlayer.isSprinting()) + Entity cameraEntity = mc.getCameraEntity(); + + if (cameraEntity != null) { + AABB cameraEntityBB = cameraEntity.getBoundingBox(); + Player mpkPlayer = new Player() + .setPos(new Vector3D(cameraEntity.getX(), cameraEntity.getY(), cameraEntity.getZ())) + .setLastPos(new Vector3D(cameraEntity.xo, cameraEntity.yo, cameraEntity.zo)) + .setMotion(new Vector3D(cameraEntity.getDeltaMovement().x, cameraEntity.getDeltaMovement().y, cameraEntity.getDeltaMovement().z)) + .setRotation(cameraEntity.getRotationVector().y, cameraEntity.getRotationVector().x) + .setOnGround(cameraEntity.onGround()) + .setSprinting(cameraEntity.isSprinting()) .setBoundingBox(new BoundingBox3D( - new Vector3D(playerBB.minX, playerBB.minY, playerBB.minZ), - new Vector3D(playerBB.maxX, playerBB.maxY, playerBB.maxZ) + new Vector3D(cameraEntityBB.minX, cameraEntityBB.minY, cameraEntityBB.minZ), + new Vector3D(cameraEntityBB.maxX, cameraEntityBB.maxY, cameraEntityBB.maxZ) )) - .setFlying(mcPlayer.getAbilities().flying) .constructKeyInput() - .setKeyMSList(timeQueue) - .buildAndSave(); + .setKeyMSList(timeQueue); + + if (cameraEntity instanceof net.minecraft.world.entity.player.Player player) { + mpkPlayer.setFlying(player.getAbilities().flying); + } + + mpkPlayer.buildAndSave(); + timeQueue.clear(); } diff --git a/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/FunctionCompatibility.java b/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/FunctionCompatibility.java index b0ff324c..71e32e57 100644 --- a/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/FunctionCompatibility.java +++ b/fabric-26.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/fabric_26_2/FunctionCompatibility.java @@ -32,6 +32,8 @@ import net.minecraft.util.ARGB; import net.minecraft.util.Mth; import net.minecraft.util.Util; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; @@ -373,6 +375,35 @@ public void endSection() { net.minecraft.util.profiling.Profiler.get().pop(); } + @Override + public Player.KeyInput getKeyInput() { + Entity cameraEntity = net.minecraft.client.Minecraft.getInstance().getCameraEntity(); + if (!(cameraEntity instanceof LivingEntity le)) return new Player.KeyInput(); + + boolean w, a, s, d, sprint, sneak, jump; + if (cameraEntity instanceof LocalPlayer lp) { + w = lp.input.keyPresses.forward(); + a = lp.input.keyPresses.left(); + s = lp.input.keyPresses.backward(); + d = lp.input.keyPresses.right(); + + sprint = lp.input.keyPresses.sprint(); + sneak = lp.input.keyPresses.shift(); + jump = lp.input.keyPresses.jump(); + } else { + w = le.zza > 0; + a = le.xxa > 0; + s = le.zza < 0; + d = le.xxa < 0; + + sprint = le.isSprinting(); + sneak = le.isShiftKeyDown(); + jump = le.isJumping(); + } + + return new Player.KeyInput(w, a, s, d, sprint, sneak, jump); + } + private record PointsRenderState( Collection points, int r, int g, int b, int a, diff --git a/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/EventListener.java b/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/EventListener.java index ac0a56f7..5203a88a 100644 --- a/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/EventListener.java +++ b/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/EventListener.java @@ -9,9 +9,10 @@ import io.github.kurrycat.mpkmod.util.Mouse; import io.github.kurrycat.mpkmod.util.Vector3D; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.client.event.MouseEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; @@ -102,28 +103,33 @@ private void checkKeyBinding(int keyCode) { public void onTick(TickEvent.ClientTickEvent e) { Minecraft mc = Minecraft.getMinecraft(); if (mc.isGamePaused() || mc.world == null) return; - EntityPlayerSP mcPlayer = mc.player; + Entity cameraEntity = mc.getRenderViewEntity(); if (e.type != TickEvent.Type.CLIENT) return; if (e.side != Side.CLIENT) return; - if (mcPlayer != null && e.phase == TickEvent.Phase.END) { - AxisAlignedBB playerBB = mcPlayer.getEntityBoundingBox(); - new Player() - .setPos(new Vector3D(mcPlayer.posX, mcPlayer.posY, mcPlayer.posZ)) - .setLastPos(new Vector3D(mcPlayer.lastTickPosX, mcPlayer.lastTickPosY, mcPlayer.lastTickPosZ)) - .setMotion(new Vector3D(mcPlayer.motionX, mcPlayer.motionY, mcPlayer.motionZ)) - .setRotation(mcPlayer.rotationYaw, mcPlayer.rotationPitch) - .setOnGround(mcPlayer.onGround) - .setSprinting(mcPlayer.isSprinting()) + if (cameraEntity != null && e.phase == TickEvent.Phase.END) { + AxisAlignedBB cameraEntityBB = cameraEntity.getEntityBoundingBox(); + Player mpkPlayer = new Player() + .setPos(new Vector3D(cameraEntity.posX, cameraEntity.posY, cameraEntity.posZ)) + .setLastPos(new Vector3D(cameraEntity.lastTickPosX, cameraEntity.lastTickPosY, cameraEntity.lastTickPosZ)) + .setMotion(new Vector3D(cameraEntity.motionX, cameraEntity.motionY, cameraEntity.motionZ)) + .setRotation(cameraEntity.rotationYaw, cameraEntity.rotationPitch) + .setOnGround(cameraEntity.onGround) + .setSprinting(cameraEntity.isSprinting()) .setBoundingBox(new BoundingBox3D( - new Vector3D(playerBB.minX, playerBB.minY, playerBB.minZ), - new Vector3D(playerBB.maxX, playerBB.maxY, playerBB.maxZ) + new Vector3D(cameraEntityBB.minX, cameraEntityBB.minY, cameraEntityBB.minZ), + new Vector3D(cameraEntityBB.maxX, cameraEntityBB.maxY, cameraEntityBB.maxZ) )) - .setFlying(mcPlayer.capabilities.isFlying) .constructKeyInput() - .setKeyMSList(timeQueue.copy()) - .buildAndSave(); + .setKeyMSList(timeQueue.copy()); + + if (cameraEntity instanceof EntityPlayer) { + mpkPlayer.setFlying(((EntityPlayer) cameraEntity).capabilities.isFlying); + } + + mpkPlayer.buildAndSave(); + timeQueue.clear(); } if (e.phase == TickEvent.Phase.START) { diff --git a/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/FunctionCompatibility.java b/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/FunctionCompatibility.java index 482421e6..130cd815 100644 --- a/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/FunctionCompatibility.java +++ b/forge-1.12.2/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_12_2/FunctionCompatibility.java @@ -18,6 +18,7 @@ import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.SoundEvents; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -30,6 +31,7 @@ import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; +import java.lang.reflect.Field; import java.util.*; import java.util.List; import java.util.stream.Collectors; @@ -464,4 +466,44 @@ public void endStartSection(String name) { public void endSection() { Minecraft.getMinecraft().profiler.endSection(); } + + @Override + public Player.KeyInput getKeyInput() { + Entity ce = Minecraft.getMinecraft().getRenderViewEntity(); + if (!(ce instanceof EntityLivingBase)) return new Player.KeyInput(); + + boolean w, a, s, d, sprint, sneak, jump; + if (ce instanceof EntityPlayerSP) { + GameSettings gs = Minecraft.getMinecraft().gameSettings; + + w = gs.keyBindForward.isKeyDown(); + a = gs.keyBindLeft.isKeyDown(); + s = gs.keyBindBack.isKeyDown(); + d = gs.keyBindRight.isKeyDown(); + + sprint = gs.keyBindSprint.isKeyDown(); + sneak = gs.keyBindSneak.isKeyDown(); + jump = gs.keyBindJump.isKeyDown(); + } else { + EntityLivingBase elb = (EntityLivingBase) ce; + + w = elb.moveForward > 0; + a = elb.moveStrafing > 0; + s = elb.moveForward < 0; + d = elb.moveStrafing < 0; + + sprint = elb.isSprinting(); + sneak = elb.isSneaking(); + + jump = false; + try { + Field isJumpingField = EntityLivingBase.class.getDeclaredField("isJumping"); + isJumpingField.setAccessible(true); + + jump = isJumpingField.getBoolean(elb); + } catch (NoSuchFieldException | IllegalAccessException ignored) {} + } + + return new Player.KeyInput(w, a, s, d, sprint, sneak, jump); + } } diff --git a/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/EventListener.java b/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/EventListener.java index 2c3920af..190c1c69 100644 --- a/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/EventListener.java +++ b/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/EventListener.java @@ -9,9 +9,10 @@ import io.github.kurrycat.mpkmod.util.Mouse; import io.github.kurrycat.mpkmod.util.Vector3D; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.client.event.MouseEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; @@ -102,28 +103,33 @@ private void checkKeyBinding(int keyCode) { public void onTick(TickEvent.ClientTickEvent e) { Minecraft mc = Minecraft.getMinecraft(); if (mc.isGamePaused() || mc.theWorld == null) return; - EntityPlayerSP mcPlayer = mc.thePlayer; + Entity cameraEntity = mc.getRenderViewEntity(); if (e.type != TickEvent.Type.CLIENT) return; if (e.side != Side.CLIENT) return; - if (mcPlayer != null && e.phase == TickEvent.Phase.END) { - AxisAlignedBB playerBB = mcPlayer.getEntityBoundingBox(); - new Player() - .setPos(new Vector3D(mcPlayer.posX, mcPlayer.posY, mcPlayer.posZ)) - .setLastPos(new Vector3D(mcPlayer.lastTickPosX, mcPlayer.lastTickPosY, mcPlayer.lastTickPosZ)) - .setMotion(new Vector3D(mcPlayer.motionX, mcPlayer.motionY, mcPlayer.motionZ)) - .setRotation(mcPlayer.rotationYaw, mcPlayer.rotationPitch) - .setOnGround(mcPlayer.onGround) - .setSprinting(mcPlayer.isSprinting()) + if (cameraEntity != null && e.phase == TickEvent.Phase.END) { + AxisAlignedBB cameraEntityBB = cameraEntity.getEntityBoundingBox(); + Player mpkPlayer = new Player() + .setPos(new Vector3D(cameraEntity.posX, cameraEntity.posY, cameraEntity.posZ)) + .setLastPos(new Vector3D(cameraEntity.lastTickPosX, cameraEntity.lastTickPosY, cameraEntity.lastTickPosZ)) + .setMotion(new Vector3D(cameraEntity.motionX, cameraEntity.motionY, cameraEntity.motionZ)) + .setRotation(cameraEntity.rotationYaw, cameraEntity.rotationPitch) + .setOnGround(cameraEntity.onGround) + .setSprinting(cameraEntity.isSprinting()) .setBoundingBox(new BoundingBox3D( - new Vector3D(playerBB.minX, playerBB.minY, playerBB.minZ), - new Vector3D(playerBB.maxX, playerBB.maxY, playerBB.maxZ) + new Vector3D(cameraEntityBB.minX, cameraEntityBB.minY, cameraEntityBB.minZ), + new Vector3D(cameraEntityBB.maxX, cameraEntityBB.maxY, cameraEntityBB.maxZ) )) - .setFlying(mcPlayer.capabilities.isFlying) .constructKeyInput() - .setKeyMSList(timeQueue.copy()) - .buildAndSave(); + .setKeyMSList(timeQueue.copy()); + + if (cameraEntity instanceof EntityPlayer) { + mpkPlayer.setFlying(((EntityPlayer) cameraEntity).capabilities.isFlying); + } + + mpkPlayer.buildAndSave(); + timeQueue.clear(); } if (e.phase == TickEvent.Phase.START) { diff --git a/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/FunctionCompatibility.java b/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/FunctionCompatibility.java index 9726a9d8..fc8f69b6 100644 --- a/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/FunctionCompatibility.java +++ b/forge-1.8.9/src/main/java/io/github/kurrycat/mpkmod/compatibility/forge_1_8/FunctionCompatibility.java @@ -19,6 +19,7 @@ import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; @@ -31,6 +32,7 @@ import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; +import java.lang.reflect.Field; import java.util.*; import java.util.List; import java.util.stream.Collectors; @@ -465,4 +467,44 @@ public void endStartSection(String name) { public void endSection() { Minecraft.getMinecraft().mcProfiler.endSection(); } + + @Override + public Player.KeyInput getKeyInput() { + Entity ce = Minecraft.getMinecraft().getRenderViewEntity(); + if (!(ce instanceof EntityLivingBase)) return new Player.KeyInput(); + + boolean w, a, s, d, sprint, sneak, jump; + if (ce instanceof EntityPlayerSP) { + GameSettings gs = Minecraft.getMinecraft().gameSettings; + + w = gs.keyBindForward.isKeyDown(); + a = gs.keyBindLeft.isKeyDown(); + s = gs.keyBindBack.isKeyDown(); + d = gs.keyBindRight.isKeyDown(); + + sprint = gs.keyBindSprint.isKeyDown(); + sneak = gs.keyBindSneak.isKeyDown(); + jump = gs.keyBindJump.isKeyDown(); + } else { + EntityLivingBase elb = (EntityLivingBase) ce; + + w = elb.moveForward > 0; + a = elb.moveStrafing > 0; + s = elb.moveForward < 0; + d = elb.moveStrafing < 0; + + sprint = elb.isSprinting(); + sneak = elb.isSneaking(); + + jump = false; + try { + Field isJumpingField = EntityLivingBase.class.getDeclaredField("isJumping"); + isJumpingField.setAccessible(true); + + jump = isJumpingField.getBoolean(elb); + } catch (NoSuchFieldException | IllegalAccessException ignored) {} + } + + return new Player.KeyInput(w, a, s, d, sprint, sneak, jump); + } }