1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-22 04:35:53 +00:00
Slimefun4/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutomatedCraftingChamber.java

296 lines
9.7 KiB
Java
Raw Normal View History

2016-04-14 16:24:03 +00:00
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenuClickHandler;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuClickHandler;
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.CSCoreLibPlugin.general.Inventory.Item.CustomItemSerializer;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItemSerializer.ItemFlag;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
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;
import me.mrCookieSlime.Slimefun.api.item_transport.RecipeSorter;
import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
public abstract class AutomatedCraftingChamber extends SlimefunItem {
private static final int[] border = {0, 1, 3, 4, 5, 7, 8, 13, 14, 15, 16, 17, 50, 51, 52, 53};
private static final int[] border_in = {9, 10, 11, 12, 13, 18, 22, 27, 31, 36, 40, 45, 46, 47, 48, 49};
private static final int[] border_out = {23, 24, 25, 26, 32, 35, 41, 42, 43, 44};
public static Map<String, ItemStack> recipes = new HashMap<String, ItemStack>();
public AutomatedCraftingChamber(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, name, recipeType, recipe);
2016-11-23 15:51:57 +00:00
new BlockMenuPreset(name, "&6Automated Crafting Chamber") {
2016-04-14 16:24:03 +00:00
@Override
public void init() {
constructMenu(this);
}
@Override
public void newInstance(final BlockMenu menu, final Block b) {
2018-06-06 09:41:56 +00:00
if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "enabled") == null || BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals("false")) {
2016-11-23 15:51:57 +00:00
menu.replaceExistingItem(6, new CustomItem(new MaterialData(Material.SULPHUR), "&7Enabled: &4\u2718", "", "&e> Click to enable this Machine"));
2016-04-14 16:24:03 +00:00
menu.addMenuClickHandler(6, new MenuClickHandler() {
@Override
public boolean onClick(Player p, int arg1, ItemStack arg2, ClickAction arg3) {
BlockStorage.addBlockInfo(b, "enabled", "true");
newInstance(menu, b);
return false;
}
});
}
else {
2016-11-23 15:51:57 +00:00
menu.replaceExistingItem(6, new CustomItem(new MaterialData(Material.REDSTONE), "&7Enabled: &2\u2714", "", "&e> Click to disable this Machine"));
2016-04-14 16:24:03 +00:00
menu.addMenuClickHandler(6, new MenuClickHandler() {
@Override
public boolean onClick(Player p, int arg1, ItemStack arg2, ClickAction arg3) {
BlockStorage.addBlockInfo(b, "enabled", "false");
newInstance(menu, b);
return false;
}
});
}
}
@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) {
return new int[0];
}
@Override
public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();
List<Integer> slots = new ArrayList<Integer>();
for (int slot: getInputSlots()) {
if (menu.getItemInSlot(slot) != null) slots.add(slot);
}
Collections.sort(slots, new RecipeSorter(menu));
return ArrayUtils.toPrimitive(slots.toArray(new Integer[slots.size()]));
}
};
registerBlockHandler(name, new SlimefunBlockHandler() {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
BlockStorage.addBlockInfo(b, "enabled", "false");
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) {
for (int slot: getInputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
2016-04-14 16:24:03 +00:00
}
for (int slot: getOutputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
2016-04-14 16:24:03 +00:00
}
}
return true;
}
});
}
@SuppressWarnings("deprecation")
protected void constructMenu(BlockMenuPreset preset) {
for (int i: border) {
preset.addItem(i, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "),
new MenuClickHandler() {
@Override
public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
return false;
}
});
}
for (int i: border_in) {
preset.addItem(i, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 11), " "),
new MenuClickHandler() {
@Override
public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
return false;
}
});
}
for (int i: border_out) {
preset.addItem(i, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 1), " "),
new MenuClickHandler() {
@Override
public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
return false;
}
});
}
for (int i: getOutputSlots()) {
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;
}
});
}
2016-11-23 15:51:57 +00:00
preset.addItem(2, new CustomItem(new MaterialData(Material.WORKBENCH), "&eRecipe", "", "&bPut in the Recipe you want to craft", "&4Enhanced Crafting Table Recipes ONLY"),
2016-04-14 16:24:03 +00:00
new MenuClickHandler() {
@Override
public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
return false;
}
});
}
public abstract int getEnergyConsumption();
public int[] getInputSlots() {
return new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39};
}
public int[] getOutputSlots() {
return new int[] {33, 34};
}
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++) {
2016-11-23 15:51:57 +00:00
inv.setItem(i, new CustomItem(Material.COMMAND, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US", 0));
2016-04-14 16:24:03 +00:00
}
for (int slot: getOutputSlots()) {
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));
}
}
@Override
public void register(boolean slimefun) {
addItemHandler(new BlockTicker() {
@Override
public void tick(Block b, SlimefunItem sf, Config data) {
AutomatedCraftingChamber.this.tick(b);
}
@Override
public void uniqueTick() {
}
@Override
public boolean isSynchronized() {
return false;
}
});
super.register(slimefun);
}
protected void tick(Block b) {
2018-06-06 09:41:56 +00:00
if (BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals("false")) return;
2016-04-14 16:24:03 +00:00
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
BlockMenu menu = BlockStorage.getInventory(b);
StringBuilder builder = new StringBuilder();
int i = 0;
for (int j = 0; j < 9; j++) {
if (i > 0) {
builder.append(" </slot> ");
}
ItemStack item = menu.getItemInSlot(getInputSlots()[j]);
if (item != null && item.getAmount() == 1) return;
builder.append(CustomItemSerializer.serialize(item, ItemFlag.DATA, ItemFlag.ITEMMETA_DISPLAY_NAME, ItemFlag.ITEMMETA_LORE, ItemFlag.MATERIAL));
i++;
}
String input = builder.toString();
if (recipes.containsKey(input)) {
ItemStack output = recipes.get(input).clone();
2016-04-14 16:24:03 +00:00
if (fits(b, new ItemStack[] {output})) {
pushItems(b, new ItemStack[] {output});
ChargableBlock.addCharge(b, -getEnergyConsumption());
for (int j = 0; j < 9; j++) {
if (menu.getItemInSlot(getInputSlots()[j]) != null) menu.replaceExistingItem(getInputSlots()[j], InvUtils.decreaseItem(menu.getItemInSlot(getInputSlots()[j]), 1));
}
}
}
}
}