mirror of
https://github.com/PaperMC/Paper.git
synced 2025-07-31 04:02:06 -07:00
Correctly order getArmorContents
Mojangs EQUIPMENT_SLOT_MAPPING uses an Int2ObjectArrayMap and hence technically does provide iteration stability, however it is filled from a MapN, which destroys the well order of the entries. To iterate from smallest to largest inventory index correctly, this commit introduces a sorted array based on the EQUIPMENT_SLOT_MAPPING.
This commit is contained in:
@@ -204,10 +204,10 @@ index 6d3e3ec045d5b15a435f7217369968b33e082724..b7a3758af337270737041f84d10eb437
|
||||
int i = this.inventory.findSlotMatchingCraftingIngredient(item, item1);
|
||||
if (i == -1) {
|
||||
diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java
|
||||
index 24d32c0163d27a7886bd4048d508591b89f714a4..dd406c5becacbc2d05b062726a8af88a1d6faba9 100644
|
||||
index e25e0bd410f8822cb9a1118b39a786f44aabef7b..d9cb4f0ed0c4f63362c837aeef3c4194911455c9 100644
|
||||
--- a/net/minecraft/world/entity/player/Inventory.java
|
||||
+++ b/net/minecraft/world/entity/player/Inventory.java
|
||||
@@ -230,12 +230,12 @@ public class Inventory implements Container, Nameable {
|
||||
@@ -234,12 +234,12 @@ public class Inventory implements Container, Nameable {
|
||||
return !stack.isDamaged() && !stack.isEnchanted() && !stack.has(DataComponents.CUSTOM_NAME);
|
||||
}
|
||||
|
||||
|
@@ -1,10 +1,14 @@
|
||||
--- a/net/minecraft/world/entity/player/Inventory.java
|
||||
+++ b/net/minecraft/world/entity/player/Inventory.java
|
||||
@@ -49,6 +_,66 @@
|
||||
@@ -49,6 +_,70 @@
|
||||
public final Player player;
|
||||
public final EntityEquipment equipment;
|
||||
private int timesChanged;
|
||||
+ // CraftBukkit start - add fields and methods
|
||||
+ // Paper start - add fields and methods
|
||||
+ public static final EquipmentSlot[] EQUIPMENT_SLOTS_SORTED_BY_INDEX = EQUIPMENT_SLOT_MAPPING.int2ObjectEntrySet()
|
||||
+ .stream()
|
||||
+ .sorted(java.util.Comparator.comparingInt(it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry::getIntKey))
|
||||
+ .map(java.util.Map.Entry::getValue).toArray(EquipmentSlot[]::new);
|
||||
+ public java.util.List<org.bukkit.entity.HumanEntity> transaction = new java.util.ArrayList<>();
|
||||
+ private int maxStack = MAX_STACK;
|
||||
+
|
||||
@@ -12,20 +16,20 @@
|
||||
+ public java.util.List<ItemStack> getContents() {
|
||||
+ java.util.List<ItemStack> combined = new java.util.ArrayList<>(this.items.size() + EQUIPMENT_SLOT_MAPPING.size());
|
||||
+ combined.addAll(this.items);
|
||||
+ EQUIPMENT_SLOT_MAPPING.int2ObjectEntrySet().forEach(entry -> {
|
||||
+ ItemStack itemStack = this.equipment.get(entry.getValue());
|
||||
+ for (EquipmentSlot equipmentSlot : EQUIPMENT_SLOTS_SORTED_BY_INDEX) {
|
||||
+ ItemStack itemStack = this.equipment.get(equipmentSlot);
|
||||
+ combined.add(itemStack); // Include empty items
|
||||
+ });
|
||||
+ };
|
||||
+ return combined;
|
||||
+ }
|
||||
+
|
||||
+ public java.util.List<ItemStack> getArmorContents() {
|
||||
+ java.util.List<ItemStack> items = new java.util.ArrayList<>();
|
||||
+ EQUIPMENT_SLOT_MAPPING.int2ObjectEntrySet().forEach(entry -> {
|
||||
+ if (entry.getValue().isArmor()) {
|
||||
+ items.add(this.equipment.get(entry.getValue()));
|
||||
+ for (EquipmentSlot equipmentSlot : EQUIPMENT_SLOTS_SORTED_BY_INDEX) {
|
||||
+ if (equipmentSlot.isArmor()) {
|
||||
+ items.add(this.equipment.get(equipmentSlot));
|
||||
+ }
|
||||
+ });
|
||||
+ }
|
||||
+ return items;
|
||||
+ }
|
||||
+
|
||||
@@ -63,7 +67,7 @@
|
||||
+ public org.bukkit.Location getLocation() {
|
||||
+ return this.player.getBukkitEntity().getLocation();
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+ // Paper end - add fields and methods
|
||||
|
||||
public Inventory(Player player, EntityEquipment equipment) {
|
||||
this.player = player;
|
||||
|
Reference in New Issue
Block a user