SPIGOT-3981: Make custom inventories return specialised types where practical.

By: Senmori <thesenmori@gmail.com>
This commit is contained in:
Bukkit/Spigot 2018-07-25 18:03:20 +10:00
parent 193950a668
commit 1965b05b87
3 changed files with 93 additions and 8 deletions

View file

@ -861,13 +861,27 @@ public final class Bukkit {
}
/**
* Creates an empty inventory of the specified type. If the type is {@link
* InventoryType#CHEST}, the new inventory has a size of 27; otherwise the
* new inventory has the normal size for its type.
* Creates an empty inventory with the specified type and title. If the type
* is {@link InventoryType#CHEST}, the new inventory has a size of 27;
* otherwise the new inventory has the normal size for its type.<br>
* It should be noted that some inventory types do not support titles and
* may not render with said titles on the Minecraft client.
* <br>
* {@link InventoryType#WORKBENCH} will not process crafting recipes if
* created with this method. Use
* {@link Player#openWorkbench(Location, boolean)} instead.
* <br>
* {@link InventoryType#ENCHANTING} will not process {@link ItemStack}s
* for possible enchanting results. Use
* {@link Player#openEnchanting(Location, boolean)} instead.
*
* @param owner the holder of the inventory, or null to indicate no holder
* @param type the type of inventory to create
* @return a new inventory
* @throws IllegalArgumentException if the {@link InventoryType} cannot be
* viewed.
*
* @see InventoryType#isCreatable()
*/
public static Inventory createInventory(InventoryHolder owner, InventoryType type) {
return server.createInventory(owner, type);
@ -879,11 +893,23 @@ public final class Bukkit {
* otherwise the new inventory has the normal size for its type.<br>
* It should be noted that some inventory types do not support titles and
* may not render with said titles on the Minecraft client.
* <br>
* {@link InventoryType#WORKBENCH} will not process crafting recipes if
* created with this method. Use
* {@link Player#openWorkbench(Location, boolean)} instead.
* <br>
* {@link InventoryType#ENCHANTING} will not process {@link ItemStack}s
* for possible enchanting results. Use
* {@link Player#openEnchanting(Location, boolean)} instead.
*
* @param owner The holder of the inventory; can be null if there's no holder.
* @param type The type of inventory to create.
* @param title The title of the inventory, to be displayed when it is viewed.
* @return The new inventory.
* @throws IllegalArgumentException if the {@link InventoryType} cannot be
* viewed.
*
* @see InventoryType#isCreatable()
*/
public static Inventory createInventory(InventoryHolder owner, InventoryType type, String title) {
return server.createInventory(owner, type, title);

View file

@ -701,13 +701,27 @@ public interface Server extends PluginMessageRecipient {
public HelpMap getHelpMap();
/**
* Creates an empty inventory of the specified type. If the type is {@link
* InventoryType#CHEST}, the new inventory has a size of 27; otherwise the
* new inventory has the normal size for its type.
* Creates an empty inventory with the specified type and title. If the type
* is {@link InventoryType#CHEST}, the new inventory has a size of 27;
* otherwise the new inventory has the normal size for its type.<br>
* It should be noted that some inventory types do not support titles and
* may not render with said titles on the Minecraft client.
* <br>
* {@link InventoryType#WORKBENCH} will not process crafting recipes if
* created with this method. Use
* {@link Player#openWorkbench(Location, boolean)} instead.
* <br>
* {@link InventoryType#ENCHANTING} will not process {@link ItemStack}s
* for possible enchanting results. Use
* {@link Player#openEnchanting(Location, boolean)} instead.
*
* @param owner the holder of the inventory, or null to indicate no holder
* @param type the type of inventory to create
* @return a new inventory
* @throws IllegalArgumentException if the {@link InventoryType} cannot be
* viewed.
*
* @see InventoryType#isCreatable()
*/
Inventory createInventory(InventoryHolder owner, InventoryType type);
@ -717,11 +731,23 @@ public interface Server extends PluginMessageRecipient {
* otherwise the new inventory has the normal size for its type.<br>
* It should be noted that some inventory types do not support titles and
* may not render with said titles on the Minecraft client.
* <br>
* {@link InventoryType#WORKBENCH} will not process crafting recipes if
* created with this method. Use
* {@link Player#openWorkbench(Location, boolean)} instead.
* <br>
* {@link InventoryType#ENCHANTING} will not process {@link ItemStack}s
* for possible enchanting results. Use
* {@link Player#openEnchanting(Location, boolean)} instead.
*
* @param owner The holder of the inventory; can be null if there's no holder.
* @param type The type of inventory to create.
* @param title The title of the inventory, to be displayed when it is viewed.
* @return The new inventory.
* @throws IllegalArgumentException if the {@link InventoryType} cannot be
* viewed.
*
* @see InventoryType#isCreatable()
*/
Inventory createInventory(InventoryHolder owner, InventoryType type, String title);

View file

@ -1,5 +1,22 @@
package org.bukkit.event.inventory;
import org.bukkit.inventory.InventoryHolder;
/**
* Represents the different kinds of inventories available in Bukkit.
* <br>
* Only InventoryTypes marked {@link #isCreatable()} can be created.
* <br>
* The current list of inventories that cannot be created via
* {@link org.bukkit.Bukkit#createInventory} are:<br>
* <blockquote>
* {@link InventoryType#CREATIVE} and {@link InventoryType#CRAFTING}
* </blockquote>
*
* See {@link org.bukkit.Bukkit#createInventory} for more information.
*
* @see org.bukkit.Bukkit#createInventory(InventoryHolder, InventoryType)
*/
public enum InventoryType {
/**
@ -28,7 +45,7 @@ public enum InventoryType {
* A player's crafting inventory, with 4 CRAFTING slots and a RESULT slot.
* Also implies that the 4 ARMOR slots are accessible.
*/
CRAFTING(5,"Crafting"),
CRAFTING(5,"Crafting", false),
/**
* An enchantment table inventory, with two CRAFTING slots and three
* enchanting buttons.
@ -49,7 +66,7 @@ public enum InventoryType {
* else. (The actual creative interface with the items is client-side and
* cannot be altered by the server.)
*/
CREATIVE(9,"Creative"),
CREATIVE(9,"Creative", false),
/**
* The merchant inventory, with 2 TRADE-IN slots, and 1 RESULT slot.
*/
@ -78,10 +95,16 @@ public enum InventoryType {
private final int size;
private final String title;
private final boolean isCreatable;
private InventoryType(int defaultSize, String defaultTitle) {
this(defaultSize, defaultTitle, true);
}
private InventoryType(int defaultSize, String defaultTitle, boolean isCreatable) {
size = defaultSize;
title = defaultTitle;
this.isCreatable = isCreatable;
}
public int getDefaultSize() {
@ -92,6 +115,16 @@ public enum InventoryType {
return title;
}
/**
* Denotes that this InventoryType can be created via the normal
* {@link org.bukkit.Bukkit#createInventory} methods.
*
* @return if this InventoryType can be created and shown to a player
*/
public boolean isCreatable() {
return isCreatable;
}
public enum SlotType {
/**
* A result slot in a furnace or crafting inventory.