From b08f5b98920c95e8579f70bb675f8189921e75a2 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 23 Jan 2017 12:52:14 +0100 Subject: [PATCH] Added ChestManipulator --- .../Slimefun/SlimefunStartup.java | 2 ++ .../Slimefun/api/inventory/BlockMenu.java | 5 +++- .../api/inventory/ItemManipulationEvent.java | 2 +- .../api/inventory/UniversalBlockMenu.java | 6 +++-- .../api/item_transport/CargoManager.java | 6 +++-- .../item_transport/CargoTransportEvent.java | 10 ++++++++ .../api/item_transport/ChestManipulator.java | 25 +++++++++++++++++++ 7 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java create mode 100644 src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java index fa15251b2..c3f475cf2 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java @@ -69,6 +69,7 @@ import me.mrCookieSlime.Slimefun.api.energy.EnergyNet; import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; +import me.mrCookieSlime.Slimefun.api.item_transport.ChestManipulator; import me.mrCookieSlime.Slimefun.listeners.AncientAltarListener; import me.mrCookieSlime.Slimefun.listeners.AndroidKillingListener; import me.mrCookieSlime.Slimefun.listeners.ArmorListener; @@ -554,6 +555,7 @@ public class SlimefunStartup extends JavaPlugin { OreGenSystem.map = null; SlimefunGuide.contributors = null; GitHubConnector.connectors = null; + ChestManipulator.listeners = null; for (Player p: Bukkit.getOnlinePlayers()) { p.closeInventory(); diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java index 61d732fa9..3b906f4f5 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java @@ -108,9 +108,12 @@ public class BlockMenu extends ChestMenu { public void replaceExistingItem(int slot, ItemStack item, boolean event) { final ItemStack previous = getItemInSlot(slot); + + if (event && this.event != null) { + item = this.event.onEvent(slot, previous, item); + } super.replaceExistingItem(slot, item); - if (event && this.event != null) this.event.onEvent(slot, previous, item); changes++; } diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java b/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java index 2e0189287..e1be5239e 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java @@ -4,6 +4,6 @@ import org.bukkit.inventory.ItemStack; public interface ItemManipulationEvent { - public void onEvent(int slot, ItemStack previous, ItemStack next); + public ItemStack onEvent(int slot, ItemStack previous, ItemStack next); } diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java index 37b71df94..7b66834b7 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java @@ -79,9 +79,11 @@ public class UniversalBlockMenu extends ChestMenu { public void replaceExistingItem(int slot, ItemStack item, boolean event) { final ItemStack previous = getItemInSlot(slot); - super.replaceExistingItem(slot, item); - if (event && this.event != null) this.event.onEvent(slot, previous, item); + if (event && this.event != null) { + item = this.event.onEvent(slot, previous, item); + } + super.replaceExistingItem(slot, item); changes++; } diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java index 9a9a24c59..b205a4615 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java @@ -157,13 +157,15 @@ public class CargoManager { } else if (target.getState() instanceof InventoryHolder) { Inventory inv = ((InventoryHolder) target.getState()).getInventory(); + for (int slot = 0; slot < inv.getContents().length; slot++) { ItemStack is = inv.getContents()[slot]; if (is == null) { - inv.setItem(slot, stack.clone()); + inv.setItem(slot, ChestManipulator.trigger(target, slot, null, stack.clone())); return null; } else if (SlimefunManager.isItemSimiliar(new CustomItem(is, 1), new CustomItem(stack, 1), true, DataType.ALWAYS) && is.getAmount() < is.getType().getMaxStackSize()) { + ItemStack prev = is.clone(); int amount = is.getAmount() + stack.getAmount(); if (amount > is.getType().getMaxStackSize()) { @@ -175,7 +177,7 @@ public class CargoManager { stack = null; } - inv.setItem(slot, is); + inv.setItem(slot, ChestManipulator.trigger(target, slot, prev, is)); return stack; } } diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java new file mode 100644 index 000000000..17905428f --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java @@ -0,0 +1,10 @@ +package me.mrCookieSlime.Slimefun.api.item_transport; + +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +public interface CargoTransportEvent { + + public ItemStack onEvent(Block b, int slot, ItemStack previous, ItemStack next); + +} diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java new file mode 100644 index 000000000..d78617f20 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java @@ -0,0 +1,25 @@ +package me.mrCookieSlime.Slimefun.api.item_transport; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +public class ChestManipulator { + + public static List listeners = new ArrayList(); + + public static void registerListener(CargoTransportEvent listener) { + listeners.add(listener); + } + + public static ItemStack trigger(Block b, int slot, ItemStack prev, ItemStack next) { + for (CargoTransportEvent listener: listeners) { + next = listener.onEvent(b, slot, prev, next); + } + + return next; + } + +}