Use callback-style events for crosshair and hotbar render events

This commit is contained in:
Jonas Herzig
2021-02-27 15:49:40 +01:00
parent da16b0fb78
commit 06a46e6f38
5 changed files with 56 additions and 17 deletions

View File

@@ -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) {

View File

@@ -0,0 +1,19 @@
package com.replaymod.replay.events;
import de.johni0702.minecraft.gui.utils.Event;
public interface RenderHotbarCallback {
Event<RenderHotbarCallback> EVENT = Event.create((listeners) ->
() -> {
for (RenderHotbarCallback listener : listeners) {
Boolean state = listener.shouldRenderHotbar();
if (state != null) {
return state;
}
}
return null;
}
);
Boolean shouldRenderHotbar();
}

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}
}
}