Commits

blablubbabc authored and md_5 committed 7c8bbcbee7b
SPIGOT-6716: Preserve the order of stored enchantments of enchanted books.

In some cases, differences in this order can result in item stack comparisons to fails.
No tags

src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaEnchantedBook.java

Modified
1 1 package org.bukkit.craftbukkit.inventory;
2 2
3 3 import com.google.common.collect.ImmutableMap;
4 4 import com.google.common.collect.ImmutableMap.Builder;
5 -import java.util.HashMap;
5 +import java.util.LinkedHashMap;
6 6 import java.util.Map;
7 7 import net.minecraft.nbt.NBTTagCompound;
8 8 import org.bukkit.Material;
9 9 import org.bukkit.configuration.serialization.DelegateDeserialization;
10 10 import org.bukkit.craftbukkit.inventory.CraftMetaItem.ItemMetaKey;
11 11 import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta;
12 12 import org.bukkit.enchantments.Enchantment;
13 13 import org.bukkit.inventory.meta.EnchantmentStorageMeta;
14 14
15 15 @DelegateDeserialization(SerializableMeta.class)
21 21 CraftMetaEnchantedBook(CraftMetaItem meta) {
22 22 super(meta);
23 23
24 24 if (!(meta instanceof CraftMetaEnchantedBook)) {
25 25 return;
26 26 }
27 27
28 28 CraftMetaEnchantedBook that = (CraftMetaEnchantedBook) meta;
29 29
30 30 if (that.hasEnchants()) {
31 - this.enchantments = new HashMap<Enchantment, Integer>(that.enchantments);
31 + this.enchantments = new LinkedHashMap<Enchantment, Integer>(that.enchantments);
32 32 }
33 33 }
34 34
35 35 CraftMetaEnchantedBook(NBTTagCompound tag) {
36 36 super(tag);
37 37
38 38 if (!tag.hasKey(STORED_ENCHANTMENTS.NBT)) {
39 39 return;
40 40 }
41 41
98 98 }
99 99
100 100 return original != hash ? CraftMetaEnchantedBook.class.hashCode() ^ hash : hash;
101 101 }
102 102
103 103 @Override
104 104 public CraftMetaEnchantedBook clone() {
105 105 CraftMetaEnchantedBook meta = (CraftMetaEnchantedBook) super.clone();
106 106
107 107 if (this.enchantments != null) {
108 - meta.enchantments = new HashMap<Enchantment, Integer>(this.enchantments);
108 + meta.enchantments = new LinkedHashMap<Enchantment, Integer>(this.enchantments);
109 109 }
110 110
111 111 return meta;
112 112 }
113 113
114 114 @Override
115 115 Builder<String, Object> serialize(Builder<String, Object> builder) {
116 116 super.serialize(builder);
117 117
118 118 serializeEnchantments(enchantments, builder, STORED_ENCHANTMENTS);
139 139 }
140 140
141 141 @Override
142 142 public Map<Enchantment, Integer> getStoredEnchants() {
143 143 return hasStoredEnchants() ? ImmutableMap.copyOf(enchantments) : ImmutableMap.<Enchantment, Integer>of();
144 144 }
145 145
146 146 @Override
147 147 public boolean addStoredEnchant(Enchantment ench, int level, boolean ignoreRestrictions) {
148 148 if (enchantments == null) {
149 - enchantments = new HashMap<Enchantment, Integer>(4);
149 + enchantments = new LinkedHashMap<Enchantment, Integer>(4);
150 150 }
151 151
152 152 if (ignoreRestrictions || level >= ench.getStartLevel() && level <= ench.getMaxLevel()) {
153 153 Integer old = enchantments.put(ench, level);
154 154 return old == null || old != level;
155 155 }
156 156 return false;
157 157 }
158 158
159 159 @Override

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut