diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java index 083e24d10..a2f4b7c21 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java @@ -34,9 +34,9 @@ public abstract class AContainer extends SlimefunItem implements InventoryBlock protected List recipes = new ArrayList<>(); - 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}; - 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}; + 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}; + 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 AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { super(category, item, id, recipeType, recipe); @@ -75,15 +75,15 @@ public abstract class AContainer extends SlimefunItem implements InventoryBlock } protected void constructMenu(BlockMenuPreset preset) { - for (int i : border) { + for (int i : BORDER) { preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } - for (int i : border_in) { + for (int i : BORDER_IN) { preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } - for (int i : border_out) { + for (int i : BORDER_OUT) { preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java index 90c042baa..3824451f8 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.ChatColor; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; @@ -89,6 +90,7 @@ public final class MachineHelper { public static void updateProgressbar(BlockMenu menu, int slot, int timeleft, int time, ItemStack indicator) { ItemStack item = indicator.clone(); ItemMeta im = item.getItemMeta(); + im.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); ((Damageable) im).setDamage(getDurability(item, timeleft, time)); im.setDisplayName(" "); List lore = new ArrayList<>(); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java index 817715d95..a8af6fcc6 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java @@ -14,15 +14,15 @@ import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; -import me.mrCookieSlime.Slimefun.holograms.CargoHologram; +import me.mrCookieSlime.Slimefun.holograms.SimpleHologram; public class CargoManagerBlock extends SlimefunItem { public CargoManagerBlock(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { super(category, item, id, recipeType, recipe); - SlimefunItem.registerBlockHandler("CARGO_MANAGER", (p, b, tool, reason) -> { - CargoHologram.remove(b); + registerBlockHandler(getID(), (p, b, tool, reason) -> { + SimpleHologram.remove(b); return true; }); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/GEOMiner.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/GEOMiner.java new file mode 100644 index 000000000..9b7239964 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/GEOMiner.java @@ -0,0 +1,197 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import java.util.LinkedList; +import java.util.List; + +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenuClickHandler; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.GEO.OreGenResource; +import me.mrCookieSlime.Slimefun.GEO.OreGenSystem; +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.abstractItems.AContainer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineHelper; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecipe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; +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.holograms.SimpleHologram; + +public abstract class GEOMiner extends AContainer implements InventoryBlock, RecipeDisplayItem { + + private static final int[] BORDER = {0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 53}; + private static final int[] BORDER_OUT = {19, 20, 21, 22, 23, 24, 25, 28, 34, 37, 43, 46, 47, 48, 49, 50, 51, 52}; + private static final int[] OUTPUT_SLOTS = {29, 30, 31, 32, 33, 38, 39, 40, 41, 42}; + + public abstract int getProcessingTime(); + + public GEOMiner(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, name, recipeType, recipe); + + registerBlockHandler(getID(), new SlimefunBlockHandler() { + + @Override + public void onPlace(Player p, Block b, SlimefunItem item) { + // Spawn the hologram + SimpleHologram.update(b, "&7Waiting..."); + } + + @Override + public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { + SimpleHologram.remove(b); + + 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); + } + } + + for (int slot : getOutputSlots()) { + if (inv.getItemInSlot(slot) != null) { + b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); + inv.replaceExistingItem(slot, null); + } + } + } + + progress.remove(b); + processing.remove(b); + return true; + } + }); + } + + @Override + public String getInventoryTitle() { + return "&6GEO-Miner"; + } + + @Override + public String getMachineIdentifier() { + return "GEO_MINER"; + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.DIAMOND_PICKAXE); + } + + @Override + public int[] getInputSlots() { + return new int[0]; + } + + @Override + public int[] getOutputSlots() { + return OUTPUT_SLOTS; + } + + @Override + public List getDisplayRecipes() { + List displayRecipes = new LinkedList<>(); + for (OreGenResource resource: OreGenSystem.listResources()) { + if (!resource.isLiquid()) { + displayRecipes.add(resource.getIcon().clone()); + } + } + + if (displayRecipes.size() % 2 != 0) displayRecipes.add(null); + return displayRecipes; + } + + @Override + protected void constructMenu(BlockMenuPreset preset) { + for (int i : BORDER) { + preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); + } + + for (int i : BORDER_OUT) { + preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); + } + + preset.addItem(4, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> 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; + } + }); + } + } + + @Override + protected void tick(Block b) { + if (isProcessing(b)) { + int timeleft = progress.get(b); + if (timeleft > 0) { + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 4, timeleft, processing.get(b).getTicks(), getProgressBar()); + + if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; + ChargableBlock.addCharge(b, -getEnergyConsumption()); + + progress.put(b, timeleft - 1); + } + else { + BlockStorage.getInventory(b).replaceExistingItem(4, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " ")); + pushItems(b, processing.get(b).getOutput()); + + progress.remove(b); + processing.remove(b); + } + } + else if (!BlockStorage.hasChunkInfo(b.getChunk())) { + SimpleHologram.update(b, "&4GEO-Scan required!"); + } + else { + Chunk chunk = b.getChunk(); + + for (OreGenResource resource: OreGenSystem.listResources()) { + if (!resource.isLiquid()) { + if (!OreGenSystem.wasResourceGenerated(resource, chunk)) { + SimpleHologram.update(b, "&4GEO-Scan required!"); + break; + } + else { + int supplies = OreGenSystem.getSupplies(resource, chunk, false); + if (supplies > 0) { + MachineRecipe r = new MachineRecipe(getProcessingTime() / getSpeed(), new ItemStack[0], new ItemStack[] {resource.getIcon().clone()}); + if (!fits(b, r.getOutput())) return; + + processing.put(b, r); + progress.put(b, r.getTicks()); + OreGenSystem.setSupplies(resource, b.getChunk(), supplies - 1); + break; + } + } + + } + } + } + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java index fa9cac3dc..c8dccbd64 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java @@ -31,7 +31,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; import me.mrCookieSlime.Slimefun.api.network.Network; import me.mrCookieSlime.Slimefun.api.network.NetworkComponent; -import me.mrCookieSlime.Slimefun.holograms.CargoHologram; +import me.mrCookieSlime.Slimefun.holograms.SimpleHologram; public class CargoNet extends Network { @@ -142,15 +142,15 @@ public class CargoNet extends Network { public void tick(final Block b) { if (!regulator.equals(b.getLocation())) { - CargoHologram.update(b, "&4Multiple Cargo Regulators connected"); + SimpleHologram.update(b, "&4Multiple Cargo Regulators connected"); return; } super.tick(); if (connectorNodes.isEmpty() && terminusNodes.isEmpty()) { - CargoHologram.update(b, "&7Status: &4&lOFFLINE"); + SimpleHologram.update(b, "&7Status: &4&lOFFLINE"); } else { - CargoHologram.update(b, "&7Status: &a&lONLINE"); + SimpleHologram.update(b, "&7Status: &a&lONLINE"); final Map> output = new HashMap<>(); diff --git a/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java b/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java index 5625467e9..1b6bb4cbf 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java @@ -33,14 +33,14 @@ public final class EnergyHologram { }); } - private static ArmorStand getArmorStand(Block b, boolean createIfNonExists) { + private static ArmorStand getArmorStand(Block b, boolean createIfNoneExists) { Location l = new Location(b.getWorld(), b.getX() + 0.5, b.getY() + 0.7F, b.getZ() + 0.5); for (Entity n : l.getChunk().getEntities()) { if (n instanceof ArmorStand && n.getCustomName() != null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } - if (!createIfNonExists) return null; + if (!createIfNoneExists) return null; else return ArmorStandFactory.createHidden(l); } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/CargoHologram.java b/src/me/mrCookieSlime/Slimefun/holograms/SimpleHologram.java similarity index 74% rename from src/me/mrCookieSlime/Slimefun/holograms/CargoHologram.java rename to src/me/mrCookieSlime/Slimefun/holograms/SimpleHologram.java index c1db9d860..37c1ac2cb 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/CargoHologram.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/SimpleHologram.java @@ -10,30 +10,32 @@ import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; import me.mrCookieSlime.Slimefun.SlimefunPlugin; -public final class CargoHologram { +public final class SimpleHologram { - private CargoHologram() {} + private SimpleHologram() {} public static void update(final Block b, final String name) { Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { ArmorStand hologram = getArmorStand(b, true); hologram.setCustomName(ChatColor.translateAlternateColorCodes('&', name)); }); + } + + public static void remove(final Block b) { + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); + }); } - public static void remove(Block b) { - ArmorStand hologram = getArmorStand(b, false); - if (hologram != null) hologram.remove(); - } - - private static ArmorStand getArmorStand(Block b, boolean createIfNonExists) { + private static ArmorStand getArmorStand(Block b, boolean createIfNoneExists) { Location l = new Location(b.getWorld(), b.getX() + 0.5, b.getY() + 0.7F, b.getZ() + 0.5); for (Entity n : l.getChunk().getEntities()) { if (n instanceof ArmorStand && n.getCustomName() != null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } - if (!createIfNonExists) return null; + if (!createIfNoneExists) return null; else return ArmorStandFactory.createHidden(l); }