aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0180-Player.setPlayerProfile-API.patch
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2023-06-07 21:54:11 +0200
committerNassim Jahnke <[email protected]>2023-06-07 21:54:11 +0200
commit3fed7289ede921a499e314b567977b73d3446d71 (patch)
treed8ab2f7871fa837f60a6cab99a38d05298d5fa3a /patches/server/0180-Player.setPlayerProfile-API.patch
parent94aa4b518af80121327f329ee8101ae3dcf8612b (diff)
downloadPaper-3fed7289ede921a499e314b567977b73d3446d71.tar.gz
Paper-3fed7289ede921a499e314b567977b73d3446d71.zip
More more more more more work
Diffstat (limited to 'patches/server/0180-Player.setPlayerProfile-API.patch')
-rw-r--r--patches/server/0180-Player.setPlayerProfile-API.patch200
1 files changed, 200 insertions, 0 deletions
diff --git a/patches/server/0180-Player.setPlayerProfile-API.patch b/patches/server/0180-Player.setPlayerProfile-API.patch
new file mode 100644
index 0000000000..be1d58a7e8
--- /dev/null
+++ b/patches/server/0180-Player.setPlayerProfile-API.patch
@@ -0,0 +1,200 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+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.
+
+== AT ==
+public-f net.minecraft.world.entity.player.Player gameProfile
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 8abd8d7e1bbdd59338725ae075117ec26d567a86..86e6e6ffdd5d8391b7a8f17bbad9b49a62339a8a 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -1528,7 +1528,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+ 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;
+diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+index 6b31b0894e52ad6fc397624e50587ec04e46c099..0c7f280bae81bbb492d5780a43e5ffda0f58756a 100644
+--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+@@ -330,11 +330,11 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+ final org.bukkit.craftbukkit.CraftServer server = ServerLoginPacketListenerImpl.this.server.server;
+
+ // Paper start
+- com.destroystokyo.paper.profile.PlayerProfile profile = org.bukkit.Bukkit.createProfile(uniqueId, playerName);
++ com.destroystokyo.paper.profile.PlayerProfile profile = com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(ServerLoginPacketListenerImpl.this.gameProfile);
+ AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId, profile);
+ server.getPluginManager().callEvent(asyncEvent);
+ profile = asyncEvent.getPlayerProfile();
+- profile.complete();
++ profile.complete(true); // Paper - setPlayerProfileAPI
+ gameProfile = com.destroystokyo.paper.profile.CraftPlayerProfile.asAuthlibCopy(profile);
+ playerName = gameProfile.getName();
+ uniqueId = gameProfile.getId();
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+index e7442952ef1f03969949014492a7ddc6d0796ba5..69a1852905dd4724c30ac8ab88c14251eee2c371 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+@@ -76,8 +76,8 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
+ }
+
+ @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() {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index b7f071d7d0128d4c0990b59bd843fd88f8320ca8..407a037ae43c8cd209a9ce18359b5e0a15d9a88f 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -82,6 +82,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes;
+ import net.minecraft.world.inventory.AbstractContainerMenu;
+ import net.minecraft.world.level.GameType;
+ import net.minecraft.world.level.block.Blocks;
++import net.minecraft.world.level.biome.BiomeManager;
+ import net.minecraft.world.level.block.entity.SignBlockEntity;
+ import net.minecraft.world.level.block.entity.SignText;
+ import net.minecraft.world.level.border.BorderChangeListener;
+@@ -216,11 +217,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ 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;
+@@ -1617,8 +1613,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+
+ private void untrackAndHideEntity(org.bukkit.entity.Entity entity) {
+ // Remove this entity from the hidden player's EntityTrackerEntry
+- ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap;
++ // Paper start
+ Entity other = ((CraftEntity) entity).getHandle();
++ unregisterEntity(other);
++
++ server.getPluginManager().callEvent(new PlayerHideEntityEvent(this, entity));
++ }
++ private void unregisterEntity(Entity other) {
++ // Paper end
++ ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap;
+ ChunkMap.TrackedEntity entry = tracker.entityMap.get(other.getId());
+ if (entry != null) {
+ entry.removePlayer(this.getHandle());
+@@ -1631,8 +1634,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ this.getHandle().connection.send(new ClientboundPlayerInfoRemovePacket(List.of(otherPlayer.getUUID())));
+ }
+ }
+-
+- server.getPluginManager().callEvent(new PlayerHideEntityEvent(this, entity));
+ }
+
+ void resetAndHideEntity(org.bukkit.entity.Entity entity) {
+@@ -1709,8 +1710,38 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ if (entry != null && !entry.seenBy.contains(this.getHandle().connection)) {
+ entry.updatePlayer(this.getHandle());
+ }
++ server.getPluginManager().callEvent(new PlayerShowEntityEvent(this, entity)); // Paper
++ }
++ // Paper start
++ @Override
++ public void setPlayerProfile(com.destroystokyo.paper.profile.PlayerProfile profile) {
++ ServerPlayer self = this.getHandle();
++ GameProfile gameProfile = com.destroystokyo.paper.profile.CraftPlayerProfile.asAuthlibCopy(profile);
++ if (!self.sentListPacket) {
++ self.gameProfile = gameProfile;
++ return;
++ }
++ List<ServerPlayer> players = this.server.getServer().getPlayerList().players;
++ // First unregister the player for all players with the OLD game profile
++ for (ServerPlayer player : players) {
++ CraftPlayer bukkitPlayer = player.getBukkitEntity();
++ if (bukkitPlayer.canSee(this)) {
++ bukkitPlayer.unregisterEntity(self);
++ }
++ }
++
++ // Set the game profile here, we should have unregistered the entity via iterating all player entities above.
++ self.gameProfile = gameProfile;
+
+- server.getPluginManager().callEvent(new PlayerShowEntityEvent(this, entity));
++ // Re-register the game profile for all players
++ for (ServerPlayer player : players) {
++ CraftPlayer bukkitPlayer = player.getBukkitEntity();
++ if (bukkitPlayer.canSee(this)) {
++ bukkitPlayer.trackAndShowEntity(self.getBukkitEntity());
++ }
++ }
++ // Refresh misc player things AFTER sending game profile
++ this.refreshPlayer();
+ }
+
+ void resetAndShowEntity(org.bukkit.entity.Entity entity) {
+@@ -1723,6 +1754,36 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ this.trackAndShowEntity(entity);
+ }
+ }
++ // Paper start
++ public com.destroystokyo.paper.profile.PlayerProfile getPlayerProfile() {
++ return new com.destroystokyo.paper.profile.CraftPlayerProfile(this).clone();
++ }
++
++ private void refreshPlayer() {
++ ServerPlayer handle = this.getHandle();
++ Location loc = this.getLocation();
++
++ ServerGamePacketListenerImpl connection = handle.connection;
++
++ //Respawn the player then update their position and selected slot
++ ServerLevel worldserver = handle.getLevel();
++ connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(worldserver.dimensionTypeId(), worldserver.dimension(), net.minecraft.world.level.biome.BiomeManager.obfuscateSeed(worldserver.getSeed()), handle.gameMode.getGameModeForPlayer(), handle.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA, this.getHandle().getLastDeathLocation()));
++ handle.onUpdateAbilities();
++ connection.internalTeleport(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch(), java.util.Collections.emptySet());
++ net.minecraft.server.MinecraftServer.getServer().getPlayerList().sendAllPlayerInfo(handle);
++
++ // 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));
++ }
++
++ if (this.isOp()) {
++ this.setOp(false);
++ this.setOp(true);
++ }
++ }
++ // Paper end
+
+ public void onEntityRemove(Entity entity) {
+ this.invertedVisibilityEntities.remove(entity.getUUID());
+diff --git a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
+index 173a2832f029e3d568208a1b56419c1b8501483c..48cdd483c25825571043800f3cfa41a4d723f649 100644
+--- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
++++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
+@@ -329,6 +329,12 @@ public class Commodore
+ return;
+ }
+
++ // Paper start - Rewrite plugins
++ if ((owner.equals("org/bukkit/OfflinePlayer") || owner.equals("org/bukkit/entity/Player")) && name.equals("getPlayerProfile") && desc.equals("()Lorg/bukkit/profile/PlayerProfile;")) {
++ super.visitMethodInsn(opcode, owner, name, "()Lcom/destroystokyo/paper/profile/PlayerProfile;", itf);
++ return;
++ }
++ // Paper end
+ if ( modern )
+ {
+ if ( owner.equals( "org/bukkit/Material" ) )