aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0263-Restore-custom-InventoryHolder-support.patch
diff options
context:
space:
mode:
authorNewwind <[email protected]>2024-08-31 19:29:50 +0100
committerGitHub <[email protected]>2024-08-31 20:29:50 +0200
commit509ea2fd17fa03ce04f86046098607733b8767ba (patch)
tree3f7c9a29481fafbb6ad9f846839ec8f4863d2363 /patches/server/0263-Restore-custom-InventoryHolder-support.patch
parente01ddf46279fbb68d157749a906b7a2ecc60da1a (diff)
downloadPaper-509ea2fd17fa03ce04f86046098607733b8767ba.tar.gz
Paper-509ea2fd17fa03ce04f86046098607733b8767ba.zip
Fix horse armor desync (#11341)
Diffstat (limited to 'patches/server/0263-Restore-custom-InventoryHolder-support.patch')
-rw-r--r--patches/server/0263-Restore-custom-InventoryHolder-support.patch358
1 files changed, 358 insertions, 0 deletions
diff --git a/patches/server/0263-Restore-custom-InventoryHolder-support.patch b/patches/server/0263-Restore-custom-InventoryHolder-support.patch
new file mode 100644
index 0000000000..4fa1d8fac1
--- /dev/null
+++ b/patches/server/0263-Restore-custom-InventoryHolder-support.patch
@@ -0,0 +1,358 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Mon, 5 Nov 2018 04:23:51 +0000
+Subject: [PATCH] Restore custom InventoryHolder support
+
+Upstream removed the ability to consistently use a custom InventoryHolder,
+However, the implementation does not use an InventoryHolder in any form
+outside of custom inventories.
+
+== AT ==
+public-f net.minecraft.world.inventory.AbstractContainerMenu dataSlots
+public-f net.minecraft.world.inventory.AbstractContainerMenu remoteDataSlots
+
+Co-authored-by: Shane Freeder <[email protected]>
+
+diff --git a/src/main/java/io/papermc/paper/inventory/PaperInventoryCustomHolderContainer.java b/src/main/java/io/papermc/paper/inventory/PaperInventoryCustomHolderContainer.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..224d4b2cc45b0d02230a76caee9c88573a448b4c
+--- /dev/null
++++ b/src/main/java/io/papermc/paper/inventory/PaperInventoryCustomHolderContainer.java
+@@ -0,0 +1,141 @@
++package io.papermc.paper.inventory;
++
++import io.papermc.paper.adventure.PaperAdventure;
++import net.kyori.adventure.text.Component;
++import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
++import net.minecraft.world.Container;
++import net.minecraft.world.entity.player.Player;
++import net.minecraft.world.item.ItemStack;
++import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
++import org.bukkit.Location;
++import org.bukkit.craftbukkit.entity.CraftHumanEntity;
++import org.bukkit.entity.HumanEntity;
++import org.bukkit.event.inventory.InventoryType;
++import org.bukkit.inventory.InventoryHolder;
++import org.checkerframework.checker.nullness.qual.NonNull;
++import org.checkerframework.checker.nullness.qual.Nullable;
++import org.checkerframework.framework.qual.DefaultQualifier;
++
++import java.util.List;
++
++@DefaultQualifier(NonNull.class)
++public final class PaperInventoryCustomHolderContainer implements Container {
++
++ private final InventoryHolder owner;
++ private final Container delegate;
++ private final InventoryType type;
++ private final String title;
++ private final Component adventure$title;
++
++ public PaperInventoryCustomHolderContainer(InventoryHolder owner, Container delegate, InventoryType type) {
++ this.owner = owner;
++ this.delegate = delegate;
++ this.type = type;
++ @Nullable Component adventure$title = null;
++ if (delegate instanceof BaseContainerBlockEntity blockEntity) {
++ adventure$title = blockEntity.getCustomName() != null ? PaperAdventure.asAdventure(blockEntity.getCustomName()) : null;
++ }
++ if (adventure$title == null) {
++ adventure$title = type.defaultTitle();
++ }
++ this.adventure$title = adventure$title;
++ this.title = LegacyComponentSerializer.legacySection().serialize(this.adventure$title);
++ }
++
++ public Component title() {
++ return this.adventure$title;
++ }
++
++ public String getTitle() {
++ return this.title;
++ }
++
++ public InventoryType getType() {
++ return this.type;
++ }
++
++ @Override
++ public int getContainerSize() {
++ return this.delegate.getContainerSize();
++ }
++
++ @Override
++ public boolean isEmpty() {
++ return this.delegate.isEmpty();
++ }
++
++ @Override
++ public ItemStack getItem(int slot) {
++ return this.delegate.getItem(slot);
++ }
++
++ @Override
++ public ItemStack removeItem(int slot, int amount) {
++ return this.delegate.removeItem(slot, amount);
++ }
++
++ @Override
++ public ItemStack removeItemNoUpdate(int slot) {
++ return this.delegate.removeItemNoUpdate(slot);
++ }
++
++ @Override
++ public void setItem(int slot, ItemStack stack) {
++ this.delegate.setItem(slot, stack);
++ }
++
++ @Override
++ public int getMaxStackSize() {
++ return this.delegate.getMaxStackSize();
++ }
++
++ @Override
++ public void setChanged() {
++ this.delegate.setChanged();
++ }
++
++ @Override
++ public boolean stillValid(Player player) {
++ return this.delegate.stillValid(player);
++ }
++
++ @Override
++ public List<ItemStack> getContents() {
++ return this.delegate.getContents();
++ }
++
++ @Override
++ public void onOpen(CraftHumanEntity who) {
++ this.delegate.onOpen(who);
++ }
++
++ @Override
++ public void onClose(CraftHumanEntity who) {
++ this.delegate.onClose(who);
++ }
++
++ @Override
++ public List<HumanEntity> getViewers() {
++ return this.delegate.getViewers();
++ }
++
++ @Override
++ public InventoryHolder getOwner() {
++ return this.owner;
++ }
++
++ @Override
++ public void setMaxStackSize(int size) {
++ this.delegate.setMaxStackSize(size);
++ }
++
++ @Override
++ public Location getLocation() {
++ return this.delegate.getLocation();
++ }
++
++ @Override
++ public void clearContent() {
++ this.delegate.clearContent();
++ }
++}
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
+index 867091ff253541ec45b6ae7f1fb3acc83a5c4966..10a5b1853d3984427209c87bdec1d471dddb1244 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
+@@ -49,7 +49,7 @@ public class CraftContainer extends AbstractContainerMenu {
+ public CraftContainer(final Inventory inventory, final Player player, int id) {
+ this(new CraftAbstractInventoryView() {
+
+- private final String originalTitle = (inventory instanceof CraftInventoryCustom) ? ((CraftInventoryCustom.MinecraftInventory) ((CraftInventory) inventory).getInventory()).getTitle() : inventory.getType().getDefaultTitle();
++ private final String originalTitle = inventory instanceof CraftInventoryCustom ? ((CraftInventoryCustom) inventory).getTitle() : inventory.getType().getDefaultTitle(); // Paper
+ private String title = this.originalTitle;
+
+ @Override
+@@ -75,7 +75,7 @@ public class CraftContainer extends AbstractContainerMenu {
+ // Paper start
+ @Override
+ public net.kyori.adventure.text.Component title() {
+- return inventory instanceof CraftInventoryCustom ? ((CraftInventoryCustom.MinecraftInventory) ((CraftInventory) inventory).getInventory()).title() : net.kyori.adventure.text.Component.text(inventory.getType().getDefaultTitle());
++ return inventory instanceof CraftInventoryCustom custom ? custom.title() : inventory.getType().defaultTitle(); // Paper
+ }
+ // Paper end
+
+@@ -252,6 +252,10 @@ public class CraftContainer extends AbstractContainerMenu {
+ this.lastSlots = this.delegate.lastSlots;
+ this.slots = this.delegate.slots;
+ this.remoteSlots = this.delegate.remoteSlots;
++ // Paper start - copy data slots for InventoryView#set/getProperty
++ this.dataSlots = this.delegate.dataSlots;
++ this.remoteDataSlots = this.delegate.remoteDataSlots;
++ // Paper end
+ }
+
+ // SPIGOT-4598 - we should still delegate the shift click handler
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
+index 6a47c6adb721f0c6737150d8b0ee18ab70f5f281..75eb794f796b31c0c5ef80a6d27a56711a522f5e 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
+@@ -497,6 +497,10 @@ public class CraftInventory implements Inventory {
+ return InventoryType.BREWING;
+ } else if (this.inventory instanceof CraftInventoryCustom.MinecraftInventory) {
+ return ((CraftInventoryCustom.MinecraftInventory) this.inventory).getType();
++ // Paper start
++ } else if (this.inventory instanceof io.papermc.paper.inventory.PaperInventoryCustomHolderContainer holderContainer) {
++ return holderContainer.getType();
++ // Paper end
+ } else if (this.inventory instanceof PlayerEnderChestContainer) {
+ return InventoryType.ENDER_CHEST;
+ } else if (this.inventory instanceof MerchantContainer) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
+index fc0e1212022d1aa3506699b60ef338196eb54eba..da1c1fe0faf6819b15a81d6ad53370948e5f984f 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
+@@ -15,6 +15,11 @@ import org.bukkit.event.inventory.InventoryType;
+ import org.bukkit.inventory.InventoryHolder;
+
+ public class CraftInventoryCustom extends CraftInventory {
++ // Paper start
++ public CraftInventoryCustom(InventoryHolder owner, InventoryType type, Container delegate) {
++ super(new io.papermc.paper.inventory.PaperInventoryCustomHolderContainer(owner, delegate, type));
++ }
++ // Paper end
+ public CraftInventoryCustom(InventoryHolder owner, InventoryType type) {
+ super(new MinecraftInventory(owner, type));
+ }
+@@ -42,6 +47,27 @@ public class CraftInventoryCustom extends CraftInventory {
+ public CraftInventoryCustom(InventoryHolder owner, int size, String title) {
+ super(new MinecraftInventory(owner, size, title));
+ }
++ // Paper start
++ public String getTitle() {
++ if (this.inventory instanceof MinecraftInventory minecraftInventory) {
++ return minecraftInventory.getTitle();
++ } else if (this.inventory instanceof io.papermc.paper.inventory.PaperInventoryCustomHolderContainer customHolderContainer) {
++ return customHolderContainer.getTitle();
++ } else {
++ throw new UnsupportedOperationException(this.inventory.getClass() + " isn't a recognized Container type here");
++ }
++ }
++
++ public net.kyori.adventure.text.Component title() {
++ if (this.inventory instanceof MinecraftInventory minecraftInventory) {
++ return minecraftInventory.title();
++ } else if (this.inventory instanceof io.papermc.paper.inventory.PaperInventoryCustomHolderContainer customHolderContainer) {
++ return customHolderContainer.title();
++ } else {
++ throw new UnsupportedOperationException(this.inventory.getClass() + " isn't a recognized Container type here");
++ }
++ }
++ // Paper end
+
+ static class MinecraftInventory implements Container {
+ private final NonNullList<ItemStack> items;
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java b/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java
+index 7bc082d08a3d577481046818f0d58133413fc723..a6c758c5c5da2fb3f2d251bc109f72a5d8b0eb14 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java
+@@ -28,7 +28,7 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
+
+ @Override
+ public Inventory createInventory(InventoryHolder holder, InventoryType type) {
+- return this.getInventory(this.getTileEntity());
++ return this.getInventory(holder, type, this.getTileEntity()); // Paper
+ }
+
+ // Paper start
+@@ -39,7 +39,7 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
+ ((RandomizableContainerBlockEntity) te).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title);
+ }
+
+- return getInventory(te);
++ return this.getInventory(owner, type, te); // Paper
+ }
+ // Paper end
+
+@@ -50,10 +50,18 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
+ ((RandomizableContainerBlockEntity) te).name = CraftChatMessage.fromStringOrNull(title);
+ }
+
+- return this.getInventory(te);
++ return this.getInventory(holder, type, te); // Paper
+ }
+
++ @Deprecated // Paper - use getInventory with owner and type
+ public Inventory getInventory(Container tileEntity) {
++ // Paper start
++ return this.getInventory(null, null, tileEntity);
++ }
++
++ public Inventory getInventory(InventoryHolder owner, InventoryType type, Container tileEntity) { // Paper
++ if (owner != null) return new org.bukkit.craftbukkit.inventory.CraftInventoryCustom(owner, type, tileEntity); // Paper
++ // Paper end
+ return new CraftInventory(tileEntity);
+ }
+
+@@ -69,8 +77,8 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
+ @Override
+ public Inventory createInventory(InventoryHolder owner, InventoryType type, net.kyori.adventure.text.Component title) {
+ Container tileEntity = getTileEntity();
+- ((AbstractFurnaceBlockEntity) tileEntity).setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(title));
+- return getInventory(tileEntity);
++ ((AbstractFurnaceBlockEntity) tileEntity).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title);
++ return this.getInventory(owner, type, tileEntity); // Paper
+ }
+ // Paper end
+
+@@ -78,11 +86,19 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
+ public Inventory createInventory(InventoryHolder owner, InventoryType type, String title) {
+ Container tileEntity = this.getTileEntity();
+ ((AbstractFurnaceBlockEntity) tileEntity).name = CraftChatMessage.fromStringOrNull(title);
+- return this.getInventory(tileEntity);
++ return this.getInventory(owner, type, tileEntity); // Paper
+ }
+
+ @Override
+ public Inventory getInventory(Container tileEntity) {
++ // Paper start
++ return getInventory(null, null, tileEntity);
++ }
++
++ @Override
++ public Inventory getInventory(InventoryHolder owner, InventoryType type, net.minecraft.world.Container tileEntity) { // Paper
++ if (owner != null) return new org.bukkit.craftbukkit.inventory.CraftInventoryCustom(owner, type, tileEntity); // Paper
++ // Paper end
+ return new CraftInventoryFurnace((AbstractFurnaceBlockEntity) tileEntity);
+ }
+ }
+@@ -102,7 +118,7 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
+ if (tileEntity instanceof BrewingStandBlockEntity) {
+ ((BrewingStandBlockEntity) tileEntity).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title);
+ }
+- return getInventory(tileEntity);
++ return this.getInventory(owner, type, tileEntity); // Paper
+ }
+ // Paper end
+
+@@ -113,11 +129,19 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
+ if (tileEntity instanceof BrewingStandBlockEntity) {
+ ((BrewingStandBlockEntity) tileEntity).name = CraftChatMessage.fromStringOrNull(title);
+ }
+- return this.getInventory(tileEntity);
++ return this.getInventory(holder, type, tileEntity); // Paper
+ }
+
+ @Override
+ public Inventory getInventory(Container tileEntity) {
++ // Paper start
++ return getInventory(null, null, tileEntity);
++ }
++
++ @Override
++ public Inventory getInventory(InventoryHolder owner, InventoryType type, net.minecraft.world.Container tileEntity) { // Paper
++ if (owner != null) return new org.bukkit.craftbukkit.inventory.CraftInventoryCustom(owner, type, tileEntity); // Paper
++ // Paper end
+ return new CraftInventoryBrewer(tileEntity);
+ }
+ }