From b4905315116893cffddfdc1b23da2228161382b0 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Sun, 8 Nov 2015 12:38:42 +0100 Subject: [PATCH] Add spectating --- .../com/replaymod/replay/ReplayHandler.java | 7 ++++ .../replaymod/replay/camera/CameraEntity.java | 16 ++++++++ .../camera/SpectatorCameraController.java | 38 +++++++++++++++++++ .../events/handlers/SpectatingHandler.java | 16 -------- 4 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java delete mode 100644 src/main/java/eu/crushedpixel/replaymod/events/handlers/SpectatingHandler.java diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 33d92bcf..8793135d 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -3,6 +3,7 @@ package com.replaymod.replay; import com.google.common.base.Preconditions; import com.mojang.authlib.GameProfile; import com.replaymod.replay.camera.CameraEntity; +import com.replaymod.replay.camera.SpectatorCameraController; import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayOpenEvent; import com.replaymod.replay.gui.overlay.GuiReplayOverlay; @@ -208,6 +209,12 @@ public class ReplayHandler { spectating = e.getUniqueID(); } + if (e == cameraEntity) { + cameraEntity.setCameraController(ReplayModReplay.instance.createCameraController(cameraEntity)); + } else { + cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity)); + } + if (mc.getRenderViewEntity() != e) { mc.setRenderViewEntity(e); cameraEntity.setCameraPosRot(e); diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index 087076f7..98c13cc2 100755 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -11,6 +11,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.item.EntityItemFrame; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.stats.StatFileWriter; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; @@ -214,9 +217,22 @@ public class CameraEntity extends EntityPlayerSP { long timePassed = now - lastControllerUpdate; cameraController.update(timePassed / 50f); lastControllerUpdate = now; + + if (mc.gameSettings.keyBindAttack.isPressed() || mc.gameSettings.keyBindUseItem.isPressed()) { + if (canSpectate(mc.pointedEntity)) { + ReplayModReplay.instance.getReplayHandler().spectateEntity(mc.pointedEntity); + // Make sure we don't exit right away + mc.gameSettings.keyBindSneak.pressTime = 0; + } + } } } + public boolean canSpectate(Entity e) { + return e != null && !e.isInvisible() + && (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame); + } + @SubscribeEvent public void onSettingsChanged(SettingsChangedEvent event) { if (event.getKey() == Setting.CAMERA) { diff --git a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java new file mode 100644 index 00000000..45008cf3 --- /dev/null +++ b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java @@ -0,0 +1,38 @@ +package com.replaymod.replay.camera; + +import com.replaymod.replay.ReplayModReplay; +import lombok.RequiredArgsConstructor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; + +import java.util.Arrays; + +@RequiredArgsConstructor +public class SpectatorCameraController implements CameraController { + private final CameraEntity camera; + + @Override + public void update(float partialTicksPassed) { + Minecraft mc = Minecraft.getMinecraft(); + if (mc.gameSettings.keyBindSneak.isPressed()) { + ReplayModReplay.instance.getReplayHandler().spectateCamera(); + } + + // Soak up all remaining key presses + for (KeyBinding binding : Arrays.asList(mc.gameSettings.keyBindAttack, mc.gameSettings.keyBindUseItem, + mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak, mc.gameSettings.keyBindForward, + mc.gameSettings.keyBindBack, mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight)) { + binding.pressTime = 0; + } + } + + @Override + public void increaseSpeed() { + + } + + @Override + public void decreaseSpeed() { + + } +} diff --git a/src/main/java/eu/crushedpixel/replaymod/events/handlers/SpectatingHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/handlers/SpectatingHandler.java deleted file mode 100644 index ae310ec8..00000000 --- a/src/main/java/eu/crushedpixel/replaymod/events/handlers/SpectatingHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package eu.crushedpixel.replaymod.events.handlers; - -import net.minecraft.client.Minecraft; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.item.EntityItemFrame; -import net.minecraft.entity.player.EntityPlayer; - -public class SpectatingHandler { - - private static Minecraft mc = Minecraft.getMinecraft(); - - public static boolean canSpectate(Entity e) { - return ((e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame) && e != mc.thePlayer && !e.isInvisible()); - } -}