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.