d454bbd5e1
This patch replaces the vanilla collision code for both block and entity collisions with faster implementations by JellySquid, used originally in her Lithium mod. Optimizes Full Block voxel collisions, and removes streams from Entity collisions Original code by JellySquid, licensed under GNU Lesser General Public License v3.0 you can find the original code on https://github.com/jellysquid3/lithium-fabric/tree/1.15.x/fabric (Yarn mappings) Ported by Co-authored-by: Zoutelande <54509836+Zoutelande@users.noreply.github.com> Touched up by Aikar to keep previous paper optimizations
124 lines
6.1 KiB
Diff
124 lines
6.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
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
|
|
index 641a52b968ef04a142b32703b61c8b75643b36a6..0b0c3c681c07cf8506df1b91b1feaf130891a440 100644
|
|
--- a/src/main/java/net/minecraft/server/ItemStack.java
|
|
+++ b/src/main/java/net/minecraft/server/ItemStack.java
|
|
@@ -54,7 +54,7 @@ public final class ItemStack {
|
|
// Paper end
|
|
@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
|
|
index d9574a9ace96d8c5666e62a5aed96a67021b91d8..e810da87977b441cc329066e3cb158ef3bc62a66 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketDataSerializer.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketDataSerializer.java
|
|
@@ -250,9 +250,18 @@ public class PacketDataSerializer extends ByteBuf {
|
|
if (item.usesDurability() || item.o()) {
|
|
// Spigot start - filter
|
|
itemstack = itemstack.cloneItemStack();
|
|
- CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack));
|
|
+ //CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); // Paper - This is no longer needed due to NBT being supported
|
|
// 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);
|
|
@@ -272,7 +281,17 @@ public class PacketDataSerializer extends ByteBuf {
|
|
itemstack.setTag(this.l());
|
|
// CraftBukkit start
|
|
if (itemstack.getTag() != null) {
|
|
- CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack));
|
|
+ // 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)); // Paper - This is no longer needed due to NBT being supported
|
|
}
|
|
// CraftBukkit end
|
|
return itemstack;
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
|
index 3a1d0deb0dec880d73185690e2a7c769a2731479..1fcbbd698a7e1b9ae3e8b5fa0328b85c43019bea 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
|
@@ -58,6 +58,7 @@ public class PacketPlayOutMapChunk implements Packet<PacketListenerPlayOut> {
|
|
|
|
if (this.f() || (i & 1 << j) != 0) {
|
|
NBTTagCompound nbttagcompound = tileentity.b();
|
|
+ if (tileentity instanceof TileEntitySkull) { TileEntitySkull.sanitizeTileEntityUUID(nbttagcompound); } // Paper
|
|
|
|
this.g.add(nbttagcompound);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntitySkull.java b/src/main/java/net/minecraft/server/TileEntitySkull.java
|
|
index 177cceb77f8783fe93ba7e4342de9c589f155c1b..0882d82cef92382cd4639ee7c9858fa5d59b3e5a 100644
|
|
--- a/src/main/java/net/minecraft/server/TileEntitySkull.java
|
|
+++ b/src/main/java/net/minecraft/server/TileEntitySkull.java
|
|
@@ -142,9 +142,37 @@ public class TileEntitySkull extends TileEntity /*implements ITickable*/ { // Pa
|
|
@Nullable
|
|
@Override
|
|
public PacketPlayOutTileEntityData getUpdatePacket() {
|
|
- return new PacketPlayOutTileEntityData(this.position, 4, this.b());
|
|
+ return new PacketPlayOutTileEntityData(this.position, 4, sanitizeTileEntityUUID(this.b())); // Paper
|
|
}
|
|
|
|
+ // 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
|
|
+
|
|
@Override
|
|
public NBTTagCompound b() {
|
|
return this.save(new NBTTagCompound());
|