From d31180654ff31376b2e288536337ddb7d8d2bfa0 Mon Sep 17 00:00:00 2001 From: Marius Metzger Date: Mon, 26 Jan 2015 17:20:55 +0100 Subject: [PATCH] Added Keybindings for custom actions (Thumbnail and Lighting) --- .../eu/crushedpixel/replaymod/ReplayMod.java | 13 ++++ .../replaymod/events/GuiEventHandler.java | 13 +++- .../replaymod/events/GuiReplayOverlay.java | 45 +++-------- .../replaymod/registry/KeybindRegistry.java | 24 ++++++ .../replaymod/registry/ReplayGuiRegistry.java | 75 +++++++++++++++++++ .../renderer/SafeEntityRenderer.java | 33 ++++++++ .../replaymod/replay/ReplaySender.java | 4 +- .../screenshot/ReplayScreenshot.java | 3 +- 8 files changed, 171 insertions(+), 39 deletions(-) create mode 100644 src/main/java/eu/crushedpixel/replaymod/registry/KeybindRegistry.java create mode 100644 src/main/java/eu/crushedpixel/replaymod/registry/ReplayGuiRegistry.java create mode 100644 src/main/java/eu/crushedpixel/replaymod/renderer/SafeEntityRenderer.java diff --git a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java index 67b585d7..ac3e31b2 100644 --- a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java +++ b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java @@ -1,5 +1,6 @@ package eu.crushedpixel.replaymod; +import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.config.Property; @@ -15,6 +16,8 @@ import eu.crushedpixel.replaymod.events.GuiEventHandler; import eu.crushedpixel.replaymod.events.GuiReplayOverlay; import eu.crushedpixel.replaymod.events.RecordingHandler; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; +import eu.crushedpixel.replaymod.registry.KeybindRegistry; +import eu.crushedpixel.replaymod.renderer.SafeEntityRenderer; import eu.crushedpixel.replaymod.settings.ReplaySettings; @Mod(modid = ReplayMod.MODID, version = ReplayMod.VERSION) @@ -35,6 +38,8 @@ public class ReplayMod public static final String MODID = "replaymod"; public static final String VERSION = "0.0.1"; + private static final Minecraft mc = Minecraft.getMinecraft(); + public static GuiReplayOverlay overlay = new GuiReplayOverlay(); public static ReplaySettings replaySettings = new ReplaySettings(0, true, true, true, false, false); @@ -83,5 +88,13 @@ public class ReplayMod MinecraftForge.EVENT_BUS.register(overlay); AuthenticationHandler.authenticate(); + + KeybindRegistry.initialize(); + + try { + mc.entityRenderer = new SafeEntityRenderer(mc, mc.entityRenderer); + } catch(Exception e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java index 42f55072..df921d73 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiChat; import net.minecraft.client.gui.GuiDisconnected; @@ -14,6 +15,7 @@ import net.minecraft.client.gui.GuiVideoSettings; import net.minecraft.client.gui.inventory.GuiInventory; import net.minecraft.client.resources.I18n; import net.minecraft.client.settings.GameSettings.Options; +import net.minecraftforge.client.GuiIngameForge; import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; import net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent; @@ -23,6 +25,8 @@ import eu.crushedpixel.replaymod.gui.GuiReplaySaving; import eu.crushedpixel.replaymod.gui.GuiReplaySettings; import eu.crushedpixel.replaymod.gui.replaymanager.GuiReplayManager; import eu.crushedpixel.replaymod.gui.replaymanager.ResourceHelper; +import eu.crushedpixel.replaymod.registry.ReplayGuiRegistry; +import eu.crushedpixel.replaymod.renderer.SafeEntityRenderer; import eu.crushedpixel.replaymod.replay.ReplayHandler; public class GuiEventHandler { @@ -102,12 +106,13 @@ public class GuiEventHandler { mc.displayGuiScreen(new GuiReplaySettings(event.gui)); } - if(ReplayHandler.isReplaying() && event.gui instanceof GuiIngameMenu && event.button.id == 1) { + if(ReplayHandler.replayActive() && event.gui instanceof GuiIngameMenu && event.button.id == 1) { event.button.enabled = false; Thread t = new Thread(new Runnable() { @Override - public void run() { - mc.displayGuiScreen(new GuiReplaySaving(new GuiMainMenu())); + public void run() { + //mc.displayGuiScreen(new GuiReplaySaving(new GuiMainMenu())); + ReplayHandler.setSpeed(1f); ReplayHandler.endReplay(); @@ -115,6 +120,8 @@ public class GuiEventHandler { ReplayHandler.lastExit = System.currentTimeMillis(); mc.theWorld.sendQuittingDisconnectingPacket(); + + ReplayGuiRegistry.show(); } }); t.run(); diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java index 5c8a87af..3ea69b85 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java @@ -42,6 +42,7 @@ import eu.crushedpixel.replaymod.holders.Position; import eu.crushedpixel.replaymod.holders.PositionKeyframe; import eu.crushedpixel.replaymod.holders.TimeKeyframe; import eu.crushedpixel.replaymod.reflection.MCPNames; +import eu.crushedpixel.replaymod.registry.ReplayGuiRegistry; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.replay.ReplayProcess; import eu.crushedpixel.replaymod.screenshot.ReplayScreenshot; @@ -135,21 +136,10 @@ public class GuiReplayOverlay extends Gui { @SubscribeEvent public void onRenderGui(RenderGameOverlayEvent.Post event) throws IllegalArgumentException, IllegalAccessException { if(!ReplayHandler.replayActive()) { - GuiIngameForge.renderExperiance = true; - GuiIngameForge.renderArmor = true; - GuiIngameForge.renderAir = true; - GuiIngameForge.renderHealth = true; - GuiIngameForge.renderHotbar = true; - GuiIngameForge.renderFood = true; - GuiIngameForge.renderBossHealth = true; - GuiIngameForge.renderCrosshairs = true; - GuiIngameForge.renderHelmet = true; - GuiIngameForge.renderPortal = true; - GuiIngameForge.renderHealthMount = true; - GuiIngameForge.renderJumpBar = true; - GuiIngameForge.renderObjective = true; return; } + + ReplayGuiRegistry.hide(); if(event.type == ElementType.PLAYER_LIST) { if(event.isCancelable()) { @@ -157,20 +147,6 @@ public class GuiReplayOverlay extends Gui { } return; } - - GuiIngameForge.renderExperiance = false; - GuiIngameForge.renderArmor = false; - GuiIngameForge.renderAir = false; - GuiIngameForge.renderHealth = false; - GuiIngameForge.renderHotbar = false; - GuiIngameForge.renderFood = false; - GuiIngameForge.renderBossHealth = false; - GuiIngameForge.renderCrosshairs = false; - GuiIngameForge.renderHelmet = false; - GuiIngameForge.renderPortal = false; - GuiIngameForge.renderHealthMount = false; - GuiIngameForge.renderJumpBar = false; - GuiIngameForge.renderObjective = false; GL11.glEnable(GL11.GL_BLEND); drawBlockOutline.set(Minecraft.getMinecraft().entityRenderer, false); @@ -829,10 +805,6 @@ public class GuiReplayOverlay extends Gui { return; } - if(Keyboard.isKeyDown(Keyboard.KEY_V) && !Keyboard.isRepeatEvent()) { - ReplayMod.replaySettings.setLightingEnabled(!ReplayMod.replaySettings.isLightingEnabled()); - } - KeyBinding[] keyBindings = Minecraft.getMinecraft().gameSettings.keyBindings; for(KeyBinding kb : keyBindings) { if(!kb.isKeyDown()) { @@ -875,11 +847,18 @@ public class GuiReplayOverlay extends Gui { continue; } - //TODO: Register key handlers - if(kb.getKeyDescription().equals("key.screenshot") && kb.isPressed()) { + //Custom registered handlers + if(kb.getKeyDescription().equals("key.thumbnail") && kb.isPressed()) { ReplayScreenshot.prepareScreenshot(); requestScreenshot = true; + continue; } + + if(kb.getKeyDescription().equals("key.lighting") && kb.isPressed()) { + ReplayMod.replaySettings.setLightingEnabled(!ReplayMod.replaySettings.isLightingEnabled()); + continue; + } + } catch(Exception e) { e.printStackTrace(); } diff --git a/src/main/java/eu/crushedpixel/replaymod/registry/KeybindRegistry.java b/src/main/java/eu/crushedpixel/replaymod/registry/KeybindRegistry.java new file mode 100644 index 00000000..cf149abd --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/registry/KeybindRegistry.java @@ -0,0 +1,24 @@ +package eu.crushedpixel.replaymod.registry; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; + +import org.lwjgl.input.Keyboard; + +public class KeybindRegistry { + + private static Minecraft mc = Minecraft.getMinecraft(); + + public static void initialize() { + List bindings = new ArrayList(Arrays.asList(mc.gameSettings.keyBindings)); + + bindings.add(new KeyBinding("key.lighting", Keyboard.KEY_V, "category.replaymod")); + bindings.add(new KeyBinding("key.thumbnail", Keyboard.KEY_B, "category.replaymod")); + + mc.gameSettings.keyBindings = bindings.toArray(new KeyBinding[bindings.size()]); + } +} diff --git a/src/main/java/eu/crushedpixel/replaymod/registry/ReplayGuiRegistry.java b/src/main/java/eu/crushedpixel/replaymod/registry/ReplayGuiRegistry.java new file mode 100644 index 00000000..6118ecd8 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/registry/ReplayGuiRegistry.java @@ -0,0 +1,75 @@ +package eu.crushedpixel.replaymod.registry; + +import java.lang.reflect.Field; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraftforge.client.GuiIngameForge; + +public class ReplayGuiRegistry { + + private static Field renderHand; + private static Minecraft mc = Minecraft.getMinecraft(); + + public static boolean hidden = false; + + static { + try { + renderHand = EntityRenderer.class.getDeclaredField("renderHand"); //TODO: MCPNames + renderHand.setAccessible(true); + } catch(Exception e) { + e.printStackTrace(); + } + } + + public static void hide() { + if(hidden) return; + GuiIngameForge.renderExperiance = false; + GuiIngameForge.renderArmor = false; + GuiIngameForge.renderAir = false; + GuiIngameForge.renderHealth = false; + GuiIngameForge.renderHotbar = false; + GuiIngameForge.renderFood = false; + GuiIngameForge.renderBossHealth = false; + GuiIngameForge.renderCrosshairs = false; + GuiIngameForge.renderHelmet = false; + GuiIngameForge.renderPortal = false; + GuiIngameForge.renderHealthMount = false; + GuiIngameForge.renderJumpBar = false; + GuiIngameForge.renderObjective = false; + + try { + renderHand.set(mc.entityRenderer, false); + } catch(Exception e) { + e.printStackTrace(); + } + + hidden = true; + } + + public static void show() { + mc.gameSettings.hideGUI = false; + + GuiIngameForge.renderExperiance = true; + GuiIngameForge.renderArmor = true; + GuiIngameForge.renderAir = true; + GuiIngameForge.renderHealth = true; + GuiIngameForge.renderHotbar = true; + GuiIngameForge.renderFood = true; + GuiIngameForge.renderBossHealth = true; + GuiIngameForge.renderCrosshairs = true; + GuiIngameForge.renderHelmet = true; + GuiIngameForge.renderPortal = true; + GuiIngameForge.renderHealthMount = true; + GuiIngameForge.renderJumpBar = true; + GuiIngameForge.renderObjective = true; + + try { + renderHand.set(mc.entityRenderer, true); + } catch(Exception e) { + e.printStackTrace(); + } + + hidden = false; + } +} diff --git a/src/main/java/eu/crushedpixel/replaymod/renderer/SafeEntityRenderer.java b/src/main/java/eu/crushedpixel/replaymod/renderer/SafeEntityRenderer.java new file mode 100644 index 00000000..440704f6 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/renderer/SafeEntityRenderer.java @@ -0,0 +1,33 @@ +package eu.crushedpixel.replaymod.renderer; + +import java.lang.reflect.Field; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.resources.IResourceManager; + +public class SafeEntityRenderer extends EntityRenderer { + + private static Field resourceManager; + static { + try { + resourceManager = EntityRenderer.class.getDeclaredField("resourceManager"); //TODO: MCPNames + resourceManager.setAccessible(true); + } catch(Exception e) { + e.printStackTrace(); + } + } + + public SafeEntityRenderer(Minecraft mcIn, EntityRenderer renderer) throws IllegalArgumentException, IllegalAccessException { + super(mcIn, (IResourceManager)resourceManager.get(renderer)); + } + + @Override + public void updateCameraAndRender(float partialTicks) { + try { + super.updateCameraAndRender(partialTicks); + } catch(Exception e) {} //This is plain easier than doing proper error prevention. + //If Johni reads this, don't think I'm a bad programmer... Just a lazy one :P + } + +} diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index 68efad6e..14cb4380 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -35,6 +35,7 @@ import net.minecraft.network.play.server.S1DPacketEntityEffect; import net.minecraft.network.play.server.S1FPacketSetExperience; import net.minecraft.network.play.server.S28PacketEffect; import net.minecraft.network.play.server.S29PacketSoundEffect; +import net.minecraft.network.play.server.S2APacketParticles; import net.minecraft.network.play.server.S2BPacketChangeGameState; import net.minecraft.network.play.server.S2DPacketOpenWindow; import net.minecraft.network.play.server.S2EPacketCloseWindow; @@ -385,7 +386,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if(hurryToTimestamp) { //If hurrying, ignore some packets if(p instanceof S45PacketTitle || - p instanceof S29PacketSoundEffect) return; + p instanceof S29PacketSoundEffect || + p instanceof S2APacketParticles) return; } if(p instanceof S02PacketChat) { diff --git a/src/main/java/eu/crushedpixel/replaymod/screenshot/ReplayScreenshot.java b/src/main/java/eu/crushedpixel/replaymod/screenshot/ReplayScreenshot.java index 7e8e4f0a..6a03478f 100644 --- a/src/main/java/eu/crushedpixel/replaymod/screenshot/ReplayScreenshot.java +++ b/src/main/java/eu/crushedpixel/replaymod/screenshot/ReplayScreenshot.java @@ -50,8 +50,7 @@ public class ReplayScreenshot { beforeScreen = mc.currentScreen; } - public static void saveScreenshot(Framebuffer buffer) - { + public static void saveScreenshot(Framebuffer buffer) { try { GuiReplaySaving.replaySaving = true;