mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-30 16:19:03 +01:00
302 lines
16 KiB
Diff
302 lines
16 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Mon, 24 Jan 2022 00:09:02 -0800
|
|
Subject: [PATCH] Add missing InventoryHolders to inventories
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/Container.java b/src/main/java/net/minecraft/world/Container.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/Container.java
|
|
+++ b/src/main/java/net/minecraft/world/Container.java
|
|
@@ -0,0 +0,0 @@ public interface Container extends Clearable {
|
|
|
|
java.util.List<org.bukkit.entity.HumanEntity> getViewers();
|
|
|
|
- org.bukkit.inventory.InventoryHolder getOwner();
|
|
+ org.bukkit.inventory.@org.jetbrains.annotations.Nullable InventoryHolder getOwner(); // Paper - annotation
|
|
|
|
void setMaxStackSize(int size);
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/SimpleContainer.java b/src/main/java/net/minecraft/world/SimpleContainer.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/SimpleContainer.java
|
|
+++ b/src/main/java/net/minecraft/world/SimpleContainer.java
|
|
@@ -0,0 +0,0 @@ public class SimpleContainer implements Container, StackedContentsCompatible {
|
|
// CraftBukkit start - add fields and methods
|
|
public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
|
|
private int maxStack = MAX_STACK;
|
|
- protected org.bukkit.inventory.InventoryHolder bukkitOwner;
|
|
+ protected @Nullable org.bukkit.inventory.InventoryHolder bukkitOwner; // Paper - annotation
|
|
|
|
public List<ItemStack> getContents() {
|
|
return this.items;
|
|
@@ -0,0 +0,0 @@ public class SimpleContainer implements Container, StackedContentsCompatible {
|
|
}
|
|
|
|
public org.bukkit.inventory.InventoryHolder getOwner() {
|
|
+ // Paper start
|
|
+ if (this.bukkitOwner == null && this.bukkitOwnerCreator != null) {
|
|
+ this.bukkitOwner = this.bukkitOwnerCreator.get();
|
|
+ }
|
|
+ // Paper end
|
|
return this.bukkitOwner;
|
|
}
|
|
|
|
@@ -0,0 +0,0 @@ public class SimpleContainer implements Container, StackedContentsCompatible {
|
|
public SimpleContainer(int size) {
|
|
this(size, null);
|
|
}
|
|
+ // Paper start
|
|
+ private @Nullable java.util.function.Supplier<? extends org.bukkit.inventory.InventoryHolder> bukkitOwnerCreator;
|
|
+ public SimpleContainer(java.util.function.Supplier<? extends org.bukkit.inventory.InventoryHolder> bukkitOwnerCreator, int size) {
|
|
+ this(size);
|
|
+ this.bukkitOwnerCreator = bukkitOwnerCreator;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public SimpleContainer(int i, org.bukkit.inventory.InventoryHolder owner) {
|
|
this.bukkitOwner = owner;
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
@@ -0,0 +0,0 @@ public abstract class AbstractContainerMenu {
|
|
this.stateId = this.stateId + 1 & 32767;
|
|
return this.stateId;
|
|
}
|
|
+
|
|
+ // Paper start - add missing BlockInventoryHolder to inventories
|
|
+ // The reason this is a supplier, is that the createHolder method uses the bukkit InventoryView#getTopInventory to get the inventory in question
|
|
+ // and that can't be obtained safely until the AbstractContainerMenu has been fully constructed. Using a supplier lazily
|
|
+ // initializes the InventoryHolder safely.
|
|
+ protected final Supplier<org.bukkit.inventory.BlockInventoryHolder> createBlockHolder(final ContainerLevelAccess context) {
|
|
+ //noinspection ConstantValue
|
|
+ Preconditions.checkArgument(context != null, "context was null");
|
|
+ return () -> context.createBlockHolder(this);
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/BeaconMenu.java b/src/main/java/net/minecraft/world/inventory/BeaconMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/BeaconMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/BeaconMenu.java
|
|
@@ -0,0 +0,0 @@ public class BeaconMenu extends AbstractContainerMenu {
|
|
public BeaconMenu(int syncId, Container inventory, ContainerData propertyDelegate, ContainerLevelAccess context) {
|
|
super(MenuType.BEACON, syncId);
|
|
this.player = (Inventory) inventory; // CraftBukkit - TODO: check this
|
|
- this.beacon = new SimpleContainer(1) {
|
|
+ this.beacon = new SimpleContainer(this.createBlockHolder(context), 1) { // Paper
|
|
@Override
|
|
public boolean canPlaceItem(int slot, ItemStack stack) {
|
|
return stack.is(ItemTags.BEACON_PAYMENT_ITEMS);
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java b/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java
|
|
@@ -0,0 +0,0 @@ public class CartographyTableMenu extends AbstractContainerMenu {
|
|
|
|
public CartographyTableMenu(int syncId, Inventory inventory, final ContainerLevelAccess context) {
|
|
super(MenuType.CARTOGRAPHY_TABLE, syncId);
|
|
- this.container = new SimpleContainer(2) {
|
|
+ this.container = new SimpleContainer(this.createBlockHolder(context), 2) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
CartographyTableMenu.this.slotsChanged(this);
|
|
@@ -0,0 +0,0 @@ public class CartographyTableMenu extends AbstractContainerMenu {
|
|
}
|
|
// CraftBukkit end
|
|
};
|
|
- this.resultContainer = new ResultContainer() {
|
|
+ this.resultContainer = new ResultContainer(this.createBlockHolder(context)) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
CartographyTableMenu.this.slotsChanged(this);
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/ContainerLevelAccess.java b/src/main/java/net/minecraft/world/inventory/ContainerLevelAccess.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/ContainerLevelAccess.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/ContainerLevelAccess.java
|
|
@@ -0,0 +0,0 @@ public interface ContainerLevelAccess {
|
|
return new org.bukkit.Location(this.getWorld().getWorld(), this.getPosition().getX(), this.getPosition().getY(), this.getPosition().getZ());
|
|
}
|
|
// CraftBukkit end
|
|
+ // Paper start
|
|
+ default boolean isBlock() {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ default org.bukkit.inventory.@org.jetbrains.annotations.Nullable BlockInventoryHolder createBlockHolder(AbstractContainerMenu menu) {
|
|
+ if (!this.isBlock()) {
|
|
+ return null;
|
|
+ }
|
|
+ return new org.bukkit.craftbukkit.inventory.CraftBlockInventoryHolder(this, menu.getBukkitView().getTopInventory());
|
|
+ }
|
|
+ // Paper end
|
|
|
|
ContainerLevelAccess NULL = new ContainerLevelAccess() {
|
|
@Override
|
|
@@ -0,0 +0,0 @@ public interface ContainerLevelAccess {
|
|
return pos;
|
|
}
|
|
// CraftBukkit end
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public boolean isBlock() {
|
|
+ return true;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
@Override
|
|
public <T> Optional<T> evaluate(BiFunction<Level, BlockPos, T> getter) {
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
|
|
@@ -0,0 +0,0 @@ public class EnchantmentMenu extends AbstractContainerMenu {
|
|
|
|
public EnchantmentMenu(int syncId, Inventory playerInventory, ContainerLevelAccess context) {
|
|
super(MenuType.ENCHANTMENT, syncId);
|
|
- this.enchantSlots = new SimpleContainer(2) {
|
|
+ this.enchantSlots = new SimpleContainer(this.createBlockHolder(context), 2) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
super.setChanged();
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java
|
|
@@ -0,0 +0,0 @@ public class GrindstoneMenu extends AbstractContainerMenu {
|
|
|
|
public GrindstoneMenu(int syncId, Inventory playerInventory, final ContainerLevelAccess context) {
|
|
super(MenuType.GRINDSTONE, syncId);
|
|
- this.resultSlots = new ResultContainer();
|
|
- this.repairSlots = new SimpleContainer(2) {
|
|
+ this.resultSlots = new ResultContainer(this.createBlockHolder(context)); // Paper
|
|
+ this.repairSlots = new SimpleContainer(this.createBlockHolder(context), 2) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
super.setChanged();
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java
|
|
@@ -0,0 +0,0 @@ public abstract class ItemCombinerMenu extends AbstractContainerMenu {
|
|
protected final Player player;
|
|
protected final Container inputSlots;
|
|
private final List<Integer> inputSlotIndexes;
|
|
- protected final ResultContainer resultSlots = new ResultContainer();
|
|
+ protected final ResultContainer resultSlots; // Paper - delay field init
|
|
private final int resultSlotIndex;
|
|
|
|
protected abstract boolean mayPickup(Player player, boolean present);
|
|
@@ -0,0 +0,0 @@ public abstract class ItemCombinerMenu extends AbstractContainerMenu {
|
|
public ItemCombinerMenu(@Nullable MenuType<?> type, int syncId, Inventory playerInventory, ContainerLevelAccess context) {
|
|
super(type, syncId);
|
|
this.access = context;
|
|
+ this.resultSlots = new ResultContainer(this.createBlockHolder(this.access)); // Paper - delay field init
|
|
this.player = playerInventory.player;
|
|
ItemCombinerMenuSlotDefinition itemcombinermenuslotdefinition = this.createInputSlotDefinitions();
|
|
|
|
@@ -0,0 +0,0 @@ public abstract class ItemCombinerMenu extends AbstractContainerMenu {
|
|
protected abstract ItemCombinerMenuSlotDefinition createInputSlotDefinitions();
|
|
|
|
private SimpleContainer createContainer(int size) {
|
|
- return new SimpleContainer(size) {
|
|
+ return new SimpleContainer(this.createBlockHolder(this.access), size) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
super.setChanged();
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/LoomMenu.java b/src/main/java/net/minecraft/world/inventory/LoomMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/LoomMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/LoomMenu.java
|
|
@@ -0,0 +0,0 @@ public class LoomMenu extends AbstractContainerMenu {
|
|
this.selectablePatterns = List.of();
|
|
this.slotUpdateListener = () -> {
|
|
};
|
|
- this.inputContainer = new SimpleContainer(3) {
|
|
+ this.inputContainer = new SimpleContainer(this.createBlockHolder(context), 3) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
super.setChanged();
|
|
@@ -0,0 +0,0 @@ public class LoomMenu extends AbstractContainerMenu {
|
|
}
|
|
// CraftBukkit end
|
|
};
|
|
- this.outputContainer = new SimpleContainer(1) {
|
|
+ this.outputContainer = new SimpleContainer(this.createBlockHolder(context), 1) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
super.setChanged();
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/ResultContainer.java b/src/main/java/net/minecraft/world/inventory/ResultContainer.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/ResultContainer.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/ResultContainer.java
|
|
@@ -0,0 +0,0 @@ public class ResultContainer implements Container, RecipeCraftingHolder {
|
|
}
|
|
|
|
public org.bukkit.inventory.InventoryHolder getOwner() {
|
|
- return null; // Result slots don't get an owner
|
|
+ // Paper start
|
|
+ if (this.holder == null && this.holderCreator != null) {
|
|
+ this.holder = this.holderCreator.get();
|
|
+ }
|
|
+ return this.holder; // Result slots don't get an owner
|
|
+ // Paper end - yes they do
|
|
}
|
|
|
|
// Don't need a transaction; the InventoryCrafting keeps track of it for us
|
|
@@ -0,0 +0,0 @@ public class ResultContainer implements Container, RecipeCraftingHolder {
|
|
return null;
|
|
}
|
|
// CraftBukkit end
|
|
+ // Paper start
|
|
+ private @Nullable java.util.function.Supplier<? extends org.bukkit.inventory.InventoryHolder> holderCreator;
|
|
+ private @Nullable org.bukkit.inventory.InventoryHolder holder;
|
|
+ public ResultContainer(java.util.function.Supplier<? extends org.bukkit.inventory.InventoryHolder> holderCreator) {
|
|
+ this();
|
|
+ this.holderCreator = holderCreator;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public ResultContainer() {
|
|
this.itemStacks = NonNullList.withSize(1, ItemStack.EMPTY);
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java b/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java
|
|
@@ -0,0 +0,0 @@ public class StonecutterMenu extends AbstractContainerMenu {
|
|
this.input = ItemStack.EMPTY;
|
|
this.slotUpdateListener = () -> {
|
|
};
|
|
- this.container = new SimpleContainer(1) {
|
|
+ this.container = new SimpleContainer(this.createBlockHolder(context), 1) { // Paper
|
|
@Override
|
|
public void setChanged() {
|
|
super.setChanged();
|
|
@@ -0,0 +0,0 @@ public class StonecutterMenu extends AbstractContainerMenu {
|
|
}
|
|
// CraftBukkit end
|
|
};
|
|
- this.resultContainer = new ResultContainer();
|
|
+ this.resultContainer = new ResultContainer(this.createBlockHolder(context)); // Paper
|
|
this.access = context;
|
|
this.level = playerInventory.player.level();
|
|
this.inputSlot = this.addSlot(new Slot(this.container, 0, 20, 33));
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlockInventoryHolder.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlockInventoryHolder.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlockInventoryHolder.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlockInventoryHolder.java
|
|
@@ -0,0 +0,0 @@ public class CraftBlockInventoryHolder implements BlockInventoryHolder {
|
|
this.block = CraftBlock.at(world, pos);
|
|
this.inventory = new CraftInventory(inv);
|
|
}
|
|
+ // Paper start
|
|
+ public CraftBlockInventoryHolder(net.minecraft.world.inventory.ContainerLevelAccess levelAccess, Inventory inventory) {
|
|
+ com.google.common.base.Preconditions.checkArgument(levelAccess.isBlock());
|
|
+ this.block = CraftBlock.at(levelAccess.getWorld(), levelAccess.getPosition());
|
|
+ this.inventory = inventory;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
@Override
|
|
public Block getBlock() {
|