mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-01 00:10:32 +01:00
Add listing API for PlayerProfile
This commit is contained in:
parent
a2035440cf
commit
af38fef753
121
patches/api/0468-Add-listing-API-for-PlayerProfile.patch
Normal file
121
patches/api/0468-Add-listing-API-for-PlayerProfile.patch
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Flo0 <flo.roma@web.de>
|
||||||
|
Date: Sat, 6 Apr 2024 23:15:08 +0200
|
||||||
|
Subject: [PATCH] Add listing API for PlayerProfile
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
|
||||||
|
index c6cb4f17469a8f2e60dd3e28d41402851ce5fb21..2c2802caea79f853ec14f0cfe382471d32417b19 100644
|
||||||
|
--- a/src/main/java/org/bukkit/entity/Player.java
|
||||||
|
+++ b/src/main/java/org/bukkit/entity/Player.java
|
||||||
|
@@ -54,7 +54,7 @@ import org.jetbrains.annotations.Nullable;
|
||||||
|
/**
|
||||||
|
* Represents a player, connected or not
|
||||||
|
*/
|
||||||
|
-public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, net.kyori.adventure.bossbar.BossBarViewer, com.destroystokyo.paper.network.NetworkClient { // Paper
|
||||||
|
+public interface Player extends org.bukkit.entity.HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, net.kyori.adventure.bossbar.BossBarViewer, com.destroystokyo.paper.network.NetworkClient { // Paper
|
||||||
|
|
||||||
|
// Paper start
|
||||||
|
@Override
|
||||||
|
@@ -2054,6 +2054,69 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
||||||
|
boolean listPlayer(@NotNull Player other);
|
||||||
|
// Paper end
|
||||||
|
|
||||||
|
+ // Paper start - Add Listing API for PlayerProfile
|
||||||
|
+ /**
|
||||||
|
+ * Lists the {@code profile} in the tablist.
|
||||||
|
+ * Burden of tracking the profile is on the caller.
|
||||||
|
+ * Using profiles of online players is an invalid operation.
|
||||||
|
+ * Use {@link #listPlayer(Player)} instead.
|
||||||
|
+ *
|
||||||
|
+ * @param profile The {@link com.destroystokyo.paper.profile.PlayerProfile} to list.
|
||||||
|
+ * @param latency The latency of the profile in milliseconds.
|
||||||
|
+ * @param gameMode The game mode of the profile.
|
||||||
|
+ * @param displayName The display name of the profile.
|
||||||
|
+ */
|
||||||
|
+ void listProfile(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, int latency, GameMode gameMode, @Nullable net.kyori.adventure.text.Component displayName);
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Lists the {@code profile} in the tablist.
|
||||||
|
+ * Burden of tracking the profile is on the caller.
|
||||||
|
+ * Using profiles of online players is an invalid operation.
|
||||||
|
+ * Use {@link #listPlayer(Player)} instead.
|
||||||
|
+ *
|
||||||
|
+ * @param profile The {@link com.destroystokyo.paper.profile.PlayerProfile} to list.
|
||||||
|
+ */
|
||||||
|
+ default void listProfile(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile) {
|
||||||
|
+ listProfile(profile, 0, GameMode.SURVIVAL, null);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Updates the latency of the {@code profile} in the tablist.
|
||||||
|
+ * If the {@code profile} is not listed, this method has no effect.
|
||||||
|
+ *
|
||||||
|
+ * @param profile The {@link com.destroystokyo.paper.profile.PlayerProfile} to update in the tablist.
|
||||||
|
+ * @param latency The new latency of the profile in milliseconds.
|
||||||
|
+ */
|
||||||
|
+ void updateListedProfileLatency(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, int latency);
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Updates the game mode of the {@code profile} in the tablist.
|
||||||
|
+ * If the {@code profile} is not listed, this method has no effect.
|
||||||
|
+ *
|
||||||
|
+ * @param profile The {@link com.destroystokyo.paper.profile.PlayerProfile} to update in the tablist.
|
||||||
|
+ * @param gameMode The new game mode of the profile.
|
||||||
|
+ */
|
||||||
|
+ void updateListedProfileGameMode(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, GameMode gameMode);
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Updates the display name of the {@code profile} in the tablist.
|
||||||
|
+ * If the {@code profile} is not listed, this method has no effect.
|
||||||
|
+ *
|
||||||
|
+ * @param profile The {@link com.destroystokyo.paper.profile.PlayerProfile} to update in the tablist.
|
||||||
|
+ * @param displayName The new display name of the profile.
|
||||||
|
+ */
|
||||||
|
+ void updateListedProfileDisplayName(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, @Nullable net.kyori.adventure.text.Component displayName);
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Unlists the {@code profile} from the tablist.
|
||||||
|
+ * Using profiles of online players is an invalid operation.
|
||||||
|
+ * Use {@link #unlistPlayer(Player)} instead.
|
||||||
|
+ *
|
||||||
|
+ * @param profile The {@link com.destroystokyo.paper.profile.PlayerProfile} to de-list.
|
||||||
|
+ */
|
||||||
|
+ void unlistProfile(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile);
|
||||||
|
+ // Paper end - Add Listing API for PlayerProfile
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* Checks to see if this player is currently flying or not.
|
||||||
|
*
|
||||||
|
@@ -3403,18 +3466,18 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
||||||
|
|
||||||
|
// Paper start - elytra boost API
|
||||||
|
/**
|
||||||
|
- * Boost a Player that's {@link #isGliding()} using a {@link Firework}.
|
||||||
|
+ * Boost a Player that's {@link #isGliding()} using a {@link org.bukkit.entity.Firework}.
|
||||||
|
* If the creation of the entity is cancelled, no boosting is done.
|
||||||
|
* This method does not fire {@link com.destroystokyo.paper.event.player.PlayerElytraBoostEvent}.
|
||||||
|
*
|
||||||
|
* @param firework The {@link Material#FIREWORK_ROCKET} to boost the player with
|
||||||
|
- * @return The {@link Firework} boosting the Player or null if the spawning of the entity was cancelled
|
||||||
|
+ * @return The {@link org.bukkit.entity.Firework} boosting the Player or null if the spawning of the entity was cancelled
|
||||||
|
* @throws IllegalArgumentException if {@link #isGliding()} is false
|
||||||
|
* or if the {@code firework} isn't a {@link Material#FIREWORK_ROCKET}
|
||||||
|
- * @deprecated use {@link HumanEntity#fireworkBoost(ItemStack)} instead. Note that this method <b>does not</b>
|
||||||
|
+ * @deprecated use {@link org.bukkit.entity.HumanEntity#fireworkBoost(ItemStack)} instead. Note that this method <b>does not</b>
|
||||||
|
* check if the player is gliding or not.
|
||||||
|
*/
|
||||||
|
- default @Nullable Firework boostElytra(final @NotNull ItemStack firework) {
|
||||||
|
+ default @Nullable org.bukkit.entity.Firework boostElytra(final @NotNull ItemStack firework) {
|
||||||
|
com.google.common.base.Preconditions.checkState(this.isGliding(), "Player must be gliding");
|
||||||
|
return this.fireworkBoost(firework);
|
||||||
|
}
|
||||||
|
@@ -3459,7 +3522,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
||||||
|
// Paper end - custom chat completions API
|
||||||
|
|
||||||
|
// Spigot start
|
||||||
|
- public class Spigot extends Entity.Spigot {
|
||||||
|
+ public class Spigot extends org.bukkit.entity.Entity.Spigot {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the connection address of this player, regardless of whether it
|
150
patches/server/1055-Add-listing-API-for-PlayerProfile.patch
Normal file
150
patches/server/1055-Add-listing-API-for-PlayerProfile.patch
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Flo0 <flo.roma@web.de>
|
||||||
|
Date: Sat, 6 Apr 2024 23:15:24 +0200
|
||||||
|
Subject: [PATCH] Add listing API for PlayerProfile
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundPlayerInfoUpdatePacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundPlayerInfoUpdatePacket.java
|
||||||
|
index 56eddd28429cf42c02d88b8bf79f8b616fa45289..04a7ad0381cfdb9d5ff913f82553ecbc5dfbc78f 100644
|
||||||
|
--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundPlayerInfoUpdatePacket.java
|
||||||
|
+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundPlayerInfoUpdatePacket.java
|
||||||
|
@@ -68,6 +68,30 @@ public class ClientboundPlayerInfoUpdatePacket implements Packet<ClientGamePacke
|
||||||
|
return new ClientboundPlayerInfoUpdatePacket(enumSet, new ClientboundPlayerInfoUpdatePacket.Entry(playerInfoId, listed));
|
||||||
|
}
|
||||||
|
// Paper end - Add Listing API for Player
|
||||||
|
+ // Paper start - Add Listing API for PlayerProfile
|
||||||
|
+ public static ClientboundPlayerInfoUpdatePacket addAndList(UUID playerInfoId, int latency, GameType gameMode, @Nullable Component displayName) {
|
||||||
|
+ EnumSet<ClientboundPlayerInfoUpdatePacket.Action> enumSet = EnumSet.of(
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER,
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED,
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY,
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE,
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME
|
||||||
|
+ );
|
||||||
|
+ return new ClientboundPlayerInfoUpdatePacket(enumSet, new ClientboundPlayerInfoUpdatePacket.Entry(playerInfoId, true, latency, gameMode, displayName));
|
||||||
|
+ }
|
||||||
|
+ public static ClientboundPlayerInfoUpdatePacket updateLatency(UUID playerInfoId, int latency) {
|
||||||
|
+ EnumSet<ClientboundPlayerInfoUpdatePacket.Action> enumSet = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY);
|
||||||
|
+ return new ClientboundPlayerInfoUpdatePacket(enumSet, new ClientboundPlayerInfoUpdatePacket.Entry(playerInfoId, true, latency, GameType.DEFAULT_MODE, null));
|
||||||
|
+ }
|
||||||
|
+ public static ClientboundPlayerInfoUpdatePacket updateGameMode(UUID playerInfoId, GameType gameMode) {
|
||||||
|
+ EnumSet<ClientboundPlayerInfoUpdatePacket.Action> enumSet = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE);
|
||||||
|
+ return new ClientboundPlayerInfoUpdatePacket(enumSet, new ClientboundPlayerInfoUpdatePacket.Entry(playerInfoId, true, 0, gameMode, null));
|
||||||
|
+ }
|
||||||
|
+ public static ClientboundPlayerInfoUpdatePacket updateDisplayName(UUID playerInfoId, @Nullable Component displayName) {
|
||||||
|
+ EnumSet<ClientboundPlayerInfoUpdatePacket.Action> enumSet = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME);
|
||||||
|
+ return new ClientboundPlayerInfoUpdatePacket(enumSet, new ClientboundPlayerInfoUpdatePacket.Entry(playerInfoId, true, 0, GameType.DEFAULT_MODE, displayName));
|
||||||
|
+ }
|
||||||
|
+ // Paper end - Add Listing API for PlayerProfile
|
||||||
|
|
||||||
|
public ClientboundPlayerInfoUpdatePacket(FriendlyByteBuf buf) {
|
||||||
|
this.actions = buf.readEnumSet(ClientboundPlayerInfoUpdatePacket.Action.class);
|
||||||
|
@@ -188,6 +212,11 @@ public class ClientboundPlayerInfoUpdatePacket implements Packet<ClientGamePacke
|
||||||
|
this(profileId, null, listed, 0, GameType.DEFAULT_MODE, null, null);
|
||||||
|
}
|
||||||
|
// Paper end - Add Listing API for Player
|
||||||
|
+ // Paper start - Add Listing API for PlayerProfile
|
||||||
|
+ Entry(UUID profileId, boolean listed, int latency, GameType gameMode, @Nullable Component displayName) {
|
||||||
|
+ this(profileId, null, listed, latency, gameMode, displayName, null);
|
||||||
|
+ }
|
||||||
|
+ // Paper end - Add Listing API for PlayerProfile
|
||||||
|
}
|
||||||
|
|
||||||
|
static class EntryBuilder {
|
||||||
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
|
index 616d2e479d91673695ade0db151a0099b568904f..434cdeb719d6fdeeace2b632297cb63527619372 100644
|
||||||
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
|
@@ -20,6 +20,7 @@ import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
+import java.util.EnumSet;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
@@ -148,7 +149,6 @@ import org.bukkit.craftbukkit.map.CraftMapView;
|
||||||
|
import org.bukkit.craftbukkit.map.RenderData;
|
||||||
|
import org.bukkit.craftbukkit.potion.CraftPotionEffectType;
|
||||||
|
import org.bukkit.craftbukkit.potion.CraftPotionUtil;
|
||||||
|
-import org.bukkit.craftbukkit.profile.CraftPlayerProfile;
|
||||||
|
import org.bukkit.craftbukkit.scoreboard.CraftScoreboard;
|
||||||
|
import org.bukkit.craftbukkit.util.CraftChatMessage;
|
||||||
|
import org.bukkit.craftbukkit.util.CraftLocation;
|
||||||
|
@@ -161,7 +161,6 @@ import org.bukkit.event.player.PlayerExpCooldownChangeEvent;
|
||||||
|
import org.bukkit.event.player.PlayerHideEntityEvent;
|
||||||
|
import org.bukkit.event.player.PlayerRegisterChannelEvent;
|
||||||
|
import org.bukkit.event.player.PlayerShowEntityEvent;
|
||||||
|
-import org.bukkit.event.player.PlayerSpawnChangeEvent;
|
||||||
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
import org.bukkit.event.player.PlayerUnregisterChannelEvent;
|
||||||
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
|
@@ -174,7 +173,6 @@ import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.messaging.StandardMessenger;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
-import org.bukkit.profile.PlayerProfile;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
@@ -2190,6 +2188,60 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||||
|
}
|
||||||
|
// Paper end - Add Listing API for Player
|
||||||
|
|
||||||
|
+ // Paper start - Add Listing API for PlayerProfile
|
||||||
|
+ @Override
|
||||||
|
+ public void listProfile(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, int latency, GameMode gameMode, @Nullable net.kyori.adventure.text.Component displayName) {
|
||||||
|
+ Preconditions.checkNotNull(profile, "profile cannot be null");
|
||||||
|
+ Preconditions.checkArgument(isOfflineProfile(profile), "using the profile of an online player is not allowed");
|
||||||
|
+ EnumSet<ClientboundPlayerInfoUpdatePacket.Action> enumSet = EnumSet.of(
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER,
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED
|
||||||
|
+ );
|
||||||
|
+ UUID profileId = profile.getId();
|
||||||
|
+ GameType type = GameType.byId(gameMode.getValue());
|
||||||
|
+ net.minecraft.network.chat.Component name = io.papermc.paper.adventure.PaperAdventure.asVanilla(displayName);
|
||||||
|
+ ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.addAndList(profileId, latency, type, name);
|
||||||
|
+ this.getHandle().connection.send(packet);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void updateListedProfileLatency(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, int latency) {
|
||||||
|
+ Preconditions.checkNotNull(profile, "profile cannot be null");
|
||||||
|
+ Preconditions.checkArgument(isOfflineProfile(profile), "using the profile of an online player is not allowed");
|
||||||
|
+ if (this.getHandle().connection == null) return;
|
||||||
|
+ this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.updateLatency(profile.getId(), latency));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void updateListedProfileGameMode(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, GameMode gameMode) {
|
||||||
|
+ Preconditions.checkNotNull(profile, "profile cannot be null");
|
||||||
|
+ Preconditions.checkArgument(isOfflineProfile(profile), "using the profile of an online player is not allowed");
|
||||||
|
+ if (this.getHandle().connection == null) return;
|
||||||
|
+ this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.updateGameMode(profile.getId(), GameType.byId(gameMode.getValue())));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void updateListedProfileDisplayName(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile, @Nullable net.kyori.adventure.text.Component displayName) {
|
||||||
|
+ Preconditions.checkNotNull(profile, "profile cannot be null");
|
||||||
|
+ Preconditions.checkArgument(isOfflineProfile(profile), "using the profile of an online player is not allowed");
|
||||||
|
+ if (this.getHandle().connection == null) return;
|
||||||
|
+ this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.updateDisplayName(profile.getId(), io.papermc.paper.adventure.PaperAdventure.asVanilla(displayName)));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void unlistProfile(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile) {
|
||||||
|
+ Preconditions.checkNotNull(profile, "profile cannot be null");
|
||||||
|
+ Preconditions.checkArgument(isOfflineProfile(profile), "using the profile of an online player is not allowed");
|
||||||
|
+ if (this.getHandle().connection == null) return;
|
||||||
|
+ this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.updateListed(profile.getId(), false));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ private boolean isOfflineProfile(@NotNull com.destroystokyo.paper.profile.PlayerProfile profile) {
|
||||||
|
+ UUID profileId = profile.getId();
|
||||||
|
+ return Bukkit.getPlayer(profileId) == null;
|
||||||
|
+ }
|
||||||
|
+ // Paper end - Add Listing API for PlayerProfile
|
||||||
|
+
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> serialize() {
|
||||||
|
Map<String, Object> result = new LinkedHashMap<String, Object>();
|
Loading…
Reference in New Issue
Block a user