aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0428-Clean-up-duplicated-GameProfile-Properties.patch
blob: e0627ff0bc3aa7521d7a8e45e0cfb14a0101af28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Wed, 1 Jul 2020 03:12:06 -0400
Subject: [PATCH] Clean up duplicated GameProfile Properties

We had a bug where we accidently cloned properties resulting in skulls
growing to large sizes and preventing login.

This now automatically cleans up the extra properties.

diff --git a/src/main/java/net/minecraft/nbt/NbtUtils.java b/src/main/java/net/minecraft/nbt/NbtUtils.java
index 7bc60901297d27d88efb401d02b4bc06d8b28874..6dac24354192bea79a4b9eb721543110826790b2 100644
--- a/src/main/java/net/minecraft/nbt/NbtUtils.java
+++ b/src/main/java/net/minecraft/nbt/NbtUtils.java
@@ -94,7 +94,8 @@ public final class NbtUtils {
                 for(String string2 : compoundTag.getAllKeys()) {
                     ListTag listTag = compoundTag.getList(string2, 10);
 
-                    for(int i = 0; i < listTag.size(); ++i) {
+                    if (listTag.size() == 0) continue; // Paper - remove duplicate properties
+                    for (int i = listTag.size() - 1; i < listTag.size(); ++i) { // Paper - remove duplicate properties
                         CompoundTag compoundTag2 = listTag.getCompound(i);
                         String string3 = compoundTag2.getString("Value");
                         if (compoundTag2.contains("Signature", 8)) {
diff --git a/src/main/java/net/minecraft/world/item/PlayerHeadItem.java b/src/main/java/net/minecraft/world/item/PlayerHeadItem.java
index 98465d012357b76103d73952527c43c317d0f1bd..4969353e3a02ad70d973ae8780d018710f2462a3 100644
--- a/src/main/java/net/minecraft/world/item/PlayerHeadItem.java
+++ b/src/main/java/net/minecraft/world/item/PlayerHeadItem.java
@@ -53,6 +53,18 @@ public class PlayerHeadItem extends StandingAndWallBlockItem {
             });
             // CraftBukkit start
         } else {
+            // Paper start - clean up old duplicated properties
+            CompoundTag properties = nbt.getCompound("SkullOwner").getCompound("Properties");
+            for (String key : properties.getAllKeys()) {
+                net.minecraft.nbt.ListTag values = properties.getList(key, 10);
+                if (values.size() > 1) {
+                    net.minecraft.nbt.Tag texture = values.get(values.size() - 1);
+                    values = new net.minecraft.nbt.ListTag();
+                    values.add(texture);
+                    properties.put(key, values);
+                }
+            }
+            // Paper end
             net.minecraft.nbt.ListTag textures = nbt.getCompound("SkullOwner").getCompound("Properties").getList("textures", 10); // Safe due to method contracts
             for (int i = 0; i < textures.size(); i++) {
                 if (textures.get(i) instanceof CompoundTag && !((CompoundTag) textures.get(i)).contains("Signature", 8) && ((CompoundTag) textures.get(i)).getString("Value").trim().isEmpty()) {