From 06a46e6f386d828a12187bcb53171cfb2cd29f04 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sat, 27 Feb 2021 15:49:40 +0100 Subject: [PATCH] Use callback-style events for crosshair and hotbar render events --- .../replaymod/replay/camera/CameraEntity.java | 22 ++++++------------- .../replay/events/RenderHotbarCallback.java | 19 ++++++++++++++++ .../RenderSpectatorCrosshairCallback.java | 2 -- .../replay/mixin/MixinInGameHud.java | 10 +++++++++ .../core/versions/forge/EventsAdapter.java | 20 +++++++++++++++++ 5 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/replaymod/replay/events/RenderHotbarCallback.java diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index ea28d740..31151cac 100644 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -8,6 +8,8 @@ import com.replaymod.core.events.PreRenderCallback; import com.replaymod.core.events.PreRenderHandCallback; import com.replaymod.core.events.SettingsChangedCallback; import com.replaymod.replay.ReplayHandler; +import com.replaymod.replay.events.RenderHotbarCallback; +import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; import de.johni0702.minecraft.gui.utils.EventRegistrations; import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback; import com.replaymod.core.utils.Utils; @@ -28,7 +30,6 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.Box; //#if FABRIC>=1 -import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; //#else //$$ import com.replaymod.core.versions.MCVer; //$$ import net.minecraftforge.client.event.EntityViewRenderEvent; @@ -680,24 +681,15 @@ public class CameraEntity { on(KeyBindingEventCallback.EVENT, CameraEntity.this::handleInputEvents); } - //#if FABRIC>=1 { on(RenderSpectatorCrosshairCallback.EVENT, this::shouldRenderSpectatorCrosshair); } private Boolean shouldRenderSpectatorCrosshair() { return canSpectate(mc.targetedEntity); } - //#else - //$$ @SubscribeEvent - //$$ public void preCrosshairRender(RenderGameOverlayEvent.Pre event) { - //$$ // The crosshair should only render if targeted entity can actually be spectated - //$$ if (MCVer.getType(event) == RenderGameOverlayEvent.ElementType.CROSSHAIRS) { - //$$ event.setCanceled(!canSpectate(mc.pointedEntity)); - //$$ } - //$$ // Hotbar should never be rendered - //$$ if (MCVer.getType(event) == RenderGameOverlayEvent.ElementType.HOTBAR) { - //$$ event.setCanceled(true); - //$$ } - //$$ } - //#endif + + { on(RenderHotbarCallback.EVENT, this::shouldRenderHotbar); } + private Boolean shouldRenderHotbar() { + return false; + } { on(SettingsChangedCallback.EVENT, this::onSettingsChanged); } private void onSettingsChanged(SettingsRegistry registry, SettingsRegistry.SettingKey key) { diff --git a/src/main/java/com/replaymod/replay/events/RenderHotbarCallback.java b/src/main/java/com/replaymod/replay/events/RenderHotbarCallback.java new file mode 100644 index 00000000..36e1667c --- /dev/null +++ b/src/main/java/com/replaymod/replay/events/RenderHotbarCallback.java @@ -0,0 +1,19 @@ +package com.replaymod.replay.events; + +import de.johni0702.minecraft.gui.utils.Event; + +public interface RenderHotbarCallback { + Event EVENT = Event.create((listeners) -> + () -> { + for (RenderHotbarCallback listener : listeners) { + Boolean state = listener.shouldRenderHotbar(); + if (state != null) { + return state; + } + } + return null; + } + ); + + Boolean shouldRenderHotbar(); +} diff --git a/src/main/java/com/replaymod/replay/events/RenderSpectatorCrosshairCallback.java b/src/main/java/com/replaymod/replay/events/RenderSpectatorCrosshairCallback.java index 47ce1418..bad49102 100644 --- a/src/main/java/com/replaymod/replay/events/RenderSpectatorCrosshairCallback.java +++ b/src/main/java/com/replaymod/replay/events/RenderSpectatorCrosshairCallback.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.replay.events; import de.johni0702.minecraft.gui.utils.Event; @@ -18,4 +17,3 @@ public interface RenderSpectatorCrosshairCallback { Boolean shouldRenderSpectatorCrosshair(); } -//#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinInGameHud.java b/src/main/java/com/replaymod/replay/mixin/MixinInGameHud.java index 82f720a8..88431748 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinInGameHud.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinInGameHud.java @@ -1,11 +1,13 @@ //#if MC>=11400 package com.replaymod.replay.mixin; +import com.replaymod.replay.events.RenderHotbarCallback; import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; import net.minecraft.client.gui.hud.InGameHud; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(InGameHud.class) @@ -17,5 +19,13 @@ public class MixinInGameHud { ci.setReturnValue(state); } } + + @Inject(method = "renderHotbar", at = @At("HEAD"), cancellable = true) + private void shouldRenderHotbar(CallbackInfo ci) { + Boolean state = RenderHotbarCallback.EVENT.invoker().shouldRenderHotbar(); + if (state == Boolean.FALSE) { + ci.cancel(); + } + } } //#endif diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java b/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java index 02e5574f..2083b9fc 100644 --- a/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java +++ b/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java @@ -5,8 +5,12 @@ import com.replaymod.core.events.PostRenderCallback; import com.replaymod.core.events.PostRenderWorldCallback; import com.replaymod.core.events.PreRenderCallback; import com.replaymod.core.events.PreRenderHandCallback; +import com.replaymod.core.versions.MCVer; +import com.replaymod.replay.events.RenderHotbarCallback; +import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; import de.johni0702.minecraft.gui.utils.EventRegistrations; import de.johni0702.minecraft.gui.versions.MatrixStack; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -47,4 +51,20 @@ public class EventsAdapter extends EventRegistrations { event.setCanceled(true); } } + + @SubscribeEvent + public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { + Boolean result = null; + switch (MCVer.getType(event)) { + case CROSSHAIRS: + result = RenderSpectatorCrosshairCallback.EVENT.invoker().shouldRenderSpectatorCrosshair(); + break; + case HOTBAR: + result = RenderHotbarCallback.EVENT.invoker().shouldRenderHotbar(); + break; + } + if (result == Boolean.FALSE) { + event.setCanceled(true); + } + } }