diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java index e63222ab9bb..9a0a0f0ca87 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java @@ -13,8 +13,10 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Server; +import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.RecipeChoice; @@ -158,7 +160,13 @@ public void shapedRecipe(final CommandSource sender, final ShapedRecipe recipe, final User user = ess.getUser(sender.getPlayer()); user.getBase().closeInventory(); user.setRecipeSee(true); - final InventoryView view = user.getBase().openWorkbench(null, true); + final InventoryView view = openWorkbench(user); + if (view == null) { + user.setRecipeSee(false); + return; + } + final Inventory topInventory = ess.provider(InventoryViewProvider.class).getTopInventory(view); + final String[] recipeShape = recipe.getShape(); final Map ingredientMap = recipe.getIngredientMap(); for (int j = 0; j < recipeShape.length; j++) { @@ -170,7 +178,7 @@ public void shapedRecipe(final CommandSource sender, final ShapedRecipe recipe, if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) { item.setDurability((short) 0); } - ess.provider(InventoryViewProvider.class).getTopInventory(view).setItem(j * 3 + k + 1, item); + topInventory.setItem(j * 3 + k + 1, item); } } } else { @@ -217,7 +225,11 @@ public void shapelessRecipe(final CommandSource sender, final ShapelessRecipe re final User user = ess.getUser(sender.getPlayer()); user.getBase().closeInventory(); user.setRecipeSee(true); - final InventoryView view = user.getBase().openWorkbench(null, true); + final InventoryView view = openWorkbench(user); + if (view == null) { + user.setRecipeSee(false); + return; + } for (int i = 0; i < ingredients.size(); i++) { final ItemStack item = ingredients.get(i); if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) { @@ -239,6 +251,17 @@ public void shapelessRecipe(final CommandSource sender, final ShapelessRecipe re } } + private InventoryView openWorkbench(final User user) { + final InventoryView view = user.getBase().openWorkbench(null, true); + // If InventoryOpenEvent is canceled, the items can end up in the player's own crafting grid + // which allows players to extract counterfeit items. + if (view == null) + return null; + + final Inventory inventory = ess.provider(InventoryViewProvider.class).getTopInventory(view); + return inventory.getType() == InventoryType.WORKBENCH ? view : null; + } + public String getMaterialName(final CommandSource sender, final ItemStack stack) { if (stack == null) { return sender.tl("recipeNothing");