From 5e295f24852b358f5df49a615dc0623c8645170e Mon Sep 17 00:00:00 2001 From: Take Weiland Date: Fri, 4 Feb 2022 01:08:41 +0100 Subject: [PATCH] Fix PlayerChangeGameModeEvent (#8441) --- .../server/level/ServerPlayer.java.patch | 5 +++-- .../net/minecraftforge/common/ForgeHooks.java | 20 ++++++++++++++----- .../player/PlayerGameModeEventTest.java | 10 +++++++++- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch index 359bcb3a39..2058a02ab2 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch @@ -134,11 +134,12 @@ } protected void m_142540_(MobEffectInstance p_143393_, @Nullable Entity p_143394_) { -@@ -1181,6 +_,7 @@ +@@ -1181,6 +_,8 @@ } public boolean m_143403_(GameType p_143404_) { -+ if (!net.minecraftforge.common.ForgeHooks.onChangeGameMode(this, this.f_8941_.m_9290_(), p_143404_)) return false; ++ p_143404_ = net.minecraftforge.common.ForgeHooks.onChangeGameType(this, this.f_8941_.m_9290_(), p_143404_); ++ if (p_143404_ == null) return false; if (!this.f_8941_.m_143473_(p_143404_)) { return false; } else { diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index 0e25d4a445..e0b7ce878b 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -1,6 +1,6 @@ /* * Minecraft Forge - * Copyright (c) 2016-2021. + * Copyright (c) 2016-2022. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -768,15 +768,25 @@ public class ForgeHooks MinecraftForge.EVENT_BUS.post(new PlayerInteractEvent.LeftClickEmpty(player)); } + @Deprecated(forRemoval = true, since = "1.18") public static boolean onChangeGameMode(Player player, GameType currentGameMode, GameType newGameMode) { - if (currentGameMode != newGameMode) + return onChangeGameType(player, currentGameMode, newGameMode) != null; + } + + /** + * @return null if game type should not be changed, desired new GameType otherwise + */ + @Nullable + public static GameType onChangeGameType(Player player, GameType currentGameType, GameType newGameType) + { + if (currentGameType != newGameType) { - PlayerEvent.PlayerChangeGameModeEvent evt = new PlayerEvent.PlayerChangeGameModeEvent(player, currentGameMode, newGameMode); + PlayerEvent.PlayerChangeGameModeEvent evt = new PlayerEvent.PlayerChangeGameModeEvent(player, currentGameType, newGameType); MinecraftForge.EVENT_BUS.post(evt); - return !evt.isCanceled(); + return evt.isCanceled() ? null : evt.getNewGameMode(); } - return true; + return newGameType; } private static ThreadLocal> lootContext = new ThreadLocal>(); diff --git a/src/test/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java b/src/test/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java index c2388c6af8..feaa2ebc30 100644 --- a/src/test/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java +++ b/src/test/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java @@ -1,6 +1,6 @@ /* * Minecraft Forge - * Copyright (c) 2016-2021. + * Copyright (c) 2016-2022. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -41,8 +41,16 @@ public class PlayerGameModeEventTest { if (!ENABLE) return; LOGGER.info("{} changed game mode. Current GameType: {}. New Game Type: {}", event.getPlayer(), event.getCurrentGameMode(), event.getNewGameMode()); + // prevent changing to SURVIVAL if (event.getNewGameMode() == GameType.SURVIVAL) + { event.setCanceled(true); + } + else if (event.getNewGameMode() == GameType.SPECTATOR) + { + // when changing to SPECTATOR, change to SURVIVAL instead + event.setNewGameMode(GameType.SURVIVAL); + } } @Mod.EventBusSubscriber(modid="player_game_mode_event_test", value=Dist.CLIENT, bus=Mod.EventBusSubscriber.Bus.FORGE)