2019-03-20 02:46:00 +01:00
|
|
|
From 6bf0f56317073c410ca0a168e77a084f55cf066d Mon Sep 17 00:00:00 2001
|
2018-08-05 02:42:27 +02:00
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
Date: Tue, 22 Nov 2016 00:40:42 -0500
|
|
|
|
Subject: [PATCH] Fix client rendering skulls from same user
|
|
|
|
|
|
|
|
See: https://github.com/PaperMC/Paper/issues/1304
|
|
|
|
|
|
|
|
Changes the UUID sent to client to be based on either
|
|
|
|
the texture payload, or random.
|
|
|
|
|
|
|
|
This allows the client to render multiple skull textures from the same user,
|
|
|
|
for when different skins were used when skull was made.
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
|
2019-03-20 02:46:00 +01:00
|
|
|
index 713977e3c..91a9f1bbb 100644
|
2018-08-05 02:42:27 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/ItemStack.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/ItemStack.java
|
|
|
|
@@ -44,7 +44,7 @@ public final class ItemStack {
|
|
|
|
private int e;
|
|
|
|
@Deprecated
|
|
|
|
private Item item;
|
|
|
|
- private NBTTagCompound tag;
|
|
|
|
+ NBTTagCompound tag; // Paper -> package private
|
|
|
|
private boolean h;
|
|
|
|
private EntityItemFrame i;
|
|
|
|
private ShapeDetectorBlock j;
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketDataSerializer.java b/src/main/java/net/minecraft/server/PacketDataSerializer.java
|
2018-12-15 02:17:27 +01:00
|
|
|
index d05f1e02c..b95836d44 100644
|
2018-08-05 02:42:27 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/PacketDataSerializer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/PacketDataSerializer.java
|
2018-10-23 01:16:21 +02:00
|
|
|
@@ -253,6 +253,15 @@ public class PacketDataSerializer extends ByteBuf {
|
2018-08-05 02:42:27 +02:00
|
|
|
CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack));
|
|
|
|
// Spigot end
|
|
|
|
nbttagcompound = itemstack.getTag();
|
|
|
|
+ // Paper start
|
|
|
|
+ if (nbttagcompound != null && nbttagcompound.hasKeyOfType("SkullOwner", 10)) {
|
|
|
|
+ NBTTagCompound owner = nbttagcompound.getCompound("SkullOwner");
|
|
|
|
+ if (owner.hasKey("Id")) {
|
|
|
|
+ nbttagcompound.setString("SkullOwnerOrig", owner.getString("Id"));
|
|
|
|
+ TileEntitySkull.sanitizeUUID(owner);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
|
|
|
|
this.a(nbttagcompound);
|
2018-08-26 04:37:58 +02:00
|
|
|
@@ -272,6 +281,16 @@ public class PacketDataSerializer extends ByteBuf {
|
2018-08-05 02:42:27 +02:00
|
|
|
itemstack.setTag(this.j());
|
|
|
|
// CraftBukkit start
|
|
|
|
if (itemstack.getTag() != null) {
|
|
|
|
+ // Paper start - Fix skulls of same owner - restore orig ID since we changed it on send to client
|
|
|
|
+ if (itemstack.tag.hasKey("SkullOwnerOrig")) {
|
|
|
|
+ NBTTagCompound owner = itemstack.tag.getCompound("SkullOwner");
|
|
|
|
+ String ownerOrig = itemstack.tag.getString("SkullOwnerOrig");
|
|
|
|
+ if (!owner.isEmpty() && !ownerOrig.isEmpty()) {
|
|
|
|
+ owner.setString("Id", ownerOrig);
|
|
|
|
+ }
|
|
|
|
+ itemstack.tag.remove("SkullOwnerOrig");
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack));
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
2019-01-01 04:15:55 +01:00
|
|
|
index f2159bc2d..18ef7232e 100644
|
2018-08-05 02:42:27 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
2019-01-01 04:15:55 +01:00
|
|
|
@@ -38,6 +38,7 @@ public class PacketPlayOutMapChunk implements Packet<PacketListenerPlayOut> {
|
|
|
|
|
2018-08-05 02:42:27 +02:00
|
|
|
if (this.f() || (i & 1 << j) != 0) {
|
|
|
|
NBTTagCompound nbttagcompound = tileentity.aa_();
|
|
|
|
+ if (tileentity instanceof TileEntitySkull) { TileEntitySkull.sanitizeTileEntityUUID(nbttagcompound); } // Paper
|
2019-01-01 04:15:55 +01:00
|
|
|
|
2018-08-05 02:42:27 +02:00
|
|
|
this.e.add(nbttagcompound);
|
|
|
|
}
|
2019-01-01 04:15:55 +01:00
|
|
|
@@ -122,7 +123,7 @@ public class PacketPlayOutMapChunk implements Packet<PacketListenerPlayOut> {
|
|
|
|
BiomeBase[] abiomebase = chunk.getBiomeIndex();
|
|
|
|
|
|
|
|
for (l = 0; l < abiomebase.length; ++l) {
|
|
|
|
- packetdataserializer.writeInt(IRegistry.BIOME.a((Object) abiomebase[l]));
|
|
|
|
+ packetdataserializer.writeInt(IRegistry.BIOME.a(abiomebase[l])); // Paper - Decompile fix
|
|
|
|
}
|
2018-08-05 02:42:27 +02:00
|
|
|
}
|
2019-01-01 04:15:55 +01:00
|
|
|
|
2018-08-05 02:42:27 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntitySkull.java b/src/main/java/net/minecraft/server/TileEntitySkull.java
|
2019-01-01 04:15:55 +01:00
|
|
|
index 79c24cdc4..6511bfda8 100644
|
2018-08-05 02:42:27 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/TileEntitySkull.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/TileEntitySkull.java
|
2018-08-26 20:11:49 +02:00
|
|
|
@@ -142,9 +142,37 @@ public class TileEntitySkull extends TileEntity /*implements ITickable*/ { // Pa
|
2018-08-05 02:42:27 +02:00
|
|
|
return this.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start
|
|
|
|
+ static NBTTagCompound sanitizeTileEntityUUID(NBTTagCompound cmp) {
|
|
|
|
+ NBTTagCompound owner = cmp.getCompound("Owner");
|
|
|
|
+ if (!owner.isEmpty()) {
|
|
|
|
+ sanitizeUUID(owner);
|
|
|
|
+ }
|
|
|
|
+ return cmp;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ static void sanitizeUUID(NBTTagCompound owner) {
|
|
|
|
+ NBTTagCompound properties = owner.getCompound("Properties");
|
|
|
|
+ NBTTagList list = null;
|
|
|
|
+ if (!properties.isEmpty()) {
|
|
|
|
+ list = properties.getList("textures", 10);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (list != null && !list.isEmpty()) {
|
|
|
|
+ String textures = ((NBTTagCompound)list.get(0)).getString("Value");
|
|
|
|
+ if (textures != null && textures.length() > 3) {
|
|
|
|
+ String uuid = UUID.nameUUIDFromBytes(textures.getBytes()).toString();
|
|
|
|
+ owner.setString("Id", uuid);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ owner.setString("Id", UUID.randomUUID().toString());
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
@Nullable
|
|
|
|
public PacketPlayOutTileEntityData getUpdatePacket() {
|
|
|
|
- return new PacketPlayOutTileEntityData(this.position, 4, this.aa_());
|
|
|
|
+ return new PacketPlayOutTileEntityData(this.position, 4, sanitizeTileEntityUUID(this.aa_())); // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
public NBTTagCompound aa_() {
|
|
|
|
--
|
2019-03-20 02:46:00 +01:00
|
|
|
2.21.0
|
2018-08-05 02:42:27 +02:00
|
|
|
|