4af62f6d1d
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 2d009e64 Update SnakeYAML javadoc link b4fd213c Switch Player#updateInventory deprecation for internal API annotation CraftBukkit Changes: f3b2b2210 SPIGOT-7376: Exception with getBlockData when hasBlockData is false 725545630 SPIGOT-7375: Fix crash breeding certain entities b9873b0d4 Update Brigadier version with fix 68b320562 SPIGOT-7266: Found typo in CraftBukkit package 98b4d2ff8 SPIGOT-7372, SPIGOT-7373: Signs can't be edited, issues with SignChangeEvent 5f7bd4d78 SPIGOT-7371: Sign does not open edit text on placement b4cf99d24 SPIGOT-7371: Fix editing signs with API a2b6c2744 PR-1200: Implement open sign by side a345bb940 SPIGOT-7368: Downgrade SpecialSource version Spigot Changes: 723951c3 Rebuild patches b655c57d Drop old collision API deprecated since 1.9.4 55b0fed4 Rebuild patches
201 Zeilen
11 KiB
Diff
201 Zeilen
11 KiB
Diff
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.
|
|
|
|
== 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 c43f50f884b6c9c0eb6eb8e11ac892c8986529b8..3669e467607517b9c488d4f804c5a8e129fe39c7 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -1535,7 +1535,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 fd7e9909875961a1a7288f235ef73de518467f25..26e89e7c9d648b9b1ce33714da8503122f100a9f 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;
|
|
@@ -258,11 +259,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;
|
|
@@ -1659,8 +1655,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());
|
|
@@ -1673,8 +1676,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) {
|
|
@@ -1751,8 +1752,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) {
|
|
@@ -1765,6 +1796,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.serverLevel();
|
|
+ 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.getPortalCooldown()));
|
|
+ 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" ) )
|