From 6e271dc9e4e581fbd1f5f6961b7ade7a3c418d3b Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Wed, 15 Mar 2023 18:29:45 -0700
Subject: [PATCH] Fix inventories returning null Locations

Wandering Trader, AbstractHorse, Beacon and Composter inventories returned null locations
when a block or entity location is readily available

Co-authored-by: Lukas Planz <lukas.planz@web.de>
---
 .../world/SimpleContainer.java.patch          | 16 +++++++++++++---
 .../world/inventory/BeaconMenu.java.patch     | 19 ++++++++++++++++---
 .../inventory/MerchantContainer.java.patch    |  2 +-
 3 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/paper-server/patches/sources/net/minecraft/world/SimpleContainer.java.patch b/paper-server/patches/sources/net/minecraft/world/SimpleContainer.java.patch
index a49fedbf82..177f071e31 100644
--- a/paper-server/patches/sources/net/minecraft/world/SimpleContainer.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/SimpleContainer.java.patch
@@ -1,6 +1,6 @@
 --- a/net/minecraft/world/SimpleContainer.java
 +++ b/net/minecraft/world/SimpleContainer.java
-@@ -14,16 +14,74 @@
+@@ -14,16 +14,84 @@
  import net.minecraft.world.item.Item;
  import net.minecraft.world.item.ItemStack;
  
@@ -50,9 +50,19 @@
 +    public org.bukkit.inventory.InventoryHolder getOwner() {
 +        return this.bukkitOwner;
 +    }
-+
+ 
 +    @Override
 +    public Location getLocation() {
++        // Paper start - Fix inventories returning null Locations
++        // When the block inventory does not have a tile state that implements getLocation, e. g. composters
++        if (this.bukkitOwner instanceof org.bukkit.inventory.BlockInventoryHolder blockInventoryHolder) {
++            return blockInventoryHolder.getBlock().getLocation();
++        }
++        // When the bukkit owner is a bukkit entity, but does not implement Container itself, e. g. horses
++        if (this.bukkitOwner instanceof org.bukkit.entity.Entity entity) {
++            return entity.getLocation();
++        }
++        // Paper end - Fix inventories returning null Locations
 +        return null;
 +    }
 +
@@ -62,7 +72,7 @@
 +            this.items.set(slot, original.items.get(slot).copy());
 +        }
 +    }
- 
++
      public SimpleContainer(int size) {
 -        this.size = size;
 -        this.items = NonNullList.withSize(size, ItemStack.EMPTY);
diff --git a/paper-server/patches/sources/net/minecraft/world/inventory/BeaconMenu.java.patch b/paper-server/patches/sources/net/minecraft/world/inventory/BeaconMenu.java.patch
index 7034563131..6a57db5ede 100644
--- a/paper-server/patches/sources/net/minecraft/world/inventory/BeaconMenu.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/inventory/BeaconMenu.java.patch
@@ -35,7 +35,20 @@
              @Override
              public boolean canPlaceItem(int slot, ItemStack stack) {
                  return stack.is(ItemTags.BEACON_PAYMENT_ITEMS);
-@@ -69,6 +77,7 @@
+@@ -44,6 +52,12 @@
+             public int getMaxStackSize() {
+                 return 1;
+             }
++            // Paper start - Fix inventories returning null Locations
++            @Override
++            public org.bukkit.Location getLocation() {
++                return context.getLocation();
++            }
++            // Paper end - Fix inventories returning null Locations
+         };
+         checkContainerDataCount(propertyDelegate, 3);
+         this.beaconData = propertyDelegate;
+@@ -69,6 +83,7 @@
  
      @Override
      public boolean stillValid(Player player) {
@@ -43,7 +56,7 @@
          return stillValid(this.access, player, Blocks.BEACON);
      }
  
-@@ -148,12 +157,30 @@
+@@ -148,12 +163,30 @@
          return BeaconMenu.decodeEffect(this.beaconData.get(2));
      }
  
@@ -76,7 +89,7 @@
          }
  
      }
-@@ -178,4 +205,17 @@
+@@ -178,4 +211,17 @@
              return 1;
          }
      }
diff --git a/paper-server/patches/sources/net/minecraft/world/inventory/MerchantContainer.java.patch b/paper-server/patches/sources/net/minecraft/world/inventory/MerchantContainer.java.patch
index 99b7708701..82bbe5e4c7 100644
--- a/paper-server/patches/sources/net/minecraft/world/inventory/MerchantContainer.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/inventory/MerchantContainer.java.patch
@@ -61,7 +61,7 @@
 +
 +    @Override
 +    public Location getLocation() {
-+        return (this.merchant instanceof Villager) ? ((Villager) this.merchant).getBukkitEntity().getLocation() : null;
++        return (this.merchant instanceof AbstractVillager) ? ((AbstractVillager) this.merchant).getBukkitEntity().getLocation() : null; // Paper - Fix inventories returning null Locations
 +    }
 +    // CraftBukkit end
 +