From 675bf8bde2a58fd69f6baea334fc6d72f30f7ef5 Mon Sep 17 00:00:00 2001 From: Mysticdrew Date: Wed, 8 Sep 2021 12:39:27 -0500 Subject: [PATCH] Added PlayerPermissionChangedEvent(#8023) --- .../server/players/PlayerList.java.patch | 16 ++++++ .../event/ForgeEventFactory.java | 14 +++++ .../player/PermissionsChangedEvent.java | 57 +++++++++++++++++++ .../player/PermissionsChangedEventTest.java | 42 ++++++++++++++ src/test/resources/META-INF/mods.toml | 2 + 5 files changed, 131 insertions(+) create mode 100644 src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java create mode 100644 src/test/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java diff --git a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch index 9759b40553..9c714b8b9a 100644 --- a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch +++ b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch @@ -78,6 +78,22 @@ if (flag2) { serverplayer.f_8906_.m_141995_(new ClientboundSoundPacket(SoundEvents.f_12377_, SoundSource.BLOCKS, (double)blockpos.m_123341_(), (double)blockpos.m_123342_(), (double)blockpos.m_123343_(), 1.0F, 1.0F)); } +@@ -535,6 +_,7 @@ + } + + public void m_5749_(GameProfile p_11254_) { ++ if (!net.minecraftforge.event.ForgeEventFactory.onPermissionChanged(p_11254_, this.f_11195_.m_7022_(), this)) return; + this.f_11200_.m_11381_(new ServerOpListEntry(p_11254_, this.f_11195_.m_7022_(), this.f_11200_.m_11351_(p_11254_))); + ServerPlayer serverplayer = this.m_11259_(p_11254_.getId()); + if (serverplayer != null) { +@@ -544,6 +_,7 @@ + } + + public void m_5750_(GameProfile p_11281_) { ++ if (!net.minecraftforge.event.ForgeEventFactory.onPermissionChanged(p_11281_, 0, this)) return; + this.f_11200_.m_11393_(p_11281_); + ServerPlayer serverplayer = this.m_11259_(p_11281_.getId()); + if (serverplayer != null) { @@ -726,13 +_,6 @@ if (serverstatscounter == null) { File file1 = this.f_11195_.m_129843_(LevelResource.f_78175_).toFile(); diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index 32b099707b..acc742bca5 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -26,9 +26,11 @@ import java.util.function.Consumer; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.mojang.authlib.GameProfile; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.server.players.PlayerList; import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrownEnderpearl; @@ -121,6 +123,7 @@ import net.minecraftforge.event.entity.player.BonemealEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; import net.minecraftforge.event.entity.player.FillBucketEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.entity.player.PermissionsChangedEvent; import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent; @@ -782,4 +785,15 @@ public class ForgeEventFactory MinecraftForge.EVENT_BUS.post(event); return event; } + + public static boolean onPermissionChanged(GameProfile gameProfile, int newLevel, PlayerList playerList) + { + int oldLevel = playerList.getServer().getProfilePermissions(gameProfile); + ServerPlayer player = playerList.getPlayer(gameProfile.getId()); + if (newLevel != oldLevel && player != null) + { + return MinecraftForge.EVENT_BUS.post(new PermissionsChangedEvent(player, newLevel, oldLevel)); + } + return true; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java new file mode 100644 index 0000000000..b02f280630 --- /dev/null +++ b/src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java @@ -0,0 +1,57 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2021. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.event.entity.player; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.eventbus.api.Cancelable; + +/** + * This event will fire when the player is opped or deopped. + *

+ * This event is cancelable which will stop the op or deop from happening. + */ +@Cancelable +public class PermissionsChangedEvent extends PlayerEvent +{ + private final int newLevel; + private final int oldLevel; + + public PermissionsChangedEvent(ServerPlayer player, int newLevel, int oldLevel) + { + super(player); + this.oldLevel = oldLevel; + this.newLevel = newLevel; + } + + /** + * @return The new permission level. + */ + public int getNewLevel() + { + return newLevel; + } + /** + * @return The old permission level. + */ + public int getOldLevel() + { + return oldLevel; + } +} diff --git a/src/test/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java b/src/test/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java new file mode 100644 index 0000000000..90c0307374 --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java @@ -0,0 +1,42 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2021. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.debug.entity.player; + +import net.minecraftforge.event.entity.player.PermissionsChangedEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@Mod("permissions_changed_event_test") +@Mod.EventBusSubscriber +public class PermissionsChangedEventTest +{ + private static final Logger LOGGER = LogManager.getLogger(); + + @SubscribeEvent + public static void onPermissionChanged(PermissionsChangedEvent event) + { + LOGGER.info("{} permission level changed to {} from {}", + event.getPlayer().getName().getString(), + event.getNewLevel(), + event.getOldLevel()); + } +} diff --git a/src/test/resources/META-INF/mods.toml b/src/test/resources/META-INF/mods.toml index 9e7c2523d5..1d72229c78 100644 --- a/src/test/resources/META-INF/mods.toml +++ b/src/test/resources/META-INF/mods.toml @@ -148,5 +148,7 @@ license="LGPL v2.1" modId="tag_based_tool_types" [[mods]] modId="check_spawn_event_test" +[[mods]] + modId="permissions_changed_event_test" # ADD ABOVE THIS LINE