diff --git a/patches/minecraft/net/minecraft/client/Minecraft.java.patch b/patches/minecraft/net/minecraft/client/Minecraft.java.patch index ad50fff6fe..e1dd113f01 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.java.patch +++ b/patches/minecraft/net/minecraft/client/Minecraft.java.patch @@ -200,11 +200,21 @@ } if (this.fpsPieResults != null) { +@@ -1254,7 +_,8 @@ + this.window.setErrorSection("Post render"); + ++this.frames; + boolean flag1 = this.hasSingleplayerServer() && (this.screen != null && this.screen.isPauseScreen() || this.overlay != null && this.overlay.isPauseScreen()) && !this.singleplayerServer.isPublished(); +- if (this.pause != flag1) { ++ if (this.pause != flag1 && !net.minecraftforge.client.ForgeHooksClient.onClientPauseChangePre(flag1)) { ++ + if (flag1) { + this.pausePartialTick = this.timer.partialTick; + } else { @@ -1262,6 +_,7 @@ } this.pause = flag1; -+ net.minecraftforge.client.ForgeHooksClient.onClientPauseUpdate(this.pause); ++ net.minecraftforge.client.ForgeHooksClient.onClientPauseChangePost(flag1); } long l = Util.getNanos(); diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index aa032e20db..ef16e06977 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -111,6 +111,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ClientChatEvent; import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.client.event.ClientPauseChangeEvent; import net.minecraftforge.client.event.ClientPauseEvent; import net.minecraftforge.client.event.ClientPlayerChangeGameTypeEvent; import net.minecraftforge.client.event.ClientPlayerNetworkEvent; @@ -249,9 +250,13 @@ public class ForgeHooksClient { return 1000.0F + 10000.0F * (1 + guiLayers.size()); } - public static void onClientPauseUpdate(boolean paused) - { - MinecraftForge.EVENT_BUS.post(new ClientPauseEvent(paused)); + public static boolean onClientPauseChangePre(boolean pause) { + return MinecraftForge.EVENT_BUS.post(new ClientPauseChangeEvent.Pre(pause)); + } + + public static void onClientPauseChangePost(boolean pause) { + MinecraftForge.EVENT_BUS.post(new ClientPauseChangeEvent.Post(pause)); + MinecraftForge.EVENT_BUS.post(new ClientPauseEvent(pause)); } public static String getArmorTexture(Entity entity, ItemStack armor, String _default, EquipmentSlot slot, String type) { diff --git a/src/main/java/net/minecraftforge/client/event/ClientPauseChangeEvent.java b/src/main/java/net/minecraftforge/client/event/ClientPauseChangeEvent.java new file mode 100644 index 0000000000..b2ba8e9b24 --- /dev/null +++ b/src/main/java/net/minecraftforge/client/event/ClientPauseChangeEvent.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.client.event; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; + +import net.minecraft.client.Minecraft; +import net.minecraftforge.fml.LogicalSide; + +/** + * Fired when pause is about to change + * + *
These events are fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, + * only on the {@linkplain LogicalSide#CLIENT logical client}.
+ * + * @see ClientPauseChangeEvent.Pre + * @see ClientPauseChangeEvent.Post + */ +public abstract class ClientPauseChangeEvent extends Event { + private final boolean pause; + + public ClientPauseChangeEvent(boolean pause) { + this.pause = pause; + } + + /** + * Fired when {@linkplain Minecraft#pause pause} is going to change + * + *This event is {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.
+ * Cancelling this event will prevent the game change pause state even if the conditions match + * + *This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, + * only on the {@linkplain LogicalSide#CLIENT logical client}.
+ */ + @Cancelable + public static class Pre extends ClientPauseChangeEvent { + + public Pre(boolean pause) { + super(pause); + } + } + + /** + * Fired when {@linkplain Minecraft#pause pause} is already changed + * + *This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.
+ * + *This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, + * only on the {@linkplain LogicalSide#CLIENT logical client}.
+ */ + public static class Post extends ClientPauseChangeEvent { + + public Post(boolean pause) { + super(pause); + } + } + + /** + * {@return game is paused} + */ + public boolean isPaused() { + return pause; + } +} \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/client/event/ClientPauseEvent.java b/src/main/java/net/minecraftforge/client/event/ClientPauseEvent.java index 84d859694b..fc5333bddc 100644 --- a/src/main/java/net/minecraftforge/client/event/ClientPauseEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ClientPauseEvent.java @@ -20,7 +20,12 @@ import net.minecraftforge.fml.LogicalSide; * *This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.
+ * + * @deprecated use {@linkplain ClientPauseChangeEvent.Post ClientPauseChangeEvent.Post} instead + * @see ClientPauseChangeEvent.Pre + * @see ClientPauseChangeEvent.Post */ +@Deprecated(forRemoval = true, since="1.20.4") public class ClientPauseEvent extends Event { private final boolean paused; @@ -37,4 +42,4 @@ public class ClientPauseEvent extends Event { return paused; } -} \ No newline at end of file +}