mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 23:38:25 +01:00
Extend player profile API to support skin changes
Added code that refreshes the player's skin by sending packets with a special order, telling the client to respawn the player and re-apply the game profile
This commit is contained in:
parent
4cccd48a4c
commit
a7f45fb1b4
2 changed files with 21 additions and 130 deletions
|
@ -1,27 +0,0 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: NickAcPT <32451103+NickAcPT@users.noreply.github.com>
|
|
||||||
Date: Sat, 21 Jul 2018 01:30:41 +0100
|
|
||||||
Subject: [PATCH] Extend player profile API to support skin changes
|
|
||||||
|
|
||||||
Added code that refreshes the player's skin by sending packets with a special order, telling the client to respawn the player and re-apply the game profile
|
|
||||||
|
|
||||||
diff --git a/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
|
|
||||||
index e060c38a..98eade06 100644
|
|
||||||
--- a/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
|
|
||||||
+++ b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
|
|
||||||
@@ -0,0 +0,0 @@ public interface PlayerProfile {
|
|
||||||
* @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
|
|
||||||
*/
|
|
||||||
boolean complete(boolean textures);
|
|
||||||
+ /**
|
|
||||||
+ * If this profile is not complete, then make the API call to complete it.
|
|
||||||
+ * This is a blocking operation and should be done asynchronously.
|
|
||||||
+ *
|
|
||||||
+ * Optionally will also fill textures.
|
|
||||||
+ * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
|
|
||||||
+ */
|
|
||||||
+ boolean complete(boolean textures, boolean force);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether or not this Profile has textures associated to it
|
|
||||||
--
|
|
|
@ -5,51 +5,6 @@ Subject: [PATCH] Extend player profile API to support skin changes
|
||||||
|
|
||||||
Added code that refreshes the player's skin by sending packets with a special order, telling the client to respawn the player and re-apply the game profile
|
Added code that refreshes the player's skin by sending packets with a special order, telling the client to respawn the player and re-apply the game profile
|
||||||
|
|
||||||
diff --git a/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java
|
|
||||||
index 9ad5853d..dda24052 100644
|
|
||||||
--- a/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java
|
|
||||||
+++ b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java
|
|
||||||
@@ -0,0 +0,0 @@ public class CraftPlayerProfile implements PlayerProfile {
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean complete(boolean textures) {
|
|
||||||
+ return complete(textures, false);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public boolean complete(boolean textures, boolean force) {
|
|
||||||
MinecraftServer server = MinecraftServer.getServer();
|
|
||||||
|
|
||||||
boolean isOnlineMode = server.getOnlineMode() || (SpigotConfig.bungee && PaperConfig.bungeeOnlineMode);
|
|
||||||
boolean isCompleteFromCache = this.completeFromCache(true);
|
|
||||||
- if (isOnlineMode && (!isCompleteFromCache || textures && !hasTextures())) {
|
|
||||||
+ if ((isOnlineMode || force) && (!isCompleteFromCache || textures && !hasTextures())) {
|
|
||||||
GameProfile result = server.getSessionService().fillProfileProperties(profile, true);
|
|
||||||
if (result != null) {
|
|
||||||
this.profile = result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- return profile.isComplete() && (!isOnlineMode || !textures || hasTextures());
|
|
||||||
+ return profile.isComplete() && (!(isOnlineMode || force) || !textures || hasTextures());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void copyProfileProperties(GameProfile source, GameProfile target) {
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
|
||||||
index dd78a87b..e3f7be28 100644
|
|
||||||
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
|
||||||
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
|
||||||
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Paper start - Provide dimension number of world
|
|
||||||
+ public int getDimension() {
|
|
||||||
+ return dimension;
|
|
||||||
+ }
|
|
||||||
+ // Paper end
|
|
||||||
+
|
|
||||||
// CraftBukkit start
|
|
||||||
@Override
|
|
||||||
public TileEntity getTileEntity(BlockPosition pos) {
|
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||||
index 210e3bc4..b0335684 100644
|
index 210e3bc4..b0335684 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||||
|
@ -68,7 +23,7 @@ index 210e3bc4..b0335684 100644
|
||||||
|
|
||||||
public CraftWorld(WorldServer world, ChunkGenerator gen, Environment env) {
|
public CraftWorld(WorldServer world, ChunkGenerator gen, Environment env) {
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
index 6cbf429f..bd743be5 100644
|
index 6cbf429f..57f17120 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
@@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.CraftStatistic;
|
@@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.CraftStatistic;
|
||||||
|
@ -80,13 +35,9 @@ index 6cbf429f..bd743be5 100644
|
||||||
import org.bukkit.craftbukkit.map.RenderData;
|
import org.bukkit.craftbukkit.map.RenderData;
|
||||||
import org.bukkit.craftbukkit.scoreboard.CraftScoreboard;
|
import org.bukkit.craftbukkit.scoreboard.CraftScoreboard;
|
||||||
@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||||
public void setPlayerProfile(PlayerProfile profile) {
|
for (EntityPlayer player : players) {
|
||||||
EntityPlayer self = getHandle();
|
player.getBukkitEntity().reregisterPlayer(self);
|
||||||
self.setProfile(CraftPlayerProfile.asAuthlibCopy(profile));
|
}
|
||||||
- List<EntityPlayer> players = server.getServer().getPlayerList().players;
|
|
||||||
- for (EntityPlayer player : players) {
|
|
||||||
- player.getBukkitEntity().reregisterPlayer(self);
|
|
||||||
- }
|
|
||||||
+ refreshPlayer();
|
+ refreshPlayer();
|
||||||
}
|
}
|
||||||
public PlayerProfile getPlayerProfile() {
|
public PlayerProfile getPlayerProfile() {
|
||||||
|
@ -94,64 +45,31 @@ index 6cbf429f..bd743be5 100644
|
||||||
}
|
}
|
||||||
+
|
+
|
||||||
+ private void refreshPlayer() {
|
+ private void refreshPlayer() {
|
||||||
+ int dimension = getWorld().getEnvironment().getId();
|
+ EntityPlayer entityplayer = getHandle();
|
||||||
+ Packet respawn = new PacketPlayOutRespawn(dimension, ((WorldServer)getHandle().getWorld()).worldData.getDifficulty(), ((WorldServer)getHandle().getWorld()).worldData.getType(), EnumGamemode.getById(getHandle().playerInteractManager.getGameMode().getId()));
|
|
||||||
+ Location l = getLocation();
|
|
||||||
+
|
+
|
||||||
|
+ Packet respawn = new PacketPlayOutRespawn(entityplayer.dimension, entityplayer.world.getDifficulty(), entityplayer.world.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode());
|
||||||
|
+ Location l = getLocation();
|
||||||
+ Packet pos = new PacketPlayOutPosition(l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch(), new HashSet<>(), 0);
|
+ Packet pos = new PacketPlayOutPosition(l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch(), new HashSet<>(), 0);
|
||||||
+ Packet mainhand = new PacketPlayOutEntityEquipment(getEntityId(), EnumItemSlot.MAINHAND, CraftItemStack.asNMSCopy(getInventory().getItemInMainHand()));
|
|
||||||
+ Packet offhand = new PacketPlayOutEntityEquipment(getEntityId(), EnumItemSlot.OFFHAND, CraftItemStack.asNMSCopy(getInventory().getItemInOffHand()));
|
|
||||||
+ Packet helm = new PacketPlayOutEntityEquipment(getEntityId(), EnumItemSlot.HEAD, CraftItemStack.asNMSCopy(getInventory().getHelmet()));
|
|
||||||
+ Packet chest = new PacketPlayOutEntityEquipment(getEntityId(), EnumItemSlot.CHEST, CraftItemStack.asNMSCopy(getInventory().getChestplate()));
|
|
||||||
+ Packet legs = new PacketPlayOutEntityEquipment(getEntityId(), EnumItemSlot.LEGS, CraftItemStack.asNMSCopy(getInventory().getLeggings()));
|
|
||||||
+ Packet feet = new PacketPlayOutEntityEquipment(getEntityId(), EnumItemSlot.FEET, CraftItemStack.asNMSCopy(getInventory().getBoots()));
|
|
||||||
+ Packet slot = new PacketPlayOutHeldItemSlot(getInventory().getHeldItemSlot());
|
+ Packet slot = new PacketPlayOutHeldItemSlot(getInventory().getHeldItemSlot());
|
||||||
+
|
+
|
||||||
+ for (Player pOnline : Bukkit.getOnlinePlayers()) {
|
+ EntityPlayer handle = getHandle();
|
||||||
+ EntityPlayer handle = ((CraftPlayer) pOnline).getHandle();
|
+ PlayerConnection playerCon = handle.playerConnection;
|
||||||
+ PlayerConnection playerCon = handle.playerConnection;
|
+ reregisterPlayer(handle);
|
||||||
+ if (pOnline.equals(this)) {
|
|
||||||
+ reregisterPlayer(handle);
|
|
||||||
+
|
+
|
||||||
+ //Respawn the player then update their position and selected slot
|
+ //Respawn the player then update their position and selected slot
|
||||||
+ handle.playerConnection.sendPacket(respawn);
|
+ playerCon.sendPacket(respawn);
|
||||||
+ handle.updateAbilities();
|
+ handle.updateAbilities();
|
||||||
+ handle.playerConnection.sendPacket(pos);
|
+ playerCon.sendPacket(pos);
|
||||||
+ handle.playerConnection.sendPacket(slot);
|
+ playerCon.sendPacket(slot);
|
||||||
+
|
+
|
||||||
+ ((CraftPlayer) pOnline).updateScaledHealth();
|
+ updateScaledHealth();
|
||||||
+ pOnline.updateInventory();
|
+ this.updateInventory();
|
||||||
+
|
+
|
||||||
+ handle.triggerHealthUpdate();
|
+ handle.triggerHealthUpdate();
|
||||||
+
|
+
|
||||||
+ if (pOnline.isOp()) {
|
+ if (this.isOp()) {
|
||||||
+ pOnline.setOp(false);
|
+ this.setOp(false);
|
||||||
+ pOnline.setOp(true);
|
+ this.setOp(true);
|
||||||
+ }
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ if (pOnline.getWorld().equals(getWorld()) && pOnline.canSee(this) && isOnline()) {
|
|
||||||
+ PacketPlayOutEntityDestroy removeEntity = new PacketPlayOutEntityDestroy(new int[]{getEntityId()});
|
|
||||||
+ PacketPlayOutNamedEntitySpawn addNamed = new PacketPlayOutNamedEntitySpawn(getHandle());
|
|
||||||
+
|
|
||||||
+ //Remove and reregister the player
|
|
||||||
+ handle.playerConnection.sendPacket(removeEntity);
|
|
||||||
+ ((CraftPlayer) pOnline).reregisterPlayer(this.getHandle());
|
|
||||||
+ handle.playerConnection.sendPacket(addNamed);
|
|
||||||
+
|
|
||||||
+ //Send hand items
|
|
||||||
+ handle.playerConnection.sendPacket(mainhand);
|
|
||||||
+ handle.playerConnection.sendPacket(offhand);
|
|
||||||
+
|
|
||||||
+ //Send armor
|
|
||||||
+ handle.playerConnection.sendPacket(helm);
|
|
||||||
+ handle.playerConnection.sendPacket(chest);
|
|
||||||
+ handle.playerConnection.sendPacket(legs);
|
|
||||||
+ handle.playerConnection.sendPacket(feet);
|
|
||||||
+ } else {
|
|
||||||
+ //Just send player update
|
|
||||||
+ ((CraftPlayer) pOnline).reregisterPlayer(this.getHandle());
|
|
||||||
+ }
|
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ }
|
+ }
|
||||||
|
|
Loading…
Reference in a new issue