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 <theboyetronic@gmail.com>
This commit is contained in:
Jake Potrebic
2018-11-05 04:23:51 +00:00
parent 1d1ddeccb9
commit 2bbc6d09df
5 changed files with 209 additions and 10 deletions

View File

@@ -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
@@ -214,6 +214,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

View File

@@ -485,6 +485,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) {

View File

@@ -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;

View File

@@ -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);
}
}