From 77d41023b53be8339519737532440c0d68e59aef Mon Sep 17 00:00:00 2001
From: noeppi_noeppi <63002502+noeppi-noeppi@users.noreply.github.com>
Date: Mon, 17 May 2021 22:17:01 +0200
Subject: [PATCH] Add an event similar to PlayerEvent.NameFormat but for the
name shown in the tab list. (#7740)
---
.../player/ServerPlayerEntity.java.patch | 33 ++++++++++++++--
.../event/ForgeEventFactory.java | 7 ++++
.../event/entity/player/PlayerEvent.java | 39 +++++++++++++++++++
3 files changed, 76 insertions(+), 3 deletions(-)
diff --git a/patches/minecraft/net/minecraft/entity/player/ServerPlayerEntity.java.patch b/patches/minecraft/net/minecraft/entity/player/ServerPlayerEntity.java.patch
index 1ed6923474..8be7855290 100644
--- a/patches/minecraft/net/minecraft/entity/player/ServerPlayerEntity.java.patch
+++ b/patches/minecraft/net/minecraft/entity/player/ServerPlayerEntity.java.patch
@@ -150,6 +150,19 @@
}
public ChatVisibility func_147096_v() {
+@@ -1276,7 +_,11 @@
+
+ @Nullable
+ public ITextComponent func_175396_E() {
+- return null;
++ if (!this.hasTabListName) {
++ this.tabListDisplayName = net.minecraftforge.event.ForgeEventFactory.getPlayerTabListDisplayName(this);
++ this.hasTabListName = true;
++ }
++ return this.tabListDisplayName;
+ }
+
+ public void func_184609_a(Hand p_184609_1_) {
@@ -1301,14 +_,14 @@
this.func_184210_p();
if (p_200619_1_ == this.field_70170_p) {
@@ -193,10 +206,11 @@
this.field_70170_p.func_217376_c(itementity);
ItemStack itemstack = itementity.func_92059_d();
if (p_146097_3_) {
-@@ -1403,6 +_,15 @@
+@@ -1402,6 +_,29 @@
+ }
return itementity;
- }
++ }
+ }
+
+ private String language = "en_us";
@@ -206,6 +220,19 @@
+ */
+ public String getLanguage() {
+ return this.language;
++ }
++
++ // We need this as tablistDisplayname may be null even if the the event was fired.
++ private boolean hasTabListName = false;
++ private ITextComponent tabListDisplayName = null;
++ /**
++ * Force the name displayed in the tab list to refresh, by firing {@link net.minecraftforge.event.entity.player.PlayerEvent.TabListNameFormat}.
++ */
++ public void refreshTabListName() {
++ ITextComponent oldName = this.tabListDisplayName;
++ this.tabListDisplayName = net.minecraftforge.event.ForgeEventFactory.getPlayerTabListDisplayName(this);
++ if (!java.util.Objects.equals(oldName, this.tabListDisplayName)) {
++ this.func_184102_h().func_184103_al().func_148540_a(new net.minecraft.network.play.server.SPlayerListItemPacket(net.minecraft.network.play.server.SPlayerListItemPacket.Action.UPDATE_DISPLAY_NAME, this));
+ }
}
- @Nullable
diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java
index cf08311112..e522ac5b0f 100644
--- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java
+++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java
@@ -260,6 +260,13 @@ public class ForgeEventFactory
MinecraftForge.EVENT_BUS.post(event);
return event.getDisplayname();
}
+
+ public static ITextComponent getPlayerTabListDisplayName(PlayerEntity player)
+ {
+ PlayerEvent.TabListNameFormat event = new PlayerEvent.TabListNameFormat(player);
+ MinecraftForge.EVENT_BUS.post(event);
+ return event.getDisplayName();
+ }
public static BlockState fireFluidPlaceBlockEvent(IWorld world, BlockPos pos, BlockPos liquidPos, BlockState state)
{
diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java
index d270df29ce..5625721bb9 100644
--- a/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java
+++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java
@@ -22,6 +22,7 @@ package net.minecraftforge.event.entity.player;
import java.io.File;
import net.minecraft.entity.item.ItemEntity;
+import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.RegistryKey;
@@ -39,6 +40,7 @@ import net.minecraftforge.event.entity.living.LivingEvent;
import net.minecraftforge.eventbus.api.Event;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
/**
* PlayerEvent is fired whenever an event involving Living entities occurs.
@@ -180,6 +182,43 @@ public class PlayerEvent extends LivingEvent
}
}
+ /**
+ * TabListNameFormat is fired when a player's display name for the tablist is retrieved.
+ * This event is fired whenever a player's display name for the tablist is retrieved in
+ * {@link ServerPlayerEntity#getTabListDisplayName()} or {@link ServerPlayerEntity#refreshTabListName()}.
+ *
+ * This event is fired via the {@link ForgeEventFactory#getPlayerTabListDisplayName(PlayerEntity)}.
+ *
+ * {@link #getDisplayName()} contains the display name of the player or null if the client should determine the display name itself.
+ *
+ * This event is not {@link net.minecraftforge.eventbus.api.Cancelable}.
+ *
+ * This event does not have a result. {@link HasResult}
+ *
+ * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
+ **/
+ public static class TabListNameFormat extends PlayerEvent
+ {
+ @Nullable
+ private ITextComponent displayName;
+
+ public TabListNameFormat(PlayerEntity player)
+ {
+ super(player);
+ }
+
+ @Nullable
+ public ITextComponent getDisplayName()
+ {
+ return displayName;
+ }
+
+ public void setDisplayName(@Nullable ITextComponent displayName)
+ {
+ this.displayName = displayName;
+ }
+ }
+
/**
* Fired when the EntityPlayer is cloned, typically caused by the network sending a RESPAWN_PLAYER event.
* Either caused by death, or by traveling from the End to the overworld.