package net.minecraft.client.multiplayer; import com.google.common.base.Suppliers; import com.mojang.authlib.GameProfile; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.DefaultPlayerSkin; import net.minecraft.client.resources.PlayerSkin; import net.minecraft.client.resources.SkinManager; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.RemoteChatSession; import net.minecraft.network.chat.SignedMessageValidator; import net.minecraft.world.entity.player.ProfilePublicKey; import net.minecraft.world.level.GameType; import net.minecraft.world.scores.PlayerTeam; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public class PlayerInfo { /** * The GameProfile for the player represented by this NetworkPlayerInfo instance */ private final GameProfile profile; private final Supplier skinLookup; private GameType gameMode = GameType.DEFAULT_MODE; private int latency; /** * When this is non-null, it is displayed instead of the player's real name */ @Nullable private Component tabListDisplayName; private boolean showHat = true; @Nullable private RemoteChatSession chatSession; private SignedMessageValidator messageValidator; private int tabListOrder; public PlayerInfo(GameProfile profile, boolean enforeSecureChat) { this.profile = profile; this.messageValidator = fallbackMessageValidator(enforeSecureChat); Supplier> supplier = Suppliers.memoize(() -> createSkinLookup(profile)); this.skinLookup = () -> (PlayerSkin)((Supplier)supplier.get()).get(); } private static Supplier createSkinLookup(GameProfile profile) { Minecraft minecraft = Minecraft.getInstance(); SkinManager skinManager = minecraft.getSkinManager(); CompletableFuture> completableFuture = skinManager.getOrLoad(profile); boolean bl = !minecraft.isLocalPlayer(profile.getId()); PlayerSkin playerSkin = DefaultPlayerSkin.get(profile); return () -> { PlayerSkin playerSkin2 = (PlayerSkin)((Optional)completableFuture.getNow(Optional.empty())).orElse(playerSkin); return bl && !playerSkin2.secure() ? playerSkin : playerSkin2; }; } /** * Returns the GameProfile for the player represented by this NetworkPlayerInfo instance */ public GameProfile getProfile() { return this.profile; } @Nullable public RemoteChatSession getChatSession() { return this.chatSession; } public SignedMessageValidator getMessageValidator() { return this.messageValidator; } public boolean hasVerifiableChat() { return this.chatSession != null; } protected void setChatSession(RemoteChatSession chatSession) { this.chatSession = chatSession; this.messageValidator = chatSession.createMessageValidator(ProfilePublicKey.EXPIRY_GRACE_PERIOD); } protected void clearChatSession(boolean enforcesSecureChat) { this.chatSession = null; this.messageValidator = fallbackMessageValidator(enforcesSecureChat); } private static SignedMessageValidator fallbackMessageValidator(boolean enforeSecureChat) { return enforeSecureChat ? SignedMessageValidator.REJECT_ALL : SignedMessageValidator.ACCEPT_UNSIGNED; } public GameType getGameMode() { return this.gameMode; } protected void setGameMode(GameType gameMode) { this.gameMode = gameMode; } public int getLatency() { return this.latency; } protected void setLatency(int latency) { this.latency = latency; } public PlayerSkin getSkin() { return (PlayerSkin)this.skinLookup.get(); } @Nullable public PlayerTeam getTeam() { return Minecraft.getInstance().level.getScoreboard().getPlayersTeam(this.getProfile().getName()); } public void setTabListDisplayName(@Nullable Component displayName) { this.tabListDisplayName = displayName; } @Nullable public Component getTabListDisplayName() { return this.tabListDisplayName; } public void setShowHat(boolean showHat) { this.showHat = showHat; } public boolean showHat() { return this.showHat; } public void setTabListOrder(int tabListOrder) { this.tabListOrder = tabListOrder; } public int getTabListOrder() { return this.tabListOrder; } }