AutoCrafting now respects PrepareItemCraftEvent

This commit is contained in:
James Peters 2020-12-31 15:21:11 +00:00
parent e5ce682ae9
commit f6c07e8db1
19 changed files with 476 additions and 46 deletions

View File

@ -15,7 +15,7 @@ public class Api {
return plugin;
}
public static NMSProvider getNMSProvider() {
public static NMSProvider setupNMSProvider() {
String packageName = NMSProvider.class.getPackage().getName();
String nmsVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
String nmsProvider = packageName + "." + nmsVersion + ".NMSProviderImpl";

View File

@ -6,6 +6,7 @@ public interface NMSProvider {
ChestOpener getChestOpener();
MaterialChecker getMaterialChecker();
CraftingProvider getCraftingProvider();
NPCProvider getNPCProvider();
void setItemFrameVisible(ItemFrame itemFrame, boolean visible);
}

View File

@ -0,0 +1,7 @@
package com.jamesdpeters.minecraft.chests;
import org.bukkit.entity.HumanEntity;
public interface NPCProvider {
HumanEntity createHumanEntity();
}

View File

@ -1,9 +1,6 @@
package com.jamesdpeters.minecraft.chests.v1_14_R1;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.*;
import org.bukkit.entity.ItemFrame;
public class NMSProviderImpl implements NMSProvider {
@ -22,6 +19,11 @@ public class NMSProviderImpl implements NMSProvider {
return new Crafting();
}
@Override
public NPCProvider getNPCProvider() {
return new NPC();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
//Not support in 1.14

View File

@ -0,0 +1,24 @@
package com.jamesdpeters.minecraft.chests.v1_14_R1;
import com.jamesdpeters.minecraft.chests.NPCProvider;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_14_R1.EntityPlayer;
import net.minecraft.server.v1_14_R1.MinecraftServer;
import net.minecraft.server.v1_14_R1.PlayerInteractManager;
import net.minecraft.server.v1_14_R1.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_14_R1.CraftServer;
import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
import org.bukkit.entity.HumanEntity;
import java.util.UUID;
public class NPC implements NPCProvider {
public HumanEntity createHumanEntity() {
MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer();
WorldServer nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "Chests++NPC");
EntityPlayer npc = new EntityPlayer(nmsServer, nmsWorld, gameProfile, new PlayerInteractManager(nmsWorld));
return npc.getBukkitEntity();
}
}

View File

@ -1,9 +1,6 @@
package com.jamesdpeters.minecraft.chests.v1_15_R1;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.*;
import org.bukkit.entity.ItemFrame;
public class NMSProviderImpl implements NMSProvider {
@ -22,6 +19,11 @@ public class NMSProviderImpl implements NMSProvider {
return new Crafting();
}
@Override
public NPCProvider getNPCProvider() {
return new NPC();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
//Not supported in 1.15

View File

@ -0,0 +1,24 @@
package com.jamesdpeters.minecraft.chests.v1_15_R1;
import com.jamesdpeters.minecraft.chests.NPCProvider;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_15_R1.EntityPlayer;
import net.minecraft.server.v1_15_R1.MinecraftServer;
import net.minecraft.server.v1_15_R1.PlayerInteractManager;
import net.minecraft.server.v1_15_R1.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_15_R1.CraftServer;
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
import org.bukkit.entity.HumanEntity;
import java.util.UUID;
public class NPC implements NPCProvider {
public HumanEntity createHumanEntity() {
MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer();
WorldServer nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "Chests++NPC");
EntityPlayer npc = new EntityPlayer(nmsServer, nmsWorld, gameProfile, new PlayerInteractManager(nmsWorld));
return npc.getBukkitEntity();
}
}

View File

@ -1,9 +1,7 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.*;
import com.jamesdpeters.minecraft.chests.v1_14_R1.NPC;
import org.bukkit.block.Lidded;
import org.bukkit.entity.ItemFrame;
@ -35,6 +33,11 @@ public class NMSProviderImpl implements NMSProvider {
return new Crafting();
}
@Override
public NPCProvider getNPCProvider() {
return new NPC();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
itemFrame.setVisible(visible);

View File

@ -0,0 +1,24 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1;
import com.jamesdpeters.minecraft.chests.NPCProvider;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_16_R1.EntityPlayer;
import net.minecraft.server.v1_16_R1.MinecraftServer;
import net.minecraft.server.v1_16_R1.PlayerInteractManager;
import net.minecraft.server.v1_16_R1.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
import org.bukkit.craftbukkit.v1_16_R1.CraftWorld;
import org.bukkit.entity.HumanEntity;
import java.util.UUID;
public class NPC implements NPCProvider {
public HumanEntity createHumanEntity() {
MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer();
WorldServer nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "Chests++NPC");
EntityPlayer npc = new EntityPlayer(nmsServer, nmsWorld, gameProfile, new PlayerInteractManager(nmsWorld));
return npc.getBukkitEntity();
}
}

View File

@ -1,9 +1,7 @@
package com.jamesdpeters.minecraft.chests.v1_16_R2;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.*;
import com.jamesdpeters.minecraft.chests.v1_15_R1.NPC;
import org.bukkit.block.Lidded;
import org.bukkit.entity.ItemFrame;
@ -35,6 +33,11 @@ public class NMSProviderImpl implements NMSProvider {
return new Crafting();
}
@Override
public NPCProvider getNPCProvider() {
return new NPC();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
itemFrame.setVisible(visible);

View File

@ -0,0 +1,24 @@
package com.jamesdpeters.minecraft.chests.v1_16_R2;
import com.jamesdpeters.minecraft.chests.NPCProvider;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_16_R2.EntityPlayer;
import net.minecraft.server.v1_16_R2.MinecraftServer;
import net.minecraft.server.v1_16_R2.PlayerInteractManager;
import net.minecraft.server.v1_16_R2.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
import org.bukkit.craftbukkit.v1_16_R2.CraftWorld;
import org.bukkit.entity.HumanEntity;
import java.util.UUID;
public class NPC implements NPCProvider {
public HumanEntity createHumanEntity() {
MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer();
WorldServer nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "Chests++NPC");
EntityPlayer npc = new EntityPlayer(nmsServer, nmsWorld, gameProfile, new PlayerInteractManager(nmsWorld));
return npc.getBukkitEntity();
}
}

View File

@ -1,9 +1,6 @@
package com.jamesdpeters.minecraft.chests.v1_16_R3;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.*;
import org.bukkit.block.Lidded;
import org.bukkit.entity.ItemFrame;
@ -35,6 +32,11 @@ public class NMSProviderImpl implements NMSProvider {
return new Crafting();
}
@Override
public NPCProvider getNPCProvider() {
return new NPC();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
itemFrame.setVisible(visible);

View File

@ -0,0 +1,24 @@
package com.jamesdpeters.minecraft.chests.v1_16_R3;
import com.jamesdpeters.minecraft.chests.NPCProvider;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_16_R3.EntityPlayer;
import net.minecraft.server.v1_16_R3.MinecraftServer;
import net.minecraft.server.v1_16_R3.PlayerInteractManager;
import net.minecraft.server.v1_16_R3.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
import org.bukkit.craftbukkit.v1_16_R3.CraftWorld;
import org.bukkit.entity.HumanEntity;
import java.util.UUID;
public class NPC implements NPCProvider {
public HumanEntity createHumanEntity() {
MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer();
WorldServer nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "Chests++NPC");
EntityPlayer npc = new EntityPlayer(nmsServer, nmsWorld, gameProfile, new PlayerInteractManager(nmsWorld));
return npc.getBukkitEntity();
}
}

View File

@ -14,7 +14,7 @@ public class ApiSpecific {
private static NMSProvider nmsProvider;
public static void init() {
nmsProvider = Api.getNMSProvider();
nmsProvider = Api.setupNMSProvider();
if (nmsProvider == null) nmsProvider = new NMSProviderDefault();
materialChecker = nmsProvider.getMaterialChecker();
chestOpener = nmsProvider.getChestOpener();

View File

@ -1,9 +1,6 @@
package com.jamesdpeters.minecraft.chests.api;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.*;
import com.jamesdpeters.minecraft.chests.v1_16_R1.NMSProviderImpl;
import org.bukkit.entity.ItemFrame;
@ -34,6 +31,11 @@ public class NMSProviderDefault implements NMSProvider {
return null;
}
@Override
public NPCProvider getNPCProvider() {
return null;
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
//Not supported in Bukkit api 1.14.

View File

@ -0,0 +1,230 @@
package com.jamesdpeters.minecraft.chests.interfaces;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
public class CraftingInventoryImpl implements CraftingInventory {
Inventory inventory;
ItemStack result;
ItemStack[] matrix;
Recipe recipe;
public CraftingInventoryImpl(Inventory inventory, ItemStack result, List<ItemStack> matrix, Recipe recipe) {
this.inventory = inventory;
this.result = result;
this.matrix = matrix.toArray(new ItemStack[0]);
this.recipe = recipe;
}
@Nullable
@Override
public ItemStack getResult() {
return result;
}
@NotNull
@Override
public ItemStack[] getMatrix() {
return matrix;
}
@Override
public void setResult(@Nullable ItemStack newResult) {
result = newResult;
}
@Override
public void setMatrix(@NotNull ItemStack[] contents) {
matrix = contents;
}
@Nullable
@Override
public Recipe getRecipe() {
return recipe;
}
// INVENTORY METHODS
@Override
public int getSize() {
return inventory.getSize();
}
@Override
public int getMaxStackSize() {
return inventory.getMaxStackSize();
}
@Override
public void setMaxStackSize(int size) {
inventory.setMaxStackSize(size);
}
@Nullable
@Override
public ItemStack getItem(int index) {
return inventory.getItem(index);
}
@Override
public void setItem(int index, @Nullable ItemStack item) {
inventory.setItem(index, item);
}
@NotNull
@Override
public HashMap<Integer, ItemStack> addItem(@NotNull ItemStack... items)
throws IllegalArgumentException {
return inventory.addItem(items);
}
@NotNull
@Override
public HashMap<Integer, ItemStack> removeItem(@NotNull ItemStack... items)
throws IllegalArgumentException {
return inventory.removeItem(items);
}
@NotNull
@Override
public ItemStack[] getContents() {
return inventory.getContents();
}
@Override
public void setContents(@NotNull ItemStack[] items) throws IllegalArgumentException {
inventory.setContents(items);
}
@NotNull
@Override
public ItemStack[] getStorageContents() {
return inventory.getStorageContents();
}
@Override
public void setStorageContents(@NotNull ItemStack[] items) throws IllegalArgumentException {
inventory.setStorageContents(items);
}
@Override
public boolean contains(@NotNull Material material) throws IllegalArgumentException {
return inventory.contains(material);
}
@Override
public boolean contains(@Nullable ItemStack item) {
return inventory.contains(item);
}
@Override
public boolean contains(@NotNull Material material, int amount) throws IllegalArgumentException {
return inventory.contains(material, amount);
}
@Override
public boolean contains(@Nullable ItemStack item, int amount) {
return inventory.contains(item, amount);
}
@Override
public boolean containsAtLeast(@Nullable ItemStack item, int amount) {
return inventory.containsAtLeast(item, amount);
}
@NotNull
@Override
public HashMap<Integer, ? extends ItemStack> all(@NotNull Material material)
throws IllegalArgumentException {
return inventory.all(material);
}
@NotNull
@Override
public HashMap<Integer, ? extends ItemStack> all(@Nullable ItemStack item) {
return inventory.all(item);
}
@Override
public int first(@NotNull Material material) throws IllegalArgumentException {
return inventory.first(material);
}
@Override
public int first(@NotNull ItemStack item) {
return inventory.first(item);
}
@Override
public int firstEmpty() {
return inventory.firstEmpty();
}
@Override
public void remove(@NotNull Material material) throws IllegalArgumentException {
inventory.remove(material);
}
@Override
public void remove(@NotNull ItemStack item) {
inventory.remove(item);
}
@Override
public void clear(int index) {
inventory.clear(index);
}
@Override
public void clear() {
inventory.clear();
}
@NotNull
@Override
public List<HumanEntity> getViewers() {
return inventory.getViewers();
}
@NotNull
@Override
public InventoryType getType() {
return inventory.getType();
}
@Nullable
@Override
public InventoryHolder getHolder() {
return inventory.getHolder();
}
@NotNull
@Override
public ListIterator<ItemStack> iterator() {
return inventory.iterator();
}
@NotNull
@Override
public ListIterator<ItemStack> iterator(int index) {
return inventory.iterator(index);
}
@Nullable
@Override
public Location getLocation() {
return inventory.getLocation();
}
}

View File

@ -0,0 +1,49 @@
package com.jamesdpeters.minecraft.chests.interfaces;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.jetbrains.annotations.NotNull;
public class InventoryViewImpl extends InventoryView {
Inventory top, bottom;
HumanEntity humanEntity;
public InventoryViewImpl(Inventory top, Inventory bottom, HumanEntity humanEntity){
this.top = top;
this.bottom = bottom;
this.humanEntity = humanEntity;
}
@NotNull
@Override
public Inventory getTopInventory() {
return top;
}
@NotNull
@Override
public Inventory getBottomInventory() {
return bottom;
}
@NotNull
@Override
public HumanEntity getPlayer() {
return humanEntity;
}
@NotNull
@Override
public InventoryType getType() {
return InventoryType.WORKBENCH;
}
@NotNull
@Override
public String getTitle() {
return "ChestsPlusPlusInventoryView";
}
}

View File

@ -8,11 +8,6 @@ import com.jamesdpeters.minecraft.chests.serialize.Config;
import com.jamesdpeters.minecraft.chests.serialize.LocationInfo;
import com.jamesdpeters.minecraft.chests.storage.autocraft.AutoCraftingStorage;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Sound;
@ -22,16 +17,17 @@ import org.bukkit.block.Container;
import org.bukkit.block.Hopper;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.inventory.*;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
public class VirtualCraftingHolder implements InventoryHolder {
private final Inventory inventory;
@ -261,7 +257,7 @@ public class VirtualCraftingHolder implements InventoryHolder {
Utils.addIfNotNull(inventories, getInventory(block.getRelative(BlockFace.SOUTH)));
Utils.addIfNotNull(inventories, getInventory(block.getRelative(BlockFace.WEST)));
boolean didCraft = craftItem(inventories, output);
boolean didCraft = craftItem(inventories, output, getInventory());
//Play sound if crafting occured.
if (didCraft) {
@ -387,7 +383,7 @@ public class VirtualCraftingHolder implements InventoryHolder {
return null;
}
private boolean craftItem(List<Inventory> inputs, Inventory output) {
private boolean craftItem(List<Inventory> inputs, Inventory output, Inventory craftingInventory) {
boolean sameInv = false;
Inventory sameInventory = null;
@ -413,10 +409,18 @@ public class VirtualCraftingHolder implements InventoryHolder {
// Use NMS to get the real result considering meta data etc.
ItemStack realResult = Crafting.craft(recipe);
Recipe recipeActual = Crafting.getRecipe(recipe);
CraftingInventoryImpl craftingInventoryImpl = new CraftingInventoryImpl(craftingInventory, realResult, recipe, recipeActual);
InventoryViewImpl inventoryView = new InventoryViewImpl(craftingInventory, output, ApiSpecific.getNmsProvider().getNPCProvider().createHumanEntity());
PrepareItemCraftEvent itemCraftEvent = new PrepareItemCraftEvent(craftingInventoryImpl, inventoryView, false);
Bukkit.getPluginManager().callEvent(itemCraftEvent);
if (craftingInventoryImpl.result == null) return false;
//If we reach here there are enough materials so check for space in the Hopper and update inventory.
//Check if output and input are the same inventory to avoid duplication.
Inventory tempOutput = sameInv ? sameInventory : Utils.copyInventory(output);
HashMap<Integer, ItemStack> map = tempOutput.addItem(realResult);
HashMap<Integer, ItemStack> map = tempOutput.addItem(craftingInventoryImpl.result);
//If result fits into output copy over the temporary inventories.
if (map.isEmpty()) {

View File

@ -6,15 +6,12 @@ import com.jamesdpeters.minecraft.chests.interfaces.VirtualInventoryHolder;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.sort.InventorySorter;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryInteractEvent;
import org.bukkit.event.inventory.*;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
@ -122,5 +119,13 @@ public class InventoryListener implements Listener {
}
}
@EventHandler
public void craftEvent(PrepareItemCraftEvent event){
if (event.getRecipe() == null) return;
if (event.getRecipe().getResult().getType() == Material.DIAMOND_BLOCK){
event.getInventory().setResult(null);
}
}
}