Paper/patches/server/0243-Fix-client-rendering-skulls-from-same-user.patch

119 lines
6.2 KiB
Diff
Raw Normal View History

2021-06-11 14:02:28 +02:00
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/network/FriendlyByteBuf.java b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
2021-06-17 23:39:36 +02:00
index e38e53bd39c384bac4d7111e6a2c721744a122f1..70fb9001b12b105fbf471bd0127d8414e03f9329 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/network/FriendlyByteBuf.java
+++ b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
2021-06-17 23:39:36 +02:00
@@ -472,9 +472,18 @@ public class FriendlyByteBuf extends ByteBuf {
2021-06-11 14:02:28 +02:00
if (item.canBeDepleted() || item.shouldOverrideMultiplayerNbt()) {
// Spigot start - filter
2021-06-13 01:45:00 +02:00
stack = stack.copy();
- CraftItemStack.setItemMeta(stack, CraftItemStack.getItemMeta(stack));
+ // CraftItemStack.setItemMeta(stack, CraftItemStack.getItemMeta(stack)); // Paper - This is no longer needed due to NBT being supported
2021-06-11 14:02:28 +02:00
// Spigot end
2021-06-13 01:45:00 +02:00
nbttagcompound = stack.getTag();
2021-06-11 14:02:28 +02:00
+ // Paper start
+ if (nbttagcompound != null && nbttagcompound.contains("SkullOwner", 10)) {
+ CompoundTag owner = nbttagcompound.getCompound("SkullOwner");
+ if (owner.hasUUID("Id")) {
2021-06-17 23:39:36 +02:00
+ nbttagcompound.putUUID("SkullOwnerOrig", owner.getUUID("Id"));
2021-06-13 01:45:00 +02:00
+ net.minecraft.world.level.block.entity.SkullBlockEntity.sanitizeUUID(owner);
2021-06-11 14:02:28 +02:00
+ }
+ }
+ // Paper end
}
this.writeNbt(nbttagcompound);
2021-06-17 23:39:36 +02:00
@@ -494,7 +503,16 @@ public class FriendlyByteBuf extends ByteBuf {
2021-06-11 14:02:28 +02:00
itemstack.setTag(this.readNbt());
// 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.contains("SkullOwnerOrig")) {
+ CompoundTag owner = itemstack.tag.getCompound("SkullOwner");
+ if (itemstack.tag.contains("SkullOwnerOrig")) {
+ owner.tags.put("Id", itemstack.tag.tags.get("SkullOwnerOrig"));
+ 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/network/protocol/game/ClientboundLevelChunkPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacket.java
2021-06-13 01:45:00 +02:00
index 3bdb09ab00ec05ed532a0c26b9fd321e1f05c1a0..1451a98d69b185dd15a2d1d7681bcecb6a4f99c1 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacket.java
+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacket.java
2021-06-13 01:45:00 +02:00
@@ -48,6 +48,7 @@ public class ClientboundLevelChunkPacket implements Packet<ClientGamePacketListe
for(Entry<BlockPos, BlockEntity> entry2 : chunk.getBlockEntities().entrySet()) {
BlockEntity blockEntity = entry2.getValue();
CompoundTag compoundTag = blockEntity.getUpdateTag();
+ if (blockEntity instanceof net.minecraft.world.level.block.entity.SkullBlockEntity) { net.minecraft.world.level.block.entity.SkullBlockEntity.sanitizeTileEntityUUID(compoundTag); } // Paper
this.blockEntitiesTags.add(compoundTag);
}
2021-06-11 14:02:28 +02:00
diff --git a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
2021-06-17 23:39:36 +02:00
index eaf586eb386e13e954bc593f6ddbc45929cec204..172413fc0f303d5e15bc2bc55c09ce4faf5298a0 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
2021-06-13 01:45:00 +02:00
@@ -10,6 +10,7 @@ import java.util.function.Consumer;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos;
2021-06-11 14:02:28 +02:00
import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
2021-06-13 01:45:00 +02:00
import net.minecraft.server.players.GameProfileCache;
@@ -91,9 +92,37 @@ public class SkullBlockEntity extends BlockEntity {
2021-06-11 14:02:28 +02:00
@Nullable
@Override
public ClientboundBlockEntityDataPacket getUpdatePacket() {
- return new ClientboundBlockEntityDataPacket(this.worldPosition, 4, this.getUpdateTag());
+ return new ClientboundBlockEntityDataPacket(this.worldPosition, 4, sanitizeTileEntityUUID(this.getUpdateTag())); // Paper
}
+ // Paper start
+ public static CompoundTag sanitizeTileEntityUUID(CompoundTag cmp) {
+ CompoundTag owner = cmp.getCompound("Owner");
+ if (!owner.isEmpty()) {
+ sanitizeUUID(owner);
+ }
+ return cmp;
+ }
+
+ public static void sanitizeUUID(CompoundTag owner) {
+ CompoundTag properties = owner.getCompound("Properties");
+ ListTag list = null;
+ if (!properties.isEmpty()) {
+ list = properties.getList("textures", 10);
+ }
+
+ if (list != null && !list.isEmpty()) {
+ String textures = ((CompoundTag)list.get(0)).getString("Value");
+ if (textures != null && textures.length() > 3) {
+ UUID uuid = UUID.nameUUIDFromBytes(textures.getBytes());
2021-06-17 23:39:36 +02:00
+ owner.putUUID("Id", uuid);
2021-06-11 14:02:28 +02:00
+ return;
+ }
+ }
2021-06-17 23:39:36 +02:00
+ owner.putUUID("Id", UUID.randomUUID());
2021-06-11 14:02:28 +02:00
+ }
+ // Paper end
+
@Override
public CompoundTag getUpdateTag() {
return this.save(new CompoundTag());