2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
Date: Sun, 18 Mar 2018 12:29:48 -0400
|
|
|
|
Subject: [PATCH] Player.setPlayerProfile API
|
|
|
|
|
|
|
|
This can be useful for changing name or skins after a player has logged in.
|
|
|
|
|
2022-11-20 00:53:20 +01:00
|
|
|
== AT ==
|
|
|
|
public-f net.minecraft.world.entity.player.Player gameProfile
|
|
|
|
|
2023-03-14 19:59:51 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
2023-09-23 01:58:19 +02:00
|
|
|
index 4ba7ed0a4ff52caa21632f69ab087564fb3a5eb7..5b8425b17ea322bb1141b1c94ee3c259d3950ca0 100644
|
2023-03-14 19:59:51 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
2023-09-22 22:13:57 +02:00
|
|
|
@@ -1437,7 +1437,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
2023-03-14 19:59:51 +01:00
|
|
|
this.internalTeleport(dest.getX(), dest.getY(), dest.getZ(), dest.getYaw(), dest.getPitch(), Collections.emptySet());
|
|
|
|
}
|
|
|
|
|
|
|
|
- private void internalTeleport(double d0, double d1, double d2, float f, float f1, Set<RelativeMovement> set) {
|
|
|
|
+ public void internalTeleport(double d0, double d1, double d2, float f, float f1, Set<RelativeMovement> set) { // Paper
|
|
|
|
// CraftBukkit start
|
|
|
|
if (Float.isNaN(f)) {
|
|
|
|
f = 0;
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
2023-09-22 06:05:18 +02:00
|
|
|
index 41de3c342f1dae9fc6af1b4938a676d337bcf5fa..f870c20ecce27ebd893107a35e1b8f15e462ff85 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
2023-09-21 23:04:51 +02:00
|
|
|
@@ -293,11 +293,11 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
2021-06-11 14:02:28 +02:00
|
|
|
final org.bukkit.craftbukkit.CraftServer server = ServerLoginPacketListenerImpl.this.server.server;
|
|
|
|
|
2022-03-01 06:43:03 +01:00
|
|
|
// Paper start
|
|
|
|
- com.destroystokyo.paper.profile.PlayerProfile profile = org.bukkit.Bukkit.createProfile(uniqueId, playerName);
|
2023-09-22 06:05:18 +02:00
|
|
|
+ com.destroystokyo.paper.profile.PlayerProfile profile = com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(gameprofile);
|
2022-03-01 06:43:03 +01:00
|
|
|
AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId, profile);
|
2021-06-11 14:02:28 +02:00
|
|
|
server.getPluginManager().callEvent(asyncEvent);
|
2022-03-01 06:43:03 +01:00
|
|
|
profile = asyncEvent.getPlayerProfile();
|
|
|
|
- profile.complete();
|
|
|
|
+ profile.complete(true); // Paper - setPlayerProfileAPI
|
2023-09-22 06:05:18 +02:00
|
|
|
gameprofile = com.destroystokyo.paper.profile.CraftPlayerProfile.asAuthlibCopy(profile);
|
|
|
|
playerName = gameprofile.getName();
|
|
|
|
uniqueId = gameprofile.getId();
|
2022-12-20 19:56:33 +01:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
2023-09-23 04:06:03 +02:00
|
|
|
index 498b14ca0e45b76259450d9a0c8206b1e9f25e70..c1ef6c8c8e5f030e18b6066a509350ee1e195987 100644
|
2022-12-20 19:56:33 +01:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
2023-08-06 02:21:59 +02:00
|
|
|
@@ -81,8 +81,8 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
|
2022-12-20 19:56:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
- public PlayerProfile getPlayerProfile() {
|
|
|
|
- return new CraftPlayerProfile(this.profile);
|
|
|
|
+ public com.destroystokyo.paper.profile.PlayerProfile getPlayerProfile() { // Paper
|
|
|
|
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(this.profile); // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
public Server getServer() {
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2023-09-23 04:06:03 +02:00
|
|
|
index 9920a3d81c44972cba742d67764b5066362f79aa..e864252e4fcd0927275d6b9009cdde78d3e289eb 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2023-09-22 22:13:57 +02:00
|
|
|
@@ -271,11 +271,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2022-02-12 14:20:33 +01:00
|
|
|
return server.getPlayer(getUniqueId()) != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
- @Override
|
|
|
|
- public PlayerProfile getPlayerProfile() {
|
|
|
|
- return new CraftPlayerProfile(this.getProfile());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
@Override
|
|
|
|
public InetSocketAddress getAddress() {
|
|
|
|
if (this.getHandle().connection == null) return null;
|
2023-09-22 22:13:57 +02:00
|
|
|
@@ -1690,8 +1685,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2023-03-14 19:59:51 +01:00
|
|
|
private void untrackAndHideEntity(org.bukkit.entity.Entity entity) {
|
2021-11-29 00:46:53 +01:00
|
|
|
// Remove this entity from the hidden player's EntityTrackerEntry
|
2023-06-07 21:54:11 +02:00
|
|
|
- ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start
|
2021-11-29 00:46:53 +01:00
|
|
|
Entity other = ((CraftEntity) entity).getHandle();
|
|
|
|
+ unregisterEntity(other);
|
2022-02-01 14:06:41 +01:00
|
|
|
+
|
|
|
|
+ server.getPluginManager().callEvent(new PlayerHideEntityEvent(this, entity));
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
2021-11-29 00:46:53 +01:00
|
|
|
+ private void unregisterEntity(Entity other) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
2023-06-07 21:54:11 +02:00
|
|
|
+ ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap;
|
2021-06-11 14:02:28 +02:00
|
|
|
ChunkMap.TrackedEntity entry = tracker.entityMap.get(other.getId());
|
|
|
|
if (entry != null) {
|
2021-06-12 18:56:13 +02:00
|
|
|
entry.removePlayer(this.getHandle());
|
2023-09-22 22:13:57 +02:00
|
|
|
@@ -1704,8 +1706,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2022-12-07 19:52:24 +01:00
|
|
|
this.getHandle().connection.send(new ClientboundPlayerInfoRemovePacket(List.of(otherPlayer.getUUID())));
|
2022-02-01 14:06:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
-
|
|
|
|
- server.getPluginManager().callEvent(new PlayerHideEntityEvent(this, entity));
|
|
|
|
}
|
|
|
|
|
2023-03-14 19:59:51 +01:00
|
|
|
void resetAndHideEntity(org.bukkit.entity.Entity entity) {
|
2023-09-22 22:13:57 +02:00
|
|
|
@@ -1770,12 +1770,25 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2023-08-12 16:10:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private void trackAndShowEntity(org.bukkit.entity.Entity entity) {
|
|
|
|
+ // Paper start - uuid override
|
|
|
|
+ this.trackAndShowEntity(entity, null);
|
2022-02-01 14:06:41 +01:00
|
|
|
+ }
|
2023-08-12 16:10:09 +02:00
|
|
|
+ private void trackAndShowEntity(org.bukkit.entity.Entity entity, final @Nullable UUID uuidOverride) {
|
|
|
|
+ // Paper end
|
|
|
|
ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap;
|
|
|
|
Entity other = ((CraftEntity) entity).getHandle();
|
|
|
|
|
|
|
|
if (other instanceof ServerPlayer) {
|
|
|
|
ServerPlayer otherPlayer = (ServerPlayer) other;
|
|
|
|
+ // Paper start - uuid override
|
|
|
|
+ UUID original = null;
|
|
|
|
+ if (uuidOverride != null) {
|
|
|
|
+ original = otherPlayer.getUUID();
|
|
|
|
+ otherPlayer.setUUID(uuidOverride);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(otherPlayer)));
|
|
|
|
+ if (original != null) otherPlayer.setUUID(original); // Paper - uuid override
|
|
|
|
}
|
|
|
|
|
|
|
|
ChunkMap.TrackedEntity entry = tracker.entityMap.get(other.getId());
|
2023-09-22 22:13:57 +02:00
|
|
|
@@ -1785,6 +1798,39 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2023-08-12 16:10:09 +02:00
|
|
|
|
|
|
|
server.getPluginManager().callEvent(new PlayerShowEntityEvent(this, entity));
|
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start
|
2023-03-07 00:15:25 +01:00
|
|
|
+ @Override
|
2021-06-11 14:02:28 +02:00
|
|
|
+ public void setPlayerProfile(com.destroystokyo.paper.profile.PlayerProfile profile) {
|
2023-03-07 00:15:25 +01:00
|
|
|
+ ServerPlayer self = this.getHandle();
|
|
|
|
+ GameProfile gameProfile = com.destroystokyo.paper.profile.CraftPlayerProfile.asAuthlibCopy(profile);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ if (!self.sentListPacket) {
|
2023-03-07 00:15:25 +01:00
|
|
|
+ self.gameProfile = gameProfile;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return;
|
|
|
|
+ }
|
2023-03-07 00:15:25 +01:00
|
|
|
+ List<ServerPlayer> players = this.server.getServer().getPlayerList().players;
|
|
|
|
+ // First unregister the player for all players with the OLD game profile
|
2021-06-11 14:02:28 +02:00
|
|
|
+ for (ServerPlayer player : players) {
|
2023-03-07 00:15:25 +01:00
|
|
|
+ CraftPlayer bukkitPlayer = player.getBukkitEntity();
|
|
|
|
+ if (bukkitPlayer.canSee(this)) {
|
|
|
|
+ bukkitPlayer.unregisterEntity(self);
|
|
|
|
+ }
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
2023-03-23 22:57:03 +01:00
|
|
|
+
|
2023-03-23 17:49:24 +01:00
|
|
|
+ // Set the game profile here, we should have unregistered the entity via iterating all player entities above.
|
|
|
|
+ self.gameProfile = gameProfile;
|
2023-08-12 16:10:09 +02:00
|
|
|
+
|
2023-03-07 00:15:25 +01:00
|
|
|
+ // Re-register the game profile for all players
|
|
|
|
+ for (ServerPlayer player : players) {
|
|
|
|
+ CraftPlayer bukkitPlayer = player.getBukkitEntity();
|
|
|
|
+ if (bukkitPlayer.canSee(this)) {
|
2023-08-12 16:10:09 +02:00
|
|
|
+ bukkitPlayer.trackAndShowEntity(self.getBukkitEntity(), gameProfile.getId());
|
2023-03-07 00:15:25 +01:00
|
|
|
+ }
|
|
|
|
+ }
|
2023-08-12 16:10:09 +02:00
|
|
|
+
|
2023-03-07 00:15:25 +01:00
|
|
|
+ // Refresh misc player things AFTER sending game profile
|
|
|
|
+ this.refreshPlayer();
|
2023-08-12 16:10:09 +02:00
|
|
|
+ }
|
|
|
|
+ // Paper end
|
2023-03-07 00:15:25 +01:00
|
|
|
|
2023-03-14 19:59:51 +01:00
|
|
|
void resetAndShowEntity(org.bukkit.entity.Entity entity) {
|
2023-08-12 16:10:09 +02:00
|
|
|
// SPIGOT-7312: Can't show/hide self
|
2023-09-22 22:13:57 +02:00
|
|
|
@@ -1796,6 +1842,36 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2023-03-14 19:59:51 +01:00
|
|
|
this.trackAndShowEntity(entity);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+ // Paper start
|
2021-06-11 14:02:28 +02:00
|
|
|
+ public com.destroystokyo.paper.profile.PlayerProfile getPlayerProfile() {
|
|
|
|
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(this).clone();
|
|
|
|
+ }
|
|
|
|
+
|
2023-03-07 00:15:25 +01:00
|
|
|
+ private void refreshPlayer() {
|
|
|
|
+ ServerPlayer handle = this.getHandle();
|
|
|
|
+ Location loc = this.getLocation();
|
2021-06-11 14:02:28 +02:00
|
|
|
+
|
|
|
|
+ ServerGamePacketListenerImpl connection = handle.connection;
|
|
|
|
+
|
|
|
|
+ //Respawn the player then update their position and selected slot
|
2023-06-08 00:12:41 +02:00
|
|
|
+ ServerLevel worldserver = handle.serverLevel();
|
2023-09-22 04:31:59 +02:00
|
|
|
+ connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(new net.minecraft.network.protocol.game.CommonPlayerSpawnInfo(worldserver.dimensionTypeId(), worldserver.dimension(), net.minecraft.world.level.biome.BiomeManager.obfuscateSeed(worldserver.getSeed()), handle.gameMode.getGameModeForPlayer(), handle.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), handle.getLastDeathLocation(), handle.getPortalCooldown()), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA));
|
2021-06-11 14:02:28 +02:00
|
|
|
+ handle.onUpdateAbilities();
|
2023-03-14 19:59:51 +01:00
|
|
|
+ connection.internalTeleport(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch(), java.util.Collections.emptySet());
|
2021-06-11 14:02:28 +02:00
|
|
|
+ net.minecraft.server.MinecraftServer.getServer().getPlayerList().sendAllPlayerInfo(handle);
|
|
|
|
+
|
2023-04-07 01:21:33 +02:00
|
|
|
+ // Resend their XP and effects because the respawn packet resets it
|
|
|
|
+ connection.send(new net.minecraft.network.protocol.game.ClientboundSetExperiencePacket(handle.experienceProgress, handle.totalExperience, handle.experienceLevel));
|
|
|
|
+ for (net.minecraft.world.effect.MobEffectInstance mobEffect : handle.getActiveEffects()) {
|
|
|
|
+ connection.send(new net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket(handle.getId(), mobEffect));
|
|
|
|
+ }
|
|
|
|
+
|
2021-06-11 14:02:28 +02:00
|
|
|
+ if (this.isOp()) {
|
|
|
|
+ this.setOp(false);
|
|
|
|
+ this.setOp(true);
|
|
|
|
+ }
|
2023-03-07 00:15:25 +01:00
|
|
|
+ }
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
2023-03-14 19:59:51 +01:00
|
|
|
|
2021-12-04 02:33:56 +01:00
|
|
|
public void onEntityRemove(Entity entity) {
|
2023-03-14 19:59:51 +01:00
|
|
|
this.invertedVisibilityEntities.remove(entity.getUUID());
|
2022-12-20 19:56:33 +01:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
|
2023-09-23 04:06:03 +02:00
|
|
|
index 44b73939c465398c8cfda5dbea3280392f194add..aba415ab7203a21e916eadb923cb02c03b679f65 100644
|
2022-12-20 19:56:33 +01:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
|
2023-09-23 04:06:03 +02:00
|
|
|
@@ -338,6 +338,12 @@ public class Commodore
|
2022-12-20 19:56:33 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start - Rewrite plugins
|
2022-12-26 13:34:23 +01:00
|
|
|
+ if ((owner.equals("org/bukkit/OfflinePlayer") || owner.equals("org/bukkit/entity/Player")) && name.equals("getPlayerProfile") && desc.equals("()Lorg/bukkit/profile/PlayerProfile;")) {
|
2022-12-20 19:56:33 +01:00
|
|
|
+ super.visitMethodInsn(opcode, owner, name, "()Lcom/destroystokyo/paper/profile/PlayerProfile;", itf);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
if ( modern )
|
|
|
|
{
|
|
|
|
if ( owner.equals( "org/bukkit/Material" ) )
|