2016-04-14 16:24:03 +00:00
|
|
|
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
|
2019-03-31 18:32:40 +00:00
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.Location;
|
|
|
|
import org.bukkit.Material;
|
|
|
|
import org.bukkit.block.Block;
|
|
|
|
import org.bukkit.block.BlockFace;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
|
|
|
import org.bukkit.inventory.Inventory;
|
|
|
|
import org.bukkit.inventory.ItemStack;
|
|
|
|
|
2016-04-14 16:24:03 +00:00
|
|
|
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
|
|
|
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
|
|
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Block.Vein;
|
|
|
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenuClickHandler;
|
|
|
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
|
|
|
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils;
|
|
|
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
|
|
|
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
|
|
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
|
|
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
|
|
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecipe;
|
|
|
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
|
|
|
|
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
|
|
|
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
|
|
|
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
|
|
|
|
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
|
|
|
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
|
|
|
|
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
|
|
|
|
|
|
|
|
public class FluidPump extends SlimefunItem{
|
|
|
|
|
|
|
|
public static Map<Block, MachineRecipe> processing = new HashMap<Block, MachineRecipe>();
|
|
|
|
public static Map<Block, Integer> progress = new HashMap<Block, Integer>();
|
|
|
|
|
|
|
|
private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 31, 36, 37, 38, 39, 40, 41, 42, 43, 44, 22};
|
|
|
|
private static final int[] border_in = {9, 10, 11, 12, 18, 21, 27, 28, 29, 30};
|
|
|
|
private static final int[] border_out = {14, 15, 16, 17, 23, 26, 32, 33, 34, 35};
|
|
|
|
|
|
|
|
public FluidPump(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
|
|
|
|
super(category, item, name, recipeType, recipe);
|
|
|
|
|
|
|
|
new BlockMenuPreset(name, getInventoryTitle()) {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void init() {
|
|
|
|
constructMenu(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void newInstance(BlockMenu menu, Block b) {
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean canOpen(Block b, Player p) {
|
|
|
|
return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
|
|
|
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots();
|
|
|
|
else return getOutputSlots();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void constructMenu(BlockMenuPreset preset) {
|
2019-03-31 18:32:40 +00:00
|
|
|
for (int i : border) {
|
2018-09-05 16:36:32 +00:00
|
|
|
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "),
|
2019-03-31 18:32:40 +00:00
|
|
|
(p, slot, item, action) -> false
|
|
|
|
);
|
2016-04-14 16:24:03 +00:00
|
|
|
}
|
2019-03-31 18:32:40 +00:00
|
|
|
for (int i : border_in) {
|
2018-09-05 16:36:32 +00:00
|
|
|
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "),
|
2019-03-31 18:32:40 +00:00
|
|
|
(p, slot, item, action) -> false
|
|
|
|
);
|
2016-04-14 16:24:03 +00:00
|
|
|
}
|
2019-03-31 18:32:40 +00:00
|
|
|
for (int i : border_out) {
|
2018-09-05 16:36:32 +00:00
|
|
|
preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "),
|
2019-03-31 18:32:40 +00:00
|
|
|
(p, slot, item, action) -> false
|
|
|
|
);
|
2016-04-14 16:24:03 +00:00
|
|
|
}
|
|
|
|
|
2019-03-31 18:32:40 +00:00
|
|
|
for (int i : getOutputSlots()) {
|
2016-04-14 16:24:03 +00:00
|
|
|
preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onClick(Player p, int slot, ItemStack cursor, ClickAction action) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onClick(InventoryClickEvent e, Player p, int slot, ItemStack cursor, ClickAction action) {
|
|
|
|
return cursor == null || cursor.getType() == null || cursor.getType() == Material.AIR;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public int[] getInputSlots() {
|
|
|
|
return new int[] {19, 20};
|
|
|
|
}
|
|
|
|
|
|
|
|
public int[] getOutputSlots() {
|
|
|
|
return new int[] {24, 25};
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getInventoryTitle() {
|
2016-11-23 15:51:57 +00:00
|
|
|
return "&9Fluid Pump";
|
2016-04-14 16:24:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void tick(Block b) {
|
|
|
|
Block fluid = b.getRelative(BlockFace.DOWN);
|
2018-09-04 16:53:28 +00:00
|
|
|
if (fluid.getType().equals(Material.LAVA)) {
|
2019-03-31 18:32:40 +00:00
|
|
|
for (int slot : getInputSlots()) {
|
2016-04-14 16:24:03 +00:00
|
|
|
if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.BUCKET), true)) {
|
|
|
|
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
|
|
|
|
|
|
|
|
ItemStack output = new ItemStack(Material.LAVA_BUCKET);
|
|
|
|
|
|
|
|
if (!fits(b, new ItemStack[] {output})) return;
|
|
|
|
|
|
|
|
ChargableBlock.addCharge(b, -getEnergyConsumption());
|
|
|
|
BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1));
|
|
|
|
pushItems(b, new ItemStack[] {output});
|
|
|
|
|
|
|
|
List<Location> list = new ArrayList<Location>();
|
|
|
|
list.add(fluid.getLocation());
|
|
|
|
Vein.calculate(fluid.getLocation(), fluid.getLocation(), list, 64);
|
|
|
|
list.get(list.size() - 1).getBlock().setType(Material.AIR);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-09-04 16:53:28 +00:00
|
|
|
else if (fluid.getType().equals(Material.WATER)) {
|
2019-03-31 18:32:40 +00:00
|
|
|
for (int slot : getInputSlots()) {
|
2016-04-14 16:24:03 +00:00
|
|
|
if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.BUCKET), true)) {
|
|
|
|
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
|
|
|
|
|
|
|
|
ItemStack output = new ItemStack(Material.WATER_BUCKET);
|
|
|
|
|
|
|
|
if (!fits(b, new ItemStack[] {output})) return;
|
|
|
|
|
|
|
|
ChargableBlock.addCharge(b, -getEnergyConsumption());
|
|
|
|
BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1));
|
|
|
|
pushItems(b, new ItemStack[] {output});
|
|
|
|
|
|
|
|
fluid.setType(Material.AIR);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private int getEnergyConsumption() {
|
|
|
|
return 32;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void register(boolean slimefun) {
|
|
|
|
addItemHandler(new BlockTicker() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void tick(Block b, SlimefunItem sf, Config data) {
|
|
|
|
FluidPump.this.tick(b);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void uniqueTick() {
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isSynchronized() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
super.register(slimefun);
|
|
|
|
}
|
|
|
|
|
|
|
|
private Inventory inject(Block b) {
|
|
|
|
int size = BlockStorage.getInventory(b).toInventory().getSize();
|
|
|
|
Inventory inv = Bukkit.createInventory(null, size);
|
|
|
|
for (int i = 0; i < size; i++) {
|
2018-09-04 16:53:28 +00:00
|
|
|
inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US", 0));
|
2016-04-14 16:24:03 +00:00
|
|
|
}
|
2019-03-31 18:32:40 +00:00
|
|
|
for (int slot : getOutputSlots()) {
|
2016-04-14 16:24:03 +00:00
|
|
|
inv.setItem(slot, BlockStorage.getInventory(b).getItemInSlot(slot));
|
|
|
|
}
|
|
|
|
return inv;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected boolean fits(Block b, ItemStack[] items) {
|
|
|
|
return inject(b).addItem(items).isEmpty();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void pushItems(Block b, ItemStack[] items) {
|
|
|
|
Inventory inv = inject(b);
|
|
|
|
inv.addItem(items);
|
|
|
|
|
|
|
|
for (int slot: getOutputSlots()) {
|
|
|
|
BlockStorage.getInventory(b).replaceExistingItem(slot, inv.getItem(slot));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|