diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..b1a6f98a1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +## Description + + +## Changes + + +## Related Issues + + + +## Testability + +- [ ] I have fully tested the proposed changes and promise that they will not break everything into chaos. +- [ ] I have also tested the proposed changes in combination with various popular addons and can confirm my changes do not break them. diff --git a/.github/PULL_REQUEST_TEMPLATE/features.md b/.github/PULL_REQUEST_TEMPLATE/features.md new file mode 100644 index 000000000..d260edea3 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/features.md @@ -0,0 +1,18 @@ +## Description + + +## Changes + + +## How this benefits Slimefun + + + +## Related Issues (Optional) + + + +## Testability + +* [ ] I have fully tested the proposed changes and promise that they will not break everything into chaos. +* [ ] I have also tested the proposed changes in combination with various popular addons and can confirm my changes do not break them. diff --git a/.github/PULL_REQUEST_TEMPLATE/fix.md b/.github/PULL_REQUEST_TEMPLATE/fix.md new file mode 100644 index 000000000..de8429877 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/fix.md @@ -0,0 +1,14 @@ +## Description + + +## Changes + + +## Related Issues + + + +## Testability + +* [ ] I have fully tested the proposed changes and promise that they will not break everything into chaos. +* [ ] I have also tested the proposed changes in combination with various popular addons and can confirm my changes do not break them. diff --git a/README.md b/README.md index 3871b6d53..6cf538887 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ Release Candidates or "stable" builds will have a proper Version such as "4.1.18

+You can also find the most recent development builds for all my other Plugins (including Slimefun Addons) on here: +https://thebusybiscuit.github.io/builds/ + ## Discord You can find Slimefun's community on Discord! Click the badge to join it for Suggestions/Questions or other discussions about this plugin. diff --git a/pom.xml b/pom.xml index 6274bb7e6..e2aed4a93 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,8 @@ com.github.thebusybiscuit:CS-CoreLib2 **/cscorelib2/updater/** + **/cscorelib2/materials/** + **/cscorelib2/protection/** @@ -122,7 +124,7 @@ com.github.thebusybiscuit CS-CoreLib2 - 0.3.7 + 0.4.1 compile diff --git a/src/config.yml b/src/config.yml index 7b2c23711..2dec0165d 100644 --- a/src/config.yml +++ b/src/config.yml @@ -14,6 +14,7 @@ options: research-give-fireworks: true legacy-ore-washer: false legacy-dust-washer: false + legacy-ore-grinder: true guide: default-view-book: false URID: diff --git a/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java b/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java deleted file mode 100644 index 99771fec1..000000000 --- a/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java +++ /dev/null @@ -1,1431 +0,0 @@ -package me.mrCookieSlime.Slimefun.Android; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Effect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Sound; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Dispenser; -import org.bukkit.block.Skull; -import org.bukkit.block.data.Ageable; -import org.bukkit.block.data.Rotatable; -import org.bukkit.entity.Animals; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Monster; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.FixedMetadataValue; - -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; -import me.mrCookieSlime.CSCoreLibPlugin.general.Block.TreeCalculator; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; -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.MenuHelper; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; -import me.mrCookieSlime.ExoticGarden.ExoticGarden; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Android.comparators.ScriptReputationSorter; -import me.mrCookieSlime.Slimefun.Lists.RecipeType; -import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; -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.MachineFuel; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; -import me.mrCookieSlime.Slimefun.Setup.Messages; -import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; -import me.mrCookieSlime.Slimefun.api.BlockStorage; -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.holograms.AndroidStatusHologram; - -public abstract class ProgrammableAndroid extends SlimefunItem { - - private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 18, 24, 25, 26, 27, 33, 35, 36, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; - private static final int[] border_out = {10, 11, 12, 13, 14, 19, 23, 28, 32, 37, 38, 39, 40, 41}; - - private static final ItemStack[] fish = new ItemStack[] {new ItemStack(Material.COD), new ItemStack(Material.SALMON), new ItemStack(Material.PUFFERFISH), new ItemStack(Material.TROPICAL_FISH), new ItemStack(Material.STRING), new ItemStack(Material.BONE), new ItemStack(Material.STICK)}; - - private static final List directions = Arrays.asList(BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST); - private static final List blockblacklist = new ArrayList<>(); - - - static { - blockblacklist.add(Material.BEDROCK); - blockblacklist.add(Material.BARRIER); - blockblacklist.add(Material.END_PORTAL_FRAME); - blockblacklist.add(Material.COMMAND_BLOCK); - blockblacklist.add(Material.CHAIN_COMMAND_BLOCK); - blockblacklist.add(Material.REPEATING_COMMAND_BLOCK); - blockblacklist.add(Material.STRUCTURE_BLOCK); - } - - private Set recipes = new HashSet<>(); - - public String getInventoryTitle() { - return "Programmable Android"; - } - - public int[] getOutputSlots() { - return new int[] {20, 21, 22, 29, 30, 31}; - } - - public abstract AndroidType getAndroidType(); - public abstract float getFuelEfficiency(); - public abstract int getTier(); - - public ProgrammableAndroid(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { - super(category, item, name, recipeType, recipe); - - if (getTier() == 1) { - registerFuel(new MachineFuel(80, new ItemStack(Material.COAL))); - registerFuel(new MachineFuel(80, new ItemStack(Material.CHARCOAL))); - registerFuel(new MachineFuel(800, new ItemStack(Material.COAL_BLOCK))); - registerFuel(new MachineFuel(45, new ItemStack(Material.BLAZE_ROD))); - - // Logs - registerFuel(new MachineFuel(4, new ItemStack(Material.OAK_LOG))); - registerFuel(new MachineFuel(4, new ItemStack(Material.BIRCH_LOG))); - registerFuel(new MachineFuel(4, new ItemStack(Material.SPRUCE_LOG))); - registerFuel(new MachineFuel(4, new ItemStack(Material.JUNGLE_LOG))); - registerFuel(new MachineFuel(4, new ItemStack(Material.DARK_OAK_LOG))); - registerFuel(new MachineFuel(4, new ItemStack(Material.ACACIA_LOG))); - - // Wooden Planks - registerFuel(new MachineFuel(1, new ItemStack(Material.OAK_PLANKS))); - registerFuel(new MachineFuel(1, new ItemStack(Material.BIRCH_PLANKS))); - registerFuel(new MachineFuel(1, new ItemStack(Material.SPRUCE_PLANKS))); - registerFuel(new MachineFuel(1, new ItemStack(Material.JUNGLE_PLANKS))); - registerFuel(new MachineFuel(1, new ItemStack(Material.DARK_OAK_PLANKS))); - registerFuel(new MachineFuel(1, new ItemStack(Material.ACACIA_PLANKS))); - } - else if (getTier() == 2){ - registerFuel(new MachineFuel(100, new ItemStack(Material.LAVA_BUCKET))); - registerFuel(new MachineFuel(200, SlimefunItems.BUCKET_OF_OIL)); - registerFuel(new MachineFuel(500, SlimefunItems.BUCKET_OF_FUEL)); - } - else { - registerFuel(new MachineFuel(2500, SlimefunItems.URANIUM)); - registerFuel(new MachineFuel(1200, SlimefunItems.NEPTUNIUM)); - registerFuel(new MachineFuel(3000, SlimefunItems.BOOSTED_URANIUM)); - } - - new BlockMenuPreset(name, getInventoryTitle()) { - - @Override - public void init() { - try { - constructMenu(this); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean canOpen(Block b, Player p) { - boolean open = BlockStorage.getLocationInfo(b.getLocation(), "owner").equals(p.getUniqueId().toString()) || p.hasPermission("slimefun.android.bypass"); - if (!open) { - Messages.local.sendTranslation(p, "inventory.no-access", true); - } - return open; - } - - @Override - public void newInstance(BlockMenu menu, final Block b) { - try { - menu.replaceExistingItem(15, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTAxYzdiNTcyNjE3ODk3NGIzYjNhMDFiNDJhNTkwZTU0MzY2MDI2ZmQ0MzgwOGYyYTc4NzY0ODg0M2E3ZjVhIn19fQ=="), "&aStart/Continue")); - menu.addMenuClickHandler(15, (p, slot, item, action) -> { - Messages.local.sendTranslation(p, "robot.started", true); - BlockStorage.addBlockInfo(b, "paused", "false"); - p.closeInventory(); - return false; - }); - - menu.replaceExistingItem(17, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTYxMzlmZDFjNTY1NGU1NmU5ZTRlMmM4YmU3ZWIyYmQ1YjQ5OWQ2MzM2MTY2NjNmZWVlOTliNzQzNTJhZDY0In19fQ=="), "&4Pause")); - menu.addMenuClickHandler(17, (p, slot, item, action) -> { - BlockStorage.addBlockInfo(b, "paused", "true"); - Messages.local.sendTranslation(p, "robot.stopped", true); - return false; - }); - - menu.replaceExistingItem(16, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDc4ZjJiN2U1ZTc1NjM5ZWE3ZmI3OTZjMzVkMzY0YzRkZjI4YjQyNDNlNjZiNzYyNzdhYWRjZDYyNjEzMzcifX19"), "&bMemory Core", "", "&8\u21E8 &7Click to open the Script Editor")); - menu.addMenuClickHandler(16, (p, slot, item, action) -> { - try { - BlockStorage.addBlockInfo(b, "paused", "true"); - Messages.local.sendTranslation(p, "robot.stopped", true); - openScriptEditor(p, b); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - }); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - return new int[0]; - } - }; - - registerBlockHandler(name, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString()); - BlockStorage.addBlockInfo(b, "script", "START-TURN_LEFT-REPEAT"); - BlockStorage.addBlockInfo(b, "index", "0"); - BlockStorage.addBlockInfo(b, "fuel", "0"); - BlockStorage.addBlockInfo(b, "rotation", p.getFacing().getOppositeFace().toString()); - BlockStorage.addBlockInfo(b, "paused", "true"); - b.setType(Material.PLAYER_HEAD); - Rotatable blockData = (Rotatable) b.getBlockData(); - blockData.setRotation(p.getFacing()); - b.setBlockData(blockData); - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - boolean allow = reason.equals(UnregisterReason.PLAYER_BREAK) && (BlockStorage.getLocationInfo(b.getLocation(), "owner").equals(p.getUniqueId().toString()) || p.hasPermission("slimefun.android.bypass")); - - if (allow) { - BlockMenu inv = BlockStorage.getInventory(b); - if (inv != null) { - if (inv.getItemInSlot(43) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(43)); - inv.replaceExistingItem(43, null); - } - for (int slot: getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } - } - } - AndroidStatusHologram.remove(b); - } - - return allow; - } - }); - } - - protected void tick(Block b) { - try { - if (!(b.getState() instanceof Skull)) { - return; - } - } catch (NullPointerException x) { - return; - } - - if (BlockStorage.getLocationInfo(b.getLocation(), "paused").equals("false")) { - float fuel = Float.parseFloat(BlockStorage.getLocationInfo(b.getLocation(), "fuel")); - if (fuel < 0.001) { - ItemStack item = BlockStorage.getInventory(b).getItemInSlot(43); - if (item != null) { - for (MachineFuel recipe: recipes) { - if (SlimefunManager.isItemSimiliar(item, recipe.getInput(), true)) { - BlockStorage.getInventory(b).replaceExistingItem(43, InvUtils.decreaseItem(item, 1)); - if (getTier() == 2) { - pushItems(b, new ItemStack(Material.BUCKET)); - } - BlockStorage.addBlockInfo(b, "fuel", String.valueOf((int) (recipe.getTicks() * this.getFuelEfficiency()))); - break; - } - } - } - } - else { - String[] script = BlockStorage.getLocationInfo(b.getLocation(), "script").split("-"); - int index = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "index")) + 1; - if (index >= script.length) index = 0; - boolean refresh = true; - BlockStorage.addBlockInfo(b, "fuel", String.valueOf(fuel - 1)); - ScriptPart part = ScriptPart.valueOf(script[index]); - - if (getAndroidType().isType(part.getRequiredType())) { - switch (part) { - case GO_DOWN: { - try { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(BlockFace.DOWN); - move(b, face, block); - } catch (Exception e) { - e.printStackTrace(); - } - break; - } - case GO_FORWARD: { - try { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(face); - move(b, face, block); - } catch (Exception e) { - e.printStackTrace(); - } - break; - } - case GO_UP: { - try { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(BlockFace.UP); - move(b, face, block); - } catch (Exception e) { - e.printStackTrace(); - } - break; - } - case REPEAT: { - BlockStorage.addBlockInfo(b, "index", String.valueOf(0)); - break; - } - case TURN_LEFT: { - int rotIndex = directions.indexOf(BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) - 1; - if (rotIndex < 0) rotIndex = directions.size() - 1; - BlockFace dir = directions.get(rotIndex); - Rotatable blockData = (Rotatable) b.getBlockData(); - blockData.setRotation(dir); - b.setBlockData(blockData); - BlockStorage.addBlockInfo(b, "rotation", dir.toString()); - break; - } - case TURN_RIGHT: { - int rotIndex = directions.indexOf(BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) + 1; - if (rotIndex == directions.size()) rotIndex = 0; - BlockFace dir = directions.get(rotIndex); - Rotatable blockData = (Rotatable) b.getBlockData(); - blockData.setRotation(dir); - b.setBlockData(blockData); - BlockStorage.addBlockInfo(b, "rotation", dir.toString()); - break; - } - case DIG_FORWARD: { - Block block = b.getRelative(BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))); - mine(b, block); - break; - } - case DIG_UP: { - Block block = b.getRelative(BlockFace.UP); - mine(b, block); - break; - } - case DIG_DOWN: { - Block block = b.getRelative(BlockFace.DOWN); - mine(b, block); - break; - } - case CATCH_FISH: { - Block block = b.getRelative(BlockFace.DOWN); - if (block.getType().equals(Material.WATER)) { - block.getWorld().playSound(block.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1F, 1F); - if (CSCoreLib.randomizer().nextInt(100) < 10 * getTier()) { - ItemStack drop = fish[CSCoreLib.randomizer().nextInt(fish.length)]; - if (fits(b, drop)) pushItems(b, drop); - } - - } - break; - } - case MOVE_AND_DIG_FORWARD: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(face); - movedig(b, face, block); - break; - } - case MOVE_AND_DIG_UP: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(BlockFace.UP); - movedig(b, face, block); - break; - } - case MOVE_AND_DIG_DOWN: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(BlockFace.DOWN); - movedig(b, face, block); - break; - } - case INTERFACE_ITEMS: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(face); - if (BlockStorage.check(block, "ANDROID_INTERFACE_ITEMS") && block.getState() instanceof Dispenser) { - Dispenser d = (Dispenser) block.getState(); - for (int slot: getOutputSlots()) { - ItemStack stack = BlockStorage.getInventory(b).getItemInSlot(slot); - if (stack != null) { - Optional optional = d.getInventory().addItem(stack).values().stream().findFirst(); - - if (optional.isPresent()) { - BlockStorage.getInventory(b).replaceExistingItem(slot, optional.get()); - } - else { - BlockStorage.getInventory(b).replaceExistingItem(slot, null); - } - } - } - } - break; - } - case INTERFACE_FUEL: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(face); - if (BlockStorage.check(block, "ANDROID_INTERFACE_FUEL") && block.getState() instanceof Dispenser) { - Dispenser d = (Dispenser) block.getState(); - for (int slot = 0; slot < 9; slot++) { - ItemStack item = d.getInventory().getItem(slot); - if (item != null) { - if (BlockStorage.getInventory(b).getItemInSlot(43) == null) { - BlockStorage.getInventory(b).replaceExistingItem(43, item); - d.getInventory().setItem(slot, null); - break; - } - else if (SlimefunManager.isItemSimiliar(item, BlockStorage.getInventory(b).getItemInSlot(43), true)) { - int rest = item.getType().getMaxStackSize() - BlockStorage.getInventory(b).getItemInSlot(43).getAmount(); - if (rest > 0) { - int amt = item.getAmount() > rest ? rest: item.getAmount(); - BlockStorage.getInventory(b).replaceExistingItem(43, new CustomItem(item, BlockStorage.getInventory(b).getItemInSlot(43).getAmount() + amt)); - d.getInventory().setItem(slot, InvUtils.decreaseItem(item, amt)); - } - break; - } - } - } - } - break; - } - case FARM_FORWARD: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(face); - farm(b, block); - break; - } - case FARM_DOWN: { - Block block = b.getRelative(BlockFace.DOWN); - farm(b, block); - break; - } - case FARM_EXOTIC_FORWARD: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(face); - exoticFarm(b, block); - break; - } - case FARM_EXOTIC_DOWN: { - Block block = b.getRelative(BlockFace.DOWN); - exoticFarm(b, block); - break; - } - case CHOP_TREE: { - BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); - Block block = b.getRelative(face); - if (MaterialHelper.isLog( block.getType())) { - List list = new ArrayList(); - list.add(block.getLocation()); - TreeCalculator.getTree(block.getLocation(), block.getLocation(), list); - if (!list.isEmpty()) { - refresh = false; - Block log = list.get(list.size() - 1).getBlock(); - Collection drops = log.getDrops(); - log.getWorld().playEffect(log.getLocation(), Effect.STEP_SOUND, log.getType()); - if (!drops.isEmpty() && CSCoreLib.getLib().getProtectionManager().canBuild(UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), log)) { - ItemStack[] items = drops.toArray(new ItemStack[drops.size()]); - if (fits(b, items)) { - pushItems(b, items); - log.getWorld().playEffect(log.getLocation(), Effect.STEP_SOUND, log.getType()); - if (log.getY() == block.getY()) { - log.setType(MaterialHelper.getSaplingFromLog(log.getType())); - } - else log.setType(Material.AIR); - } - - } - } - } - break; - } - case ATTACK_MOBS_ANIMALS: { - double damage = getTier() < 2 ? 20D : 4D * getTier(); - - entities: - for (Entity n: AndroidStatusHologram.getNearbyEntities(b, 4D + getTier())) { - switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) { - case NORTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case EAST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case SOUTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case WEST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - default: - break; - } - } - break; - } - case ATTACK_MOBS: { - double damage = getTier() < 2 ? 20D : 4D * getTier(); - - entities: - for (Entity n: AndroidStatusHologram.getNearbyEntities(b, 4D + getTier())) { - if (n instanceof Animals) continue; - switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) { - case NORTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case EAST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case SOUTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case WEST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - default: - break; - } - } - break; - } - - case ATTACK_ANIMALS: { - double damage = getTier() < 2 ? 20D : 4D * getTier(); - - entities: - for (Entity n: AndroidStatusHologram.getNearbyEntities(b, 4D + getTier())) { - if (n instanceof Monster) continue; - switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) { - case NORTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case EAST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case SOUTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case WEST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - default: - break; - } - } - break; - } - - case ATTACK_ANIMALS_ADULT: { - double damage = getTier() < 2 ? 20D : 4D * getTier(); - - entities: - for (Entity n: AndroidStatusHologram.getNearbyEntities(b, 4D + getTier())) { - if (n instanceof Monster) continue; - if (n instanceof org.bukkit.entity.Ageable && !((org.bukkit.entity.Ageable) n).isAdult()) continue; - switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) { - case NORTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case EAST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case SOUTH: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - case WEST: { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) { - if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance); - n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b))); - - ((LivingEntity) n).damage(damage); - break entities; - } - break; - } - default: - break; - } - } - break; - } - default: - break; - } - } - if (refresh) BlockStorage.addBlockInfo(b, "index", String.valueOf(index)); - } - } - } - - private void move(Block b, BlockFace face, Block block) throws Exception { - if (block.getY() < 0 || block.getY() > block.getWorld().getMaxHeight()) - return; - if (block.getType() == Material.AIR || block.getType() == Material.CAVE_AIR) { - block.setType(Material.PLAYER_HEAD); - Rotatable blockData = (Rotatable) block.getBlockData(); - blockData.setRotation(face.getOppositeFace()); - block.setBlockData(blockData); - CustomSkull.setSkull(block, CustomSkull.getTexture(getItem())); - b.setType(Material.AIR); - BlockStorage.moveBlockInfo(b.getLocation(), block.getLocation()); - } - } - - private void mine(Block b, Block block) { - Collection drops = block.getDrops(); - if (!blockblacklist.contains(block.getType()) && !drops.isEmpty() && CSCoreLib.getLib().getProtectionManager().canBuild(UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), block)) { - SlimefunItem item = BlockStorage.check(block); - - if (item != null) { - return; - /*if (fits(b, item.getItem())) { - if (SlimefunItem.blockhandler.containsKey(item.getID())) { - if (SlimefunItem.blockhandler.get(item.getID()).onBreak(null, block, item, UnregisterReason.ANDROID_DIG)) { - pushItems(b, BlockStorage.retrieve(block)); - if (SlimefunItem.blockhandler.containsKey(item.getID())) SlimefunItem.blockhandler.get(item.getID()).onBreak(null, block, item, UnregisterReason.ANDROID_DIG); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - block.setType(Material.AIR); - } - } - }*/ - } else { - ItemStack[] items = drops.toArray(new ItemStack[drops.size()]); - if (fits(b, items)) { - pushItems(b, items); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - block.setType(Material.AIR); - } - } - } - } - - - private void movedig(Block b, BlockFace face, Block block) { - Collection drops = block.getDrops(); - if (!blockblacklist.contains(block.getType()) && !drops.isEmpty() && CSCoreLib.getLib().getProtectionManager().canBuild(UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), block)) { - try { - SlimefunItem item = BlockStorage.check(block); - if (item != null) { - if (fits(b, item.getItem())) { - if (SlimefunItem.blockhandler.containsKey(item.getID())) { - if (SlimefunItem.blockhandler.get(item.getID()).onBreak(null, block, item, UnregisterReason.ANDROID_DIG)) { - pushItems(b, BlockStorage.retrieve(block)); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - block.setType(Material.PLAYER_HEAD); - Rotatable blockData = (Rotatable) block.getBlockData(); - blockData.setRotation(face.getOppositeFace()); - block.setBlockData(blockData); - CustomSkull.setSkull(block, CustomSkull.getTexture(getItem())); - b.setType(Material.AIR); - BlockStorage.moveBlockInfo(b.getLocation(), block.getLocation()); - } - } - } - } - else { - ItemStack[] items = drops.toArray(new ItemStack[drops.size()]); - if (fits(b, items)) { - pushItems(b, items); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - block.setType(Material.PLAYER_HEAD); - Rotatable blockData = (Rotatable) block.getBlockData(); - blockData.setRotation(face.getOppositeFace()); - block.setBlockData(blockData); - CustomSkull.setSkull(block, CustomSkull.getTexture(getItem())); - b.setType(Material.AIR); - BlockStorage.moveBlockInfo(b.getLocation(), block.getLocation()); - } - } - } catch (Exception x) { - x.printStackTrace(); - } - } - else { - try { - move(b, face, block); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private boolean isFullGrown(Block block){ - Ageable ageable = ((Ageable) block.getBlockData()); - return ageable.getAge() >= ageable.getMaximumAge(); - } - - private void farm(Block b, Block block) { - switch (block.getType()) { - case WHEAT: { - if (isFullGrown(block)) { - ItemStack drop = new ItemStack(Material.WHEAT, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - Ageable ageable = (Ageable) block.getBlockData(); - ageable.setAge(0); - block.setBlockData(ageable); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case POTATOES: { - if (isFullGrown(block)) { - ItemStack drop = new ItemStack(Material.POTATO, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - Ageable ageable = (Ageable) block.getBlockData(); - ageable.setAge(0); - block.setBlockData(ageable); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case CARROTS: { - if (isFullGrown(block)) { - ItemStack drop = new ItemStack(Material.CARROT, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - Ageable ageable = (Ageable) block.getBlockData(); - ageable.setAge(0); - block.setBlockData(ageable); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case BEETROOTS: { - if (isFullGrown(block)) { - ItemStack drop = new ItemStack(Material.BEETROOT, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - Ageable ageable = (Ageable) block.getBlockData(); - ageable.setAge(0); - block.setBlockData(ageable); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case COCOA: { - if (isFullGrown(block)) { - ItemStack drop = new ItemStack(Material.COCOA_BEANS, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - Ageable ageable = (Ageable) block.getBlockData(); - ageable.setAge(0); - block.setBlockData(ageable); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case NETHER_WART: { - if (isFullGrown(block)) { - ItemStack drop = new ItemStack(Material.NETHER_WART, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - Ageable ageable = (Ageable) block.getBlockData(); - ageable.setAge(0); - block.setBlockData(ageable); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - default: - break; - } - } - - private void exoticFarm(Block b, Block block) { - farm(b, block); - if (SlimefunStartup.instance.isExoticGardenInstalled()) { - ItemStack drop = ExoticGarden.harvestPlant(block); - if (drop != null && fits(b, drop)) { - pushItems(b, drop); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - } - - private void constructMenu(BlockMenuPreset preset) throws Exception { - 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 - ); - } - - 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; - } - }); - } - - if (getTier() == 1) { - preset.addItem(34, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&8\u21E9 &cFuel Input &8\u21E9", "", "&rThis Android runs on solid Fuel", "&re.g. Coal, Wood, etc..."), - (p, slot, item, action) -> false - ); - } - else if (getTier() == 2){ - preset.addItem(34, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&8\u21E9 &cFuel Input &8\u21E9", "", "&rThis Android runs on liquid Fuel", "&re.g. Lava, Oil, Fuel, etc..."), - (p, slot, item, action) -> false - ); - } - else { - preset.addItem(34, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&8\u21E9 &cFuel Input &8\u21E9", "", "&rThis Android runs on radioactive Fuel", "&re.g. Uranium, Neptunium or Boosted Uranium"), - (p, slot, item, action) -> false - ); - } - } - - public void openScriptEditor(Player p, final Block b) throws Exception { - ChestMenu menu = new ChestMenu("&eScript Editor"); - - menu.addItem(1, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDliZjZkYjRhZWRhOWQ4ODIyYjlmNzM2NTM4ZThjMThiOWE0ODQ0Zjg0ZWI0NTUwNGFkZmJmZWU4N2ViIn19fQ=="), "&2> Edit Script", "", "&aEdits your current Script"), - (pl, slot, item, action) -> { - try { - openScript(pl, b, BlockStorage.getLocationInfo(b.getLocation(), "script")); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - ); - - menu.addItem(3, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTcxZDg5NzljMTg3OGEwNTk4N2E3ZmFmMjFiNTZkMWI3NDRmOWQwNjhjNzRjZmZjZGUxZWExZWRhZDU4NTIifX19"), "&4> Create new Script", "", "&cDeletes your current Script", "&cand creates a blank one"), - (pl, slot, item, action) -> { - try { - openScript(pl, b, "START-TURN_LEFT-REPEAT"); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - ); - - menu.addItem(5, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzAxNTg2ZTM5ZjZmZmE2M2I0ZmIzMDFiNjVjYTdkYThhOTJmNzM1M2FhYWI4OWQzODg2NTc5MTI1ZGZiYWY5In19fQ=="), "&6> Download a Script", "", "&eDownload a Script from the Server", "&eYou can edit or simply use it"), - (pl, slot, item, action) -> { - try { - openScriptDownloader(pl, b, 1); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - ); - - menu.addItem(8, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTE4NWM5N2RiYjgzNTNkZTY1MjY5OGQyNGI2NDMyN2I3OTNhM2YzMmE5OGJlNjdiNzE5ZmJlZGFiMzVlIn19fQ=="), "&6> Back", "", "&7Return to the Android's interface"), - (pl, slot, item, action) -> { - try { - BlockStorage.getInventory(b).open(p); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - ); - - menu.open(p); - } - - public void openScript(final Player p, final Block b, final String script) throws Exception { - ChestMenu menu = new ChestMenu("&eScript Editor"); - final String[] commands = script.split("-"); - - menu.addItem(0, new CustomItem(ScriptPart.START.toItemStack(), ScriptPart.START.toItemStack().getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to return to the Android's interface")); - menu.addMenuClickHandler(0, (pl, slot, item, action) -> { - BlockStorage.getInventory(b).open(pl); - return false; - }); - - for (int i = 1; i < commands.length; i++) { - final int index = i; - if (i == commands.length - 1) { - int additional = commands.length == 54 ? 0: 1; - - if (additional == 1) { - menu.addItem(i, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTcxZDg5NzljMTg3OGEwNTk4N2E3ZmFmMjFiNTZkMWI3NDRmOWQwNjhjNzRjZmZjZGUxZWExZWRhZDU4NTIifX19"), "&7> Add new Command")); - menu.addMenuClickHandler(i, (pl, slot, item, action) -> { - try { - openScriptComponentEditor(pl, b, script, index); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - }); - } - - menu.addItem(i + additional, new CustomItem(ScriptPart.REPEAT.toItemStack(), ScriptPart.REPEAT.toItemStack().getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to return to the Android's interface")); - menu.addMenuClickHandler(i + additional, (pl, slot, item, action) -> { - BlockStorage.getInventory(b).open(pl); - return false; - }); - } - else { - ItemStack stack = ScriptPart.valueOf(commands[i]).toItemStack(); - menu.addItem(i, new CustomItem(stack, stack.getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to edit", "&7\u21E8 &eRight Click &7to delete", "&7\u21E8 &eShift + Right Click &7to duplicate")); - menu.addMenuClickHandler(i, (pl, slot, item, action) -> { - if (action.isRightClicked() && action.isShiftClicked()) { - if (commands.length == 54) return false; - - int j = 0; - StringBuilder builder = new StringBuilder("START-"); - for (String command : commands) { - if (j > 0) { - if (j == index) { - builder.append(commands[j] + "-"); - builder.append(commands[j] + "-"); - } - else if (j < commands.length - 1) builder.append(command + "-"); - } - j++; - } - builder.append("REPEAT"); - BlockStorage.addBlockInfo(b, "script", builder.toString()); - - try { - openScript(pl, b, builder.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - else if (action.isRightClicked()) { - int j = 0; - StringBuilder builder = new StringBuilder("START-"); - for (String command : commands) { - if (j != index && j > 0 && j < commands.length - 1) builder.append(command + "-"); - j++; - } - builder.append("REPEAT"); - BlockStorage.addBlockInfo(b, "script", builder.toString()); - try { - openScript(pl, b, builder.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - else { - try { - openScriptComponentEditor(pl, b, script, index); - } catch (Exception e) { - e.printStackTrace(); - } - } - return false; - }); - } - } - - menu.open(p); - } - - private void openScriptDownloader(final Player p, final Block b, final int page) throws Exception { - final ChestMenu menu = new ChestMenu("Android Scripts"); - - menu.addMenuOpeningHandler( - (pl) -> pl.playSound(pl.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 0.7F, 0.7F) - ); - - List scripts = getUploadedScripts(); - - int index = 0; - final int pages = (scripts.size() / 45) + 1; - - for (int i = 45; i < 54; i++) { - menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " ")); - menu.addMenuClickHandler(i, - (pl, slot, item, action) -> false - ); - } - - menu.addItem(46, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&r\u21E6 Previous Page", "", "&7(" + page + " / " + pages + ")")); - menu.addMenuClickHandler(46, (pl, slot, item, action) -> { - int next = page - 1; - if (next < 1) next = pages; - if (next != page) { - try { - openScriptDownloader(pl, b, next); - } catch (Exception e) { - e.printStackTrace(); - } - } - return false; - }); - - menu.addItem(48, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTA1YTJjYWI4YjY4ZWE1N2UzYWY5OTJhMzZlNDdjOGZmOWFhODdjYzg3NzYyODE5NjZmOGMzY2YzMWEzOCJ9fX0="), "&eUpload a Script", "", "&6Click &7to upload your Android's Script", "&7to the Database")); - menu.addMenuClickHandler(48, (pl, slot, item, action) -> { - final String code = BlockStorage.getLocationInfo(b.getLocation(), "script"); - int num = 1; - - for (Config script: getUploadedScripts()) { - if (script.getString("author").equals(pl.getUniqueId().toString())) num++; - if (script.getString("code").equals(code)) { - Messages.local.sendTranslation(pl, "android.scripts.already-uploaded", true); - return false; - } - } - - final int id = num; - - pl.closeInventory(); - Messages.local.sendTranslation(pl, "android.scripts.enter-name", true); - - MenuHelper.awaitChatInput(pl, (player, message) -> { - Config script = new Config("plugins/Slimefun/scripts/" + getAndroidType().toString() + "/" + p.getName() + " " + id + ".sfs"); - - script.setValue("author", player.getUniqueId().toString()); - script.setValue("author_name", player.getName()); - script.setValue("name", ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', message))); - script.setValue("code", code); - script.setValue("downloads", 0); - script.setValue("android", getAndroidType().toString()); - script.setValue("rating.positive", new ArrayList()); - script.setValue("rating.negative", new ArrayList()); - script.save(); - - try { - Messages.local.sendTranslation(player, "android.uploaded", true); - openScriptDownloader(player, b, page); - } catch (Exception e) { - e.printStackTrace(); - } - - return false; - }); - return false; - }); - - menu.addItem(50, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&rNext Page \u21E8", "", "&7(" + page + " / " + pages + ")")); - menu.addMenuClickHandler(50, (pl, slot, item, action) -> { - int next = page + 1; - if (next > pages) next = 1; - if (next != page) { - try { - openScriptDownloader(pl, b, next); - } catch (Exception e) { - e.printStackTrace(); - } - } - return false; - }); - - menu.addItem(53, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTE4NWM5N2RiYjgzNTNkZTY1MjY5OGQyNGI2NDMyN2I3OTNhM2YzMmE5OGJlNjdiNzE5ZmJlZGFiMzVlIn19fQ=="), "&6> Back", "", "&7Return to the Android's interface")); - menu.addMenuClickHandler(53, (pl, slot, item, action) -> { - try { - openScriptEditor(pl, b); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - }); - - int category_index = 45 * (page - 1); - for (int i = 0; i < 45; i++) { - int target = category_index + i; - if (target >= scripts.size()) break; - else { - final Config script = scripts.get(target); - - OfflinePlayer op = Bukkit.getOfflinePlayer(script.getUUID("author")); - String author = (op != null && op.getName() != null) ? op.getName(): script.getString("author_name"); - - if (script.getString("author").equals(p.getUniqueId().toString())) { - menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)")); - } - else { - menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)", "&eShift + Left Click &rto leave a positive Rating", "&eShift + Right Click &rto leave a negative Rating")); - } - - menu.addMenuClickHandler(index, (pl, slot, item, action) -> { - Config script2 = new Config(script.getFile()); - - if (action.isShiftClicked()) { - if (script2.getString("author").equals(pl.getUniqueId().toString())) { - Messages.local.sendTranslation(pl, "android.scripts.rating.own", true); - } - else if (action.isRightClicked()) { - if (!script2.getStringList("rating.negative").contains(pl.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(pl.getUniqueId().toString())) { - List list = script2.getStringList("rating.negative"); - list.add(p.getUniqueId().toString()); - - script2.setValue("rating.negative", list); - script2.save(); - - try { - openScriptDownloader(pl, b, page); - } catch (Exception e) { - e.printStackTrace(); - } - } - else { - Messages.local.sendTranslation(pl, "android.scripts.rating.already", true); - } - } - else { - if (!script2.getStringList("rating.negative").contains(pl.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(pl.getUniqueId().toString())) { - List list = script2.getStringList("rating.positive"); - list.add(pl.getUniqueId().toString()); - - script2.setValue("rating.positive", list); - script2.save(); - - try { - openScriptDownloader(pl, b, page); - } catch (Exception e) { - e.printStackTrace(); - } - } - else { - Messages.local.sendTranslation(pl, "android.scripts.rating.already", true); - } - } - } - else if (!action.isRightClicked()) { - try { - script2.setValue("downloads", script2.getInt("downloads") + 1); - script2.save(); - - BlockStorage.addBlockInfo(b, "script", script2.getString("code")); - openScriptEditor(pl, b); - } catch (Exception e) { - e.printStackTrace(); - } - } - return false; - }); - - index++; - } - } - - menu.open(p); - } - - public float getScriptRating(Config script) { - int positive = getScriptRating(script, true) + 1; - int negative = getScriptRating(script, false); - return Math.round((positive / (double) (positive + negative)) * 100.0f) / 100.0f; - } - - private int getScriptRating(Config script, boolean positive) { - if (positive) return script.getStringList("rating.positive").size(); - else return script.getStringList("rating.negative").size(); - } - - private String getScriptRatingPercentage(Config script) { - String progress = String.valueOf(getScriptRating(script)); - if (Float.parseFloat(progress) < 16.0F) progress = "&4" + progress + "&r% "; - else if (Float.parseFloat(progress) < 32.0F) progress = "&c" + progress + "&r% "; - else if (Float.parseFloat(progress) < 48.0F) progress = "&6" + progress + "&r% "; - else if (Float.parseFloat(progress) < 64.0F) progress = "&e" + progress + "&r% "; - else if (Float.parseFloat(progress) < 80.0F) progress = "&2" + progress + "&r% "; - else progress = "&a" + progress + "&r% "; - - return progress; - } - - protected void openScriptComponentEditor(Player p, final Block b, final String script, final int index) throws Exception { - ChestMenu menu = new ChestMenu("&eScript Editor"); - - final String[] commands = script.split("-"); - - for (int i = 0; i < 9; i++) { - menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), - (pl, slot, item, action) -> false - ); - } - - menu.addItem(9, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTYxMzlmZDFjNTY1NGU1NmU5ZTRlMmM4YmU3ZWIyYmQ1YjQ5OWQ2MzM2MTY2NjNmZWVlOTliNzQzNTJhZDY0In19fQ=="), "&rDo nothing"), - (pl, slot, item, action) -> { - int i = 0; - StringBuilder builder = new StringBuilder("START-"); - for (String command : commands) { - if (i != index && i > 0 && i < commands.length - 1) builder.append(command + "-"); - i++; - } - builder.append("REPEAT"); - BlockStorage.addBlockInfo(b, "script", builder.toString()); - try { - openScript(p, b, builder.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - ); - - int i = 10; - for (final ScriptPart part : getAccessibleScriptParts()) { - menu.addItem(i, part.toItemStack(), - (pl, slot, item, action) -> { - int j = 0; - StringBuilder builder = new StringBuilder("START-"); - for (String command : commands) { - if (j > 0) { - if (j == index) builder.append(part.toString() + "-"); - else if (j < commands.length - 1) builder.append(command + "-"); - } - j++; - } - builder.append("REPEAT"); - BlockStorage.addBlockInfo(b, "script", builder.toString()); - - try { - openScript(pl, b, builder.toString()); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - ); - i++; - } - - menu.open(p); - } - - 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++) { - inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); - } - 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)); - } - } - - public void addItems(Block b, ItemStack... items) { - this.pushItems(b, items); - } - - @Override - public void register(boolean slimefun) { - addItemHandler(new BlockTicker() { - - @Override - public void tick(Block b, SlimefunItem sf, Config data) { - if (b != null) ProgrammableAndroid.this.tick(b); - } - - @Override - public void uniqueTick() { - } - - @Override - public boolean isSynchronized() { - return true; - } - }); - - super.register(slimefun); - } - - public void registerFuel(MachineFuel fuel) { - this.recipes.add(fuel); - } - - public List getUploadedScripts() { - List scripts = new ArrayList(); - - File directory = new File("plugins/Slimefun/scripts/" + this.getAndroidType().toString()); - if (!directory.exists()) directory.mkdirs(); - - for (File script : directory.listFiles()) { - if (script.getName().endsWith("sfs")) scripts.add(new Config(script)); - } - - if (!this.getAndroidType().equals(AndroidType.NONE)) { - File directory2 = new File("plugins/Slimefun/scripts/NONE"); - if (!directory2.exists()) directory2.mkdirs(); - - for (File script : directory2.listFiles()) { - if (script.getName().endsWith("sfs")) scripts.add(new Config(script)); - } - } - - Collections.sort(scripts, new ScriptReputationSorter(this)); - - return scripts; - } - - public List getAccessibleScriptParts() { - List list = new ArrayList(); - - for (final ScriptPart part : ScriptPart.values()) { - if (!part.equals(ScriptPart.START) && !part.equals(ScriptPart.REPEAT) && getAndroidType().isType(part.getRequiredType())) { - list.add(part); - } - } - - return list; - } - -} diff --git a/src/me/mrCookieSlime/Slimefun/CSCoreLibSetup/CSCoreLibLoader.java b/src/me/mrCookieSlime/Slimefun/CSCoreLibSetup/CSCoreLibLoader.java deleted file mode 100644 index ce5cce8e4..000000000 --- a/src/me/mrCookieSlime/Slimefun/CSCoreLibSetup/CSCoreLibLoader.java +++ /dev/null @@ -1,151 +0,0 @@ -package me.mrCookieSlime.Slimefun.CSCoreLibSetup; - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import org.bukkit.plugin.Plugin; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class CSCoreLibLoader { - - Plugin plugin; - URL url; - URL download; - File file; - - public CSCoreLibLoader(Plugin plugin) { - this.plugin = plugin; - try { - this.url = new URL("https://api.curseforge.com/servermods/files?projectIds=88802"); - } catch (MalformedURLException e) { - } - } - - public boolean load() { - if (plugin.getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) return true; - else { - System.err.println(" "); - System.err.println("#################### - INFO - ####################"); - System.err.println(" "); - System.err.println(plugin.getName() + " could not be loaded."); - System.err.println("It appears that you have not installed CS-CoreLib"); - System.err.println("Your Server will now try to download and install"); - System.err.println("CS-CoreLib for you."); - System.err.println("You will be asked to restart your Server when it's finished."); - System.err.println("If this somehow fails, please download and install CS-CoreLib manually:"); - System.err.println("https://dev.bukkit.org/projects/cs-corelib"); - System.err.println(" "); - System.err.println("#################### - INFO - ####################"); - System.err.println(" "); - plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { - if (connect()) install(); - }, 10L); - return false; - } - } - - private boolean connect() { - try { - final URLConnection connection = this.url.openConnection(); - connection.setConnectTimeout(5000); - connection.addRequestProperty("User-Agent", "CS-CoreLib Loader (by mrCookieSlime)"); - connection.setDoOutput(true); - - final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); - final JsonArray array = new JsonParser().parse(reader).getAsJsonArray(); - final JsonObject json = array.get(array.size() - 1).getAsJsonObject(); - - download = traceURL(json.get("downloadUrl").getAsString().replace("https:", "http:")); - file = new File("plugins/" + json.get("name").getAsString() + ".jar"); - - return true; - } catch (IOException e) { - System.err.println(" "); - System.err.println("#################### - WARNING - ####################"); - System.err.println(" "); - System.err.println("Could not connect to BukkitDev."); - System.err.println("Please download & install CS-CoreLib manually:"); - System.err.println("https://dev.bukkit.org/projects/cs-corelib"); - System.err.println(" "); - System.err.println("#################### - WARNING - ####################"); - System.err.println(" "); - return false; - } - } - - private URL traceURL(String location) throws IOException { - HttpURLConnection connection = null; - - while (true) { - URL url = new URL(location); - connection = (HttpURLConnection) url.openConnection(); - - connection.setInstanceFollowRedirects(false); - connection.setConnectTimeout(5000); - connection.addRequestProperty("User-Agent", "Auto Updater (by mrCookieSlime)"); - - switch (connection.getResponseCode()) { - case HttpURLConnection.HTTP_MOVED_PERM: - case HttpURLConnection.HTTP_MOVED_TEMP: - String loc = connection.getHeaderField("Location"); - location = new URL(new URL(location), loc).toExternalForm(); - continue; - } - break; - } - - return new URL(connection.getURL().toString().replaceAll(" ", "%20")); - } - - private void install() { - BufferedInputStream input = null; - FileOutputStream output = null; - try { - input = new BufferedInputStream(download.openStream()); - output = new FileOutputStream(file); - - final byte[] data = new byte[1024]; - int read; - while ((read = input.read(data, 0, 1024)) != -1) { - output.write(data, 0, read); - } - } catch (Exception ex) { - System.err.println(" "); - System.err.println("#################### - WARNING - ####################"); - System.err.println(" "); - System.err.println("Failed to download CS-CoreLib"); - System.err.println("Please download & install CS-CoreLib manually:"); - System.err.println("https://dev.bukkit.org/projects/cs-corelib"); - System.err.println(" "); - System.err.println("#################### - WARNING - ####################"); - System.err.println(" "); - } finally { - try { - if (input != null) input.close(); - if (output != null) output.close(); - System.err.println(" "); - System.err.println("#################### - INFO - ####################"); - System.err.println(" "); - System.err.println("Please restart your Server to finish the Installation"); - System.err.println("of " + plugin.getName() + " and CS-CoreLib"); - System.err.println(" "); - System.err.println("#################### - INFO - ####################"); - System.err.println(" "); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - -} diff --git a/src/me/mrCookieSlime/Slimefun/Events/MultiBlockInteractEvent.java b/src/me/mrCookieSlime/Slimefun/Events/MultiBlockInteractEvent.java index 77740205b..0737cc11d 100644 --- a/src/me/mrCookieSlime/Slimefun/Events/MultiBlockInteractEvent.java +++ b/src/me/mrCookieSlime/Slimefun/Events/MultiBlockInteractEvent.java @@ -12,18 +12,18 @@ public class MultiBlockInteractEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); - Player p; - MultiBlock mb; - Block b; - boolean cancelled; + private Player p; + private MultiBlock mb; + private Block b; + private boolean cancelled; public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { - return handlers; - } + return handlers; + } public MultiBlockInteractEvent(Player p, MultiBlock mb, Block clicked) { this.p = p; diff --git a/src/me/mrCookieSlime/Slimefun/Events/ResearchUnlockEvent.java b/src/me/mrCookieSlime/Slimefun/Events/ResearchUnlockEvent.java index 474fd2ffe..9b2ba24aa 100644 --- a/src/me/mrCookieSlime/Slimefun/Events/ResearchUnlockEvent.java +++ b/src/me/mrCookieSlime/Slimefun/Events/ResearchUnlockEvent.java @@ -11,17 +11,17 @@ public class ResearchUnlockEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); - Player p; - Research r; - boolean cancelled; + private Player p; + private Research r; + private boolean cancelled; public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { - return handlers; - } + return handlers; + } public ResearchUnlockEvent(Player p, Research res) { this.p = p; diff --git a/src/me/mrCookieSlime/Slimefun/GEO/OreGenResource.java b/src/me/mrCookieSlime/Slimefun/GEO/OreGenResource.java index 012d1058f..71e50e7c0 100644 --- a/src/me/mrCookieSlime/Slimefun/GEO/OreGenResource.java +++ b/src/me/mrCookieSlime/Slimefun/GEO/OreGenResource.java @@ -5,16 +5,24 @@ import org.bukkit.inventory.ItemStack; public interface OreGenResource { - // Returns the default supply of this resource in that biome - public int getDefaultSupply(Biome biome); + /** + * Returns the default supply of this resource in that biome + */ + int getDefaultSupply(Biome biome); - // Name/ID e.g. "Oil" - public String getName(); + /** + * Name/ID e.g. "Oil" + */ + String getName(); - // For the GEO-Scanner - public ItemStack getIcon(); + /** + * For the GEO-Scanner + */ + ItemStack getIcon(); - // Measurement Unit e.g. "Buckets" - public String getMeasurementUnit(); + /** + * Measurement Unit e.g. "Buckets" + */ + String getMeasurementUnit(); } diff --git a/src/me/mrCookieSlime/Slimefun/GEO/OreGenSystem.java b/src/me/mrCookieSlime/Slimefun/GEO/OreGenSystem.java index fe547c8a4..31c75f4de 100644 --- a/src/me/mrCookieSlime/Slimefun/GEO/OreGenSystem.java +++ b/src/me/mrCookieSlime/Slimefun/GEO/OreGenSystem.java @@ -1,26 +1,27 @@ package me.mrCookieSlime.Slimefun.GEO; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.logging.Level; import org.bukkit.Chunk; import org.bukkit.block.Biome; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; -public class OreGenSystem { +public final class OreGenSystem { - public static Map map = new HashMap<>(); + private OreGenSystem() {} public static Collection listResources() { - return map.values(); + return SlimefunPlugin.getUtilities().resources.values(); } public static void registerResource(OreGenResource resource) { - map.put(resource.getName(), resource); - System.out.println("[Slimefun - GEO] Registering Ore Gen: " + resource.getName()); + SlimefunPlugin.getUtilities().resources.put(resource.getName(), resource); + Slimefun.getLogger().log(Level.INFO, "Registering Ore Gen: " + resource.getName()); Config cfg = new Config("plugins/Slimefun/generators/" + resource.getName() + ".cfg"); for (Biome biome: Biome.values()) { @@ -30,7 +31,7 @@ public class OreGenSystem { } public static OreGenResource getResource(String name) { - return map.get(name); + return SlimefunPlugin.getUtilities().resources.get(name); } private static int getDefault(OreGenResource resource, Biome biome) { diff --git a/src/me/mrCookieSlime/Slimefun/GEO/Resources/NetherIceResource.java b/src/me/mrCookieSlime/Slimefun/GEO/resources/NetherIceResource.java similarity index 79% rename from src/me/mrCookieSlime/Slimefun/GEO/Resources/NetherIceResource.java rename to src/me/mrCookieSlime/Slimefun/GEO/resources/NetherIceResource.java index 3445c3bdd..2a86ea450 100644 --- a/src/me/mrCookieSlime/Slimefun/GEO/Resources/NetherIceResource.java +++ b/src/me/mrCookieSlime/Slimefun/GEO/resources/NetherIceResource.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.GEO.Resources; +package me.mrCookieSlime.Slimefun.GEO.resources; import org.bukkit.block.Biome; import org.bukkit.inventory.ItemStack; @@ -10,14 +10,7 @@ public class NetherIceResource implements OreGenResource { @Override public int getDefaultSupply(Biome biome) { - switch (biome) { - case NETHER: { - return 32; - } - default: { - return 0; - } - } + return biome == Biome.NETHER ? 32: 0; } @Override diff --git a/src/me/mrCookieSlime/Slimefun/GEO/Resources/OilResource.java b/src/me/mrCookieSlime/Slimefun/GEO/resources/OilResource.java similarity index 85% rename from src/me/mrCookieSlime/Slimefun/GEO/Resources/OilResource.java rename to src/me/mrCookieSlime/Slimefun/GEO/resources/OilResource.java index 16817b518..cac4cbd09 100644 --- a/src/me/mrCookieSlime/Slimefun/GEO/Resources/OilResource.java +++ b/src/me/mrCookieSlime/Slimefun/GEO/resources/OilResource.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.GEO.Resources; +package me.mrCookieSlime.Slimefun.GEO.resources; import org.bukkit.block.Biome; import org.bukkit.inventory.ItemStack; @@ -14,35 +14,30 @@ public class OilResource implements OreGenResource { switch (biome) { case SNOWY_BEACH: case STONE_SHORE: - case BEACH: { + case BEACH: return CSCoreLib.randomizer().nextInt(6) + 2; - } case DESERT: case DESERT_HILLS: - case DESERT_LAKES: { + case DESERT_LAKES: return CSCoreLib.randomizer().nextInt(40) + 19; - } case MOUNTAINS: case GRAVELLY_MOUNTAINS: case MOUNTAIN_EDGE: - case RIVER: { + case RIVER: return CSCoreLib.randomizer().nextInt(14) + 13; - } case SNOWY_MOUNTAINS: case SNOWY_TUNDRA: case ICE_SPIKES: case FROZEN_OCEAN: - case FROZEN_RIVER: { + case FROZEN_RIVER: return CSCoreLib.randomizer().nextInt(11) + 3; - } case THE_END: - case NETHER: { + case NETHER: return 0; - } case BADLANDS: @@ -52,24 +47,20 @@ public class OilResource implements OreGenResource { case MODIFIED_BADLANDS_PLATEAU: case MODIFIED_WOODED_BADLANDS_PLATEAU: case MUSHROOM_FIELDS: - case MUSHROOM_FIELD_SHORE: { + case MUSHROOM_FIELD_SHORE: return CSCoreLib.randomizer().nextInt(24) + 14; - } case DEEP_OCEAN: - case OCEAN: { + case OCEAN: return CSCoreLib.randomizer().nextInt(62) + 24; - } case SWAMP: - case SWAMP_HILLS: { + case SWAMP_HILLS: return CSCoreLib.randomizer().nextInt(20) + 4; - } - default: { + default: return CSCoreLib.randomizer().nextInt(10) + 6; } - } } @Override diff --git a/src/me/mrCookieSlime/Slimefun/GPS/Elevator.java b/src/me/mrCookieSlime/Slimefun/GPS/Elevator.java index 175259f84..88ecba204 100644 --- a/src/me/mrCookieSlime/Slimefun/GPS/Elevator.java +++ b/src/me/mrCookieSlime/Slimefun/GPS/Elevator.java @@ -1,7 +1,6 @@ package me.mrCookieSlime.Slimefun.GPS; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; import java.util.UUID; import org.bukkit.ChatColor; @@ -16,13 +15,14 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.CustomBookOverlay; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.MenuHelper; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; -public class Elevator { - - public static List ignored = new ArrayList<>(); +public final class Elevator { + private Elevator() {} + public static void openEditor(Player p, final Block b) { ChestMenu menu = new ChestMenu("Elevator Settings"); @@ -35,7 +35,7 @@ public class Elevator { pl.sendMessage(""); MenuHelper.awaitChatInput(pl, (player, message) -> { - BlockStorage.addBlockInfo(b, "floor", message.replaceAll("&", "&")); + BlockStorage.addBlockInfo(b, "floor", message.replace(ChatColor.COLOR_CHAR, '&')); player.sendMessage(""); player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &eSuccessfully named this Floor:")); @@ -53,8 +53,10 @@ public class Elevator { } public static void openDialogue(Player p, Block b) { - if (ignored.contains(p.getUniqueId())) { - ignored.remove(p.getUniqueId()); + Set elevatorUsers = SlimefunPlugin.getUtilities().elevatorUsers; + + if (elevatorUsers.contains(p.getUniqueId())) { + elevatorUsers.remove(p.getUniqueId()); return; } diff --git a/src/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java b/src/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java index 46214dad7..bc0425cc4 100644 --- a/src/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java +++ b/src/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -24,6 +25,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.MenuHelper; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.GEO.OreGenResource; import me.mrCookieSlime.Slimefun.GEO.OreGenSystem; import me.mrCookieSlime.Slimefun.Setup.Messages; @@ -35,17 +37,21 @@ public class GPSNetwork { private int[] border = new int[] {0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; private int[] inventory = new int[] {19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43}; - public void updateTransmitter(Block b, UUID uuid, NetworkStatus status) { + private static final int[] teleporter_border = new int[] {0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; + private static final int[] teleporter_inventory = new int[] {19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43}; + + public void updateTransmitter(Location l, UUID uuid, NetworkStatus status) { Set set = new HashSet<>(); if (transmitters.containsKey(uuid)) set = transmitters.get(uuid); - if (status.equals(NetworkStatus.ONLINE)) { - if (!set.contains(b.getLocation())) { - set.add(b.getLocation()); + + if (status == NetworkStatus.ONLINE) { + if (!set.contains(l)) { + set.add(l); transmitters.put(uuid, set); } } else { - set.remove(b.getLocation()); + set.remove(l); transmitters.put(uuid, set); } } @@ -64,7 +70,7 @@ public class GPSNetwork { else return transmitters.get(uuid).size(); } - public void openTransmitterControlPanel(Player p) throws Exception { + public void openTransmitterControlPanel(Player p) { ChestMenu menu = new ChestMenu("&9Control Panel"); for (int slot : border) { @@ -73,37 +79,35 @@ public class GPSNetwork { ); } - menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &e(Selected)")); - menu.addMenuClickHandler(2, - (pl, slot, item, action) -> false - ); - - menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&7Network Info", "", "&8\u21E8 &7Status: " + (getNetworkComplexity(p.getUniqueId()) > 0 ? "&2&lONLINE": "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + getNetworkComplexity(p.getUniqueId()))); - menu.addMenuClickHandler(4, - (pl, slot, item, action) -> false - ); - - menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &r(Select)")); - menu.addMenuClickHandler(6, (pl, slot, item, action) -> { - try { - openWaypointControlPanel(pl); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - }); - - int index = 0; - for (Location l : getTransmitters(p.getUniqueId())) { - if (index >= inventory.length) break; - int slot = inventory[index]; - - menu.addItem(slot, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS Transmitter", "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &r" + l.getBlockY(), "&8\u21E8 &7Ping: &r" + DoubleHandler.fixDouble(1000D / l.getY()) + "ms")); - menu.addMenuClickHandler(slot, - (pl, slotn, item, action) -> false + try { + menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &e(Selected)")); + menu.addMenuClickHandler(2, + (pl, slot, item, action) -> false ); - index++; + menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&7Network Info", "", "&8\u21E8 &7Status: " + (getNetworkComplexity(p.getUniqueId()) > 0 ? "&2&lONLINE": "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + getNetworkComplexity(p.getUniqueId()))); + menu.addMenuClickHandler(4, + (pl, slot, item, action) -> false + ); + + menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &r(Select)")); + menu.addMenuClickHandler(6, (pl, slot, item, action) -> { + openWaypointControlPanel(pl); + return false; + }); + + int index = 0; + for (Location l : getTransmitters(p.getUniqueId())) { + if (index >= inventory.length) break; + int slot = inventory[index]; + + menu.addItem(slot, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS Transmitter", "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &r" + l.getBlockY(), "&8\u21E8 &7Ping: &r" + DoubleHandler.fixDouble(1000D / l.getY()) + "ms")); + menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> false); + + index++; + } + } catch(Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the GPS Transmitter Panel for Slimefun " + Slimefun.getVersion(), x); } menu.open(p); @@ -115,10 +119,10 @@ public class GPSNetwork { if (entry.getKey().startsWith("&4Deathpoint")) { return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWFlMzg1NWY5NTJjZDRhMDNjMTQ4YTk0NmUzZjgxMmE1OTU1YWQzNWNiY2I1MjYyN2VhNGFjZDQ3ZDMwODEifX19"); } - else if (l.getWorld().getEnvironment().equals(Environment.NETHER)) { + else if (l.getWorld().getEnvironment() == Environment.NETHER) { return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDgzNTcxZmY1ODlmMWE1OWJiMDJiODA4MDBmYzczNjExNmUyN2MzZGNmOWVmZWJlZGU4Y2YxZmRkZSJ9fX0="); } - else if (l.getWorld().getEnvironment().equals(Environment.THE_END)) { + else if (l.getWorld().getEnvironment() == Environment.THE_END) { return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzZjYWM1OWIyYWFlNDg5YWEwNjg3YjVkODAyYjI1NTVlYjE0YTQwYmQ2MmIyMWViMTE2ZmE1NjljZGI3NTYifX19"); } else { @@ -126,61 +130,53 @@ public class GPSNetwork { } } - public void openWaypointControlPanel(Player p) throws Exception { + public void openWaypointControlPanel(Player p) { ChestMenu menu = new ChestMenu("&9Control Panel"); for (int slot: border) { - menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), - (pl, slotn, item, action) -> false - ); + menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (pl, slotn, item, action) -> false); } - menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &r(Select)")); - menu.addMenuClickHandler(2, (pl, slot, item, action) -> { - try { + try { + menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &r(Select)")); + menu.addMenuClickHandler(2, (pl, slot, item, action) -> { openTransmitterControlPanel(pl); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - }); - - menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&7Network Info", "", "&8\u21E8 &7Status: " + (getNetworkComplexity(p.getUniqueId()) > 0 ? "&2&lONLINE": "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + getNetworkComplexity(p.getUniqueId()))); - menu.addMenuClickHandler(4, - (pl, slot, item, action) -> false - ); - - menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Selected)")); - menu.addMenuClickHandler(6, - (pl, slot, item, action) -> false - ); - - int index = 0; - for (final Map.Entry entry : getWaypoints(p.getUniqueId()).entrySet()) { - if (index >= inventory.length) break; - int slot = inventory[index]; - - Location l = entry.getValue(); - ItemStack globe = getPlanet(entry); - - menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &cClick to delete")); - menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> { - String id = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', entry.getKey())).toUpperCase().replace(" ", "_"); - Config cfg = new Config("data-storage/Slimefun/waypoints/" + pl.getUniqueId().toString() + ".yml"); - cfg.setValue(id, null); - cfg.save(); - pl.playSound(pl.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F); - try { - openWaypointControlPanel(pl); - } catch (Exception e) { - e.printStackTrace(); - } return false; }); - index++; + menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&7Network Info", "", "&8\u21E8 &7Status: " + (getNetworkComplexity(p.getUniqueId()) > 0 ? "&2&lONLINE": "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + getNetworkComplexity(p.getUniqueId()))); + menu.addMenuClickHandler(4, (pl, slot, item, action) -> false); + + menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Selected)")); + menu.addMenuClickHandler(6, (pl, slot, item, action) -> false); + + int index = 0; + for (final Map.Entry entry : getWaypoints(p.getUniqueId()).entrySet()) { + if (index >= inventory.length) break; + int slot = inventory[index]; + + Location l = entry.getValue(); + ItemStack globe = getPlanet(entry); + + menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &cClick to delete")); + menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> { + String id = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', entry.getKey())).toUpperCase().replace(" ", "_"); + Config cfg = new Config("data-storage/Slimefun/waypoints/" + pl.getUniqueId().toString() + ".yml"); + cfg.setValue(id, null); + cfg.save(); + pl.playSound(pl.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F); + + openWaypointControlPanel(pl); + return false; + }); + + index++; + } } - + catch(Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the GPS Waypoint Panel for Slimefun " + Slimefun.getVersion(), x); + } + menu.open(p); } @@ -223,7 +219,7 @@ public class GPSNetwork { } public Set getTransmitters(UUID uuid) { - return transmitters.containsKey(uuid) ? transmitters.get(uuid): new HashSet(); + return transmitters.containsKey(uuid) ? transmitters.get(uuid): new HashSet<>(); } public void scanChunk(Player p, Chunk chunk) { @@ -238,29 +234,22 @@ public class GPSNetwork { for (OreGenResource resource: OreGenSystem.listResources()) { int supply = OreGenSystem.getSupplies(resource, chunk, true); - menu.addItem(index, new CustomItem(resource.getIcon(), "&7Resource: &e" + resource.getName(), "", "&7Scanned Chunk:", "&8\u21E8 &7X: " + chunk.getX() + " Z: " + chunk.getZ(), "", "&7Result: &e" + supply + " " + resource.getMeasurementUnit()), - (pl, slot, item, action) -> false - ); + menu.addItem(index, new CustomItem(resource.getIcon(), "&7Resource: &e" + resource.getName(), "", "&7Scanned Chunk:", "&8\u21E8 &7X: " + chunk.getX() + " Z: " + chunk.getZ(), "", "&7Result: &e" + supply + " " + resource.getMeasurementUnit()), (pl, slot, item, action) -> false); index++; } menu.open(p); } - private final static int[] teleporter_border = new int[] {0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; - private final static int[] teleporter_inventory = new int[] {19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43}; - - public static void openTeleporterGUI(Player p, UUID uuid, Block b, final int complexity) throws Exception { - if (TeleportationSequence.players.contains(p.getUniqueId())) return; + public static void openTeleporterGUI(Player p, UUID uuid, Block b, final int complexity) { + if (SlimefunPlugin.getUtilities().teleporterUsers.contains(p.getUniqueId())) return; p.playSound(p.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F); - TeleportationSequence.players.add(p.getUniqueId()); + SlimefunPlugin.getUtilities().teleporterUsers.add(p.getUniqueId()); ChestMenu menu = new ChestMenu("&3Teleporter"); - menu.addMenuCloseHandler( - pl -> TeleportationSequence.players.remove(pl.getUniqueId()) - ); + menu.addMenuCloseHandler(pl -> SlimefunPlugin.getUtilities().teleporterUsers.remove(pl.getUniqueId())); for (int slot : teleporter_border) { menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), @@ -268,28 +257,31 @@ public class GPSNetwork { ); } - menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Select a Destination)")); - menu.addMenuClickHandler(4, - (pl, slot, item, action) -> false - ); - - final Location source = new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + 2D, b.getZ() + 0.5D); - int index = 0; - for (final Map.Entry entry: Slimefun.getGPSNetwork().getWaypoints(uuid).entrySet()) { - if (index >= teleporter_inventory.length) break; - int slot = teleporter_inventory[index]; + try { + menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Select a Destination)")); + menu.addMenuClickHandler(4, (pl, slot, item, action) -> false); - final Location l = entry.getValue(); - ItemStack globe = getPlanet(entry); - - menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "&8\u21E8 &7Estimated Teleportation Time: &r" + (50 / TeleportationSequence.getSpeed(Slimefun.getGPSNetwork().getNetworkComplexity(uuid), source, l)) + "s", "", "&8\u21E8 &cClick to select")); - menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> { - pl.closeInventory(); - TeleportationSequence.start(pl.getUniqueId(), complexity, source, l, false); - return false; - }); - - index++; + final Location source = new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + 2D, b.getZ() + 0.5D); + int index = 0; + for (final Map.Entry entry: Slimefun.getGPSNetwork().getWaypoints(uuid).entrySet()) { + if (index >= teleporter_inventory.length) break; + int slot = teleporter_inventory[index]; + + final Location l = entry.getValue(); + ItemStack globe = getPlanet(entry); + + menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "&8\u21E8 &7Estimated Teleportation Time: &r" + (50 / TeleportationSequence.getSpeed(Slimefun.getGPSNetwork().getNetworkComplexity(uuid), source, l)) + "s", "", "&8\u21E8 &cClick to select")); + menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> { + pl.closeInventory(); + TeleportationSequence.start(pl.getUniqueId(), complexity, source, l, false); + return false; + }); + + index++; + } + } + catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a Teleporter Menu for Slimefun " + Slimefun.getVersion(), x); } menu.open(p); diff --git a/src/me/mrCookieSlime/Slimefun/GPS/TeleportationSequence.java b/src/me/mrCookieSlime/Slimefun/GPS/TeleportationSequence.java index 10798406e..9ca69123c 100644 --- a/src/me/mrCookieSlime/Slimefun/GPS/TeleportationSequence.java +++ b/src/me/mrCookieSlime/Slimefun/GPS/TeleportationSequence.java @@ -1,8 +1,7 @@ package me.mrCookieSlime.Slimefun.GPS; -import java.util.HashSet; -import java.util.Set; import java.util.UUID; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -15,14 +14,15 @@ import org.bukkit.potion.PotionEffectType; import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder; import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder.TitleType; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.Slimefun; -public class TeleportationSequence { - - public static Set players = new HashSet<>(); +public final class TeleportationSequence { + + private TeleportationSequence() {} public static void start(UUID uuid, int complexity, Location source, Location destination, boolean resistance) { - players.add(uuid); + SlimefunPlugin.getUtilities().teleporterUsers.add(uuid); updateProgress(uuid, getSpeed(complexity, source, destination), 1, source, destination, resistance); } @@ -50,7 +50,8 @@ public class TeleportationSequence { } private static void cancel(UUID uuid, Player p) { - players.remove(uuid); + SlimefunPlugin.getUtilities().teleporterUsers.remove(uuid); + if (p != null) { try { TitleBuilder title = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(ChatColor.translateAlternateColorCodes('&', "&4Teleportation cancelled")); @@ -59,7 +60,7 @@ public class TeleportationSequence { title.send(TitleType.TITLE, p); subtitle.send(TitleType.SUBTITLE, p); } catch(Exception x) { - x.printStackTrace(); + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while cancelling a Teleportation Sequence for Slimefun " + Slimefun.getVersion(), x); } } } @@ -84,7 +85,7 @@ public class TeleportationSequence { destination.getWorld().spawnParticle(Particle.PORTAL,new Location(destination.getWorld(), destination.getX(), destination.getY() + 1, destination.getZ()),progress * 2, 0.2F, 0.8F, 0.2F ); destination.getWorld().playSound(destination, Sound.ENTITY_BLAZE_DEATH, 2F, 1.4F); - players.remove(uuid); + SlimefunPlugin.getUtilities().teleporterUsers.remove(uuid); } else { TitleBuilder title = (TitleBuilder) new TitleBuilder(0, 60, 0).addText(ChatColor.translateAlternateColorCodes('&', "&3Teleporting...")); @@ -96,12 +97,10 @@ public class TeleportationSequence { source.getWorld().spawnParticle(Particle.PORTAL, source, progress * 2, 0.2F, 0.8F, 0.2F); source.getWorld().playSound(source, Sound.UI_BUTTON_CLICK, 1.7F, 0.6F); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - updateProgress(uuid, speed, progress + speed, source, destination, resistance); - }, 10l); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> updateProgress(uuid, speed, progress + speed, source, destination, resistance), 10L); } - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured during a Teleportation Sequence for Slimefun " + Slimefun.getVersion(), x); } } else cancel(uuid, p); diff --git a/src/me/mrCookieSlime/Slimefun/Lists/Categories.java b/src/me/mrCookieSlime/Slimefun/Lists/Categories.java index 912cc6ce0..65e59cace 100644 --- a/src/me/mrCookieSlime/Slimefun/Lists/Categories.java +++ b/src/me/mrCookieSlime/Slimefun/Lists/Categories.java @@ -1,16 +1,13 @@ package me.mrCookieSlime.Slimefun.Lists; +import org.bukkit.Color; +import org.bukkit.Material; + import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomArmor; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.MenuItem; -import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.LockedCategory; -import me.mrCookieSlime.Slimefun.Objects.SeasonCategory; - -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Material; +import me.mrCookieSlime.Slimefun.Objects.SeasonalCategory; /** * Built-in categories. @@ -19,42 +16,35 @@ import org.bukkit.Material; * @since 4.0 * @see Category */ -public class Categories { +public final class Categories { - public static Category WEAPONS = new Category(new MenuItem(Material.GOLDEN_SWORD, "&7Weapons", 0, "open"), 1); - public static Category PORTABLE = null; - public static Category FOOD = new Category(new MenuItem(Material.APPLE, "&7Food", 0, "open"), 2); - public static Category MACHINES_1 = null; - public static LockedCategory ELECTRICITY = null; - public static LockedCategory GPS = null; - public static Category ARMOR = new Category(new MenuItem(Material.IRON_CHESTPLATE, "&7Armor", 0, "open"), 2); - public static Category LUMPS_AND_MAGIC = new Category(new MenuItem(Material.FIRE_CHARGE, "&7Magical Items", 0, "open"), 2); - public static Category MAGIC = new Category(new MenuItem(Material.BLAZE_POWDER, "&7Magical Gadgets", 0, "open"), 3); - public static Category MISC = null; - public static Category TECH = new Category(new CustomArmor(new MenuItem(Material.LEATHER_CHESTPLATE, "&7Technical Gadgets", 0, "open"), Color.SILVER), 3); - public static Category RESOURCES = null; - public static Category CARGO = null; - public static Category TECH_MISC = new Category(new MenuItem(Material.COMPARATOR, "&7Technical Components", 0, "open"), 2); - public static Category MAGIC_ARMOR = new Category(new MenuItem(Material.GOLDEN_CHESTPLATE, "&7Magical Armor", 0, "open"), 2); - public static Category TALISMANS_1 = new Category(new MenuItem(Material.EMERALD, "&7Talismans - &aTier I", 0, "open"), 2); - public static LockedCategory TALISMANS_2 = new LockedCategory(new MenuItem(Material.EMERALD, "&7Talismans - &aTier II", 0, "open"), 3, TALISMANS_1); - public static Category TOOLS = new Category(new MenuItem(Material.GOLDEN_PICKAXE, "&7Tools", 0, "open"), 1); - public static SeasonCategory CHRISTMAS = new SeasonCategory(12, 1, new MenuItem(Material.NETHER_STAR, "&aC&ch&ar&ci&as&ct&am&ca&as", 0, ChatColor.translateAlternateColorCodes('&', "&chelp &aSanta"))); - public static SeasonCategory VALENTINES_DAY = new SeasonCategory(2, 2, new MenuItem(Material.POPPY, "&dValentine's Day", 0, ChatColor.translateAlternateColorCodes('&', "&dcelebrate Love"))); - public static SeasonCategory EASTER = new SeasonCategory(4, 2, new MenuItem(Material.EGG, "&6Easter", 0, ChatColor.translateAlternateColorCodes('&', "&apaint some Eggs"))); - public static SeasonCategory BIRTHDAY = new SeasonCategory(10, 1, new MenuItem(Material.FIREWORK_ROCKET, "&a&lTheBusyBiscuit's Birthday &7(26th October)", 0, ChatColor.translateAlternateColorCodes('&', "&acelebrate with me"))); + private Categories() {} + + private static final String LORE = "&a> Click to open"; + + public static final Category WEAPONS = new Category(new CustomItem(Material.GOLDEN_SWORD, "&7Weapons", "", LORE), 1); + public static final Category PORTABLE = new Category(new CustomItem(SlimefunItems.BACKPACK_MEDIUM, "&7Items", "", LORE), 1); + public static final Category FOOD = new Category(new CustomItem(Material.APPLE, "&7Food", "", LORE), 2); + public static final Category MACHINES_1 = new Category(new CustomItem(Material.SMITHING_TABLE, "&7Basic Machines", "", LORE), 1); + public static final LockedCategory ELECTRICITY = new LockedCategory(new CustomItem(SlimefunItems.NUCLEAR_REACTOR, "&bEnergy and Electricity", "", LORE), 4, MACHINES_1); + public static final LockedCategory GPS = new LockedCategory(new CustomItem(SlimefunItems.GPS_TRANSMITTER, "&bGPS-based Machines", "", LORE), 4, MACHINES_1); + public static final Category ARMOR = new Category(new CustomItem(Material.IRON_CHESTPLATE, "&7Armor", "", LORE), 2); + public static final Category LUMPS_AND_MAGIC = new Category(new CustomItem(SlimefunItems.RUNE_ENDER, "&7Magical Items", "", LORE), 2); + public static final Category MAGIC = new Category(new CustomItem(Material.ELYTRA, "&7Magical Gadgets", "", LORE), 3); + public static final Category MISC = new Category(new CustomItem(SlimefunItems.CAN, "&7Miscellaneous", "", LORE), 2); + public static final Category TECH = new Category(new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&7Technical Gadgets", "", LORE), Color.SILVER), 3); + public static final Category RESOURCES = new Category(new CustomItem(SlimefunItems.SYNTHETIC_SAPPHIRE, "&7Resources", "", LORE), 1); + public static final Category CARGO = new LockedCategory(new CustomItem(SlimefunItems.CARGO_MANAGER, "&cCargo Management", "", LORE), 4, MACHINES_1); + public static final Category TECH_MISC = new Category(new CustomItem(SlimefunItems.HEATING_COIL, "&7Technical Components", "", LORE), 2); + public static final Category MAGIC_ARMOR = new Category(new CustomItem(SlimefunItems.ENDER_HELMET, "&7Magical Armor", "", LORE), 2); + public static final Category TALISMANS_1 = new Category(new CustomItem(Material.EMERALD, "&7Talismans - &aTier I", "", LORE), 2); + public static final LockedCategory TALISMANS_2 = new LockedCategory(new CustomItem(Material.EMERALD, "&7Talismans - &aTier II", "", LORE), 3, TALISMANS_1); + public static final Category TOOLS = new Category(new CustomItem(Material.GOLDEN_PICKAXE, "&7Tools", "", LORE), 1); + + // Seasonal Categories + public static final SeasonalCategory CHRISTMAS = new SeasonalCategory(12, 1, new CustomItem(Material.NETHER_STAR, "&aC&ch&ar&ci&as&ct&am&ca&as", "", "&c> Click to help &aSanta")); + public static final SeasonalCategory VALENTINES_DAY = new SeasonalCategory(2, 2, new CustomItem(Material.POPPY, "&dValentine's Day", "", "&d> Click to celebrate Love")); + public static final SeasonalCategory EASTER = new SeasonalCategory(4, 2, new CustomItem(Material.EGG, "&6Easter", "", "&a> Click to paint some Eggs")); + public static final SeasonalCategory BIRTHDAY = new SeasonalCategory(10, 1, new CustomItem(Material.FIREWORK_ROCKET, "&a&lTheBusyBiscuit's Birthday &7(26th October)", "", "&a> Click to celebrate with me")); - static { - try { - MISC = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTRkYTk3ZjA4MGUzOTViODQyYzRjYzgyYTg0MDgyM2Q0ZGJkOGNhNjg4YTIwNjg1M2U1NzgzZTRiZmRjMDEyIn19fQ=="), "&7Miscellaneous", "", "&a> Click to open"), 2); - PORTABLE = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&7Items", "", "&a> Click to open"), 1); - MACHINES_1 = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&7Basic Machines", "", "&a> Click to open"), 1); - ELECTRICITY = new LockedCategory(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTU4NDQzMmFmNmYzODIxNjcxMjAyNThkMWVlZThjODdjNmU3NWQ5ZTQ3OWU3YjBkNGM3YjZhZDQ4Y2ZlZWYifX19"), "&bEnergy and Electricity", "", "&a> Click to open"), 4, MACHINES_1); - GPS = new LockedCategory(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS-based Machines", "", "&a> Click to open"), 4, MACHINES_1); - RESOURCES = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2U4ZjVhZGIxNGQ2YzlmNmI4MTBkMDI3NTQzZjFhOGMxZjQxN2UyZmVkOTkzYzk3YmNkODljNzRmNWUyZTgifX19"), "&7Resources", "", "&a> Click to open"), 1); - CARGO = new LockedCategory(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTUxMGJjODUzNjJhMTMwYTZmZjlkOTFmZjExZDZmYTQ2ZDdkMTkxMmEzNDMxZjc1MTU1OGVmM2M0ZDljMiJ9fX0="), "&cCargo Management", "", "&a> Click to open"), 4, MACHINES_1); - } catch (Exception e) { - e.printStackTrace(); - } - } } diff --git a/src/me/mrCookieSlime/Slimefun/Lists/RecipeType.java b/src/me/mrCookieSlime/Slimefun/Lists/RecipeType.java index 607a07c6a..fdb190ca1 100644 --- a/src/me/mrCookieSlime/Slimefun/Lists/RecipeType.java +++ b/src/me/mrCookieSlime/Slimefun/Lists/RecipeType.java @@ -14,26 +14,26 @@ import org.bukkit.inventory.ItemStack; public class RecipeType { - public static final RecipeType MULTIBLOCK = new RecipeType(new CustomItem(Material.BRICK, "&bMultiBlock", 0, new String[] {"", "&a&oBuild it in the World"})); - public static final RecipeType ARMOR_FORGE = new RecipeType(new CustomItem(Material.ANVIL, "&bArmor Forge", 0, new String[] {"", "&a&oCraft it in an Armor Forge"}), "ARMOR_FORGE"); - public static final RecipeType GRIND_STONE = new RecipeType(new CustomItem(Material.DISPENSER, "&bGrind Stone", 0, new String[] {"", "&a&oGrind it using the Grind Stone"}), "GRIND_STONE"); - public static final RecipeType MOB_DROP = new RecipeType(new CustomItem(Material.IRON_SWORD, "&bMob Drop", 0, new String[] {"", "&a&oKill the specified Mob to obtain this Item"})); - public static final RecipeType SMELTERY = new RecipeType(new CustomItem(Material.FURNACE, "&6Smeltery", 0, new String[] {"", "&a&oSmelt it using a Smeltery"}), "SMELTERY"); - public static final RecipeType ORE_CRUSHER = new RecipeType(new CustomItem(Material.DISPENSER, "&bOre Crusher", 0, new String[] {"", "&a&oCrush it using the Ore Crusher"}), "ORE_CRUSHER"); - public static final RecipeType GOLD_PAN = new RecipeType(new CustomItem(Material.BOWL, "&bGold Pan", 0, new String[] {"", "&a&oUse a Gold Pan on Gravel to obtain this Item"})); - public static final RecipeType COMPRESSOR = new RecipeType(new CustomItem(Material.PISTON, "&bCompressor", 0, new String[] {"", "&a&oCompress it using the Compressor"}), "COMPRESSOR"); - public static final RecipeType PRESSURE_CHAMBER = new RecipeType(new CustomItem(Material.GLASS, "&bPressure Chamber", 0, new String[] {"", "&a&oCompress it using the Pressure Chamber"}), "PRESSURE_CHAMBER"); - public static final RecipeType OVEN = new RecipeType(new CustomItem(Material.FURNACE, "&bOven", 0, new String[] {"", "&a&oSmelt it in an Oven"}), "OVEN"); - public static final RecipeType MAGIC_WORKBENCH = new RecipeType(new CustomItem(Material.BOOKSHELF, "&6Magic Workbench", 0, new String[] {"", "&a&oCraft it in a Magic Workbench"}), "MAGIC_WORKBENCH"); - public static final RecipeType ORE_WASHER = new RecipeType(new CustomItem(Material.CAULDRON, "&6Ore Washer", 0, new String[] {"", "&a&oWash it in an Ore Washer"}), "ORE_WASHER"); - public static final RecipeType ENHANCED_CRAFTING_TABLE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eEnhanced Crafting Table", 0, new String[] {"", "&a&oA regular Crafting Table cannot", "&a&ohold this massive Amount of Power..."}), "ENHANCED_CRAFTING_TABLE"); - public static final RecipeType JUICER = new RecipeType(new CustomItem(Material.GLASS_BOTTLE, "&eJuicer", 0, new String[] {"", "&a&oUsed for Juice Creation"}), "JUICER"); - public static final RecipeType ANCIENT_ALTAR = new RecipeType(new CustomItem(Material.ENCHANTING_TABLE, "&4Ancient Altar", 0, new String[] {"", "&dYou will need to craft this Item", "&dby performing an Ancient Altar Ritual"})); + public static final RecipeType MULTIBLOCK = new RecipeType(new CustomItem(Material.BRICK, "&bMultiBlock", "", "&a&oBuild it in the World")); + public static final RecipeType ARMOR_FORGE = new RecipeType(new CustomItem(Material.ANVIL, "&bArmor Forge", "", "&a&oCraft it in an Armor Forge"), "ARMOR_FORGE"); + public static final RecipeType GRIND_STONE = new RecipeType(new CustomItem(Material.DISPENSER, "&bGrind Stone", "", "&a&oGrind it using the Grind Stone"), "GRIND_STONE"); + public static final RecipeType MOB_DROP = new RecipeType(new CustomItem(Material.IRON_SWORD, "&bMob Drop", "", "&a&oKill the specified Mob to obtain this Item")); + public static final RecipeType SMELTERY = new RecipeType(new CustomItem(Material.FURNACE, "&6Smeltery", "", "&a&oSmelt it using a Smeltery"), "SMELTERY"); + public static final RecipeType ORE_CRUSHER = new RecipeType(new CustomItem(Material.DISPENSER, "&bOre Crusher", "", "&a&oCrush it using the Ore Crusher"), "ORE_CRUSHER"); + public static final RecipeType GOLD_PAN = new RecipeType(new CustomItem(Material.BOWL, "&bGold Pan", "", "&a&oUse a Gold Pan on Gravel to obtain this Item")); + public static final RecipeType COMPRESSOR = new RecipeType(new CustomItem(Material.PISTON, "&bCompressor", "", "&a&oCompress it using the Compressor"), "COMPRESSOR"); + public static final RecipeType PRESSURE_CHAMBER = new RecipeType(new CustomItem(Material.GLASS, "&bPressure Chamber", "", "&a&oCompress it using the Pressure Chamber"), "PRESSURE_CHAMBER"); + public static final RecipeType OVEN = new RecipeType(new CustomItem(Material.FURNACE, "&bOven", "", "&a&oSmelt it in an Oven"), "OVEN"); + public static final RecipeType MAGIC_WORKBENCH = new RecipeType(new CustomItem(Material.BOOKSHELF, "&6Magic Workbench", "", "&a&oCraft it in a Magic Workbench"), "MAGIC_WORKBENCH"); + public static final RecipeType ORE_WASHER = new RecipeType(new CustomItem(Material.CAULDRON, "&6Ore Washer", "", "&a&oWash it in an Ore Washer"), "ORE_WASHER"); + public static final RecipeType ENHANCED_CRAFTING_TABLE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eEnhanced Crafting Table", "", "&a&oA regular Crafting Table cannot", "&a&ohold this massive Amount of Power..."), "ENHANCED_CRAFTING_TABLE"); + public static final RecipeType JUICER = new RecipeType(new CustomItem(Material.GLASS_BOTTLE, "&eJuicer", "", "&a&oUsed for Juice Creation"), "JUICER"); + public static final RecipeType ANCIENT_ALTAR = new RecipeType(new CustomItem(Material.ENCHANTING_TABLE, "&4Ancient Altar", "", "&dYou will need to craft this Item", "&dby performing an Ancient Altar Ritual")); public static final RecipeType HEATED_PRESSURE_CHAMBER = new RecipeType(new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS), "&cHeated Pressure Chamber", "", "&a&oCraft this Item in a", "&a&oHeated Pressure Chamber"), "HEATED_PRESSURE_CHAMBER"); - public static final RecipeType SHAPED_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShaped Recipe", 0, new String[] {"", "&a&oJust a standard Recipe in the Workbench..."})); - public static final RecipeType SHAPELESS_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShapeless Recipe", 0, new String[] {"", "&a&oJust a standard Recipe in the Workbench..."})); - public static final RecipeType FURNACE = new RecipeType(new CustomItem(Material.FURNACE, "&eFurnace Recipe", 0, new String[] {"", "&a&oJust smelt it in a regular Furnace"})); + public static final RecipeType SHAPED_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShaped Recipe", "", "&a&oJust a standard Recipe in the Workbench...")); + public static final RecipeType SHAPELESS_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShapeless Recipe", "", "&a&oJust a standard Recipe in the Workbench...")); + public static final RecipeType FURNACE = new RecipeType(new CustomItem(Material.FURNACE, "&eFurnace Recipe", "", "&a&oJust smelt it in a regular Furnace")); public static final RecipeType NULL = new RecipeType(null); private ItemStack item; diff --git a/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java b/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java index a0456b9d1..cc02ae1c6 100644 --- a/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java +++ b/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java @@ -1,10 +1,15 @@ package me.mrCookieSlime.Slimefun.Lists; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; + import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkEffectMeta; import org.bukkit.potion.PotionEffect; @@ -15,412 +20,522 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomPotion; import me.mrCookieSlime.CSCoreLibPlugin.general.String.Christmas; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; +import me.mrCookieSlime.Slimefun.api.Slimefun; -public class SlimefunItems { +public final class SlimefunItems { + + private SlimefunItems() {} /* Items */ - public static ItemStack PORTABLE_CRAFTER = null; - public static ItemStack PORTABLE_DUSTBIN = null; - public static ItemStack ENDER_BACKPACK = null; - public static ItemStack MAGIC_EYE_OF_ENDER = new CustomItem(Material.ENDER_EYE, "&6&lMagic Eye of Ender", "&4&lRequires full Ender Armor", "", "&7&eRight Click&7 to shoot an Ender Pearl"); - public static ItemStack BROKEN_SPAWNER = new CustomItem(Material.SPAWNER, "&cBroken Spawner", "&7Type: &b", "", "&cFractured, must be repaired in an Ancient Altar"); - public static ItemStack REPAIRED_SPAWNER = new CustomItem(Material.SPAWNER, "&bReinforced Spawner", "&7Type: &b"); - public static ItemStack INFERNAL_BONEMEAL = new CustomItem(Material.BONE_MEAL, "&4Infernal Bonemeal", "", "&cSpeeds up the Growth of", "&cNether Warts as well"); + public static final ItemStack PORTABLE_CRAFTER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzJlYzRhNGJkOGE1OGY4MzYxZjhhMDMwM2UyMTk5ZDMzZDYyNGVhNWY5MmY3Y2IzNDE0ZmVlOTVlMmQ4NjEifX19"), "&6Portable Crafter", "&a&oA portable Crafting Table", "", "&eRight Click&7 to open"); + public static final ItemStack PORTABLE_DUSTBIN = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzJkNDEwNDJjZTk5MTQ3Y2MzOGNhYzllNDY3NDE1NzZlN2VlNzkxMjgzZTZmYWM4ZDMyOTJjYWUyOTM1ZjFmIn19fQ=="), "&6Portable Dustbin", "&rYour portable Item-Destroyer", "", "&eRight Click&7 to open"); + public static final ItemStack ENDER_BACKPACK = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&6Ender Backpack","&a&oA portable Ender Chest", "", "&eRight Click&7 to open"); + public static final ItemStack MAGIC_EYE_OF_ENDER = new CustomItem(Material.ENDER_EYE, "&6&lMagic Eye of Ender", "&4&lRequires full Ender Armor", "", "&7&eRight Click&7 to shoot an Ender Pearl"); + public static final ItemStack BROKEN_SPAWNER = new CustomItem(Material.SPAWNER, "&cBroken Spawner", "&7Type: &b", "", "&cFractured, must be repaired in an Ancient Altar"); + public static final ItemStack REPAIRED_SPAWNER = new CustomItem(Material.SPAWNER, "&bReinforced Spawner", "&7Type: &b"); + public static final ItemStack INFERNAL_BONEMEAL = new CustomItem(Material.BONE_MEAL, "&4Infernal Bonemeal", "", "&cSpeeds up the Growth of", "&cNether Warts as well"); /* Gadgets */ - public static ItemStack GOLD_PAN = new CustomItem(Material.BOWL, "&6Gold Pan", "&a&oCan get you all kinds of Goodies...", "", "&7&eRight Click&7 to pan various Stuff out of Gravel"); - public static ItemStack PARACHUTE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&r&lParachute", "", "&7Hold &eShift&7 to use"), Color.WHITE); - public static ItemStack GRAPPLING_HOOK = new CustomItem(Material.LEAD, "&6Grappling Hook", "", "&7&eRight Click&7 to use"); - public static ItemStack SOLAR_HELMET = new CustomItem(Material.IRON_HELMET, "&bSolar Helmet", "", "&a&oCharges held Items and Armor"); - public static ItemStack CLOTH = new CustomItem(Material.PAPER, "&bCloth"); - public static ItemStack CAN = null; - public static ItemStack NIGHT_VISION_GOGGLES = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&aNight Vision Goggles", "", "&9+ Night Vision"), Color.BLACK); - public static ItemStack FARMER_SHOES = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&eFarmer Shoes", "", "&6&oPrevents you from trampling your Crops"), Color.YELLOW); - public static ItemStack INFUSED_MAGNET = null; - public static ItemStack FLASK_OF_KNOWLEDGE = new CustomItem(Material.GLASS_BOTTLE, "&cFlask of Knowledge", "", "&rAllows you to store some of", "&ryour Experience in a Bottle", "&7Cost: &a1 Level"); - public static ItemStack RAG = new CustomItem(Material.PAPER, "&cRag", "", "&aLevel I - Medical Supply", "", "&rRestores 2 Hearts", "&rExtinguishes Fire", "", "&7&eRight Click&7 to use"); - public static ItemStack BANDAGE = new CustomItem(Material.PAPER, "&cBandage", "", "&aLevel II - Medical Supply", "", "&rRestores 4 Hearts", "&rExtinguishes Fire", "", "&7&eRight Click&7 to use"); - public static ItemStack SPLINT = new CustomItem(Material.STICK, "&cSplint", "", "&aLevel I - Medical Supply", "", "&rRestores 2 Hearts", "", "&7&eRight Click&7 to use"); - public static ItemStack VITAMINS = new CustomItem(Material.NETHER_WART, "&cVitamins", "", "&aLevel III - Medical Supply", "", "&rRestores 4 Hearts", "&rExtinguishes Fire", "&rCures Poison/Wither/Radiation", "", "&7&eRight Click&7 to use"); - public static ItemStack MEDICINE = new CustomPotion("&cMedicine", Color.RED, new PotionEffect(PotionEffectType.HEAL, 0, 0), "", "&aLevel III - Medical Supply", "", "&rRestores 4 Hearts", "&rExtinguishes Fire", "&rCures Poison/Wither/Radiation"); + public static final ItemStack GOLD_PAN = new CustomItem(Material.BOWL, "&6Gold Pan", "&a&oCan get you all kinds of Goodies...", "", "&7&eRight Click&7 to pan various Stuff out of Gravel"); + public static final ItemStack PARACHUTE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&r&lParachute", "", "&7Hold &eShift&7 to use"), Color.WHITE); + public static final ItemStack GRAPPLING_HOOK = new CustomItem(Material.LEAD, "&6Grappling Hook", "", "&7&eRight Click&7 to use"); + public static final ItemStack SOLAR_HELMET = new CustomItem(Material.IRON_HELMET, "&bSolar Helmet", "", "&a&oCharges held Items and Armor"); + public static final ItemStack CLOTH = new CustomItem(Material.PAPER, "&bCloth"); + public static final ItemStack CAN = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTRkYTk3ZjA4MGUzOTViODQyYzRjYzgyYTg0MDgyM2Q0ZGJkOGNhNjg4YTIwNjg1M2U1NzgzZTRiZmRjMDEyIn19fQ=="), "&rTin Can"); + public static final ItemStack NIGHT_VISION_GOGGLES = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&aNight Vision Goggles", "", "&9+ Night Vision"), Color.BLACK); + public static final ItemStack FARMER_SHOES = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&eFarmer Shoes", "", "&6&oPrevents you from trampling your Crops"), Color.YELLOW); + public static final ItemStack INFUSED_MAGNET = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWJhOGViYzRjNmE4MTczMDk0NzQ5OWJmN2UxZDVlNzNmZWQ2YzFiYjJjMDUxZTk2ZDM1ZWIxNmQyNDYxMGU3In19fQ=="), "&aInfused Magnet" , "", "&rMagical infused Magnets", "&rattract nearby Items", "&ras long as it is somewhere in", "&ryour Inventory", "", "&7Hold &eShift&7 to pick up nearby Items"); + public static final ItemStack FLASK_OF_KNOWLEDGE = new CustomItem(Material.GLASS_BOTTLE, "&cFlask of Knowledge", "", "&rAllows you to store some of", "&ryour Experience in a Bottle", "&7Cost: &a1 Level"); + public static final ItemStack RAG = new CustomItem(Material.PAPER, "&cRag", "", "&aLevel I - Medical Supply", "", "&rRestores 2 Hearts", "&rExtinguishes Fire", "", "&7&eRight Click&7 to use"); + public static final ItemStack BANDAGE = new CustomItem(Material.PAPER, "&cBandage", "", "&aLevel II - Medical Supply", "", "&rRestores 4 Hearts", "&rExtinguishes Fire", "", "&7&eRight Click&7 to use"); + public static final ItemStack SPLINT = new CustomItem(Material.STICK, "&cSplint", "", "&aLevel I - Medical Supply", "", "&rRestores 2 Hearts", "", "&7&eRight Click&7 to use"); + public static final ItemStack VITAMINS = new CustomItem(Material.NETHER_WART, "&cVitamins", "", "&aLevel III - Medical Supply", "", "&rRestores 4 Hearts", "&rExtinguishes Fire", "&rCures Poison/Wither/Radiation", "", "&7&eRight Click&7 to use"); + public static final ItemStack MEDICINE = new CustomPotion("&cMedicine", Color.RED, new PotionEffect(PotionEffectType.HEAL, 0, 0), "", "&aLevel III - Medical Supply", "", "&rRestores 4 Hearts", "&rExtinguishes Fire", "&rCures Poison/Wither/Radiation"); /* Backpacks */ - public static ItemStack BACKPACK_SMALL = null; - public static ItemStack BACKPACK_MEDIUM = null; - public static ItemStack BACKPACK_LARGE = null; - public static ItemStack WOVEN_BACKPACK = null; - public static ItemStack GILDED_BACKPACK = null; - public static ItemStack RADIANT_BACKPACK = null; - public static ItemStack BOUND_BACKPACK = null; - public static ItemStack COOLER = null; + public static final ItemStack BACKPACK_SMALL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eSmall Backpack","", "&7Size: &e9", "&7ID: ", "", "&7&eRight Click&7 to open"); + public static final ItemStack BACKPACK_MEDIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eBackpack","", "&7Size: &e18", "&7ID: ", "", "&7&eRight Click&7 to open"); + public static final ItemStack BACKPACK_LARGE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eLarge Backpack","", "&7Size: &e27", "&7ID: ", "", "&7&eRight Click&7 to open"); + public static final ItemStack WOVEN_BACKPACK = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eWoven Backpack","", "&7Size: &e36", "&7ID: ", "", "&7&eRight Click&7 to open"); + public static final ItemStack GILDED_BACKPACK = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eGilded Backpack","", "&7Size: &e45", "&7ID: ", "", "&7&eRight Click&7 to open"); + public static final ItemStack RADIANT_BACKPACK = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eRadiant Backpack","", "&7Size: &e54 (Double chest)", "&7ID: ", "", "&7&eRight Click&7 to open"); + public static final ItemStack BOUND_BACKPACK = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&cSoulbound Backpack","", "&7Size: &e36", "&7ID: ", "", "&7&eRight Click&7 to open"); + public static final ItemStack COOLER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDRjMTU3MjU4NGViNWRlMjI5ZGU5ZjVhNGY3NzlkMGFhY2JhZmZkMzNiY2IzM2ViNDUzNmE2YTJiYzZhMSJ9fX0="), "&bCooler","&rAllows you to store Juices/Smoothies", "&rand automatically consumes them when you are hungry", "&rand you have this in your Inventory", "", "&7Size: &e27", "&7ID: ", "", "&7&eRight Click&7 to open"); + + public static final ItemStack VOIDBAG_SMALL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Small Void Bag","", "&7Size: &e9", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"); + public static final ItemStack VOIDBAG_MEDIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Void Bag","", "&7Size: &e18", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"); + public static final ItemStack VOIDBAG_BIG = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Big Void Bag","", "&7Size: &e27", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"); + public static final ItemStack VOIDBAG_LARGE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Large Void Bag","", "&7Size: &e36", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"); + public static final ItemStack BOUND_VOIDBAG = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Soulbound Void Bag","", "&7Size: &e36", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"); - public static ItemStack VOIDBAG_SMALL = null; - public static ItemStack VOIDBAG_MEDIUM = null; - public static ItemStack VOIDBAG_BIG = null; - public static ItemStack VOIDBAG_LARGE = null; - public static ItemStack BOUND_VOIDBAG = null; /* Jetpacks */ - public static ItemStack DURALUMIN_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eI", "", "&8\u21E8 &7Material: &bDuralumin", "&c&o&8\u21E8 &e\u26A1 &70 / 20 J", "&8\u21E8 &7Thrust: &c0.35", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack SOLDER_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eII", "", "&8\u21E8 &7Material: &bSolder", "&c&o&8\u21E8 &e\u26A1 &70 / 30 J", "&8\u21E8 &7Thrust: &c0.4", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack BILLON_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eIII", "", "&8\u21E8 &7Material: &bBillon", "&c&o&8\u21E8 &e\u26A1 &70 / 45 J", "&8\u21E8 &7Thrust: &c0.45", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack STEEL_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eIV", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 60 J", "&8\u21E8 &7Thrust: &c0.5", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack DAMASCUS_STEEL_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eV", "", "&8\u21E8 &7Material: &bDamascus Steel", "&c&o&8\u21E8 &e\u26A1 &70 / 75 J", "&8\u21E8 &7Thrust: &c0.55", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack REINFORCED_ALLOY_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eVI", "", "&8\u21E8 &7Material: &bReinforced Alloy", "&c&o&8\u21E8 &e\u26A1 &70 / 100 J", "&8\u21E8 &7Thrust: &c0.6", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack CARBONADO_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eVII", "", "&8\u21E8 &7Material: &bCarbonado", "&c&o&8\u21E8 &e\u26A1 &70 / 150 J", "&8\u21E8 &7Thrust: &c0.7", "", "&7Hold &eShift&7 to use"), Color.BLACK); - public static ItemStack ARMORED_JETPACK = new CustomItem(Material.IRON_CHESTPLATE, "&9Armored Jetpack", "&8\u21E8 &7Material: &bSteel", "", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "&8\u21E8 &7Thrust: &c0.45", "", "&7Hold &eShift&7 to use"); + public static final ItemStack DURALUMIN_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eI", "", "&8\u21E8 &7Material: &bDuralumin", "&c&o&8\u21E8 &e\u26A1 &70 / 20 J", "&8\u21E8 &7Thrust: &c0.35", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack SOLDER_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eII", "", "&8\u21E8 &7Material: &bSolder", "&c&o&8\u21E8 &e\u26A1 &70 / 30 J", "&8\u21E8 &7Thrust: &c0.4", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack BILLON_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eIII", "", "&8\u21E8 &7Material: &bBillon", "&c&o&8\u21E8 &e\u26A1 &70 / 45 J", "&8\u21E8 &7Thrust: &c0.45", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack STEEL_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eIV", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 60 J", "&8\u21E8 &7Thrust: &c0.5", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack DAMASCUS_STEEL_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eV", "", "&8\u21E8 &7Material: &bDamascus Steel", "&c&o&8\u21E8 &e\u26A1 &70 / 75 J", "&8\u21E8 &7Thrust: &c0.55", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack REINFORCED_ALLOY_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eVI", "", "&8\u21E8 &7Material: &bReinforced Alloy", "&c&o&8\u21E8 &e\u26A1 &70 / 100 J", "&8\u21E8 &7Thrust: &c0.6", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack CARBONADO_JETPACK = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&9Electric Jetpack &7- &eVII", "", "&8\u21E8 &7Material: &bCarbonado", "&c&o&8\u21E8 &e\u26A1 &70 / 150 J", "&8\u21E8 &7Thrust: &c0.7", "", "&7Hold &eShift&7 to use"), Color.BLACK); + public static final ItemStack ARMORED_JETPACK = new CustomItem(Material.IRON_CHESTPLATE, "&9Armored Jetpack", "&8\u21E8 &7Material: &bSteel", "", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "&8\u21E8 &7Thrust: &c0.45", "", "&7Hold &eShift&7 to use"); /* Jetboots */ - public static ItemStack DURALUMIN_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eI", "", "&8\u21E8 &7Material: &bDuralumin", "&c&o&8\u21E8 &e\u26A1 &70 / 20 J", "&8\u21E8 &7Speed: &a0.35", "&8\u21E8 &7Accuracy: &c50%", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack SOLDER_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eII", "", "&8\u21E8 &7Material: &bSolder", "&c&o&8\u21E8 &e\u26A1 &70 / 30 J", "&8\u21E8 &7Speed: &a0.4", "&8\u21E8 &7Accuracy: &660%", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack BILLON_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eIII", "", "&8\u21E8 &7Material: &bBillon", "&c&o&8\u21E8 &e\u26A1 &70 / 40 J", "&8\u21E8 &7Speed: &a0.45", "&8\u21E8 &7Accuracy: &665%", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack STEEL_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eIV", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "&8\u21E8 &7Speed: &a0.5", "&8\u21E8 &7Accuracy: &e70%", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack DAMASCUS_STEEL_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eV", "", "&8\u21E8 &7Material: &bDamascus Steel", "&c&o&8\u21E8 &e\u26A1 &70 / 75 J", "&8\u21E8 &7Speed: &a0.55", "&8\u21E8 &7Accuracy: &a75%", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack REINFORCED_ALLOY_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eVI", "", "&8\u21E8 &7Material: &bReinforced Alloy", "&c&o&8\u21E8 &e\u26A1 &70 / 100 J", "&8\u21E8 &7Speed: &a0.6", "&8\u21E8 &7Accuracy: &c80%", "", "&7Hold &eShift&7 to use"), Color.SILVER); - public static ItemStack CARBONADO_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eVII", "", "&8\u21E8 &7Material: &bCarbonado", "&c&o&8\u21E8 &e\u26A1 &70 / 125 J", "&8\u21E8 &7Speed: &a0.7", "&8\u21E8 &7Accuracy: &c99.9%", "", "&7Hold &eShift&7 to use"), Color.BLACK); - public static ItemStack ARMORED_JETBOOTS = new CustomItem(Material.IRON_BOOTS, "&9Armored Jet Boots", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "&8\u21E8 &7Speed: &a0.45", "&8\u21E8 &7Accuracy: &e70%", "", "&7Hold &eShift&7 to use"); + public static final ItemStack DURALUMIN_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eI", "", "&8\u21E8 &7Material: &bDuralumin", "&c&o&8\u21E8 &e\u26A1 &70 / 20 J", "&8\u21E8 &7Speed: &a0.35", "&8\u21E8 &7Accuracy: &c50%", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack SOLDER_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eII", "", "&8\u21E8 &7Material: &bSolder", "&c&o&8\u21E8 &e\u26A1 &70 / 30 J", "&8\u21E8 &7Speed: &a0.4", "&8\u21E8 &7Accuracy: &660%", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack BILLON_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eIII", "", "&8\u21E8 &7Material: &bBillon", "&c&o&8\u21E8 &e\u26A1 &70 / 40 J", "&8\u21E8 &7Speed: &a0.45", "&8\u21E8 &7Accuracy: &665%", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack STEEL_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eIV", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "&8\u21E8 &7Speed: &a0.5", "&8\u21E8 &7Accuracy: &e70%", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack DAMASCUS_STEEL_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eV", "", "&8\u21E8 &7Material: &bDamascus Steel", "&c&o&8\u21E8 &e\u26A1 &70 / 75 J", "&8\u21E8 &7Speed: &a0.55", "&8\u21E8 &7Accuracy: &a75%", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack REINFORCED_ALLOY_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eVI", "", "&8\u21E8 &7Material: &bReinforced Alloy", "&c&o&8\u21E8 &e\u26A1 &70 / 100 J", "&8\u21E8 &7Speed: &a0.6", "&8\u21E8 &7Accuracy: &c80%", "", "&7Hold &eShift&7 to use"), Color.SILVER); + public static final ItemStack CARBONADO_JETBOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&9Jet Boots &7- &eVII", "", "&8\u21E8 &7Material: &bCarbonado", "&c&o&8\u21E8 &e\u26A1 &70 / 125 J", "&8\u21E8 &7Speed: &a0.7", "&8\u21E8 &7Accuracy: &c99.9%", "", "&7Hold &eShift&7 to use"), Color.BLACK); + public static final ItemStack ARMORED_JETBOOTS = new CustomItem(Material.IRON_BOOTS, "&9Armored Jet Boots", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "&8\u21E8 &7Speed: &a0.45", "&8\u21E8 &7Accuracy: &e70%", "", "&7Hold &eShift&7 to use"); /* Multi Tools */ - public static ItemStack DURALUMIN_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eI", "", "&8\u21E8 &7Material: &bDuralumin", "&c&o&8\u21E8 &e\u26A1 &70 / 20 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); - public static ItemStack SOLDER_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eII", "", "&8\u21E8 &7Material: &bSolder", "&c&o&8\u21E8 &e\u26A1 &70 / 30 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); - public static ItemStack BILLON_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eIII", "", "&8\u21E8 &7Material: &bBillon", "&c&o&8\u21E8 &e\u26A1 &70 / 40 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); - public static ItemStack STEEL_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eIV", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); - public static ItemStack DAMASCUS_STEEL_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eV", "", "&8\u21E8 &7Material: &bDamascus Steel", "&c&o&8\u21E8 &e\u26A1 &70 / 60 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); - public static ItemStack REINFORCED_ALLOY_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eVI", "", "&8\u21E8 &7Material: &bReinforced Alloy", "&c&o&8\u21E8 &e\u26A1 &70 / 75 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); - public static ItemStack CARBONADO_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eVII", "", "&8\u21E8 &7Material: &bCarbonado", "&c&o&8\u21E8 &e\u26A1 &70 / 100 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); + public static final ItemStack DURALUMIN_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eI", "", "&8\u21E8 &7Material: &bDuralumin", "&c&o&8\u21E8 &e\u26A1 &70 / 20 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); + public static final ItemStack SOLDER_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eII", "", "&8\u21E8 &7Material: &bSolder", "&c&o&8\u21E8 &e\u26A1 &70 / 30 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); + public static final ItemStack BILLON_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eIII", "", "&8\u21E8 &7Material: &bBillon", "&c&o&8\u21E8 &e\u26A1 &70 / 40 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); + public static final ItemStack STEEL_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eIV", "", "&8\u21E8 &7Material: &bSteel", "&c&o&8\u21E8 &e\u26A1 &70 / 50 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); + public static final ItemStack DAMASCUS_STEEL_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eV", "", "&8\u21E8 &7Material: &bDamascus Steel", "&c&o&8\u21E8 &e\u26A1 &70 / 60 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); + public static final ItemStack REINFORCED_ALLOY_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eVI", "", "&8\u21E8 &7Material: &bReinforced Alloy", "&c&o&8\u21E8 &e\u26A1 &70 / 75 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); + public static final ItemStack CARBONADO_MULTI_TOOL = new CustomItem(Material.SHEARS, "&9Multi Tool &7- &eVII", "", "&8\u21E8 &7Material: &bCarbonado", "&c&o&8\u21E8 &e\u26A1 &70 / 100 J", "", "&7&eRight Click&7 to use", "&7Hold &eShift + Right Click&7 to change the Mode"); /* Food */ - public static ItemStack FORTUNE_COOKIE = new CustomItem(Material.COOKIE, "&6Fortune Cookie", "", "&a&oTells you stuff about your Future :o"); - public static ItemStack BEEF_JERKY = new CustomItem(Material.COOKED_BEEF, "&6Beef Jerky", "", "&a&oSaturating"); - public static ItemStack MAGIC_SUGAR = new CustomItem(Material.SUGAR, "&6Magic Sugar", "", "&a&oFeel the Power of Hermes!"); - public static ItemStack MONSTER_JERKY = new CustomItem(Material.ROTTEN_FLESH, "&6Monster Jerky", "", "&a&oNo longer hungry"); - public static ItemStack APPLE_JUICE = new CustomPotion("&cApple Juice", Color.RED, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); - public static ItemStack MELON_JUICE = new CustomPotion("&cMelon Juice", Color.RED, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); - public static ItemStack CARROT_JUICE = new CustomPotion("&6Carrot Juice", Color.ORANGE, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); - public static ItemStack PUMPKIN_JUICE = new CustomPotion("&6Pumpkin Juice", Color.ORANGE, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); - public static ItemStack GOLDEN_APPLE_JUICE = new CustomPotion("&bGolden Apple Juice", Color.YELLOW, new PotionEffect(PotionEffectType.ABSORPTION, 20 * 20, 0)); + public static final ItemStack FORTUNE_COOKIE = new CustomItem(Material.COOKIE, "&6Fortune Cookie", "", "&a&oTells you stuff about your Future :o"); + public static final ItemStack DIET_COOKIE = new CustomItem(Material.COOKIE, "&6Diet Cookie", "", "&aA very &olightweight &r&acookie."); + public static final ItemStack BEEF_JERKY = new CustomItem(Material.COOKED_BEEF, "&6Beef Jerky", "", "&a&oSaturating"); + public static final ItemStack MAGIC_SUGAR = new CustomItem(Material.SUGAR, "&6Magic Sugar", "", "&a&oFeel the Power of Hermes!"); + public static final ItemStack MONSTER_JERKY = new CustomItem(Material.ROTTEN_FLESH, "&6Monster Jerky", "", "&a&oNo longer hungry"); + public static final ItemStack APPLE_JUICE = new CustomPotion("&cApple Juice", Color.RED, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); + public static final ItemStack MELON_JUICE = new CustomPotion("&cMelon Juice", Color.RED, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); + public static final ItemStack CARROT_JUICE = new CustomPotion("&6Carrot Juice", Color.ORANGE, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); + public static final ItemStack PUMPKIN_JUICE = new CustomPotion("&6Pumpkin Juice", Color.ORANGE, new PotionEffect(PotionEffectType.SATURATION, 6, 0), "", "&7&oRestores &b&o" + "3.0" + " &7&oHunger"); + public static final ItemStack GOLDEN_APPLE_JUICE = new CustomPotion("&bGolden Apple Juice", Color.YELLOW, new PotionEffect(PotionEffectType.ABSORPTION, 20 * 20, 0)); /* Christmas */ - public static ItemStack CHRISTMAS_MILK = new CustomPotion("&6Glass of Milk", Color.WHITE, new PotionEffect(PotionEffectType.SATURATION, 5, 0), "", "&7&oRestores &b&o" + "2.5" + " &7&oHunger"); - public static ItemStack CHRISTMAS_CHOCOLATE_MILK = new CustomPotion("&6Chocolate Milk", Color.MAROON, new PotionEffect(PotionEffectType.SATURATION, 12, 0), "", "&7&oRestores &b&o" + "6.0" + " &7&oHunger"); - public static ItemStack CHRISTMAS_EGG_NOG = new CustomPotion("&aEgg Nog", Color.GRAY, new PotionEffect(PotionEffectType.SATURATION, 7, 0), "", "&7&oRestores &b&o" + "3.5" + " &7&oHunger"); - public static ItemStack CHRISTMAS_APPLE_CIDER = new CustomPotion("&cApple Cider", Color.RED, new PotionEffect(PotionEffectType.SATURATION, 14, 0), "", "&7&oRestores &b&o" + "7.0" + " &7&oHunger"); - public static ItemStack CHRISTMAS_COOKIE = new CustomItem(Material.COOKIE, Christmas.color("Christmas Cookie")); - public static ItemStack CHRISTMAS_FRUIT_CAKE = new CustomItem(Material.PUMPKIN_PIE, Christmas.color("Fruit Cake")); - public static ItemStack CHRISTMAS_APPLE_PIE = new CustomItem(Material.PUMPKIN_PIE, "&rApple Pie"); - public static ItemStack CHRISTMAS_HOT_CHOCOLATE = new CustomPotion("&6Hot Chocolate", Color.MAROON, new PotionEffect(PotionEffectType.SATURATION, 14, 0), "", "&7&oRestores &b&o" + "7.0" + " &7&oHunger"); - public static ItemStack CHRISTMAS_CAKE = new CustomItem(Material.PUMPKIN_PIE, Christmas.color("Christmas Cake")); - public static ItemStack CHRISTMAS_CARAMEL = new CustomItem(Material.BRICKS, "&6Caramel"); - public static ItemStack CHRISTMAS_CARAMEL_APPLE = new CustomItem(Material.APPLE, "&6Caramel Apple"); - public static ItemStack CHRISTMAS_CHOCOLATE_APPLE = new CustomItem(Material.APPLE, "&6Chocolate Apple"); - public static ItemStack CHRISTMAS_PRESENT = new CustomItem(Material.CHEST, Christmas.color("Christmas Present"), "&7From: &emrCookieSlime", "&7To: &eYou", "", "&eRight Click&7 to open"); + public static final ItemStack CHRISTMAS_MILK = new CustomPotion("&6Glass of Milk", Color.WHITE, new PotionEffect(PotionEffectType.SATURATION, 5, 0), "", "&7&oRestores &b&o" + "2.5" + " &7&oHunger"); + public static final ItemStack CHRISTMAS_CHOCOLATE_MILK = new CustomPotion("&6Chocolate Milk", Color.MAROON, new PotionEffect(PotionEffectType.SATURATION, 12, 0), "", "&7&oRestores &b&o" + "6.0" + " &7&oHunger"); + public static final ItemStack CHRISTMAS_EGG_NOG = new CustomPotion("&aEgg Nog", Color.GRAY, new PotionEffect(PotionEffectType.SATURATION, 7, 0), "", "&7&oRestores &b&o" + "3.5" + " &7&oHunger"); + public static final ItemStack CHRISTMAS_APPLE_CIDER = new CustomPotion("&cApple Cider", Color.RED, new PotionEffect(PotionEffectType.SATURATION, 14, 0), "", "&7&oRestores &b&o" + "7.0" + " &7&oHunger"); + public static final ItemStack CHRISTMAS_COOKIE = new CustomItem(Material.COOKIE, Christmas.color("Christmas Cookie")); + public static final ItemStack CHRISTMAS_FRUIT_CAKE = new CustomItem(Material.PUMPKIN_PIE, Christmas.color("Fruit Cake")); + public static final ItemStack CHRISTMAS_APPLE_PIE = new CustomItem(Material.PUMPKIN_PIE, "&rApple Pie"); + public static final ItemStack CHRISTMAS_HOT_CHOCOLATE = new CustomPotion("&6Hot Chocolate", Color.MAROON, new PotionEffect(PotionEffectType.SATURATION, 14, 0), "", "&7&oRestores &b&o" + "7.0" + " &7&oHunger"); + public static final ItemStack CHRISTMAS_CAKE = new CustomItem(Material.PUMPKIN_PIE, Christmas.color("Christmas Cake")); + public static final ItemStack CHRISTMAS_CARAMEL = new CustomItem(Material.BRICKS, "&6Caramel"); + public static final ItemStack CHRISTMAS_CARAMEL_APPLE = new CustomItem(Material.APPLE, "&6Caramel Apple"); + public static final ItemStack CHRISTMAS_CHOCOLATE_APPLE = new CustomItem(Material.APPLE, "&6Chocolate Apple"); + public static final ItemStack CHRISTMAS_PRESENT = new CustomItem(Material.CHEST, Christmas.color("Christmas Present"), "&7From: &emrCookieSlime", "&7To: &eYou", "", "&eRight Click&7 to open"); /* Easter */ - public static ItemStack EASTER_EGG = new CustomItem(Material.EGG, "&rEaster Egg", "&bSurprise! Surprise!"); - public static ItemStack EASTER_CARROT_PIE = new CustomItem(Material.PUMPKIN_PIE, "&6Carrot Pie"); + public static final ItemStack EASTER_EGG = new CustomItem(Material.EGG, "&rEaster Egg", "&bSurprise! Surprise!"); + public static final ItemStack EASTER_CARROT_PIE = new CustomItem(Material.PUMPKIN_PIE, "&6Carrot Pie"); /* Weapons */ - public static ItemStack GRANDMAS_WALKING_STICK = new CustomItem(Material.STICK, "&7Grandmas Walking Stick", 0, new String[0], new String[] {"KNOCKBACK-2"}); - public static ItemStack GRANDPAS_WALKING_STICK = new CustomItem(Material.STICK, "&7Grandpas Walking Stick", 0, new String[0], new String[] {"KNOCKBACK-5"}); - public static ItemStack SWORD_OF_BEHEADING = new CustomItem(Material.IRON_SWORD, "&6Sword of Beheading", "&7Beheading II", "", "&rHas a chance to behead Mobs", "&r(even a higher chance for Wither Skeletons)"); - public static ItemStack BLADE_OF_VAMPIRES = new CustomItem(Material.GOLDEN_SWORD, "&cBlade of Vampires", 0, new String[] {"&7Life Steal I", "", "&rEverytime you attack something", "&ryou have a 45% chance to", "&rrecover 2 Hearts of your Health"}, new String[] {"FIRE_ASPECT-2", "DURABILITY-4", "DAMAGE_ALL-2"}); - public static ItemStack SEISMIC_AXE = new CustomItem(Material.IRON_AXE, "&aSeismic Axe", "", "&7&oA portable Earthquake...", "", "&7&eRight Click&7 to use"); + public static final ItemStack GRANDMAS_WALKING_STICK = new CustomItem(Material.STICK, "&7Grandmas Walking Stick"); + public static final ItemStack GRANDPAS_WALKING_STICK = new CustomItem(Material.STICK, "&7Grandpas Walking Stick"); + public static final ItemStack SWORD_OF_BEHEADING = new CustomItem(Material.IRON_SWORD, "&6Sword of Beheading", "&7Beheading II", "", "&rHas a chance to behead Mobs", "&r(even a higher chance for Wither Skeletons)"); + public static final ItemStack BLADE_OF_VAMPIRES = new CustomItem(Material.GOLDEN_SWORD, "&cBlade of Vampires", "&7Life Steal I", "", "&rEverytime you attack something", "&ryou have a 45% chance to", "&rrecover 2 Hearts of your Health"); + public static final ItemStack SEISMIC_AXE = new CustomItem(Material.IRON_AXE, "&aSeismic Axe", "", "&7&oA portable Earthquake...", "", "&7&eRight Click&7 to use"); + + static { + GRANDMAS_WALKING_STICK.addUnsafeEnchantment(Enchantment.KNOCKBACK, 2); + GRANDPAS_WALKING_STICK.addUnsafeEnchantment(Enchantment.KNOCKBACK, 5); + + BLADE_OF_VAMPIRES.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 2); + BLADE_OF_VAMPIRES.addUnsafeEnchantment(Enchantment.DURABILITY, 4); + BLADE_OF_VAMPIRES.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 2); + } /* Bows */ - public static ItemStack EXPLOSIVE_BOW = new CustomItem(Material.BOW, "&cExplosive Bow", "&rAny Arrows fired using this Bow", "&rwill launch hit enemys into the air"); - public static ItemStack ICY_BOW = new CustomItem(Material.BOW, "&bIcy Bow", "&rAny Arrows fired using this Bow", "&rwill prevent hit enemys from moving", "&rfor 2 seconds"); + public static final ItemStack EXPLOSIVE_BOW = new CustomItem(Material.BOW, "&cExplosive Bow", "&rAny Arrows fired using this Bow", "&rwill launch hit enemys into the air"); + public static final ItemStack ICY_BOW = new CustomItem(Material.BOW, "&bIcy Bow", "&rAny Arrows fired using this Bow", "&rwill prevent hit enemys from moving", "&rfor 2 seconds"); /* Tools */ - public static ItemStack AUTO_SMELT_PICKAXE = new CustomItem(Material.DIAMOND_PICKAXE, "&6Smelter's Pickaxe", "&c&lAuto-Smelting", "", "&9Works with Fortune"); - public static ItemStack LUMBER_AXE = new CustomItem(Material.DIAMOND_AXE, "&6Lumber Axe", "&a&oCuts down the whole Tree..."); - public static ItemStack PICKAXE_OF_CONTAINMENT = new CustomItem(Material.IRON_PICKAXE, "&cPickaxe of Containment", "", "&9Can pickup Spawners"); - public static ItemStack HERCULES_PICKAXE = new CustomItem(Material.IRON_PICKAXE, "&9Hercules' Pickaxe", 0, new String[] {"", "&rSo powerful that it", "&rcrushes all mined Ores", "&rinto Dust..."}, new String[] {"DURABILITY-2", "DIG_SPEED-4"}); - public static ItemStack EXPLOSIVE_PICKAXE = new CustomItem(Material.DIAMOND_PICKAXE, "&eExplosive Pickaxe", "", "&rAllows you to mine a good bit", "&rof Blocks at once...", "", "&9Works with Fortune"); - public static ItemStack PICKAXE_OF_THE_SEEKER = new CustomItem(Material.DIAMOND_PICKAXE, "&aPickaxe of the Seeker", "&rWill always point you to the nearest Ore", "&rbut might get damaged when doing it", "", "&7&eRight Click&7 to be pointed to the nearest Ore"); - public static ItemStack COBALT_PICKAXE = new CustomItem(Material.IRON_PICKAXE, "&9Cobalt Pickaxe", 0, new String[0], new String[] {"DURABILITY-3", "DIG_SPEED-6"}); - public static ItemStack PICKAXE_OF_VEIN_MINING = new CustomItem(Material.DIAMOND_PICKAXE, "&ePickaxe of Vein Mining", "", "&rThis Pickaxe will dig out", "&rwhole Veins of Ores..."); + public static final ItemStack AUTO_SMELT_PICKAXE = new CustomItem(Material.DIAMOND_PICKAXE, "&6Smelter's Pickaxe", "&c&lAuto-Smelting", "", "&9Works with Fortune"); + public static final ItemStack LUMBER_AXE = new CustomItem(Material.DIAMOND_AXE, "&6Lumber Axe", "&a&oCuts down the whole Tree..."); + public static final ItemStack PICKAXE_OF_CONTAINMENT = new CustomItem(Material.IRON_PICKAXE, "&cPickaxe of Containment", "", "&9Can pickup Spawners"); + public static final ItemStack HERCULES_PICKAXE = new CustomItem(Material.IRON_PICKAXE, "&9Hercules' Pickaxe", "", "&rSo powerful that it", "&rcrushes all mined Ores", "&rinto Dust..."); + public static final ItemStack EXPLOSIVE_PICKAXE = new CustomItem(Material.DIAMOND_PICKAXE, "&eExplosive Pickaxe", "", "&rAllows you to mine a good bit", "&rof Blocks at once...", "", "&9Works with Fortune"); + public static final ItemStack EXPLOSIVE_SHOVEL = new CustomItem(Material.DIAMOND_SHOVEL, "&eExplosive Shovel", "", "&rAllows you to mine a good bit", "&rof diggable Blocks at once..."); + public static final ItemStack PICKAXE_OF_THE_SEEKER = new CustomItem(Material.DIAMOND_PICKAXE, "&aPickaxe of the Seeker", "&rWill always point you to the nearest Ore", "&rbut might get damaged when doing it", "", "&7&eRight Click&7 to be pointed to the nearest Ore"); + public static final ItemStack COBALT_PICKAXE = new CustomItem(Material.IRON_PICKAXE, "&9Cobalt Pickaxe"); + public static final ItemStack PICKAXE_OF_VEIN_MINING = new CustomItem(Material.DIAMOND_PICKAXE, "&ePickaxe of Vein Mining", "", "&rThis Pickaxe will dig out", "&rwhole Veins of Ores..."); + + static { + HERCULES_PICKAXE.addUnsafeEnchantment(Enchantment.DURABILITY, 5); + HERCULES_PICKAXE.addUnsafeEnchantment(Enchantment.DIG_SPEED, 3); + + COBALT_PICKAXE.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + COBALT_PICKAXE.addUnsafeEnchantment(Enchantment.DIG_SPEED, 6); + } /* Armor */ - public static ItemStack GLOWSTONE_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&e&lGlowstone Helmet", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); - public static ItemStack GLOWSTONE_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&e&lGlowstone Chestplate", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); - public static ItemStack GLOWSTONE_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&e&lGlowstone Leggings", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); - public static ItemStack GLOWSTONE_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&e&lGlowstone Boots", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); - public static ItemStack ENDER_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&5&lEnder Helmet", "", "&a&oSometimes its here, sometimes there!"), Color.fromRGB(28, 25, 112)); - public static ItemStack ENDER_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&5&lEnder Chestplate", "", "&a&oSometimes its here, sometimes there!"), Color.fromRGB(28, 25, 112)); - public static ItemStack ENDER_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&5&lEnder Leggings", "", "&a&oSometimes its here, sometimes there!"), Color.fromRGB(28, 25, 112)); - public static ItemStack ENDER_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&5&lEnder Boots", "", "&a&oSometimes its here, sometimes there!", "" , "&9+ No Enderpearl Damage"), Color.fromRGB(28, 25, 112)); - public static ItemStack SLIME_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&a&lSlime Helmet", "", "&a&oBouncy Feeling"), Color.LIME); - public static ItemStack SLIME_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&a&lSlime Chestplate", "", "&a&oBouncy Feeling"), Color.LIME); - public static ItemStack SLIME_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&a&lSlime Leggings", "", "&a&oBouncy Feeling", "", "&9+ Speed"), Color.LIME); - public static ItemStack SLIME_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&a&lSlime Boots", "", "&a&oBouncy Feeling", "", "&9+ Jump Boost", "&9+ No Fall Damage"), Color.LIME); - public static ItemStack CACTUS_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&2Cactus Helmet", 0, new String[0], new String[] {"THORNS-3", "DURABILITY-5"}), Color.GREEN); - public static ItemStack CACTUS_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&2Cactus Chestplate", 0, new String[0], new String[] {"THORNS-3", "DURABILITY-5"}), Color.GREEN); - public static ItemStack CACTUS_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&2Cactus Leggings", 0, new String[0], new String[] {"THORNS-3", "DURABILITY-5"}), Color.GREEN); - public static ItemStack CACTUS_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&2Cactus Boots", 0, new String[0], new String[] {"THORNS-3", "DURABILITY-5"}), Color.GREEN); - public static ItemStack DAMASCUS_STEEL_HELMET = new CustomItem(Material.IRON_HELMET, "&7Damascus Steel Helmet", new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-4"}, 0); - public static ItemStack DAMASCUS_STEEL_CHESTPLATE = new CustomItem(Material.IRON_CHESTPLATE, "&7Damascus Steel Chestplate", new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-4"}, 0); - public static ItemStack DAMASCUS_STEEL_LEGGINGS = new CustomItem(Material.IRON_LEGGINGS, "&7Damascus Steel Leggings", new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-4"}, 0); - public static ItemStack DAMASCUS_STEEL_BOOTS = new CustomItem(Material.IRON_BOOTS, "&7Damascus Steel Boots", new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-4"}, 0); - public static ItemStack REINFORCED_ALLOY_HELMET = new CustomItem(Material.IRON_HELMET, "&bReinforced Helmet", new String[] {"DURABILITY-9", "PROTECTION_ENVIRONMENTAL-9"}, 0); - public static ItemStack REINFORCED_ALLOY_CHESTPLATE = new CustomItem(Material.IRON_CHESTPLATE, "&bReinforced Chestplate", new String[] {"DURABILITY-9", "PROTECTION_ENVIRONMENTAL-9"}, 0); - public static ItemStack REINFORCED_ALLOY_LEGGINGS = new CustomItem(Material.IRON_LEGGINGS, "&bReinforced Leggings", new String[] {"DURABILITY-9", "PROTECTION_ENVIRONMENTAL-9"}, 0); - public static ItemStack REINFORCED_ALLOY_BOOTS = new CustomItem(Material.IRON_BOOTS, "&bReinforced Boots", new String[] {"DURABILITY-9", "PROTECTION_ENVIRONMENTAL-9"}, 0); - public static ItemStack SCUBA_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&cScuba Helmet", "", "&bAllows you to breathe Underwater", "&4&oPart of Hazmat Suit"), Color.ORANGE); - public static ItemStack HAZMATSUIT_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&cHazmat Suit", "", "&bAllows you to walk through Fire", "&4&oPart of Hazmat Suit"), Color.ORANGE); - public static ItemStack HAZMATSUIT_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&cHazmat Suit Leggings", "", "&4&oPart of Hazmat Suit"), Color.ORANGE); - public static ItemStack RUBBER_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&cRubber Boots", "", "&4&oPart of Hazmat Suit"), Color.BLACK); - public static ItemStack GILDED_IRON_HELMET = new CustomItem(Material.GOLDEN_HELMET, "&6Gilded Iron Helmet", new String[] {"DURABILITY-6", "PROTECTION_ENVIRONMENTAL-8"}, 0); - public static ItemStack GILDED_IRON_CHESTPLATE = new CustomItem(Material.GOLDEN_CHESTPLATE, "&6Gilded Iron Chestplate", new String[] {"DURABILITY-6", "PROTECTION_ENVIRONMENTAL-8"}, 0); - public static ItemStack GILDED_IRON_LEGGINGS = new CustomItem(Material.GOLDEN_LEGGINGS, "&6Gilded Iron Leggings", new String[] {"DURABILITY-6", "PROTECTION_ENVIRONMENTAL-8"}, 0); - public static ItemStack GILDED_IRON_BOOTS = new CustomItem(Material.GOLDEN_BOOTS, "&6Gilded Iron Boots", new String[] {"DURABILITY-6", "PROTECTION_ENVIRONMENTAL-8"}, 0); - public static ItemStack GOLD_HELMET = new CustomItem(Material.GOLDEN_HELMET, "&6Gold Helmet", 0, new String[] {"&912-Carat"}, new String[] {"DURABILITY-10"}); - public static ItemStack GOLD_CHESTPLATE = new CustomItem(Material.GOLDEN_CHESTPLATE, "&6Gold Chestplate", 0, new String[] {"&912-Carat"}, new String[] {"DURABILITY-10"}); - public static ItemStack GOLD_LEGGINGS = new CustomItem(Material.GOLDEN_LEGGINGS, "&6Gold Leggings", 0, new String[] {"&912-Carat"}, new String[] {"DURABILITY-10"}); - public static ItemStack GOLD_BOOTS = new CustomItem(Material.GOLDEN_BOOTS, "&6Gold Boots", 0, new String[] {"&912-Carat"}, new String[] {"DURABILITY-10"}); - public static ItemStack SLIME_HELMET_STEEL = new CustomItem(Material.IRON_HELMET, "&a&lSlime Helmet", 0, new String[] {"&7&oReinforced", "", "&a&oBouncy Feeling"}, new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-2"}); - public static ItemStack SLIME_CHESTPLATE_STEEL = new CustomItem(Material.IRON_CHESTPLATE, "&a&lSlime Chestplate", 0, new String[] {"&7&oReinforced", "", "&a&oBouncy Feeling"}, new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-2"}); - public static ItemStack SLIME_LEGGINGS_STEEL = new CustomItem(Material.IRON_LEGGINGS, "&a&lSlime Leggings", 0, new String[] {"&7&oReinforced", "", "&a&oBouncy Feeling", "", "&9+ Speed"}, new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-2"}); - public static ItemStack SLIME_BOOTS_STEEL = new CustomItem(Material.IRON_BOOTS, "&a&lSlime Boots", 0, new String[] {"&7&oReinforced", "", "&a&oBouncy Feeling", "", "&9+ Jump Boost", "&9+ No Fall Damage"}, new String[] {"DURABILITY-4", "PROTECTION_ENVIRONMENTAL-2"}); - public static ItemStack BOOTS_OF_THE_STOMPER = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&bBoots of the Stomper", "", "&9All Fall Damage you receive", "&9will be applied to nearby Mobs/Players", "", "&9+ No Fall Damage"), Color.AQUA); - public static ItemStack HEAVY_METAL_HELMET = new CustomItem(Material.IRON_HELMET, "&cHeavy Helmet", 0, new String[] {"", "&9+ Strength", "&9+ Slowness"}, new String[] {"DURABILITY-10", "PROTECTION_ENVIRONMENTAL-10"}); - public static ItemStack HEAVY_METAL_CHESTPLATE = new CustomItem(Material.IRON_CHESTPLATE, "&cHeavy Chestplate", 0, new String[] {"", "&9+ Strength", "&9+ Slowness"}, new String[] {"DURABILITY-10", "PROTECTION_ENVIRONMENTAL-10"}); - public static ItemStack HEAVY_METAL_LEGGINGS = new CustomItem(Material.IRON_LEGGINGS, "&cHeavy Leggings", 0, new String[] {"", "&9+ Strength", "&9+ Slowness"}, new String[] {"DURABILITY-10", "PROTECTION_ENVIRONMENTAL-10"}); - public static ItemStack HEAVY_METAL_BOOTS = new CustomItem(Material.IRON_BOOTS, "&cHeavy Boots", 0, new String[] {"", "&9+ Strength", "&9+ Slowness"}, new String[] {"DURABILITY-10", "PROTECTION_ENVIRONMENTAL-10"}); + public static final ItemStack GLOWSTONE_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&e&lGlowstone Helmet", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); + public static final ItemStack GLOWSTONE_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&e&lGlowstone Chestplate", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); + public static final ItemStack GLOWSTONE_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&e&lGlowstone Leggings", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); + public static final ItemStack GLOWSTONE_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&e&lGlowstone Boots", "", "&a&oShining like the sun!", "", "&9+ Night Vision"), Color.YELLOW); + + public static final ItemStack ENDER_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&5&lEnder Helmet", "", "&a&oSometimes its here, sometimes there!"), Color.fromRGB(28, 25, 112)); + public static final ItemStack ENDER_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&5&lEnder Chestplate", "", "&a&oSometimes its here, sometimes there!"), Color.fromRGB(28, 25, 112)); + public static final ItemStack ENDER_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&5&lEnder Leggings", "", "&a&oSometimes its here, sometimes there!"), Color.fromRGB(28, 25, 112)); + public static final ItemStack ENDER_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&5&lEnder Boots", "", "&a&oSometimes its here, sometimes there!", "" , "&9+ No Enderpearl Damage"), Color.fromRGB(28, 25, 112)); + + public static final ItemStack SLIME_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&a&lSlime Helmet", "", "&a&oBouncy Feeling"), Color.LIME); + public static final ItemStack SLIME_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&a&lSlime Chestplate", "", "&a&oBouncy Feeling"), Color.LIME); + public static final ItemStack SLIME_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&a&lSlime Leggings", "", "&a&oBouncy Feeling", "", "&9+ Speed"), Color.LIME); + public static final ItemStack SLIME_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&a&lSlime Boots", "", "&a&oBouncy Feeling", "", "&9+ Jump Boost", "&9+ No Fall Damage"), Color.LIME); + + public static final ItemStack CACTUS_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&2Cactus Helmet"), Color.GREEN); + public static final ItemStack CACTUS_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&2Cactus Chestplate"), Color.GREEN); + public static final ItemStack CACTUS_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&2Cactus Leggings"), Color.GREEN); + public static final ItemStack CACTUS_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&2Cactus Boots"), Color.GREEN); + + public static final ItemStack DAMASCUS_STEEL_HELMET = new CustomItem(Material.IRON_HELMET, "&7Damascus Steel Helmet"); + public static final ItemStack DAMASCUS_STEEL_CHESTPLATE = new CustomItem(Material.IRON_CHESTPLATE, "&7Damascus Steel Chestplate"); + public static final ItemStack DAMASCUS_STEEL_LEGGINGS = new CustomItem(Material.IRON_LEGGINGS, "&7Damascus Steel Leggings"); + public static final ItemStack DAMASCUS_STEEL_BOOTS = new CustomItem(Material.IRON_BOOTS, "&7Damascus Steel Boots"); + + public static final ItemStack REINFORCED_ALLOY_HELMET = new CustomItem(Material.IRON_HELMET, "&bReinforced Helmet"); + public static final ItemStack REINFORCED_ALLOY_CHESTPLATE = new CustomItem(Material.IRON_CHESTPLATE, "&bReinforced Chestplate"); + public static final ItemStack REINFORCED_ALLOY_LEGGINGS = new CustomItem(Material.IRON_LEGGINGS, "&bReinforced Leggings"); + public static final ItemStack REINFORCED_ALLOY_BOOTS = new CustomItem(Material.IRON_BOOTS, "&bReinforced Boots"); + + public static final ItemStack SCUBA_HELMET = new CustomArmor(new CustomItem(Material.LEATHER_HELMET, "&cScuba Helmet", "", "&bAllows you to breathe Underwater", "&4&oPart of Hazmat Suit"), Color.ORANGE); + public static final ItemStack HAZMATSUIT_CHESTPLATE = new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&cHazmat Suit", "", "&bAllows you to walk through Fire", "&4&oPart of Hazmat Suit"), Color.ORANGE); + public static final ItemStack HAZMATSUIT_LEGGINGS = new CustomArmor(new CustomItem(Material.LEATHER_LEGGINGS, "&cHazmat Suit Leggings", "", "&4&oPart of Hazmat Suit"), Color.ORANGE); + public static final ItemStack RUBBER_BOOTS = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&cRubber Boots", "", "&4&oPart of Hazmat Suit"), Color.BLACK); + + public static final ItemStack GILDED_IRON_HELMET = new CustomItem(Material.GOLDEN_HELMET, "&6Gilded Iron Helmet"); + public static final ItemStack GILDED_IRON_CHESTPLATE = new CustomItem(Material.GOLDEN_CHESTPLATE, "&6Gilded Iron Chestplate"); + public static final ItemStack GILDED_IRON_LEGGINGS = new CustomItem(Material.GOLDEN_LEGGINGS, "&6Gilded Iron Leggings"); + public static final ItemStack GILDED_IRON_BOOTS = new CustomItem(Material.GOLDEN_BOOTS, "&6Gilded Iron Boots"); + + public static final ItemStack GOLD_HELMET = new CustomItem(Material.GOLDEN_HELMET, "&6Gold Helmet", "&912-Carat"); + public static final ItemStack GOLD_CHESTPLATE = new CustomItem(Material.GOLDEN_CHESTPLATE, "&6Gold Chestplate", "&912-Carat"); + public static final ItemStack GOLD_LEGGINGS = new CustomItem(Material.GOLDEN_LEGGINGS, "&6Gold Leggings", "&912-Carat"); + public static final ItemStack GOLD_BOOTS = new CustomItem(Material.GOLDEN_BOOTS, "&6Gold Boots", "&912-Carat"); + + public static final ItemStack SLIME_HELMET_STEEL = new CustomItem(Material.IRON_HELMET, "&a&lSlime Helmet", "&7&oReinforced", "", "&a&oBouncy Feeling"); + public static final ItemStack SLIME_CHESTPLATE_STEEL = new CustomItem(Material.IRON_CHESTPLATE, "&a&lSlime Chestplate", "&7&oReinforced", "", "&a&oBouncy Feeling"); + public static final ItemStack SLIME_LEGGINGS_STEEL = new CustomItem(Material.IRON_LEGGINGS, "&a&lSlime Leggings", "&7&oReinforced", "", "&a&oBouncy Feeling", "", "&9+ Speed"); + public static final ItemStack SLIME_BOOTS_STEEL = new CustomItem(Material.IRON_BOOTS, "&a&lSlime Boots", "&7&oReinforced", "", "&a&oBouncy Feeling", "", "&9+ Jump Boost", "&9+ No Fall Damage"); + + public static final ItemStack HEAVY_METAL_HELMET = new CustomItem(Material.IRON_HELMET, "&cHeavy Helmet", "", "&9+ Strength", "&9+ Slowness"); + public static final ItemStack HEAVY_METAL_CHESTPLATE = new CustomItem(Material.IRON_CHESTPLATE, "&cHeavy Chestplate", "", "&9+ Strength", "&9+ Slowness"); + public static final ItemStack HEAVY_METAL_LEGGINGS = new CustomItem(Material.IRON_LEGGINGS, "&cHeavy Leggings", "", "&9+ Strength", "&9+ Slowness"); + public static final ItemStack HEAVY_METAL_BOOTS = new CustomItem(Material.IRON_BOOTS, "&cHeavy Boots", "", "&9+ Strength", "&9+ Slowness"); + + public static final ItemStack BOOTS_OF_THE_STOMPER = new CustomArmor(new CustomItem(Material.LEATHER_BOOTS, "&bBoots of the Stomper", "", "&9All Fall Damage you receive", "&9will be applied to nearby Mobs/Players", "", "&9+ No Fall Damage"), Color.AQUA); + + static { + Map cactus = new HashMap<>(); + cactus.put(Enchantment.THORNS, 3); + cactus.put(Enchantment.DURABILITY, 6); + + CACTUS_HELMET.addUnsafeEnchantments(cactus); + CACTUS_CHESTPLATE.addUnsafeEnchantments(cactus); + CACTUS_LEGGINGS.addUnsafeEnchantments(cactus); + CACTUS_BOOTS.addUnsafeEnchantments(cactus); + + Map damascus = new HashMap<>(); + damascus.put(Enchantment.DURABILITY, 5); + damascus.put(Enchantment.PROTECTION_ENVIRONMENTAL, 5); + + DAMASCUS_STEEL_HELMET.addUnsafeEnchantments(damascus); + DAMASCUS_STEEL_CHESTPLATE.addUnsafeEnchantments(damascus); + DAMASCUS_STEEL_LEGGINGS.addUnsafeEnchantments(damascus); + DAMASCUS_STEEL_BOOTS.addUnsafeEnchantments(damascus); + + Map reinforced = new HashMap<>(); + reinforced.put(Enchantment.DURABILITY, 9); + reinforced.put(Enchantment.PROTECTION_ENVIRONMENTAL, 9); + + REINFORCED_ALLOY_HELMET.addUnsafeEnchantments(reinforced); + REINFORCED_ALLOY_CHESTPLATE.addUnsafeEnchantments(reinforced); + REINFORCED_ALLOY_LEGGINGS.addUnsafeEnchantments(reinforced); + REINFORCED_ALLOY_BOOTS.addUnsafeEnchantments(reinforced); + + Map gilded = new HashMap<>(); + gilded.put(Enchantment.DURABILITY, 6); + gilded.put(Enchantment.PROTECTION_ENVIRONMENTAL, 8); + + GILDED_IRON_HELMET.addUnsafeEnchantments(gilded); + GILDED_IRON_CHESTPLATE.addUnsafeEnchantments(gilded); + GILDED_IRON_LEGGINGS.addUnsafeEnchantments(gilded); + GILDED_IRON_BOOTS.addUnsafeEnchantments(gilded); + + GOLD_HELMET.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + GOLD_CHESTPLATE.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + GOLD_LEGGINGS.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + GOLD_BOOTS.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + + Map slime = new HashMap<>(); + slime.put(Enchantment.DURABILITY, 4); + slime.put(Enchantment.PROTECTION_ENVIRONMENTAL, 2); + + SLIME_HELMET_STEEL.addUnsafeEnchantments(slime); + SLIME_CHESTPLATE_STEEL.addUnsafeEnchantments(slime); + SLIME_LEGGINGS_STEEL.addUnsafeEnchantments(slime); + SLIME_BOOTS_STEEL.addUnsafeEnchantments(slime); + + Map heavy = new HashMap<>(); + heavy.put(Enchantment.DURABILITY, 10); + heavy.put(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + + HEAVY_METAL_HELMET.addUnsafeEnchantments(heavy); + HEAVY_METAL_CHESTPLATE.addUnsafeEnchantments(heavy); + HEAVY_METAL_LEGGINGS.addUnsafeEnchantments(heavy); + HEAVY_METAL_BOOTS.addUnsafeEnchantments(heavy); + } /* Misc */ - public static ItemStack MAGIC_LUMP_1 = new CustomItem(Material.GOLD_NUGGET, "&6Magical Lump &7- &eI", "", "&c&oTier: I"); - public static ItemStack MAGIC_LUMP_2 = new CustomItem(Material.GOLD_NUGGET, "&6Magical Lump &7- &eII", "", "&c&oTier: II"); - public static ItemStack MAGIC_LUMP_3 = new CustomItem(Material.GOLD_NUGGET, "&6Magical Lump &7- &eIII", "", "&c&oTier: III"); - public static ItemStack ENDER_LUMP_1 = new CustomItem(Material.GOLD_NUGGET, "&5Ender Lump &7- &eI", "", "&c&oTier: I"); - public static ItemStack ENDER_LUMP_2 = new CustomItem(Material.GOLD_NUGGET, "&5Ender Lump &7- &eII", "", "&c&oTier: II"); - public static ItemStack ENDER_LUMP_3 = new CustomItem(Material.GOLD_NUGGET, "&5Ender Lump &7- &eIII", "", "&c&oTier: III"); - public static ItemStack MAGICAL_BOOK_COVER = new CustomItem(Material.PAPER, "&6Magical Book Cover", "", "&a&oUsed for various Magic Books"); - public static ItemStack BASIC_CIRCUIT_BOARD = new CustomItem(Material.ACTIVATOR_RAIL, "&bBasic Circuit Board"); - public static ItemStack ADVANCED_CIRCUIT_BOARD = new CustomItem(Material.POWERED_RAIL, "&bAdvanced Circuit Board"); - public static ItemStack WHEAT_FLOUR = new CustomItem(Material.SUGAR, "&rWheat Flour"); - public static ItemStack STEEL_PLATE = new CustomItem(Material.PAPER, "&7&lSteel Plate"); - public static ItemStack COMPRESSED_CARBON = null; - public static ItemStack BATTERY = null; - public static ItemStack CARBON_CHUNK = null; - public static ItemStack STEEL_THRUSTER = new CustomItem(Material.BUCKET, "&7&lSteel Thruster"); - public static ItemStack POWER_CRYSTAL = null; - public static ItemStack CHAIN = new CustomItem(Material.STRING, "&bChain"); - public static ItemStack HOOK = new CustomItem(Material.FLINT, "&bHook"); - public static ItemStack SIFTED_ORE = new CustomItem(Material.GUNPOWDER, "&6Sifted Ore"); - public static ItemStack STONE_CHUNK = null; - public static ItemStack LAVA_CRYSTAL = null; - public static ItemStack SALT = new CustomItem(Material.SUGAR, "&rSalt"); - public static ItemStack BUTTER = null; - public static ItemStack CHEESE = null; - public static ItemStack HEAVY_CREAM = new CustomItem(Material.SNOWBALL, "&rHeavy Cream"); - public static ItemStack CRUSHED_ORE = new CustomItem(Material.GUNPOWDER, "&6Crushed Ore"); - public static ItemStack PULVERIZED_ORE = new CustomItem(Material.GUNPOWDER, "&6Pulverized Ore"); - public static ItemStack PURE_ORE_CLUSTER = new CustomItem(Material.GUNPOWDER, "&6Pure Ore Cluster"); - public static ItemStack TINY_URANIUM = null; - public static ItemStack SMALL_URANIUM = null; - public static ItemStack MAGNET = null; - public static ItemStack NECROTIC_SKULL = new CustomItem(Material.WITHER_SKELETON_SKULL, "&cNecrotic Skull"); - public static ItemStack ESSENCE_OF_AFTERLIFE = new CustomItem(Material.GUNPOWDER, "&4Essence of Afterlife"); - public static ItemStack ELECTRO_MAGNET = null; - public static ItemStack HEATING_COIL = null; - public static ItemStack COOLING_UNIT = null; - public static ItemStack ELECTRIC_MOTOR = null; - public static ItemStack CARGO_MOTOR = null; - public static ItemStack SCROLL_OF_DIMENSIONAL_TELEPOSITION = new CustomItem(Material.PAPER, "&6Scroll of Dimensional Teleposition", "", "&cThis Scroll is capable of creating", "&ca temporary black Hole which pulls", "&cnearby Entities into itself and sends", "&cthem into another Dimension where", "&ceverything is turned around", "", "&rIn other words: Makes Entities turn by 180 Degrees"); - public static ItemStack TOME_OF_KNOWLEDGE_SHARING = new CustomItem(Material.BOOK, "&6Tome of Knowledge Sharing", "&7Owner: &bNone", "", "&eRight Click&7 to bind this Tome to yourself", "", "", "&eRight Click&7 to obtain all Researches by", "&7the previously assigned Owner"); - public static ItemStack HARDENED_GLASS = new CustomItem(Material.LIGHT_GRAY_STAINED_GLASS, "&7Hardened Glass", "", "&rWithstands Explosions"); - public static ItemStack WITHER_PROOF_OBSIDIAN = new CustomItem(Material.OBSIDIAN, "&5Wither-Proof Obsidian", "", "&rWithstands Explosions", "&rWithstands Wither Bosses"); - public static ItemStack WITHER_PROOF_GLASS = new CustomItem(Material.PURPLE_STAINED_GLASS, "&5Wither-Proof Glass", "", "&rWithstands Explosions", "&rWithstands Wither Bosses"); - public static ItemStack REINFORCED_PLATE = new CustomItem(Material.PAPER, "&7Reinforced Plate"); - public static ItemStack ANCIENT_PEDESTAL = new CustomItem(Material.DISPENSER, "&dAncient Pedestal", "", "&5Part of the Ancient Altar"); - public static ItemStack ANCIENT_ALTAR = new CustomItem(Material.ENCHANTING_TABLE, "&dAncient Altar", "", "&5Multi-Block Altar for", "&5magical Crafting Processes"); - public static ItemStack DUCT_TAPE = null; - public static ItemStack COPPER_WIRE = new CustomItem(Material.STRING, "&6Copper Wire", "", "&6Crucial component in electric modules"); - + public static final ItemStack MAGIC_LUMP_1 = new CustomItem(Material.GOLD_NUGGET, "&6Magical Lump &7- &eI", "", "&c&oTier: I"); + public static final ItemStack MAGIC_LUMP_2 = new CustomItem(Material.GOLD_NUGGET, "&6Magical Lump &7- &eII", "", "&c&oTier: II"); + public static final ItemStack MAGIC_LUMP_3 = new CustomItem(Material.GOLD_NUGGET, "&6Magical Lump &7- &eIII", "", "&c&oTier: III"); + public static final ItemStack ENDER_LUMP_1 = new CustomItem(Material.GOLD_NUGGET, "&5Ender Lump &7- &eI", "", "&c&oTier: I"); + public static final ItemStack ENDER_LUMP_2 = new CustomItem(Material.GOLD_NUGGET, "&5Ender Lump &7- &eII", "", "&c&oTier: II"); + public static final ItemStack ENDER_LUMP_3 = new CustomItem(Material.GOLD_NUGGET, "&5Ender Lump &7- &eIII", "", "&c&oTier: III"); + public static final ItemStack MAGICAL_BOOK_COVER = new CustomItem(Material.PAPER, "&6Magical Book Cover", "", "&a&oUsed for various Magic Books"); + public static final ItemStack BASIC_CIRCUIT_BOARD = new CustomItem(Material.ACTIVATOR_RAIL, "&bBasic Circuit Board"); + public static final ItemStack ADVANCED_CIRCUIT_BOARD = new CustomItem(Material.POWERED_RAIL, "&bAdvanced Circuit Board"); + public static final ItemStack WHEAT_FLOUR = new CustomItem(Material.SUGAR, "&rWheat Flour"); + public static final ItemStack STEEL_PLATE = new CustomItem(Material.PAPER, "&7&lSteel Plate"); + public static final ItemStack BATTERY = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmUyZGRhNmVmNjE4NWQ0ZGQ2ZWE4Njg0ZTk3ZDM5YmE4YWIwMzdlMjVmNzVjZGVhNmJkMjlkZjhlYjM0ZWUifX19"), "&6Battery"); + public static final ItemStack CARBON = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGIzYTA5NWI2YjgxZTZiOTg1M2ExOTMyNGVlZGYwYmI5MzQ5NDE3MjU4ZGQxNzNiOGVmZjg3YTA4N2FhIn19fQ=="), "&eCarbon"); + public static final ItemStack COMPRESSED_CARBON = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzIxZDQ5NTE2NTc0OGQzMTE2Zjk5ZDZiNWJkNWQ0MmViOGJhNTkyYmNkZmFkMzdmZDk1ZjliNmMwNGEzYiJ9fX0="), "&cCompressed Carbon"); + public static final ItemStack CARBON_CHUNK = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzIxZDQ5NTE2NTc0OGQzMTE2Zjk5ZDZiNWJkNWQ0MmViOGJhNTkyYmNkZmFkMzdmZDk1ZjliNmMwNGEzYiJ9fX0="), "&4Carbon Chunk"); + public static final ItemStack STEEL_THRUSTER = new CustomItem(Material.BUCKET, "&7&lSteel Thruster"); + public static final ItemStack POWER_CRYSTAL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTNjMWIwMzZiNmUwMzUxN2IyODVhODExYmQ4NWU3M2Y1YWJmZGFjYzFkZGY5MGRmZjk2MmUxODA5MzRlMyJ9fX0="), "&c&lPower Crystal"); + public static final ItemStack CHAIN = new CustomItem(Material.STRING, "&bChain"); + public static final ItemStack HOOK = new CustomItem(Material.FLINT, "&bHook"); + public static final ItemStack SIFTED_ORE = new CustomItem(Material.GUNPOWDER, "&6Sifted Ore"); + public static final ItemStack STONE_CHUNK = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2U4ZjVhZGIxNGQ2YzlmNmI4MTBkMDI3NTQzZjFhOGMxZjQxN2UyZmVkOTkzYzk3YmNkODljNzRmNWUyZTgifX19"), "&6Stone Chunk"); + public static final ItemStack LAVA_CRYSTAL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTNhZDhlZTg0OWVkZjA0ZWQ5YTI2Y2EzMzQxZjYwMzNiZDc2ZGNjNDIzMWVkMWVhNjNiNzU2NTc1MWIyN2FjIn19fQ=="), "&4Lava Crystal"); + public static final ItemStack SALT = new CustomItem(Material.SUGAR, "&rSalt"); + public static final ItemStack CHEESE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzRmZWJiYzE1ZDFkNGNjNjJiZWRjNWQ3YTJiNmYwZjQ2Y2Q1YjA2OTZhODg0ZGU3NWUyODllMzVjYmI1M2EwIn19fQ=="), "&rCheese"); + public static final ItemStack BUTTER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjY2YjE5ZjdkNjM1ZDAzNDczODkxZGYzMzAxN2M1NDkzNjMyMDlhOGY2MzI4YTg1NDJjMjEzZDA4NTI1ZSJ9fX0="), "&rButter"); + public static final ItemStack DUCT_TAPE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjJmYWFjZWFiNjM4NGZmZjVlZDI0YmI0NGE0YWYyZjU4NGViMTM4MjcyOWVjZDkzYTUzNjlhY2ZkNjY1NCJ9fX0="), "&8Duct Tape", "", "&rYou can repair Items using this", "&rin an Auto-Anvil"); + public static final ItemStack HEAVY_CREAM = new CustomItem(Material.SNOWBALL, "&rHeavy Cream"); + public static final ItemStack CRUSHED_ORE = new CustomItem(Material.GUNPOWDER, "&6Crushed Ore"); + public static final ItemStack PULVERIZED_ORE = new CustomItem(Material.GUNPOWDER, "&6Pulverized Ore"); + public static final ItemStack PURE_ORE_CLUSTER = new CustomItem(Material.GUNPOWDER, "&6Pure Ore Cluster"); + public static final ItemStack SMALL_URANIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzhiMjlhZmE2ZDZkYzkyM2UyZTEzMjRiZjgxOTI3NTBmN2JkYmRkYzY4OTYzMmEyYjZjMThkOWZlN2E1ZSJ9fX0="), "&cSmall Chunk of Uranium", "", "&eRadiation Level: MODERATE", "&4&oHazmat Suit required"); + public static final ItemStack TINY_URANIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzhiMjlhZmE2ZDZkYzkyM2UyZTEzMjRiZjgxOTI3NTBmN2JkYmRkYzY4OTYzMmEyYjZjMThkOWZlN2E1ZSJ9fX0="), "&cTiny Pile of Uranium", "", "&cRadiation Level: LOW", "&4&oNo Hazmat Suit required"); - public static ItemStack RAINBOW_WOOL = new CustomItem(Material.WHITE_WOOL, "&5Rainbow Wool", "", "&dCycles through all Colors of the Rainbow!"); - public static ItemStack RAINBOW_GLASS = new CustomItem(Material.WHITE_STAINED_GLASS, "&5Rainbow Glass", "", "&dCycles through all Colors of the Rainbow!"); - public static ItemStack RAINBOW_CLAY = new CustomItem(Material.WHITE_TERRACOTTA, "&5Rainbow Clay", "", "&dCycles through all Colors of the Rainbow!"); - public static ItemStack RAINBOW_GLASS_PANE = new CustomItem(Material.WHITE_STAINED_GLASS_PANE, "&5Rainbow Glass Pane", "", "&dCycles through all Colors of the Rainbow!"); + public static final ItemStack MAGNET = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWJhOGViYzRjNmE4MTczMDk0NzQ5OWJmN2UxZDVlNzNmZWQ2YzFiYjJjMDUxZTk2ZDM1ZWIxNmQyNDYxMGU3In19fQ=="), "&cMagnet"); + public static final ItemStack NECROTIC_SKULL = new CustomItem(Material.WITHER_SKELETON_SKULL, "&cNecrotic Skull"); + public static final ItemStack ESSENCE_OF_AFTERLIFE = new CustomItem(Material.GUNPOWDER, "&4Essence of Afterlife"); + public static final ItemStack ELECTRO_MAGNET = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWJhOGViYzRjNmE4MTczMDk0NzQ5OWJmN2UxZDVlNzNmZWQ2YzFiYjJjMDUxZTk2ZDM1ZWIxNmQyNDYxMGU3In19fQ=="), "&cElectromagnet"); + public static final ItemStack HEATING_COIL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2UzYmM0ODkzYmE0MWEzZjczZWUyODE3NGNkZjRmZWY2YjE0NWU0MWZlNmM4MmNiN2JlOGQ4ZTk3NzFhNSJ9fX0="), "&cHeating Coil"); + public static final ItemStack COOLING_UNIT = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzU0YmFkODZjOTlkZjc4MGM4ODlhMTA5OGY3NzY0OGVhZDczODVjYzFkZGIwOTNkYTVhN2Q4YzRjMmFlNTRkIn19fQ=="), "&bCooling Unit"); + public static final ItemStack ELECTRIC_MOTOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGNiY2EwMTJmNjdlNTRkZTlhZWU3MmZmNDI0ZTA1NmMyYWU1OGRlNWVhY2M5NDlhYjJiY2Q5NjgzY2VjIn19fQ=="), "&cElectric Motor"); + public static final ItemStack CARGO_MOTOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGNiY2EwMTJmNjdlNTRkZTlhZWU3MmZmNDI0ZTA1NmMyYWU1OGRlNWVhY2M5NDlhYjJiY2Q5NjgzY2VjIn19fQ=="), "&3Cargo Motor"); + public static final ItemStack SCROLL_OF_DIMENSIONAL_TELEPOSITION = new CustomItem(Material.PAPER, "&6Scroll of Dimensional Teleposition", "", "&cThis Scroll is capable of creating", "&ca temporary black Hole which pulls", "&cnearby Entities into itself and sends", "&cthem into another Dimension where", "&ceverything is turned around", "", "&rIn other words: Makes Entities turn by 180 Degrees"); + public static final ItemStack TOME_OF_KNOWLEDGE_SHARING = new CustomItem(Material.BOOK, "&6Tome of Knowledge Sharing", "&7Owner: &bNone", "", "&eRight Click&7 to bind this Tome to yourself", "", "", "&eRight Click&7 to obtain all Researches by", "&7the previously assigned Owner"); + public static final ItemStack HARDENED_GLASS = new CustomItem(Material.LIGHT_GRAY_STAINED_GLASS, "&7Hardened Glass", "", "&rWithstands Explosions"); + public static final ItemStack WITHER_PROOF_OBSIDIAN = new CustomItem(Material.OBSIDIAN, "&5Wither-Proof Obsidian", "", "&rWithstands Explosions", "&rWithstands Wither Bosses"); + public static final ItemStack WITHER_PROOF_GLASS = new CustomItem(Material.PURPLE_STAINED_GLASS, "&5Wither-Proof Glass", "", "&rWithstands Explosions", "&rWithstands Wither Bosses"); + public static final ItemStack REINFORCED_PLATE = new CustomItem(Material.PAPER, "&7Reinforced Plate"); + public static final ItemStack ANCIENT_PEDESTAL = new CustomItem(Material.DISPENSER, "&dAncient Pedestal", "", "&5Part of the Ancient Altar"); + public static final ItemStack ANCIENT_ALTAR = new CustomItem(Material.ENCHANTING_TABLE, "&dAncient Altar", "", "&5Multi-Block Altar for", "&5magical Crafting Processes"); + public static final ItemStack COPPER_WIRE = new CustomItem(Material.STRING, "&6Copper Wire", "", "&6Crucial component in electric modules"); - public static ItemStack RAINBOW_WOOL_XMAS = new CustomItem(Material.WHITE_WOOL, "&5Rainbow Wool &7(Christmas)", "", Christmas.color("< Christmas Edition >")); - public static ItemStack RAINBOW_GLASS_XMAS = new CustomItem(Material.WHITE_STAINED_GLASS, "&5Rainbow Glass &7(Christmas)", "", Christmas.color("< Christmas Edition >")); - public static ItemStack RAINBOW_CLAY_XMAS = new CustomItem(Material.WHITE_TERRACOTTA, "&5Rainbow Clay &7(Christmas)", "", Christmas.color("< Christmas Edition >")); - public static ItemStack RAINBOW_GLASS_PANE_XMAS = new CustomItem(Material.WHITE_STAINED_GLASS_PANE, "&5Rainbow Glass Pane &7(Christmas)", "", Christmas.color("< Christmas Edition >")); + public static final ItemStack RAINBOW_WOOL = new CustomItem(Material.WHITE_WOOL, "&5Rainbow Wool", "", "&dCycles through all Colors of the Rainbow!"); + public static final ItemStack RAINBOW_GLASS = new CustomItem(Material.WHITE_STAINED_GLASS, "&5Rainbow Glass", "", "&dCycles through all Colors of the Rainbow!"); + public static final ItemStack RAINBOW_CLAY = new CustomItem(Material.WHITE_TERRACOTTA, "&5Rainbow Clay", "", "&dCycles through all Colors of the Rainbow!"); + public static final ItemStack RAINBOW_GLASS_PANE = new CustomItem(Material.WHITE_STAINED_GLASS_PANE, "&5Rainbow Glass Pane", "", "&dCycles through all Colors of the Rainbow!"); - public static ItemStack RAINBOW_WOOL_VALENTINE = new CustomItem(Material.PINK_WOOL, "&5Rainbow Wool &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); - public static ItemStack RAINBOW_GLASS_VALENTINE = new CustomItem(Material.PINK_STAINED_GLASS, "&5Rainbow Glass &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); - public static ItemStack RAINBOW_CLAY_VALENTINE = new CustomItem(Material.PINK_TERRACOTTA, "&5Rainbow Clay &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); - public static ItemStack RAINBOW_GLASS_PANE_VALENTINE = new CustomItem(Material.PINK_STAINED_GLASS_PANE, "&5Rainbow Glass Pane &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); + public static final ItemStack RAINBOW_WOOL_XMAS = new CustomItem(Material.WHITE_WOOL, "&5Rainbow Wool &7(Christmas)", "", Christmas.color("< Christmas Edition >")); + public static final ItemStack RAINBOW_GLASS_XMAS = new CustomItem(Material.WHITE_STAINED_GLASS, "&5Rainbow Glass &7(Christmas)", "", Christmas.color("< Christmas Edition >")); + public static final ItemStack RAINBOW_CLAY_XMAS = new CustomItem(Material.WHITE_TERRACOTTA, "&5Rainbow Clay &7(Christmas)", "", Christmas.color("< Christmas Edition >")); + public static final ItemStack RAINBOW_GLASS_PANE_XMAS = new CustomItem(Material.WHITE_STAINED_GLASS_PANE, "&5Rainbow Glass Pane &7(Christmas)", "", Christmas.color("< Christmas Edition >")); + + public static final ItemStack RAINBOW_WOOL_VALENTINE = new CustomItem(Material.PINK_WOOL, "&5Rainbow Wool &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); + public static final ItemStack RAINBOW_GLASS_VALENTINE = new CustomItem(Material.PINK_STAINED_GLASS, "&5Rainbow Glass &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); + public static final ItemStack RAINBOW_CLAY_VALENTINE = new CustomItem(Material.PINK_TERRACOTTA, "&5Rainbow Clay &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); + public static final ItemStack RAINBOW_GLASS_PANE_VALENTINE = new CustomItem(Material.PINK_STAINED_GLASS_PANE, "&5Rainbow Glass Pane &7(Valentine's Day)", "", "&d< Valentine's Day Edition >"); /* Ingots */ - public static ItemStack COPPER_INGOT = new CustomItem(Material.BRICK, "&bCopper Ingot"); - public static ItemStack TIN_INGOT = new CustomItem(Material.IRON_INGOT, "&bTin Ingot"); - public static ItemStack SILVER_INGOT = new CustomItem(Material.IRON_INGOT, "&bSilver Ingot"); - public static ItemStack ALUMINUM_INGOT = new CustomItem(Material.IRON_INGOT, "&bAluminum Ingot"); - public static ItemStack LEAD_INGOT = new CustomItem(Material.IRON_INGOT, "&bLead Ingot"); - public static ItemStack ZINC_INGOT = new CustomItem(Material.IRON_INGOT, "&bZinc Ingot"); - public static ItemStack MAGNESIUM_INGOT = new CustomItem(Material.IRON_INGOT, "&bMagnesium Ingot"); + public static final ItemStack COPPER_INGOT = new CustomItem(Material.BRICK, "&bCopper Ingot"); + public static final ItemStack TIN_INGOT = new CustomItem(Material.IRON_INGOT, "&bTin Ingot"); + public static final ItemStack SILVER_INGOT = new CustomItem(Material.IRON_INGOT, "&bSilver Ingot"); + public static final ItemStack ALUMINUM_INGOT = new CustomItem(Material.IRON_INGOT, "&bAluminum Ingot"); + public static final ItemStack LEAD_INGOT = new CustomItem(Material.IRON_INGOT, "&bLead Ingot"); + public static final ItemStack ZINC_INGOT = new CustomItem(Material.IRON_INGOT, "&bZinc Ingot"); + public static final ItemStack MAGNESIUM_INGOT = new CustomItem(Material.IRON_INGOT, "&bMagnesium Ingot"); /* Alloy (Carbon + Iron) */ - public static ItemStack STEEL_INGOT = new CustomItem(Material.IRON_INGOT, "&bSteel Ingot"); + public static final ItemStack STEEL_INGOT = new CustomItem(Material.IRON_INGOT, "&bSteel Ingot"); /* Alloy (Copper + Tin) */ - public static ItemStack BRONZE_INGOT = new CustomItem(Material.BRICK, "&bBronze Ingot"); + public static final ItemStack BRONZE_INGOT = new CustomItem(Material.BRICK, "&bBronze Ingot"); /* Alloy (Copper + Aluminum) */ - public static ItemStack DURALUMIN_INGOT = new CustomItem(Material.IRON_INGOT, "&bDuralumin Ingot"); + public static final ItemStack DURALUMIN_INGOT = new CustomItem(Material.IRON_INGOT, "&bDuralumin Ingot"); /* Alloy (Copper + Silver) */ - public static ItemStack BILLON_INGOT = new CustomItem(Material.IRON_INGOT, "&bBillon Ingot"); + public static final ItemStack BILLON_INGOT = new CustomItem(Material.IRON_INGOT, "&bBillon Ingot"); /* Alloy (Copper + Zinc) */ - public static ItemStack BRASS_INGOT = new CustomItem(Material.GOLD_INGOT, "&bBrass Ingot"); + public static final ItemStack BRASS_INGOT = new CustomItem(Material.GOLD_INGOT, "&bBrass Ingot"); /* Alloy (Aluminum + Brass) */ - public static ItemStack ALUMINUM_BRASS_INGOT = new CustomItem(Material.GOLD_INGOT, "&bAluminum Brass Ingot"); + public static final ItemStack ALUMINUM_BRASS_INGOT = new CustomItem(Material.GOLD_INGOT, "&bAluminum Brass Ingot"); /* Alloy (Aluminum + Bronze) */ - public static ItemStack ALUMINUM_BRONZE_INGOT = new CustomItem(Material.GOLD_INGOT, "&bAluminum Bronze Ingot"); + public static final ItemStack ALUMINUM_BRONZE_INGOT = new CustomItem(Material.GOLD_INGOT, "&bAluminum Bronze Ingot"); /* Alloy (Gold + Silver + Copper) */ - public static ItemStack CORINTHIAN_BRONZE_INGOT = new CustomItem(Material.GOLD_INGOT, "&bCorinthian Bronze Ingot"); + public static final ItemStack CORINTHIAN_BRONZE_INGOT = new CustomItem(Material.GOLD_INGOT, "&bCorinthian Bronze Ingot"); /* Alloy (Lead + Tin) */ - public static ItemStack SOLDER_INGOT = new CustomItem(Material.IRON_INGOT, "&bSolder Ingot"); + public static final ItemStack SOLDER_INGOT = new CustomItem(Material.IRON_INGOT, "&bSolder Ingot"); /* Alloy (Steel + Iron + Carbon) */ - public static ItemStack DAMASCUS_STEEL_INGOT = new CustomItem(Material.IRON_INGOT, "&bDamascus Steel Ingot"); + public static final ItemStack DAMASCUS_STEEL_INGOT = new CustomItem(Material.IRON_INGOT, "&bDamascus Steel Ingot"); /* Alloy (Damascus Steel + Duralumin + Compressed Carbon + Aluminium Bronze) */ - public static ItemStack HARDENED_METAL_INGOT = new CustomItem(Material.IRON_INGOT, "&b&lHardened Metal"); + public static final ItemStack HARDENED_METAL_INGOT = new CustomItem(Material.IRON_INGOT, "&b&lHardened Metal"); /* Alloy (Hardened Metal + Corinthian Bronze + Solder + Billon + Damascus Steel) */ - public static ItemStack REINFORCED_ALLOY_INGOT = new CustomItem(Material.IRON_INGOT, "&b&lReinforced Alloy Ingot"); + public static final ItemStack REINFORCED_ALLOY_INGOT = new CustomItem(Material.IRON_INGOT, "&b&lReinforced Alloy Ingot"); /* Alloy (Iron + Silicon) */ - public static ItemStack FERROSILICON = new CustomItem(Material.IRON_INGOT, "&bFerrosilicon"); + public static final ItemStack FERROSILICON = new CustomItem(Material.IRON_INGOT, "&bFerrosilicon"); /* Alloy (Iron + Gold) */ - public static ItemStack GILDED_IRON = new CustomItem(Material.GOLD_INGOT, "&6&lGilded Iron"); + public static final ItemStack GILDED_IRON = new CustomItem(Material.GOLD_INGOT, "&6&lGilded Iron"); /* Alloy (Redston + Ferrosilicon) */ - public static ItemStack REDSTONE_ALLOY = new CustomItem(Material.BRICK, "&cRedstone Alloy Ingot"); + public static final ItemStack REDSTONE_ALLOY = new CustomItem(Material.BRICK, "&cRedstone Alloy Ingot"); /* Alloy (Iron + Copper) */ - public static ItemStack NICKEL_INGOT = new CustomItem(Material.IRON_INGOT, "&bNickel Ingot"); + public static final ItemStack NICKEL_INGOT = new CustomItem(Material.IRON_INGOT, "&bNickel Ingot"); /* Alloy (Nickel + Iron + Copper) */ - public static ItemStack COBALT_INGOT = new CustomItem(Material.IRON_INGOT, "&9Cobalt Ingot"); + public static final ItemStack COBALT_INGOT = new CustomItem(Material.IRON_INGOT, "&9Cobalt Ingot"); /* Gold */ - public static ItemStack GOLD_4K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(4-Carat)"); - public static ItemStack GOLD_6K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(6-Carat)"); - public static ItemStack GOLD_8K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(8-Carat)"); - public static ItemStack GOLD_10K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(10-Carat)"); - public static ItemStack GOLD_12K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(12-Carat)"); - public static ItemStack GOLD_14K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(14-Carat)"); - public static ItemStack GOLD_16K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(16-Carat)"); - public static ItemStack GOLD_18K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(18-Carat)"); - public static ItemStack GOLD_20K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(20-Carat)"); - public static ItemStack GOLD_22K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(22-Carat)"); - public static ItemStack GOLD_24K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(24-Carat)"); + public static final ItemStack GOLD_4K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(4-Carat)"); + public static final ItemStack GOLD_6K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(6-Carat)"); + public static final ItemStack GOLD_8K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(8-Carat)"); + public static final ItemStack GOLD_10K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(10-Carat)"); + public static final ItemStack GOLD_12K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(12-Carat)"); + public static final ItemStack GOLD_14K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(14-Carat)"); + public static final ItemStack GOLD_16K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(16-Carat)"); + public static final ItemStack GOLD_18K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(18-Carat)"); + public static final ItemStack GOLD_20K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(20-Carat)"); + public static final ItemStack GOLD_22K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(22-Carat)"); + public static final ItemStack GOLD_24K = new CustomItem(Material.GOLD_INGOT, "&rGold Ingot &7(24-Carat)"); /* Dusts */ - public static ItemStack IRON_DUST = new CustomItem(Material.GUNPOWDER, "&6Iron Dust"); - public static ItemStack GOLD_DUST = new CustomItem(Material.GLOWSTONE_DUST, "&6Gold Dust"); - public static ItemStack TIN_DUST = new CustomItem(Material.SUGAR, "&6Tin Dust"); - public static ItemStack COPPER_DUST = new CustomItem(Material.GLOWSTONE_DUST, "&6Copper Dust"); - public static ItemStack SILVER_DUST = new CustomItem(Material.SUGAR, "&6Silver Dust"); - public static ItemStack ALUMINUM_DUST = new CustomItem(Material.SUGAR, "&6Aluminum Dust"); - public static ItemStack LEAD_DUST = new CustomItem(Material.GUNPOWDER, "&6Lead Dust"); - public static ItemStack SULFATE = new CustomItem(Material.GLOWSTONE_DUST, "&6Sulfate"); - public static ItemStack ZINC_DUST = new CustomItem(Material.SUGAR, "&6Zinc Dust"); - public static ItemStack MAGNESIUM_DUST = new CustomItem(Material.SUGAR, "&6Magnesium"); - public static ItemStack CARBON = null; - public static ItemStack SILICON = new CustomItem(Material.FIREWORK_STAR, "&6Silicon"); - public static ItemStack GOLD_24K_BLOCK = new CustomItem(Material.GOLD_BLOCK, "&rGold Block &7(24-Carat)"); + public static final ItemStack IRON_DUST = new CustomItem(Material.GUNPOWDER, "&6Iron Dust"); + public static final ItemStack GOLD_DUST = new CustomItem(Material.GLOWSTONE_DUST, "&6Gold Dust"); + public static final ItemStack TIN_DUST = new CustomItem(Material.SUGAR, "&6Tin Dust"); + public static final ItemStack COPPER_DUST = new CustomItem(Material.GLOWSTONE_DUST, "&6Copper Dust"); + public static final ItemStack SILVER_DUST = new CustomItem(Material.SUGAR, "&6Silver Dust"); + public static final ItemStack ALUMINUM_DUST = new CustomItem(Material.SUGAR, "&6Aluminum Dust"); + public static final ItemStack LEAD_DUST = new CustomItem(Material.GUNPOWDER, "&6Lead Dust"); + public static final ItemStack SULFATE = new CustomItem(Material.GLOWSTONE_DUST, "&6Sulfate"); + public static final ItemStack ZINC_DUST = new CustomItem(Material.SUGAR, "&6Zinc Dust"); + public static final ItemStack MAGNESIUM_DUST = new CustomItem(Material.SUGAR, "&6Magnesium"); + public static final ItemStack SILICON = new CustomItem(Material.FIREWORK_STAR, "&6Silicon"); + public static final ItemStack GOLD_24K_BLOCK = new CustomItem(Material.GOLD_BLOCK, "&rGold Block &7(24-Carat)"); /* Gems */ - public static ItemStack SYNTHETIC_DIAMOND = new CustomItem(Material.DIAMOND, "&bSynthetic Diamond"); - public static ItemStack SYNTHETIC_EMERALD = new CustomItem(Material.EMERALD, "&bSynthetic Emerald"); - public static ItemStack SYNTHETIC_SAPPHIRE = null; - public static ItemStack CARBONADO = null; - public static ItemStack RAW_CARBONADO = null; - public static ItemStack URANIUM = null; - public static ItemStack NEPTUNIUM = null; - public static ItemStack PLUTONIUM = null; - public static ItemStack BOOSTED_URANIUM = null; + public static final ItemStack SYNTHETIC_DIAMOND = new CustomItem(Material.DIAMOND, "&bSynthetic Diamond"); + public static final ItemStack SYNTHETIC_EMERALD = new CustomItem(Material.EMERALD, "&bSynthetic Emerald"); + public static final ItemStack SYNTHETIC_SAPPHIRE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTM1MDMyZjRkN2QwMWRlOGVjOTlkODlmODcyMzAxMmQ0ZTc0ZmE3MzAyMmM0ZmFjZjFiNTdjN2ZmNmZmMCJ9fX0="), "&bSynthetic Sapphire"); + public static final ItemStack CARBONADO = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTJmNGIxNTc3ZjUxNjBjNjg5MzE3MjU3MWM0YTcxZDhiMzIxY2RjZWFhMDMyYzZlMGUzYjYwZTBiMzI4ZmEifX19"), "&b&lCarbonado", "", "&7&o\"Black Diamond\""); + public static final ItemStack RAW_CARBONADO = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWI0OWU2ZWMxMDc3MWU4OTkyMjVhZWE3M2NkOGNmMDM2ODRmNDExZDE0MTVjNzMyM2M5M2NiOTQ3NjIzMCJ9fX0="), "&bRaw Carbonado"); + + public static final ItemStack URANIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzhiMjlhZmE2ZDZkYzkyM2UyZTEzMjRiZjgxOTI3NTBmN2JkYmRkYzY4OTYzMmEyYjZjMThkOWZlN2E1ZSJ9fX0="), "&4Uranium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); + public static final ItemStack NEPTUNIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGVkZWE2YmZkMzdlNDlkZTQzZjE1NGZlNmZjYTYxN2Q0MTI5ZTYxYjk1NzU5YTNkNDlhMTU5MzVhMWMyZGNmMCJ9fX0="), "&aNeptunium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); + public static final ItemStack PLUTONIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjVjZjkxYjczODg2NjVhNmQ3YzFiNjAyNmJkYjIzMjJjNmQyNzg5OTdhNDQ0Nzg2NzdjYmNjMTVmNzYxMjRmIn19fQ=="), "&7Plutonium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); + public static final ItemStack BOOSTED_URANIUM = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjgzN2NhMTJmMjIyZjQ3ODcxOTZhMTdiOGFiNjU2OTg1Zjg0MDRjNTA3NjdhZGJjYjZlN2YxNDI1NGZlZSJ9fX0="), "&2Boosted Uranium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); /* Talisman */ - public static ItemStack TALISMAN = new CustomItem(Material.EMERALD, "&6Common Talisman"); - public static ItemStack TALISMAN_ANVIL = new CustomItem(Material.EMERALD, "&aTalisman of the Anvil", "", "&rEach Talisman can prevent", "&r1 Tool from breaking, but will then", "&rbe consumed", "", "&4&lWARNING:", "&4This Talisman does not work on", "&4Tools which are too powerful", "&4due to their complexity"); - public static ItemStack TALISMAN_MINER = new CustomItem(Material.EMERALD, "&aTalisman of the Miner", "", "&rWhile you have this Talisman", "&rin your Inventory it has", "&ra 20% chance of doubling", "&rall Ores you mine"); - public static ItemStack TALISMAN_HUNTER = new CustomItem(Material.EMERALD, "&aTalisman of the Hunter", "", "&rWhile you have this Talisman", "&rin your Inventory it has", "&ra 20% chance of doubling", "&rall Drops from Mobs you kill"); - public static ItemStack TALISMAN_LAVA = new CustomItem(Material.EMERALD, "&aTalisman of the Lava Walker", "", "&rWhile you have this Talisman", "&rin your Inventory it will", "&rgive you Fire Resistance", "&ras soon as you touch Lava", "&rbut will then be consumed"); - public static ItemStack TALISMAN_WATER = new CustomItem(Material.EMERALD, "&aTalisman of the Water Breather", "", "&rWhile you have this Talisman", "&rin your Inventory it will", "&rgive you the ability", "&rto breath underwater as", "&rsoon as you start drowning", "&rbut will then be consumed"); - public static ItemStack TALISMAN_ANGEL = new CustomItem(Material.EMERALD, "&aTalisman of the Angel", "", "&rWhile you have this Talisman", "&rin your Inventory it has a", "&r75% chance to prevent you", "&rfrom taking Fall Damage"); - public static ItemStack TALISMAN_FIRE = new CustomItem(Material.EMERALD, "&aTalisman of the Firefighter", "", "&rWhile you have this Talisman", "&rin your Inventory it will", "&rgive you Fire Resistance", "&ras soon as you start burning", "&rbut will then be consumed"); - public static ItemStack TALISMAN_MAGICIAN = new CustomItem(Material.EMERALD, "&aTalisman of the Magician", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou a 80% Luck Bonus on Enchanting", "&rYou will sometimes get an Extra Enchantment"); - public static ItemStack TALISMAN_TRAVELLER = new CustomItem(Material.EMERALD, "&aTalisman of the Traveller", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou a 60% Chance for a decent", "&rSpeed Buff when you start sprinting"); - public static ItemStack TALISMAN_WARRIOR = new CustomItem(Material.EMERALD, "&aTalisman of the Warrior", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou Strength III whenever you get hit", "&rbut will then be consumed"); - public static ItemStack TALISMAN_KNIGHT = new CustomItem(Material.EMERALD, "&aTalisman of the Knight", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou a 30% Chance for 5 Seconds of Regeneration", "&rwhenever You get hit", "&rbut will then be consumed"); - public static ItemStack TALISMAN_WHIRLWIND = new CustomItem(Material.EMERALD, "&aTalisman of the Whirlwind", "", "&rWhile you have this Talisman", "&rin your Inventory it will reflect", "&r60% of all Projectiles fired at you"); - public static ItemStack TALISMAN_WIZARD = new CustomItem(Material.EMERALD, "&aTalisman of the Wizard", "", "&rWhile you have this Talisman", "&rin your Inventory it allows you to", "&robtain Fortune Level 4/5 however", "&rit also has a chance to lower the", "&rLevel of some Enchantments on your Item"); + public static final ItemStack TALISMAN = new CustomItem(Material.EMERALD, "&6Common Talisman"); + public static final ItemStack TALISMAN_ANVIL = new CustomItem(Material.EMERALD, "&aTalisman of the Anvil", "", "&rEach Talisman can prevent", "&r1 Tool from breaking, but will then", "&rbe consumed", "", "&4&lWARNING:", "&4This Talisman does not work on", "&4Tools which are too powerful", "&4due to their complexity"); + public static final ItemStack TALISMAN_MINER = new CustomItem(Material.EMERALD, "&aTalisman of the Miner", "", "&rWhile you have this Talisman", "&rin your Inventory it has", "&ra 20% chance of doubling", "&rall Ores you mine"); + public static final ItemStack TALISMAN_HUNTER = new CustomItem(Material.EMERALD, "&aTalisman of the Hunter", "", "&rWhile you have this Talisman", "&rin your Inventory it has", "&ra 20% chance of doubling", "&rall Drops from Mobs you kill"); + public static final ItemStack TALISMAN_LAVA = new CustomItem(Material.EMERALD, "&aTalisman of the Lava Walker", "", "&rWhile you have this Talisman", "&rin your Inventory it will", "&rgive you Fire Resistance", "&ras soon as you touch Lava", "&rbut will then be consumed"); + public static final ItemStack TALISMAN_WATER = new CustomItem(Material.EMERALD, "&aTalisman of the Water Breather", "", "&rWhile you have this Talisman", "&rin your Inventory it will", "&rgive you the ability", "&rto breath underwater as", "&rsoon as you start drowning", "&rbut will then be consumed"); + public static final ItemStack TALISMAN_ANGEL = new CustomItem(Material.EMERALD, "&aTalisman of the Angel", "", "&rWhile you have this Talisman", "&rin your Inventory it has a", "&r75% chance to prevent you", "&rfrom taking Fall Damage"); + public static final ItemStack TALISMAN_FIRE = new CustomItem(Material.EMERALD, "&aTalisman of the Firefighter", "", "&rWhile you have this Talisman", "&rin your Inventory it will", "&rgive you Fire Resistance", "&ras soon as you start burning", "&rbut will then be consumed"); + public static final ItemStack TALISMAN_MAGICIAN = new CustomItem(Material.EMERALD, "&aTalisman of the Magician", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou a 80% Luck Bonus on Enchanting", "&rYou will sometimes get an Extra Enchantment"); + public static final ItemStack TALISMAN_TRAVELLER = new CustomItem(Material.EMERALD, "&aTalisman of the Traveller", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou a 60% Chance for a decent", "&rSpeed Buff when you start sprinting"); + public static final ItemStack TALISMAN_WARRIOR = new CustomItem(Material.EMERALD, "&aTalisman of the Warrior", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou Strength III whenever you get hit", "&rbut will then be consumed"); + public static final ItemStack TALISMAN_KNIGHT = new CustomItem(Material.EMERALD, "&aTalisman of the Knight", "", "&rWhile you have this Talisman", "&rin your Inventory it gives", "&ryou a 30% Chance for 5 Seconds of Regeneration", "&rwhenever You get hit", "&rbut will then be consumed"); + public static final ItemStack TALISMAN_WHIRLWIND = new CustomItem(Material.EMERALD, "&aTalisman of the Whirlwind", "", "&rWhile you have this Talisman", "&rin your Inventory it will reflect", "&r60% of all Projectiles fired at you"); + public static final ItemStack TALISMAN_WIZARD = new CustomItem(Material.EMERALD, "&aTalisman of the Wizard", "", "&rWhile you have this Talisman", "&rin your Inventory it allows you to", "&robtain Fortune Level 4/5 however", "&rit also has a chance to lower the", "&rLevel of some Enchantments on your Item"); /* Staves */ - public static ItemStack STAFF_ELEMENTAL = new CustomItem(Material.STICK, "&6Elemental Staff"); - public static ItemStack STAFF_WIND = new CustomItem(Material.STICK, "&6Elemental Staff &7- &b&oWind", 0, new String[] {"", "&7Element: &b&oWind", "", "&7&eRight Click&7 to launch yourself forward"}, new String[] {"LUCK-1"}); - public static ItemStack STAFF_FIRE = new CustomItem(Material.STICK, "&6Elemental Staff &7- &c&oFire", 0, new String[] {"", "&7Element: &c&oFire"}, new String[] {"FIRE_ASPECT-5"}); - public static ItemStack STAFF_WATER = new CustomItem(Material.STICK, "&6Elemental Staff &7- &1&oWater", 0, new String[] {"", "&7Element: &1&oWater", "", "&7&eRight Click&7 to extinguish yourself"}, new String[] {"WATER_WORKER-1"}); + public static final ItemStack STAFF_ELEMENTAL = new CustomItem(Material.STICK, "&6Elemental Staff"); + public static final ItemStack STAFF_WIND = new CustomItem(Material.STICK, "&6Elemental Staff &7- &b&oWind", "", "&7Element: &b&oWind", "", "&eRight Click&7 to launch yourself forward"); + public static final ItemStack STAFF_FIRE = new CustomItem(Material.STICK, "&6Elemental Staff &7- &c&oFire", "", "&7Element: &c&oFire"); + public static final ItemStack STAFF_WATER = new CustomItem(Material.STICK, "&6Elemental Staff &7- &1&oWater", "", "&7Element: &1&oWater", "", "&eRight Click&7 to extinguish yourself"); + public static final ItemStack STAFF_STORM = new CustomItem(Material.STICK, "&6Elemental Staff &7- &8&oStorm", "", "&7Element: &8&oStorm", "", "&eRight Click&7 to summon a lightning", "&eX Uses &7left"); + + static { + STAFF_WIND.addUnsafeEnchantment(Enchantment.LUCK, 1); + STAFF_FIRE.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 5); + STAFF_WATER.addUnsafeEnchantment(Enchantment.WATER_WORKER, 1); + STAFF_STORM.addUnsafeEnchantment(Enchantment.DURABILITY, 1); + } /* Machines */ - public static ItemStack GRIND_STONE = new CustomItem(Material.DISPENSER, "&bGrind Stone", "", "&a&oGrinds Items for more Efficiency"); - public static ItemStack ARMOR_FORGE = new CustomItem(Material.ANVIL, "&6Armor Forge", "", "&a&oGives you the Ability to create powerful Armor"); - public static ItemStack SMELTERY = new CustomItem(Material.FURNACE, "&6Smeltery", "", "&a&oActs as a high-temperature Furnace for Metals"); - public static ItemStack IGNITION_CHAMBER = new CustomItem(Material.HOPPER, "&4Automatic Ignition Chamber", "&rPrevents the Smeltery from using up fire.", "&rRequires Flint and Steel", "&rMust be placed adjacent to the Smeltery's dispenser"); - public static ItemStack ORE_CRUSHER = new CustomItem(Material.DISPENSER, "&bOre Crusher", "", "&a&oCrushes Ores to double them"); - public static ItemStack COMPRESSOR = new CustomItem(Material.PISTON, "&bCompressor", "", "&a&oCompresses Items"); - public static ItemStack PRESSURE_CHAMBER = new CustomItem(Material.GLASS, "&bPressure Chamber", "", "&a&oCompresses Items even more"); - public static ItemStack MAGIC_WORKBENCH = new CustomItem(Material.CRAFTING_TABLE, "&6Magic Workbench", "Infuses Items with magical Energy"); - public static ItemStack ORE_WASHER = new CustomItem(Material.CAULDRON, "&6Ore Washer", "", "&a&oWashes Sifted Ore to filter Ores", "&a&oand gives you small Stone Chunks"); - public static ItemStack TABLE_SAW = new CustomItem(Material.STONECUTTER, "&6Table Saw", "", "&a&oAllows you get 8 planks from 1 Log", "&a&o(Works with all log types)"); - public static ItemStack SAW_MILL = new CustomItem(Material.BARRIER, "&6Saw Mill", "", "&cObsolete! Use the Table Saw instead"); - public static ItemStack COMPOSTER = new CustomItem(Material.CAULDRON, "&aComposter", "", "&a&oCan convert various Materials over Time..."); - public static ItemStack ENHANCED_CRAFTING_TABLE = new CustomItem(Material.CRAFTING_TABLE, "&eEnhanced Crafting Table", "", "&a&oA regular Crafting Table cannot", "&a&ohold this massive Amount of Power..."); - public static ItemStack CRUCIBLE = new CustomItem(Material.CAULDRON, "&cCrucible", "", "&a&oUsed to smelt Items into Liquids"); - public static ItemStack JUICER = new CustomItem(Material.GLASS_BOTTLE, "&aJuicer", "", "&a&oAllows you to create delicious Juice"); + public static final ItemStack GRIND_STONE = new CustomItem(Material.DISPENSER, "&bGrind Stone", "", "&a&oGrinds Items for more Efficiency"); + public static final ItemStack ARMOR_FORGE = new CustomItem(Material.ANVIL, "&6Armor Forge", "", "&a&oGives you the Ability to create powerful Armor"); + public static final ItemStack SMELTERY = new CustomItem(Material.FURNACE, "&6Smeltery", "", "&a&oActs as a high-temperature Furnace for Metals"); + public static final ItemStack IGNITION_CHAMBER = new CustomItem(Material.HOPPER, "&4Automatic Ignition Chamber", "&rPrevents the Smeltery from using up fire.", "&rRequires Flint and Steel", "&rMust be placed adjacent to the Smeltery's dispenser"); + public static final ItemStack ORE_CRUSHER = new CustomItem(Material.DISPENSER, "&bOre Crusher", "", "&a&oCrushes Ores to double them"); + public static final ItemStack COMPRESSOR = new CustomItem(Material.PISTON, "&bCompressor", "", "&a&oCompresses Items"); + public static final ItemStack PRESSURE_CHAMBER = new CustomItem(Material.GLASS, "&bPressure Chamber", "", "&a&oCompresses Items even more"); + public static final ItemStack MAGIC_WORKBENCH = new CustomItem(Material.CRAFTING_TABLE, "&6Magic Workbench", "Infuses Items with magical Energy"); + public static final ItemStack ORE_WASHER = new CustomItem(Material.CAULDRON, "&6Ore Washer", "", "&a&oWashes Sifted Ore to filter Ores", "&a&oand gives you small Stone Chunks"); + public static final ItemStack TABLE_SAW = new CustomItem(Material.STONECUTTER, "&6Table Saw", "", "&a&oAllows you get 8 planks from 1 Log", "&a&o(Works with all log types)"); + public static final ItemStack SAW_MILL = new CustomItem(Material.BARRIER, "&6Saw Mill", "", "&cObsolete! Use the Table Saw instead"); + public static final ItemStack COMPOSTER = new CustomItem(Material.CAULDRON, "&aComposter", "", "&a&oCan convert various Materials over Time..."); + public static final ItemStack ENHANCED_CRAFTING_TABLE = new CustomItem(Material.CRAFTING_TABLE, "&eEnhanced Crafting Table", "", "&a&oA regular Crafting Table cannot", "&a&ohold this massive Amount of Power..."); + public static final ItemStack CRUCIBLE = new CustomItem(Material.CAULDRON, "&cCrucible", "", "&a&oUsed to smelt Items into Liquids"); + public static final ItemStack JUICER = new CustomItem(Material.GLASS_BOTTLE, "&aJuicer", "", "&a&oAllows you to create delicious Juice"); - public static ItemStack SOLAR_PANEL = new CustomItem(Material.DAYLIGHT_DETECTOR, "&bSolar Panel", "", "&a&oTransforms Sunlight to Energy"); - public static ItemStack SOLAR_ARRAY = new CustomItem(Material.DAYLIGHT_DETECTOR, "&bSolar Array", "", "&a&oTransforms Sunlight to Energy"); - public static ItemStack DIGITAL_MINER = new CustomItem(Material.IRON_PICKAXE, "&bDigital Miner", "", "&a&oDigs out everything!"); - public static ItemStack ADVANCED_DIGITAL_MINER = new CustomItem(Material.DIAMOND_PICKAXE, "&6Advanced Digital Miner", "", "&a&oDigs out everything!", "&a&oAutomatically crushes your Ores"); - public static ItemStack AUTOMATED_PANNING_MACHINE = new CustomItem(Material.BOWL, "&aAutomated Panning Machine", "", "&a&oA MultiBlock Version of the Gold Pan"); - public static ItemStack OUTPUT_CHEST = new CustomItem(Material.CHEST, "&4Output Chest", "", "&c&oA basic machine will try to put", "&c&oitems in this chest if it's placed", "&c&oadjacent to the dispenser."); - public static ItemStack HOLOGRAM_PROJECTOR = new CustomItem(Material.QUARTZ_SLAB, "&bHologram Projector", "", "&rProjects an Editable Hologram"); + public static final ItemStack SOLAR_PANEL = new CustomItem(Material.DAYLIGHT_DETECTOR, "&bSolar Panel", "", "&a&oTransforms Sunlight to Energy"); + public static final ItemStack SOLAR_ARRAY = new CustomItem(Material.DAYLIGHT_DETECTOR, "&bSolar Array", "", "&a&oTransforms Sunlight to Energy"); + + @Deprecated + public static final ItemStack DIGITAL_MINER = new CustomItem(Material.IRON_PICKAXE, "&bDigital Miner", "", "&4DEPRECATED", "&cThis machine will soon be removed!"); + + @Deprecated + public static final ItemStack ADVANCED_DIGITAL_MINER = new CustomItem(Material.DIAMOND_PICKAXE, "&6Advanced Digital Miner", "", "&4DEPRECATED", "&cThis machine will soon be removed!"); + + public static final ItemStack AUTOMATED_PANNING_MACHINE = new CustomItem(Material.BOWL, "&aAutomated Panning Machine", "", "&a&oA MultiBlock Version of the Gold Pan"); + public static final ItemStack OUTPUT_CHEST = new CustomItem(Material.CHEST, "&4Output Chest", "", "&c&oA basic machine will try to put", "&c&oitems in this chest if it's placed", "&c&oadjacent to the dispenser."); + public static final ItemStack HOLOGRAM_PROJECTOR = new CustomItem(Material.QUARTZ_SLAB, "&bHologram Projector", "", "&rProjects an Editable Hologram"); /* Enhanced Furnaces */ - public static ItemStack ENHANCED_FURNACE = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eI", "", "&7Processing Speed: &e1x", "&7Fuel Efficiency: &e1x", "&7Luck Multiplier: &e1x"); - public static ItemStack ENHANCED_FURNACE_2 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eII", "", "&7Processing Speed: &e2x", "&7Fuel Efficiency: &e1x", "&7Luck Multiplier: &e1x"); - public static ItemStack ENHANCED_FURNACE_3 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eIII", "", "&7Processing Speed: &e2x", "&7Fuel Efficiency: &e2x", "&7Luck Multiplier: &e1x"); - public static ItemStack ENHANCED_FURNACE_4 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eIV", "", "&7Processing Speed: &e3x", "&7Fuel Efficiency: &e2x", "&7Luck Multiplier: &e1x"); - public static ItemStack ENHANCED_FURNACE_5 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eV", "", "&7Processing Speed: &e3x", "&7Fuel Efficiency: &e2x", "&7Luck Multiplier: &e2x"); - public static ItemStack ENHANCED_FURNACE_6 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eVI", "", "&7Processing Speed: &e3x", "&7Fuel Efficiency: &e3x", "&7Luck Multiplier: &e2x"); - public static ItemStack ENHANCED_FURNACE_7 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eVII", "", "&7Processing Speed: &e4x", "&7Fuel Efficiency: &e3x", "&7Luck Multiplier: &e2x"); - public static ItemStack ENHANCED_FURNACE_8 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eVIII", "", "&7Processing Speed: &e4x", "&7Fuel Efficiency: &e4x", "&7Luck Multiplier: &e2x"); - public static ItemStack ENHANCED_FURNACE_9 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eIX", "", "&7Processing Speed: &e5x", "&7Fuel Efficiency: &e4x", "&7Luck Multiplier: &e2x"); - public static ItemStack ENHANCED_FURNACE_10 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eX", "", "&7Processing Speed: &e5x", "&7Fuel Efficiency: &e5x", "&7Luck Multiplier: &e2x"); - public static ItemStack ENHANCED_FURNACE_11 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eXI", "", "&7Processing Speed: &e5x", "&7Fuel Efficiency: &e5x", "&7Luck Multiplier: &e3x"); - public static ItemStack REINFORCED_FURNACE = new CustomItem(Material.FURNACE, "&7Reinforced Furnace", "", "&7Processing Speed: &e10x", "&7Fuel Efficiency: &e10x", "&7Luck Multiplier: &e3x"); - public static ItemStack CARBONADO_EDGED_FURNACE = new CustomItem(Material.FURNACE, "&7Carbonado Edged Furnace", "", "&7Processing Speed: &e20x", "&7Fuel Efficiency: &e10x", "&7Luck Multiplier: &e3x"); + public static final ItemStack ENHANCED_FURNACE = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eI", "", "&7Processing Speed: &e1x", "&7Fuel Efficiency: &e1x", "&7Luck Multiplier: &e1x"); + public static final ItemStack ENHANCED_FURNACE_2 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eII", "", "&7Processing Speed: &e2x", "&7Fuel Efficiency: &e1x", "&7Luck Multiplier: &e1x"); + public static final ItemStack ENHANCED_FURNACE_3 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eIII", "", "&7Processing Speed: &e2x", "&7Fuel Efficiency: &e2x", "&7Luck Multiplier: &e1x"); + public static final ItemStack ENHANCED_FURNACE_4 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eIV", "", "&7Processing Speed: &e3x", "&7Fuel Efficiency: &e2x", "&7Luck Multiplier: &e1x"); + public static final ItemStack ENHANCED_FURNACE_5 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eV", "", "&7Processing Speed: &e3x", "&7Fuel Efficiency: &e2x", "&7Luck Multiplier: &e2x"); + public static final ItemStack ENHANCED_FURNACE_6 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eVI", "", "&7Processing Speed: &e3x", "&7Fuel Efficiency: &e3x", "&7Luck Multiplier: &e2x"); + public static final ItemStack ENHANCED_FURNACE_7 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eVII", "", "&7Processing Speed: &e4x", "&7Fuel Efficiency: &e3x", "&7Luck Multiplier: &e2x"); + public static final ItemStack ENHANCED_FURNACE_8 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eVIII", "", "&7Processing Speed: &e4x", "&7Fuel Efficiency: &e4x", "&7Luck Multiplier: &e2x"); + public static final ItemStack ENHANCED_FURNACE_9 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eIX", "", "&7Processing Speed: &e5x", "&7Fuel Efficiency: &e4x", "&7Luck Multiplier: &e2x"); + public static final ItemStack ENHANCED_FURNACE_10 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eX", "", "&7Processing Speed: &e5x", "&7Fuel Efficiency: &e5x", "&7Luck Multiplier: &e2x"); + public static final ItemStack ENHANCED_FURNACE_11 = new CustomItem(Material.FURNACE, "&7Enhanced Furnace - &eXI", "", "&7Processing Speed: &e5x", "&7Fuel Efficiency: &e5x", "&7Luck Multiplier: &e3x"); + public static final ItemStack REINFORCED_FURNACE = new CustomItem(Material.FURNACE, "&7Reinforced Furnace", "", "&7Processing Speed: &e10x", "&7Fuel Efficiency: &e10x", "&7Luck Multiplier: &e3x"); + public static final ItemStack CARBONADO_EDGED_FURNACE = new CustomItem(Material.FURNACE, "&7Carbonado Edged Furnace", "", "&7Processing Speed: &e20x", "&7Fuel Efficiency: &e10x", "&7Luck Multiplier: &e3x"); - public static ItemStack BLOCK_PLACER = new CustomItem(Material.DISPENSER, "&aBlock Placer", "", "&rAll Blocks in this Dispenser", "&rwill automatically get placed"); + public static final ItemStack BLOCK_PLACER = new CustomItem(Material.DISPENSER, "&aBlock Placer", "", "&rAll Blocks in this Dispenser", "&rwill automatically get placed"); /* Soulbound Items */ - public static ItemStack SOULBOUND_SWORD = new CustomItem(Material.DIAMOND_SWORD, "&cSoulbound Sword"); - public static ItemStack SOULBOUND_BOW = new CustomItem(Material.BOW, "&cSoulbound Bow"); - public static ItemStack SOULBOUND_PICKAXE = new CustomItem(Material.DIAMOND_PICKAXE, "&cSoulbound Pickaxe"); - public static ItemStack SOULBOUND_AXE = new CustomItem(Material.DIAMOND_AXE, "&cSoulbound Axe"); - public static ItemStack SOULBOUND_SHOVEL = new CustomItem(Material.DIAMOND_SHOVEL, "&cSoulbound Shovel"); - public static ItemStack SOULBOUND_HOE = new CustomItem(Material.DIAMOND_HOE, "&cSoulbound Hoe"); + public static final ItemStack SOULBOUND_SWORD = new CustomItem(Material.DIAMOND_SWORD, "&cSoulbound Sword"); + public static final ItemStack SOULBOUND_BOW = new CustomItem(Material.BOW, "&cSoulbound Bow"); + public static final ItemStack SOULBOUND_PICKAXE = new CustomItem(Material.DIAMOND_PICKAXE, "&cSoulbound Pickaxe"); + public static final ItemStack SOULBOUND_AXE = new CustomItem(Material.DIAMOND_AXE, "&cSoulbound Axe"); + public static final ItemStack SOULBOUND_SHOVEL = new CustomItem(Material.DIAMOND_SHOVEL, "&cSoulbound Shovel"); + public static final ItemStack SOULBOUND_HOE = new CustomItem(Material.DIAMOND_HOE, "&cSoulbound Hoe"); - public static ItemStack SOULBOUND_HELMET = new CustomItem(Material.DIAMOND_HELMET, "&cSoulbound Helmet"); - public static ItemStack SOULBOUND_CHESTPLATE = new CustomItem(Material.DIAMOND_CHESTPLATE, "&cSoulbound Chestplate"); - public static ItemStack SOULBOUND_LEGGINGS = new CustomItem(Material.DIAMOND_LEGGINGS, "&cSoulbound Leggings"); - public static ItemStack SOULBOUND_BOOTS = new CustomItem(Material.DIAMOND_BOOTS, "&cSoulbound Boots"); + public static final ItemStack SOULBOUND_HELMET = new CustomItem(Material.DIAMOND_HELMET, "&cSoulbound Helmet"); + public static final ItemStack SOULBOUND_CHESTPLATE = new CustomItem(Material.DIAMOND_CHESTPLATE, "&cSoulbound Chestplate"); + public static final ItemStack SOULBOUND_LEGGINGS = new CustomItem(Material.DIAMOND_LEGGINGS, "&cSoulbound Leggings"); + public static final ItemStack SOULBOUND_BOOTS = new CustomItem(Material.DIAMOND_BOOTS, "&cSoulbound Boots"); /* Runes */ - public static ItemStack BLANK_RUNE = null; - public static ItemStack RUNE_AIR = null; - public static ItemStack RUNE_WATER = null; - public static ItemStack RUNE_FIRE = null; - public static ItemStack RUNE_EARTH = null; - public static ItemStack RUNE_ENDER = null; - public static ItemStack RUNE_RAINBOW = null; + public static final ItemStack BLANK_RUNE; + public static final ItemStack RUNE_AIR; + public static final ItemStack RUNE_WATER; + public static final ItemStack RUNE_FIRE; + public static final ItemStack RUNE_EARTH; + public static final ItemStack RUNE_ENDER; + public static final ItemStack RUNE_RAINBOW; + public static final ItemStack RUNE_LIGHTNING; static { ItemStack itemB = new ItemStack(Material.FIREWORK_STAR); @@ -471,327 +586,214 @@ public class SlimefunItems { imR.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Ancient Rune &8&l[&d&lRainbow&8&l]")); itemR.setItemMeta(imR); RUNE_RAINBOW = itemR; + + ItemStack itemL = new ItemStack(Material.FIREWORK_STAR); + FireworkEffectMeta imL = (FireworkEffectMeta) itemL.getItemMeta(); + imL.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.YELLOW).build()); + imL.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Ancient Rune &8&l[&e&lLightning&8&l]")); + itemL.setItemMeta(imL); + RUNE_LIGHTNING = itemL; } /* Electricity */ - public static ItemStack SOLAR_GENERATOR = new CustomItem(Material.DAYLIGHT_DETECTOR, "&bSolar Generator", "", "&eBasic Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &74 J/s"); - public static ItemStack SOLAR_GENERATOR_2 = new CustomItem(Material.DAYLIGHT_DETECTOR, "&cAdvanced Solar Generator", "", "&aMedium Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &716 J/s"); - public static ItemStack SOLAR_GENERATOR_3 = new CustomItem(Material.DAYLIGHT_DETECTOR, "&4Carbonado Solar Generator", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &764 J/s"); - public static ItemStack SOLAR_GENERATOR_4 = new CustomItem(Material.DAYLIGHT_DETECTOR, "&eEnergized Solar Generator", "", "&9Works at Night", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &7256 J/s (Day)", "&8\u21E8 &e\u26A1 &7128 J/s (Night)"); + public static final ItemStack SOLAR_GENERATOR = new CustomItem(Material.DAYLIGHT_DETECTOR, "&bSolar Generator", "", "&eBasic Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &74 J/s"); + public static final ItemStack SOLAR_GENERATOR_2 = new CustomItem(Material.DAYLIGHT_DETECTOR, "&cAdvanced Solar Generator", "", "&aMedium Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &716 J/s"); + public static final ItemStack SOLAR_GENERATOR_3 = new CustomItem(Material.DAYLIGHT_DETECTOR, "&4Carbonado Solar Generator", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &764 J/s"); + public static final ItemStack SOLAR_GENERATOR_4 = new CustomItem(Material.DAYLIGHT_DETECTOR, "&eEnergized Solar Generator", "", "&9Works at Night", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &70 J Buffer", "&8\u21E8 &e\u26A1 &7256 J/s (Day)", "&8\u21E8 &e\u26A1 &7128 J/s (Night)"); - public static ItemStack COAL_GENERATOR = null; - public static ItemStack LAVA_GENERATOR = null; + public static final ItemStack COAL_GENERATOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&cCoal Generator", "", "&6Average Generator", "&8\u21E8 &e\u26A1 &764 J Buffer", "&8\u21E8 &e\u26A1 &716 J/s"); + public static final ItemStack COAL_GENERATOR_2 = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&cCoal Generator &7(&eII&7)", "", "&6Advanced Generator", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &730 J/s"); - public static ItemStack ELECTRIC_FURNACE = new CustomItem(Material.FURNACE, "&cElectric Furnace", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &74 J/s"); - public static ItemStack ELECTRIC_FURNACE_2 = new CustomItem(Material.FURNACE, "&cElectric Furnace &7- &eII", "", "&aMedium Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &76 J/s"); - public static ItemStack ELECTRIC_FURNACE_3 = new CustomItem(Material.FURNACE, "&cElectric Furnace &7- &eIII", "", "&aMedium Machine", "&8\u21E8 &7Speed: 4x", "&8\u21E8 &e\u26A1 &710 J/s"); + public static final ItemStack LAVA_GENERATOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&4Lava Generator", "", "&6Average Generator", "&8\u21E8 &e\u26A1 &7512 J Buffer", "&8\u21E8 &e\u26A1 &720 J/s"); + public static final ItemStack LAVA_GENERATOR_2 = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&4Lava Generator &7&eII&7)", "", "&6Advanced Generator", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &740 J/s"); - public static ItemStack ELECTRIC_ORE_GRINDER = new CustomItem(Material.FURNACE, "&cElectric Ore Grinder", "","&rWorks as an Ore Crusher and Grind Stone", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &712 J/s"); - public static ItemStack ELECTRIC_ORE_GRINDER_2 = new CustomItem(Material.FURNACE, "&cElectric Ore Grinder &7(&eII&7)", "","&rWorks as an Ore Crusher and Grind Stone", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 4x", "&8\u21E8 &e\u26A1 &730 J/s"); - public static ItemStack ELECTRIC_INGOT_PULVERIZER = new CustomItem(Material.FURNACE, "&cElectric Ingot Pulverizer", "", "&rPulverizes Ingots into Dust", "", "&aMedium Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &714 J/s"); - public static ItemStack AUTO_ENCHANTER = new CustomItem(Material.ENCHANTING_TABLE, "&5Auto Enchanter", "", "&aMedium Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &718 J/s"); - public static ItemStack AUTO_DISENCHANTER = new CustomItem(Material.ENCHANTING_TABLE, "&5Auto Disenchanter", "", "&aMedium Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &718 J/s"); - public static ItemStack AUTO_ANVIL = new CustomItem(Material.IRON_BLOCK, "&7Auto Anvil", "", "&6Advanced Machine", "&8\u21E8 &7Repair Factor: 10%", "&8\u21E8 &e\u26A1 &724 J/s"); - public static ItemStack AUTO_ANVIL_2 = new CustomItem(Material.IRON_BLOCK, "&7Auto Anvil Mk.II", "", "&4End-Game Machine", "&8\u21E8 &7Repair Factor: 25%", "&8\u21E8 &e\u26A1 &732 J/s"); + public static final ItemStack ELECTRIC_FURNACE = new CustomItem(Material.FURNACE, "&cElectric Furnace", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &74 J/s"); + public static final ItemStack ELECTRIC_FURNACE_2 = new CustomItem(Material.FURNACE, "&cElectric Furnace &7- &eII", "", "&aMedium Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &76 J/s"); + public static final ItemStack ELECTRIC_FURNACE_3 = new CustomItem(Material.FURNACE, "&cElectric Furnace &7- &eIII", "", "&aMedium Machine", "&8\u21E8 &7Speed: 4x", "&8\u21E8 &e\u26A1 &710 J/s"); - public static ItemStack BIO_REACTOR = new CustomItem(Material.LIME_TERRACOTTA, "&2Bio Reactor", "", "&6Average Generator", "&8\u21E8 &e\u26A1 &7128 J Buffer", "&8\u21E8 &e\u26A1 &78 J/s"); - public static ItemStack MULTIMETER = new CustomItem(Material.CLOCK, "&eMultimeter", "", "&rMeasures the Amount of stored", "&rEnergy in a Block"); - public static ItemStack SMALL_CAPACITOR = null, MEDIUM_CAPACITOR = null, BIG_CAPACITOR = null, LARGE_CAPACITOR = null, CARBONADO_EDGED_CAPACITOR = null; + public static final ItemStack ELECTRIC_ORE_GRINDER = new CustomItem(Material.FURNACE, "&cElectric Ore Grinder", "","&rWorks as an Ore Crusher and Grind Stone", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &712 J/s"); + public static final ItemStack ELECTRIC_ORE_GRINDER_2 = new CustomItem(Material.FURNACE, "&cElectric Ore Grinder &7(&eII&7)", "","&rWorks as an Ore Crusher and Grind Stone", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 4x", "&8\u21E8 &e\u26A1 &730 J/s"); + public static final ItemStack ELECTRIC_INGOT_PULVERIZER = new CustomItem(Material.FURNACE, "&cElectric Ingot Pulverizer", "", "&rPulverizes Ingots into Dust", "", "&aMedium Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &714 J/s"); + public static final ItemStack AUTO_DRIER = new CustomItem(Material.SMOKER, "&eAuto Drier", "", "&aMedium Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &710 J/s"); + public static final ItemStack AUTO_ENCHANTER = new CustomItem(Material.ENCHANTING_TABLE, "&5Auto Enchanter", "", "&aMedium Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &718 J/s"); + public static final ItemStack AUTO_DISENCHANTER = new CustomItem(Material.ENCHANTING_TABLE, "&5Auto Disenchanter", "", "&aMedium Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &718 J/s"); + public static final ItemStack AUTO_ANVIL = new CustomItem(Material.IRON_BLOCK, "&7Auto Anvil", "", "&6Advanced Machine", "&8\u21E8 &7Repair Factor: 10%", "&8\u21E8 &e\u26A1 &724 J/s"); + public static final ItemStack AUTO_ANVIL_2 = new CustomItem(Material.IRON_BLOCK, "&7Auto Anvil Mk.II", "", "&4End-Game Machine", "&8\u21E8 &7Repair Factor: 25%", "&8\u21E8 &e\u26A1 &732 J/s"); + + public static final ItemStack BIO_REACTOR = new CustomItem(Material.LIME_TERRACOTTA, "&2Bio Reactor", "", "&6Average Generator", "&8\u21E8 &e\u26A1 &7128 J Buffer", "&8\u21E8 &e\u26A1 &78 J/s"); + public static final ItemStack MULTIMETER = new CustomItem(Material.CLOCK, "&eMultimeter", "", "&rMeasures the Amount of stored", "&rEnergy in a Block"); + + public static final ItemStack SMALL_CAPACITOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aSmall Energy Capacitor", "", "&eBasic Capacitor", "&8\u21E8 &e\u26A1 &7128 J Capacity"); + public static final ItemStack MEDIUM_CAPACITOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aMedium Energy Capacitor", "", "&6Average Capacitor", "&8\u21E8 &e\u26A1 &7512 J Capacity"); + public static final ItemStack BIG_CAPACITOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aBig Energy Capacitor", "", "&aMedium Capacitor", "&8\u21E8 &e\u26A1 &71024 J Capacity"); + public static final ItemStack LARGE_CAPACITOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aLarge Energy Capacitor", "", "&2Good Capacitor", "&8\u21E8 &e\u26A1 &78192 J Capacity"); + public static final ItemStack CARBONADO_EDGED_CAPACITOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aCarbonado Edged Energy Capacitor", "", "&4End-Game Capacitor", "&8\u21E8 &e\u26A1 &765536 J Capacity"); /* Robots */ - public static ItemStack PROGRAMMABLE_ANDROID = null; - public static ItemStack PROGRAMMABLE_ANDROID_MINER = null; - public static ItemStack PROGRAMMABLE_ANDROID_BUTCHER = null; - public static ItemStack PROGRAMMABLE_ANDROID_FARMER = null; - public static ItemStack PROGRAMMABLE_ANDROID_WOODCUTTER = null; - public static ItemStack PROGRAMMABLE_ANDROID_FISHERMAN = null; + public static final ItemStack PROGRAMMABLE_ANDROID = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzUwM2NiN2VkODQ1ZTdhNTA3ZjU2OWFmYzY0N2M0N2FjNDgzNzcxNDY1YzlhNjc5YTU0NTk0Yzc2YWZiYSJ9fX0="), "&cProgrammable Android &7(Normal)", "", "&8\u21E8 &7Function: None", "&8\u21E8 &7Fuel Efficiency: 1.0x"); + public static final ItemStack PROGRAMMABLE_ANDROID_FARMER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjlkMzMzNTdlODQxODgyM2JmNzgzZGU5MmRlODAyOTFiNGViZDM5MmFlYzg3MDY2OThlMDY4OTZkNDk4ZjYifX19"), "&cProgrammable Android &7(Farmer)", "", "&8\u21E8 &7Function: Farming", "&8\u21E8 &7Fuel Efficiency: 1.0x"); + public static final ItemStack PROGRAMMABLE_ANDROID_MINER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTYzOGEyODU0MWFiM2FlMGE3MjNkNTU3ODczOGUwODc1ODM4OGVjNGMzMzI0N2JkNGNhMTM0ODJhZWYzMzQifX19"), "&cProgrammable Android &7(Miner)", "", "&8\u21E8 &7Function: Mining", "&8\u21E8 &7Fuel Efficiency: 1.0x"); + public static final ItemStack PROGRAMMABLE_ANDROID_WOODCUTTER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDMyYTgxNDUxMDE0MjIwNTE2OWExYWQzMmYwYTc0NWYxOGU5Y2I2YzY2ZWU2NGVjYTJlNjViYWJkZWY5ZmYifX19"), "&cProgrammable Android &7(Woodcutter)", "", "&8\u21E8 &7Function: Woodcutting", "&8\u21E8 &7Fuel Efficiency: 1.0x"); + public static final ItemStack PROGRAMMABLE_ANDROID_BUTCHER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2I0NzJkZjBhZDlhM2JlODhmMmU1ZDVkNDIyZDAyYjExNmQ2NGQ4ZGYxNDc1ZWQzMmU1NDZhZmM4NGIzMSJ9fX0="), "&cProgrammable Android &7(Butcher)", "", "&8\u21E8 &7Function: Slaughtering", "&8\u21E8 &7Damage: 4", "&8\u21E8 &7Fuel Efficiency: 1.0x"); + public static final ItemStack PROGRAMMABLE_ANDROID_FISHERMAN = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzQ1ZTg3MzNhNzMxMTQzMzNiOThiMzYwMTc1MTI0MTcyMmY0NzEzZTFhMWE1ZDM2ZmJiMTMyNDkzZjFjNyJ9fX0="), "&cProgrammable Android &7(Fisherman)", "", "&8\u21E8 &7Function: Fishing", "&8\u21E8 &7Success Rate: 10%", "&8\u21E8 &7Fuel Efficiency: 1.0x"); + + public static final ItemStack PROGRAMMABLE_ANDROID_2 = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzUwM2NiN2VkODQ1ZTdhNTA3ZjU2OWFmYzY0N2M0N2FjNDgzNzcxNDY1YzlhNjc5YTU0NTk0Yzc2YWZiYSJ9fX0="), "&cAdvanced Programmable Android &7(Normal)", "", "&8\u21E8 &7Function: None", "&8\u21E8 &7Fuel Efficiency: 1.5x"); + public static final ItemStack PROGRAMMABLE_ANDROID_2_FISHERMAN = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzQ1ZTg3MzNhNzMxMTQzMzNiOThiMzYwMTc1MTI0MTcyMmY0NzEzZTFhMWE1ZDM2ZmJiMTMyNDkzZjFjNyJ9fX0="), "&cAdvanced Programmable Android &7(Fisherman)", "", "&8\u21E8 &7Function: Fishing", "&8\u21E8 &7Success Rate: 20%", "&8\u21E8 &7Fuel Efficiency: 1.5x"); + public static final ItemStack PROGRAMMABLE_ANDROID_2_FARMER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjlkMzMzNTdlODQxODgyM2JmNzgzZGU5MmRlODAyOTFiNGViZDM5MmFlYzg3MDY2OThlMDY4OTZkNDk4ZjYifX19"), "&cAdvanced Programmable Android &7(Farmer)", "", "&8\u21E8 &7Function: Farming", "&8\u21E8 &7Fuel Efficiency: 1.5x", "&8\u21E8 &7Can also harvest Plants from ExoticGarden"); + public static final ItemStack PROGRAMMABLE_ANDROID_2_BUTCHER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2I0NzJkZjBhZDlhM2JlODhmMmU1ZDVkNDIyZDAyYjExNmQ2NGQ4ZGYxNDc1ZWQzMmU1NDZhZmM4NGIzMSJ9fX0="), "&cAdvanced Programmable Android &7(Butcher)", "", "&8\u21E8 &7Function: Slaughtering", "&8\u21E8 &7Damage: 8", "&8\u21E8 &7Fuel Efficiency: 1.5x"); - public static ItemStack PROGRAMMABLE_ANDROID_2 = null; - public static ItemStack PROGRAMMABLE_ANDROID_2_FISHERMAN = null; - public static ItemStack PROGRAMMABLE_ANDROID_2_FARMER = null; - public static ItemStack PROGRAMMABLE_ANDROID_2_BUTCHER = null; - - public static ItemStack PROGRAMMABLE_ANDROID_3 = null; - public static ItemStack PROGRAMMABLE_ANDROID_3_FISHERMAN = null; - public static ItemStack PROGRAMMABLE_ANDROID_3_BUTCHER = null; + public static final ItemStack PROGRAMMABLE_ANDROID_3 = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzUwM2NiN2VkODQ1ZTdhNTA3ZjU2OWFmYzY0N2M0N2FjNDgzNzcxNDY1YzlhNjc5YTU0NTk0Yzc2YWZiYSJ9fX0="), "&eEmpowered Programmable Android &7(Normal)", "", "&8\u21E8 &7Function: None", "&8\u21E8 &7Fuel Efficiency: 3.0x"); + public static final ItemStack PROGRAMMABLE_ANDROID_3_FISHERMAN = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzQ1ZTg3MzNhNzMxMTQzMzNiOThiMzYwMTc1MTI0MTcyMmY0NzEzZTFhMWE1ZDM2ZmJiMTMyNDkzZjFjNyJ9fX0="), "&eEmpowered Programmable Android &7(Fisherman)", "", "&8\u21E8 &7Function: Fishing", "&8\u21E8 &7Success Rate: 30%", "&8\u21E8 &7Fuel Efficiency: 8.0x"); + public static final ItemStack PROGRAMMABLE_ANDROID_3_BUTCHER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2I0NzJkZjBhZDlhM2JlODhmMmU1ZDVkNDIyZDAyYjExNmQ2NGQ4ZGYxNDc1ZWQzMmU1NDZhZmM4NGIzMSJ9fX0="), "&eEmpowered Programmable Android &7(Butcher)", "", "&8\u21E8 &7Function: Slaughtering", "&8\u21E8 &7Damage: 20", "&8\u21E8 &7Fuel Efficiency: 8.0x"); /* GPS */ - public static ItemStack GPS_TRANSMITTER = null; - public static ItemStack GPS_TRANSMITTER_2 = null; - public static ItemStack GPS_TRANSMITTER_3 = null; - public static ItemStack GPS_TRANSMITTER_4 = null; + public static final ItemStack GPS_TRANSMITTER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS Transmitter", "", "&8\u21E8 &e\u26A1 &716 J Buffer", "&8\u21E8 &e\u26A1 &72 J/s"); + public static final ItemStack GPS_TRANSMITTER_2 = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&cAdvanced GPS Transmitter", "", "&8\u21E8 &e\u26A1 &764 J Buffer", "&8\u21E8 &e\u26A1 &76 J/s"); + public static final ItemStack GPS_TRANSMITTER_3 = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&4Carbonado GPS Transmitter", "", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &722 J/s"); + public static final ItemStack GPS_TRANSMITTER_4 = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&eEnergized GPS Transmitter", "", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &792 J/s"); - public static ItemStack GPS_CONTROL_PANEL = null; - public static ItemStack GPS_MARKER_TOOL = new CustomItem(Material.REDSTONE_TORCH, "&bGPS Marker Tool", "", "&rAllows you to set a Waypoint at", "&rthe Location you place this"); - public static ItemStack GPS_EMERGENCY_TRANSMITTER = null; - public static ItemStack GPS_GEO_SCANNER = null; + public static final ItemStack GPS_MARKER_TOOL = new CustomItem(Material.REDSTONE_TORCH, "&bGPS Marker Tool", "", "&rAllows you to set a Waypoint at", "&rthe Location you place this"); + public static final ItemStack GPS_CONTROL_PANEL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&bGPS Control Panel", "", "&rAllows you to trach your Satellites", "&rand manage your Waypoints"); + public static final ItemStack GPS_EMERGENCY_TRANSMITTER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&cGPS Emergency Transmitter", "", "&rCarrying this in your Inventory", "&rautomatically sets a Waypoint", "&rat your Location when you die."); - public static ItemStack ANDROID_INTERFACE_FUEL = new CustomItem(Material.DISPENSER, "&7Android Interface &c(Fuel)", "", "&rItems stored in this Interface", "&rwill be inserted into an Android's Fuel Slot", "&rwhen its Script tells them to do so"); - public static ItemStack ANDROID_INTERFACE_ITEMS = new CustomItem(Material.DISPENSER, "&7Android Interface &9(Items)", "", "&rItems stored in an Android's Inventory", "&rwill be inserted into this Interface", "&rwhen its Script tells them to do so"); + public static final ItemStack ANDROID_INTERFACE_FUEL = new CustomItem(Material.DISPENSER, "&7Android Interface &c(Fuel)", "", "&rItems stored in this Interface", "&rwill be inserted into an Android's Fuel Slot", "&rwhen its Script tells them to do so"); + public static final ItemStack ANDROID_INTERFACE_ITEMS = new CustomItem(Material.DISPENSER, "&7Android Interface &9(Items)", "", "&rItems stored in an Android's Inventory", "&rwill be inserted into this Interface", "&rwhen its Script tells them to do so"); + + public static final ItemStack GPS_GEO_SCANNER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmFkOGNmZWIzODdhNTZlM2U1YmNmODUzNDVkNmE0MTdiMjQyMjkzODg3ZGIzY2UzYmE5MWZhNDA5YjI1NGI4NiJ9fX0="), "&bGPS Geo-Scanner", "", "&rScans a Chunk for natural Resources", "&rsuch as &8Oil"); + public static final ItemStack OIL_PUMP = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWZlMWEwNDBhNDI1ZTMxYTQ2ZDRmOWE5Yjk4MDZmYTJmMGM0N2VlODQ3MTFjYzE5MzJmZDhhYjMyYjJkMDM4In19fQ=="), "&rOil Pump", "", "&7Pumps up Oil and fills it into Buckets", "", "&c&l! &cMake sure to Geo-Scan the Chunk first"); + public static final ItemStack BUCKET_OF_OIL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmNlMDRiNDFkMTllYzc5MjdmOTgyYTYzYTk0YTNkNzlmNzhlY2VjMzMzNjMwNTFmZGUwODMxYmZhYmRiZCJ9fX0="), "&rBucket of Oil"); + public static final ItemStack BUCKET_OF_FUEL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTg0ZGRjYTc2NjcyNWI4Yjk3NDEzZjI1OWMzZjc2NjgwNzBmNmFlNTU0ODNhOTBjOGU1NTI1Mzk0ZjljMDk5In19fQ=="), "&rBucket of Fuel"); - public static ItemStack BUCKET_OF_OIL = null; - public static ItemStack BUCKET_OF_FUEL = null; - public static ItemStack OIL_PUMP = null; - - public static ItemStack REFINERY = new CustomItem(Material.PISTON, "&cRefinery", "", "&rRefines Oil to create Fuel"); - public static ItemStack COMBUSTION_REACTOR = null; - public static ItemStack ANDROID_MEMORY_CORE = null; + public static final ItemStack REFINERY = new CustomItem(Material.PISTON, "&cRefinery", "", "&rRefines Oil to create Fuel"); + public static final ItemStack COMBUSTION_REACTOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&cCombustion Reactor", "", "&6Advanced Generator", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &724 J/s"); + public static final ItemStack ANDROID_MEMORY_CORE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDc4ZjJiN2U1ZTc1NjM5ZWE3ZmI3OTZjMzVkMzY0YzRkZjI4YjQyNDNlNjZiNzYyNzdhYWRjZDYyNjEzMzcifX19"), "&bAndroid Memory Core"); - public static ItemStack GPS_TELEPORTER_PYLON = new CustomItem(Material.PURPLE_STAINED_GLASS, "&5GPS Teleporter Pylon", "", "&7Teleporter Component"); - public static ItemStack GPS_TELEPORTATION_MATRIX = new CustomItem(Material.IRON_BLOCK, "&bGPS Teleporter Matrix", "", "&rThis is your Teleporter's Main Component", "&rThis Matrix allows Players to choose from all", "&rWaypoints made by the Player who has placed", "&rthis Device."); - public static ItemStack GPS_ACTIVATION_DEVICE_SHARED = new CustomItem(Material.STONE_PRESSURE_PLATE, "&rGPS Activation Device &3(Shared)", "", "&rPlace this onto a Teleportation Matrix", "&rand step onto this Plate to activate", "&rthe Teleportation Process"); - public static ItemStack GPS_ACTIVATION_DEVICE_PERSONAL = new CustomItem(Material.STONE_PRESSURE_PLATE, "&rGPS Activation Device &a(Personal)", "", "&rPlace this onto a Teleportation Matrix", "&rand step onto this Plate to activate", "&rthe Teleportation Process", "", "&rThis Version only allows the Person who", "&rplaced this Device to use it"); + public static final ItemStack GPS_TELEPORTER_PYLON = new CustomItem(Material.PURPLE_STAINED_GLASS, "&5GPS Teleporter Pylon", "", "&7Teleporter Component"); + public static final ItemStack GPS_TELEPORTATION_MATRIX = new CustomItem(Material.IRON_BLOCK, "&bGPS Teleporter Matrix", "", "&rThis is your Teleporter's Main Component", "&rThis Matrix allows Players to choose from all", "&rWaypoints made by the Player who has placed", "&rthis Device."); + public static final ItemStack GPS_ACTIVATION_DEVICE_SHARED = new CustomItem(Material.STONE_PRESSURE_PLATE, "&rGPS Activation Device &3(Shared)", "", "&rPlace this onto a Teleportation Matrix", "&rand step onto this Plate to activate", "&rthe Teleportation Process"); + public static final ItemStack GPS_ACTIVATION_DEVICE_PERSONAL = new CustomItem(Material.STONE_PRESSURE_PLATE, "&rGPS Activation Device &a(Personal)", "", "&rPlace this onto a Teleportation Matrix", "&rand step onto this Plate to activate", "&rthe Teleportation Process", "", "&rThis Version only allows the Person who", "&rplaced this Device to use it"); - public static ItemStack ELEVATOR = new CustomItem(Material.STONE_PRESSURE_PLATE, "&bElevator Plate", "", "&rPlace an Elevator Plate on every floor", "&rand you will be able to teleport between them.", "", "&eRight Click this Block &7to name it"); + public static final ItemStack ELEVATOR = new CustomItem(Material.STONE_PRESSURE_PLATE, "&bElevator Plate", "", "&rPlace an Elevator Plate on every floor", "&rand you will be able to teleport between them.", "", "&eRight Click this Block &7to name it"); - public static ItemStack INFUSED_HOPPER = new CustomItem(Material.HOPPER, "&5Infused Hopper", "", "&rAutomatically picks up nearby Items in a 7x7x7", "&rRadius when placed."); + public static final ItemStack INFUSED_HOPPER = new CustomItem(Material.HOPPER, "&5Infused Hopper", "", "&rAutomatically picks up nearby Items in a 7x7x7", "&rRadius when placed."); - public static ItemStack PLASTIC_SHEET = new CustomItem(Material.PAPER, "&rPlastic Sheet"); - public static ItemStack HEATED_PRESSURE_CHAMBER = new CustomItem(Material.LIGHT_GRAY_STAINED_GLASS, "&cHeated Pressure Chamber", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &710 J/s"); - public static ItemStack HEATED_PRESSURE_CHAMBER_2 = new CustomItem(Material.LIGHT_GRAY_STAINED_GLASS, "&cHeated Pressure Chamber &7- &eII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 5x", "&8\u21E8 &e\u26A1 &744 J/s"); + public static final ItemStack PLASTIC_SHEET = new CustomItem(Material.PAPER, "&rPlastic Sheet"); + public static final ItemStack HEATED_PRESSURE_CHAMBER = new CustomItem(Material.LIGHT_GRAY_STAINED_GLASS, "&cHeated Pressure Chamber", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &710 J/s"); + public static final ItemStack HEATED_PRESSURE_CHAMBER_2 = new CustomItem(Material.LIGHT_GRAY_STAINED_GLASS, "&cHeated Pressure Chamber &7- &eII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 5x", "&8\u21E8 &e\u26A1 &744 J/s"); - public static ItemStack ELECTRIC_SMELTERY = new CustomItem(Material.FURNACE, "&cElectric Smeltery", "", "&4Alloys-Only, doesn't smelt Dust into Ingots", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &720 J/s"); - public static ItemStack ELECTRIC_SMELTERY_2 = new CustomItem(Material.FURNACE, "&cElectric Smeltery &7- &eII", "", "&4Alloys-Only, doesn't smelt Dust into Ingots", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 3x", "&8\u21E8 &e\u26A1 &740 J/s"); + public static final ItemStack ELECTRIC_SMELTERY = new CustomItem(Material.FURNACE, "&cElectric Smeltery", "", "&4Alloys-Only, doesn't smelt Dust into Ingots", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &720 J/s"); + public static final ItemStack ELECTRIC_SMELTERY_2 = new CustomItem(Material.FURNACE, "&cElectric Smeltery &7- &eII", "", "&4Alloys-Only, doesn't smelt Dust into Ingots", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 3x", "&8\u21E8 &e\u26A1 &740 J/s"); - public static ItemStack ELECTRIFIED_CRUCIBLE = new CustomItem(Material.RED_TERRACOTTA, "&cElectrified Crucible", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &748 J/s"); - public static ItemStack ELECTRIFIED_CRUCIBLE_2 = new CustomItem(Material.RED_TERRACOTTA, "&cElectrified Crucible &7- &eII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &780 J/s"); - public static ItemStack ELECTRIFIED_CRUCIBLE_3 = new CustomItem(Material.RED_TERRACOTTA, "&cElectrified Crucible &7- &eIII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 4x", "&8\u21E8 &e\u26A1 &7120 J/s"); + public static final ItemStack ELECTRIFIED_CRUCIBLE = new CustomItem(Material.RED_TERRACOTTA, "&cElectrified Crucible", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &748 J/s"); + public static final ItemStack ELECTRIFIED_CRUCIBLE_2 = new CustomItem(Material.RED_TERRACOTTA, "&cElectrified Crucible &7- &eII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &780 J/s"); + public static final ItemStack ELECTRIFIED_CRUCIBLE_3 = new CustomItem(Material.RED_TERRACOTTA, "&cElectrified Crucible &7- &eIII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 4x", "&8\u21E8 &e\u26A1 &7120 J/s"); - public static ItemStack CARBON_PRESS = new CustomItem(Material.BLACK_STAINED_GLASS, "&cCarbon Press", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &720 J/s"); - public static ItemStack CARBON_PRESS_2 = new CustomItem(Material.BLACK_STAINED_GLASS, "&cCarbon Press &7- &eII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 3x", "&8\u21E8 &e\u26A1 &750 J/s"); - public static ItemStack CARBON_PRESS_3 = new CustomItem(Material.BLACK_STAINED_GLASS, "&cCarbon Press &7- &eIII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 15x", "&8\u21E8 &e\u26A1 &7180 J/s"); + public static final ItemStack CARBON_PRESS = new CustomItem(Material.BLACK_STAINED_GLASS, "&cCarbon Press", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &720 J/s"); + public static final ItemStack CARBON_PRESS_2 = new CustomItem(Material.BLACK_STAINED_GLASS, "&cCarbon Press &7- &eII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 3x", "&8\u21E8 &e\u26A1 &750 J/s"); + public static final ItemStack CARBON_PRESS_3 = new CustomItem(Material.BLACK_STAINED_GLASS, "&cCarbon Press &7- &eIII", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 15x", "&8\u21E8 &e\u26A1 &7180 J/s"); - public static ItemStack BLISTERING_INGOT = new CustomItem(Material.GOLD_INGOT, "&6Blistering Ingot &7(33%)", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); - public static ItemStack BLISTERING_INGOT_2 = new CustomItem(Material.GOLD_INGOT, "&6Blistering Ingot &7(66%)", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); - public static ItemStack BLISTERING_INGOT_3 = new CustomItem(Material.GOLD_INGOT, "&6Blistering Ingot", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); + public static final ItemStack BLISTERING_INGOT = new CustomItem(Material.GOLD_INGOT, "&6Blistering Ingot &7(33%)", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); + public static final ItemStack BLISTERING_INGOT_2 = new CustomItem(Material.GOLD_INGOT, "&6Blistering Ingot &7(66%)", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); + public static final ItemStack BLISTERING_INGOT_3 = new CustomItem(Material.GOLD_INGOT, "&6Blistering Ingot", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); - public static ItemStack ENERGY_REGULATOR = null; - public static ItemStack DEBUG_FISH = new CustomItem(Material.PUFFERFISH, "&3How much is the Fish?", "", "&eRight Click &rany Block to view it's BlockData", "&eLeft Click &rto break a Block", "&eShift + Left Click &rany Block to erase it's BlockData", "&eShift + Right Click &rto place a Placeholder Block"); - - - public static ItemStack NETHER_ICE = null; - public static ItemStack ENRICHED_NETHER_ICE = null; - public static ItemStack NETHER_ICE_COOLANT_CELL = null; - public static ItemStack NETHER_DRILL = new CustomItem(Material.RED_TERRACOTTA, "&4Nether Drill", "", "&rAllows you to mine Nether Ice", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7102 J/s", "", "&c&l! &cCan only be used in the Nether!", "&c&l! &cMake sure to Geo-Scan the Chunk first"); + public static final ItemStack ENERGY_REGULATOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDc4ZjJiN2U1ZTc1NjM5ZWE3ZmI3OTZjMzVkMzY0YzRkZjI4YjQyNDNlNjZiNzYyNzdhYWRjZDYyNjEzMzcifX19"), "&6Energy Regulator", "", "&rCore Component of an Energy Network"); + public static final ItemStack DEBUG_FISH = new CustomItem(Material.PUFFERFISH, "&3How much is the Fish?", "", "&eRight Click &rany Block to view it's BlockData", "&eLeft Click &rto break a Block", "&eShift + Left Click &rany Block to erase it's BlockData", "&eShift + Right Click &rto place a Placeholder Block"); + + public static final ItemStack NETHER_ICE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2NlMmRhZDliYWY3ZWFiYTdlODBkNGQwZjlmYWMwYWFiMDFhNzZiMTJmYjcxYzNkMmFmMmExNmZkZDRjNzM4MyJ9fX0="), "&eNether Ice", "", "&eRadiation Level: MODERATE", "&4&oHazmat Suit required"); + public static final ItemStack ENRICHED_NETHER_ICE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2M4MThhYTEzYWFiYzcyOTQ4MzhkMjFjYWFjMDU3ZTk3YmQ4Yzg5NjQxYTBjMGY4YTU1NDQyZmY0ZTI3In19fQ=="), "&eEnriched Nether Ice", "", "&2Radiation Level: EXTREMELY HIGH", "&4&oHazmat Suit required"); + public static final ItemStack NETHER_ICE_COOLANT_CELL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGQzY2Q0MTI1NTVmODk3MDE2MjEzZTVkNmM3NDMxYjQ0OGI5ZTU2NDRlMWIxOWVjNTFiNTMxNmYzNTg0MGUwIn19fQ=="), "&6Nether Ice Coolant Cell"); + public static final ItemStack NETHER_DRILL = new CustomItem(Material.RED_TERRACOTTA, "&4Nether Drill", "", "&rAllows you to mine Nether Ice", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7102 J/s", "", "&c&l! &cCan only be used in the Nether!", "&c&l! &cMake sure to Geo-Scan the Chunk first"); // Cargo - public static ItemStack CARGO_MANAGER = null; - public static ItemStack CARGO_NODE = null; - public static ItemStack CARGO_INPUT = null; - public static ItemStack CARGO_OUTPUT = null; - public static ItemStack CARGO_OUTPUT_ADVANCED = null; + public static final ItemStack CARGO_MANAGER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTUxMGJjODUzNjJhMTMwYTZmZjlkOTFmZjExZDZmYTQ2ZDdkMTkxMmEzNDMxZjc1MTU1OGVmM2M0ZDljMiJ9fX0="), "&6Cargo Manager", "", "&rCore Component of an Item Transport Network"); + public static final ItemStack CARGO_NODE = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMDdiN2VmNmZkNzg2NDg2NWMzMWMxZGM4N2JlZDI0YWI1OTczNTc5ZjVjNjYzOGZlY2I4ZGVkZWI0NDNmZjAifX19"), "&7Cargo Node &c(Connector)", "", "&rCargo Connector Pipe"); + public static final ItemStack CARGO_INPUT = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTZkMWMxYTY5YTNkZTlmZWM5NjJhNzdiZjNiMmUzNzZkZDI1Yzg3M2EzZDhmMTRmMWRkMzQ1ZGFlNGM0In19fQ=="), "&7Cargo Node &c(Input)", "", "&rCargo Input Pipe"); + public static final ItemStack CARGO_OUTPUT = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTViMjFmZDQ4MGMxYzQzYmYzYjlmODQyYzg2OWJkYzNiYzVhY2MyNTk5YmYyZWI2YjhhMWM5NWRjZTk3OGYifX19"), "&7Cargo Node &c(Output)", "", "&rCargo Output Pipe"); + public static final ItemStack CARGO_OUTPUT_ADVANCED = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTViMjFmZDQ4MGMxYzQzYmYzYjlmODQyYzg2OWJkYzNiYzVhY2MyNTk5YmYyZWI2YjhhMWM5NWRjZTk3OGYifX19"), "&6Advanced Cargo Node &c(Output)", "", "&rCargo Output Pipe"); - public static ItemStack AUTO_BREEDER = new CustomItem(Material.HAY_BLOCK, "&eAuto-Breeder", "", "&rRuns on &aOrganic Food", "", "&4End-Game Machine", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &760 J/Animal");; + public static final ItemStack AUTO_BREEDER = new CustomItem(Material.HAY_BLOCK, "&eAuto-Breeder", "", "&rRuns on &aOrganic Food", "", "&4End-Game Machine", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &760 J/Animal"); - public static ItemStack ORGANIC_FOOD = null; - public static ItemStack WHEAT_ORGANIC_FOOD = null; - public static ItemStack CARROT_ORGANIC_FOOD = null; - public static ItemStack POTATO_ORGANIC_FOOD = null; - public static ItemStack SEEDS_ORGANIC_FOOD = null; - public static ItemStack BEETROOT_ORGANIC_FOOD = null; - public static ItemStack MELON_ORGANIC_FOOD = null; - public static ItemStack APPLE_ORGANIC_FOOD = null; + public static final ItemStack ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9X"); + public static final ItemStack WHEAT_ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Wheat"); + public static final ItemStack CARROT_ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Carrots"); + public static final ItemStack POTATO_ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Potatoes"); + public static final ItemStack SEEDS_ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Seeds"); + public static final ItemStack BEETROOT_ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Beetroot"); + public static final ItemStack MELON_ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Melon"); + public static final ItemStack APPLE_ORGANIC_FOOD = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Apple"); - public static ItemStack FERTILIZER = null; - public static ItemStack WHEAT_FERTILIZER = null; - public static ItemStack CARROT_FERTILIZER = null; - public static ItemStack POTATO_FERTILIZER = null; - public static ItemStack SEEDS_FERTILIZER = null; - public static ItemStack BEETROOT_FERTILIZER = null; - public static ItemStack MELON_FERTILIZER = null; - public static ItemStack APPLE_FERTILIZER = null; + public static final ItemStack FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9X"); + public static final ItemStack WHEAT_FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Wheat"); + public static final ItemStack CARROT_FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Carrots"); + public static final ItemStack POTATO_FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Potatoes"); + public static final ItemStack SEEDS_FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Seeds"); + public static final ItemStack BEETROOT_FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Beetroot"); + public static final ItemStack MELON_FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Melon"); + public static final ItemStack APPLE_FERTILIZER = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Apple"); - public static ItemStack ANIMAL_GROWTH_ACCELERATOR = new CustomItem(Material.HAY_BLOCK, "&bAnimal Growth Accelerator", "", "&rRuns on &aOrganic Food", "", "&4End-Game Machine", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &728 J/s");; - public static ItemStack CROP_GROWTH_ACCELERATOR = new CustomItem(Material.LIME_TERRACOTTA, "&aCrop Growth Accelerator", "", "&rRuns on &aOrganic Fertilizer", "", "&4End-Game Machine", "&8\u21E8 &7Radius: 7x7", "&8\u21E8 &7Speed: &a3/time", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &750 J/s"); - public static ItemStack CROP_GROWTH_ACCELERATOR_2 = new CustomItem(Material.LIME_TERRACOTTA, "&aCrop Growth Accelerator &7(&eII&7)", "", "&rRuns on &aOrganic Fertilizer", "", "&4End-Game Machine", "&8\u21E8 &7Radius: 9x9", "&8\u21E8 &7Speed: &a4/time", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &760 J/s"); + public static final ItemStack ANIMAL_GROWTH_ACCELERATOR = new CustomItem(Material.HAY_BLOCK, "&bAnimal Growth Accelerator", "", "&rRuns on &aOrganic Food", "", "&4End-Game Machine", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &728 J/s"); + public static final ItemStack CROP_GROWTH_ACCELERATOR = new CustomItem(Material.LIME_TERRACOTTA, "&aCrop Growth Accelerator", "", "&rRuns on &aOrganic Fertilizer", "", "&4End-Game Machine", "&8\u21E8 &7Radius: 7x7", "&8\u21E8 &7Speed: &a3/time", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &750 J/s"); + public static final ItemStack CROP_GROWTH_ACCELERATOR_2 = new CustomItem(Material.LIME_TERRACOTTA, "&aCrop Growth Accelerator &7(&eII&7)", "", "&rRuns on &aOrganic Fertilizer", "", "&4End-Game Machine", "&8\u21E8 &7Radius: 9x9", "&8\u21E8 &7Speed: &a4/time", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &760 J/s"); - public static ItemStack FOOD_FABRICATOR = new CustomItem(Material.GREEN_STAINED_GLASS, "&cFood Fabricator", "", "&rProduces &aOrganic Food", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &714 J/s"); - public static ItemStack FOOD_FABRICATOR_2 = new CustomItem(Material.GREEN_STAINED_GLASS, "&cFood Fabricator &7(&eII&7)", "", "&rProduces &aOrganic Food", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 6x", "&8\u21E8 &e\u26A1 &7512 J Buffer", "&8\u21E8 &e\u26A1 &748 J/s"); + public static final ItemStack FOOD_FABRICATOR = new CustomItem(Material.GREEN_STAINED_GLASS, "&cFood Fabricator", "", "&rProduces &aOrganic Food", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &714 J/s"); + public static final ItemStack FOOD_FABRICATOR_2 = new CustomItem(Material.GREEN_STAINED_GLASS, "&cFood Fabricator &7(&eII&7)", "", "&rProduces &aOrganic Food", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 6x", "&8\u21E8 &e\u26A1 &7512 J Buffer", "&8\u21E8 &e\u26A1 &748 J/s"); - public static ItemStack FOOD_COMPOSTER = new CustomItem(Material.GREEN_TERRACOTTA, "&cFood Composter", "", "&rProduces &aOrganic Fertilizer", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &716 J/s"); - public static ItemStack FOOD_COMPOSTER_2 = new CustomItem(Material.GREEN_TERRACOTTA, "&cFood Composter &7(&eII&7)", "", "&rProduces &aOrganic Fertilizer", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 10x", "&8\u21E8 &e\u26A1 &7512 J Buffer", "&8\u21E8 &e\u26A1 &752 J/s"); + public static final ItemStack FOOD_COMPOSTER = new CustomItem(Material.GREEN_TERRACOTTA, "&cFood Composter", "", "&rProduces &aOrganic Fertilizer", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &716 J/s"); + public static final ItemStack FOOD_COMPOSTER_2 = new CustomItem(Material.GREEN_TERRACOTTA, "&cFood Composter &7(&eII&7)", "", "&rProduces &aOrganic Fertilizer", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 10x", "&8\u21E8 &e\u26A1 &7512 J Buffer", "&8\u21E8 &e\u26A1 &752 J/s"); - public static ItemStack XP_COLLECTOR = null; - public static ItemStack REACTOR_COOLANT_CELL = null; + public static final ItemStack XP_COLLECTOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTc2MmExNWIwNDY5MmEyZTRiM2ZiMzY2M2JkNGI3ODQzNGRjZTE3MzJiOGViMWM3YTlmN2MwZmJmNmYifX19"), "&aEXP Collector", "", "&rCollects nearby Exp and stores it", "", "&4End-Game Machine", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &720 J/s"); + public static final ItemStack REACTOR_COOLANT_CELL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGU0MDczYmU0MGNiM2RlYjMxMGEwYmU5NTliNGNhYzY4ZTgyNTM3MjcyOGZhZmI2YzI5NzNlNGU3YzMzIn19fQ=="), "&bReactor Coolant Cell"); - public static ItemStack NUCLEAR_REACTOR = null; - public static ItemStack NETHERSTAR_REACTOR = null; - public static ItemStack REACTOR_ACCESS_PORT = new CustomItem(Material.CYAN_TERRACOTTA, "&2Reactor Access Port", "", "&rAllows you to interact with a Reactor", "&rvia Cargo Nodes, can also be used", "&ras a Buffer", "", "&8\u21E8 &eMust be placed &a3 Blocks &eabove the Reactor"); + public static final ItemStack NUCLEAR_REACTOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&2Nuclear Reactor", "", "&rRequires Cooling!", "&8\u21E8 &bMust be surrounded by Water", "&8\u21E8 &bMust be supplied with Reactor Coolant Cells", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &716384 J Buffer", "&8\u21E8 &e\u26A1 &7500 J/s"); + public static final ItemStack NETHERSTAR_REACTOR = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&fNether Star Reactor", "", "&fRuns on Nether Stars", "&8\u21E8 &bMust be surrounded by Water", "&8\u21E8 &bMust be supplied with Nether Ice Coolant Cells", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &732768 J Buffer", "&8\u21E8 &e\u26A1 &71024 J/s", "&8\u21E8 &4Causes nearby Entities to get Withered"); + public static final ItemStack REACTOR_ACCESS_PORT = new CustomItem(Material.CYAN_TERRACOTTA, "&2Reactor Access Port", "", "&rAllows you to interact with a Reactor", "&rvia Cargo Nodes, can also be used", "&ras a Buffer", "", "&8\u21E8 &eMust be placed &a3 Blocks &eabove the Reactor"); - public static ItemStack FREEZER = new CustomItem(Material.LIGHT_BLUE_STAINED_GLASS, "&bFreezer", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &718 J/s");; - public static ItemStack FREEZER_2 = new CustomItem(Material.LIGHT_BLUE_STAINED_GLASS, "&bFreezer &7(&eII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &730 J/s");; + public static final ItemStack FREEZER = new CustomItem(Material.LIGHT_BLUE_STAINED_GLASS, "&bFreezer", "", "&6Advanced Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &718 J/s"); + public static final ItemStack FREEZER_2 = new CustomItem(Material.LIGHT_BLUE_STAINED_GLASS, "&bFreezer &7(&eII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &730 J/s"); - public static ItemStack ELECTRIC_GOLD_PAN = new CustomItem(Material.BROWN_TERRACOTTA, "&6Electric Gold Pan", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &72 J/s"); - public static ItemStack ELECTRIC_GOLD_PAN_2 = new CustomItem(Material.BROWN_TERRACOTTA, "&6Electric Gold Pan &7(&eII&7)", "", "&eBasic Machine", "&8\u21E8 &7Speed: 3x", "&8\u21E8 &e\u26A1 &74 J/s"); - public static ItemStack ELECTRIC_GOLD_PAN_3 = new CustomItem(Material.BROWN_TERRACOTTA, "&6Electric Gold Pan &7(&eIII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 10x", "&8\u21E8 &e\u26A1 &714 J/s"); + public static final ItemStack ELECTRIC_GOLD_PAN = new CustomItem(Material.BROWN_TERRACOTTA, "&6Electric Gold Pan", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &72 J/s"); + public static final ItemStack ELECTRIC_GOLD_PAN_2 = new CustomItem(Material.BROWN_TERRACOTTA, "&6Electric Gold Pan &7(&eII&7)", "", "&eBasic Machine", "&8\u21E8 &7Speed: 3x", "&8\u21E8 &e\u26A1 &74 J/s"); + public static final ItemStack ELECTRIC_GOLD_PAN_3 = new CustomItem(Material.BROWN_TERRACOTTA, "&6Electric Gold Pan &7(&eIII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 10x", "&8\u21E8 &e\u26A1 &714 J/s"); - public static ItemStack ELECTRIC_DUST_WASHER = new CustomItem(Material.BLUE_STAINED_GLASS, "&3Electric Dust Washer", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &76 J/s"); - public static ItemStack ELECTRIC_DUST_WASHER_2 = new CustomItem(Material.BLUE_STAINED_GLASS, "&3Electric Dust Washer &7(&eII&7)", "", "&eBasic Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &710 J/s"); - public static ItemStack ELECTRIC_DUST_WASHER_3 = new CustomItem(Material.BLUE_STAINED_GLASS, "&3Electric Dust Washer &7(&eIII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 10x", "&8\u21E8 &e\u26A1 &730 J/s"); + public static final ItemStack ELECTRIC_DUST_WASHER = new CustomItem(Material.BLUE_STAINED_GLASS, "&3Electric Dust Washer", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &76 J/s"); + public static final ItemStack ELECTRIC_DUST_WASHER_2 = new CustomItem(Material.BLUE_STAINED_GLASS, "&3Electric Dust Washer &7(&eII&7)", "", "&eBasic Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &710 J/s"); + public static final ItemStack ELECTRIC_DUST_WASHER_3 = new CustomItem(Material.BLUE_STAINED_GLASS, "&3Electric Dust Washer &7(&eIII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 10x", "&8\u21E8 &e\u26A1 &730 J/s"); - public static ItemStack ELECTRIC_INGOT_FACTORY = new CustomItem(Material.RED_TERRACOTTA, "&cElectric Ingot Factory", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &78 J/s"); - public static ItemStack ELECTRIC_INGOT_FACTORY_2 = new CustomItem(Material.RED_TERRACOTTA, "&cElectric Ingot Factory &7(&eII&7)", "", "&eBasic Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &714 J/s"); - public static ItemStack ELECTRIC_INGOT_FACTORY_3 = new CustomItem(Material.RED_TERRACOTTA, "&cElectric Ingot Factory &7(&eIII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 8x", "&8\u21E8 &e\u26A1 &740 J/s"); + public static final ItemStack ELECTRIC_INGOT_FACTORY = new CustomItem(Material.RED_TERRACOTTA, "&cElectric Ingot Factory", "", "&eBasic Machine", "&8\u21E8 &7Speed: 1x", "&8\u21E8 &e\u26A1 &78 J/s"); + public static final ItemStack ELECTRIC_INGOT_FACTORY_2 = new CustomItem(Material.RED_TERRACOTTA, "&cElectric Ingot Factory &7(&eII&7)", "", "&eBasic Machine", "&8\u21E8 &7Speed: 2x", "&8\u21E8 &e\u26A1 &714 J/s"); + public static final ItemStack ELECTRIC_INGOT_FACTORY_3 = new CustomItem(Material.RED_TERRACOTTA, "&cElectric Ingot Factory &7(&eIII&7)", "", "&4End-Game Machine", "&8\u21E8 &7Speed: 8x", "&8\u21E8 &e\u26A1 &740 J/s"); - public static ItemStack AUTOMATED_CRAFTING_CHAMBER = new CustomItem(Material.CRAFTING_TABLE, "&6Automated Crafting Chamber", "", "&6Advanced Machine", "&8\u21E8 &e\u26A1 &710 J/Item"); - public static ItemStack FLUID_PUMP = new CustomItem(Material.BLUE_TERRACOTTA, "&9Fluid Pump", "", "&6Advanced Machine", "&8\u21E8 &e\u26A1 &732 J/Block"); - public static ItemStack CHARGING_BENCH = new CustomItem(Material.CRAFTING_TABLE, "&6Charging Bench", "", "&rCharges Items such as Jetpacks", "", "&eBasic Machine", "&8\u21E8 &e\u26A1 &7128 J Buffer", "&8\u21E8 &e\u26A1 &7Energy Loss: &c50%"); + public static final ItemStack AUTOMATED_CRAFTING_CHAMBER = new CustomItem(Material.CRAFTING_TABLE, "&6Automated Crafting Chamber", "", "&6Advanced Machine", "&8\u21E8 &e\u26A1 &710 J/Item"); + public static final ItemStack FLUID_PUMP = new CustomItem(Material.BLUE_TERRACOTTA, "&9Fluid Pump", "", "&6Advanced Machine", "&8\u21E8 &e\u26A1 &732 J/Block"); + public static final ItemStack CHARGING_BENCH = new CustomItem(Material.CRAFTING_TABLE, "&6Charging Bench", "", "&rCharges Items such as Jetpacks", "", "&eBasic Machine", "&8\u21E8 &e\u26A1 &7128 J Buffer", "&8\u21E8 &e\u26A1 &7Energy Loss: &c50%"); - public static ItemStack WITHER_ASSEMBLER = new CustomItem(Material.OBSIDIAN, "&5Wither Assembler", "", "&4End-Game Machine", "&8\u21E8 &7Cooldown: &b30 Seconds", "&8\u21E8 &e\u26A1 &74096 J Buffer", "&8\u21E8 &e\u26A1 &74096 J/Wither"); + public static final ItemStack WITHER_ASSEMBLER = new CustomItem(Material.OBSIDIAN, "&5Wither Assembler", "", "&4End-Game Machine", "&8\u21E8 &7Cooldown: &b30 Seconds", "&8\u21E8 &e\u26A1 &74096 J Buffer", "&8\u21E8 &e\u26A1 &74096 J/Wither"); - public static ItemStack TRASH_CAN = null; + public static final ItemStack TRASH_CAN = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzJkNDEwNDJjZTk5MTQ3Y2MzOGNhYzllNDY3NDE1NzZlN2VlNzkxMjgzZTZmYWM4ZDMyOTJjYWUyOTM1ZjFmIn19fQ=="), "&3Trash Can", "", "&rWill destroy all Items put into it"); - public static ItemStack ELYTRA = new ItemStack(Material.ELYTRA); - public static ItemStack ELYTRA_SCALE = new CustomItem(Material.FEATHER, "&bEyltra Scale"); - public static ItemStack INFUSED_ELYTRA = new CustomItem(new CustomItem(ELYTRA, "&5Infused Elytra"), new String[] {"MENDING-1"}); - public static ItemStack SOULBOUND_ELYTRA = new CustomItem(ELYTRA, "&cSoulbound Elytra"); + public static final ItemStack ELYTRA = new ItemStack(Material.ELYTRA); + public static final ItemStack ELYTRA_SCALE = new CustomItem(Material.FEATHER, "&bElytra Scale"); + public static final ItemStack INFUSED_ELYTRA = new CustomItem(ELYTRA, "&5Infused Elytra"); + public static final ItemStack SOULBOUND_ELYTRA = new CustomItem(ELYTRA, "&cSoulbound Elytra"); + + static { + INFUSED_ELYTRA.addUnsafeEnchantment(Enchantment.MENDING, 1); + } // ChestTerminal Addon - public static ItemStack CHEST_TERMINAL = null; - public static ItemStack CT_IMPORT_BUS = null; - public static ItemStack CT_EXPORT_BUS = null; + public static final ItemStack CHEST_TERMINAL = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E0NGZmM2E1ZjQ5YzY5Y2FiNjc2YmFkOGQ5OGEwNjNmYTc4Y2ZhNjE5MTZmZGVmM2UyNjc1NTdmZWMxODI4MyJ9fX0="), "&3CT Access Terminal", "&7If this Block is connected to a", "&7Cargo Network, it will allow you to remotely", "&7interact with any Items supplied by", "&7Nodes tuned into the ChestTerminal Channel"); + public static final ItemStack CT_IMPORT_BUS = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTEzZGIyZTdlNzJlYTQ0MzJlZWZiZDZlNThhODVlYWEyNDIzZjgzZTY0MmNhNDFhYmM2YTkzMTc3NTdiODg5In19fQ=="), "&3CT Import Bus", "&7If this Block is connected to a", "&7Cargo Network, it will pull any Items from", "&7the Inventory it is attached to and place it", "&7into the CT Network Channel"); + public static final ItemStack CT_EXPORT_BUS = new CustomItem(getSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTEzZGIyZTdlNzJlYTQ0MzJlZWZiZDZlNThhODVlYWEyNDIzZjgzZTY0MmNhNDFhYmM2YTkzMTc3NTdiODg5In19fQ=="), "&3CT Export Bus", "&7If this Block is connected to a", "&7Cargo Network, it will pull any Items from", "&7the CT Network Channel and place these", "&7into the Inventory it is attached to"); - static { + private static ItemStack getSkull(String texture) { try { - PORTABLE_CRAFTER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzJlYzRhNGJkOGE1OGY4MzYxZjhhMDMwM2UyMTk5ZDMzZDYyNGVhNWY5MmY3Y2IzNDE0ZmVlOTVlMmQ4NjEifX19"), "&6Portable Crafter", "&a&oA portable Crafting Table", "", "&eRight Click&7 to open"); - PORTABLE_DUSTBIN = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzJkNDEwNDJjZTk5MTQ3Y2MzOGNhYzllNDY3NDE1NzZlN2VlNzkxMjgzZTZmYWM4ZDMyOTJjYWUyOTM1ZjFmIn19fQ=="), "&6Portable Dustbin", "&rYour portable Item-Destroyer", "", "&eRight Click&7 to open"); - TRASH_CAN = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzJkNDEwNDJjZTk5MTQ3Y2MzOGNhYzllNDY3NDE1NzZlN2VlNzkxMjgzZTZmYWM4ZDMyOTJjYWUyOTM1ZjFmIn19fQ=="), "&3Trash Can", "", "&rWill destroy all Items put into it"); - CAN = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTRkYTk3ZjA4MGUzOTViODQyYzRjYzgyYTg0MDgyM2Q0ZGJkOGNhNjg4YTIwNjg1M2U1NzgzZTRiZmRjMDEyIn19fQ=="), "&rTin Can"); + return CustomSkull.getItem(texture); + } + catch(Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while initializing the Items for Slimefun " + Slimefun.getVersion(), x); - STONE_CHUNK = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2U4ZjVhZGIxNGQ2YzlmNmI4MTBkMDI3NTQzZjFhOGMxZjQxN2UyZmVkOTkzYzk3YmNkODljNzRmNWUyZTgifX19"), "&6Stone Chunk"); - - INFUSED_MAGNET = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWJhOGViYzRjNmE4MTczMDk0NzQ5OWJmN2UxZDVlNzNmZWQ2YzFiYjJjMDUxZTk2ZDM1ZWIxNmQyNDYxMGU3In19fQ=="), "&aInfused Magnet" , "", "&rMagical infused Magnets", "&rattract nearby Items", "&ras long as it is somewhere in", "&ryour Inventory", "", "&7Hold &eShift&7 to pick up nearby Items"); - MAGNET = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWJhOGViYzRjNmE4MTczMDk0NzQ5OWJmN2UxZDVlNzNmZWQ2YzFiYjJjMDUxZTk2ZDM1ZWIxNmQyNDYxMGU3In19fQ=="), "&cMagnet"); - ELECTRO_MAGNET = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWJhOGViYzRjNmE4MTczMDk0NzQ5OWJmN2UxZDVlNzNmZWQ2YzFiYjJjMDUxZTk2ZDM1ZWIxNmQyNDYxMGU3In19fQ=="), "&cElectromagnet"); - ELECTRIC_MOTOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGNiY2EwMTJmNjdlNTRkZTlhZWU3MmZmNDI0ZTA1NmMyYWU1OGRlNWVhY2M5NDlhYjJiY2Q5NjgzY2VjIn19fQ=="), "&cElectric Motor"); - CARGO_MOTOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGNiY2EwMTJmNjdlNTRkZTlhZWU3MmZmNDI0ZTA1NmMyYWU1OGRlNWVhY2M5NDlhYjJiY2Q5NjgzY2VjIn19fQ=="), "&3Cargo Motor"); - - BACKPACK_SMALL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eSmall Backpack", new String[] {"", "&7Size: &e9", "&7ID: ", "", "&7&eRight Click&7 to open"}); - BACKPACK_MEDIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eBackpack", new String[] {"", "&7Size: &e18", "&7ID: ", "", "&7&eRight Click&7 to open"}); - BACKPACK_LARGE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eLarge Backpack", new String[] {"", "&7Size: &e27", "&7ID: ", "", "&7&eRight Click&7 to open"}); - WOVEN_BACKPACK = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eWoven Backpack", new String[] {"", "&7Size: &e36", "&7ID: ", "", "&7&eRight Click&7 to open"}); - GILDED_BACKPACK = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eGilded Backpack", new String[] {"", "&7Size: &e45", "&7ID: ", "", "&7&eRight Click&7 to open"}); - RADIANT_BACKPACK = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&eRadiant Backpack", new String[] {"", "&7Size: &e54 (Double chest)", "&7ID: ", "", "&7&eRight Click&7 to open"}); - BOUND_BACKPACK = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&cSoulbound Backpack", new String[] {"", "&7Size: &e36", "&7ID: ", "", "&7&eRight Click&7 to open"}); - COOLER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDRjMTU3MjU4NGViNWRlMjI5ZGU5ZjVhNGY3NzlkMGFhY2JhZmZkMzNiY2IzM2ViNDUzNmE2YTJiYzZhMSJ9fX0="), "&bCooler", new String[] {"&rAllows you to store Juices/Smoothies", "&rand automatically consumes them when you are hungry", "&rand you have this in your Inventory", "", "&7Size: &e27", "&7ID: ", "", "&7&eRight Click&7 to open"}); - ENDER_BACKPACK = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&6Ender Backpack", new String[] {"&a&oA portable Ender Chest", "", "&eRight Click&7 to open"}); - - VOIDBAG_SMALL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Small Void Bag", new String[] {"", "&7Size: &e9", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"}); - VOIDBAG_MEDIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Void Bag", new String[] {"", "&7Size: &e18", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"}); - VOIDBAG_BIG = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Big Void Bag", new String[] {"", "&7Size: &e27", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"}); - VOIDBAG_LARGE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Large Void Bag", new String[] {"", "&7Size: &e36", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"}); - BOUND_VOIDBAG = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmEzYjM0ODYyYjlhZmI2M2NmOGQ1Nzc5OTY2ZDNmYmE3MGFmODJiMDRlODNmM2VhZjY0NDlhZWJhIn19fQ=="), "&4Soulbound Void Bag", new String[] {"", "&7Size: &e36", "&7ID: ", "", "&7&eLeft Click&7 to suck up nearby Items", "&7&eRight Click&7 to open"}); - - COAL_GENERATOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&cCoal Generator", "", "&6Average Generator", "&8\u21E8 &e\u26A1 &764 J Buffer", "&8\u21E8 &e\u26A1 &716 J/s"); - LAVA_GENERATOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&4Lava Generator", "", "&6Average Generator", "&8\u21E8 &e\u26A1 &7512 J Buffer", "&8\u21E8 &e\u26A1 &720 J/s"); - COMBUSTION_REACTOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&cCombustion Reactor", "", "&6Advanced Generator", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &724 J/s"); - - NUCLEAR_REACTOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&2Nuclear Reactor", "", "&rRequires Cooling!", "&8\u21E8 &bMust be surrounded by Water", "&8\u21E8 &bMust be supplied with Reactor Coolant Cells", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &716384 J Buffer", "&8\u21E8 &e\u26A1 &7500 J/s"); - NETHERSTAR_REACTOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&fNether Star Reactor", "", "&fRuns on Nether Stars", "&8\u21E8 &bMust be surrounded by Water", "&8\u21E8 &bMust be supplied with Nether Ice Coolant Cells", "", "&4End-Game Generator", "&8\u21E8 &e\u26A1 &732768 J Buffer", "&8\u21E8 &e\u26A1 &71024 J/s", "&8\u21E8 &4Causes nearby Entities to get Withered"); - - SMALL_CAPACITOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aSmall Energy Capacitor", "", "&eBasic Capacitor", "&8\u21E8 &e\u26A1 &7128 J Capacity"); - MEDIUM_CAPACITOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aMedium Energy Capacitor", "", "&6Average Capacitor", "&8\u21E8 &e\u26A1 &7512 J Capacity"); - BIG_CAPACITOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aBig Energy Capacitor", "", "&aMedium Capacitor", "&8\u21E8 &e\u26A1 &71024 J Capacity"); - LARGE_CAPACITOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aLarge Energy Capacitor", "", "&2Good Capacitor", "&8\u21E8 &e\u26A1 &78192 J Capacity"); - CARBONADO_EDGED_CAPACITOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="), "&aCarbonado Edged Energy Capacitor", "", "&4End-Game Capacitor", "&8\u21E8 &e\u26A1 &765536 J Capacity"); - CHEESE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzRmZWJiYzE1ZDFkNGNjNjJiZWRjNWQ3YTJiNmYwZjQ2Y2Q1YjA2OTZhODg0ZGU3NWUyODllMzVjYmI1M2EwIn19fQ=="), "&rCheese"); - BUTTER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjY2YjE5ZjdkNjM1ZDAzNDczODkxZGYzMzAxN2M1NDkzNjMyMDlhOGY2MzI4YTg1NDJjMjEzZDA4NTI1ZSJ9fX0="), "&rButter"); - DUCT_TAPE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjJmYWFjZWFiNjM4NGZmZjVlZDI0YmI0NGE0YWYyZjU4NGViMTM4MjcyOWVjZDkzYTUzNjlhY2ZkNjY1NCJ9fX0="), "&8Duct Tape", "", "&rYou can repair Items using this", "&rin an Auto-Anvil"); - - URANIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzhiMjlhZmE2ZDZkYzkyM2UyZTEzMjRiZjgxOTI3NTBmN2JkYmRkYzY4OTYzMmEyYjZjMThkOWZlN2E1ZSJ9fX0="), "&4Uranium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); - SMALL_URANIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzhiMjlhZmE2ZDZkYzkyM2UyZTEzMjRiZjgxOTI3NTBmN2JkYmRkYzY4OTYzMmEyYjZjMThkOWZlN2E1ZSJ9fX0="), "&cSmall Chunk of Uranium", "", "&eRadiation Level: MODERATE", "&4&oHazmat Suit required"); - TINY_URANIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzhiMjlhZmE2ZDZkYzkyM2UyZTEzMjRiZjgxOTI3NTBmN2JkYmRkYzY4OTYzMmEyYjZjMThkOWZlN2E1ZSJ9fX0="), "&cTiny Pile of Uranium", "", "&cRadiation Level: LOW", "&4&oNo Hazmat Suit required"); - - NEPTUNIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGVkZWE2YmZkMzdlNDlkZTQzZjE1NGZlNmZjYTYxN2Q0MTI5ZTYxYjk1NzU5YTNkNDlhMTU5MzVhMWMyZGNmMCJ9fX0="), "&aNeptunium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); - PLUTONIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjVjZjkxYjczODg2NjVhNmQ3YzFiNjAyNmJkYjIzMjJjNmQyNzg5OTdhNDQ0Nzg2NzdjYmNjMTVmNzYxMjRmIn19fQ=="), "&7Plutonium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); - BOOSTED_URANIUM = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjgzN2NhMTJmMjIyZjQ3ODcxOTZhMTdiOGFiNjU2OTg1Zjg0MDRjNTA3NjdhZGJjYjZlN2YxNDI1NGZlZSJ9fX0="), "&2Boosted Uranium", "", "&2Radiation Level: HIGH", "&4&oHazmat Suit required"); - - PROGRAMMABLE_ANDROID = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzUwM2NiN2VkODQ1ZTdhNTA3ZjU2OWFmYzY0N2M0N2FjNDgzNzcxNDY1YzlhNjc5YTU0NTk0Yzc2YWZiYSJ9fX0="), "&cProgrammable Android &7(Normal)", "", "&8\u21E8 &7Function: None", "&8\u21E8 &7Fuel Efficiency: 1.0x"); - PROGRAMMABLE_ANDROID_FARMER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjlkMzMzNTdlODQxODgyM2JmNzgzZGU5MmRlODAyOTFiNGViZDM5MmFlYzg3MDY2OThlMDY4OTZkNDk4ZjYifX19"), "&cProgrammable Android &7(Farmer)", "", "&8\u21E8 &7Function: Farming", "&8\u21E8 &7Fuel Efficiency: 1.0x"); - PROGRAMMABLE_ANDROID_MINER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTYzOGEyODU0MWFiM2FlMGE3MjNkNTU3ODczOGUwODc1ODM4OGVjNGMzMzI0N2JkNGNhMTM0ODJhZWYzMzQifX19"), "&cProgrammable Android &7(Miner)", "", "&8\u21E8 &7Function: Mining", "&8\u21E8 &7Fuel Efficiency: 1.0x"); - PROGRAMMABLE_ANDROID_WOODCUTTER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDMyYTgxNDUxMDE0MjIwNTE2OWExYWQzMmYwYTc0NWYxOGU5Y2I2YzY2ZWU2NGVjYTJlNjViYWJkZWY5ZmYifX19"), "&cProgrammable Android &7(Woodcutter)", "", "&8\u21E8 &7Function: Woodcutting", "&8\u21E8 &7Fuel Efficiency: 1.0x"); - PROGRAMMABLE_ANDROID_BUTCHER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2I0NzJkZjBhZDlhM2JlODhmMmU1ZDVkNDIyZDAyYjExNmQ2NGQ4ZGYxNDc1ZWQzMmU1NDZhZmM4NGIzMSJ9fX0="), "&cProgrammable Android &7(Butcher)", "", "&8\u21E8 &7Function: Slaughtering", "&8\u21E8 &7Damage: 4", "&8\u21E8 &7Fuel Efficiency: 1.0x"); - PROGRAMMABLE_ANDROID_FISHERMAN = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzQ1ZTg3MzNhNzMxMTQzMzNiOThiMzYwMTc1MTI0MTcyMmY0NzEzZTFhMWE1ZDM2ZmJiMTMyNDkzZjFjNyJ9fX0="), "&cProgrammable Android &7(Fisherman)", "", "&8\u21E8 &7Function: Fishing", "&8\u21E8 &7Success Rate: 10%", "&8\u21E8 &7Fuel Efficiency: 1.0x"); - - PROGRAMMABLE_ANDROID_2 = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzUwM2NiN2VkODQ1ZTdhNTA3ZjU2OWFmYzY0N2M0N2FjNDgzNzcxNDY1YzlhNjc5YTU0NTk0Yzc2YWZiYSJ9fX0="), "&cAdvanced Programmable Android &7(Normal)", "", "&8\u21E8 &7Function: None", "&8\u21E8 &7Fuel Efficiency: 1.5x"); - PROGRAMMABLE_ANDROID_2_FISHERMAN = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzQ1ZTg3MzNhNzMxMTQzMzNiOThiMzYwMTc1MTI0MTcyMmY0NzEzZTFhMWE1ZDM2ZmJiMTMyNDkzZjFjNyJ9fX0="), "&cAdvanced Programmable Android &7(Fisherman)", "", "&8\u21E8 &7Function: Fishing", "&8\u21E8 &7Success Rate: 20%", "&8\u21E8 &7Fuel Efficiency: 1.5x"); - PROGRAMMABLE_ANDROID_2_FARMER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjlkMzMzNTdlODQxODgyM2JmNzgzZGU5MmRlODAyOTFiNGViZDM5MmFlYzg3MDY2OThlMDY4OTZkNDk4ZjYifX19"), "&cAdvanced Programmable Android &7(Farmer)", "", "&8\u21E8 &7Function: Farming", "&8\u21E8 &7Fuel Efficiency: 1.5x", "&8\u21E8 &7Can also harvest Plants from ExoticGarden"); - PROGRAMMABLE_ANDROID_2_BUTCHER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2I0NzJkZjBhZDlhM2JlODhmMmU1ZDVkNDIyZDAyYjExNmQ2NGQ4ZGYxNDc1ZWQzMmU1NDZhZmM4NGIzMSJ9fX0="), "&cAdvanced Programmable Android &7(Butcher)", "", "&8\u21E8 &7Function: Slaughtering", "&8\u21E8 &7Damage: 8", "&8\u21E8 &7Fuel Efficiency: 1.5x"); - - PROGRAMMABLE_ANDROID_3 = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzUwM2NiN2VkODQ1ZTdhNTA3ZjU2OWFmYzY0N2M0N2FjNDgzNzcxNDY1YzlhNjc5YTU0NTk0Yzc2YWZiYSJ9fX0="), "&eEmpowered Programmable Android &7(Normal)", "", "&8\u21E8 &7Function: None", "&8\u21E8 &7Fuel Efficiency: 3.0x"); - PROGRAMMABLE_ANDROID_3_FISHERMAN = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzQ1ZTg3MzNhNzMxMTQzMzNiOThiMzYwMTc1MTI0MTcyMmY0NzEzZTFhMWE1ZDM2ZmJiMTMyNDkzZjFjNyJ9fX0="), "&eEmpowered Programmable Android &7(Fisherman)", "", "&8\u21E8 &7Function: Fishing", "&8\u21E8 &7Success Rate: 30%", "&8\u21E8 &7Fuel Efficiency: 8.0x"); - PROGRAMMABLE_ANDROID_3_BUTCHER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2I0NzJkZjBhZDlhM2JlODhmMmU1ZDVkNDIyZDAyYjExNmQ2NGQ4ZGYxNDc1ZWQzMmU1NDZhZmM4NGIzMSJ9fX0="), "&eEmpowered Programmable Android &7(Butcher)", "", "&8\u21E8 &7Function: Slaughtering", "&8\u21E8 &7Damage: 20", "&8\u21E8 &7Fuel Efficiency: 8.0x"); - - GPS_TRANSMITTER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS Transmitter", "", "&8\u21E8 &e\u26A1 &716 J Buffer", "&8\u21E8 &e\u26A1 &72 J/s"); - GPS_TRANSMITTER_2 = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&cAdvanced GPS Transmitter", "", "&8\u21E8 &e\u26A1 &764 J Buffer", "&8\u21E8 &e\u26A1 &76 J/s"); - GPS_TRANSMITTER_3 = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&4Carbonado GPS Transmitter", "", "&8\u21E8 &e\u26A1 &7256 J Buffer", "&8\u21E8 &e\u26A1 &722 J/s"); - GPS_TRANSMITTER_4 = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&eEnergized GPS Transmitter", "", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &792 J/s"); - - GPS_CONTROL_PANEL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&bGPS Control Panel", "", "&rAllows you to trach your Satellites", "&rand manage your Waypoints"); - GPS_EMERGENCY_TRANSMITTER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&cGPS Emergency Transmitter", "", "&rCarrying this in your Inventory", "&rautomatically sets a Waypoint", "&rat your Location when you die."); - - GPS_GEO_SCANNER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmFkOGNmZWIzODdhNTZlM2U1YmNmODUzNDVkNmE0MTdiMjQyMjkzODg3ZGIzY2UzYmE5MWZhNDA5YjI1NGI4NiJ9fX0="), "&bGPS Geo-Scanner", "", "&rScans a Chunk for natural Resources", "&rsuch as &8Oil"); - OIL_PUMP = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWZlMWEwNDBhNDI1ZTMxYTQ2ZDRmOWE5Yjk4MDZmYTJmMGM0N2VlODQ3MTFjYzE5MzJmZDhhYjMyYjJkMDM4In19fQ=="), "&rOil Pump", "", "&7Pumps up Oil and fills it into Buckets", "", "&c&l! &cMake sure to Geo-Scan the Chunk first"); - BUCKET_OF_OIL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmNlMDRiNDFkMTllYzc5MjdmOTgyYTYzYTk0YTNkNzlmNzhlY2VjMzMzNjMwNTFmZGUwODMxYmZhYmRiZCJ9fX0="), "&rBucket of Oil"); - BUCKET_OF_FUEL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTg0ZGRjYTc2NjcyNWI4Yjk3NDEzZjI1OWMzZjc2NjgwNzBmNmFlNTU0ODNhOTBjOGU1NTI1Mzk0ZjljMDk5In19fQ=="), "&rBucket of Fuel"); - - NETHER_ICE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2NlMmRhZDliYWY3ZWFiYTdlODBkNGQwZjlmYWMwYWFiMDFhNzZiMTJmYjcxYzNkMmFmMmExNmZkZDRjNzM4MyJ9fX0="), "&eNether Ice", "", "&eRadiation Level: MODERATE", "&4&oHazmat Suit required"); - ENRICHED_NETHER_ICE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2M4MThhYTEzYWFiYzcyOTQ4MzhkMjFjYWFjMDU3ZTk3YmQ4Yzg5NjQxYTBjMGY4YTU1NDQyZmY0ZTI3In19fQ=="), "&eEnriched Nether Ice", "", "&2Radiation Level: EXTREMELY HIGH", "&4&oHazmat Suit required"); - - LAVA_CRYSTAL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTNhZDhlZTg0OWVkZjA0ZWQ5YTI2Y2EzMzQxZjYwMzNiZDc2ZGNjNDIzMWVkMWVhNjNiNzU2NTc1MWIyN2FjIn19fQ=="), "&4Lava Crystal"); - ANDROID_MEMORY_CORE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDc4ZjJiN2U1ZTc1NjM5ZWE3ZmI3OTZjMzVkMzY0YzRkZjI4YjQyNDNlNjZiNzYyNzdhYWRjZDYyNjEzMzcifX19"), "&bAndroid Memory Core"); - - CARBON = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGIzYTA5NWI2YjgxZTZiOTg1M2ExOTMyNGVlZGYwYmI5MzQ5NDE3MjU4ZGQxNzNiOGVmZjg3YTA4N2FhIn19fQ=="), "&eCarbon"); - COMPRESSED_CARBON = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzIxZDQ5NTE2NTc0OGQzMTE2Zjk5ZDZiNWJkNWQ0MmViOGJhNTkyYmNkZmFkMzdmZDk1ZjliNmMwNGEzYiJ9fX0="), "&cCompressed Carbon"); - CARBON_CHUNK = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzIxZDQ5NTE2NTc0OGQzMTE2Zjk5ZDZiNWJkNWQ0MmViOGJhNTkyYmNkZmFkMzdmZDk1ZjliNmMwNGEzYiJ9fX0="), "&4Carbon Chunk"); - - SYNTHETIC_SAPPHIRE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTM1MDMyZjRkN2QwMWRlOGVjOTlkODlmODcyMzAxMmQ0ZTc0ZmE3MzAyMmM0ZmFjZjFiNTdjN2ZmNmZmMCJ9fX0="), "&bSynthetic Sapphire"); - CARBONADO = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTJmNGIxNTc3ZjUxNjBjNjg5MzE3MjU3MWM0YTcxZDhiMzIxY2RjZWFhMDMyYzZlMGUzYjYwZTBiMzI4ZmEifX19"), "&b&lCarbonado", "", "&7&o\"Black Diamond\""); - RAW_CARBONADO = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWI0OWU2ZWMxMDc3MWU4OTkyMjVhZWE3M2NkOGNmMDM2ODRmNDExZDE0MTVjNzMyM2M5M2NiOTQ3NjIzMCJ9fX0="), "&bRaw Carbonado"); - - ENERGY_REGULATOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDc4ZjJiN2U1ZTc1NjM5ZWE3ZmI3OTZjMzVkMzY0YzRkZjI4YjQyNDNlNjZiNzYyNzdhYWRjZDYyNjEzMzcifX19"), "&6Energy Regulator", "", "&rCore Component of an Energy Network"); - - CARGO_MANAGER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTUxMGJjODUzNjJhMTMwYTZmZjlkOTFmZjExZDZmYTQ2ZDdkMTkxMmEzNDMxZjc1MTU1OGVmM2M0ZDljMiJ9fX0="), "&6Cargo Manager", "", "&rCore Component of an Item Transport Network"); - CARGO_NODE = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMDdiN2VmNmZkNzg2NDg2NWMzMWMxZGM4N2JlZDI0YWI1OTczNTc5ZjVjNjYzOGZlY2I4ZGVkZWI0NDNmZjAifX19"), "&7Cargo Node &c(Connector)", "", "&rCargo Connector Pipe"); - CARGO_INPUT = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTZkMWMxYTY5YTNkZTlmZWM5NjJhNzdiZjNiMmUzNzZkZDI1Yzg3M2EzZDhmMTRmMWRkMzQ1ZGFlNGM0In19fQ=="), "&7Cargo Node &c(Input)", "", "&rCargo Input Pipe"); - CARGO_OUTPUT = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTViMjFmZDQ4MGMxYzQzYmYzYjlmODQyYzg2OWJkYzNiYzVhY2MyNTk5YmYyZWI2YjhhMWM5NWRjZTk3OGYifX19"), "&7Cargo Node &c(Output)", "", "&rCargo Output Pipe"); - CARGO_OUTPUT_ADVANCED = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTViMjFmZDQ4MGMxYzQzYmYzYjlmODQyYzg2OWJkYzNiYzVhY2MyNTk5YmYyZWI2YjhhMWM5NWRjZTk3OGYifX19"), "&6Advanced Cargo Node &c(Output)", "", "&rCargo Output Pipe"); - - XP_COLLECTOR = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTc2MmExNWIwNDY5MmEyZTRiM2ZiMzY2M2JkNGI3ODQzNGRjZTE3MzJiOGViMWM3YTlmN2MwZmJmNmYifX19"), "&aEXP Collector", "", "&rCollects nearby Exp and stores it", "", "&4End-Game Machine", "&8\u21E8 &e\u26A1 &71024 J Buffer", "&8\u21E8 &e\u26A1 &720 J/s"); - - ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9X"); - WHEAT_ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Wheat"); - CARROT_ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Carrots"); - POTATO_ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Potatoes"); - SEEDS_ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Seeds"); - BEETROOT_ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Beetroot"); - MELON_ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Melon"); - APPLE_ORGANIC_FOOD = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Food", "&7Content: &9Apple"); - - FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9X"); - WHEAT_FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Wheat"); - CARROT_FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Carrots"); - POTATO_FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Potatoes"); - SEEDS_FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Seeds"); - BEETROOT_FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Beetroot"); - MELON_FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Melon"); - APPLE_FERTILIZER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzOWUzZjVhY2JlZTliZTRjNDI1OTI4OWQ2ZDlmMzVjNjM1ZmZhNjYxMTE0Njg3YjNlYTZkZGE4Yzc5In19fQ=="), "&aOrganic Fertilizer", "&7Content: &9Apple"); - - NETHER_ICE_COOLANT_CELL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGQzY2Q0MTI1NTVmODk3MDE2MjEzZTVkNmM3NDMxYjQ0OGI5ZTU2NDRlMWIxOWVjNTFiNTMxNmYzNTg0MGUwIn19fQ=="), "&6Nether Ice Coolant Cell"); - REACTOR_COOLANT_CELL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGU0MDczYmU0MGNiM2RlYjMxMGEwYmU5NTliNGNhYzY4ZTgyNTM3MjcyOGZhZmI2YzI5NzNlNGU3YzMzIn19fQ=="), "&bReactor Coolant Cell"); - - CHEST_TERMINAL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E0NGZmM2E1ZjQ5YzY5Y2FiNjc2YmFkOGQ5OGEwNjNmYTc4Y2ZhNjE5MTZmZGVmM2UyNjc1NTdmZWMxODI4MyJ9fX0="), "&3CT Access Terminal", "&7If this Block is connected to a", "&7Cargo Network, it will allow you to remotely", "&7interact with any Items supplied by", "&7Nodes tuned into the ChestTerminal Channel"); - CT_IMPORT_BUS = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTEzZGIyZTdlNzJlYTQ0MzJlZWZiZDZlNThhODVlYWEyNDIzZjgzZTY0MmNhNDFhYmM2YTkzMTc3NTdiODg5In19fQ=="), "&3CT Import Bus", "&7If this Block is connected to a", "&7Cargo Network, it will pull any Items from", "&7the Inventory it is attached to and place it", "&7into the CT Network Channel"); - CT_EXPORT_BUS = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTEzZGIyZTdlNzJlYTQ0MzJlZWZiZDZlNThhODVlYWEyNDIzZjgzZTY0MmNhNDFhYmM2YTkzMTc3NTdiODg5In19fQ=="), "&3CT Export Bus", "&7If this Block is connected to a", "&7Cargo Network, it will pull any Items from", "&7the CT Network Channel and place these", "&7into the Inventory it is attached to"); - - BATTERY = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmUyZGRhNmVmNjE4NWQ0ZGQ2ZWE4Njg0ZTk3ZDM5YmE4YWIwMzdlMjVmNzVjZGVhNmJkMjlkZjhlYjM0ZWUifX19"), "&6Battery"); - - HEATING_COIL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2UzYmM0ODkzYmE0MWEzZjczZWUyODE3NGNkZjRmZWY2YjE0NWU0MWZlNmM4MmNiN2JlOGQ4ZTk3NzFhNSJ9fX0="), "&cHeating Coil"); - COOLING_UNIT = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzU0YmFkODZjOTlkZjc4MGM4ODlhMTA5OGY3NzY0OGVhZDczODVjYzFkZGIwOTNkYTVhN2Q4YzRjMmFlNTRkIn19fQ=="), "&bCooling Unit"); - POWER_CRYSTAL = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTNjMWIwMzZiNmUwMzUxN2IyODVhODExYmQ4NWU3M2Y1YWJmZGFjYzFkZGY5MGRmZjk2MmUxODA5MzRlMyJ9fX0="), "&c&lPower Crystal"); - } catch (Exception e) { - e.printStackTrace(); + return new ItemStack(Material.PLAYER_HEAD); } } diff --git a/src/me/mrCookieSlime/Slimefun/Misc/BookDesign.java b/src/me/mrCookieSlime/Slimefun/Misc/BookDesign.java deleted file mode 100644 index d38730b91..000000000 --- a/src/me/mrCookieSlime/Slimefun/Misc/BookDesign.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.mrCookieSlime.Slimefun.Misc; - -public enum BookDesign { - - BOOK, - CHEST, - CHEAT_SHEET; - -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/Category.java b/src/me/mrCookieSlime/Slimefun/Objects/Category.java index 3c31ed8f6..20acc458f 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/Category.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/Category.java @@ -2,14 +2,15 @@ package me.mrCookieSlime.Slimefun.Objects; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.Categories; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.api.Slimefun; /** * Statically handles categories. @@ -20,16 +21,10 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; * @since 4.0 * * @see LockedCategory - * @see SeasonCategory + * @see SeasonalCategory */ public class Category { - /** - * List of the registered Categories. - * @since 4.0 - * @see Categories - */ - public static List list = new ArrayList<>(); - + private ItemStack item; private List items; private int tier; @@ -44,6 +39,11 @@ public class Category { */ public Category(ItemStack item) { this.item = item; + + ItemMeta meta = item.getItemMeta(); + meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + this.item.setItemMeta(meta); + this.items = new ArrayList<>(); this.tier = 3; } @@ -72,14 +72,19 @@ public class Category { * @since 4.0 */ public void register() { - list.add(this); - Collections.sort(list, new CategorySorter()); + SlimefunPlugin.getUtilities().allCategories.add(this); + Collections.sort(list(), SlimefunPlugin.getUtilities().categorySorter); - if (this instanceof SeasonCategory) { - if (((SeasonCategory) this).isUnlocked()) Slimefun.current_categories.add(this); + if (this instanceof SeasonalCategory) { + if (((SeasonalCategory) this).isUnlocked()) { + SlimefunPlugin.getUtilities().enabledCategories.add(this); + } } - else Slimefun.current_categories.add(this); - Collections.sort(Slimefun.current_categories, new CategorySorter()); + else { + SlimefunPlugin.getUtilities().enabledCategories.add(this); + } + + Collections.sort(SlimefunPlugin.getUtilities().enabledCategories, SlimefunPlugin.getUtilities().categorySorter); } /** @@ -91,7 +96,7 @@ public class Category { * @see Categories */ public static List list() { - return list; + return SlimefunPlugin.getUtilities().allCategories; } /** @@ -135,8 +140,9 @@ public class Category { * * @since 4.0 */ + @Deprecated public static Category getByItem(ItemStack item) { - for (Category c: list) { + for (Category c: list()) { if (c.getItem().isSimilar(item)) return c; } return null; @@ -153,19 +159,4 @@ public class Category { return tier; } - /** - * @since 4.0 - */ - class CategorySorter implements Comparator { - - /** - * @since 4.0 - */ - @Override - public int compare(Category c1, Category c2) { - return Integer.compare(c1.getTier(), c2.getTier()); - } - - } - } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/Charge.java b/src/me/mrCookieSlime/Slimefun/Objects/Charge.java deleted file mode 100644 index b7287aa5d..000000000 --- a/src/me/mrCookieSlime/Slimefun/Objects/Charge.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.mrCookieSlime.Slimefun.Objects; - -public class Charge { - - private double charge; - private double capacity; - - public Charge(double charge, double capacity) { - this.charge = charge; - this.capacity = capacity; - } - - public double getStoredEnergy() { - return charge; - } - - public double getCapacity() { - return capacity; - } - -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java b/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java index 2e2703c52..d0560bd2c 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java @@ -20,7 +20,7 @@ import org.bukkit.inventory.ItemStack; * @since 4.0 * * @see Category - * @see SeasonCategory + * @see SeasonalCategory */ public class LockedCategory extends Category { @@ -116,11 +116,7 @@ public class LockedCategory extends Category { for (Category category: parents) { for (SlimefunItem item: category.getItems()) { - if (Slimefun.isEnabled(p, item.getItem(), false) && Slimefun.hasPermission(p, item, false)) { - if (item.getResearch() != null) { - if (!profile.hasUnlocked(item.getResearch())) return false; - } - } + if (Slimefun.isEnabled(p, item.getItem(), false) && Slimefun.hasPermission(p, item, false) && item.getResearch() != null && !profile.hasUnlocked(item.getResearch())) return false; } } return true; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java b/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java index a4854f297..d1630e1a4 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java @@ -1,20 +1,18 @@ package me.mrCookieSlime.Slimefun.Objects; -import java.util.ArrayList; import java.util.List; -import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; - import org.bukkit.Material; +import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; + public class MultiBlock { - public static List list = new ArrayList<>(); - - Material[] blocks; - Material trigger; + private Material[] blocks; + private Material trigger; public MultiBlock(Material[] build, Material trigger) { this.blocks = build; @@ -30,48 +28,46 @@ public class MultiBlock { } public void register() { - list.add(this); + SlimefunPlugin.getUtilities().allMultiblocks.add(this); } public static List list() { - return list; + return SlimefunPlugin.getUtilities().allMultiblocks; } public boolean isMultiBlock(SlimefunItem machine) { - if (machine == null) return false; - else if (!(machine instanceof SlimefunMachine)) return false; - else if (machine instanceof SlimefunMachine) { - MultiBlock mb = ((SlimefunMachine) machine).toMultiBlock(); - if (trigger == mb.getTriggerBlock()) { - for (int i = 0; i < mb.getBuild().length; i++) { - if (mb.getBuild()[i] != null) { - if (MaterialHelper.isLog( mb.getBuild()[i])) { - if (!MaterialHelper.isLog(blocks[i])) return false; - } - else if (mb.getBuild()[i] != blocks[i]) return false; - } - } - return true; - } - else return false; + if (machine instanceof SlimefunMachine) { + return isMultiBlock(((SlimefunMachine) machine).toMultiBlock()); } else return false; } public boolean isMultiBlock(MultiBlock mb) { if (mb == null) return false; - else if (trigger == mb.getTriggerBlock()) { + + if (trigger == mb.getTriggerBlock()) { for (int i = 0; i < mb.getBuild().length; i++) { - if (mb.getBuild()[i] != null) { - if (MaterialHelper.isLog(mb.getBuild()[i])) { - if (!MaterialHelper.isLog(blocks[i])) return false; - } - else if (mb.getBuild()[i] != blocks[i]) return false; - } + if (!compareBlocks(blocks[i], mb.getBuild()[i])) return false; } + return true; } - else return false; + + return false; + } + + private boolean compareBlocks(Material a, Material b) { + if (b != null) { + if (MaterialHelper.isLog(b)) { + return MaterialHelper.isLog(a); + } + + if (b != a) { + return false; + } + } + + return true; } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/Research.java b/src/me/mrCookieSlime/Slimefun/Objects/Research.java index 3eb997786..ceae58924 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/Research.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/Research.java @@ -1,12 +1,12 @@ package me.mrCookieSlime.Slimefun.Objects; import java.util.ArrayList; -import java.util.HashSet; +import java.util.Collection; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -17,7 +17,7 @@ import org.bukkit.entity.Player; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable; import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Events.ResearchUnlockEvent; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Setup.Messages; @@ -40,36 +40,6 @@ public class Research { private static final int[] research_progress = {23, 44, 57, 92}; - /** - * Whether researching is enabled or not; - * @since 4.0 - */ - public static boolean enableResearching; - - /** - * Contains all the registered researches; - * @since 4.0 - * @see ResearchSetup - */ - public static List list = new LinkedList<>(); - - /** - * Contains all Research Titles - */ - public static List titles; - - /** - * Contains all the players (UUIDs) that are currently unlocking a research. - * @since 4.0 - */ - public static Set researching = new HashSet<>(); - - /** - * Whether researching in creative is free. - * @since 4.0 - */ - public static boolean creative_research = true; - private int id; private String name; private List items; @@ -103,7 +73,7 @@ public class Research { } public boolean isEnabled() { - return enableResearching && enabled; + return SlimefunPlugin.getSettings().researchesEnabled && enabled; } /** @@ -138,7 +108,7 @@ public class Research { */ @Deprecated public int getLevel() { - return cost; + return getCost(); } /** @@ -151,7 +121,7 @@ public class Research { */ @Deprecated public void setLevel(int level) { - this.cost = level; + setCost(level); } /** @@ -237,7 +207,7 @@ public class Research { */ public boolean canUnlock(Player p) { if (!isEnabled()) return true; - return (p.getGameMode() == GameMode.CREATIVE && creative_research) || p.getLevel() >= this.cost; + return (p.getGameMode() == GameMode.CREATIVE && SlimefunPlugin.getSettings().researchesFreeInCreative) || p.getLevel() >= this.cost; } /** @@ -266,37 +236,33 @@ public class Research { ResearchUnlockEvent event = new ResearchUnlockEvent(p, this); Bukkit.getPluginManager().callEvent(event); + Runnable runnable = () -> { + PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true); + Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName())); + + if (SlimefunPlugin.getCfg().getBoolean("options.research-unlock-fireworks")) { + FireworkShow.launchRandom(p, 1); + } + }; + if (!event.isCancelled()) { - if (instant) { - PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true); - - Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName())); - if (SlimefunStartup.getCfg().getBoolean("options.research-give-fireworks")) { - FireworkShow.launchRandom(p, 1); - } - } - else if (!researching.contains(p.getUniqueId())){ - researching.add(p.getUniqueId()); + if (instant) runnable.run(); + else if (!SlimefunPlugin.getUtilities().researching.contains(p.getUniqueId())){ + SlimefunPlugin.getUtilities().researching.add(p.getUniqueId()); Messages.local.sendTranslation(p, "messages.research.start", true, new Variable("%research%", getName())); for (int i = 1; i < research_progress.length + 1; i++) { int j = i; - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { p.playSound(p.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 1F); Messages.local.sendTranslation(p, "messages.research.progress", true, new Variable("%research%", getName()), new Variable("%progress%", research_progress[j - 1] + "%")); }, i * 20L); } - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true); - Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName())); - - if (SlimefunStartup.getCfg().getBoolean("options.research-unlock-fireworks")) { - FireworkShow.launchRandom(p, 1); - } - - researching.remove(p.getUniqueId()); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + runnable.run(); + SlimefunPlugin.getUtilities().researching.remove(p.getUniqueId()); }, (research_progress.length + 1) * 20L); } } @@ -309,9 +275,9 @@ public class Research { * @since 4.0 */ public void register() { - SlimefunStartup.getResearchCfg().setDefaultValue("enable-researching", true); + SlimefunPlugin.getResearchCfg().setDefaultValue("enable-researching", true); - if (SlimefunStartup.getResearchCfg().contains(this.getID() + ".enabled") && !SlimefunStartup.getResearchCfg().getBoolean(this.getID() + ".enabled")) { + if (SlimefunPlugin.getResearchCfg().contains(this.getID() + ".enabled") && !SlimefunPlugin.getResearchCfg().getBoolean(this.getID() + ".enabled")) { Iterator iterator = items.iterator(); while (iterator.hasNext()) { SlimefunItem item = iterator.next(); @@ -321,16 +287,18 @@ public class Research { return; } - SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".name", this.getName()); - SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".cost", this.getCost()); - SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".enabled", true); + SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".name", this.getName()); + SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".cost", this.getCost()); + SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".enabled", true); - this.name = SlimefunStartup.getResearchCfg().getString(this.getID() + ".name"); - this.cost = SlimefunStartup.getResearchCfg().getInt(this.getID() + ".cost"); - this.enabled = SlimefunStartup.getResearchCfg().getBoolean(this.getID() + ".enabled"); + this.name = SlimefunPlugin.getResearchCfg().getString(this.getID() + ".name"); + this.cost = SlimefunPlugin.getResearchCfg().getInt(this.getID() + ".cost"); + this.enabled = SlimefunPlugin.getResearchCfg().getBoolean(this.getID() + ".enabled"); - list.add(this); - if (SlimefunStartup.getCfg().getBoolean("options.print-out-loading")) System.out.println("[Slimefun] Loaded Research \"" + this.getName() + "\""); + SlimefunPlugin.getUtilities().allResearches.add(this); + if (SlimefunPlugin.getSettings().printOutLoading) { + Slimefun.getLogger().log(Level.INFO, "Loaded Research \"" + this.getName() + "\""); + } } /** @@ -342,7 +310,7 @@ public class Research { * @see ResearchSetup */ public static List list() { - return list; + return SlimefunPlugin.getUtilities().allResearches; } /** @@ -354,7 +322,7 @@ public class Research { * @since 4.0 */ public static boolean isResearching(Player p) { - return researching.contains(p.getUniqueId()); + return SlimefunPlugin.getUtilities().researching.contains(p.getUniqueId()); } /** @@ -370,9 +338,9 @@ public class Research { public static void sendStats(CommandSender sender, Player p) { PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); Set researched = profile.getResearches(); - int levels = researched.stream().mapToInt(r -> r.getCost()).sum(); + int levels = researched.stream().mapToInt(Research::getCost).sum(); - String progress = String.valueOf(Math.round(((researched.size() * 100.0f) / list().size()) * 100.0f) / 100.0f); + String progress = String.valueOf(Math.round(((researched.size() * 100.0F) / list().size()) * 100.0F) / 100.0F); if (Float.parseFloat(progress) < 16.0F) progress = "&4" + progress + " &r% "; else if (Float.parseFloat(progress) < 32.0F) progress = "&c" + progress + " &r% "; else if (Float.parseFloat(progress) < 48.0F) progress = "&6" + progress + " &r% "; @@ -399,10 +367,8 @@ public class Research { * @see #sendStats(CommandSender, Player) */ @Deprecated - public static String getTitle(Player p, Set researched) { - int index = Math.round(Float.valueOf(String.valueOf(Math.round(((researched.size() * 100.0f) / list().size()) * 100.0f) / 100.0f)) / 100.0F) * titles.size(); - if (index > 0) index--; - return titles.get(index); + public static String getTitle(Player p, Collection researched) { + return PlayerProfile.fromUUID(p.getUniqueId()).getTitle(); } /** @@ -414,7 +380,7 @@ public class Research { * @since 4.0 */ public static Research getByID(int id) { - for (Research research: list) { + for (Research research: list()) { if (research.getID() == id) return research; } return null; @@ -452,4 +418,9 @@ public class Research { public static List getResearches(String uuid) { return getResearches(UUID.fromString(uuid)); } + + @Override + public String toString() { + return "Research {" + id + "," + name + "}"; + } } \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SeasonCategory.java b/src/me/mrCookieSlime/Slimefun/Objects/SeasonalCategory.java similarity index 92% rename from src/me/mrCookieSlime/Slimefun/Objects/SeasonCategory.java rename to src/me/mrCookieSlime/Slimefun/Objects/SeasonalCategory.java index 2515ce4b9..75d5dbcf2 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SeasonCategory.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SeasonalCategory.java @@ -16,7 +16,7 @@ import org.bukkit.inventory.ItemStack; * @see Category * @see LockedCategory */ -public class SeasonCategory extends Category { +public class SeasonalCategory extends Category { private int month = -1; @@ -32,7 +32,7 @@ public class SeasonCategory extends Category { * * @since 4.0 */ - public SeasonCategory(int month, int tier, ItemStack item) { + public SeasonalCategory(int month, int tier, ItemStack item) { super(item, tier); this.month = month - 1; } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunBlockHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunBlockHandler.java index d484e38c1..23c03d170 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunBlockHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunBlockHandler.java @@ -6,9 +6,30 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import org.bukkit.block.Block; import org.bukkit.entity.Player; +@FunctionalInterface public interface SlimefunBlockHandler { - void onPlace(Player p, Block b, SlimefunItem item); - + /** + * This method gets called when the Block is placed. + * Use this method to initialize block data. + * + * @param p The Player who placed it + * @param b The Block that was placed + * @param item The Item that will be stored inside the Block + */ + default void onPlace(Player p, Block b, SlimefunItem item) { + // This method can optionally be implemented by classes implementing it. + } + + /** + * This method gets called when the Block is broken + * p is nullable if the Block is exploded + * + * @param p The Player who broke the Block + * @param b The Block that was broken + * @param item The SlimefunItem that was stored in that block + * @param reason The reason for the Block breaking + * @return Whether the Event should be cancelled + */ boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java index 84cbafa3b..994e15738 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack; public class ChargableItem extends SlimefunItem { - String chargeType; + private String chargeType; public ChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) { super(category, item, id, recipeType, recipe); @@ -19,6 +19,8 @@ public class ChargableItem extends SlimefunItem { this.chargeType = chargeType; } - public String getChargeType() { return this.chargeType; } + public String getChargeType() { + return chargeType; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargedItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargedItem.java index 255851dd3..3ddd3a129 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargedItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargedItem.java @@ -1,13 +1,13 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; +import org.bukkit.inventory.ItemStack; + import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import org.bukkit.inventory.ItemStack; - public class ChargedItem extends SlimefunItem { - String chargeType; + private String chargeType; public ChargedItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) { super(category, item, id, recipeType, recipe); @@ -19,6 +19,8 @@ public class ChargedItem extends SlimefunItem { this.chargeType = chargeType; } - public String getChargeType() { return this.chargeType; } + public String getChargeType() { + return chargeType; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/DamagableChargableItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/DamagableChargableItem.java index 6fe190f1e..5281f4db8 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/DamagableChargableItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/DamagableChargableItem.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack; public class DamagableChargableItem extends SlimefunItem { - String chargeType; + private String chargeType; public DamagableChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) { super(category, item, id, recipeType, recipe); @@ -19,6 +19,8 @@ public class DamagableChargableItem extends SlimefunItem { this.chargeType = chargeType; } - public String getChargeType() { return this.chargeType; } + public String getChargeType() { + return this.chargeType; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnderTalisman.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnderTalisman.java index 5e6add098..f6b515413 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnderTalisman.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnderTalisman.java @@ -1,36 +1,42 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; -import me.mrCookieSlime.Slimefun.Lists.Categories; -import me.mrCookieSlime.Slimefun.Lists.RecipeType; -import me.mrCookieSlime.Slimefun.api.Slimefun; - import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; + +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.api.Slimefun; /** * @since 4.0 */ -public class EnderTalisman extends SlimefunItem { - - private String suffix; - private boolean consumable; - private boolean cancel; - private PotionEffect[] effects; - private int chance; +public class EnderTalisman extends Talisman { public EnderTalisman(Talisman parent) { - super(Categories.TALISMANS_2, parent.upgrade(), "ENDER_" + parent.getID(), RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItem.getItem("ENDER_LUMP_3"), null, SlimefunItem.getItem("ENDER_LUMP_3"), null, parent.getItem(), null, SlimefunItem.getItem("ENDER_LUMP_3"), null, SlimefunItem.getItem("ENDER_LUMP_3")}, parent.upgrade()); - this.consumable = parent.isConsumable(); - this.cancel = parent.isEventCancelled(); - this.suffix = parent.getSuffix(); - this.effects = parent.getEffects(); - this.chance = parent.getChance(); + super(Categories.TALISMANS_2, parent.upgrade(), "ENDER_" + parent.getID(), new ItemStack[] {SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3, null, parent.getItem(), null, SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3}); + + consumable = parent.isConsumable(); + cancel = parent.isEventCancelled(); + suffix = parent.getSuffix(); + effects = parent.getEffects(); + chance = parent.getChance(); + Slimefun.addHint("ENDER_" + parent.getID(), "&eEnder Talismans have the advantage", "&eof still working while they", "&eare in your Ender Chest"); } - - public String getSuffix() { return this.suffix; } - public boolean isConsumable() { return this.consumable; } - public boolean isEventCancelled() { return this.cancel; } - public PotionEffect[] getEffects() { return this.effects; } - public int getChance() { return this.chance; } + + @Override + public ItemStack upgrade() { + throw new UnsupportedOperationException(); + } + + @Override + public void install() { + // Let's override that, otherwise we would be creating Ender Talismans + // for every Ender Talisman + } + + @Override + public void create() { + // Let's override that, otherwise we would be creating Ender Talismans + // for every Ender Talisman + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnhancedFurnace.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnhancedFurnace.java index 324db7244..b01620841 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnhancedFurnace.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/EnhancedFurnace.java @@ -1,18 +1,22 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Lists.Categories; -import me.mrCookieSlime.Slimefun.Lists.RecipeType; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; +import java.util.Random; import org.bukkit.block.Block; import org.bukkit.block.Furnace; import org.bukkit.inventory.ItemStack; -public class EnhancedFurnace extends SlimefunItem { +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + +public class EnhancedFurnace extends SimpleSlimefunItem { - int speed, efficiency, fortune; + private int speed; + private int efficiency; + private int fortune; public EnhancedFurnace(int speed, int efficiency, int fortune, ItemStack item, String id, ItemStack[] recipe) { super(Categories.MACHINES_1, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe); @@ -20,33 +24,6 @@ public class EnhancedFurnace extends SlimefunItem { this.speed = speed - 1; this.efficiency = efficiency - 1; this.fortune = fortune - 1; - - addItemHandler(new BlockTicker() { - @Override - public void tick(Block b, SlimefunItem item, Config data) { - if (b.getState() instanceof Furnace) { - if (((Furnace) b.getState()).getCookTime() > 0) { - Furnace furnace = (Furnace) b.getState(); - - int newCookTime = furnace.getCookTime() + getSpeed() * 10; - - if (newCookTime > 200) furnace.setCookTime((short) 188); - else furnace.setCookTime((short) newCookTime); - - furnace.update(true, false); - } - } - } - - @Override - public void uniqueTick() { - } - - @Override - public boolean isSynchronized() { - return true; - } - }); } public int getSpeed() { @@ -59,9 +36,38 @@ public class EnhancedFurnace extends SlimefunItem { public int getOutput() { int fortune = this.fortune; - fortune = SlimefunStartup.randomize(fortune + 2) - 1; + fortune = new Random().nextInt(fortune + 2) - 1; if (fortune <= 0) fortune = 0; fortune++; return fortune; } + + @Override + public BlockTicker getItemHandler() { + return new BlockTicker() { + + @Override + public void tick(Block b, SlimefunItem item, Config data) { + if (!(b.getState() instanceof Furnace)) { + // The Furnace has been destroyed, we can clear the block data + BlockStorage.clearBlockInfo(b); + } + else if (((Furnace) b.getState()).getCookTime() > 0) { + Furnace furnace = (Furnace) b.getState(); + + int newCookTime = furnace.getCookTime() + getSpeed() * 10; + + if (newCookTime > 200) furnace.setCookTime((short) 188); + else furnace.setCookTime((short) newCookTime); + + furnace.update(true, false); + } + } + + @Override + public boolean isSynchronized() { + return true; + } + }; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedBlock.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedBlock.java index 8a75fee13..c20512b9a 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedBlock.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedBlock.java @@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; public class ExcludedBlock extends SlimefunItem implements NotPlaceable { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedGadget.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedGadget.java index 6bd151202..1a35ecc55 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedGadget.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedGadget.java @@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; public class ExcludedGadget extends SlimefunGadget implements NotPlaceable { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedSoulboundTool.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedSoulboundTool.java index 8be575860..120ab916f 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedSoulboundTool.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedSoulboundTool.java @@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; public class ExcludedSoulboundTool extends SoulboundItem implements NotPlaceable { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedTool.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedTool.java index 6f2e49c7d..2ac5f15cb 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedTool.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ExcludedTool.java @@ -4,8 +4,9 @@ import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; +@Deprecated public class ExcludedTool extends SlimefunItem implements NotPlaceable { public ExcludedTool(Category category, ItemStack item, String id,RecipeType recipeType, ItemStack[] recipe) { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Interfaces/NotPlaceable.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Interfaces/NotPlaceable.java deleted file mode 100644 index 41c515d34..000000000 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Interfaces/NotPlaceable.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces; - -public interface NotPlaceable { - -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/JetBoots.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/JetBoots.java index 84a47d1d9..f512be3e7 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/JetBoots.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/JetBoots.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack; public class JetBoots extends DamagableChargableItem { - double speed; + private double speed; public JetBoots(ItemStack item, String id, ItemStack[] recipe, double speed) { super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jet Boots"); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Jetpack.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Jetpack.java index b7093a53e..a0c2b1cfc 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Jetpack.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Jetpack.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack; public class Jetpack extends DamagableChargableItem { - double thrust; + private double thrust; public Jetpack(ItemStack item, String id, ItemStack[] recipe, double thrust) { super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jetpack"); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/MultiTool.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/MultiTool.java index 133847d58..d26bb4271 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/MultiTool.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/MultiTool.java @@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack; public class MultiTool extends DamagableChargableItem { - List modes; + private List modes; public MultiTool(ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { super(Categories.TECH, item, id, recipeType, recipe, "Multi Tool", keys, values); @@ -19,11 +19,9 @@ public class MultiTool extends DamagableChargableItem { @Override public void create() { - List list = new ArrayList(); + List list = new ArrayList<>(); for (int i = 0; i < 50; i++) { - if (Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled") != null) { - if ((Boolean) Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled")) list.add(i); - } + if (Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled") != null && (Boolean) Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled")) list.add(i); } this.modes = list; } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SimpleSlimefunItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SimpleSlimefunItem.java new file mode 100644 index 000000000..5e8f4c29b --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SimpleSlimefunItem.java @@ -0,0 +1,30 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; + +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; + +public abstract class SimpleSlimefunItem extends SlimefunItem { + + public SimpleSlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + public SimpleSlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { + super(category, item, id, recipeType, recipe, recipeOutput); + } + + public SimpleSlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public void preRegister() { + addItemHandler(getItemHandler()); + } + + public abstract T getItemHandler(); + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunArmorPiece.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunArmorPiece.java index 5ed225ad5..92924744f 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunArmorPiece.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunArmorPiece.java @@ -8,7 +8,7 @@ import org.bukkit.potion.PotionEffect; public class SlimefunArmorPiece extends SlimefunItem { - PotionEffect[] effects; + private PotionEffect[] effects; public SlimefunArmorPiece(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, PotionEffect[] effects) { super(category, item, id, recipeType, recipe); @@ -20,6 +20,8 @@ public class SlimefunArmorPiece extends SlimefunItem { this.effects = effects; } - public PotionEffect[] getEffects() { return this.effects; } + public PotionEffect[] getEffects() { + return this.effects; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java index 787845be8..17502c1a7 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java @@ -7,12 +7,16 @@ import me.mrCookieSlime.Slimefun.Objects.Category; public class SlimefunBackpack extends SlimefunItem { - public int size; + private int size; public SlimefunBackpack(int size, Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { super(category, item, id, recipeType, recipe); this.size = size; } + + public int getSize() { + return size; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunGadget.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunGadget.java index 678ead229..26da5ca11 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunGadget.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunGadget.java @@ -3,33 +3,37 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; import java.util.ArrayList; import java.util.List; -import me.mrCookieSlime.Slimefun.Lists.RecipeType; -import me.mrCookieSlime.Slimefun.Objects.Category; - import org.bukkit.inventory.ItemStack; -public class SlimefunGadget extends SlimefunItem { +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; + +public class SlimefunGadget extends SlimefunItem implements RecipeDisplayItem { - List recipes; - List display_recipes; + private List recipes; + private List displayRecipes; public SlimefunGadget(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes) { super(category, item, id, recipeType, recipe); - this.recipes = new ArrayList(); - this.display_recipes = new ArrayList(); + + this.recipes = new ArrayList<>(); + this.displayRecipes = new ArrayList<>(); + for (ItemStack i: machineRecipes) { this.recipes.add(new ItemStack[] {i}); - this.display_recipes.add(i); + this.displayRecipes.add(i); } } public SlimefunGadget(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes, String[] keys, Object[] values) { super(category, item, id, recipeType, recipe, keys, values); - this.recipes = new ArrayList(); - this.display_recipes = new ArrayList(); + this.recipes = new ArrayList<>(); + this.displayRecipes = new ArrayList<>(); + for (ItemStack i: machineRecipes) { this.recipes.add(new ItemStack[] {i}); - this.display_recipes.add(i); + this.displayRecipes.add(i); } } @@ -37,14 +41,15 @@ public class SlimefunGadget extends SlimefunItem { return this.recipes; } + @Override public List getDisplayRecipes() { - return this.display_recipes; + return this.displayRecipes; } public void addRecipe(ItemStack input, ItemStack output) { this.recipes.add(new ItemStack[] {input}); this.recipes.add(new ItemStack[] {output}); - this.display_recipes.add(input); - this.display_recipes.add(output); + this.displayRecipes.add(input); + this.displayRecipes.add(output); } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index 873e25f21..f41d29cc8 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -2,11 +2,10 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -15,37 +14,26 @@ import org.bukkit.block.Block; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.AncientAltar.AltarRecipe; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.ancient_altar.AltarRecipe; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.EnergyNet; -import me.mrCookieSlime.Slimefun.api.energy.EnergyNet.NetworkComponent; +import me.mrCookieSlime.Slimefun.api.energy.EnergyNetComponent; import me.mrCookieSlime.Slimefun.api.energy.EnergyTicker; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; public class SlimefunItem { - - public static List items = new ArrayList<>(); - - public static Map map_id = new HashMap<>(); - public static List radioactive = new ArrayList<>(); - public static int vanilla = 0; - public static Set tickers = new HashSet<>(); - - public static List all = new ArrayList<>(); - public static Map> handlers = new HashMap<>(); - public static Map blockhandler = new HashMap<>(); - + private String id; private String hash; private State state; @@ -53,27 +41,29 @@ public class SlimefunItem { private Category category; private ItemStack[] recipe; private RecipeType recipeType; - private ItemStack recipeOutput = null; + protected ItemStack recipeOutput = null; private Research research; private int month = -1; - private boolean enchantable = true, disenchantable = true; + private boolean enchantable = true; + private boolean disenchantable = true; private boolean hidden = false; private boolean replacing = false; private boolean addon = false; private String permission = ""; - private Set itemhandlers = new HashSet(); + private Set itemhandlers = new HashSet<>(); private boolean ticking = false; private BlockTicker blockTicker; private EnergyTicker energyTicker; private String[] keys = null; private Object[] values = null; + private String wiki = null; /** * Defines whether a SlimefunItem is enabled, disabled or fall-back to its vanilla behavior. * * @since 4.1.10 */ - public enum State { + public static enum State { /** * This SlimefunItem is enabled. */ @@ -155,7 +145,10 @@ public class SlimefunItem { * @since 4.1.11, rename of {@link #getName()}. */ public String getID() { return id; } + + @Deprecated public String getHash() { return hash; } + public State getState() { return state; } public ItemStack getItem() { return item; } public Category getCategory() { return category; } @@ -205,72 +198,80 @@ public class SlimefunItem { public void register() { register(false); } - + public void register(boolean slimefun) { this.addon = !slimefun; try { - if (map_id.containsKey(this.id)) throw new IllegalArgumentException("ID \"" + this.id + "\" already exists"); + preRegister(); + + if (SlimefunPlugin.getUtilities().itemIDs.containsKey(this.id)) { + throw new IllegalArgumentException("ID \"" + this.id + "\" already exists"); + } if (this.recipe.length < 9) this.recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null}; - all.add(this); + SlimefunPlugin.getUtilities().allItems.add(this); - SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".enabled", true); - SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".can-be-used-in-workbenches", this.replacing); - SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".hide-in-guide", this.hidden); - SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".allow-enchanting", this.enchantable); - SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".allow-disenchanting", this.disenchantable); - SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".required-permission", this.permission); + SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".enabled", true); + SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".can-be-used-in-workbenches", this.replacing); + SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".hide-in-guide", this.hidden); + SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".allow-enchanting", this.enchantable); + SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".allow-disenchanting", this.disenchantable); + SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".required-permission", this.permission); if (this.keys != null && this.values != null) { for (int i = 0; i < this.keys.length; i++) { - SlimefunStartup.getItemCfg().setDefaultValue(this.id + "." + this.keys[i], this.values[i]); + SlimefunPlugin.getItemCfg().setDefaultValue(this.id + "." + this.keys[i], this.values[i]); } } for (World world: Bukkit.getWorlds()) { - SlimefunStartup.getWhitelist().setDefaultValue(world.getName() + ".enabled", true); - SlimefunStartup.getWhitelist().setDefaultValue(world.getName() + ".enabled-items." + this.id, true); + SlimefunPlugin.getWhitelist().setDefaultValue(world.getName() + ".enabled", true); + SlimefunPlugin.getWhitelist().setDefaultValue(world.getName() + ".enabled-items." + this.id, true); } - if (this.ticking && !SlimefunStartup.getCfg().getBoolean("URID.enable-tickers")) { + if (this.ticking && !SlimefunPlugin.getCfg().getBoolean("URID.enable-tickers")) { this.state = State.DISABLED; return; } - if (SlimefunStartup.getItemCfg().getBoolean(id + ".enabled")) { + if (SlimefunPlugin.getItemCfg().getBoolean(id + ".enabled")) { if (!Category.list().contains(category)) category.register(); this.state = State.ENABLED; - this.replacing = SlimefunStartup.getItemCfg().getBoolean(this.id + ".can-be-used-in-workbenches"); - this.hidden = SlimefunStartup.getItemCfg().getBoolean(this.id + ".hide-in-guide"); - this.enchantable = SlimefunStartup.getItemCfg().getBoolean(this.id + ".allow-enchanting"); - this.disenchantable = SlimefunStartup.getItemCfg().getBoolean(this.id + ".allow-disenchanting"); - this.permission = SlimefunStartup.getItemCfg().getString(this.id + ".required-permission"); - items.add(this); - if (slimefun) vanilla++; - map_id.put(this.id, this); - this.create(); + this.replacing = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".can-be-used-in-workbenches"); + this.hidden = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".hide-in-guide"); + this.enchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-enchanting"); + this.disenchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-disenchanting"); + this.permission = SlimefunPlugin.getItemCfg().getString(this.id + ".required-permission"); + SlimefunPlugin.getUtilities().enabledItems.add(this); + if (slimefun) SlimefunPlugin.getUtilities().vanillaItems++; + SlimefunPlugin.getUtilities().itemIDs.put(this.id, this); + + create(); for (ItemHandler handler: itemhandlers) { Set handlerset = getHandlers(handler.toCodename()); handlerset.add(handler); - handlers.put(handler.toCodename(), handlerset); + SlimefunPlugin.getUtilities().itemHandlers.put(handler.toCodename(), handlerset); } - if (SlimefunStartup.getCfg().getBoolean("options.print-out-loading")) System.out.println("[Slimefun] Loaded Item \"" + this.id + "\""); + if (SlimefunPlugin.getSettings().printOutLoading) { + Slimefun.getLogger().log(Level.INFO, "Loaded Item \"{0}\"", this.id); + } } else { if (this instanceof VanillaItem) this.state = State.VANILLA; else this.state = State.DISABLED; } + + postRegister(); } catch(Exception x) { - System.err.println("[Slimefun] Item Registration failed: " + this.id); - x.printStackTrace(); + Slimefun.getLogger().log(Level.WARNING, "Registering the Item '" + id + "' for Slimefun " + Slimefun.getVersion() + " has failed", x); } } public static List list() { - return items; + return SlimefunPlugin.getUtilities().enabledItems; } public void bindToResearch(Research r) { @@ -278,6 +279,7 @@ public class SlimefunItem { this.research = r; } + @Deprecated public void setHash(String hash) { this.hash = hash; } @@ -308,24 +310,26 @@ public class SlimefunItem { */ @Deprecated public static SlimefunItem getByName(String name) { - return map_id.get(name); + return getByID(name); } /** * @since 4.1.11, rename of {@link #getByName(String)}. */ public static SlimefunItem getByID(String id) { - return map_id.get(id); + return SlimefunPlugin.getUtilities().itemIDs.get(id); } public static SlimefunItem getByItem(ItemStack item) { if (item == null) return null; - for (SlimefunItem sfi: items) { - if (sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; - else if (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; - else if (sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; - else if (sfi instanceof SlimefunBackpack && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; - else if (SlimefunManager.isItemSimiliar(item, sfi.getItem(), true)) return sfi; + for (SlimefunItem sfi: SlimefunPlugin.getUtilities().enabledItems) { + if ((sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) || + (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) || + (sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) || + (sfi instanceof SlimefunBackpack && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) || + SlimefunManager.isItemSimiliar(item, sfi.getItem(), true)) + + return sfi; } if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BROKEN_SPAWNER, false)) return getByID("BROKEN_SPAWNER"); if (SlimefunManager.isItemSimiliar(item, SlimefunItems.REPAIRED_SPAWNER, false)) return getByID("REINFORCED_SPAWNER"); @@ -347,13 +351,14 @@ public class SlimefunItem { if (recipeOutput != null) output = recipeOutput.clone(); if (recipeType.toItem().isSimilar(RecipeType.MOB_DROP.toItem())) { + String mob = ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(" ", "_"); try { - EntityType entity = EntityType.valueOf(ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(" ", "_")); - List dropping = new ArrayList(); - if (SlimefunManager.drops.containsKey(entity)) dropping = SlimefunManager.drops.get(entity); + EntityType entity = EntityType.valueOf(mob); + List dropping = SlimefunPlugin.getUtilities().drops.getOrDefault(entity, new ArrayList<>()); dropping.add(output); - SlimefunManager.drops.put(entity, dropping); + SlimefunPlugin.getUtilities().drops.put(entity, dropping); } catch(Exception x) { + Slimefun.getLogger().log(Level.WARNING, "An Exception occured when setting a Drop for the Mob: " + mob + " (" + x.getClass().getSimpleName() + ")"); } } else if (recipeType.toItem().isSimilar(RecipeType.ANCIENT_ALTAR.toItem())) { @@ -362,14 +367,15 @@ public class SlimefunItem { else if (recipeType.getMachine() != null && getByID(recipeType.getMachine().getID()) instanceof SlimefunMachine) { ((SlimefunMachine) getByID(recipeType.getMachine().getID())).addRecipe(recipe, output); } + install(); } catch(Exception x) { - System.err.println("[Slimefun] Item Initialization failed: " + id); + Slimefun.getLogger().log(Level.WARNING, "Item Setup failed: " + id + " (" + x.getClass().getSimpleName() + ")"); } } public static State getState(ItemStack item) { - for (SlimefunItem i: all) { + for (SlimefunItem i: SlimefunPlugin.getUtilities().allItems) { if (i.isItem(item)) { return i.getState(); } @@ -378,7 +384,7 @@ public class SlimefunItem { } public static boolean isDisabled(ItemStack item) { - for (SlimefunItem i: all) { + for (SlimefunItem i: SlimefunPlugin.getUtilities().allItems) { if (i.isItem(item)) { return i.isDisabled(); } @@ -386,21 +392,39 @@ public class SlimefunItem { return false; } - public void install() {} - public void create() {} + @Deprecated + public void install() { + // Deprecated + } + + /** + * @deprecated Use {@link SlimefunItem#postRegister()} instead + */ + @Deprecated + public void create() { + // Deprecated + } + /** + * @deprecated Use {@link SlimefunItem#addItemHandler(ItemHandler...)} instead + */ + @Deprecated + public void addItemHandler(me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler... handler) { + addItemHandler((ItemHandler[]) handler); + } + public void addItemHandler(ItemHandler... handler) { this.itemhandlers.addAll(Arrays.asList(handler)); for (ItemHandler h: handler) { if (h instanceof BlockTicker) { this.ticking = true; - tickers.add(getID()); + SlimefunPlugin.getUtilities().tickers.add(getID()); this.blockTicker = (BlockTicker) h; } else if (h instanceof EnergyTicker) { this.energyTicker = (EnergyTicker) h; - EnergyNet.registerComponent(getID(), NetworkComponent.SOURCE); + EnergyNet.registerComponent(getID(), EnergyNetComponent.SOURCE); } } } @@ -415,23 +439,40 @@ public class SlimefunItem { register(false); } + /** + * @deprecated Use {@link SlimefunItem#register(boolean, ItemHandler...)} instead + */ + @Deprecated + public void register(boolean vanilla, me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler... handlers) { + addItemHandler(handlers); + register(vanilla); + } + + /** + * @deprecated Use {@link SlimefunItem#register(ItemHandler...)} instead + */ + @Deprecated + public void register(me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler... handlers) { + register((ItemHandler[]) handlers); + } + public void register(boolean vanilla, SlimefunBlockHandler handler) { - blockhandler.put(getID(), handler); + SlimefunPlugin.getUtilities().blockHandlers.put(getID(), handler); register(vanilla); } public void register(SlimefunBlockHandler handler) { - blockhandler.put(getID(), handler); + SlimefunPlugin.getUtilities().blockHandlers.put(getID(), handler); register(false); } public static Set getHandlers(String codeid) { - if (handlers.containsKey(codeid)) return handlers.get(codeid); + if (SlimefunPlugin.getUtilities().itemHandlers.containsKey(codeid)) return SlimefunPlugin.getUtilities().itemHandlers.get(codeid); else return new HashSet<>(); } public static void setRadioactive(ItemStack item) { - radioactive.add(item); + SlimefunPlugin.getUtilities().radioactiveItems.add(item); } public static ItemStack getItem(String id) { @@ -442,13 +483,14 @@ public class SlimefunItem { public static void patchExistingItem(String id, ItemStack stack) { SlimefunItem item = getByID(id); if (item != null) { - System.out.println("[Slimefun] WARNING - Patching existing Item - " + id); - System.out.println("[Slimefun] This might take a while"); + Slimefun.getLogger().log(Level.INFO, "Patching existing Item... {0}", id); + Slimefun.getLogger().log(Level.INFO, "This might take a while"); final ItemStack old = item.getItem(); item.setItem(stack); for (SlimefunItem sfi: list()) { ItemStack[] recipe = sfi.getRecipe(); + for (int i = 0; i < 9; i++) { if (SlimefunManager.isItemSimiliar(recipe[i], old, true)) recipe[i] = stack; } @@ -464,7 +506,7 @@ public class SlimefunItem { public void registerChargeableBlock(boolean slimefun, int capacity) { this.register(slimefun); ChargableBlock.registerChargableBlock(id, capacity, true); - EnergyNet.registerComponent(id, NetworkComponent.CONSUMER); + EnergyNet.registerComponent(id, EnergyNetComponent.CONSUMER); } public void registerUnrechargeableBlock(boolean slimefun, int capacity) { @@ -479,25 +521,35 @@ public class SlimefunItem { public void registerEnergyDistributor(boolean slimefun) { this.register(slimefun); - EnergyNet.registerComponent(id, NetworkComponent.DISTRIBUTOR); + EnergyNet.registerComponent(id, EnergyNetComponent.DISTRIBUTOR); } public void registerDistibutingCapacitor(boolean slimefun, final int capacity) { this.register(slimefun); - EnergyNet.registerComponent(id, NetworkComponent.DISTRIBUTOR); + EnergyNet.registerComponent(id, EnergyNetComponent.DISTRIBUTOR); ChargableBlock.registerCapacitor(id, capacity); } + public void preRegister() { + // Override this method to execute code before the Item has been registered + // Useful for calls to addItemHandler(...) + } + + public void postRegister() { + // Override this method to execute code after the Item has been registered + // Useful for calls to Slimefun.getItemValue(...) + } + protected void setItem(ItemStack stack) { this.item = stack; } public static boolean isTicking(String item) { - return tickers.contains(item); + return SlimefunPlugin.getUtilities().tickers.contains(item); } public static void registerBlockHandler(String id, SlimefunBlockHandler handler) { - blockhandler.put(id, handler); + SlimefunPlugin.getUtilities().blockHandlers.put(id, handler); } public void registerChargeableBlock(boolean vanilla, int capacity, ItemHandler... handlers) { @@ -510,6 +562,19 @@ public class SlimefunItem { } public void addWikipage(String page) { - Slimefun.addWikiPage(this.getID(), "https://github.com/TheBusyBiscuit/Slimefun4/wiki/" + page); + wiki = "https://github.com/TheBusyBiscuit/Slimefun4/wiki/" + page; + } + + public boolean hasWiki() { + return wiki != null; + } + + public String getWiki() { + return wiki; + } + + @Override + public String toString() { + return "SlimefunItem: " + id + " (" + state + ", vanilla=" + !addon + ")"; } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java index 62a388806..a986a7245 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java @@ -1,33 +1,24 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.MultiBlock; -import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Container; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -public class SlimefunMachine extends SlimefunItem { +public class SlimefunMachine extends SlimefunItem implements RecipeDisplayItem { private List recipes; - private List shownRecipes; private Material trigger; - //Adjacent blockfaces for iterative output chest checks - private static final BlockFace[] outputFaces = { - BlockFace.UP, - BlockFace.NORTH, - BlockFace.EAST, - BlockFace.SOUTH, - BlockFace.WEST - }; + + protected List shownRecipes; public SlimefunMachine(Category category, ItemStack item, String id, ItemStack[] recipe, ItemStack[] machineRecipes, Material trigger) { super(category, item, id, RecipeType.MULTIBLOCK, recipe); @@ -54,20 +45,17 @@ public class SlimefunMachine extends SlimefunItem { } public List getRecipes() { - return this.recipes; + return recipes; } + @Override public List getDisplayRecipes() { - return this.shownRecipes; - } - - public static BlockFace[] getOutputFaces() { - return outputFaces; + return shownRecipes; } public void addRecipe(ItemStack[] input, ItemStack output) { - this.recipes.add(input); - this.recipes.add(new ItemStack[] {output}); + recipes.add(input); + recipes.add(new ItemStack[] {output}); } @Override @@ -79,8 +67,9 @@ public class SlimefunMachine extends SlimefunItem { public void install() { for (ItemStack i: this.getDisplayRecipes()) { SlimefunItem item = SlimefunItem.getByItem(i); - if (item == null) this.recipes.add(new ItemStack[] {i}); - else if (!SlimefunItem.isDisabled(i)) this.recipes.add(new ItemStack[] {i}); + if (item == null || !SlimefunItem.isDisabled(i)) { + this.recipes.add(new ItemStack[] {i}); + } } } @@ -99,34 +88,4 @@ public class SlimefunMachine extends SlimefunItem { return this.recipes.iterator(); } - // Overloaded method for finding a potential output chest. Fallbacks to the old system of putting the adding back into the dispenser. - // Optional last argument Inventory placeCheckerInv is for multiblock machines that create a dummy inventory to check if there's a space for the adding, - // i.e. Enhanced crafting table - public static Inventory findValidOutputInv(ItemStack adding, Block dispBlock, Inventory dispInv) { - return findValidOutputInv(adding, dispBlock, dispInv, dispInv); - } - - public static Inventory findValidOutputInv(ItemStack product, Block dispBlock, Inventory dispInv, Inventory placeCheckerInv) { - Inventory outputInv = null; - for (BlockFace face : outputFaces) { - Block potentialOutput = dispBlock.getRelative(face); - String id = BlockStorage.checkID(potentialOutput); - if (id != null && id.equals("OUTPUT_CHEST")) { - // Found the output chest! Now, let's check if we can fit the product in it. - Inventory inv = ((Container) potentialOutput.getState()).getInventory(); - if (InvUtils.fits(inv, product)) { - // It fits! Let's set the inventory to that now. - outputInv = inv; - break; - } - } - } - // This if-clause will trigger if no suitable output chest was found. It's functionally the same as the old fit check for the dispenser, only refactored. - if (outputInv == null && InvUtils.fits(placeCheckerInv, product)) outputInv = dispInv; - - return outputInv; - - - } - } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SoulboundItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SoulboundItem.java index b850bed87..1dd8bbff6 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SoulboundItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SoulboundItem.java @@ -5,11 +5,18 @@ import me.mrCookieSlime.Slimefun.Objects.Category; import org.bukkit.inventory.ItemStack; +/** + * Represents an Item that will not drop on death. + * + * @author TheBusyBiscuit + * + */ public class SoulboundItem extends SlimefunItem { public SoulboundItem(Category category, ItemStack item, String id, ItemStack[] recipe) { super(category, item, id, RecipeType.MAGIC_WORKBENCH, recipe); } + public SoulboundItem(Category category, ItemStack item, String id, RecipeType type, ItemStack[] recipe) { super(category, item, id, type, recipe); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java index 78bbfd972..ef0d493e4 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java @@ -2,14 +2,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; import java.util.ArrayList; import java.util.List; - -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Lists.Categories; -import me.mrCookieSlime.Slimefun.Lists.RecipeType; -import me.mrCookieSlime.Slimefun.Objects.Research; -import me.mrCookieSlime.Slimefun.Setup.Messages; -import me.mrCookieSlime.Slimefun.api.Slimefun; +import java.util.Random; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -23,16 +16,24 @@ import org.bukkit.event.player.PlayerEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.Research; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.api.Slimefun; + /** * @since 4.0 */ public class Talisman extends SlimefunItem { - private String suffix; - private boolean consumable = true; - private boolean cancel = true; - private PotionEffect[] effects; - private int chance = 100; + protected String suffix; + protected boolean consumable = true; + protected boolean cancel = true; + protected PotionEffect[] effects; + protected int chance = 100; public Talisman(ItemStack item, String id, ItemStack[] recipe, boolean consumable, boolean cancelEvent, String messageSuffix, PotionEffect... effects) { super(Categories.TALISMANS_1, item, id, RecipeType.MAGIC_WORKBENCH, recipe, new CustomItem(item, consumable ? 4 : 1)); @@ -52,12 +53,16 @@ public class Talisman extends SlimefunItem { } public Talisman(ItemStack item, String id, ItemStack[] recipe, String messageSuffix, int chance, PotionEffect... effects) { - super(Categories.TALISMANS_1, item, id, RecipeType.MAGIC_WORKBENCH, recipe, item); + super(Categories.TALISMANS_1, item, id, RecipeType.MAGIC_WORKBENCH, recipe); this.suffix = messageSuffix; this.effects = effects; this.chance = chance; } + protected Talisman(Category category, ItemStack item, String id, ItemStack[] recipe) { + super(category, item, id, RecipeType.MAGIC_WORKBENCH, recipe); + } + public String getSuffix() { return this.suffix; } @@ -78,13 +83,45 @@ public class Talisman extends SlimefunItem { return this.chance; } + public ItemStack upgrade() { + List lore = new ArrayList<>(); + lore.add("&7&oEnder Infused"); + lore.add(""); + for (String line : getItem().getItemMeta().getLore()) { + lore.add(line); + } + return new CustomItem(getItem().getType(), "&5Ender " + ChatColor.stripColor(getItem().getItemMeta().getDisplayName()), lore.toArray(new String[lore.size()])); + } + + @Override + public void create() { + EnderTalisman talisman = new EnderTalisman(this); + talisman.register(!isAddonItem()); + } + + @Override + public void install() { + EnderTalisman talisman = (EnderTalisman) SlimefunItem.getByItem(upgrade()); + Research research = Research.getByID(112); + if (talisman != null) { + Slimefun.addOfficialWikiPage(talisman.getID(), "Talismans"); + if (research != null) talisman.bindToResearch(research); + } + + Slimefun.addOfficialWikiPage(getID(), "Talismans"); + } + + private static boolean isTalismanMessage(Talisman talisman){ + return !("").equalsIgnoreCase(talisman.getSuffix()); + } + public static boolean checkFor(Event e, SlimefunItem item) { if (!(item instanceof Talisman)) { return false; } Talisman talisman = (Talisman) item; - if (!SlimefunStartup.chance(100, talisman.getChance())) { + if (new Random().nextInt(100) < talisman.getChance()) { return false; } @@ -108,39 +145,6 @@ public class Talisman extends SlimefunItem { else return false; } else return false; - - } - - public ItemStack upgrade() { - List lore = new ArrayList<>(); - lore.add("&7&oEnder Infused"); - lore.add(""); - for (String line : getItem().getItemMeta().getLore()) { - lore.add(line); - } - return new CustomItem(getItem().getType(), "&5Ender " + ChatColor.stripColor(getItem().getItemMeta().getDisplayName()), lore.toArray(new String[lore.size()])); - } - - @Override - public void create() { - EnderTalisman talisman = new EnderTalisman(this); - talisman.register(true); - } - - @Override - public void install() { - EnderTalisman talisman = (EnderTalisman) SlimefunItem.getByItem(upgrade()); - Research research = Research.getByID(112); - if (talisman != null) { - Slimefun.addOfficialWikiPage(talisman.getID(), "Talismans"); - if (research != null) talisman.bindToResearch(research); - } - - Slimefun.addOfficialWikiPage(getID(), "Talismans"); - } - - private static boolean isTalismanMessage(Talisman talisman){ - return !("").equalsIgnoreCase(talisman.getSuffix()); } private static void executeTalismanAttributes(Event e, Player p, Talisman talisman){ diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java index 6fc41b9cd..083e24d10 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AContainer.java @@ -5,17 +5,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -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.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; -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.ClickAction; @@ -23,23 +18,21 @@ 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.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.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.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 abstract class AContainer extends SlimefunItem { +public abstract class AContainer extends SlimefunItem implements InventoryBlock { - public static Map processing = new HashMap(); - public static Map progress = new HashMap(); + public static Map processing = new HashMap<>(); + public static Map progress = new HashMap<>(); - protected List recipes = new ArrayList(); + 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}; @@ -48,140 +41,53 @@ public abstract class AContainer extends SlimefunItem { public AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { super(category, item, id, recipeType, recipe); - new BlockMenuPreset(id, 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(); - } - }; + createPreset(this, getInventoryTitle(), this::constructMenu); - registerBlockHandler(id, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @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); - } - } - for (int slot : getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } + registerBlockHandler(id, (p, b, tool, 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); + } + } + + 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; } + + progress.remove(b); + processing.remove(b); + return true; }); this.registerDefaultRecipes(); } public AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { - super(category, item, id, recipeType, recipe, recipeOutput); - - new BlockMenuPreset(id, 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(); - } - }; - - registerBlockHandler(id, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - - } - - @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); - } - } - for (int slot: getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } - } - } - processing.remove(b); - progress.remove(b); - return true; - } - }); - - this.registerDefaultRecipes(); + this(category, item, id, recipeType, recipe); + this.recipeOutput = recipeOutput; } 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_in) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_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(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } - preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + 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) { + preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); + } + + preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); for (int i : getOutputSlots()) { preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() { @@ -201,15 +107,31 @@ public abstract class AContainer extends SlimefunItem { public abstract String getInventoryTitle(); public abstract ItemStack getProgressBar(); - public abstract void registerDefaultRecipes(); public abstract int getEnergyConsumption(); public abstract int getSpeed(); public abstract String getMachineIdentifier(); + public void registerDefaultRecipes() { + // Override this method to register your machine recipes + } + + public List getDisplayRecipes() { + List displayRecipes = new ArrayList<>(recipes.size() * 2); + + for (MachineRecipe recipe: recipes) { + displayRecipes.add(recipe.getInput()[0]); + displayRecipes.add(recipe.getOutput()[0]); + } + + return displayRecipes; + } + + @Override public int[] getInputSlots() { return new int[] {19, 20}; } - + + @Override public int[] getOutputSlots() { return new int[] {24, 25}; } @@ -231,33 +153,8 @@ public abstract class AContainer extends SlimefunItem { this.registerRecipe(new MachineRecipe(seconds, input, output)); } - 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++) { - inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); - } - 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) { + public void preRegister() { addItemHandler(new BlockTicker() { @Override @@ -265,35 +162,18 @@ public abstract class AContainer extends SlimefunItem { AContainer.this.tick(b); } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return false; } }); - - super.register(slimefun); } protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; @@ -312,30 +192,31 @@ public abstract class AContainer extends SlimefunItem { } else { MachineRecipe r = null; - Map found = new HashMap(); - outer: + Map found = new HashMap<>(); + for (MachineRecipe recipe: recipes) { for (ItemStack input: recipe.getInput()) { - slots: for (int slot: getInputSlots()) { if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), input, true)) { found.put(slot, input.getAmount()); - break slots; + break; } } } if (found.size() == recipe.getInput().length) { r = recipe; - break outer; + break; } else found.clear(); } if (r != null) { if (!fits(b, r.getOutput())) return; + for (Map.Entry entry: found.entrySet()) { BlockStorage.getInventory(b).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(entry.getKey()), entry.getValue())); } + processing.put(b, r); progress.put(b, r.getTicks()); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/ADrill.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/ADrill.java index ac2752ca7..0e17512ea 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/ADrill.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/ADrill.java @@ -1,15 +1,10 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; -import java.util.ArrayList; -import java.util.List; - 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 org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; @@ -21,7 +16,6 @@ import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Setup.Messages; 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; @@ -77,10 +71,6 @@ public abstract class ADrill extends AContainer { } } - @Override - public void newInstance(BlockMenu menu, Block b) { - } - @Override public boolean canOpen(Block b, Player p) { if (!(p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true))) { @@ -96,7 +86,7 @@ public abstract class ADrill extends AContainer { @Override public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); + if (flow == ItemTransportFlow.INSERT) return getInputSlots(); else return getOutputSlots(); } }; @@ -109,23 +99,13 @@ public abstract class ADrill extends AContainer { @Override public void registerDefaultRecipes() {} - + + @Override protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; ChargableBlock.addCharge(b, -getEnergyConsumption()); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AFarm.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AFarm.java index e66b2f00e..a5a780fd9 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AFarm.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AFarm.java @@ -16,10 +16,8 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; 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.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.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; @@ -27,24 +25,20 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; public abstract class AFarm extends SlimefunItem { - + private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 36, 37, 38, 39, 40, 41, 42, 43, 44}; private static final int[] border_out = {9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35}; public AFarm(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { super(category, item, id, recipeType, recipe); - + new BlockMenuPreset(id, 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); @@ -52,100 +46,39 @@ public abstract class AFarm extends SlimefunItem { @Override public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots(); + if (flow == ItemTransportFlow.WITHDRAW) return getOutputSlots(); return new int[0]; } }; - - registerBlockHandler(id, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - BlockMenu inv = BlockStorage.getInventory(b); - if (inv != null) { - for (int slot : getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } + + registerBlockHandler(id, (p, b, tool, reason) -> { + BlockMenu inv = BlockStorage.getInventory(b); + if (inv != null) { + for (int slot : getOutputSlots()) { + if (inv.getItemInSlot(slot) != null) { + b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); + inv.replaceExistingItem(slot, null); } } - return true; } + return true; }); } - public AFarm(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { - super(category, item, id, recipeType, recipe, recipeOutput); - - new BlockMenuPreset(id, 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.WITHDRAW)) return getOutputSlots(); - return new int[0]; - } - }; - - registerBlockHandler(id, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - BlockMenu inv = BlockStorage.getInventory(b); - if (inv != null) { - for (int slot: getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } - } - } - return true; - } - }); - } - private 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 - ); + 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(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } - - preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); - + + preset.addItem(22, 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; @@ -158,13 +91,13 @@ public abstract class AFarm extends SlimefunItem { }); } } - + public abstract String getInventoryTitle(); public abstract int getEnergyConsumption(); public abstract boolean canHarvest(Block b); public abstract ItemStack harvest(Block b); public abstract int getSize(); - + public int[] getOutputSlots() { return new int[] {19, 20, 21, 22, 23, 24, 25}; } @@ -173,64 +106,65 @@ public abstract class AFarm extends SlimefunItem { if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; int i = getSize() / 2; - loop: - for (int x = -i; x <= i; x++) { - for (int z = -i; z <= i; z++) { - Block block = new Location(b.getWorld(), b.getX() + x, b.getY() + 2, b.getZ() + z).getBlock(); - if (canHarvest(block)) { - ItemStack item = harvest(block); - if (!fits(block, new ItemStack[] {item})) break loop; - pushItems(b, new ItemStack[] {item}); - ChargableBlock.addCharge(b, -getEnergyConsumption()); - break loop; - } - } - } + + for (int x = -i; x <= i; x++) { + for (int z = -i; z <= i; z++) { + Block block = new Location(b.getWorld(), b.getX() + (double) x, b.getY() + 2.0, b.getZ() + (double) z).getBlock(); + if (canHarvest(block)) { + ItemStack item = harvest(block); + + if (!fits(block, item)) { + return; + } + + pushItems(b, item); + ChargableBlock.addCharge(b, -getEnergyConsumption()); + + return; + } + } + } } } - + @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new BlockTicker() { - + @Override public void tick(Block b, SlimefunItem sf, Config data) { AFarm.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++) { inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); } for (int slot: getOutputSlots()) { inv.setItem(slot, BlockStorage.getInventory(b).getItemInSlot(slot)); } + return inv; } - - protected boolean fits(Block b, ItemStack[] items) { + + protected boolean fits(Block b, ItemStack... items) { return inject(b).addItem(items).isEmpty(); } - - protected void pushItems(Block b, ItemStack[] items) { + + 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)); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java index 00b13c4c8..9512702b9 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java @@ -1,9 +1,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -15,8 +13,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; @@ -27,9 +23,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; 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.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; @@ -40,10 +34,10 @@ import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; public abstract class AGenerator extends SlimefunItem { - public static Map processing = new HashMap(); - public static Map progress = new HashMap(); + public static Map processing = new HashMap<>(); + public static Map progress = new HashMap<>(); - private Set recipes = new HashSet(); + private Set recipes = new HashSet<>(); 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}; @@ -59,10 +53,6 @@ public abstract class AGenerator extends SlimefunItem { 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); @@ -70,116 +60,51 @@ public abstract class AGenerator extends SlimefunItem { @Override public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); + if (flow == ItemTransportFlow.INSERT) return getInputSlots(); else return getOutputSlots(); } }; - registerBlockHandler(id, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @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); - } - } - for (int slot : getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } + registerBlockHandler(id, (p, b, tool, 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); + } + } + for (int slot : getOutputSlots()) { + if (inv.getItemInSlot(slot) != null) { + b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); + inv.replaceExistingItem(slot, null); } } - progress.remove(b.getLocation()); - processing.remove(b.getLocation()); - return true; } + progress.remove(b.getLocation()); + processing.remove(b.getLocation()); + return true; }); this.registerDefaultRecipes(); } public AGenerator(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { - super(category, item, id, recipeType, recipe, recipeOutput); - - new BlockMenuPreset(id, 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(); - } - }; - - registerBlockHandler(id, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @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); - } - } - for (int slot : getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } - } - } - progress.remove(b.getLocation()); - processing.remove(b.getLocation()); - return true; - } - }); - - this.registerDefaultRecipes(); + this(category, item, id, recipeType, recipe); + this.recipeOutput = recipeOutput; } private 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 - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } + for (int i : border_in) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_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(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i: getOutputSlots()) { @@ -197,9 +122,7 @@ public abstract class AGenerator extends SlimefunItem { }); } - preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } public abstract String getInventoryTitle(); @@ -228,7 +151,7 @@ public abstract class AGenerator extends SlimefunItem { } @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new EnergyTicker() { @Override @@ -236,18 +159,7 @@ public abstract class AGenerator extends SlimefunItem { if (isProcessing(l)) { int timeleft = progress.get(l); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(l).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(l).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(l).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(l), 22, timeleft, processing.get(l).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(l)) { if (ChargableBlock.getMaxCharge(l) - ChargableBlock.getCharge(l) >= getEnergyProduction()) { @@ -267,7 +179,7 @@ public abstract class AGenerator extends SlimefunItem { if (SlimefunManager.isItemSimiliar(fuel, new ItemStack(Material.LAVA_BUCKET), true) || SlimefunManager.isItemSimiliar(fuel, SlimefunItems.BUCKET_OF_FUEL, true) || SlimefunManager.isItemSimiliar(fuel, SlimefunItems.BUCKET_OF_OIL, true)) { - pushItems(l, new ItemStack[] {new ItemStack(Material.BUCKET)}); + pushItems(l, new ItemStack(Material.BUCKET)); } BlockStorage.getInventory(l).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " ")); @@ -277,25 +189,17 @@ public abstract class AGenerator extends SlimefunItem { } } else { - MachineFuel r = null; - Map found = new HashMap(); - outer: - for (MachineFuel recipe: recipes) { - for (int slot: getInputSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), recipe.getInput(), true)) { - found.put(slot, recipe.getInput().getAmount()); - r = recipe; - break outer; - } - } - } + BlockMenu menu = BlockStorage.getInventory(l); + Map found = new HashMap<>(); + MachineFuel fuel = findRecipe(menu, found); - if (r != null) { + if (fuel != null) { for (Map.Entry entry: found.entrySet()) { - BlockStorage.getInventory(l).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(entry.getKey()), entry.getValue())); + menu.replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(menu.getItemInSlot(entry.getKey()), entry.getValue())); } - processing.put(l, r); - progress.put(l, r.getTicks()); + + processing.put(l, fuel); + progress.put(l, fuel.getTicks()); } return 0; } @@ -306,8 +210,19 @@ public abstract class AGenerator extends SlimefunItem { return false; } }); - - super.register(slimefun); + } + + private MachineFuel findRecipe(BlockMenu menu, Map found) { + for (MachineFuel recipe: recipes) { + for (int slot: getInputSlots()) { + if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), recipe.getInput(), true)) { + found.put(slot, recipe.getInput().getAmount()); + return recipe; + } + } + } + + return null; } public Set getFuelTypes() { @@ -326,7 +241,7 @@ public abstract class AGenerator extends SlimefunItem { return inv; } - protected void pushItems(Location l, ItemStack[] items) { + protected void pushItems(Location l, ItemStack... items) { Inventory inv = inject(l); inv.addItem(items); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java index f6bb02d69..933360392 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java @@ -1,12 +1,12 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Random; import java.util.Set; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -16,23 +16,21 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; 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.machines.ReactorAccessPort; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.EnergyTicker; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; @@ -63,7 +61,9 @@ public abstract class AReactor extends SlimefunItem { private static final int[] border_1 = {9, 10, 11, 18, 20, 27, 29, 36, 38, 45, 46, 47}; private static final int[] border_2 = {15, 16, 17, 24, 26, 33, 35, 42, 44, 51, 52, 53}; private static final int[] border_3 = {30, 31, 32, 39, 41, 48, 50}; - private static final int[] border_4 = {25, 34, 43}; // No coolant border + + // No coolant border + private static final int[] border_4 = {25, 34, 43}; private static final int infoSlot = 49; public AReactor(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { @@ -82,6 +82,7 @@ public abstract class AReactor extends SlimefunItem { if (BlockStorage.getLocationInfo(b.getLocation(), "reactor-mode") == null){ BlockStorage.addBlockInfo(b, "reactor-mode", "generator"); } + if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "reactor-mode").equals("generator")) { menu.replaceExistingItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&7Focus: &eElectricity", "", "&6Your Reactor will focus on Power Generation", "&6If your Energy Network doesn't need Power", "&6it will not produce any either", "", "&7> Click to change the Focus to &eProduction")); menu.addMenuClickHandler(4, (p, slot, item, action) -> { @@ -98,16 +99,18 @@ public abstract class AReactor extends SlimefunItem { return false; }); } - BlockMenu ap = getAccessPort(b.getLocation()); - if(ap != null) { + + BlockMenu port = getAccessPort(b.getLocation()); + if (port != null) { menu.replaceExistingItem(infoSlot, new CustomItem(new ItemStack(Material.GREEN_WOOL), "&7Access Port", "", "&6Detected", "", "&7> Click to view Access Port")); menu.addMenuClickHandler(infoSlot, (p, slot, item, action) -> { - ap.open(p); + port.open(p); newInstance(menu, b); return false; }); - } else { + } + else { menu.replaceExistingItem(infoSlot, new CustomItem(new ItemStack(Material.RED_WOOL), "&7Access Port", "", "&cNot detected", "", "&7Access Port must be", "&7placed 3 blocks above", "&7a reactor!")); menu.addMenuClickHandler(infoSlot, (p, slot, item, action) -> { newInstance(menu, b); @@ -117,6 +120,7 @@ public abstract class AReactor extends SlimefunItem { } } catch(Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured when creating a Reactor Menu for Slimefun " + Slimefun.getVersion(), x); } } @@ -132,40 +136,35 @@ public abstract class AReactor extends SlimefunItem { } }; - registerBlockHandler(id, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - BlockMenu inv = BlockStorage.getInventory(b); - if (inv != null) { - for (int slot : getFuelSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } - } - for (int slot : getCoolantSlots()) { - 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); - } + registerBlockHandler(id, (p, b, tool, reason) -> { + BlockMenu inv = BlockStorage.getInventory(b); + if (inv != null) { + for (int slot : getFuelSlots()) { + if (inv.getItemInSlot(slot) != null) { + b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); + inv.replaceExistingItem(slot, null); + } + } + + for (int slot : getCoolantSlots()) { + 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.getLocation()); - processing.remove(b.getLocation()); - ReactorHologram.remove(b.getLocation()); - return true; } + + progress.remove(b.getLocation()); + processing.remove(b.getLocation()); + ReactorHologram.remove(b.getLocation()); + return true; }); this.registerDefaultRecipes(); @@ -173,35 +172,23 @@ public abstract class AReactor extends SlimefunItem { private 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 - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i : border_1) { - preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i : border_3) { - preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } - preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); - preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), - (p, slot, item, action) -> false - ); + preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), (p, slot, item, action) -> false); for (int i : border_2) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } if (needsCooling()) { @@ -211,9 +198,7 @@ public abstract class AReactor extends SlimefunItem { preset.addItem(7, new CustomItem(new ItemStack(Material.BARRIER), "&bCoolant Slot", "", "&rThis Slot accepts Coolant Cells")); for (int i : border_4) { - preset.addItem(i, new CustomItem(new ItemStack(Material.BARRIER), "&cNo Coolant Required"), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.BARRIER), "&cNo Coolant Required"), (p, slot, item, action) -> false); } } } @@ -261,10 +246,10 @@ public abstract class AReactor extends SlimefunItem { } @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new EnergyTicker() { - Set explode = new HashSet(); + private Set explode = new HashSet<>(); @Override public double generateEnergy(final Location l, SlimefunItem sf, Config data) { @@ -283,22 +268,11 @@ public abstract class AReactor extends SlimefunItem { if (space >= produced || !BlockStorage.getLocationInfo(l, "reactor-mode").equals("generator")) { progress.put(l, timeleft - 1); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - if (!l.getBlock().getRelative(cooling[CSCoreLib.randomizer().nextInt(cooling.length)]).isLiquid()) explode.add(l); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + if (!l.getBlock().getRelative(cooling[new Random().nextInt(cooling.length)]).isLiquid()) explode.add(l); }); - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(l).getTicks())); - lore.add(MachineHelper.getCoolant(timeleft, processing.get(l).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(l).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(l), 22, timeleft, processing.get(l).getTicks(), getProgressBar()); if (needsCooling()) { boolean coolant = (processing.get(l).getTicks() - timeleft) % 25 == 0; @@ -352,40 +326,19 @@ public abstract class AReactor extends SlimefunItem { } } else { - MachineFuel r = null; - Map found = new HashMap(); + BlockMenu menu = BlockStorage.getInventory(l); + Map found = new HashMap<>(); + MachineFuel fuel = findRecipe(menu, found); - if (port != null) { - refill: - for (int slot: getFuelSlots()) { - for (MachineFuel recipe: recipes) { - if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), recipe.getInput(), true)) { - if (pushItems(l, new CustomItem(port.getItemInSlot(slot), 1), getFuelSlots()) == null) { - port.replaceExistingItem(slot, InvUtils.decreaseItem(port.getItemInSlot(slot), 1)); - break refill; - } - } - } - } - } + if (port != null) restockCoolant(l, port); - outer: - for (MachineFuel recipe: recipes) { - for (int slot: getFuelSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), recipe.getInput(), true)) { - found.put(slot, recipe.getInput().getAmount()); - r = recipe; - break outer; - } - } - } - - if (r != null) { + if (fuel != null) { for (Map.Entry entry: found.entrySet()) { - BlockStorage.getInventory(l).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(entry.getKey()), entry.getValue())); + menu.replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(menu.getItemInSlot(entry.getKey()), entry.getValue())); } - processing.put(l, r); - progress.put(l, r.getTicks()); + + processing.put(l, fuel); + progress.put(l, fuel.getTicks()); } return 0; } @@ -397,9 +350,7 @@ public abstract class AReactor extends SlimefunItem { if (explosion) { BlockStorage.getInventory(l).close(); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - ReactorHologram.remove(l); - }, 0); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> ReactorHologram.remove(l), 0); explode.remove(l); processing.remove(l); @@ -408,8 +359,30 @@ public abstract class AReactor extends SlimefunItem { return explosion; } }); - - super.register(slimefun); + } + + private void restockCoolant(Location l, BlockMenu port) { + for (int slot: getFuelSlots()) { + for (MachineFuel recipe: recipes) { + if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), recipe.getInput(), true) && pushItems(l, new CustomItem(port.getItemInSlot(slot), 1), getFuelSlots()) == null) { + port.replaceExistingItem(slot, InvUtils.decreaseItem(port.getItemInSlot(slot), 1)); + return; + } + } + } + } + + private MachineFuel findRecipe(BlockMenu menu, Map found) { + for (MachineFuel recipe: recipes) { + for (int slot: getInputSlots()) { + if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), recipe.getInput(), true)) { + found.put(slot, recipe.getInput().getAmount()); + return recipe; + } + } + } + + return null; } private Inventory inject(Location l) { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineFuel.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineFuel.java index cff6d77b3..ad14d4ff4 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineFuel.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineFuel.java @@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack; public class MachineFuel { - int seconds; - ItemStack fuel; - ItemStack output; + private int seconds; + private ItemStack fuel; + private ItemStack output; public MachineFuel(int seconds, ItemStack fuel) { this.seconds = seconds * 2; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java index aef06cf67..90c042baa 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineHelper.java @@ -1,25 +1,33 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; +import java.util.ArrayList; +import java.util.List; + import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; -public class MachineHelper { +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; + +public final class MachineHelper { - public static String getTimeLeft(int l) { + private MachineHelper() {} + + public static String getTimeLeft(int seconds) { String timeleft = ""; - final int minutes = (int) (l / 60L); + final int minutes = (int) (seconds / 60L); if (minutes > 0) { timeleft = String.valueOf(timeleft) + minutes + "m "; } - l -= minutes * 60; - final int seconds = (int)l; + seconds -= minutes * 60; timeleft = String.valueOf(timeleft) + seconds + "s"; return ChatColor.translateAlternateColorCodes('&', "&7" + timeleft + " left"); } public static String getProgress(int time, int total) { StringBuilder progress = new StringBuilder(); - float percentage = Math.round(((((total - time) * 100.0f) / total) * 100.0f) / 100.0f); + float percentage = Math.round(((((total - time) * 100.0F) / total) * 100.0F) / 100.0F); if (percentage < 16.0F) progress.append("&4"); else if (percentage < 32.0F) progress.append("&c"); @@ -47,7 +55,7 @@ public class MachineHelper { public static String getCoolant(int time, int total) { int passed = ((total - time) % 25); StringBuilder progress = new StringBuilder(); - float percentage = Math.round(((((25 - passed) * 100.0f) / 25) * 100.0f) / 100.0f); + float percentage = Math.round(((((25 - passed) * 100.0F) / 25) * 100.0F) / 100.0F); if (percentage < 33.0F) progress.append("&9"); else if (percentage < 66.0F) progress.append("&1"); @@ -71,11 +79,26 @@ public class MachineHelper { public static float getPercentage(int time, int total) { int passed = ((total - time) % 25); - return Math.round(((((25 - passed) * 100.0f) / 25) * 100.0f) / 100.0f); + return Math.round(((((25 - passed) * 100.0F) / 25) * 100.0F) / 100.0F); } public static short getDurability(ItemStack item, int timeleft, int max) { return (short) ((item.getType().getMaxDurability() / max) * timeleft); } + + public static void updateProgressbar(BlockMenu menu, int slot, int timeleft, int time, ItemStack indicator) { + ItemStack item = indicator.clone(); + ItemMeta im = item.getItemMeta(); + ((Damageable) im).setDamage(getDurability(item, timeleft, time)); + im.setDisplayName(" "); + List lore = new ArrayList<>(); + lore.add(getProgress(timeleft, time)); + lore.add(""); + lore.add(getTimeLeft(timeleft / 2)); + im.setLore(lore); + item.setItemMeta(im); + + menu.replaceExistingItem(slot, item); + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineRecipe.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineRecipe.java index 9f87a0386..8f8bc18f0 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineRecipe.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/MachineRecipe.java @@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack; public class MachineRecipe { - int ticks; - ItemStack[] input; - ItemStack[] output; + private int ticks; + private ItemStack[] input; + private ItemStack[] output; public MachineRecipe(int seconds, ItemStack[] input, ItemStack[] output) { this.ticks = seconds * 2; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/Teleporter.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/Teleporter.java index 5fcc59332..62500edb2 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/Teleporter.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/Teleporter.java @@ -30,6 +30,6 @@ public abstract class Teleporter extends SlimefunItem { }); } - public abstract void onInteract(Player p, Block b) throws Exception; + public abstract void onInteract(Player p, Block b); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AdvancedCargoOutputNode.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/AdvancedCargoOutputNode.java similarity index 93% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AdvancedCargoOutputNode.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/AdvancedCargoOutputNode.java index 8f4ee7b96..6bef490d0 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AdvancedCargoOutputNode.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/AdvancedCargoOutputNode.java @@ -1,4 +1,6 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo; + +import java.util.logging.Level; import org.bukkit.Material; import org.bukkit.block.Block; @@ -19,6 +21,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; @@ -105,7 +108,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem { menu.addMenuClickHandler(41, (p, slot, item, action) -> { int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; if (channel < 0) { - if (CargoNet.EXTRA_CHANNELS) channel = 16; + if (CargoNet.extraChannels) channel = 16; else channel = 15; } BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); @@ -132,7 +135,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem { menu.addMenuClickHandler(43, (p, slot, item, action) -> { int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; - if (CargoNet.EXTRA_CHANNELS) { + if (CargoNet.extraChannels) { if (channeln > 16) channeln = 0; } else { @@ -144,8 +147,8 @@ public class AdvancedCargoOutputNode extends SlimefunItem { return false; }); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Inventory of an Advanced Cargo Output Node for Slimefun " + Slimefun.getVersion(), x); } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoInputNode.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoInputNode.java similarity index 93% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoInputNode.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoInputNode.java index d45135d47..1e7b0aae5 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoInputNode.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoInputNode.java @@ -1,6 +1,9 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo; import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; + +import java.util.logging.Level; + import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -19,6 +22,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; @@ -63,6 +67,7 @@ public class CargoInputNode extends SlimefunItem { Damageable dmg = (Damageable) is.getItemMeta(); dmg.setDamage(20); is.setItemMeta((ItemMeta) dmg); + menu.replaceExistingItem(16, new CustomItem(is, "&7Include Sub-IDs/Durability: &4\u2718", "", "&e> Click to toggle whether the Durability has to match")); menu.addMenuClickHandler(16, (p, slot, item, action) -> { BlockStorage.addBlockInfo(b, "filter-durability", "true"); @@ -75,6 +80,7 @@ public class CargoInputNode extends SlimefunItem { Damageable dmg = (Damageable) is.getItemMeta(); dmg.setDamage(20); is.setItemMeta((ItemMeta) dmg); + menu.replaceExistingItem(16, new CustomItem(is, "&7Include Sub-IDs/Durability: &2\u2714", "", "&e> Click to toggle whether the Durability has to match")); menu.addMenuClickHandler(16, (p, slot, item, action) -> { BlockStorage.addBlockInfo(b, "filter-durability", "false"); @@ -121,7 +127,7 @@ public class CargoInputNode extends SlimefunItem { menu.addMenuClickHandler(41, (p, slot, item, action) -> { int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; if (channel < 0) { - if (CargoNet.EXTRA_CHANNELS) channel = 16; + if (CargoNet.extraChannels) channel = 16; else channel = 15; } BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); @@ -148,7 +154,7 @@ public class CargoInputNode extends SlimefunItem { menu.addMenuClickHandler(43, (p, slot, item, action) -> { int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; - if (CargoNet.EXTRA_CHANNELS) { + if (CargoNet.extraChannels) { if (channeln > 16) channeln = 0; } else { @@ -160,8 +166,8 @@ public class CargoInputNode extends SlimefunItem { return false; }); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a Cargo Input Node for Slimefun " + Slimefun.getVersion(), x); } } @@ -196,6 +202,7 @@ public class CargoInputNode extends SlimefunItem { @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) { @@ -211,14 +218,10 @@ public class CargoInputNode extends SlimefunItem { protected void constructMenu(BlockMenuPreset preset) { for (int i : border) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } - preset.addItem(2, new CustomItem(new ItemStack(Material.PAPER), "&3Items", "", "&bPut in all Items you want to", "&bblacklist/whitelist"), - (p, slot, item, action) -> false - ); + preset.addItem(2, new CustomItem(new ItemStack(Material.PAPER), "&3Items", "", "&bPut in all Items you want to", "&bblacklist/whitelist"), (p, slot, item, action) -> false); } public int[] getInputSlots() { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java new file mode 100644 index 000000000..817715d95 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java @@ -0,0 +1,66 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo; + +import org.bukkit.ChatColor; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +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; + +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); + return true; + }); + } + + @Override + public void preRegister() { + addItemHandler(new BlockTicker() { + + @Override + public void tick(Block b, SlimefunItem item, Config data) { + CargoNet.getNetworkFromLocationOrCreate(b.getLocation()).tick(b); + } + + @Override + public boolean isSynchronized() { + return false; + } + + }, new ItemInteractionHandler() { + + @Override + public boolean onRightClick(ItemUseEvent e, Player p, ItemStack stack) { + if (e.getClickedBlock() == null) return false; + String item = BlockStorage.checkID(e.getClickedBlock()); + if (item == null || !item.equals(getID())) return false; + e.setCancelled(true); + + if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "visualizer") == null) { + BlockStorage.addBlockInfo(e.getClickedBlock(), "visualizer", "disabled"); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&4\u2718")); + } + else { + BlockStorage.addBlockInfo(e.getClickedBlock(), "visualizer", null); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&2\u2714")); + } + return true; + } + }); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoOutputNode.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoOutputNode.java similarity index 91% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoOutputNode.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoOutputNode.java index 60d0b24eb..bedb1bc78 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoOutputNode.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoOutputNode.java @@ -1,4 +1,6 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo; + +import java.util.logging.Level; import org.bukkit.Material; import org.bukkit.block.Block; @@ -17,6 +19,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; @@ -40,12 +43,11 @@ public class CargoOutputNode extends SlimefunItem { @Override public void newInstance(final BlockMenu menu, final Block b) { try { - menu.replaceExistingItem(12, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjI1OTliZDk4NjY1OWI4Y2UyYzQ5ODg1MjVjOTRlMTlkZGQzOWZhZDA4YTM4Mjg0YTE5N2YxYjcwNjc1YWNjIn19fQ=="), "&bChannel", "", "&e> Click to decrease the Channel ID by 1")); menu.addMenuClickHandler(12, (p, slot, item, action) -> { int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; if (channel < 0) { - if (CargoNet.EXTRA_CHANNELS) channel = 16; + if (CargoNet.extraChannels) channel = 16; else channel = 15; } BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); @@ -72,7 +74,7 @@ public class CargoOutputNode extends SlimefunItem { menu.addMenuClickHandler(14, (p, slot, item, action) -> { int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; - if (CargoNet.EXTRA_CHANNELS) { + if (CargoNet.extraChannels) { if (channeln > 16) channeln = 0; } else { @@ -84,8 +86,8 @@ public class CargoOutputNode extends SlimefunItem { return false; }); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a Cargo Output Node for Slimefun " + Slimefun.getVersion(), x); } } @@ -121,9 +123,7 @@ public class CargoOutputNode extends SlimefunItem { protected void constructMenu(BlockMenuPreset preset) { for (int i : border) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/AutonomousMachineHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/AutonomousMachineHandler.java deleted file mode 100644 index 608729ff1..000000000 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/AutonomousMachineHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; - -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; - -import org.bukkit.block.Block; -import org.bukkit.block.Dispenser; -import org.bukkit.event.block.BlockDispenseEvent; - -public abstract class AutonomousMachineHandler extends ItemHandler { - - @Override - public String toCodename() { - return "AutonomousMachineHandler"; - } - - public abstract boolean onBlockDispense(BlockDispenseEvent e, Block dispenser, Dispenser d, Block block, Block chest, SlimefunItem machine); - -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/AutonomousToolHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/AutonomousToolHandler.java deleted file mode 100644 index 8c42cecdd..000000000 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/AutonomousToolHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; - -import org.bukkit.block.Block; -import org.bukkit.block.Dispenser; -import org.bukkit.event.block.BlockDispenseEvent; - -public abstract class AutonomousToolHandler extends ItemHandler { - - @Override - public String toCodename() { - return "AutonomousToolHandler"; - } - - public abstract boolean onBlockDispense(BlockDispenseEvent e, Block dispenser, Dispenser d, Block block, Block chest, int i); - -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockBreakHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockBreakHandler.java index 89a79e011..223308deb 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockBreakHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockBreakHandler.java @@ -1,16 +1,6 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; -import java.util.List; - -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -public abstract class BlockBreakHandler extends ItemHandler { +@Deprecated +public abstract class BlockBreakHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler { - public abstract boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops); - - @Override - public String toCodename() { - return "BlockBreakHandler"; - } -} +} \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockPlaceHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockPlaceHandler.java index 50505b6b4..9cde2fd85 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockPlaceHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockPlaceHandler.java @@ -1,14 +1,5 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.inventory.ItemStack; - -public abstract class BlockPlaceHandler extends ItemHandler { - - public abstract boolean onBlockPlace(BlockPlaceEvent e, ItemStack item); - - @Override - public String toCodename() { - return "BlockPlaceHandler"; - } -} +@Deprecated +public abstract class BlockPlaceHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.BlockPlaceHandler { +} \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockTicker.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockTicker.java index 2ebb5b937..88a293d2f 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockTicker.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BlockTicker.java @@ -1,29 +1,5 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; - -import org.bukkit.block.Block; - -public abstract class BlockTicker extends ItemHandler { - - public boolean unique = true; - - public void update() { - if (unique) { - uniqueTick(); - unique = false; - } - } - - - public abstract boolean isSynchronized(); - public abstract void uniqueTick(); - public abstract void tick(Block b, SlimefunItem item, Config data); - - @Override - public String toCodename() { - return "BlockTicker"; - } - +@Deprecated +public abstract class BlockTicker extends me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker { } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BowShootHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BowShootHandler.java deleted file mode 100644 index 2dc381ccf..000000000 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/BowShootHandler.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; - -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.entity.EntityDamageByEntityEvent; - -public abstract class BowShootHandler extends ItemHandler { - - public abstract boolean onHit(EntityDamageByEntityEvent e, LivingEntity n); - - @Override - public String toCodename() { - return "BowShootHandler"; - } -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemHandler.java index ce3bcc077..8d9913f5b 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemHandler.java @@ -1,6 +1,6 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; -public abstract class ItemHandler { - - public abstract String toCodename(); +@Deprecated +public abstract class ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler { + } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemInteractionHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemInteractionHandler.java index 75fb6bb47..66c32c8c3 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemInteractionHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/ItemInteractionHandler.java @@ -1,17 +1,5 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; -import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; - -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public abstract class ItemInteractionHandler extends ItemHandler { - - public abstract boolean onRightClick(ItemUseEvent e, Player p, ItemStack item); - - @Override - public String toCodename() { - return "ItemInteractionHandler"; - } - -} +@Deprecated +public abstract class ItemInteractionHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler { +} \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/MultiBlockInteractionHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/MultiBlockInteractionHandler.java index 2fdc01480..7bf5b9069 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/MultiBlockInteractionHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/handlers/MultiBlockInteractionHandler.java @@ -1,16 +1,5 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; -import me.mrCookieSlime.Slimefun.Objects.MultiBlock; - -import org.bukkit.block.Block; -import org.bukkit.entity.Player; - -public abstract class MultiBlockInteractionHandler extends ItemHandler { - - public abstract boolean onInteract(Player p, MultiBlock mb, Block b); - - @Override - public String toCodename() { - return "MultiBlockInteractionHandler"; - } -} +@Deprecated +public abstract class MultiBlockInteractionHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.MultiBlockInteractionHandler { +} \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/DamageableItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/DamageableItem.java new file mode 100644 index 000000000..0c0ace468 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/DamageableItem.java @@ -0,0 +1,34 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +@FunctionalInterface +public interface DamageableItem { + + boolean isDamageable(); + + default void damageItem(Player p, ItemStack item) { + if (item != null && item.getType() != null && item.getType() != Material.AIR && item.getAmount() > 0 && isDamageable()) { + if (item.getEnchantments().containsKey(Enchantment.DURABILITY) && Math.random() * 100 <= (60 + Math.floorDiv(40, (item.getEnchantmentLevel(Enchantment.DURABILITY) + 1)))) { + return; + } + + ItemMeta meta = item.getItemMeta(); + Damageable damageable = (Damageable) meta; + + if (damageable.getDamage() >= item.getType().getMaxDurability()) { + item.setAmount(0); + } + else { + damageable.setDamage(damageable.getDamage() + 1); + item.setItemMeta(meta); + } + } + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/InventoryBlock.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/InventoryBlock.java new file mode 100644 index 000000000..b6dddcef2 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/InventoryBlock.java @@ -0,0 +1,77 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces; + +import java.util.function.Consumer; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.CSCoreLibPlugin.general.Math.Calculator; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; +import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; + +public interface InventoryBlock { + + int[] getInputSlots(); + int[] getOutputSlots(); + + default void createPreset(SlimefunItem item, String title, Consumer setup) { + new BlockMenuPreset(item.getID(), title) { + + @Override + public void init() { + setup.accept(this); + } + + @Override + public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { + if (flow == ItemTransportFlow.INSERT) return getInputSlots(); + else return getOutputSlots(); + } + + @Override + public boolean canOpen(Block b, Player p) { + return p.hasPermission("slimefun.inventory.bypass") || (SlimefunPlugin.getProtectionManager().hasPermission(p, b.getLocation(), Action.ACCESS_INVENTORIES) && Slimefun.hasUnlocked(p, item, false)); + } + }; + } + + default Inventory inject(Block b) { + int size = getOutputSlots().length; + Inventory inv = Bukkit.createInventory(null, Calculator.formToLine(size) * 9); + + for (int i = 0; i < inv.getSize(); i++) { + if (i < size) { + inv.setItem(i, BlockStorage.getInventory(b).getItemInSlot(getOutputSlots()[i])); + } + else { + inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); + } + } + + return inv; + } + + default boolean fits(Block b, ItemStack... items) { + return inject(b).addItem(items).isEmpty(); + } + + default void pushItems(Block b, ItemStack... items) { + Inventory inv = inject(b); + inv.addItem(items); + + for (int i = 0; i < getOutputSlots().length; i++) { + BlockStorage.getInventory(b).replaceExistingItem(getOutputSlots()[i], inv.getItem(i)); + } + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/NotPlaceable.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/NotPlaceable.java new file mode 100644 index 000000000..e06465fac --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/NotPlaceable.java @@ -0,0 +1,5 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces; + +public interface NotPlaceable { + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/RecipeDisplayItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/RecipeDisplayItem.java new file mode 100644 index 000000000..a52363b7f --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/RecipeDisplayItem.java @@ -0,0 +1,12 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces; + +import java.util.List; + +import org.bukkit.inventory.ItemStack; + +@FunctionalInterface +public interface RecipeDisplayItem { + + List getDisplayRecipes(); + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/DietCookie.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/DietCookie.java new file mode 100644 index 000000000..212b557ae --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/DietCookie.java @@ -0,0 +1,36 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffectType; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class DietCookie extends SimpleSlimefunItem { + + public DietCookie(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public ItemConsumptionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + p.sendMessage(ChatColor.YELLOW + "You feel so light..."); + p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_EAT, 1, 1); + + if (p.hasPotionEffect(PotionEffectType.LEVITATION)) p.removePotionEffect(PotionEffectType.LEVITATION); + p.addPotionEffect(PotionEffectType.LEVITATION.createEffect(60, 1)); + + return true; + } + return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosivePickaxe.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosivePickaxe.java new file mode 100644 index 000000000..9e3f8a116 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosivePickaxe.java @@ -0,0 +1,105 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.HandledBlock; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class ExplosivePickaxe extends SimpleSlimefunItem implements NotPlaceable, DamageableItem { + + private String[] blacklist; + private boolean damageOnUse; + + public ExplosivePickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public BlockBreakHandler getItemHandler() { + return (e, item, fortune, drops) -> { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_PICKAXE, true)) { + e.setCancelled(true); + e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F); + e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.3F, 1F); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block b = e.getBlock().getRelative(x, y, z); + + if (b.getType() != Material.AIR && !b.isLiquid() && !StringUtils.equals(b.getType().toString(), blacklist) && SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), b.getLocation(), Action.BREAK_BLOCK)) { + if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) { + SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData()); + } + + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType()); + SlimefunItem sfItem = BlockStorage.check(b); + boolean allow = false; + + if (sfItem != null && !(sfItem instanceof HandledBlock)) { + if (SlimefunPlugin.getUtilities().blockHandlers.containsKey(sfItem.getID())) { + allow = SlimefunPlugin.getUtilities().blockHandlers.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK); + } + if (allow) { + drops.add(BlockStorage.retrieve(e.getBlock())); + } + } + else if (b.getType() == Material.PLAYER_HEAD) { + b.breakNaturally(); + } + else if (b.getType().name().endsWith("_SHULKER_BOX")) { + b.breakNaturally(); + } + else { + for (ItemStack drop: b.getDrops()) { + b.getWorld().dropItemNaturally(b.getLocation(), (b.getType().toString().endsWith("_ORE") && b.getType() != Material.IRON_ORE && b.getType() != Material.GOLD_ORE) ? new CustomItem(drop, fortune): drop); + } + b.setType(Material.AIR); + } + + damageItem(e.getPlayer(), item); + } + } + } + } + + return true; + } + else return false; + }; + } + + @Override + public void postRegister() { + damageOnUse = ((boolean) Slimefun.getItemValue(getID(), "damage-on-use")); + + List list = (List) Slimefun.getItemValue(getID(), "unbreakable-blocks"); + blacklist = list.toArray(new String[list.size()]); + } + + @Override + public boolean isDamageable() { + return damageOnUse; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveShovel.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveShovel.java new file mode 100644 index 000000000..69b2c432e --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveShovel.java @@ -0,0 +1,84 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.materials.MaterialTools; +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class ExplosiveShovel extends SimpleSlimefunItem implements NotPlaceable, DamageableItem { + + private boolean damageOnUse; + + public ExplosiveShovel(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public BlockBreakHandler getItemHandler() { + return (e, item, fortune, drops) -> { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_SHOVEL, true)) { + e.setCancelled(true); + e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F); + e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.3F, 1F); + + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block b = e.getBlock().getRelative(x, y, z); + boolean correctType = false; + + for (Material mat : MaterialTools.getShovelItems()) { + if (b.getType() == mat) { + correctType = true; + break; + } + } + + if (correctType && SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), b.getLocation(), Action.BREAK_BLOCK)) { + if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) { + SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData()); + } + + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType()); + for (ItemStack drop: b.getDrops()) { + b.getWorld().dropItemNaturally(b.getLocation(), drop); + } + b.setType(Material.AIR); + + damageItem(e.getPlayer(), item); + } + } + } + } + + return true; + } + else return false; + }; + } + + @Override + public void postRegister() { + damageOnUse = ((boolean) Slimefun.getItemValue(getID(), "damage-on-use")); + } + + @Override + public boolean isDamageable() { + return damageOnUse; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GoldPan.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GoldPan.java new file mode 100644 index 000000000..8577df750 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GoldPan.java @@ -0,0 +1,61 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class GoldPan extends SlimefunGadget { + + private Random random = new Random(); + + public GoldPan(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, machineRecipes, keys, values); + } + + @Override + public void register(boolean slimefun) { + addItemHandler(new ItemInteractionHandler() { + + @Override + public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GOLD_PAN, true)) { + if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.GRAVEL && CSCoreLib.getLib().getProtectionManager().canBuild(p.getUniqueId(), e.getClickedBlock(), true)) { + List drops = new ArrayList<>(); + + if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.SIFTED_ORE")) drops.add(SlimefunItems.SIFTED_ORE); + else if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.CLAY")) drops.add(new ItemStack(Material.CLAY_BALL)); + else if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.FLINT")) drops.add(new ItemStack(Material.FLINT)); + + e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, e.getClickedBlock().getType()); + e.getClickedBlock().setType(Material.AIR); + + for (ItemStack drop: drops) { + e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), drop); + } + } + e.setCancelled(true); + return true; + } + else return false; + } + }); + + super.register(slimefun); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GrapplingHook.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GrapplingHook.java new file mode 100644 index 000000000..4db0d5357 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GrapplingHook.java @@ -0,0 +1,95 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Bat; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; + +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.utils.Utilities; + +public class GrapplingHook extends SimpleSlimefunItem { + + private long despawnTicks; + + public GrapplingHook(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public ItemInteractionHandler getItemHandler() { + Utilities utilities = SlimefunPlugin.getUtilities(); + + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + UUID uuid = p.getUniqueId(); + + if (e.getClickedBlock() == null && !utilities.jumpState.containsKey(uuid)) { + e.setCancelled(true); + + if (p.getInventory().getItemInOffHand().getType() == Material.BOW) { + // Cancel, to fix dupe #740 + return false; + } + utilities.jumpState.put(uuid, p.getInventory().getItemInMainHand().getType() != Material.SHEARS); + + if (item.getType() == Material.LEAD) { + item.setAmount(item.getAmount() - 1); + } + + Vector direction = p.getEyeLocation().getDirection().multiply(2.0); + Arrow arrow = p.getWorld().spawn(p.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), Arrow.class); + arrow.setShooter(p); + arrow.setVelocity(direction); + + Bat b = (Bat) p.getWorld().spawnEntity(p.getLocation(), EntityType.BAT); + b.setCanPickupItems(false); + b.setAI(false); + b.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 100000, 100000)); + b.setLeashHolder(arrow); + + utilities.damage.add(uuid); + utilities.remove.put(uuid, new Entity[]{b, arrow}); + + // To fix issue #253 + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + if (utilities.jumpState.containsKey(uuid)) { + utilities.arrows.remove(uuid); + + for (Entity n : utilities.remove.get(uuid)) { + if (n.isValid()) n.remove(); + } + + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + utilities.damage.remove(uuid); + utilities.jumpState.remove(uuid); + utilities.remove.remove(uuid); + }, 20L); + } + }, despawnTicks); + } + return true; + } + else return false; + }; + } + + @Override + public void postRegister() { + despawnTicks = (int) Slimefun.getItemValue("GRAPPLING_HOOK", "despawn-seconds") * 20L; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/HerculesPickaxe.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/HerculesPickaxe.java new file mode 100644 index 000000000..5d6bd4d7b --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/HerculesPickaxe.java @@ -0,0 +1,41 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class HerculesPickaxe extends SimpleSlimefunItem { + + public HerculesPickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public BlockBreakHandler getItemHandler() { + return (e, item, fortune, drops) -> { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.HERCULES_PICKAXE, true) && e.getBlock().getType().toString().endsWith("_ORE")) { + if (e.getBlock().getType() == Material.IRON_ORE) { + drops.add(new CustomItem(SlimefunItems.IRON_DUST, 2)); + } + else if (e.getBlock().getType() == Material.GOLD_ORE) { + drops.add(new CustomItem(SlimefunItems.GOLD_DUST, 2)); + } + else { + for (ItemStack drop: e.getBlock().getDrops()) { + drops.add(new CustomItem(drop, drop.getAmount() * 2)); + } + } + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/HunterTalisman.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/HunterTalisman.java new file mode 100644 index 000000000..0db06913d --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/HunterTalisman.java @@ -0,0 +1,53 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.entity.ChestedHorse; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Talisman; +import me.mrCookieSlime.Slimefun.Objects.handlers.EntityKillHandler; + +public class HunterTalisman extends Talisman { + + public HunterTalisman(ItemStack item, String id, ItemStack[] recipe, boolean consumable, boolean cancelEvent, String messageSuffix, int chance) { + super(item, id, recipe, consumable, cancelEvent, messageSuffix, chance); + } + + @Override + public void preRegister() { + addItemHandler(getItemHandler()); + } + + public EntityKillHandler getItemHandler() { + return (e, entity, killer, item) -> { + if (Talisman.checkFor(e, this) && !(e.getEntity() instanceof Player)) { + if (!e.getEntity().getCanPickupItems()) { + List extraDrops = new ArrayList<>(e.getDrops()); + + if (e.getEntity() instanceof ChestedHorse) { + for (ItemStack invItem : ((ChestedHorse) e.getEntity()).getInventory().getStorageContents()) { + extraDrops.remove(invItem); + } + + //The chest is not included in getStorageContents() + extraDrops.remove(new ItemStack(Material.CHEST)); + } + + for (ItemStack drop: extraDrops) { + e.getDrops().add(drop); + } + } + + return true; + } + else { + return false; + } + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/InfernalBonemeal.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/InfernalBonemeal.java new file mode 100644 index 000000000..515e5b6be --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/InfernalBonemeal.java @@ -0,0 +1,40 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.block.data.Ageable; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class InfernalBonemeal extends SimpleSlimefunItem { + + public InfernalBonemeal(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { + super(category, item, id, recipeType, recipe, recipeOutput); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(e.getItem(), getItem(), true)) { + if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.NETHER_WART) { + Ageable ageable = (Ageable)e.getClickedBlock().getBlockData(); + if (ageable.getAge() < ageable.getMaximumAge()) { + ageable.setAge(ageable.getMaximumAge()); + e.getClickedBlock().setBlockData(ageable); + e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, Material.REDSTONE_BLOCK); + PlayerInventory.consumeItemInHand(p); + } + } + return true; + } + return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/KnowledgeFlask.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/KnowledgeFlask.java new file mode 100644 index 000000000..9935513e2 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/KnowledgeFlask.java @@ -0,0 +1,40 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Container; +import org.bukkit.inventory.ItemStack; + +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.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class KnowledgeFlask extends SimpleSlimefunItem { + + public KnowledgeFlask(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { + super(category, item, id, recipeType, recipe, recipeOutput); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true) && p.getLevel() >= 1) { + if (e.getClickedBlock() == null || !(e.getClickedBlock().getState() instanceof Container)) { + p.setLevel(p.getLevel() - 1); + e.setCancelled(true); + p.getInventory().addItem(new CustomItem(Material.EXPERIENCE_BOTTLE, "&aFlask of Knowledge")); + + p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1F, 0.5F); + + item.setAmount(item.getAmount() - 1); + } + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/KnowledgeTome.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/KnowledgeTome.java new file mode 100644 index 000000000..833572872 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/KnowledgeTome.java @@ -0,0 +1,53 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.Research; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; + +public class KnowledgeTome extends SimpleSlimefunItem { + + public KnowledgeTome(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + List lore = item.getItemMeta().getLore(); + lore.set(0, ChatColor.translateAlternateColorCodes('&', "&7Owner: &b" + p.getName())); + lore.set(1, ChatColor.BLACK + "" + p.getUniqueId()); + ItemMeta im = item.getItemMeta(); + im.setLore(lore); + item.setItemMeta(im); + p.getEquipment().setItemInMainHand(item); + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1F, 1F); + return true; + } + else if (SlimefunManager.isItemSimiliar(item, getItem(), false)) { + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + Set researches = PlayerProfile.fromUUID(UUID.fromString(ChatColor.stripColor(item.getItemMeta().getLore().get(1)))).getResearches(); + researches.forEach(research -> profile.setResearched(research, true)); + + PlayerInventory.consumeItemInHand(p); + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/LumberAxe.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/LumberAxe.java new file mode 100644 index 000000000..67b763b92 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/LumberAxe.java @@ -0,0 +1,55 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action; +import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; +import me.mrCookieSlime.CSCoreLibPlugin.general.Block.TreeCalculator; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class LumberAxe extends SimpleSlimefunItem implements NotPlaceable { + + public LumberAxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public BlockBreakHandler getItemHandler() { + return (e, item, fortune, drops) -> { + if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), getItem(), true)) { + if (MaterialHelper.isLog( e.getBlock().getType())) { + List logs = new ArrayList<>(); + TreeCalculator.getTree(e.getBlock().getLocation(), e.getBlock().getLocation(), logs); + + if (logs.contains(e.getBlock().getLocation())) logs.remove(e.getBlock().getLocation()); + for (Location b: logs) { + if (SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), b, Action.BREAK_BLOCK)) { + b.getWorld().playEffect(b, Effect.STEP_SOUND, b.getBlock().getType()); + + for (ItemStack drop: b.getBlock().getDrops()) { + b.getWorld().dropItemNaturally(b, drop); + } + + b.getBlock().setType(Material.AIR); + } + } + } + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/MagicSugar.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/MagicSugar.java new file mode 100644 index 000000000..87c6fb3be --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/MagicSugar.java @@ -0,0 +1,36 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Sound; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class MagicSugar extends SimpleSlimefunItem { + + public MagicSugar(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.MAGIC_SUGAR, true)) { + PlayerInventory.consumeItemInHand(p); + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_GENERIC_EAT, 1, 1); + p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 600, (Integer) Slimefun.getItemValue("MAGIC_SUGAR", "effects.SPEED"))); + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/MonsterJerky.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/MonsterJerky.java new file mode 100644 index 000000000..f47f47739 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/MonsterJerky.java @@ -0,0 +1,39 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class MonsterJerky extends SimpleSlimefunItem { + + public MonsterJerky(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public ItemConsumptionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + SlimefunPlugin.instance.getServer().getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + if (p.hasPotionEffect(PotionEffectType.HUNGER)) { + p.removePotionEffect(PotionEffectType.HUNGER); + } + + p.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, 5, 0)); + }, 1L); + return true; + } + else { + return false; + } + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfContainment.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfContainment.java new file mode 100644 index 000000000..13c235d4c --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfContainment.java @@ -0,0 +1,61 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + +public class PickaxeOfContainment extends SimpleSlimefunItem { + + public PickaxeOfContainment(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public BlockBreakHandler getItemHandler() { + return (e, item, fortune, drops) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + // Refactored it into this so we don't need to call e.getBlock() all the time. + Block b = e.getBlock(); + if (b.getType() != Material.SPAWNER) return true; + + // If the spawner's BlockStorage has BlockInfo, then it's not a vanilla spawner and shouldn't give a broken spawner. + ItemStack spawner = SlimefunItems.BROKEN_SPAWNER.clone(); + if (BlockStorage.hasBlockInfo(b)) { + spawner = SlimefunItems.REPAIRED_SPAWNER.clone(); + } + + ItemMeta im = spawner.getItemMeta(); + List lore = im.getLore(); + + for (int i = 0; i < lore.size(); i++) { + if (lore.get(i).contains("")) lore.set(i, lore.get(i).replace("", StringUtils.format(((CreatureSpawner) b.getState()).getSpawnedType().toString()))); + } + + im.setLore(lore); + spawner.setItemMeta(im); + b.getLocation().getWorld().dropItemNaturally(b.getLocation(), spawner); + e.setExpToDrop(0); + e.setDropItems(false); + return true; + } + else { + if (e.getBlock().getType() == Material.SPAWNER) e.setDropItems(false); + return false; + } + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfTheSeeker.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfTheSeeker.java new file mode 100644 index 000000000..39db089c7 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfTheSeeker.java @@ -0,0 +1,69 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class PickaxeOfTheSeeker extends SimpleSlimefunItem implements DamageableItem { + + public PickaxeOfTheSeeker(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + Block closest = null; + + for (int x = -4; x <= 4; x++) { + for (int y = -4; y <= 4; y++) { + for (int z = -4; z <= 4; z++) { + if (p.getLocation().getBlock().getRelative(x, y, z).getType().toString().endsWith("_ORE")) { + if (closest == null || p.getLocation().distance(closest.getLocation()) < p.getLocation().distance(p.getLocation().getBlock().getRelative(x, y, z).getLocation())) { + closest = p.getLocation().getBlock().getRelative(x, y, z); + } + } + } + } + } + + if (closest == null) { + Messages.local.sendTranslation(p, "miner.no-ores", true); + } + else { + double l = closest.getX() + 0.5 - p.getLocation().getX(); + double w = closest.getZ() + 0.5 - p.getLocation().getZ(); + float yaw; + float pitch; + double c = Math.sqrt(l * l + w * w); + double alpha1 = -Math.asin(l / c) / Math.PI * 180; + double alpha2 = Math.acos(w / c) / Math.PI * 180; + if (alpha2 > 90) yaw = (float) (180 - alpha1); + else yaw = (float) alpha1; + pitch = (float) ((-Math.atan((closest.getY() - 0.5 - p.getLocation().getY()) / Math.sqrt(l * l + w * w))) * 180F / Math.PI); + + p.teleport(new Location(p.getWorld(), p.getLocation().getX(), p.getLocation().getY(), p.getLocation().getZ(), yaw, pitch)); + } + + damageItem(p, item); + return true; + } + else return false; + }; + } + + @Override + public boolean isDamageable() { + return true; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfVeinMining.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfVeinMining.java new file mode 100644 index 000000000..58353ddb9 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/PickaxeOfVeinMining.java @@ -0,0 +1,56 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action; +import me.mrCookieSlime.CSCoreLibPlugin.general.Block.Vein; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class PickaxeOfVeinMining extends SimpleSlimefunItem { + + public PickaxeOfVeinMining(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public BlockBreakHandler getItemHandler() { + return (e, item, fortune, drops) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + if (e.getBlock().getType().toString().endsWith("_ORE")) { + List blocks = new ArrayList<>(); + Vein.calculate(e.getBlock().getLocation(), e.getBlock().getLocation(), blocks, 16); + + for (Location block: blocks) { + if (SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), block, Action.BREAK_BLOCK)) { + Block b = block.getBlock(); + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType()); + + for (ItemStack drop: b.getDrops()) { + b.getWorld().dropItemNaturally(b.getLocation(), drop.getType().isBlock() ? drop: new CustomItem(drop, fortune)); + } + + b.setType(Material.AIR); + } + } + } + + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SeismicAxe.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SeismicAxe.java new file mode 100644 index 000000000..9c1d5b67e --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SeismicAxe.java @@ -0,0 +1,92 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class SeismicAxe extends SimpleSlimefunItem implements NotPlaceable, DamageableItem { + + public SeismicAxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SEISMIC_AXE, true)) { + List blocks = p.getLineOfSight(null, 10); + for (int i = 0; i < blocks.size(); i++) { + Block b = blocks.get(i); + Location ground = b.getLocation(); + + if (b.getType() == null || b.getType() == Material.AIR) { + for (int y = ground.getBlockY(); y > 0; y--) { + if (b.getWorld().getBlockAt(b.getX(), y, b.getZ()) != null && b.getWorld().getBlockAt(b.getX(), y, b.getZ()).getType() != null && b.getWorld().getBlockAt(b.getX(), y, b.getZ()).getType() != Material.AIR) { + ground = new Location(b.getWorld(), b.getX(), y, b.getZ()); + break; + } + } + } + + b.getWorld().playEffect(ground, Effect.STEP_SOUND, ground.getBlock().getType()); + + if (ground.getBlock().getRelative(BlockFace.UP).getType() == null || ground.getBlock().getRelative(BlockFace.UP).getType() == Material.AIR) { + Location loc = ground.getBlock().getRelative(BlockFace.UP).getLocation().add(0.5, 0.0, 0.5); + FallingBlock block = ground.getWorld().spawnFallingBlock(loc, ground.getBlock().getBlockData()); + block.setDropItem(false); + block.setVelocity(new Vector(0, 0.4 + i * 0.01, 0)); + SlimefunPlugin.getUtilities().blocks.add(block.getUniqueId()); + } + for (Entity n: ground.getChunk().getEntities()) { + if (n instanceof LivingEntity && n.getLocation().distance(ground) <= 2.0D && !n.getUniqueId().equals(p.getUniqueId())) { + Vector vector = n.getLocation().toVector().subtract(p.getLocation().toVector()).normalize().multiply(1.4); + vector.setY(0.9); + n.setVelocity(vector); + + if (p.getWorld().getPVP()) { + EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(p, n, DamageCause.ENTITY_ATTACK, 6D); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) ((LivingEntity) n).damage(6D); + } + } + } + } + + for (int i = 0; i < 4; i++) { + damageItem(p, item); + } + + return true; + } + else return false; + }; + } + + @Override + public boolean isDamageable() { + return true; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SmeltersPickaxe.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SmeltersPickaxe.java new file mode 100644 index 000000000..9309af0d4 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SmeltersPickaxe.java @@ -0,0 +1,50 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.CSCoreLibPlugin.general.Recipe.RecipeCalculator; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + +public class SmeltersPickaxe extends SimpleSlimefunItem { + + public SmeltersPickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public BlockBreakHandler getItemHandler() { + return (e, item, fortune, drops) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + if (BlockStorage.hasBlockInfo(e.getBlock())) return true; + if (e.getBlock().getType() == Material.PLAYER_HEAD) return true; + + int j = -1; + List dropsList = (List) e.getBlock().getDrops(); + for (int i = 0; i < dropsList.size(); i++) { + if (dropsList.get(i) != null) { + j++; + drops.add(e.getBlock().getType().toString().endsWith("_ORE") ? new CustomItem(dropsList.get(i), fortune): dropsList.get(i)); + if (RecipeCalculator.getSmeltedOutput(drops.get(i).getType()) != null) { + e.getBlock().getWorld().playEffect(e.getBlock().getLocation(), Effect.MOBSPAWNER_FLAMES, 1); + drops.set(j, new CustomItem(RecipeCalculator.getSmeltedOutput(drops.get(i).getType()), drops.get(i).getAmount())); + } + } + } + + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/StormStaff.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/StormStaff.java new file mode 100644 index 000000000..f4f3226a3 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/StormStaff.java @@ -0,0 +1,114 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class StormStaff extends SimpleSlimefunItem { + + private static final int MAX_USES = 8; + + public StormStaff(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe, getCraftedOutput()); + } + + private static ItemStack getCraftedOutput() { + ItemStack item = SlimefunItems.STAFF_STORM.clone(); + ItemMeta im = item.getItemMeta(); + List lore = im.getLore(); + + lore.set(4, ChatColor.translateAlternateColorCodes('&', "&e" + MAX_USES + " Uses &7left")); + + im.setLore(lore); + item.setItemMeta(im); + return item; + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + //Not checking if lores equals because we need a special one for that. + if (SlimefunManager.isItemSimiliar(item, getItem(), false)) { + + if (!item.hasItemMeta()) return false; + ItemMeta itemMeta = item.getItemMeta(); + if (!itemMeta.hasLore()) return false; + List itemLore = itemMeta.getLore(); + + ItemStack sfItem = getItem(); + ItemMeta sfItemMeta = sfItem.getItemMeta(); + List sfItemLore = sfItemMeta.getLore(); + + if (itemLore.size() < 6) { + // Index 1 and 3 in SlimefunItems.STAFF_STORM has lores with words and stuff so we check for them. + if (itemLore.get(1).equals(sfItemLore.get(1)) && itemLore.get(3).equals(sfItemLore.get(3))) { + if (p.getFoodLevel() >= 4 || p.getGameMode() == GameMode.CREATIVE) { + // Get a target block with max. 30 blocks of distance + Location loc = p.getTargetBlock(null, 30).getLocation(); + + if (loc.getWorld() != null && loc.getChunk().isLoaded()) { + if (loc.getWorld().getPVP() && SlimefunPlugin.getProtectionManager().hasPermission(p, loc, ProtectionModule.Action.PVP)) { + loc.getWorld().strikeLightning(loc); + + if (p.getInventory().getItemInMainHand().getType() != Material.SHEARS && p.getGameMode() != GameMode.CREATIVE) { + FoodLevelChangeEvent event = new FoodLevelChangeEvent(p, p.getFoodLevel() - 4); + Bukkit.getPluginManager().callEvent(event); + p.setFoodLevel(event.getFoodLevel()); + } + + for (int i = MAX_USES; i > 0; i--) { + if (i == 1 && ChatColor.translateAlternateColorCodes('&', "&e1 Use &7left").equals(itemLore.get(4))) { + e.setCancelled(true); + p.playSound(p.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1); + item.setAmount(0); + return true; + } + else if (ChatColor.translateAlternateColorCodes('&', "&e" + i + " Uses &7left").equals(itemLore.get(4))) { + itemLore.set(4, ChatColor.translateAlternateColorCodes('&', "&e" + (i - 1) + " " + (i > 2 ? "Uses": "Use") + " &7left")); + e.setCancelled(true); + + // Saving the changes to lore and item. + itemMeta.setLore(itemLore); + item.setItemMeta(itemMeta); + + return true; + } + } + + return false; + } + else { + Messages.local.sendTranslation(p, "messages.no-pvp", true); + } + } + } + else { + Messages.local.sendTranslation(p, "messages.hungry", true); + } + return true; + } + } + } + return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SwordOfBeheading.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SwordOfBeheading.java new file mode 100644 index 000000000..dae0619fe --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/SwordOfBeheading.java @@ -0,0 +1,83 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.Random; + +import org.bukkit.Material; +import org.bukkit.entity.Creeper; +import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; +import org.bukkit.entity.WitherSkeleton; +import org.bukkit.entity.Zombie; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.EntityKillHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class SwordOfBeheading extends SimpleSlimefunItem { + + private final Random random = new Random(); + + private int chanceZombie; + private int chanceSkeleton; + private int chanceCreeper; + private int chanceWitherSkeleton; + private int chancePlayer; + + public SwordOfBeheading(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public EntityKillHandler getItemHandler() { + return (e, entity, killer, item) -> { + if (SlimefunManager.isItemSimiliar(item, getItem(), true)) { + if (e.getEntity() instanceof Zombie) { + if (random.nextInt(100) < chanceZombie) { + e.getDrops().add(new ItemStack(Material.ZOMBIE_HEAD)); + } + } + else if (e.getEntity() instanceof WitherSkeleton) { + if (random.nextInt(100) < chanceWitherSkeleton) + e.getDrops().add(new ItemStack(Material.WITHER_SKELETON_SKULL)); + } + else if (e.getEntity() instanceof Skeleton) { + if (random.nextInt(100) < chanceSkeleton) + e.getDrops().add(new ItemStack(Material.SKELETON_SKULL)); + } + else if (e.getEntity() instanceof Creeper) { + if (random.nextInt(100) < chanceCreeper) { + e.getDrops().add(new ItemStack(Material.CREEPER_HEAD)); + } + } + else if (e.getEntity() instanceof Player) { + if (random.nextInt(100) < chancePlayer) { + ItemStack skull = new ItemStack(Material.PLAYER_HEAD); + ItemMeta meta = skull.getItemMeta(); + ((SkullMeta) meta).setOwningPlayer((Player) e.getEntity()); + skull.setItemMeta(meta); + + e.getDrops().add(skull); + } + } + return true; + } + else return false; + }; + } + + @Override + public void postRegister() { + chanceZombie = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.ZOMBIE"); + chanceSkeleton = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.SKELETON"); + chanceCreeper = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.CREEPER"); + chanceWitherSkeleton = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.WITHER_SKELETON"); + chancePlayer = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.PLAYER"); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/TelepositionScroll.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/TelepositionScroll.java new file mode 100644 index 000000000..96c161b74 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/TelepositionScroll.java @@ -0,0 +1,40 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Location; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class TelepositionScroll extends SimpleSlimefunItem { + + public TelepositionScroll(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SCROLL_OF_DIMENSIONAL_TELEPOSITION, true)) { + for (Entity n: p.getNearbyEntities(10.0, 10.0, 10.0)) { + if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !n.getUniqueId().equals(p.getUniqueId())) { + float yaw = n.getLocation().getYaw() + 180.0F; + if (yaw > 360.0F) yaw = yaw - 360.0F; + + n.teleport(new Location(n.getWorld(), n.getLocation().getX(), n.getLocation().getY(), n.getLocation().getZ(), yaw, n.getLocation().getPitch())); + } + } + return true; + } + else return false; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AncientPedestal.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AncientPedestal.java new file mode 100644 index 000000000..6086c4a2c --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AncientPedestal.java @@ -0,0 +1,27 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; + +import org.bukkit.entity.Item; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.ancient_altar.AncientAltarListener; + +public class AncientPedestal extends SlimefunItem { + + public AncientPedestal(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { + super(category, item, id, recipeType, recipe, recipeOutput); + + SlimefunItem.registerBlockHandler(getID(), (p, b, tool, reason) -> { + Item stack = AncientAltarListener.findItem(b); + if (stack != null) { + stack.removeMetadata("item_placed", SlimefunPlugin.instance); + b.getWorld().dropItem(b.getLocation(), AncientAltarListener.fixItemStack(stack.getItemStack(), stack.getCustomName())); + stack.remove(); + } + return true; + }); + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/BlockPlacer.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/BlockPlacer.java new file mode 100644 index 000000000..5254a4493 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/BlockPlacer.java @@ -0,0 +1,73 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.AutonomousMachineHandler; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class BlockPlacer extends SimpleSlimefunItem { + + private String[] blacklist; + + public BlockPlacer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public AutonomousMachineHandler getItemHandler() { + return (e, dispenser, d, block, chest, machine) -> { + if (machine.getID().equalsIgnoreCase(getID())) { + e.setCancelled(true); + + if ((block.getType() == null || block.getType() == Material.AIR) && e.getItem().getType().isBlock()) { + for (String blockType : blacklist) { + if (e.getItem().getType().toString().equals(blockType)) { + return false; + } + } + + SlimefunItem sfItem = SlimefunItem.getByItem(e.getItem()); + if (sfItem != null) { + if (!SlimefunPlugin.getUtilities().blockHandlers.containsKey(sfItem.getID())) { + block.setType(e.getItem().getType()); + BlockStorage.store(block, sfItem.getID()); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, e.getItem().getType()); + if (d.getInventory().containsAtLeast(e.getItem(), 2)) d.getInventory().removeItem(new CustomItem(e.getItem(), 1)); + else { + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> d.getInventory().removeItem(e.getItem()), 2L); + } + } + } + else { + block.setType(e.getItem().getType()); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, e.getItem().getType()); + if (d.getInventory().containsAtLeast(e.getItem(), 2)) d.getInventory().removeItem(new CustomItem(e.getItem(), 1)); + else { + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> d.getInventory().removeItem(e.getItem()), 2L); + } + } + } + return true; + } + else return false; + }; + } + + @Override + public void postRegister() { + List list = (List) Slimefun.getItemValue(getID(), "unplaceable-blocks"); + blacklist = list.toArray(new String[list.size()]); + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoCraftingNode.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoCraftingNode.java deleted file mode 100644 index 596bf928a..000000000 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CargoCraftingNode.java +++ /dev/null @@ -1,123 +0,0 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; -import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; -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.Setup.Messages; -import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; -import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; -import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; - -public class CargoCraftingNode extends SlimefunItem { - - private static final int[] border = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, 26, 27, 31, 32, 33, 34, 35, 36, 40, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; - - public CargoCraftingNode(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { - super(category, item, name, recipeType, recipe); - - new BlockMenuPreset(name, "&3Input Node") { - - @Override - public void init() { - constructMenu(this); - } - - @Override - public void newInstance(final BlockMenu menu, final Block b) { - try { - menu.replaceExistingItem(41, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjI1OTliZDk4NjY1OWI4Y2UyYzQ5ODg1MjVjOTRlMTlkZGQzOWZhZDA4YTM4Mjg0YTE5N2YxYjcwNjc1YWNjIn19fQ=="), "&bChannel", "", "&e> Click to decrease the Channel ID by 1")); - menu.addMenuClickHandler(41, (p, slot, item, action) -> { - int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; - if (channel < 0) channel = 15; - BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); - newInstance(menu, b); - return false; - }); - - menu.replaceExistingItem(42, new CustomItem(new ItemStack(((!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "frequency") == null) ? Material.WHITE_WOOL : MaterialHelper.WoolColours[(Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")))])), "&bChannel ID: &3" + (((!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "frequency") == null) ? 0: (Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")))) + 1))); - menu.addMenuClickHandler(42, - (p, slot, item, action) -> false - ); - - menu.replaceExistingItem(43, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzJmOTEwYzQ3ZGEwNDJlNGFhMjhhZjZjYzgxY2Y0OGFjNmNhZjM3ZGFiMzVmODhkYjk5M2FjY2I5ZGZlNTE2In19fQ=="), "&bChannel", "", "&e> Click to increase the Channel ID by 1")); - menu.addMenuClickHandler(43, (p, slot, item, action) -> { - int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; - if (channel > 15) channel = 0; - BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); - newInstance(menu, b); - return false; - }); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean canOpen(Block b, Player p) { - boolean open = CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b) || p.hasPermission("slimefun.cargo.bypass"); - if (!open) { - Messages.local.sendTranslation(p, "inventory.no-access", true); - } - return open; - } - - @Override - public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - return new int[0]; - } - }; - - registerBlockHandler(name, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString()); - BlockStorage.addBlockInfo(b, "frequency", "0"); - } - - @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); - } - } - } - return true; - } - }); - } - - protected void constructMenu(BlockMenuPreset preset) { - for (int i : border) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); - } - - preset.addItem(2, new CustomItem(new ItemStack(Material.CRAFTING_TABLE), "&eRecipe", "", "&bPut in the Recipe you want to craft"), - (p, slot, item, action) -> false - ); - } - - public int[] getInputSlots() { - return new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39}; - } - -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Composter.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Composter.java new file mode 100644 index 000000000..f68893a66 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Composter.java @@ -0,0 +1,78 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; + +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + +public class Composter extends SlimefunGadget { + + public Composter(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes) { + super(category, item, id, recipeType, recipe, machineRecipes); + } + + @Override + public void preRegister() { + addItemHandler(new ItemInteractionHandler() { + + @Override + public boolean onRightClick(ItemUseEvent e, final Player p, ItemStack item) { + if (e.getClickedBlock() != null) { + String id = BlockStorage.checkID(e.getClickedBlock()); + if (id != null && id.equals(getID())) { + if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), e.getClickedBlock(), true)) { + final ItemStack input = p.getInventory().getItemInMainHand(); + final Block b = e.getClickedBlock(); + SlimefunItem machine = SlimefunItem.getByID(id); + + for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { + if (convert != null && SlimefunManager.isItemSimiliar(input, convert, true)) { + ItemStack removing = input.clone(); + removing.setAmount(convert.getAmount()); + p.getInventory().removeItem(removing); + final ItemStack adding = RecipeType.getRecipeOutput(machine, convert); + + for (int i = 1; i < 12; i++) { + int j = i; + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + if (j < 11) { + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, input.getType().isBlock() ? input.getType() : Material.HAY_BLOCK); + } + else { + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + b.getWorld().dropItemNaturally(b.getRelative(BlockFace.UP).getLocation(), adding); + } + }, i*30L); + } + + return true; + } + } + Messages.local.sendTranslation(p, "machines.wrong-item", true); + return true; + } + return true; + } + } + return false; + } + }); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CropGrowthAccelerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CropGrowthAccelerator.java deleted file mode 100644 index 6b8f42246..000000000 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CropGrowthAccelerator.java +++ /dev/null @@ -1,174 +0,0 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; - -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.block.Block; -import org.bukkit.block.data.Ageable; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -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.Lists.SlimefunItems; -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.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 abstract class CropGrowthAccelerator extends SlimefunItem { - - private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; - - public static final Map crops = new HashMap(); - - static { - crops.put(Material.WHEAT, 7); - crops.put(Material.POTATOES, 7); - crops.put(Material.CARROTS, 7); - crops.put(Material.NETHER_WART, 3); - crops.put(Material.BEETROOTS, 3); - crops.put(Material.COCOA, 8); - } - - public CropGrowthAccelerator(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { - super(category, item, name, recipeType, recipe); - - new BlockMenuPreset(name, "&bGrowth Accelerator") { - - @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(); - return new int[0]; - } - }; - - registerBlockHandler(name, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @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); - } - } - } - return true; - } - }); - } - - protected void constructMenu(BlockMenuPreset preset) { - for (int i : border) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); - } - } - - public abstract int getEnergyConsumption(); - public abstract int getRadius(); - public abstract int getSpeed(); - - public int[] getInputSlots() { - return new int[] {10, 11, 12, 13, 14, 15, 16}; - } - - @Override - public void register(boolean slimefun) { - addItemHandler(new BlockTicker() { - - @Override - public void tick(Block b, SlimefunItem sf, Config data) { - try { - CropGrowthAccelerator.this.tick(b); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void uniqueTick() { - } - - @Override - public boolean isSynchronized() { - return true; - } - }); - - super.register(slimefun); - } - - protected void tick(Block b) throws Exception { - int work = 0; - master: - for (int x = -getRadius(); x <= getRadius(); x++) { - for (int z = -getRadius(); z <= getRadius(); z++) { - Block block = b.getRelative(x, 0, z); - if (crops.containsKey(block.getType())) { - if (((Ageable) block.getBlockData()).getAge() < crops.get(block.getType())) { - for (int slot : getInputSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), SlimefunItems.FERTILIZER, false)) { - if (work > (getSpeed() - 1)) break master; - if (ChargableBlock.getCharge(b) < getEnergyConsumption()) break master; - ChargableBlock.addCharge(b, -getEnergyConsumption()); - - Ageable ageable = (Ageable) block.getBlockData(); - ageable.setAge(ageable.getAge() + 1); - block.setBlockData(ageable); - - block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5D, 0.5D, 0.5D), 4, 0.1F, 0.1F, 0.1F); - work++; - break; - } - } - } - } - } - } - - if (work > 0) { - for (int slot : getInputSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), SlimefunItems.FERTILIZER, false)) { - BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); - break; - } - } - } - } - -} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Crucible.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Crucible.java new file mode 100644 index 000000000..d349db5f0 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Crucible.java @@ -0,0 +1,86 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Levelled; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; +import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + +public class Crucible extends SlimefunGadget { + + public Crucible(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes) { + super(category, item, id, recipeType, recipe, machineRecipes); + } + + @Override + public void preRegister() { + addItemHandler(new ItemInteractionHandler() { + + @Override + public boolean onRightClick(ItemUseEvent e, final Player p, ItemStack item) { + if (e.getClickedBlock() != null) { + String id = BlockStorage.checkID(e.getClickedBlock()); + if (id != null && id.equals("CRUCIBLE")) { + if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), e.getClickedBlock(), true)) { + final ItemStack input = p.getInventory().getItemInMainHand(); + final Block block = e.getClickedBlock().getRelative(BlockFace.UP); + SlimefunItem machine = SlimefunItem.getByID(id); + + for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { + if (input != null && SlimefunManager.isItemSimiliar(input, convert, true)) { + e.setCancelled(true); + ItemStack removing = input.clone(); + removing.setAmount(convert.getAmount()); + p.getInventory().removeItem(removing); + + for (int i = 1; i < 9; i++) { + int j = 8 - i; + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + if (input.getType() == Material.COBBLESTONE || input.getType() == Material.TERRACOTTA || MaterialHelper.isTerracotta(input.getType())) { + block.setType(Material.LAVA); + Levelled le = (Levelled) block.getBlockData(); + le.setLevel(j); + block.setBlockData(le, false); + block.getWorld().playSound(block.getLocation(), Sound.BLOCK_LAVA_POP, 1F, 1F); + } + else if (MaterialHelper.isLeavesBlock(input.getType())) { + block.setType(Material.WATER); + Levelled le = (Levelled) block.getBlockData(); + le.setLevel(j); + block.setBlockData(le, false); + block.getWorld().playSound(block.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1F, 1F); + } + }, i*50L); + } + + return true; + } + } + Messages.local.sendTranslation(p, "machines.wrong-item", true); + return true; + } + return true; + } + } + return false; + } + }); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HologramProjector.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HologramProjector.java new file mode 100644 index 000000000..5b7f2aaa4 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HologramProjector.java @@ -0,0 +1,60 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.holograms.HologramProjectorHologram; + +public class HologramProjector extends SimpleSlimefunItem { + + public HologramProjector(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { + super(category, item, id, recipeType, recipe, recipeOutput); + + SlimefunItem.registerBlockHandler(getID(), new SlimefunBlockHandler() { + + @Override + public void onPlace(Player p, Block b, SlimefunItem item) { + BlockStorage.addBlockInfo(b, "text", "&bHi, I am a Hologram, &3configure me using the Projector"); + BlockStorage.addBlockInfo(b, "offset", "-0.5"); + BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString()); + + HologramProjectorHologram.getArmorStand(b, true); + } + + @Override + public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { + HologramProjectorHologram.remove(b); + return true; + } + }); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (e.getClickedBlock() == null) return false; + + String id = BlockStorage.checkID(e.getClickedBlock()); + if (id != null && id.equals(getID())) { + e.setCancelled(true); + + if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "owner").equals(p.getUniqueId().toString())) { + HologramProjectorHologram.openEditor(p, e.getClickedBlock()); + } + + return true; + } + + return false; + }; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/InfusedHopper.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/InfusedHopper.java new file mode 100644 index 000000000..3e9374ae0 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/InfusedHopper.java @@ -0,0 +1,78 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.holograms.InfusedHopperHologram; + +public class InfusedHopper extends SimpleSlimefunItem { + + public InfusedHopper(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + + SlimefunItem.registerBlockHandler(getID(), new SlimefunBlockHandler() { + + @Override + public void onPlace(Player p, Block b, SlimefunItem item) { + InfusedHopperHologram.getArmorStand(b, true); + } + + @Override + public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { + InfusedHopperHologram.remove(b); + return true; + } + }); + } + + @Override + public BlockTicker getItemHandler() { + return new BlockTicker() { + + @Override + public void tick(Block b, SlimefunItem item, Config data) { + if (b.getType() != Material.HOPPER) { + // we're no longer a hopper, we were probably destroyed. skipping this tick. + BlockStorage.clearBlockInfo(b); + return; + } + + ArmorStand hologram = InfusedHopperHologram.getArmorStand(b, true); + boolean sound = false; + + for (Entity n: hologram.getNearbyEntities(3.5D, 3.5D, 3.5D)) { + if (n instanceof Item && !n.hasMetadata("no_pickup") && n.getLocation().distance(hologram.getLocation()) > 0.4D) { + n.setVelocity(new Vector(0, 0.1, 0)); + n.teleport(hologram); + sound = true; + } + } + + if (sound) { + b.getWorld().playSound(b.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 5F, 2F); + } + } + + @Override + public boolean isSynchronized() { + return true; + } + }; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ReactorAccessPort.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ReactorAccessPort.java index 9158a2c1a..fe8432bb9 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ReactorAccessPort.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ReactorAccessPort.java @@ -10,14 +10,13 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; 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.AReactor; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; @@ -42,26 +41,26 @@ public class ReactorAccessPort extends SlimefunItem { constructMenu(this); } - @Override - public void newInstance(BlockMenu menu, Block b) { - } - @Override public boolean canOpen(Block b, Player p) { - if(p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(),b,true)) { - - + if(p.hasPermission("slimefun.inventory.bypass") || SlimefunPlugin.getProtectionManager().hasPermission(p, b.getLocation(), Action.ACCESS_INVENTORIES)) { AReactor reactor = getReactor(b.getLocation()); - if(reactor != null) { + if (reactor != null) { boolean empty = true; BlockMenu bm = getReactorMenu(b.getLocation()); - if(bm != null) { - for(int slot:reactor.getCoolantSlots()) - if(bm.getItemInSlot(slot) != null) + + if (bm != null) { + for (int slot: reactor.getCoolantSlots()) { + if (bm.getItemInSlot(slot) != null) { empty = false; - for(int slot:reactor.getFuelSlots()) - if(bm.getItemInSlot(slot) != null) + } + } + + for (int slot: reactor.getFuelSlots()) { + if (bm.getItemInSlot(slot) != null) { empty = false; + } + } if(!empty || !p.isSneaking()) { //reactor is not empty, lets view it's inventory instead. @@ -81,13 +80,13 @@ public class ReactorAccessPort extends SlimefunItem { @Override public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); + if (flow == ItemTransportFlow.INSERT) return getInputSlots(); else return getOutputSlots(); } @Override public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) { - if (flow.equals(ItemTransportFlow.INSERT)) { + if (flow == ItemTransportFlow.INSERT) { if (SlimefunManager.isItemSimiliar(item, SlimefunItems.REACTOR_COOLANT_CELL, true)) return getCoolantSlots(); else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.NETHER_ICE_COOLANT_CELL, true)) return getCoolantSlots(); else return getFuelSlots(); @@ -96,80 +95,55 @@ public class ReactorAccessPort extends SlimefunItem { } }; - registerBlockHandler(name, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - BlockMenu inv = BlockStorage.getInventory(b); - if (inv != null) { - for (int slot : getFuelSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } - } - for (int slot : getCoolantSlots()) { - 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); - } + registerBlockHandler(name, (p, b, tool, reason) -> { + BlockMenu inv = BlockStorage.getInventory(b); + + if (inv != null) { + for (int slot : getFuelSlots()) { + if (inv.getItemInSlot(slot) != null) { + b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); + inv.replaceExistingItem(slot, null); + } + } + + for (int slot : getCoolantSlots()) { + 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); } } - return true; } + return true; }); } private 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 - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i : border_1) { - preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i : border_2) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i : border_3) { - preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } - preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), - (p, slot, item, action) -> false - ); - - preset.addItem(22, new CustomItem(SlimefunItems.PLUTONIUM, "&7Byproduct Slot", "", "&rThis Slot contains the Reactor's Byproduct", "&rsuch as &aNeptunium &ror &7Plutonium"), - (p, slot, item, action) -> false - ); - - preset.addItem(7, new CustomItem(SlimefunItems.REACTOR_COOLANT_CELL, "&bCoolant Slot", "", "&rThis Slot accepts Coolant Cells", "&4Without any Coolant Cells, your Reactor", "&4will explode"), - (p, slot, item, action) -> false - ); - - preset.addItem(7, new CustomItem(SlimefunItems.REACTOR_COOLANT_CELL, "&bCoolant Slot", "", "&rThis Slot accepts Coolant Cells", "&4Without any Coolant Cells, your Reactor", "&4will explode"), - (p, slot, item, action) -> false - ); + preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), (p, slot, item, action) -> false); + preset.addItem(22, new CustomItem(SlimefunItems.PLUTONIUM, "&7Byproduct Slot", "", "&rThis Slot contains the Reactor's Byproduct", "&rsuch as &aNeptunium &ror &7Plutonium"), (p, slot, item, action) -> false); + preset.addItem(7, new CustomItem(SlimefunItems.REACTOR_COOLANT_CELL, "&bCoolant Slot", "", "&rThis Slot accepts Coolant Cells", "&4Without any Coolant Cells, your Reactor", "&4will explode"),(p, slot, item, action) -> false); } public String getInventoryTitle() { @@ -196,8 +170,7 @@ public class ReactorAccessPort extends SlimefunItem { Location reactorL = new Location(l.getWorld(), l.getX(), l.getY() - 3, l.getZ()); SlimefunItem item = BlockStorage.check(reactorL.getBlock()); - if(item instanceof AReactor) - return (AReactor) item; + if (item instanceof AReactor) return (AReactor) item; return null; } @@ -205,10 +178,8 @@ public class ReactorAccessPort extends SlimefunItem { public BlockMenu getReactorMenu(Location l) { Location reactorL = new Location(l.getWorld(), l.getX(), l.getY() - 3, l.getZ()); - String id = BlockStorage.checkID(reactorL); - - if(id.equals("NUCLEAR_REACTOR") || id.equals("NETHERSTAR_REACTOR")) - return BlockStorage.getInventory(reactorL); + SlimefunItem item = BlockStorage.check(reactorL.getBlock()); + if (item instanceof AReactor) return BlockStorage.getInventory(l); return null; } @@ -216,12 +187,15 @@ public class ReactorAccessPort extends SlimefunItem { private static Inventory inject(Location l) { int size = BlockStorage.getInventory(l).toInventory().getSize(); Inventory inv = Bukkit.createInventory(null, size); + for (int i = 0; i < size; i++) { inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); } + for (int slot : getOutputSlots()) { inv.setItem(slot, BlockStorage.getInventory(l).getItemInSlot(slot)); } + return inv; } @@ -232,11 +206,8 @@ public class ReactorAccessPort extends SlimefunItem { for (int slot: getOutputSlots()) { BlockStorage.getInventory(l).replaceExistingItem(slot, inv.getItem(slot)); } - - for (Map.Entry entry: map.entrySet()) { - return entry.getValue(); - } - return null; + + return map.values().stream().findAny().orElse(null); } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/TrashCan.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/TrashCan.java index cdde1b4d8..25721f1f9 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/TrashCan.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/TrashCan.java @@ -2,7 +2,6 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; @@ -10,41 +9,19 @@ 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.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; -import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; -public class TrashCan extends SlimefunItem { +public class TrashCan extends SlimefunItem implements InventoryBlock { private static final int[] border = {0, 1, 2, 3, 5, 4, 6, 7, 8, 9, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; public TrashCan(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(final BlockMenu menu, final Block b) { - } - - @Override - public boolean canOpen(Block b, Player p) { - return true; - } - - @Override - public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); - return new int[0]; - } - }; + createPreset(this, "&4Trash Can", this::constructMenu); } private void constructMenu(BlockMenuPreset preset) { @@ -54,23 +31,21 @@ public class TrashCan extends SlimefunItem { ); } } - - public String getInventoryTitle() { - return "&4Trash Can"; - } + @Override public int[] getInputSlots() { return new int[] {10, 11, 12, 13, 14, 15, 16}; } + + @Override + public int[] getOutputSlots() { + return new int[0]; + } @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new BlockTicker() { - @Override - public void uniqueTick() { - } - @Override public void tick(Block b, SlimefunItem item, Config data) { BlockMenu menu = BlockStorage.getInventory(b); @@ -84,8 +59,6 @@ public class TrashCan extends SlimefunItem { return false; } }); - - super.register(slimefun); } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/XPCollector.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/XPCollector.java index adff7cc08..183faa3b9 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/XPCollector.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/XPCollector.java @@ -1,17 +1,15 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; import java.util.Iterator; +import java.util.logging.Level; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.Slimefun.Lists.RecipeType; @@ -19,42 +17,22 @@ 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.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; 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.holograms.XPCollectorHologram; -public class XPCollector extends SlimefunItem { +public class XPCollector extends SlimefunItem implements InventoryBlock { private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; public XPCollector(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); - - new BlockMenuPreset(name, "&aEXP Collector") { - - @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.WITHDRAW)) return getOutputSlots(); - return new int[0]; - } - }; + createPreset(this, "&aEXP Collector", this::constructMenu); registerBlockHandler(name, new SlimefunBlockHandler() { @@ -65,7 +43,7 @@ public class XPCollector extends SlimefunItem { @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - me.mrCookieSlime.Slimefun.holograms.XPCollector.getArmorStand(b).remove(); + XPCollectorHologram.remove(b); BlockMenu inv = BlockStorage.getInventory(b); if (inv != null) { for (int slot: getOutputSlots()) { @@ -79,32 +57,13 @@ public class XPCollector extends SlimefunItem { } }); } - - 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++) { - inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); - } - 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 int[] getInputSlots() { + return new int[0]; } + @Override public int[] getOutputSlots() { return new int[] {12, 13, 14}; } @@ -122,33 +81,27 @@ public class XPCollector extends SlimefunItem { } @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new BlockTicker() { @Override public void tick(Block b, SlimefunItem sf, Config data) { try { XPCollector.this.tick(b); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while ticking an Exp Collector for Slimefun " + Slimefun.getVersion(), x); } } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return true; } }); - - super.register(slimefun); } - protected void tick(Block b) throws Exception { - Iterator iterator = me.mrCookieSlime.Slimefun.holograms.XPCollector.getArmorStand(b).getNearbyEntities(4D, 4D, 4D).iterator(); + protected void tick(Block b) { + Iterator iterator = XPCollectorHologram.getArmorStand(b, true).getNearbyEntities(4D, 4D, 4D).iterator(); while (iterator.hasNext()) { Entity n = iterator.next(); if (n instanceof ExperienceOrb) { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AnimalGrowthAccelerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AnimalGrowthAccelerator.java similarity index 53% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AnimalGrowthAccelerator.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AnimalGrowthAccelerator.java index 87d5378ae..e0d2774d4 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AnimalGrowthAccelerator.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AnimalGrowthAccelerator.java @@ -1,22 +1,6 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -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.Lists.SlimefunItems; -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.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; +import java.util.logging.Level; import org.bukkit.Material; import org.bukkit.Particle; @@ -24,68 +8,51 @@ import org.bukkit.block.Block; import org.bukkit.entity.Ageable; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -public class AnimalGrowthAccelerator extends SlimefunItem { +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +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.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; +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.AnimalGrowthAcceleratorHologram; + +public class AnimalGrowthAccelerator extends SlimefunItem implements InventoryBlock { private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; public AnimalGrowthAccelerator(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); + createPreset(this, "&bGrowth Accelerator", this::constructMenu); - new BlockMenuPreset(name, "&bGrowth Accelerator") { - - @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(); - return new int[0]; - } - }; - - registerBlockHandler(name, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - me.mrCookieSlime.Slimefun.holograms.AnimalGrowthAccelerator.getArmorStand(b).remove(); - 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); - } + registerBlockHandler(name, (p, b, tool, reason) -> { + AnimalGrowthAcceleratorHologram.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); } } - return true; } + return true; }); } - protected void constructMenu(BlockMenuPreset preset) { + private void constructMenu(BlockMenuPreset preset) { for (int i : border) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } } @@ -93,38 +60,38 @@ public class AnimalGrowthAccelerator extends SlimefunItem { return 14; } + @Override public int[] getInputSlots() { return new int[] {10, 11, 12, 13, 14, 15, 16}; } @Override - public void register(boolean slimefun) { + public int[] getOutputSlots() { + return new int[0]; + } + + @Override + public void preRegister() { addItemHandler(new BlockTicker() { @Override public void tick(Block b, SlimefunItem sf, Config data) { try { AnimalGrowthAccelerator.this.tick(b); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while ticking an Animal Growth Accelerator for Slimefun " + Slimefun.getVersion(), x); } } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return true; } }); - - super.register(slimefun); } - protected void tick(Block b) throws Exception { - for (Entity n : me.mrCookieSlime.Slimefun.holograms.AnimalGrowthAccelerator.getArmorStand(b).getNearbyEntities(3D, 3D, 3D)) { + protected void tick(Block b) { + for (Entity n : AnimalGrowthAcceleratorHologram.getArmorStand(b, true).getNearbyEntities(3D, 3D, 3D)) { if (n instanceof Ageable && !((Ageable) n).isAdult()) { for (int slot: getInputSlots()) { if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), SlimefunItems.ORGANIC_FOOD, false)) { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoAnvil.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoAnvil.java similarity index 54% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoAnvil.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoAnvil.java index 44ac5ecba..c1e18d108 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoAnvil.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoAnvil.java @@ -1,7 +1,10 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; -import java.util.ArrayList; -import java.util.List; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; @@ -14,12 +17,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecip import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; public abstract class AutoAnvil extends AContainer { @@ -36,9 +34,6 @@ public abstract class AutoAnvil extends AContainer { public ItemStack getProgressBar() { return new ItemStack(Material.IRON_PICKAXE); } - - @Override - public void registerDefaultRecipes() {} @Override public int getSpeed() { @@ -57,18 +52,7 @@ public abstract class AutoAnvil extends AContainer { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; @@ -86,34 +70,35 @@ public abstract class AutoAnvil extends AContainer { } } else { - MachineRecipe r = null; - slots: + BlockMenu menu = BlockStorage.getInventory(b); + MachineRecipe recipe = null; + for (int slot: getInputSlots()) { - ItemStack target = BlockStorage.getInventory(b).getItemInSlot(slot == getInputSlots()[0] ? getInputSlots()[1]: getInputSlots()[0]); - ItemStack item = BlockStorage.getInventory(b).getItemInSlot(slot); - if (item != null) { - if (item.getType().getMaxDurability() > 0 && ((Damageable) item.getItemMeta()).getDamage() > 0) { - if (SlimefunManager.isItemSimiliar(target, SlimefunItems.DUCT_TAPE, true)) { - ItemStack newItem = item.clone(); - short durability = (short) (((Damageable) newItem.getItemMeta()).getDamage() - (item.getType().getMaxDurability() / getRepairFactor())); - if (durability < 0) durability = 0; - ItemMeta meta = newItem.getItemMeta(); - ((Damageable) meta).setDamage(durability); - newItem.setItemMeta(meta); - r = new MachineRecipe(30, new ItemStack[] {target, item}, new ItemStack[] {newItem}); - } - break slots; + ItemStack target = menu.getItemInSlot(slot == getInputSlots()[0] ? getInputSlots()[1]: getInputSlots()[0]); + ItemStack item = menu.getItemInSlot(slot); + + if (item != null && item.getType().getMaxDurability() > 0 && ((Damageable) item.getItemMeta()).getDamage() > 0) { + if (SlimefunManager.isItemSimiliar(target, SlimefunItems.DUCT_TAPE, true)) { + ItemStack newItem = item.clone(); + short durability = (short) (((Damageable) newItem.getItemMeta()).getDamage() - (item.getType().getMaxDurability() / getRepairFactor())); + if (durability < 0) durability = 0; + ItemMeta meta = newItem.getItemMeta(); + ((Damageable) meta).setDamage(durability); + newItem.setItemMeta(meta); + recipe = new MachineRecipe(30, new ItemStack[] {target, item}, new ItemStack[] {newItem}); } + break; } } - if (r != null) { - if (!fits(b, r.getOutput())) return; + if (recipe != null) { + if (!fits(b, recipe.getOutput())) return; + for (int slot: getInputSlots()) { - BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); + menu.replaceExistingItem(slot, InvUtils.decreaseItem(menu.getItemInSlot(slot), 1)); } - processing.put(b, r); - progress.put(b, r.getTicks()); + processing.put(b, recipe); + progress.put(b, recipe.getTicks()); } } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoBreeder.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoBreeder.java similarity index 55% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoBreeder.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoBreeder.java index 4e14ec93e..9f334880b 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoBreeder.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoBreeder.java @@ -1,14 +1,14 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import java.util.logging.Level; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; @@ -16,75 +16,43 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.World.Animals; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; 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.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; 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.holograms.AutoBreederHologram; -public class AutoBreeder extends SlimefunItem { +public class AutoBreeder extends SlimefunItem implements InventoryBlock { private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; public AutoBreeder(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); + createPreset(this, "&6Auto Breeder", this::constructMenu); - new BlockMenuPreset(name, "&6Auto Breeder") { - - @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(); - return new int[0]; - } - }; - - registerBlockHandler(name, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - me.mrCookieSlime.Slimefun.holograms.AutoBreeder.getArmorStand(b).remove(); - 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); - } + registerBlockHandler(name, (p, b, tool, reason) -> { + AutoBreederHologram.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); } } - return true; } + return true; }); } protected void constructMenu(BlockMenuPreset preset) { for (int i : border) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } } @@ -92,38 +60,38 @@ public class AutoBreeder extends SlimefunItem { return 60; } + @Override public int[] getInputSlots() { return new int[] {10, 11, 12, 13, 14, 15, 16}; } @Override - public void register(boolean slimefun) { + public int[] getOutputSlots() { + return new int[0]; + } + + @Override + public void preRegister() { addItemHandler(new BlockTicker() { @Override public void tick(Block b, SlimefunItem sf, Config data) { try { AutoBreeder.this.tick(b); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while ticking an Auto Breeder for Slimefun " + Slimefun.getVersion(), x); } } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return true; } }); - - super.register(slimefun); } protected void tick(Block b) throws Exception { - for (Entity n : me.mrCookieSlime.Slimefun.holograms.AutoBreeder.getArmorStand(b).getNearbyEntities(4D, 2D, 4D)) { + for (Entity n : AutoBreederHologram.getArmorStand(b, true).getNearbyEntities(4D, 2D, 4D)) { if (Animals.isFeedable(n)) { for (int slot : getInputSlots()) { if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), SlimefunItems.ORGANIC_FOOD, false)) { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoDisenchanter.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoDisenchanter.java similarity index 66% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoDisenchanter.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoDisenchanter.java index f23221ec0..4a4b937a8 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoDisenchanter.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoDisenchanter.java @@ -1,9 +1,7 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -11,14 +9,13 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.EmeraldEnchants.EmeraldEnchants; import me.mrCookieSlime.EmeraldEnchants.ItemEnchantment; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; @@ -26,8 +23,8 @@ 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.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; public class AutoDisenchanter extends AContainer { @@ -45,9 +42,6 @@ public class AutoDisenchanter extends AContainer { return new ItemStack(Material.DIAMOND_CHESTPLATE); } - @Override - public void registerDefaultRecipes() {} - @Override public int getEnergyConsumption() { return 9; @@ -58,18 +52,7 @@ public class AutoDisenchanter extends AContainer { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; @@ -87,22 +70,27 @@ public class AutoDisenchanter extends AContainer { } } else { - MachineRecipe r = null; - Map enchantments = new HashMap(); - Set enchantments2 = new HashSet(); - slots: + BlockMenu menu = BlockStorage.getInventory(b); + MachineRecipe recipe = null; + Map enchantments = new HashMap<>(); + Set enchantments2 = new HashSet<>(); + for (int slot: getInputSlots()) { - ItemStack target = BlockStorage.getInventory(b).getItemInSlot(slot == getInputSlots()[0] ? getInputSlots()[1]: getInputSlots()[0]); - ItemStack item = BlockStorage.getInventory(b).getItemInSlot(slot); + ItemStack target = menu.getItemInSlot(slot == getInputSlots()[0] ? getInputSlots()[1]: getInputSlots()[0]); + ItemStack item = menu.getItemInSlot(slot); // Check if disenchantable SlimefunItem sfItem = null; - if ((item != null) && (item.getType() != Material.BOOK)) { // stops endless checks of getByItem for empty book stacks. + + // stops endless checks of getByItem for empty book stacks. + if ((item != null) && (item.getType() != Material.BOOK)) { sfItem = SlimefunItem.getByItem(item); } - if (sfItem != null && !sfItem.isDisenchantable()) return; + if (sfItem != null && !sfItem.isDisenchantable()) { + return; + } - // Disenchant + // Disenchanting if (item != null && target != null && target.getType() == Material.BOOK) { int amount = 0; @@ -110,7 +98,7 @@ public class AutoDisenchanter extends AContainer { enchantments.put(e.getKey(), e.getValue()); amount++; } - if (Slimefun.isEmeraldEnchantsInstalled()) { + if (SlimefunPlugin.getHooks().isEmeraldEnchantsInstalled()) { for (ItemEnchantment enchantment: EmeraldEnchants.getInstance().getRegistry().getEnchantments(item)) { amount++; enchantments2.add(enchantment); @@ -123,6 +111,7 @@ public class AutoDisenchanter extends AContainer { book.setAmount(1); book.setType(Material.ENCHANTED_BOOK); EnchantmentStorageMeta meta = (EnchantmentStorageMeta) book.getItemMeta(); + for (Map.Entry e: enchantments.entrySet()) { newItem.removeEnchantment(e.getKey()); meta.addStoredEnchant(e.getKey(), e.getValue(), true); @@ -133,19 +122,22 @@ public class AutoDisenchanter extends AContainer { EmeraldEnchants.getInstance().getRegistry().applyEnchantment(book, e.getEnchantment(), e.getLevel()); EmeraldEnchants.getInstance().getRegistry().applyEnchantment(newItem, e.getEnchantment(), 0); } - r = new MachineRecipe(100 * amount, new ItemStack[] {target, item}, new ItemStack[] {newItem, book}); - break slots; + + recipe = new MachineRecipe(100 * amount, new ItemStack[] {target, item}, new ItemStack[] {newItem, book}); + break; } } } - if (r != null) { - if (!fits(b, r.getOutput())) return; + if (recipe != null) { + if (!fits(b, recipe.getOutput())) return; + for (int slot: getInputSlots()) { - BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); + menu.replaceExistingItem(slot, InvUtils.decreaseItem(menu.getItemInSlot(slot), 1)); } - processing.put(b, r); - progress.put(b, r.getTicks()); + + processing.put(b, recipe); + progress.put(b, recipe.getTicks()); } } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoDrier.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoDrier.java new file mode 100644 index 000000000..43e08855d --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoDrier.java @@ -0,0 +1,151 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +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.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +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.RecipeDisplayItem; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; + +public class AutoDrier extends AContainer implements RecipeDisplayItem { + + private final List recipeList = new ArrayList<>(); + + public AutoDrier(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + + recipeList.add(new ItemStack(Material.ROTTEN_FLESH)); + recipeList.add(new ItemStack(Material.LEATHER)); + + recipeList.add(new ItemStack(Material.WET_SPONGE)); + recipeList.add(new ItemStack(Material.SPONGE)); + + recipeList.add(new ItemStack(Material.KELP)); + recipeList.add(new ItemStack(Material.DRIED_KELP)); + + recipeList.add(new ItemStack(Material.COOKED_BEEF)); + recipeList.add(SlimefunItems.BEEF_JERKY); + + recipeList.add(new ItemStack(Material.POTION)); + recipeList.add(new ItemStack(Material.GLASS_BOTTLE)); + + recipeList.add(new ItemStack(Material.OAK_SAPLING)); + recipeList.add(new ItemStack(Material.STICK, 2)); + + recipeList.add(new ItemStack(Material.OAK_LEAVES)); + recipeList.add(new ItemStack(Material.STICK)); + + recipeList.add(new ItemStack(Material.WATER_BUCKET)); + recipeList.add(new ItemStack(Material.BUCKET)); + } + + @Override + public String getInventoryTitle() { + return "&eAuto Drier"; + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.FLINT_AND_STEEL); + } + + @Override + public List getDisplayRecipes() { + return recipeList; + } + + @Override + protected void tick(Block b) { + if (isProcessing(b)) { + int timeleft = progress.get(b); + if (timeleft > 0) { + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); + + if (ChargableBlock.isChargable(b)) { + if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; + ChargableBlock.addCharge(b, -getEnergyConsumption()); + progress.put(b, timeleft - 1); + } + else progress.put(b, timeleft - 1); + } + else { + BlockStorage.getInventory(b).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " ")); + pushItems(b, processing.get(b).getOutput()); + + progress.remove(b); + processing.remove(b); + } + } + else { + MachineRecipe r = null; + int inputSlot = -1; + + for (int slot: getInputSlots()) { + ItemStack item = BlockStorage.getInventory(b).getItemInSlot(slot); + if (item != null) { + Material mat = item.getType(); + ItemStack output = null; + + for (int i = 0; i < recipeList.size(); i += 2) { + if (SlimefunManager.isItemSimiliar(item, recipeList.get(i), true)) { + output = recipeList.get(i + 1); + } + } + + if (Tag.SAPLINGS.isTagged(mat)) { + output = new ItemStack(Material.STICK, 2); + } + else if (Tag.LEAVES.isTagged(mat)) { + output = new ItemStack(Material.STICK, 1); + } + else if (mat == Material.SPLASH_POTION || mat == Material.LINGERING_POTION) { + output = new ItemStack(Material.GLASS_BOTTLE); + } + + if (output != null) { + r = new MachineRecipe(6, new ItemStack[] {item}, new ItemStack[] {output.clone()}); + inputSlot = slot; + break; + } + } + } + + if (r != null) { + if (inputSlot == -1) return; + if (!fits(b, r.getOutput())) return; + BlockStorage.getInventory(b).replaceExistingItem(inputSlot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(inputSlot), 1)); + processing.put(b, r); + progress.put(b, r.getTicks()); + } + } + } + + @Override + public int getEnergyConsumption() { + return 5; + } + + @Override + public int getSpeed() { + return 1; + } + + @Override + public String getMachineIdentifier() { + return "AUTO_DRIER"; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoEnchanter.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoEnchanter.java similarity index 65% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoEnchanter.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoEnchanter.java index 6febd2a0f..e1250db32 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoEnchanter.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutoEnchanter.java @@ -1,16 +1,21 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; + import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.EmeraldEnchants.EmeraldEnchants; import me.mrCookieSlime.EmeraldEnchants.ItemEnchantment; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; @@ -18,21 +23,11 @@ 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.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import org.bukkit.inventory.meta.ItemMeta; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; public class AutoEnchanter extends AContainer { - public static int max_emerald_enchantments = 2; - public AutoEnchanter(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); } @@ -47,9 +42,6 @@ public class AutoEnchanter extends AContainer { return new ItemStack(Material.GOLDEN_CHESTPLATE); } - @Override - public void registerDefaultRecipes() {} - @Override public int getEnergyConsumption() { return 9; @@ -60,19 +52,8 @@ public class AutoEnchanter extends AContainer { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); - + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); + if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; ChargableBlock.addCharge(b, -getEnergyConsumption()); @@ -89,60 +70,68 @@ public class AutoEnchanter extends AContainer { } } else { - MachineRecipe r = null; - slots: + BlockMenu menu = BlockStorage.getInventory(b.getLocation()); + MachineRecipe recipe = null; + for (int slot: getInputSlots()) { - ItemStack target = BlockStorage.getInventory(b).getItemInSlot(slot == getInputSlots()[0] ? getInputSlots()[1]: getInputSlots()[0]); + ItemStack target = menu.getItemInSlot(slot == getInputSlots()[0] ? getInputSlots()[1]: getInputSlots()[0]); // Check if enchantable SlimefunItem sfTarget = SlimefunItem.getByItem(target); if(sfTarget != null && !sfTarget.isEnchantable()) return; - ItemStack item = BlockStorage.getInventory(b).getItemInSlot(slot); + ItemStack item = menu.getItemInSlot(slot); // Enchant if (item != null && item.getType() == Material.ENCHANTED_BOOK && target != null) { - Map enchantments = new HashMap(); - Set enchantments2 = new HashSet(); + Map enchantments = new HashMap<>(); + Set enchantments2 = new HashSet<>(); int amount = 0; - int special_amount = 0; + int specialAmount = 0; EnchantmentStorageMeta meta = (EnchantmentStorageMeta) item.getItemMeta(); + for (Map.Entry e: meta.getStoredEnchants().entrySet()) { if (e.getKey().canEnchantItem(target)) { amount++; enchantments.put(e.getKey(), e.getValue()); } } - if (Slimefun.isEmeraldEnchantsInstalled()) { + + if (SlimefunPlugin.getHooks().isEmeraldEnchantsInstalled()) { for (ItemEnchantment enchantment: EmeraldEnchants.getInstance().getRegistry().getEnchantments(item)) { if (EmeraldEnchants.getInstance().getRegistry().isApplicable(target, enchantment.getEnchantment()) && EmeraldEnchants.getInstance().getRegistry().getEnchantmentLevel(target, enchantment.getEnchantment().getName()) < enchantment.getLevel()) { amount++; - special_amount++; + specialAmount++; enchantments2.add(enchantment); } } - special_amount += EmeraldEnchants.getInstance().getRegistry().getEnchantments(target).size(); + specialAmount += EmeraldEnchants.getInstance().getRegistry().getEnchantments(target).size(); } - if (amount > 0 && special_amount <= max_emerald_enchantments) { + + if (amount > 0 && specialAmount <= SlimefunPlugin.getSettings().emeraldEnchantsLimit) { ItemStack newItem = target.clone(); for (Map.Entry e: enchantments.entrySet()) { newItem.addUnsafeEnchantment(e.getKey(), e.getValue()); } + for (ItemEnchantment e: enchantments2) { EmeraldEnchants.getInstance().getRegistry().applyEnchantment(newItem, e.getEnchantment(), e.getLevel()); } - r = new MachineRecipe(75 * amount, new ItemStack[] {target, item}, new ItemStack[] {newItem, new ItemStack(Material.BOOK)}); + + recipe = new MachineRecipe(75 * amount, new ItemStack[] {target, item}, new ItemStack[] {newItem, new ItemStack(Material.BOOK)}); } - break slots; + break; } } - if (r != null) { - if (!fits(b, r.getOutput())) return; + if (recipe != null) { + if (!fits(b, recipe.getOutput())) return; + for (int slot: getInputSlots()) { - BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); + menu.replaceExistingItem(slot, InvUtils.decreaseItem(menu.getItemInSlot(slot), 1)); } - processing.put(b, r); - progress.put(b, r.getTicks()); + + processing.put(b, recipe); + progress.put(b, recipe.getTicks()); } } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutomatedCraftingChamber.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutomatedCraftingChamber.java similarity index 79% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutomatedCraftingChamber.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutomatedCraftingChamber.java index a3f19ea75..8ac0a250f 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutomatedCraftingChamber.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/AutomatedCraftingChamber.java @@ -1,17 +1,13 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -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 me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; @@ -22,12 +18,14 @@ 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.SlimefunPlugin; 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.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; @@ -35,13 +33,11 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; import me.mrCookieSlime.Slimefun.api.item_transport.RecipeSorter; -public abstract class AutomatedCraftingChamber extends SlimefunItem { +public abstract class AutomatedCraftingChamber extends SlimefunItem implements InventoryBlock { 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 recipes = new HashMap(); public AutomatedCraftingChamber(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); @@ -85,9 +81,9 @@ public abstract class AutomatedCraftingChamber extends SlimefunItem { @Override public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) { - if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots(); + if (flow == ItemTransportFlow.WITHDRAW) return getOutputSlots(); - List slots = new ArrayList(); + List slots = new ArrayList<>(); for (int slot : getInputSlots()) { if (menu.getItemInSlot(slot) != null) slots.add(slot); } @@ -134,19 +130,15 @@ public abstract class AutomatedCraftingChamber extends SlimefunItem { 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 - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } + for (int i : border_in) { - preset.addItem(i, new CustomItem(new ItemStack(Material.BLUE_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.BLUE_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(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i : getOutputSlots()) { @@ -164,48 +156,23 @@ public abstract class AutomatedCraftingChamber extends SlimefunItem { }); } - preset.addItem(2, new CustomItem(new ItemStack(Material.CRAFTING_TABLE), "&eRecipe", "", "&bPut in the Recipe you want to craft", "&4Enhanced Crafting Table Recipes ONLY"), - (p, slot, item, action) -> false - ); + preset.addItem(2, new CustomItem(new ItemStack(Material.CRAFTING_TABLE), "&eRecipe", "", "&bPut in the Recipe you want to craft", "&4Enhanced Crafting Table Recipes ONLY"), (p, slot, item, action) -> false); } public abstract int getEnergyConsumption(); - + + @Override public int[] getInputSlots() { return new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39}; } + @Override 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++) { - inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); - } - 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) { + public void preRegister() { addItemHandler(new BlockTicker() { @Override @@ -213,17 +180,11 @@ public abstract class AutomatedCraftingChamber extends SlimefunItem { AutomatedCraftingChamber.this.tick(b); } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return false; } }); - - super.register(slimefun); } protected void tick(Block b) { @@ -240,9 +201,7 @@ public abstract class AutomatedCraftingChamber extends SlimefunItem { } ItemStack item = menu.getItemInSlot(getInputSlots()[j]); - if (item != null && item.getAmount() == 1) return; - builder.append(CustomItemSerializer.serialize(item, ItemFlag.MATERIAL, ItemFlag.ITEMMETA_DISPLAY_NAME, ItemFlag.ITEMMETA_LORE)); i++; @@ -250,11 +209,11 @@ public abstract class AutomatedCraftingChamber extends SlimefunItem { String input = builder.toString(); - if (recipes.containsKey(input)) { - ItemStack output = recipes.get(input).clone(); + if (SlimefunPlugin.getUtilities().automatedCraftingChamberRecipes.containsKey(input)) { + ItemStack output = SlimefunPlugin.getUtilities().automatedCraftingChamberRecipes.get(input).clone(); - if (fits(b, new ItemStack[] {output})) { - pushItems(b, new ItemStack[] {output}); + if (fits(b, output)) { + pushItems(b, 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)); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CarbonPress.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/CarbonPress.java similarity index 77% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CarbonPress.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/CarbonPress.java index b49e7cdd8..831200b03 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/CarbonPress.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/CarbonPress.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -8,8 +8,9 @@ import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; -public abstract class CarbonPress extends AContainer { +public abstract class CarbonPress extends AContainer implements RecipeDisplayItem { public CarbonPress(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); @@ -30,6 +31,14 @@ public abstract class CarbonPress extends AContainer { return "CARBON_PRESS"; } - + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.DIAMOND_PICKAXE); + } + + @Override + public String getInventoryTitle() { + return "&cCarbon Press"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ChargingBench.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ChargingBench.java similarity index 68% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ChargingBench.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ChargingBench.java index 7098faf85..a58137ac9 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ChargingBench.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ChargingBench.java @@ -1,48 +1,20 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; -import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; -import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; -import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; public class ChargingBench extends AContainer { public ChargingBench(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(); - } - }; } @Override @@ -61,8 +33,6 @@ public class ChargingBench extends AContainer { } @Override - public void registerDefaultRecipes() {} - protected void tick(Block b) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/CropGrowthAccelerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/CropGrowthAccelerator.java new file mode 100644 index 000000000..493b2805b --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/CropGrowthAccelerator.java @@ -0,0 +1,143 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import java.util.EnumMap; +import java.util.Map; +import java.util.logging.Level; + +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +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.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; + +public abstract class CropGrowthAccelerator extends SlimefunItem implements InventoryBlock { + + private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; + private static final Map crops = new EnumMap<>(Material.class); + + static { + crops.put(Material.WHEAT, 7); + crops.put(Material.POTATOES, 7); + crops.put(Material.CARROTS, 7); + crops.put(Material.NETHER_WART, 3); + crops.put(Material.BEETROOTS, 3); + crops.put(Material.COCOA, 8); + crops.put(Material.SWEET_BERRY_BUSH, 3); + } + + public CropGrowthAccelerator(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, name, recipeType, recipe); + createPreset(this, "&bGrowth Accelerator", this::constructMenu); + + registerBlockHandler(name, (p, b, tool, 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); + } + } + } + return true; + }); + } + + protected void constructMenu(BlockMenuPreset preset) { + for (int i : border) { + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), + (p, slot, item, action) -> false + ); + } + } + + public abstract int getEnergyConsumption(); + public abstract int getRadius(); + public abstract int getSpeed(); + + @Override + public int[] getInputSlots() { + return new int[] {10, 11, 12, 13, 14, 15, 16}; + } + + @Override + public int[] getOutputSlots() { + return new int[0]; + } + + @Override + public void preRegister() { + addItemHandler(new BlockTicker() { + + @Override + public void tick(Block b, SlimefunItem sf, Config data) { + try { + CropGrowthAccelerator.this.tick(b); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while ticking a Crop Growth Accelerator for Slimefun " + Slimefun.getVersion(), x); + } + } + + @Override + public boolean isSynchronized() { + return true; + } + }); + } + + protected void tick(Block b) { + if (work(b) > 0) { + for (int slot : getInputSlots()) { + if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), SlimefunItems.FERTILIZER, false)) { + BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); + break; + } + } + } + } + + private int work(Block b) { + int work = 0; + + for (int x = -getRadius(); x <= getRadius(); x++) { + for (int z = -getRadius(); z <= getRadius(); z++) { + Block block = b.getRelative(x, 0, z); + if (crops.containsKey(block.getType()) && ((Ageable) block.getBlockData()).getAge() < crops.get(block.getType())) { + for (int slot : getInputSlots()) { + if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), SlimefunItems.FERTILIZER, false)) { + if (work > (getSpeed() - 1) || ChargableBlock.getCharge(b) < getEnergyConsumption()) return work; + ChargableBlock.addCharge(b, -getEnergyConsumption()); + + Ageable ageable = (Ageable) block.getBlockData(); + ageable.setAge(ageable.getAge() + 1); + block.setBlockData(ageable); + + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5D, 0.5D, 0.5D), 4, 0.1F, 0.1F, 0.1F); + work++; + return work; + } + } + } + } + } + + return work; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricDustWasher.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricDustWasher.java similarity index 65% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricDustWasher.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricDustWasher.java index f16e1169b..cf12b836c 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricDustWasher.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricDustWasher.java @@ -1,29 +1,27 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; -import java.util.ArrayList; -import java.util.List; +import java.util.Random; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; 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.multiblocks.OreWasher; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; - public abstract class ElectricDustWasher extends AContainer { - + public ElectricDustWasher(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); } @@ -37,29 +35,15 @@ public abstract class ElectricDustWasher extends AContainer { public ItemStack getProgressBar() { return new ItemStack(Material.GOLDEN_SHOVEL); } - - @Override - public void registerDefaultRecipes() {} public abstract int getSpeed(); - public static boolean legacy_dust_washer = false; - + + @Override protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0 && getSpeed() < 10) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; @@ -82,29 +66,21 @@ public abstract class ElectricDustWasher extends AContainer { else { for (int slot: getInputSlots()) { if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), SlimefunItems.SIFTED_ORE, true)) { - if (!legacy_dust_washer) { - boolean empty_slot = false; + if (!SlimefunPlugin.getSettings().legacyDustWasher) { + boolean emptySlot = false; + for (int output_slot: getOutputSlots()) { if (BlockStorage.getInventory(b).getItemInSlot(output_slot) == null) { - empty_slot = true; + emptySlot = true; break; } } - if (!empty_slot) return; + if (!emptySlot) return; } - - ItemStack adding = SlimefunItems.IRON_DUST; - if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.GOLD_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.ALUMINUM_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.COPPER_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.ZINC_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.TIN_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.MAGNESIUM_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.LEAD_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.SILVER_DUST; + ItemStack adding = OreWasher.items[new Random().nextInt(OreWasher.items.length)]; MachineRecipe r = new MachineRecipe(4 / getSpeed(), new ItemStack[0], new ItemStack[] {adding}); - if (legacy_dust_washer && !fits(b, r.getOutput())) return; + if (SlimefunPlugin.getSettings().legacyDustWasher && !fits(b, r.getOutput())) return; BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); processing.put(b, r); progress.put(b, r.getTicks()); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricFurnace.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricFurnace.java similarity index 88% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricFurnace.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricFurnace.java index 12b736ab1..906d9578c 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricFurnace.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricFurnace.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import java.util.Iterator; @@ -30,8 +30,9 @@ public abstract class ElectricFurnace extends AContainer { } //Bukkit Recipe Iterator does not seem to include _LOG's of any type for charcoal... Manually adding them all. - for(Material mat:Tag.LOGS.getValues()) + for (Material mat:Tag.LOGS.getValues()) { registerRecipe(4, new ItemStack[] {new ItemStack(mat,1)}, new ItemStack[] {new ItemStack(Material.CHARCOAL, 1)}); + } } @Override diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricGoldPan.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricGoldPan.java similarity index 78% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricGoldPan.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricGoldPan.java index 3da5401f5..6da65a837 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricGoldPan.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricGoldPan.java @@ -1,8 +1,12 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; @@ -12,18 +16,24 @@ import me.mrCookieSlime.Slimefun.Objects.Category; 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.RecipeDisplayItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; - -public abstract class ElectricGoldPan extends AContainer { +public abstract class ElectricGoldPan extends AContainer implements RecipeDisplayItem { + private final List displayRecipes = Arrays.asList( + new ItemStack(Material.GRAVEL), + SlimefunItems.SIFTED_ORE, + + new ItemStack(Material.GRAVEL), + new ItemStack(Material.FLINT), + + new ItemStack(Material.GRAVEL), + new ItemStack(Material.CLAY_BALL) + ); + public ElectricGoldPan(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); } @@ -37,28 +47,15 @@ public abstract class ElectricGoldPan extends AContainer { public ItemStack getProgressBar() { return new ItemStack(Material.DIAMOND_SHOVEL); } - - @Override - public void registerDefaultRecipes() {} public abstract int getSpeed(); - + + @Override protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0 && getSpeed() < 10) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; @@ -100,5 +97,10 @@ public abstract class ElectricGoldPan extends AContainer { public String getMachineIdentifier() { return "ELECTRIC_GOLD_PAN"; } + + @Override + public List getDisplayRecipes() { + return displayRecipes; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricIngotFactory.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricIngotFactory.java similarity index 81% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricIngotFactory.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricIngotFactory.java index e5cf51356..ee0c76b9c 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricIngotFactory.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricIngotFactory.java @@ -1,15 +1,16 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecipe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -public abstract class ElectricIngotFactory extends AContainer { +public abstract class ElectricIngotFactory extends AContainer implements RecipeDisplayItem { public ElectricIngotFactory(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); @@ -32,5 +33,15 @@ public abstract class ElectricIngotFactory extends AContainer { public String getMachineIdentifier() { return "ELECTRIC_INGOT_FACTORY"; } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.FLINT_AND_STEEL); + } + + @Override + public String getInventoryTitle() { + return "&cElectric Ingot Factory"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricIngotPulverizer.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricIngotPulverizer.java new file mode 100644 index 000000000..319f53474 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricIngotPulverizer.java @@ -0,0 +1,72 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecipe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; + +public class ElectricIngotPulverizer extends AContainer implements RecipeDisplayItem { + + public ElectricIngotPulverizer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public String getInventoryTitle() { + return "&bElectric Ingot Pulverizer"; + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.IRON_PICKAXE); + } + + @Override + public void registerDefaultRecipes() { + registerRecipe(3, new ItemStack[]{SlimefunItems.ALUMINUM_INGOT}, new ItemStack[]{SlimefunItems.ALUMINUM_DUST}); + registerRecipe(3, new ItemStack[]{SlimefunItems.COPPER_INGOT}, new ItemStack[]{SlimefunItems.COPPER_DUST}); + registerRecipe(3, new ItemStack[]{SlimefunItems.GOLD_4K}, new ItemStack[]{SlimefunItems.GOLD_DUST}); + registerRecipe(3, new ItemStack[]{new ItemStack(Material.IRON_INGOT)}, new ItemStack[]{SlimefunItems.IRON_DUST}); + registerRecipe(3, new ItemStack[]{SlimefunItems.LEAD_INGOT}, new ItemStack[]{SlimefunItems.LEAD_DUST}); + registerRecipe(3, new ItemStack[]{SlimefunItems.MAGNESIUM_INGOT}, new ItemStack[]{SlimefunItems.MAGNESIUM_DUST}); + registerRecipe(3, new ItemStack[]{SlimefunItems.SILVER_INGOT}, new ItemStack[]{SlimefunItems.SILVER_DUST}); + registerRecipe(3, new ItemStack[]{SlimefunItems.TIN_INGOT}, new ItemStack[]{SlimefunItems.TIN_DUST}); + registerRecipe(3, new ItemStack[]{SlimefunItems.ZINC_INGOT}, new ItemStack[]{SlimefunItems.ZINC_DUST}); + } + + @Override + public List getDisplayRecipes() { + List displayRecipes = new ArrayList<>(recipes.size() * 2); + + for (MachineRecipe recipe: recipes) { + displayRecipes.add(recipe.getInput()[0]); + displayRecipes.add(recipe.getOutput()[0]); + } + + return displayRecipes; + } + + @Override + public int getEnergyConsumption() { + return 7; + } + + @Override + public int getSpeed() { + return 1; + } + + @Override + public String getMachineIdentifier() { + return "ELECTRIC_INGOT_PULVERIZER"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricOreGrinder.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricOreGrinder.java new file mode 100644 index 000000000..f2439dcd4 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricOreGrinder.java @@ -0,0 +1,32 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; + +public abstract class ElectricOreGrinder extends AContainer implements RecipeDisplayItem { + + public ElectricOreGrinder(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, name, recipeType, recipe); + } + + @Override + public String getMachineIdentifier() { + return "ELECTRIC_ORE_GRINDER"; + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.IRON_PICKAXE); + } + + @Override + public String getInventoryTitle() { + return "&bElectric Ore Grinder"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricSmeltery.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricSmeltery.java similarity index 72% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricSmeltery.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricSmeltery.java index 8d0a6cbea..9e8c888f6 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricSmeltery.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectricSmeltery.java @@ -1,10 +1,8 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.bukkit.Material; import org.bukkit.block.Block; @@ -18,11 +16,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; 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.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.MachineRecipe; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; @@ -32,11 +26,6 @@ import me.mrCookieSlime.Slimefun.api.item_transport.RecipeSorter; public abstract class ElectricSmeltery extends AContainer { - public static Map processing = new HashMap(); - public static Map progress = new HashMap(); - - protected List recipes = new ArrayList(); - private static final int[] border = {4, 5, 6, 7, 8, 13, 31, 40, 41, 42, 43, 44}; private static final int[] border_in = {0, 1, 2, 3, 9, 12, 18, 21, 27, 30, 36, 37, 38, 39}; private static final int[] border_out = {14, 15, 16, 17, 23, 26, 32, 33, 34, 35}; @@ -51,10 +40,6 @@ public abstract class ElectricSmeltery extends AContainer { 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); @@ -67,9 +52,9 @@ public abstract class ElectricSmeltery extends AContainer { @Override public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) { - if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots(); + if (flow == ItemTransportFlow.WITHDRAW) return getOutputSlots(); - List slots = new ArrayList(); + List slots = new ArrayList<>(); for (int slot : getInputSlots()) { if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), item, true)) { @@ -94,38 +79,31 @@ public abstract class ElectricSmeltery extends AContainer { } }; - registerBlockHandler(name, new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @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); - } - } - for (int slot : getOutputSlots()) { - if (inv.getItemInSlot(slot) != null) { - b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); - inv.replaceExistingItem(slot, null); - } + registerBlockHandler(name, (p, b, tool, 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); + } + } + 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; } + progress.remove(b); + processing.remove(b); + return true; }); this.registerDefaultRecipes(); } - + + @Override protected void constructMenu(BlockMenuPreset preset) { for (int i : border) { preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectrifiedCrucible.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectrifiedCrucible.java similarity index 96% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectrifiedCrucible.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectrifiedCrucible.java index 1afe95e87..39060579f 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectrifiedCrucible.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElectrifiedCrucible.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; import org.bukkit.Material; @@ -18,9 +18,11 @@ public abstract class ElectrifiedCrucible extends AContainer { public void registerDefaultRecipes() { registerRecipe(10, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(Material.COBBLESTONE, 16)}, new ItemStack[]{new ItemStack(Material.LAVA_BUCKET)}); registerRecipe(8, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(Material.TERRACOTTA, 12)}, new ItemStack[]{new ItemStack(Material.LAVA_BUCKET)}); + for (Material coloured_terracotta : MaterialHelper.TerracottaColours){ registerRecipe(8, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(coloured_terracotta, 12)}, new ItemStack[]{new ItemStack(Material.LAVA_BUCKET)}); } + registerRecipe(10, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(Material.OAK_LEAVES, 16)}, new ItemStack[]{new ItemStack(Material.WATER_BUCKET)}); registerRecipe(10, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(Material.BIRCH_LEAVES, 16)}, new ItemStack[]{new ItemStack(Material.WATER_BUCKET)}); registerRecipe(10, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(Material.SPRUCE_LEAVES, 16)}, new ItemStack[]{new ItemStack(Material.WATER_BUCKET)}); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElevatorPlate.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElevatorPlate.java new file mode 100644 index 000000000..5a08dceca --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/ElevatorPlate.java @@ -0,0 +1,52 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.GPS.Elevator; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + +public class ElevatorPlate extends SimpleSlimefunItem { + + public ElevatorPlate(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { + super(category, item, id, recipeType, recipe, recipeOutput); + + SlimefunItem.registerBlockHandler("ELEVATOR_PLATE", new SlimefunBlockHandler() { + + @Override + public void onPlace(Player p, Block b, SlimefunItem item) { + BlockStorage.addBlockInfo(b, "floor", "&rFloor #0"); + BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString()); + } + + @Override + public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { + return true; + } + }); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (e.getClickedBlock() == null) return false; + String id = BlockStorage.checkID(e.getClickedBlock()); + if (id == null || !id.equals(getID())) return false; + + if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "owner").equals(p.getUniqueId().toString())) { + Elevator.openEditor(p, e.getClickedBlock()); + } + + return true; + }; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/EnergyRegulator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/EnergyRegulator.java new file mode 100644 index 000000000..d4bd78166 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/EnergyRegulator.java @@ -0,0 +1,54 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +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.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.api.energy.EnergyNet; +import me.mrCookieSlime.Slimefun.holograms.EnergyHologram; + +public class EnergyRegulator extends SlimefunItem { + + public EnergyRegulator(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + + SlimefunItem.registerBlockHandler("ENERGY_REGULATOR", new SlimefunBlockHandler() { + + @Override + public void onPlace(Player p, Block b, SlimefunItem item) { + // Spawn the hologram + EnergyHologram.update(b, "&7Connecting..."); + } + + @Override + public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { + EnergyHologram.remove(b); + return true; + } + }); + } + + @Override + public void preRegister() { + addItemHandler(new BlockTicker() { + + @Override + public boolean isSynchronized() { + return false; + } + + @Override + public void tick(Block b, SlimefunItem item, Config data) { + EnergyNet.getNetworkFromLocationOrCreate(b.getLocation()).tick(b); + } + }); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FluidPump.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FluidPump.java similarity index 58% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FluidPump.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FluidPump.java index 5e07466d2..da7f5fb29 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FluidPump.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FluidPump.java @@ -1,21 +1,16 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -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; -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; @@ -25,19 +20,14 @@ 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.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.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 processing = new HashMap(); - public static Map progress = new HashMap(); +public class FluidPump extends SlimefunItem implements InventoryBlock { 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}; @@ -46,45 +36,19 @@ public class FluidPump extends SlimefunItem{ 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(); - } - }; + createPreset(this, "&9Fluid Pump", this::constructMenu); } - protected void constructMenu(BlockMenuPreset preset) { + private 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 - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } + for (int i : border_in) { - preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), - (p, slot, item, action) -> false - ); + preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_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(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false); } for (int i : getOutputSlots()) { @@ -102,35 +66,33 @@ public class FluidPump extends SlimefunItem{ }); } } - + + @Override public int[] getInputSlots() { return new int[] {19, 20}; } - + + @Override public int[] getOutputSlots() { return new int[] {24, 25}; } - - public String getInventoryTitle() { - return "&9Fluid Pump"; - } protected void tick(Block b) { Block fluid = b.getRelative(BlockFace.DOWN); - if (fluid.getType().equals(Material.LAVA)) { + if (fluid.getType() == Material.LAVA) { for (int slot : getInputSlots()) { 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; + if (!fits(b, output)) return; ChargableBlock.addCharge(b, -getEnergyConsumption()); BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); - pushItems(b, new ItemStack[] {output}); + pushItems(b, output); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(fluid.getLocation()); Vein.calculate(fluid.getLocation(), fluid.getLocation(), list, 64); list.get(list.size() - 1).getBlock().setType(Material.AIR); @@ -139,18 +101,18 @@ public class FluidPump extends SlimefunItem{ } } } - else if (fluid.getType().equals(Material.WATER)) { + else if (fluid.getType() == Material.WATER) { for (int slot : getInputSlots()) { 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; + if (!fits(b, output)) return; ChargableBlock.addCharge(b, -getEnergyConsumption()); BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), 1)); - pushItems(b, new ItemStack[] {output}); + pushItems(b, output); fluid.setType(Material.AIR); @@ -165,7 +127,7 @@ public class FluidPump extends SlimefunItem{ } @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new BlockTicker() { @Override @@ -173,42 +135,11 @@ public class FluidPump extends SlimefunItem{ 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++) { - inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); - } - 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)); - } } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FoodComposter.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FoodComposter.java similarity index 76% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FoodComposter.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FoodComposter.java index 0a1a2bb85..962d9738b 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FoodComposter.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FoodComposter.java @@ -1,13 +1,15 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; -import org.bukkit.inventory.ItemStack; - -public abstract class FoodComposter extends AContainer { +public abstract class FoodComposter extends AContainer implements RecipeDisplayItem { public FoodComposter(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); @@ -28,5 +30,15 @@ public abstract class FoodComposter extends AContainer { public String getMachineIdentifier() { return "FOOD_COMPOSTER"; } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.GOLDEN_HOE); + } + + @Override + public String getInventoryTitle() { + return "&cFood Composter"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FoodFabricator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FoodFabricator.java similarity index 85% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FoodFabricator.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FoodFabricator.java index 0ecf92585..bdd210f5f 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/FoodFabricator.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/FoodFabricator.java @@ -1,13 +1,13 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - public abstract class FoodFabricator extends AContainer { public FoodFabricator(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { @@ -28,5 +28,15 @@ public abstract class FoodFabricator extends AContainer { public String getMachineIdentifier() { return "FOOD_FABRICATOR"; } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.GOLDEN_HOE); + } + + @Override + public String getInventoryTitle() { + return "&cFood Fabricator"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Freezer.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/Freezer.java similarity index 51% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Freezer.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/Freezer.java index 5d4d01e77..d0fc50fba 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Freezer.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/Freezer.java @@ -1,14 +1,19 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecipe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; + +import java.util.ArrayList; +import java.util.List; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -public abstract class Freezer extends AContainer { +public abstract class Freezer extends AContainer implements RecipeDisplayItem { public Freezer(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); @@ -19,7 +24,30 @@ public abstract class Freezer extends AContainer { registerRecipe(2, new ItemStack[] {new ItemStack(Material.WATER_BUCKET)}, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(Material.ICE)}); registerRecipe(8, new ItemStack[] {new ItemStack(Material.LAVA_BUCKET)}, new ItemStack[] {new ItemStack(Material.BUCKET), new ItemStack(Material.OBSIDIAN)}); registerRecipe(4, new ItemStack[] {new ItemStack(Material.ICE)}, new ItemStack[] {new ItemStack(Material.PACKED_ICE)}); - registerRecipe(6, new ItemStack[] {new ItemStack(Material.PACKED_ICE)}, new ItemStack[] {SlimefunItems.REACTOR_COOLANT_CELL}); + registerRecipe(6, new ItemStack[] {new ItemStack(Material.PACKED_ICE)}, new ItemStack[] {new ItemStack(Material.BLUE_ICE)}); + registerRecipe(8, new ItemStack[] {new ItemStack(Material.BLUE_ICE)}, new ItemStack[] {SlimefunItems.REACTOR_COOLANT_CELL}); + } + + @Override + public List getDisplayRecipes() { + List displayRecipes = new ArrayList<>(recipes.size() * 2); + + for (MachineRecipe recipe: recipes) { + displayRecipes.add(recipe.getInput()[0]); + displayRecipes.add(recipe.getOutput()[recipe.getOutput().length - 1]); + } + + return displayRecipes; + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.GOLDEN_PICKAXE); + } + + @Override + public String getInventoryTitle() { + return "&bFreezer"; } @Override diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HeatedPressureChamber.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/HeatedPressureChamber.java similarity index 68% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HeatedPressureChamber.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/HeatedPressureChamber.java index 2d0e051e1..cf41b2a35 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HeatedPressureChamber.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/HeatedPressureChamber.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import java.util.ArrayList; import java.util.Collections; @@ -10,8 +10,6 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; @@ -24,7 +22,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; 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.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; @@ -45,10 +43,6 @@ public abstract class HeatedPressureChamber extends AContainer { 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); @@ -61,9 +55,9 @@ public abstract class HeatedPressureChamber extends AContainer { @Override public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) { - if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots(); + if (flow == ItemTransportFlow.WITHDRAW) return getOutputSlots(); - List slots = new ArrayList(); + List slots = new ArrayList<>(); for (int slot: getInputSlots()) { if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), item, true)) { @@ -98,28 +92,32 @@ public abstract class HeatedPressureChamber extends AContainer { registerRecipe(30, new ItemStack[] {SlimefunItems.BLISTERING_INGOT, SlimefunItems.CARBONADO}, new ItemStack[] {SlimefunItems.BLISTERING_INGOT_2}); registerRecipe(60, new ItemStack[] {SlimefunItems.BLISTERING_INGOT_2, new ItemStack(Material.NETHER_STAR)}, new ItemStack[] {SlimefunItems.BLISTERING_INGOT_3}); registerRecipe(90, new ItemStack[] {SlimefunItems.PLUTONIUM, SlimefunItems.URANIUM}, new ItemStack[] {SlimefunItems.BOOSTED_URANIUM}); - registerRecipe(60, new ItemStack[]{SlimefunItems.NETHER_ICE, SlimefunItems.PLUTONIUM}, new ItemStack[]{new CustomItem(SlimefunItems.ENRICHED_NETHER_ICE, 4)}); - registerRecipe(45, new ItemStack[]{SlimefunItems.ENRICHED_NETHER_ICE}, new ItemStack[]{new CustomItem(SlimefunItems.NETHER_ICE_COOLANT_CELL, 8)}); + registerRecipe(60, new ItemStack[] {SlimefunItems.NETHER_ICE, SlimefunItems.PLUTONIUM}, new ItemStack[]{new CustomItem(SlimefunItems.ENRICHED_NETHER_ICE, 4)}); + registerRecipe(45, new ItemStack[] {SlimefunItems.ENRICHED_NETHER_ICE}, new ItemStack[]{new CustomItem(SlimefunItems.NETHER_ICE_COOLANT_CELL, 8)}); } - + + @Override public String getInventoryTitle() { return "&cHeated Pressure Chamber"; } - + + @Override public ItemStack getProgressBar() { return new ItemStack(Material.FLINT_AND_STEEL); } - + + @Override public int[] getInputSlots() { return new int[] {19, 20}; } - + + @Override public int[] getOutputSlots() { return new int[] {24, 25}; } @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new BlockTicker() { @Override @@ -127,35 +125,20 @@ public abstract class HeatedPressureChamber extends AContainer { HeatedPressureChamber.this.tick(b); } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return false; } }); - - super.register(slimefun); } - + + @Override protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); + if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - im.setDisplayName(" "); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; @@ -173,37 +156,42 @@ public abstract class HeatedPressureChamber extends AContainer { } } else { - MachineRecipe r = null; - Map found = new HashMap(); - outer: - for (MachineRecipe recipe: recipes) { - for (ItemStack input: recipe.getInput()) { - slots: - for (int slot: getInputSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), input, true)) { - found.put(slot, input.getAmount()); - break slots; - } - } - } - if (found.size() == recipe.getInput().length) { - r = recipe; - break outer; - } - else found.clear(); - } + BlockMenu menu = BlockStorage.getInventory(b.getLocation()); + Map found = new HashMap<>(); + MachineRecipe recipe = findRecipe(menu, found); - if (r != null) { - if (!fits(b, r.getOutput())) return; + if (recipe != null) { + if (!fits(b, recipe.getOutput())) return; + for (Map.Entry entry: found.entrySet()) { - BlockStorage.getInventory(b).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(entry.getKey()), entry.getValue())); + menu.replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(menu.getItemInSlot(entry.getKey()), entry.getValue())); } - processing.put(b, r); - progress.put(b, r.getTicks()); + + processing.put(b, recipe); + progress.put(b, recipe.getTicks()); } } } + private MachineRecipe findRecipe(BlockMenu menu, Map found) { + for (MachineRecipe recipe: recipes) { + for (ItemStack input: recipe.getInput()) { + for (int slot: getInputSlots()) { + if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), input, true)) { + found.put(slot, input.getAmount()); + break; + } + } + } + if (found.size() == recipe.getInput().length) { + return recipe; + } + else found.clear(); + } + + return null; + } + @Override public String getMachineIdentifier() { return "HEATED_PRESSURE_CHAMBER"; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/NetherDrill.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/NetherDrill.java similarity index 94% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/NetherDrill.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/NetherDrill.java index ee8fc58c4..534f690cd 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/NetherDrill.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/NetherDrill.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/OilPump.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/OilPump.java similarity index 78% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/OilPump.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/OilPump.java index 134c3534a..17d369cfc 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/OilPump.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/OilPump.java @@ -1,14 +1,9 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; - -import java.util.ArrayList; -import java.util.List; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; @@ -24,7 +19,6 @@ import me.mrCookieSlime.Slimefun.Setup.Messages; 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; @@ -40,10 +34,6 @@ public abstract class OilPump extends AContainer { constructMenu(this); } - @Override - public void newInstance(BlockMenu menu, Block b) { - } - @Override public boolean canOpen(Block b, Player p) { if (!(p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true))) { @@ -59,7 +49,7 @@ public abstract class OilPump extends AContainer { @Override public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); + if (flow == ItemTransportFlow.INSERT) return getInputSlots(); else return getOutputSlots(); } }; @@ -81,24 +71,11 @@ public abstract class OilPump extends AContainer { } @Override - public void registerDefaultRecipes() {} - protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; ChargableBlock.addCharge(b, -getEnergyConsumption()); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Refinery.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/Refinery.java similarity index 75% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Refinery.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/Refinery.java index 1a288e408..49129e58a 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/Refinery.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/Refinery.java @@ -1,8 +1,12 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.Slimefun.Lists.RecipeType; @@ -11,17 +15,12 @@ import me.mrCookieSlime.Slimefun.Objects.Category; 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.RecipeDisplayItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; - -public abstract class Refinery extends AContainer { +public abstract class Refinery extends AContainer implements RecipeDisplayItem { public Refinery(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); @@ -36,31 +35,23 @@ public abstract class Refinery extends AContainer { public ItemStack getProgressBar() { return new ItemStack(Material.FLINT_AND_STEEL); } - - @Override - public void registerDefaultRecipes() {} @Override public String getMachineIdentifier() { return "REFINERY"; } + @Override + public List getDisplayRecipes() { + return Arrays.asList(SlimefunItems.BUCKET_OF_OIL, SlimefunItems.BUCKET_OF_FUEL); + } + + @Override protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { - ItemStack item = getProgressBar().clone(); - ItemMeta im = item.getItemMeta(); - ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); - im.setDisplayName(" "); - List lore = new ArrayList(); - lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); - lore.add(""); - lore.add(MachineHelper.getTimeLeft(timeleft / 2)); - im.setLore(lore); - item.setItemMeta(im); - - BlockStorage.getInventory(b).replaceExistingItem(22, item); + MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar()); if (ChargableBlock.isChargable(b)) { if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/WitherAssembler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/WitherAssembler.java similarity index 91% rename from src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/WitherAssembler.java rename to src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/WitherAssembler.java index 828e6decd..91f4633d7 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/WitherAssembler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/WitherAssembler.java @@ -1,4 +1,6 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric; + +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -13,15 +15,16 @@ import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; 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.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; @@ -38,7 +41,7 @@ public class WitherAssembler extends SlimefunItem { public WitherAssembler(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { super(category, item, name, recipeType, recipe); - new BlockMenuPreset(name, getInventoryTitle()) { + new BlockMenuPreset(name, "&5Wither Assembler") { @Override public void init() { @@ -75,7 +78,7 @@ public class WitherAssembler extends SlimefunItem { return false; }); } catch(Exception x) { - x.printStackTrace(); + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a Wither Assembler for Slimefun " + Slimefun.getVersion(), x); } } @@ -86,13 +89,13 @@ public class WitherAssembler extends SlimefunItem { @Override public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { - if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); + if (flow == ItemTransportFlow.INSERT) return getInputSlots(); else return new int[0]; } @Override public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) { - if (flow.equals(ItemTransportFlow.INSERT)) { + if (flow == ItemTransportFlow.INSERT) { if (SlimefunManager.isItemSimiliar(item, new ItemStack(Material.SOUL_SAND), true)) return getSoulSandSlots(); else return getWitherSkullSlots(); } @@ -110,7 +113,7 @@ public class WitherAssembler extends SlimefunItem { @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - if (reason.equals(UnregisterReason.EXPLODE)) return false; + if (reason == UnregisterReason.EXPLODE) return false; BlockMenu inv = BlockStorage.getInventory(b); if (inv != null) { for (int slot: getSoulSandSlots()) { @@ -162,10 +165,6 @@ public class WitherAssembler extends SlimefunItem { (p, slot, item, action) -> false ); } - - public String getInventoryTitle() { - return "&5Wither Assembler"; - } public int[] getInputSlots() { return new int[] {19, 28, 25, 34}; @@ -180,7 +179,7 @@ public class WitherAssembler extends SlimefunItem { } @Override - public void register(boolean slimefun) { + public void preRegister() { addItemHandler(new BlockTicker() { @Override @@ -245,11 +244,7 @@ public class WitherAssembler extends SlimefunItem { final double offset = Double.parseDouble(BlockStorage.getLocationInfo(b.getLocation(), "offset")); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - b.getWorld().spawnEntity(new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + offset, b.getZ() + 0.5D), EntityType.WITHER); - }); - - return; + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> b.getWorld().spawnEntity(new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + offset, b.getZ() + 0.5D), EntityType.WITHER)); } } } @@ -264,8 +259,6 @@ public class WitherAssembler extends SlimefunItem { return false; } }); - - super.register(slimefun); } public int getEnergyConsumption() { diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/CoalGenerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/CoalGenerator.java new file mode 100644 index 000000000..11db7221d --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/CoalGenerator.java @@ -0,0 +1,46 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.generators; + +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel; + +public abstract class CoalGenerator extends AGenerator { + + public CoalGenerator(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public void registerDefaultRecipes() { + registerFuel(new MachineFuel(8, new ItemStack(Material.COAL))); + registerFuel(new MachineFuel(8, new ItemStack(Material.CHARCOAL))); + registerFuel(new MachineFuel(80, new ItemStack(Material.COAL_BLOCK))); + registerFuel(new MachineFuel(12, new ItemStack(Material.BLAZE_ROD))); + + // Logs + for (Material mat: Tag.LOGS.getValues()) { + registerFuel(new MachineFuel(2, new ItemStack(mat))); + } + + // Wooden Planks + for (Material mat: Tag.PLANKS.getValues()) { + registerFuel(new MachineFuel(1, new ItemStack(mat))); + } + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.FLINT_AND_STEEL); + } + + @Override + public String getInventoryTitle() { + return "&cCoal Generator"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/CombustionGenerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/CombustionGenerator.java new file mode 100644 index 000000000..080e9bc86 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/CombustionGenerator.java @@ -0,0 +1,34 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.generators; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel; + +public abstract class CombustionGenerator extends AGenerator { + + public CombustionGenerator(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public void registerDefaultRecipes() { + registerFuel(new MachineFuel(30, SlimefunItems.BUCKET_OF_OIL)); + registerFuel(new MachineFuel(90, SlimefunItems.BUCKET_OF_FUEL)); + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.FLINT_AND_STEEL); + } + + @Override + public String getInventoryTitle() { + return "&cCombustion Reactor"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/LavaGenerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/LavaGenerator.java new file mode 100644 index 000000000..a6705e8f9 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/generators/LavaGenerator.java @@ -0,0 +1,32 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.generators; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel; + +public abstract class LavaGenerator extends AGenerator { + + public LavaGenerator(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, id, recipeType, recipe); + } + + @Override + public void registerDefaultRecipes() { + registerFuel(new MachineFuel(40, new ItemStack(Material.LAVA_BUCKET))); + } + + @Override + public ItemStack getProgressBar() { + return new ItemStack(Material.FLINT_AND_STEEL); + } + + @Override + public String getInventoryTitle() { + return "&4Lava Generator"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/ArmorForge.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/ArmorForge.java new file mode 100644 index 000000000..4bdb30793 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/ArmorForge.java @@ -0,0 +1,84 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class ArmorForge extends MultiBlockMachine { + + public ArmorForge() { + super( + Categories.MACHINES_1, + SlimefunItems.ARMOR_FORGE, + "ARMOR_FORGE", + new ItemStack[] {null, null, null, null, new ItemStack(Material.ANVIL), null, null, new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), null}, + new ItemStack[0], + Material.ANVIL + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + List inputs = RecipeType.getRecipeInputList(this); + + for (int i = 0; i < inputs.size(); i++) { + boolean craft = true; + for (int j = 0; j < inv.getContents().length; j++) { + if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) { + craft = false; + break; + } + } + + if (craft) { + final ItemStack adding = RecipeType.getRecipeOutputList(this, inputs.get(i)).clone(); + if (Slimefun.hasUnlocked(p, adding, true)) { + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + if (outputInv != null) { + for (ItemStack removing: inputs.get(i)) { + if (removing != null) inv.removeItem(removing); + } + + for (int j = 0; j < 4; j++) { + int current = j; + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + if (current < 3) { + p.getWorld().playSound(p.getLocation(), Sound.BLOCK_ANVIL_USE, 1F, 2F); + } + else { + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + outputInv.addItem(adding); + } + }, j*20L); + } + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + } + return; + } + } + + Messages.local.sendTranslation(p, "machines.pattern-not-found", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AutomatedPanningMachine.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AutomatedPanningMachine.java new file mode 100644 index 000000000..26d2dd234 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AutomatedPanningMachine.java @@ -0,0 +1,68 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import java.util.Random; + +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class AutomatedPanningMachine extends MultiBlockMachine { + + private Random random = new Random(); + + public AutomatedPanningMachine() { + super( + Categories.MACHINES_1, + SlimefunItems.AUTOMATED_PANNING_MACHINE, + "AUTOMATED_PANNING_MACHINE", + new ItemStack[] {null, null, null, null, new ItemStack(Material.OAK_TRAPDOOR), null, null, new ItemStack(Material.CAULDRON), null}, + new ItemStack[] { + new ItemStack(Material.GRAVEL), new ItemStack(Material.FLINT), + new ItemStack(Material.GRAVEL), new ItemStack(Material.CLAY_BALL), + new ItemStack(Material.GRAVEL), SlimefunItems.SIFTED_ORE + }, + Material.OAK_TRAPDOOR + ); + } + + @Override + public void onInteract(Player p, Block b) { + final ItemStack input = p.getInventory().getItemInMainHand(); + ItemStack output = null; + + if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.SIFTED_ORE")) output = SlimefunItems.SIFTED_ORE; + else if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.CLAY")) output = new ItemStack(Material.CLAY_BALL); + else if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.FLINT")) output = new ItemStack(Material.FLINT); + + final ItemStack drop = output; + + if (input != null && input.getType() == Material.GRAVEL) { + PlayerInventory.consumeItemInHand(p); + for (int i = 1; i < 7; i++) { + int j = i; + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + b.getWorld().playEffect(b.getRelative(BlockFace.DOWN).getLocation(), Effect.STEP_SOUND, Material.GRAVEL); + if (j == 6) { + if (drop != null) b.getWorld().dropItemNaturally(b.getLocation(), drop); + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + } + }, i * 30L); + } + } + + Messages.local.sendTranslation(p, "machines.wrong-item", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Compressor.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Compressor.java new file mode 100644 index 000000000..4c8f2a864 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Compressor.java @@ -0,0 +1,77 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class Compressor extends MultiBlockMachine { + + public Compressor() { + super( + Categories.MACHINES_1, + SlimefunItems.COMPRESSOR, + "COMPRESSOR", + new ItemStack[] {null, null, null, null, new ItemStack(Material.NETHER_BRICK_FENCE), null, new ItemStack(Material.PISTON), new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), new ItemStack(Material.PISTON)}, + new ItemStack[] { + new ItemStack(Material.COAL, 8), SlimefunItems.CARBON, + new CustomItem(SlimefunItems.STEEL_INGOT, 8), SlimefunItems.STEEL_PLATE, + new CustomItem(SlimefunItems.CARBON, 4), SlimefunItems.COMPRESSED_CARBON, + new CustomItem(SlimefunItems.STONE_CHUNK, 4), new ItemStack(Material.COBBLESTONE), + new CustomItem(SlimefunItems.REINFORCED_ALLOY_INGOT, 8), SlimefunItems.REINFORCED_PLATE + }, + Material.NETHER_BRICK_FENCE + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + for (ItemStack current: inv.getContents()) { + for (ItemStack convert: RecipeType.getRecipeInputs(this)) { + if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { + final ItemStack adding = RecipeType.getRecipeOutput(this, convert); + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(convert.getAmount()); + inv.removeItem(removing); + for (int i = 0; i < 4; i++) { + int j = i; + + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + if (j < 3) { + p.getWorld().playSound(p.getLocation(), j == 1 ? Sound.BLOCK_PISTON_CONTRACT : Sound.BLOCK_PISTON_EXTEND, 1F, j == 0 ? 1F : 2F); + } + else { + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + outputInv.addItem(adding); + } + }, i*20L); + } + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + + return; + } + } + } + Messages.local.sendTranslation(p, "machines.unknown-material", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/EnhancedCraftingTable.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/EnhancedCraftingTable.java new file mode 100644 index 000000000..d72faac58 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/EnhancedCraftingTable.java @@ -0,0 +1,154 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import java.util.List; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class EnhancedCraftingTable extends MultiBlockMachine { + + public EnhancedCraftingTable() { + super( + Categories.MACHINES_1, + SlimefunItems.ENHANCED_CRAFTING_TABLE, + "ENHANCED_CRAFTING_TABLE", + new ItemStack[] {null, null, null, null, new ItemStack(Material.CRAFTING_TABLE), null, null, new ItemStack(Material.DISPENSER), null}, + new ItemStack[0], + Material.CRAFTING_TABLE + ); + } + + @Override + public void onInteract(Player p, Block b) { + // Objects dispBlock and disp have been split up, in order to add the output chest functionallity, which is the only functionallity + // that is dependant on the dispenser's block methods. + // the Dispenser disp still remains the same though, and as such doesn't break any existing code which involves said object. + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + + List inputs = RecipeType.getRecipeInputList(this); + + for (int i = 0; i < inputs.size(); i++) { + boolean craft = true; + for (int j = 0; j < inv.getContents().length; j++) { + if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) { + if (SlimefunItem.getByItem(inputs.get(i)[j]) instanceof SlimefunBackpack) { + if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], false)) { + craft = false; + break; + } + } + else { + craft = false; + break; + } + } + } + + if (craft) { + final ItemStack adding = RecipeType.getRecipeOutputList(this, inputs.get(i)).clone(); + if (Slimefun.hasUnlocked(p, adding, true)) { + Inventory inv2 = Bukkit.createInventory(null, 9, "test"); + for (int j = 0; j < inv.getContents().length; j++) { + inv2.setItem(j, inv.getContents()[j] != null ? (inv.getContents()[j].getAmount() > 1 ? new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1): null): null); + } + + Inventory outputInv = findOutputInventory(adding, dispBlock, inv, inv2); + + if (outputInv != null) { + SlimefunItem sfItem = SlimefunItem.getByItem(adding); + if (sfItem instanceof SlimefunBackpack) { + ItemStack backpack = null; + + for (int j = 0; j < 9; j++) { + if (inv.getContents()[j] != null && inv.getContents()[j].getType() != Material.AIR && SlimefunItem.getByItem(inv.getContents()[j]) instanceof SlimefunBackpack) { + backpack = inv.getContents()[j]; + break; + } + } + String id = ""; + int size = ((SlimefunBackpack) sfItem).getSize(); + + if (backpack != null) { + for (String line: backpack.getItemMeta().getLore()) { + if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) { + id = line.replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), ""); + PlayerProfile.fromUUID(UUID.fromString(id.split("#")[0])).getBackpack(Integer.parseInt(id.split("#")[1])).setSize(size); + break; + } + } + } + + if (id.equals("")) { + for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { + if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { + int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID(); + + ItemMeta im = adding.getItemMeta(); + List lore = im.getLore(); + lore.set(line, lore.get(line).replace("", p.getUniqueId() + "#" + backpackID)); + im.setLore(lore); + adding.setItemMeta(im); + break; + } + } + } + else { + for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { + if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { + ItemMeta im = adding.getItemMeta(); + List lore = im.getLore(); + lore.set(line, lore.get(line).replace("", id)); + im.setLore(lore); + adding.setItemMeta(im); + break; + } + } + } + } + + + for (int j = 0; j < 9; j++) { + if (inv.getContents()[j] != null && inv.getContents()[j].getType() != Material.AIR) { + if (inv.getContents()[j].getType().toString().endsWith("_BUCKET")) inv.setItem(j, new ItemStack(Material.BUCKET)); + else if (inv.getContents()[j].getAmount() > 1) inv.setItem(j, new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1)); + else inv.setItem(j, null); + } + } + p.getWorld().playSound(b.getLocation(), Sound.BLOCK_WOODEN_BUTTON_CLICK_ON, 1, 1); + + outputInv.addItem(adding); + + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + } + + return; + } + } + Messages.local.sendTranslation(p, "machines.pattern-not-found", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/GrindStone.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/GrindStone.java new file mode 100644 index 000000000..d370d204c --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/GrindStone.java @@ -0,0 +1,73 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class GrindStone extends MultiBlockMachine { + + public GrindStone() { + super( + Categories.MACHINES_1, + SlimefunItems.GRIND_STONE, + "GRIND_STONE", + new ItemStack[] {null, null, null, null, new ItemStack(Material.OAK_FENCE), null, null, new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), null}, + new ItemStack[] { + new ItemStack(Material.BLAZE_ROD), new ItemStack(Material.BLAZE_POWDER, 4), + new ItemStack(Material.BONE), new ItemStack(Material.BONE_MEAL, 4), + new ItemStack(Material.GRAVEL), new ItemStack(Material.FLINT), + new ItemStack(Material.NETHER_WART), new CustomItem(SlimefunItems.MAGIC_LUMP_1, 2), + new ItemStack(Material.ENDER_EYE), new CustomItem(SlimefunItems.ENDER_LUMP_1, 2), + new ItemStack(Material.COBBLESTONE), new ItemStack(Material.GRAVEL), + new ItemStack(Material.WHEAT), SlimefunItems.WHEAT_FLOUR, + new ItemStack(Material.DIRT), SlimefunItems.STONE_CHUNK, + new ItemStack(Material.SANDSTONE), new ItemStack(Material.SAND, 4), + new ItemStack(Material.RED_SANDSTONE), new ItemStack(Material.RED_SAND, 4) + }, + Material.OAK_FENCE + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + + for (ItemStack current: inv.getContents()) { + for (ItemStack convert: RecipeType.getRecipeInputs(this)) { + if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { + ItemStack output = RecipeType.getRecipeOutput(this, convert); + Inventory outputInv = findOutputInventory(output, dispBlock, inv); + + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(1); + inv.removeItem(removing); + outputInv.addItem(output); + p.getWorld().playSound(p.getLocation(), Sound.BLOCK_WOODEN_BUTTON_CLICK_ON, 1, 1); + } + else { + Messages.local.sendTranslation(p, "machines.full-inventory", true); + } + + return; + } + } + } + Messages.local.sendTranslation(p, "machines.unknown-material", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Juicer.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Juicer.java new file mode 100644 index 000000000..789434a83 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Juicer.java @@ -0,0 +1,68 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class Juicer extends MultiBlockMachine { + + public Juicer() { + super( + Categories.MACHINES_1, + SlimefunItems.JUICER, + "JUICER", + new ItemStack[] {null, new ItemStack(Material.GLASS), null, null, new ItemStack(Material.NETHER_BRICK_FENCE), null, null, new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), null}, + new ItemStack[] { + new ItemStack(Material.APPLE), SlimefunItems.APPLE_JUICE, + new ItemStack(Material.MELON), SlimefunItems.MELON_JUICE, + new ItemStack(Material.CARROT), SlimefunItems.CARROT_JUICE, + new ItemStack(Material.PUMPKIN), SlimefunItems.PUMPKIN_JUICE, + new ItemStack(Material.GOLDEN_APPLE), SlimefunItems.GOLDEN_APPLE_JUICE + }, + Material.NETHER_BRICK_FENCE + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + for (ItemStack current: inv.getContents()) { + for (ItemStack convert: RecipeType.getRecipeInputs(this)) { + if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { + ItemStack adding = RecipeType.getRecipeOutput(this, convert); + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(1); + inv.removeItem(removing); + outputInv.addItem(adding); + p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1F, 1F); + p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.HAY_BLOCK); + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + + return; + } + } + } + + Messages.local.sendTranslation(p, "machines.unknown-material", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/MagicWorkbench.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/MagicWorkbench.java new file mode 100644 index 000000000..f70b40be4 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/MagicWorkbench.java @@ -0,0 +1,167 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import java.util.List; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class MagicWorkbench extends MultiBlockMachine { + + public MagicWorkbench() { + super( + Categories.MACHINES_1, + SlimefunItems.MAGIC_WORKBENCH, + "MAGIC_WORKBENCH", + new ItemStack[] {null, null, null, null, null, null, new ItemStack(Material.BOOKSHELF), new ItemStack(Material.CRAFTING_TABLE), new ItemStack(Material.DISPENSER)}, + new ItemStack[0], + Material.CRAFTING_TABLE + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = null; + + // Maybe this could be implemented by instead looping over a BlockFace<> array? + if (b.getRelative(1, 0, 0).getType() == Material.DISPENSER) dispBlock = b.getRelative(1, 0, 0); + else if (b.getRelative(0, 0, 1).getType() == Material.DISPENSER) dispBlock = b.getRelative(0, 0, 1); + else if (b.getRelative(-1, 0, 0).getType() == Material.DISPENSER) dispBlock = b.getRelative(-1, 0, 0); + else if (b.getRelative(0, 0, -1).getType() == Material.DISPENSER) dispBlock = b.getRelative(0, 0, -1); + + Dispenser disp = (Dispenser) dispBlock.getState(); + final Inventory inv = disp.getInventory(); + List inputs = RecipeType.getRecipeInputList(this); + + for (int i = 0; i < inputs.size(); i++) { + boolean craft = true; + for (int j = 0; j < inv.getContents().length; j++) { + if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) { + if (SlimefunItem.getByItem(inputs.get(i)[j]) instanceof SlimefunBackpack) { + if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], false)) { + craft = false; + break; + } + } + else { + craft = false; + break; + } + } + } + + if (craft) { + final ItemStack adding = RecipeType.getRecipeOutputList(this, inputs.get(i)).clone(); + if (Slimefun.hasUnlocked(p, adding, true)) { + Inventory inv2 = Bukkit.createInventory(null, 9, "test"); + + for (int j = 0; j < inv.getContents().length; j++) { + inv2.setItem(j, inv.getContents()[j] != null ? (inv.getContents()[j].getAmount() > 1 ? new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1): null): null); + } + + Inventory outputInv = findOutputInventory(adding, dispBlock, inv, inv2); + if (outputInv != null) { + SlimefunItem sfItem = SlimefunItem.getByItem(adding); + + if (sfItem instanceof SlimefunBackpack) { + ItemStack backpack = null; + + for (int j = 0; j < 9; j++) { + if (inv.getContents()[j] != null && inv.getContents()[j].getType() != Material.AIR && SlimefunItem.getByItem(inv.getContents()[j]) instanceof SlimefunBackpack) { + backpack = inv.getContents()[j]; + break; + } + } + + String id = ""; + int size = ((SlimefunBackpack) sfItem).getSize(); + + if (backpack != null) { + for (String line: backpack.getItemMeta().getLore()) { + if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) { + id = line.replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), ""); + PlayerProfile.fromUUID(UUID.fromString(id.split("#")[0])).getBackpack(Integer.parseInt(id.split("#")[1])).setSize(size); + break; + } + } + } + + if (id.equals("")) { + for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { + if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { + int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID(); + + ItemMeta im = adding.getItemMeta(); + List lore = im.getLore(); + lore.set(line, lore.get(line).replace("", p.getUniqueId() + "#" + backpackID)); + im.setLore(lore); + adding.setItemMeta(im); + break; + } + } + } + else { + for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { + if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { + ItemMeta im = adding.getItemMeta(); + List lore = im.getLore(); + lore.set(line, lore.get(line).replace("", id)); + im.setLore(lore); + adding.setItemMeta(im); + break; + } + } + } + } + + for (int j = 0; j < 9; j++) { + if (inv.getContents()[j] != null && inv.getContents()[j].getType() != Material.AIR) { + if (inv.getContents()[j].getAmount() > 1) inv.setItem(j, new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1)); + else inv.setItem(j, null); + } + } + for (int j = 0; j < 4; j++) { + int current = j; + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); + p.getWorld().playEffect(b.getLocation(), Effect.ENDER_SIGNAL, 1); + if (current < 3) { + p.getWorld().playSound(b.getLocation(), Sound.BLOCK_WOODEN_BUTTON_CLICK_ON, 1F, 1F); + } else { + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + outputInv.addItem(adding); + } + }, j*20L); + } + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + } + + return; + } + } + Messages.local.sendTranslation(p, "machines.pattern-not-found", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/MultiBlockMachine.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/MultiBlockMachine.java new file mode 100644 index 000000000..51701df94 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/MultiBlockMachine.java @@ -0,0 +1,86 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Container; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; +import me.mrCookieSlime.Slimefun.Objects.handlers.MultiBlockInteractionHandler; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public abstract class MultiBlockMachine extends SlimefunMachine { + + private static final BlockFace[] outputFaces = { + BlockFace.UP, + BlockFace.NORTH, + BlockFace.EAST, + BlockFace.SOUTH, + BlockFace.WEST + }; + + public MultiBlockMachine(Category category, ItemStack item, String id, ItemStack[] recipe, ItemStack[] machineRecipes, Material trigger) { + super(category, item, id, recipe, machineRecipes, trigger); + } + + public MultiBlockMachine(Category category, ItemStack item, String id, ItemStack[] recipe, ItemStack[] machineRecipes, Material trigger, String[] keys, Object[] values) { + super(category, item, id, recipe, machineRecipes, trigger, keys, values); + } + + @Override + public void register() { + register(true, getInteractionHandler()); + } + + protected MultiBlockInteractionHandler getInteractionHandler() { + return (p, mb, b) -> { + if (mb.isMultiBlock(this)) { + if (!isDisabled() && CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true) && Slimefun.hasUnlocked(p, getItem(), true)) { + onInteract(p, b); + } + + return true; + } + else return false; + }; + } + + public abstract void onInteract(Player p, Block b); + + // Overloaded method for finding a potential output chest. Fallbacks to the old system of putting the adding back into the dispenser. + // Optional last argument Inventory placeCheckerInv is for multiblock machines that create a dummy inventory to check if there's a space for the adding, + // i.e. Enhanced crafting table + protected Inventory findOutputInventory(ItemStack adding, Block dispBlock, Inventory dispInv) { + return findOutputInventory(adding, dispBlock, dispInv, dispInv); + } + + protected Inventory findOutputInventory(ItemStack product, Block dispBlock, Inventory dispInv, Inventory placeCheckerInv) { + Inventory outputInv = null; + + for (BlockFace face : outputFaces) { + Block potentialOutput = dispBlock.getRelative(face); + String id = BlockStorage.checkID(potentialOutput); + if (id != null && id.equals("OUTPUT_CHEST")) { + // Found the output chest! Now, let's check if we can fit the product in it. + Inventory inv = ((Container) potentialOutput.getState()).getInventory(); + if (InvUtils.fits(inv, product)) { + // It fits! Let's set the inventory to that now. + outputInv = inv; + break; + } + } + } + // This if-clause will trigger if no suitable output chest was found. It's functionally the same as the old fit check for the dispenser, only refactored. + if (outputInv == null && InvUtils.fits(placeCheckerInv, product)) outputInv = dispInv; + + return outputInv; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/OreCrusher.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/OreCrusher.java new file mode 100644 index 000000000..26fe4c136 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/OreCrusher.java @@ -0,0 +1,70 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class OreCrusher extends MultiBlockMachine { + + public OreCrusher() { + super( + Categories.MACHINES_1, + SlimefunItems.ORE_CRUSHER, + "ORE_CRUSHER", + new ItemStack[] {null, null, null, null, new ItemStack(Material.NETHER_BRICK_FENCE), null, new ItemStack(Material.IRON_BARS), new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), new ItemStack(Material.IRON_BARS)}, + new ItemStack[] { + new ItemStack(Material.IRON_ORE), new CustomItem(SlimefunItems.IRON_DUST, (Boolean) Slimefun.getItemValue("ORE_CRUSHER", "double-ores") ? 2: 1), + new ItemStack(Material.GOLD_ORE), new CustomItem(SlimefunItems.GOLD_DUST, (Boolean) Slimefun.getItemValue("ORE_CRUSHER", "double-ores") ? 2: 1), + new ItemStack(Material.NETHERRACK, 16), SlimefunItems.SULFATE, + SlimefunItems.SIFTED_ORE, SlimefunItems.CRUSHED_ORE, + SlimefunItems.CRUSHED_ORE, SlimefunItems.PULVERIZED_ORE, + SlimefunItems.PURE_ORE_CLUSTER, SlimefunItems.TINY_URANIUM, + new ItemStack(Material.COBBLESTONE, 8), new ItemStack(Material.SAND, 1), + new ItemStack(Material.GOLD_INGOT), SlimefunItems.GOLD_DUST, + SlimefunItems.GOLD_4K, SlimefunItems.GOLD_DUST + }, + Material.NETHER_BRICK_FENCE + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + for (ItemStack current: inv.getContents()) { + for (ItemStack convert: RecipeType.getRecipeInputs(this)) { + if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { + ItemStack adding = RecipeType.getRecipeOutput(this, convert); + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(convert.getAmount()); + inv.removeItem(removing); + outputInv.addItem(adding); + p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, 1); + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + + return; + } + } + } + + Messages.local.sendTranslation(p, "machines.unknown-material", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/OreWasher.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/OreWasher.java new file mode 100644 index 000000000..5e274e5b2 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/OreWasher.java @@ -0,0 +1,119 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import java.util.Random; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class OreWasher extends MultiBlockMachine { + + public static ItemStack[] items; + + public OreWasher() { + super( + Categories.MACHINES_1, + SlimefunItems.ORE_WASHER, + "ORE_WASHER", + new ItemStack[] {null, new ItemStack(Material.DISPENSER), null, null, new ItemStack(Material.OAK_FENCE), null, null, new ItemStack(Material.CAULDRON), null}, + new ItemStack[] { + SlimefunItems.SIFTED_ORE, SlimefunItems.IRON_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.GOLD_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.COPPER_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.TIN_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.ZINC_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.ALUMINUM_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.MAGNESIUM_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.LEAD_DUST, + SlimefunItems.SIFTED_ORE, SlimefunItems.SILVER_DUST + }, + Material.OAK_FENCE + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.UP); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + + for (ItemStack current: inv.getContents()) { + if (current != null) { + if (SlimefunManager.isItemSimiliar(current, SlimefunItems.SIFTED_ORE, true)) { + ItemStack adding = items[new Random().nextInt(items.length)]; + Inventory outputInv = null; + + if (!SlimefunPlugin.getSettings().legacyOreWasher) { + // This is a fancy way of checking if there is empty space in the inv; by checking if an unobtainable item could fit in it. + // However, due to the way the method findValidOutputInv() functions, the dummyAdding will never actually be added to the real inventory, + // so it really doesn't matter what item the ItemStack is made by. SlimefunItems.DEBUG_FISH however, signals that it's + // not supposed to be given to the player. + ItemStack dummyAdding = SlimefunItems.DEBUG_FISH; + outputInv = findOutputInventory(dummyAdding, dispBlock, inv); + } + else outputInv = findOutputInventory(adding, dispBlock, inv); + + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(1); + inv.removeItem(removing); + outputInv.addItem(adding); + p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1, 1); + p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.WATER); + if (InvUtils.fits(outputInv, SlimefunItems.STONE_CHUNK)) outputInv.addItem(SlimefunItems.STONE_CHUNK); + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + + return; + } + else if (SlimefunManager.isItemSimiliar(current, new ItemStack(Material.SAND, 4), false)) { + ItemStack adding = SlimefunItems.SALT; + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(4); + inv.removeItem(removing); + outputInv.addItem(adding); + p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.WATER); + p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1, 1); + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + + return; + } + else if (SlimefunManager.isItemSimiliar(current, SlimefunItems.PULVERIZED_ORE, true)) { + ItemStack adding = SlimefunItems.PURE_ORE_CLUSTER; + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(1); + inv.removeItem(removing); + outputInv.addItem(adding); + p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.WATER); + p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1, 1); + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + + return; + } + } + } + Messages.local.sendTranslation(p, "machines.unknown-material", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/PressureChamber.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/PressureChamber.java new file mode 100644 index 000000000..b06a1d860 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/PressureChamber.java @@ -0,0 +1,81 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; + +public class PressureChamber extends MultiBlockMachine { + + public PressureChamber() { + super( + Categories.MACHINES_1, + SlimefunItems.PRESSURE_CHAMBER, + "PRESSURE_CHAMBER", + new ItemStack[] {new ItemStack(Material.SMOOTH_STONE_SLAB), new CustomItem(Material.DISPENSER, "Dispenser (Facing down)"), new ItemStack(Material.SMOOTH_STONE_SLAB), new ItemStack(Material.PISTON), new ItemStack(Material.GLASS), new ItemStack(Material.PISTON), new ItemStack(Material.PISTON), new ItemStack(Material.CAULDRON), new ItemStack(Material.PISTON)}, + new ItemStack[] { + SlimefunItems.CARBON_CHUNK, SlimefunItems.SYNTHETIC_DIAMOND, + SlimefunItems.RAW_CARBONADO, SlimefunItems.CARBONADO + }, + Material.CAULDRON + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.UP).getRelative(BlockFace.UP); + Dispenser disp = (Dispenser) dispBlock.getState(); + final Inventory inv = disp.getInventory(); + + for (ItemStack current: inv.getContents()) { + for (ItemStack convert: RecipeType.getRecipeInputs(this)) { + if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { + final ItemStack adding = RecipeType.getRecipeOutput(this, convert); + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + if (outputInv != null) { + ItemStack removing = current.clone(); + removing.setAmount(convert.getAmount()); + inv.removeItem(removing); + for (int i = 0; i < 4; i++) { + int j = i; + + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + p.getWorld().playSound(b.getLocation(), Sound.ENTITY_TNT_PRIMED, 1, 1); + p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4); + p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4); + p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4); + + if (j < 3) { + p.getWorld().playSound(b.getLocation(), Sound.ENTITY_TNT_PRIMED, 1F, 1F); + } + else { + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + outputInv.addItem(adding); + } + }, i*20L); + } + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + + return; + } + } + } + Messages.local.sendTranslation(p, "machines.unknown-material", true); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Smeltery.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Smeltery.java new file mode 100644 index 000000000..8ebaa1237 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/Smeltery.java @@ -0,0 +1,129 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import java.util.List; +import java.util.Random; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.block.Hopper; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class Smeltery extends MultiBlockMachine { + + public Smeltery() { + super( + Categories.MACHINES_1, + SlimefunItems.SMELTERY, + "SMELTERY", + new ItemStack[] {null, new ItemStack(Material.NETHER_BRICK_FENCE), null, new ItemStack(Material.NETHER_BRICKS), new CustomItem(Material.DISPENSER, "Dispencer (Faced up)"), new ItemStack(Material.NETHER_BRICKS), null, new ItemStack(Material.FLINT_AND_STEEL), null}, + new ItemStack[] { + SlimefunItems.IRON_DUST, new ItemStack(Material.IRON_INGOT) + }, + Material.NETHER_BRICK_FENCE, + new String[] {"chance.fireBreak"}, new Integer[] {34} + ); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + List inputs = RecipeType.getRecipeInputList(this); + + for (int i = 0; i < inputs.size(); i++) { + boolean craft = true; + for (ItemStack converting: inputs.get(i)) { + if (converting != null) { + for (int j = 0; j < inv.getContents().length; j++) { + if (j == (inv.getContents().length - 1) && !SlimefunManager.isItemSimiliar(converting, inv.getContents()[j], true)) { + craft = false; + break; + } + else if (SlimefunManager.isItemSimiliar(inv.getContents()[j], converting, true)) break; + } + } + } + + if (craft) { + ItemStack adding = RecipeType.getRecipeOutputList(this, inputs.get(i)).clone(); + if (Slimefun.hasUnlocked(p, adding, true)) { + Inventory outputInv = findOutputInventory(adding, dispBlock, inv); + if (outputInv != null) { + for (ItemStack removing: inputs.get(i)) { + if (removing != null) inv.removeItem(removing); + } + outputInv.addItem(adding); + p.getWorld().playSound(p.getLocation(), Sound.BLOCK_LAVA_POP, 1, 1); + p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); + + Hopper chamber = findHopper(dispBlock, BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST); + + if (new Random().nextInt(100) < SlimefunPlugin.getSettings().smelteryFireBreakChance) { + if (chamber != null) { + if (chamber.getInventory().contains(Material.FLINT_AND_STEEL)) { + ItemStack item = chamber.getInventory().getItem(chamber.getInventory().first(Material.FLINT_AND_STEEL)); + ItemMeta meta = item.getItemMeta(); + ((Damageable) meta).setDamage(((Damageable) meta).getDamage() + 1); + item.setItemMeta(meta); + + if (((Damageable) item.getItemMeta()).getDamage() >= item.getType().getMaxDurability()) { + item.setAmount(0); + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1); + } + + p.getWorld().playSound(p.getLocation(), Sound.ITEM_FLINTANDSTEEL_USE, 1, 1); + } + else { + Messages.local.sendTranslation(p, "machines.ignition-chamber-no-flint", true); + + Block fire = b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN); + fire.getWorld().playEffect(fire.getLocation(), Effect.STEP_SOUND, fire.getType()); + fire.setType(Material.AIR); + } + } + else { + Block fire = b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN); + fire.getWorld().playEffect(fire.getLocation(), Effect.STEP_SOUND, fire.getType()); + fire.setType(Material.AIR); + } + } + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + } + + return; + } + } + Messages.local.sendTranslation(p, "machines.pattern-not-found", true); + } + + private Hopper findHopper(Block b, BlockFace... faces) { + for (BlockFace face: faces) { + if (b.getRelative(face).getType() == Material.HOPPER && BlockStorage.check(b.getRelative(face), "IGNITION_CHAMBER")) { + return (Hopper) b.getRelative(face).getState(); + } + } + + return null; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/TableSaw.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/TableSaw.java new file mode 100644 index 000000000..259077952 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/TableSaw.java @@ -0,0 +1,58 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; + +public class TableSaw extends MultiBlockMachine { + + private final List displayRecipes = new ArrayList<>(); + + public TableSaw() { + super( + Categories.MACHINES_1, + SlimefunItems.TABLE_SAW, + "TABLE_SAW", + new ItemStack[] {null, null, null, new ItemStack(Material.SMOOTH_STONE_SLAB), new ItemStack(Material.STONECUTTER), new ItemStack(Material.SMOOTH_STONE_SLAB), null, new ItemStack(Material.IRON_BLOCK), null}, + new ItemStack[0], + Material.STONECUTTER + ); + + for (Material log: Tag.LOGS.getValues()) { + displayRecipes.add(new ItemStack(log)); + displayRecipes.add(new ItemStack(MaterialHelper.getWoodFromLog(log), 8)); + } + } + + @Override + public List getDisplayRecipes() { + return displayRecipes; + } + + @Override + public void onInteract(Player p, Block b) { + ItemStack log = p.getInventory().getItemInMainHand(); + + ItemStack item = new ItemStack(MaterialHelper.getWoodFromLog(log.getType()), 8); + if(item == null || item.getType() == Material.AIR) return; + + b.getWorld().dropItemNaturally(b.getLocation(), item); + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, log.getType()); + log.setAmount(log.getAmount() -1); + + if(log.getAmount() <= 0) { + p.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); + } + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/AutonomousMachineHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/AutonomousMachineHandler.java new file mode 100644 index 000000000..9e5c26e2f --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/AutonomousMachineHandler.java @@ -0,0 +1,17 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; + +import org.bukkit.block.Block; +import org.bukkit.block.Dispenser; +import org.bukkit.event.block.BlockDispenseEvent; + +@FunctionalInterface +public interface AutonomousMachineHandler extends ItemHandler { + + boolean onBlockDispense(BlockDispenseEvent e, Block dispenser, Dispenser d, Block block, Block chest, SlimefunItem machine); + + default String toCodename() { + return "AutonomousMachineHandler"; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockBreakHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockBreakHandler.java new file mode 100644 index 000000000..908a5a716 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockBreakHandler.java @@ -0,0 +1,16 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import java.util.List; + +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; + +@FunctionalInterface +public interface BlockBreakHandler extends ItemHandler { + + boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops); + + default String toCodename() { + return "BlockBreakHandler"; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockPlaceHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockPlaceHandler.java new file mode 100644 index 000000000..1602bf63a --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockPlaceHandler.java @@ -0,0 +1,14 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.inventory.ItemStack; + +@FunctionalInterface +public interface BlockPlaceHandler extends ItemHandler { + + boolean onBlockPlace(BlockPlaceEvent e, ItemStack item); + + default String toCodename() { + return "BlockPlaceHandler"; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockTicker.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockTicker.java new file mode 100644 index 000000000..b9a2d1dd5 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BlockTicker.java @@ -0,0 +1,51 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; + +import org.bukkit.block.Block; + +public abstract class BlockTicker implements ItemHandler { + + protected boolean unique = true; + + public void update() { + if (unique) { + uniqueTick(); + unique = false; + } + } + + /** + * This method must be overridden to define whether a Block + * needs to be run on the main server thread (World Manipulation requires that) + * + * @return Whether this task should run on the main server thread + */ + public abstract boolean isSynchronized(); + + /** + * This method is called every tick for every block + */ + public abstract void tick(Block b, SlimefunItem item, Config data); + + /** + * This method is called every tick but not per-block and only once. + */ + public void uniqueTick() { + // Override this method and fill it with content + } + + @Override + public String toCodename() { + return "BlockTicker"; + } + + /** + * This method resets the 'unique' flag for {@link BlockTicker#uniqueTick()} + */ + public void startNewTick() { + unique = true; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/BowShootHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BowShootHandler.java new file mode 100644 index 000000000..27df1a474 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/BowShootHandler.java @@ -0,0 +1,14 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +@FunctionalInterface +public interface BowShootHandler extends ItemHandler { + + boolean onHit(EntityDamageByEntityEvent e, LivingEntity n); + + default String toCodename() { + return "BowShootHandler"; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/EntityKillHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/EntityKillHandler.java new file mode 100644 index 000000000..7dd695a97 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/EntityKillHandler.java @@ -0,0 +1,16 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.inventory.ItemStack; + +@FunctionalInterface +public interface EntityKillHandler extends ItemHandler { + + boolean onKill(EntityDeathEvent e, Entity entity, Player killer, ItemStack item); + + default String toCodename() { + return "EntityKillHandler"; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemConsumptionHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemConsumptionHandler.java new file mode 100644 index 000000000..6ce9b7c32 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemConsumptionHandler.java @@ -0,0 +1,16 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.ItemStack; + +@FunctionalInterface +public interface ItemConsumptionHandler extends ItemHandler { + + boolean onConsume(PlayerItemConsumeEvent e, Player p, ItemStack item); + + default String toCodename() { + return "ItemConsumptionHandler"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemHandler.java new file mode 100644 index 000000000..1abe961cf --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemHandler.java @@ -0,0 +1,7 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +@FunctionalInterface +public interface ItemHandler { + + String toCodename(); +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemInteractionHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemInteractionHandler.java new file mode 100644 index 000000000..f50ded287 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/ItemInteractionHandler.java @@ -0,0 +1,17 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +@FunctionalInterface +public interface ItemInteractionHandler extends ItemHandler { + + boolean onRightClick(ItemUseEvent e, Player p, ItemStack item); + + default String toCodename() { + return "ItemInteractionHandler"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/handlers/MultiBlockInteractionHandler.java b/src/me/mrCookieSlime/Slimefun/Objects/handlers/MultiBlockInteractionHandler.java new file mode 100644 index 000000000..db3d673b7 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/handlers/MultiBlockInteractionHandler.java @@ -0,0 +1,16 @@ +package me.mrCookieSlime.Slimefun.Objects.handlers; + +import me.mrCookieSlime.Slimefun.Objects.MultiBlock; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +@FunctionalInterface +public interface MultiBlockInteractionHandler extends ItemHandler { + + boolean onInteract(Player p, MultiBlock mb, Block b); + + default String toCodename() { + return "MultiBlockInteractionHandler"; + } +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetBootsTask.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetBootsTask.java index c303c48e3..a24f8cd6b 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetBootsTask.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetBootsTask.java @@ -1,6 +1,7 @@ package me.mrCookieSlime.Slimefun.Objects.tasks; import java.text.DecimalFormat; +import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.Effect; @@ -9,7 +10,6 @@ import org.bukkit.entity.Player; import org.bukkit.util.Vector; import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; -import me.mrCookieSlime.Slimefun.SlimefunStartup; import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; public class JetBootsTask extends SlimefunTask { @@ -25,16 +25,16 @@ public class JetBootsTask extends SlimefunTask { Player p = Bukkit.getPlayer(uuid); float cost = 0.075F; float charge = ItemEnergy.getStoredEnergy(p.getInventory().getBoots()); - double accuracy = Double.valueOf(new DecimalFormat("##.##").format(speed - 0.7).replace(",", ".")); + double accuracy = Double.parseDouble(new DecimalFormat("##.##").format(speed - 0.7).replace(",", ".")); if (charge >= cost) { p.getInventory().setBoots(ItemEnergy.chargeItem(p.getInventory().getBoots(), -cost)); PlayerInventory.update(p); p.getWorld().playSound(p.getLocation(), Sound.ENTITY_TNT_PRIMED, (float) 0.25, 1); p.getWorld().playEffect(p.getLocation(), Effect.SMOKE, 1, 1); - p.setFallDistance(0.0f); + p.setFallDistance(0F); double gravity = 0.04; - double offset = SlimefunStartup.chance(100, 50) ? accuracy: -accuracy; + double offset = new Random().nextInt(2) == 1 ? accuracy: -accuracy; Vector vector = new Vector(p.getEyeLocation().getDirection().getX() * speed + offset, gravity, p.getEyeLocation().getDirection().getZ() * speed - offset); p.setVelocity(vector); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetpackTask.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetpackTask.java index 789885279..9c7707f9a 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetpackTask.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/JetpackTask.java @@ -17,6 +17,7 @@ public class JetpackTask extends SlimefunTask { this.thrust = thrust; } + @Override public void setID(int id) { this.id = id; } @@ -32,7 +33,7 @@ public class JetpackTask extends SlimefunTask { p.getWorld().playSound(p.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, (float) 0.25, 1); p.getWorld().playEffect(p.getLocation(), Effect.SMOKE, 1, 1); - p.setFallDistance(0.0f); + p.setFallDistance(0F); Vector vector = new Vector(0, 1, 0); vector.multiply(thrust); vector.add(p.getEyeLocation().getDirection().multiply(0.2F)); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java index ecf026daf..0853a018d 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java @@ -16,18 +16,16 @@ public class MagnetTask extends SlimefunTask { @Override void executeTask() { for (Entity item: Bukkit.getPlayer(uuid).getNearbyEntities(6D, 6D, 6D)) { - if (item instanceof Item) { - if (!item.hasMetadata("no_pickup") && ((Item) item).getPickupDelay() <= 0) { - item.teleport(Bukkit.getPlayer(uuid).getEyeLocation()); - Bukkit.getPlayer(uuid).getWorld().playSound(Bukkit.getPlayer(uuid).getEyeLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 5L, 2L); - } + if (item instanceof Item && !item.hasMetadata("no_pickup") && ((Item) item).getPickupDelay() <= 0) { + item.teleport(Bukkit.getPlayer(uuid).getEyeLocation()); + Bukkit.getPlayer(uuid).getWorld().playSound(Bukkit.getPlayer(uuid).getEyeLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 5L, 2L); } } } @Override protected boolean cancelTask() { - return super.cancelTask() ? true: p.getGameMode() == GameMode.SPECTATOR; + return super.cancelTask() || p.getGameMode() == GameMode.SPECTATOR; } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/ParachuteTask.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/ParachuteTask.java index 9b5b32faa..9d25371cf 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/ParachuteTask.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/ParachuteTask.java @@ -16,7 +16,7 @@ public class ParachuteTask extends SlimefunTask { Vector vector = new Vector(0, 1, 0); vector.multiply(-0.1); p.setVelocity(vector); - p.setFallDistance(0.0f); + p.setFallDistance(0F); if (!p.isSneaking()) Bukkit.getScheduler().cancelTask(id); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/RainbowTicker.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/RainbowTicker.java index 24627a2ce..cab0bf760 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/RainbowTicker.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/RainbowTicker.java @@ -3,16 +3,16 @@ package me.mrCookieSlime.Slimefun.Objects.tasks; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import org.bukkit.block.Block; import org.bukkit.block.data.Waterlogged; public class RainbowTicker extends BlockTicker { - public int meta; - public int index; - public int[] queue; + private int meta; + private int index; + private int[] queue; public RainbowTicker() { this(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); @@ -28,17 +28,21 @@ public class RainbowTicker extends BlockTicker { public void tick(Block b, SlimefunItem item, Config data) { if (MaterialHelper.isWool(b.getType())) { b.setType(MaterialHelper.WoolColours[meta], false); - } else if (MaterialHelper.isStainedGlass(b.getType())) { + } + else if (MaterialHelper.isStainedGlass(b.getType())) { b.setType(MaterialHelper.StainedGlassColours[meta], false); - } else if (MaterialHelper.isStainedGlassPane(b.getType())){ + } + else if (MaterialHelper.isStainedGlassPane(b.getType())){ boolean waterlogged = ((Waterlogged) b.getBlockData()).isWaterlogged(); b.setType(MaterialHelper.StainedGlassPaneColours[meta], true); + if (waterlogged) { Waterlogged block = (Waterlogged) b.getBlockData(); block.setWaterlogged(true); b.setBlockData(block); } - } else if (MaterialHelper.isTerracotta(b.getType())){ + } + else if (MaterialHelper.isTerracotta(b.getType())){ b.setType(MaterialHelper.TerracottaColours[meta], false); } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java index 2a4f157e4..a7ba60ce7 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java @@ -31,10 +31,11 @@ public abstract class SlimefunTask implements Runnable { * @return True if task was cancelled. */ protected boolean cancelTask(){ - if(Bukkit.getPlayer(uuid) == null || Bukkit.getPlayer(uuid).isDead() || !Bukkit.getPlayer(uuid).isSneaking()) { + if (Bukkit.getPlayer(uuid) == null || Bukkit.getPlayer(uuid).isDead() || !Bukkit.getPlayer(uuid).isSneaking()) { Bukkit.getScheduler().cancelTask(id); return true; } + return false; } diff --git a/src/me/mrCookieSlime/Slimefun/Setup/CSCoreLibLoader.java b/src/me/mrCookieSlime/Slimefun/Setup/CSCoreLibLoader.java new file mode 100644 index 000000000..77dc33caf --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Setup/CSCoreLibLoader.java @@ -0,0 +1,156 @@ +package me.mrCookieSlime.Slimefun.Setup; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.logging.Level; + +import org.bukkit.plugin.Plugin; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class CSCoreLibLoader { + + private Plugin plugin; + private URL url; + private URL download; + private File file; + + public CSCoreLibLoader(Plugin plugin) { + this.plugin = plugin; + try { + this.url = new URL("https://api.curseforge.com/servermods/files?projectIds=88802"); + } catch (MalformedURLException e) { + plugin.getLogger().log(Level.SEVERE, "The Auto-Updater URL is malformed!", e); + } + } + + public boolean load() { + if (plugin.getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) return true; + else { + Slimefun.getLogger().log(Level.INFO, " "); + Slimefun.getLogger().log(Level.INFO, "#################### - INFO - ####################"); + Slimefun.getLogger().log(Level.INFO, " "); + Slimefun.getLogger().log(Level.INFO, plugin.getName() + " could not be loaded."); + Slimefun.getLogger().log(Level.INFO, "It appears that you have not installed CS-CoreLib"); + Slimefun.getLogger().log(Level.INFO, "Your Server will now try to download and install"); + Slimefun.getLogger().log(Level.INFO, "CS-CoreLib for you."); + Slimefun.getLogger().log(Level.INFO, "You will be asked to restart your Server when it's finished."); + Slimefun.getLogger().log(Level.INFO, "If this somehow fails, please download and install CS-CoreLib manually:"); + Slimefun.getLogger().log(Level.INFO, "https://dev.bukkit.org/projects/cs-corelib"); + Slimefun.getLogger().log(Level.INFO, " "); + Slimefun.getLogger().log(Level.INFO, "#################### - INFO - ####################"); + Slimefun.getLogger().log(Level.INFO, " "); + plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (connect()) install(); + }, 10L); + return false; + } + } + + private boolean connect() { + try { + final URLConnection connection = this.url.openConnection(); + connection.setConnectTimeout(5000); + connection.addRequestProperty("User-Agent", "CS-CoreLib Loader (by mrCookieSlime)"); + connection.setDoOutput(true); + + final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + final JsonArray array = new JsonParser().parse(reader).getAsJsonArray(); + final JsonObject json = array.get(array.size() - 1).getAsJsonObject(); + + download = traceURL(json.get("downloadUrl").getAsString().replace("https:", "http:")); + file = new File("plugins/" + json.get("name").getAsString() + ".jar"); + + return true; + } catch (IOException e) { + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "#################### - WARNING - ####################"); + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "Could not connect to BukkitDev."); + Slimefun.getLogger().log(Level.WARNING, "Please download & install CS-CoreLib manually:"); + Slimefun.getLogger().log(Level.WARNING, "https://dev.bukkit.org/projects/cs-corelib"); + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "#################### - WARNING - ####################"); + Slimefun.getLogger().log(Level.WARNING, " "); + return false; + } + } + + private URL traceURL(String location) throws IOException { + HttpURLConnection connection = null; + + while (true) { + URL url = new URL(location); + connection = (HttpURLConnection) url.openConnection(); + + connection.setInstanceFollowRedirects(false); + connection.setConnectTimeout(5000); + connection.addRequestProperty("User-Agent", "Auto Updater (by mrCookieSlime)"); + + int response = connection.getResponseCode(); + + if (response == HttpURLConnection.HTTP_MOVED_PERM || response == HttpURLConnection.HTTP_MOVED_TEMP) { + String loc = connection.getHeaderField("Location"); + location = new URL(new URL(location), loc).toExternalForm(); + } + else { + break; + } + } + + return new URL(connection.getURL().toString().replace(" ", "%20")); + } + + private void install() { + BufferedInputStream input = null; + FileOutputStream output = null; + try { + input = new BufferedInputStream(download.openStream()); + output = new FileOutputStream(file); + + final byte[] data = new byte[1024]; + int read; + while ((read = input.read(data, 0, 1024)) != -1) { + output.write(data, 0, read); + } + } catch (Exception ex) { + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "#################### - WARNING - ####################"); + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "Failed to download CS-CoreLib"); + Slimefun.getLogger().log(Level.WARNING, "Please download & install CS-CoreLib manually:"); + Slimefun.getLogger().log(Level.WARNING, "https://dev.bukkit.org/projects/cs-corelib"); + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "#################### - WARNING - ####################"); + Slimefun.getLogger().log(Level.WARNING, " "); + } finally { + try { + if (input != null) input.close(); + if (output != null) output.close(); + Slimefun.getLogger().log(Level.INFO, " "); + Slimefun.getLogger().log(Level.INFO, "#################### - INFO - ####################"); + Slimefun.getLogger().log(Level.INFO, " "); + Slimefun.getLogger().log(Level.INFO, "Please restart your Server to finish the Installation"); + Slimefun.getLogger().log(Level.INFO, "of " + plugin.getName() + " and CS-CoreLib"); + Slimefun.getLogger().log(Level.INFO, " "); + Slimefun.getLogger().log(Level.INFO, "#################### - INFO - ####################"); + Slimefun.getLogger().log(Level.INFO, " "); + } catch (IOException x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while closing the Download Stream for CS-CoreLib", x); + } + } + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Setup/Files.java b/src/me/mrCookieSlime/Slimefun/Setup/Files.java index a56933e90..7df6b97b4 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/Files.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/Files.java @@ -1,50 +1,54 @@ package me.mrCookieSlime.Slimefun.Setup; import java.io.File; +import java.util.logging.Level; -public class Files { +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public final class Files { - public static File RESEARCHES = new File("plugins/Slimefun/Researches.yml"); - public static File CONFIG = new File("plugins/Slimefun/config.yml"); - public static File ITEMS = new File("plugins/Slimefun/Items.yml"); - public static File DATABASE = new File("data-storage/Slimefun/Players"); - public static File WHITELIST = new File("plugins/Slimefun/whitelist.yml"); + public final File researches = new File("plugins/Slimefun/Researches.yml"); + public final File config = new File("plugins/Slimefun/config.yml"); + public final File items = new File("plugins/Slimefun/Items.yml"); + public final File database = new File("data-storage/Slimefun/Players"); + public final File whitelist = new File("plugins/Slimefun/whitelist.yml"); - public static void cleanup() { - if (!RESEARCHES.exists()) { - System.err.println("###############################################"); - System.err.println("############## = - INFO - = #################"); - System.err.println("###############################################"); - System.err.println(" "); - System.err.println("Slimefun Warning:"); - System.err.println(" "); - System.err.println("Slimefun has detected that your Files are either"); - System.err.println("outdated or do not exist. We generated new Files"); - System.err.println("instead otherwise Slimefun would not work. If you"); - System.err.println("have used Slimefun before, your Settings are now"); - System.err.println("gone. But therefore Slimefun works!"); + public void cleanup() { + if (!researches.exists()) { + Slimefun.getLogger().log(Level.WARNING, "###############################################"); + Slimefun.getLogger().log(Level.WARNING, "############## = - INFO - = #################"); + Slimefun.getLogger().log(Level.WARNING, "###############################################"); + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "Slimefun Warning:"); + Slimefun.getLogger().log(Level.WARNING, " "); + Slimefun.getLogger().log(Level.WARNING, "Slimefun has detected that your Files are either"); + Slimefun.getLogger().log(Level.WARNING, "outdated or do not exist. We generated new Files"); + Slimefun.getLogger().log(Level.WARNING, "instead otherwise Slimefun would not work. If you"); + Slimefun.getLogger().log(Level.WARNING, "have used Slimefun before, your Settings are now"); + Slimefun.getLogger().log(Level.WARNING, "gone. But therefore Slimefun works!"); delete(new File("plugins/Slimefun")); delete(new File("data-storage/Slimefun")); } - if (!DATABASE.exists()) { - DATABASE.mkdirs(); + if (!database.exists()) { + database.mkdirs(); } } - public static void delete(File folder) { + public boolean delete(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File current: files) { if (current.isDirectory()) { - delete(current); + if (!delete(current)) return false; } else { - current.delete(); + if (!current.delete()) return false; } } } - folder.delete(); + + return folder.delete(); } } diff --git a/src/me/mrCookieSlime/Slimefun/Setup/Messages.java b/src/me/mrCookieSlime/Slimefun/Setup/Messages.java index cf7a9086a..df3fd95a1 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/Messages.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/Messages.java @@ -2,16 +2,15 @@ package me.mrCookieSlime.Slimefun.Setup; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Localization; -public class Messages { +public final class Messages { + + private Messages() {} public static Localization local; public static void setup() { local.setPrefix("&aSlimefun &7> "); - local.setDefault("messages.not-researched", "&4You do not have enough Knowledge to understand this"); - local.setDefault("messages.not-enough-xp", "&4You do not have enough XP to unlock this"); - local.setDefault("messages.unlocked", "&bYou have unlocked &7\"%research%\""); - local.setDefault("messages.fortune-cookie", new String[] {"&7Help me, I am trapped in a Fortune Cookie Factory!", "&7You will die tomorrow... by a Creeper", "&7At some Point in your Life something bad will happen!!!", "&7Next week you will notice that this is not the real World, you are in a kind of \"Matrix\" or lets call it Computer game. Yes you are in a Computer Game", "&7This Cookie will taste good in a few seconds", "&7You will die soon and the last word you will hear is gonna be \"EXTERMINATE!!!\"", "&7Whatever you do, do not hug a Creeper... I tried it. It feels good, but it's not worth it."}); + local.setDefault("commands.help", "Displays this Help Screen"); local.setDefault("commands.cheat", "Allows you to cheat Items"); local.setDefault("commands.give", "Give somebody some Slimefun Items"); @@ -21,7 +20,14 @@ public class Messages { local.setDefault("commands.teleporter", "See other Player's Waypoints"); local.setDefault("commands.versions", "Lists all installed Addons"); local.setDefault("commands.open_guide", "Opens Slimefun's guide without using the book"); - + local.setDefault("commands.stats", "Shows some Stats about a Player"); + local.setDefault("commands.research.reset", "&cYou have reset %player%'s Knowledge"); + local.setDefault("commands.research.reset-target", "&cYour Knowledge has been reset"); + + local.setDefault("messages.not-researched", "&4You do not have enough Knowledge to understand this"); + local.setDefault("messages.not-enough-xp", "&4You do not have enough XP to unlock this"); + local.setDefault("messages.unlocked", "&bYou have unlocked &7\"%research%\""); + local.setDefault("messages.fortune-cookie", "&7Help me, I am trapped in a Fortune Cookie Factory!", "&7You will die tomorrow... by a Creeper", "&7At some Point in your Life something bad will happen!!!", "&7Next week you will notice that this is not the real World, you are in a kind of \"Matrix\" or lets call it Computer game. Yes you are in a Computer Game", "&7This Cookie will taste good in a few seconds", "&7You will die soon and the last word you will hear is gonna be \"EXTERMINATE!!!\"", "&7Whatever you do, do not hug a Creeper... I tried it. It feels good, but it's not worth it."); local.setDefault("messages.only-players", "&4This Command is only for Players"); local.setDefault("messages.no-permission", "&4You do not have the required Permission to do this"); local.setDefault("messages.usage", "&4Usage: &c%usage%"); @@ -57,23 +63,32 @@ public class Messages { local.setDefault("messages.disabled-item", "&4&lThis Item has been disabled! How did you even get that?"); local.setDefault("messages.research.start", "&7The Ancient Spirits whisper mysterious Words into your Ear!"); local.setDefault("messages.research.progress", "&7You start to wonder about &b%research% &e(%progress%)"); - local.setDefault("commands.stats", "Shows some Stats about a Player"); local.setDefault("messages.fire-extinguish", "&7You have extinguished yourself"); + local.setDefault("messages.cannot-place" ,"&cYou cannot place that block there!"); + local.setDefault("messages.no-pvp" ,"&cYou cannot pvp in here!"); + + local.setDefault("tooltips.item-permission", "", "&rYou do not have Permission", "&rto access this Item"); + local.setDefault("machines.pattern-not-found", "&eSorry, I could not recognize this Pattern. Please place the Items in the correct Pattern into the Dispenser."); local.setDefault("machines.unknown-material", "&eSorry, I could not recognize the Item in my Dispenser. Please put something in that I know."); local.setDefault("machines.wrong-item", "&eSorry, I could not recognize the Item you right clicked me with. Check the Recipes and see which Items you can use."); local.setDefault("machines.full-inventory", "&eSorry, my Inventory is too full!"); - local.setDefault("miner.no-ores", "&eSorry, I could not find any Ores nearby!"); - local.setDefault("backpack.already-open", "&cSorry, this backpack is open somewhere else!"); - local.setDefault("backpack.no-stack", "&cYou cannot stack Backpacks"); - local.setDefault("workbench.not-enhanced", "&4You cannot use Slimefun Items in a normal Workbench"); - local.setDefault("anvil.not-working", "&4You cannot use Slimefun Items in an Anvil"); - local.setDefault("commands.research.reset", "&cYou have reset %player%'s Knowledge"); - local.setDefault("commands.research.reset-target", "&cYour Knowledge has been reset"); local.setDefault("machines.in-use", "&cThis Block's Inventory is currently opened by a different Player."); local.setDefault("machines.ignition-chamber-no-flint", "&cIgnition Chamber is missing Flint and Steel."); - local.setDefault("messages.cannot-place" ,"&cYou cannot place that block there!"); - + local.setDefault("anvil.not-working", "&4You cannot use Slimefun Items in an Anvil"); + local.setDefault("backpack.already-open", "&cSorry, this backpack is open somewhere else!"); + local.setDefault("backpack.no-stack", "&cYou cannot stack Backpacks"); + local.setDefault("miner.no-ores", "&eSorry, I could not find any Ores nearby!"); + local.setDefault("workbench.not-enhanced", "&4You cannot use Slimefun Items in a normal Workbench"); + + local.setDefault("machines.ANCIENT_ALTAR.not-enough-pedestals", "&4The Altar is not surrounded by the needed Amount of Pedestals &c(%pedestals% / 8)"); + local.setDefault("machines.ANCIENT_ALTAR.unknown-catalyst", "&4Unknown Catalyst! &cUse the correct Recipe instead!"); + local.setDefault("machines.ANCIENT_ALTAR.unknown-recipe", "&4Unknown Recipe! &cUse the correct Recipe instead!"); + local.setDefault("machines.ANCIENT_PEDESTAL.obstructed", "&4Pedestal is obstructed! &cRemove anything above the pedestal!"); + local.setDefault("machines.HOLOGRAM_PROJECTOR.enter-text", "&7Please enter your desired Hologram Text in your Chat. &r(Color Codes are supported!)"); + local.setDefault("machines.ELEVATOR.no-destinations", "&4No Destinations found"); + local.setDefault("machines.CARGO_NODES.must-be-placed", "&4Must be placed onto a Chest or Machine"); + local.setDefault("gps.waypoint.new", "&ePlease type in a Name for your new Waypoint in the Chat. &7(Color Codes supported!)"); local.setDefault("gps.waypoint.added", "&aSuccessfully added a new Waypoint"); local.setDefault("gps.waypoint.max", "&4You have reached the Maximum Amount of Waypoints"); @@ -83,14 +98,6 @@ public class Messages { local.setDefault("robot.started", "&7Your Robot resumed running its Script"); local.setDefault("robot.stopped", "&7Your Robot has paused its Script"); local.setDefault("inventory.no-access", "&4You are not permitted to access this Block"); - - local.setDefault("machines.ANCIENT_ALTAR.not-enough-pedestals", "&4The Altar is not surrounded by the needed Amount of Pedestals &c(%pedestals% / 8)"); - local.setDefault("machines.ANCIENT_ALTAR.unknown-catalyst", "&4Unknown Catalyst! &cUse the correct Recipe instead!"); - local.setDefault("machines.ANCIENT_ALTAR.unknown-recipe", "&4Unknown Recipe! &cUse the correct Recipe instead!"); - local.setDefault("machines.ANCIENT_PEDESTAL.obstructed", "&4Pedestal is obstructed! &cRemove anything above the pedestal!"); - local.setDefault("machines.HOLOGRAM_PROJECTOR.enter-text", "&7Please enter your desired Hologram Text in your Chat. &r(Color Codes are supported!)"); - local.setDefault("machines.ELEVATOR.no-destinations", "&4No Destinations found"); - local.setDefault("machines.CARGO_NODES.must-be-placed", "&4Must be placed onto a Chest or Machine"); local.setDefault("android.scripts.already-uploaded", "&4This Script has already been uploaded."); local.setDefault("android.scripts.enter-name", "", "&ePlease type in a Name for your Script", ""); diff --git a/src/me/mrCookieSlime/Slimefun/Setup/MiscSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/MiscSetup.java index 00656a4c3..c859aaeaf 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/MiscSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/MiscSetup.java @@ -3,38 +3,42 @@ package me.mrCookieSlime.Slimefun.Setup; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.logging.Level; +import java.util.stream.Stream; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.command.CommandSender; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.Colors; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItemSerializer; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItemSerializer.ItemFlag; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; -import me.mrCookieSlime.Slimefun.Misc.PostSlimefunLoadingHandler; import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Alloy; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingAlloy; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutomatedCraftingChamber; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AutomatedCraftingChamber; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunRecipes; +import me.mrCookieSlime.Slimefun.utils.Settings; -public class MiscSetup { +public final class MiscSetup { - public static List post_handlers = new ArrayList<>(); + private MiscSetup() {} public static void setupMisc() { if (SlimefunItem.getByID("COMMON_TALISMAN") != null && (Boolean) Slimefun.getItemValue("COMMON_TALISMAN", "recipe-requires-nether-stars")) { SlimefunItem.getByID("COMMON_TALISMAN").setRecipe(new ItemStack[] {SlimefunItems.MAGIC_LUMP_2, SlimefunItems.GOLD_8K, SlimefunItems.MAGIC_LUMP_2, null, new ItemStack(Material.NETHER_STAR), null, SlimefunItems.MAGIC_LUMP_2, SlimefunItems.GOLD_8K, SlimefunItems.MAGIC_LUMP_2}); } + SlimefunItem.setRadioactive(SlimefunItems.URANIUM); SlimefunItem.setRadioactive(SlimefunItems.SMALL_URANIUM); SlimefunItem.setRadioactive(SlimefunItems.BLISTERING_INGOT); @@ -44,16 +48,16 @@ public class MiscSetup { SlimefunItem.setRadioactive(SlimefunItems.ENRICHED_NETHER_ICE); } - public static void loadItems() { - Iterator iterator = SlimefunItem.items.iterator(); + public static void loadItems(Settings settings) { + Iterator iterator = SlimefunItem.list().iterator(); while (iterator.hasNext()) { SlimefunItem item = iterator.next(); if (item == null) { - System.err.println("[Slimefun] Removed bugged Item ('NULL?')"); + Slimefun.getLogger().log(Level.WARNING, "Removed bugged Item ('NULL?')"); iterator.remove(); } else if (item.getItem() == null) { - System.err.println("[Slimefun] Removed bugged Item ('" + item.getID() + "')"); + Slimefun.getLogger().log(Level.WARNING, "Removed bugged Item ('" + item.getID() + "')"); iterator.remove(); } } @@ -116,11 +120,13 @@ public class MiscSetup { i++; } - AutomatedCraftingChamber.recipes.put(builder.toString(), RecipeType.getRecipeOutputList(machine, inputs)); + SlimefunPlugin.getUtilities().automatedCraftingChamberRecipes.put(builder.toString(), RecipeType.getRecipeOutputList(machine, inputs)); } } + List grinderRecipes = new ArrayList<>(); + SlimefunItem grinder = SlimefunItem.getByID("GRIND_STONE"); if (grinder != null) { ItemStack[] input = null; @@ -128,7 +134,7 @@ public class MiscSetup { if (input == null) input = recipe; else { if (input[0] != null && recipe[0] != null) { - SlimefunRecipes.registerMachineRecipe("ELECTRIC_ORE_GRINDER", 4, new ItemStack[] {input[0]}, new ItemStack[] {recipe[0]}); + grinderRecipes.add(new ItemStack[] {input[0], recipe[0]}); } input = null; } @@ -142,13 +148,22 @@ public class MiscSetup { if (input == null) input = recipe; else { if (input[0] != null && recipe[0] != null) { - SlimefunRecipes.registerMachineRecipe("ELECTRIC_ORE_GRINDER", 4, new ItemStack[] {input[0]}, new ItemStack[] {recipe[0]}); + grinderRecipes.add(new ItemStack[] {input[0], recipe[0]}); } input = null; } } } - + + // Favour 8 Cobblestone -> 1 Sand Recipe over 1 Cobblestone -> 1 Gravel Recipe + Stream stream = grinderRecipes.stream(); + + if (!settings.legacyOreGrinder) { + stream = stream.sorted((a, b) -> Integer.compare(b[0].getAmount(), a[0].getAmount())); + } + + stream.forEach(recipe -> SlimefunRecipes.registerMachineRecipe("ELECTRIC_ORE_GRINDER", 4, new ItemStack[] {recipe[0]}, new ItemStack[] {recipe[1]})); + SlimefunItem smeltery = SlimefunItem.getByID("SMELTERY"); if (smeltery != null) { ItemStack[] input = null; @@ -158,6 +173,7 @@ public class MiscSetup { if (input[0] != null && recipe[0] != null) { List inputs = new ArrayList<>(); boolean dust = false; + for (ItemStack i: input) { if (i != null) { inputs.add(i); @@ -172,14 +188,13 @@ public class MiscSetup { if (SlimefunManager.isItemSimiliar(i, SlimefunItems.ZINC_DUST, true)) dust = true; } } - - if (dust && inputs.size() == 1) { - // Dust -> Ingot Recipe, we want to exclude those - } - else { + + // We want to exclude Dust to Ingot Recipes + if (!(dust && inputs.size() == 1)) { SlimefunRecipes.registerMachineRecipe("ELECTRIC_SMELTERY", 12, inputs.toArray(new ItemStack[inputs.size()]), new ItemStack[] {recipe[0]}); } } + input = null; } } @@ -188,24 +203,31 @@ public class MiscSetup { CommandSender sender = Bukkit.getConsoleSender(); ChatColor color = Colors.getRandom(); - for (PostSlimefunLoadingHandler handler: post_handlers) { + for (PostSlimefunLoadingHandler handler: SlimefunPlugin.getUtilities().postHandlers) { handler.run(pre, init, post); } sender.sendMessage(color + "###################### - Slimefun - ######################"); sender.sendMessage(color + "Successfully loaded " + SlimefunItem.list().size() + " Items (" + Research.list().size() + " Researches)"); - sender.sendMessage(color + "( " + SlimefunItem.vanilla + " Items from Slimefun, " + (SlimefunItem.list().size() - SlimefunItem.vanilla) + " Items from Addons )"); + sender.sendMessage(color + "( " + SlimefunPlugin.getUtilities().vanillaItems + " Items from Slimefun, " + (SlimefunItem.list().size() - SlimefunPlugin.getUtilities().vanillaItems) + " Items from Addons )"); sender.sendMessage(color + "##########################################################"); - SlimefunStartup.getItemCfg().save(); - SlimefunStartup.getResearchCfg().save(); - SlimefunStartup.getWhitelist().save(); + SlimefunPlugin.getItemCfg().save(); + SlimefunPlugin.getResearchCfg().save(); + SlimefunPlugin.getWhitelist().save(); } public static void setupItemSettings() { for (World world: Bukkit.getWorlds()) { - SlimefunStartup.getWhitelist().setDefaultValue(world.getName() + ".enabled-items.SLIMEFUN_GUIDE", true); + SlimefunPlugin.getWhitelist().setDefaultValue(world.getName() + ".enabled-items.SLIMEFUN_GUIDE", true); } + Slimefun.setItemVariable("ORE_CRUSHER", "double-ores", true); + + for (Enchantment e : Enchantment.values()) { + for (int i = 1; i <= e.getMaxLevel(); i++) { + Slimefun.setItemVariable("MAGICIAN_TALISMAN", "allow-enchantments." + e.getKey().getKey() + ".level." + i, true); + } + } } public static void loadDescriptions() { diff --git a/src/me/mrCookieSlime/Slimefun/Misc/PostSlimefunLoadingHandler.java b/src/me/mrCookieSlime/Slimefun/Setup/PostSlimefunLoadingHandler.java similarity index 86% rename from src/me/mrCookieSlime/Slimefun/Misc/PostSlimefunLoadingHandler.java rename to src/me/mrCookieSlime/Slimefun/Setup/PostSlimefunLoadingHandler.java index e75244127..d54b47b04 100644 --- a/src/me/mrCookieSlime/Slimefun/Misc/PostSlimefunLoadingHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/PostSlimefunLoadingHandler.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Misc; +package me.mrCookieSlime.Slimefun.Setup; import java.util.List; diff --git a/src/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java index b35fed5c4..a8bbd7377 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java @@ -7,7 +7,9 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -public class ResearchSetup { +public final class ResearchSetup { + + private ResearchSetup() {} public static void setupResearches() { Slimefun.registerResearch(new Research(0, "Walking Sticks", 1), SlimefunItems.GRANDMAS_WALKING_STICK, SlimefunItems.GRANDPAS_WALKING_STICK); @@ -103,7 +105,7 @@ public class ResearchSetup { Slimefun.registerResearch(new Research(98, "Advanced Mining 101", 42), SlimefunItems.ADVANCED_DIGITAL_MINER); Slimefun.registerResearch(new Research(99, "Composting Dirt", 3), SlimefunItems.COMPOSTER); Slimefun.registerResearch(new Research(100, "Farmer Shoes", 4), SlimefunItems.FARMER_SHOES); - Slimefun.registerResearch(new Research(101, "Explosive Pickaxe", 28), SlimefunItems.EXPLOSIVE_PICKAXE); + Slimefun.registerResearch(new Research(101, "Explosive Tools", 30), SlimefunItems.EXPLOSIVE_PICKAXE, SlimefunItems.EXPLOSIVE_SHOVEL); Slimefun.registerResearch(new Research(102, "Automated Gold Pan", 17), SlimefunItems.AUTOMATED_PANNING_MACHINE); Slimefun.registerResearch(new Research(103, "Boots of the Stomper", 19), SlimefunItems.BOOTS_OF_THE_STOMPER); Slimefun.registerResearch(new Research(104, "Pickaxe of the Seeker", 19), SlimefunItems.PICKAXE_OF_THE_SEEKER); @@ -238,5 +240,8 @@ public class ResearchSetup { Slimefun.registerResearch(new Research(240, "Basic machinery output chest", 20), SlimefunItems.OUTPUT_CHEST); Slimefun.registerResearch(new Research(241, "Thinned-down Conductivity", 15), SlimefunItems.COPPER_WIRE); Slimefun.registerResearch(new Research(242, "Radiant Backpack", 25), SlimefunItems.RADIANT_BACKPACK); + Slimefun.registerResearch(new Research(243, "A Dry Day", 15), SlimefunItems.AUTO_DRIER); + Slimefun.registerResearch(new Research(244, "Diet Cookie", 3), SlimefunItems.DIET_COOKIE); + Slimefun.registerResearch(new Research(245, "Storm Staff", 30), SlimefunItems.STAFF_STORM); } } diff --git a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunManager.java b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunManager.java index 7a87f9891..185f8fd4f 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunManager.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunManager.java @@ -1,15 +1,12 @@ package me.mrCookieSlime.Slimefun.Setup; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.bukkit.entity.EntityType; +import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; -import me.mrCookieSlime.Slimefun.SlimefunStartup; import me.mrCookieSlime.Slimefun.Lists.Categories; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; @@ -17,38 +14,43 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.VanillaItem; -public class SlimefunManager { +public final class SlimefunManager { - public static SlimefunStartup plugin; - public static String PREFIX; - public static Map> drops = new HashMap<>(); + private SlimefunManager() {} public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, PotionEffect[][] effects, boolean special, boolean slimefun) { String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"}; Category cat = special ? Categories.MAGIC_ARMOR: Categories.ARMOR; - List recipes = new ArrayList(); + List recipes = new ArrayList<>(); recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, null, null, null}); recipes.add(new ItemStack[] {baseComponent, null, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent}); recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent}); recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent}); + for (int i = 0; i < 4; i++) { - if ((effects.length - 1) >= i) if (effects[i].length > 0) new SlimefunArmorPiece(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i), effects[i]).register(slimefun); - else new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun); + if (i < effects.length && effects[i].length > 0) { + new SlimefunArmorPiece(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i), effects[i]).register(slimefun); + } + else { + new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun); + } } } public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, boolean slimefun, boolean vanilla) { String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"}; Category cat = Categories.ARMOR; - List recipes = new ArrayList(); + List recipes = new ArrayList<>(); recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, null, null, null}); recipes.add(new ItemStack[] {baseComponent, null, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent}); recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent}); recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent}); + for (int i = 0; i < 4; i++) { if (vanilla) { new VanillaItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun); - } else { + } + else { new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun); } } @@ -65,8 +67,38 @@ public class SlimefunManager { // Material.STONE, // Material.COAL, Material.SKULL_ITEM, Material.RAW_FISH, Material.COOKED_FISH); - public static boolean isItemSimiliar(ItemStack item, ItemStack SFitem, boolean lore) { - return isItemSimiliar(item, SFitem, lore, DataType.IF_COLORED); + public static boolean isItemSimiliar(ItemStack item, ItemStack sfitem, boolean lore) { + if (item == null) return sfitem == null; + if (sfitem == null) return false; + + if (item.getType() == sfitem.getType() && item.getAmount() >= sfitem.getAmount()) { + if (item.hasItemMeta() && sfitem.hasItemMeta()) { + if (item.getItemMeta().hasDisplayName() && sfitem.getItemMeta().hasDisplayName()) { + if (item.getItemMeta().getDisplayName().equals(sfitem.getItemMeta().getDisplayName())) { + if (lore) { + if (item.getItemMeta().hasLore() && sfitem.getItemMeta().hasLore()) { + return equalsLore(item.getItemMeta().getLore(), sfitem.getItemMeta().getLore()); + } + else return !item.getItemMeta().hasLore() && !sfitem.getItemMeta().hasLore(); + } + else return true; + } + else return false; + } + else if (!item.getItemMeta().hasDisplayName() && !sfitem.getItemMeta().hasDisplayName()) { + if (lore) { + if (item.getItemMeta().hasLore() && sfitem.getItemMeta().hasLore()) { + return equalsLore(item.getItemMeta().getLore(), sfitem.getItemMeta().getLore()); + } + else return !item.getItemMeta().hasLore() && !sfitem.getItemMeta().hasLore(); + } + else return true; + } + else return false; + } + else return !item.hasItemMeta() && !sfitem.hasItemMeta(); + } + else return false; } @@ -80,48 +112,26 @@ public class SlimefunManager { } @Deprecated - public static boolean isItemSimiliar(ItemStack item, ItemStack SFitem, boolean lore, DataType data) { - if (item == null) return SFitem == null; - if (SFitem == null) return false; - - if (item.getType() == SFitem.getType() && item.getAmount() >= SFitem.getAmount()) { - if (item.hasItemMeta() && SFitem.hasItemMeta()) { - if (item.getItemMeta().hasDisplayName() && SFitem.getItemMeta().hasDisplayName()) { - if (item.getItemMeta().getDisplayName().equals(SFitem.getItemMeta().getDisplayName())) { - if (lore) { - if (item.getItemMeta().hasLore() && SFitem.getItemMeta().hasLore()) { - return equalsLore(item.getItemMeta().getLore(), SFitem.getItemMeta().getLore()); - } - else return !item.getItemMeta().hasLore() && !SFitem.getItemMeta().hasLore(); - } - else return true; - } - else return false; - } - else if (!item.getItemMeta().hasDisplayName() && !SFitem.getItemMeta().hasDisplayName()) { - if (lore) { - if (item.getItemMeta().hasLore() && SFitem.getItemMeta().hasLore()) { - return equalsLore(item.getItemMeta().getLore(), SFitem.getItemMeta().getLore()); - } - else return !item.getItemMeta().hasLore() && !SFitem.getItemMeta().hasLore(); - } - else return true; - } - else return false; - } - else return !item.hasItemMeta() && !SFitem.hasItemMeta(); - } - else return false; + public static boolean isItemSimiliar(ItemStack item, ItemStack sfitem, boolean lore, DataType data) { + return isItemSimiliar(item, sfitem, lore); } private static boolean equalsLore(List lore, List lore2) { - String string1 = "", string2 = ""; + StringBuilder string1 = new StringBuilder(); + StringBuilder string2 = new StringBuilder(); + for (String string: lore) { - if (!string.startsWith("&e&e&7")) string1 = string1 + "-NEW LINE-" + string; + if (!string.startsWith(ChatColor.translateAlternateColorCodes('&', "&e&e&7"))) { + string1.append("-NEW LINE-" + string); + } } + for (String string: lore2) { - if (!string.startsWith("&e&e&7")) string2 = string2 + "-NEW LINE-" + string; + if (!string.startsWith(ChatColor.translateAlternateColorCodes('&', "&e&e&7"))) { + string2.append("-NEW LINE-" + string); + } } - return string1.equals(string2); + + return string1.toString().equals(string2.toString()); } } diff --git a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index 41c158646..7f8196b71 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -1,11 +1,12 @@ package me.mrCookieSlime.Slimefun.Setup; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; +import java.util.Random; import java.util.UUID; +import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -19,70 +20,42 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; import org.bukkit.block.CreatureSpawner; -import org.bukkit.block.Dispenser; -import org.bukkit.block.Hopper; -import org.bukkit.block.data.Ageable; -import org.bukkit.block.data.Levelled; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.Bat; import org.bukkit.entity.EnderPearl; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import org.bukkit.entity.FallingBlock; -import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockDispenseEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; -import me.mrCookieSlime.CSCoreLibPlugin.general.Block.TreeCalculator; -import me.mrCookieSlime.CSCoreLibPlugin.general.Block.Vein; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.SkullItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow; import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; -import me.mrCookieSlime.CSCoreLibPlugin.general.Recipe.RecipeCalculator; -import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Variables; -import me.mrCookieSlime.Slimefun.Android.AndroidType; -import me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid; -import me.mrCookieSlime.Slimefun.GPS.Elevator; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.GPS.GPSNetwork; import me.mrCookieSlime.Slimefun.GPS.NetworkStatus; import me.mrCookieSlime.Slimefun.Lists.Categories; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; -import me.mrCookieSlime.Slimefun.Misc.PostSlimefunLoadingHandler; import me.mrCookieSlime.Slimefun.Objects.MultiBlock; -import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Alloy; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.EnhancedFurnace; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ExcludedBlock; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ExcludedSoulboundTool; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ExcludedTool; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.HandledBlock; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.JetBoots; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Jetpack; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Juice; @@ -92,7 +65,6 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBow; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SolarHelmet; @@ -101,68 +73,111 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Talisman; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.VanillaItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.Teleporter; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.AutonomousMachineHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockBreakHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockPlaceHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BowShootHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemInteractionHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.MultiBlockInteractionHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AdvancedCargoOutputNode; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AnimalGrowthAccelerator; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoAnvil; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoBreeder; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoDisenchanter; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoEnchanter; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutomatedCraftingChamber; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CarbonPress; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CargoInputNode; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CargoOutputNode; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ChargingBench; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CropGrowthAccelerator; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricDustWasher; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricFurnace; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricGoldPan; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricIngotFactory; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricSmeltery; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectrifiedCrucible; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.FluidPump; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.FoodComposter; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.FoodFabricator; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.Freezer; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.HeatedPressureChamber; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.NetherDrill; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.OilPump; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo.AdvancedCargoOutputNode; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo.CargoInputNode; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo.CargoManagerBlock; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo.CargoOutputNode; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.DietCookie; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.ExplosivePickaxe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.ExplosiveShovel; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.GoldPan; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.GrapplingHook; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.HerculesPickaxe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.HunterTalisman; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.InfernalBonemeal; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.KnowledgeFlask; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.KnowledgeTome; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.LumberAxe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.MagicSugar; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.MonsterJerky; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfContainment; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfTheSeeker; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfVeinMining; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.SeismicAxe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.SmeltersPickaxe; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.StormStaff; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.SwordOfBeheading; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.TelepositionScroll; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AncientPedestal; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.BlockPlacer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.Composter; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.Crucible; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.HologramProjector; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.InfusedHopper; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ReactorAccessPort; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.Refinery; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.TrashCan; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.WitherAssembler; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.XPCollector; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AnimalGrowthAccelerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AutoAnvil; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AutoBreeder; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AutoDisenchanter; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AutoDrier; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AutoEnchanter; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.AutomatedCraftingChamber; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.CarbonPress; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ChargingBench; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.CropGrowthAccelerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectricDustWasher; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectricFurnace; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectricGoldPan; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectricIngotFactory; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectricIngotPulverizer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectricOreGrinder; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectricSmeltery; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElectrifiedCrucible; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.ElevatorPlate; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.EnergyRegulator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.FluidPump; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.FoodComposter; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.FoodFabricator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.Freezer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.HeatedPressureChamber; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.NetherDrill; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.OilPump; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.Refinery; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.WitherAssembler; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.generators.CoalGenerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.generators.CombustionGenerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.generators.LavaGenerator; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.ArmorForge; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.AutomatedPanningMachine; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.Compressor; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.EnhancedCraftingTable; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.GrindStone; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.Juicer; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.MagicWorkbench; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.OreCrusher; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.OreWasher; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.PressureChamber; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.Smeltery; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.TableSaw; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockPlaceHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.MultiBlockInteractionHandler; import me.mrCookieSlime.Slimefun.Objects.tasks.RainbowTicker; +import me.mrCookieSlime.Slimefun.androids.AndroidType; +import me.mrCookieSlime.Slimefun.androids.ProgrammableAndroid; import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; -import me.mrCookieSlime.Slimefun.api.energy.EnergyNet; import me.mrCookieSlime.Slimefun.api.energy.EnergyTicker; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; -import me.mrCookieSlime.Slimefun.holograms.CargoHologram; -import me.mrCookieSlime.Slimefun.holograms.EnergyHologram; -import me.mrCookieSlime.Slimefun.holograms.InfusedHopper; -import me.mrCookieSlime.Slimefun.holograms.Projector; import me.mrCookieSlime.Slimefun.holograms.ReactorHologram; -import me.mrCookieSlime.Slimefun.listeners.AncientAltarListener; -public class SlimefunSetup { +public final class SlimefunSetup { + + private SlimefunSetup() {} - public static boolean legacy_ore_washer = false; - - public static void setupItems() throws Exception { + public static void setupItems() { + Random random = new Random(); + new SlimefunItem(Categories.WEAPONS, SlimefunItems.GRANDMAS_WALKING_STICK, "GRANDMAS_WALKING_STICK", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.OAK_LOG), null, null, new ItemStack(Material.OAK_LOG), null, null, new ItemStack(Material.OAK_LOG), null}) .register(true); @@ -190,143 +205,15 @@ public class SlimefunSetup { new ItemStack[] {new ItemStack(Material.COOKIE), new ItemStack(Material.PAPER), null, null, null, null, null, null, null}) .register(true); + new DietCookie(Categories.FOOD, SlimefunItems.DIET_COOKIE, "DIET_COOKIE", RecipeType.MAGIC_WORKBENCH, + new ItemStack[] {new ItemStack(Material.COOKIE), SlimefunItems.ELYTRA_SCALE, null, null, null, null, null, null, null}) + .register(true); + new SlimefunItem(Categories.MACHINES_1, SlimefunItems.OUTPUT_CHEST, "OUTPUT_CHEST", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {SlimefunItems.LEAD_INGOT, new ItemStack(Material.HOPPER), SlimefunItems.LEAD_INGOT, SlimefunItems.LEAD_INGOT, new ItemStack(Material.CHEST), SlimefunItems.LEAD_INGOT, null, SlimefunItems.LEAD_INGOT, null}) - .register(true); + new ItemStack[] {SlimefunItems.LEAD_INGOT, new ItemStack(Material.HOPPER), SlimefunItems.LEAD_INGOT, SlimefunItems.LEAD_INGOT, new ItemStack(Material.CHEST), SlimefunItems.LEAD_INGOT, null, SlimefunItems.LEAD_INGOT, null}) + .register(true); - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.ENHANCED_CRAFTING_TABLE, "ENHANCED_CRAFTING_TABLE", - new ItemStack[] {null, null, null, null, new ItemStack(Material.CRAFTING_TABLE), null, null, new ItemStack(Material.DISPENSER), null}, - new ItemStack[0], Material.CRAFTING_TABLE) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(Player p, MultiBlock mb, Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("ENHANCED_CRAFTING_TABLE"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - // Objects dispBlock and disp have been split up, in order to add the output chest functionallity, which is the only functionallity - // that is dependant on the dispenser's block methods. - // the Dispenser disp still remains the same though, and as such doesn't break any existing code which involves said object. - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - - List inputs = RecipeType.getRecipeInputList(machine); - - for (int i = 0; i < inputs.size(); i++) { - boolean craft = true; - for (int j = 0; j < inv.getContents().length; j++) { - if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) { - if (SlimefunItem.getByItem(inputs.get(i)[j]) instanceof SlimefunBackpack) { - if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], false)) { - craft = false; - break; - } - } - else { - craft = false; - break; - } - } - } - - if (craft) { - final ItemStack adding = RecipeType.getRecipeOutputList(machine, inputs.get(i)).clone(); - if (Slimefun.hasUnlocked(p, adding, true)) { - Inventory inv2 = Bukkit.createInventory(null, 9, "test"); - for (int j = 0; j < inv.getContents().length; j++) { - inv2.setItem(j, inv.getContents()[j] != null ? (inv.getContents()[j].getAmount() > 1 ? new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1): null): null); - } - - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv, inv2); - - if (outputInv != null) { - SlimefunItem sfItem = SlimefunItem.getByItem(adding); - if (sfItem instanceof SlimefunBackpack) { - ItemStack backpack = null; - - for (int j = 0; j < 9; j++) { - if (inv.getContents()[j] != null) { - if (inv.getContents()[j].getType() != Material.AIR) { - if (SlimefunItem.getByItem(inv.getContents()[j]) instanceof SlimefunBackpack) { - backpack = inv.getContents()[j]; - break; - } - } - } - } - String id = ""; - int size = ((SlimefunBackpack) sfItem).size; - - if (backpack != null) { - for (String line: backpack.getItemMeta().getLore()) { - if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) { - id = line.replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), ""); - PlayerProfile.fromUUID(UUID.fromString(id.split("#")[0])).getBackpack(Integer.parseInt(id.split("#")[1])).setSize(size); - break; - } - } - } - - if (id.equals("")) { - for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { - if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID(); - - ItemMeta im = adding.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", p.getUniqueId() + "#" + backpackID)); - im.setLore(lore); - adding.setItemMeta(im); - break; - } - } - } - else { - for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { - if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = adding.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", id)); - im.setLore(lore); - adding.setItemMeta(im); - break; - } - } - } - } - - - for (int j = 0; j < 9; j++) { - if (inv.getContents()[j] != null) { - if (inv.getContents()[j].getType() != Material.AIR) { - if (inv.getContents()[j].getType().toString().endsWith("_BUCKET")) inv.setItem(j, new ItemStack(Material.BUCKET)); - else if (inv.getContents()[j].getAmount() > 1) inv.setItem(j, new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1)); - else inv.setItem(j, null); - } - } - } - p.getWorld().playSound(b.getLocation(), Sound.BLOCK_WOODEN_BUTTON_CLICK_ON, 1, 1); - - outputInv.addItem(adding); - - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - } - return true; - } - } - Messages.local.sendTranslation(p, "machines.pattern-not-found", true); - } - } - return true; - } - else return false; - } - }); + new EnhancedCraftingTable().register(); new SlimefunItem(Categories.PORTABLE, SlimefunItems.PORTABLE_DUSTBIN, "PORTABLE_DUSTBIN", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {new ItemStack(Material.IRON_INGOT), new ItemStack(Material.IRON_INGOT), new ItemStack(Material.IRON_INGOT), new ItemStack(Material.IRON_INGOT), null, new ItemStack(Material.IRON_INGOT), new ItemStack(Material.IRON_INGOT), new ItemStack(Material.IRON_INGOT), new ItemStack(Material.IRON_INGOT)}) @@ -348,205 +235,10 @@ public class SlimefunSetup { new ItemStack[] {SlimefunItems.SALT, new ItemStack(Material.COOKED_BEEF), null, null, null, null, null, null, null}, new String[] {"Saturation"}, new Integer[] {20}) .register(true); - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.GRIND_STONE, "GRIND_STONE", - new ItemStack[] {null, null, null, null, new ItemStack(Material.OAK_FENCE), null, null, new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), null}, - new ItemStack[] {new ItemStack(Material.BLAZE_ROD), new ItemStack(Material.BLAZE_POWDER, 4), new ItemStack(Material.BONE), new ItemStack(Material.BONE_MEAL, 4), new ItemStack(Material.GRAVEL), new ItemStack(Material.FLINT), new ItemStack(Material.NETHER_WART), new CustomItem(SlimefunItems.MAGIC_LUMP_1, 2), new ItemStack(Material.ENDER_EYE), new CustomItem(SlimefunItems.ENDER_LUMP_1, 2), new ItemStack(Material.COBBLESTONE), new ItemStack(Material.GRAVEL), new ItemStack(Material.WHEAT), SlimefunItems.WHEAT_FLOUR, new ItemStack(Material.DIRT), SlimefunItems.STONE_CHUNK, new ItemStack(Material.SANDSTONE), new ItemStack(Material.SAND, 4), new ItemStack(Material.RED_SANDSTONE), new ItemStack(Material.RED_SAND, 4)}, - Material.OAK_FENCE) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(Player p, MultiBlock mb, Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("GRIND_STONE"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - for (ItemStack current: inv.getContents()) { - for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { - if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { - ItemStack output = RecipeType.getRecipeOutput(machine, convert); - Inventory outputInv = SlimefunMachine.findValidOutputInv(output, dispBlock, inv); - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(1); - inv.removeItem(removing); - outputInv.addItem(output); - p.getWorld().playSound(p.getLocation(), Sound.BLOCK_WOODEN_BUTTON_CLICK_ON, 1, 1); - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - } - } - Messages.local.sendTranslation(p, "machines.unknown-material", true); - } - } - return true; - } - else return false; - } - }); - - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.ARMOR_FORGE, "ARMOR_FORGE", - new ItemStack[] {null, null, null, null, new ItemStack(Material.ANVIL), null, null, new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), null}, - new ItemStack[] {}, - Material.ANVIL) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(final Player p, MultiBlock mb, Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("ARMOR_FORGE"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - List inputs = RecipeType.getRecipeInputList(machine); - - for (int i = 0; i < inputs.size(); i++) { - boolean craft = true; - for (int j = 0; j < inv.getContents().length; j++) { - if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) { - craft = false; - break; - } - } - - if (craft) { - final ItemStack adding = RecipeType.getRecipeOutputList(machine, inputs.get(i)).clone(); - if (Slimefun.hasUnlocked(p, adding, true)) { - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - for (ItemStack removing: inputs.get(i)) { - if (removing != null) inv.removeItem(removing); - } - for (int j = 0; j < 4; j++) { - int current = j; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - if (current < 3) { - p.getWorld().playSound(p.getLocation(), Sound.BLOCK_ANVIL_USE, 1F, 2F); - } else { - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - outputInv.addItem(adding); - } - }, j*20L); - } - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - } - return true; - } - } - Messages.local.sendTranslation(p, "machines.pattern-not-found", true); - } - } - return true; - } - else return false; - } - }); - - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.ORE_CRUSHER, "ORE_CRUSHER", - new ItemStack[] {null, null, null, null, new ItemStack(Material.NETHER_BRICK_FENCE), null, new ItemStack(Material.IRON_BARS), new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), new ItemStack(Material.IRON_BARS)}, - new ItemStack[] {new ItemStack(Material.IRON_ORE), new CustomItem(SlimefunItems.IRON_DUST, (Boolean) Slimefun.getItemValue("ORE_CRUSHER", "double-ores") ? 2: 1), new ItemStack(Material.GOLD_ORE), new CustomItem(SlimefunItems.GOLD_DUST, (Boolean) Slimefun.getItemValue("ORE_CRUSHER", "double-ores") ? 2: 1), new ItemStack(Material.NETHERRACK, 16), SlimefunItems.SULFATE, SlimefunItems.SIFTED_ORE, SlimefunItems.CRUSHED_ORE, SlimefunItems.CRUSHED_ORE, SlimefunItems.PULVERIZED_ORE, SlimefunItems.PURE_ORE_CLUSTER, SlimefunItems.TINY_URANIUM, new ItemStack(Material.COBBLESTONE, 8), new ItemStack(Material.SAND, 1), new ItemStack(Material.GOLD_INGOT), SlimefunItems.GOLD_DUST, SlimefunItems.GOLD_4K, SlimefunItems.GOLD_DUST}, - Material.NETHER_BRICK_FENCE) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(Player p, MultiBlock mb, Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("ORE_CRUSHER"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - for (ItemStack current: inv.getContents()) { - for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { - if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { - ItemStack adding = RecipeType.getRecipeOutput(machine, convert); - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(convert.getAmount()); - inv.removeItem(removing); - outputInv.addItem(adding); - p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, 1); - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - } - } - Messages.local.sendTranslation(p, "machines.unknown-material", true); - } - } - return true; - } - else return false; - } - }); - - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.COMPRESSOR, "COMPRESSOR", - new ItemStack[] {null, null, null, null, new ItemStack(Material.NETHER_BRICK_FENCE), null, new ItemStack(Material.PISTON), new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), new ItemStack(Material.PISTON)}, - new ItemStack[] {new ItemStack(Material.COAL, 8), SlimefunItems.CARBON, new CustomItem(SlimefunItems.STEEL_INGOT, 8), SlimefunItems.STEEL_PLATE, new CustomItem(SlimefunItems.CARBON, 4), SlimefunItems.COMPRESSED_CARBON, new CustomItem(SlimefunItems.STONE_CHUNK, 4), new ItemStack(Material.COBBLESTONE), new CustomItem(SlimefunItems.REINFORCED_ALLOY_INGOT, 8), SlimefunItems.REINFORCED_PLATE}, - Material.NETHER_BRICK_FENCE) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(final Player p, MultiBlock mb, Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("COMPRESSOR"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - for (ItemStack current: inv.getContents()) { - for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { - if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { - final ItemStack adding = RecipeType.getRecipeOutput(machine, convert); - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(convert.getAmount()); - inv.removeItem(removing); - for (int i = 0; i < 4; i++) { - int j = i; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - if (j < 3) { - p.getWorld().playSound(p.getLocation(), j == 1 ? Sound.BLOCK_PISTON_CONTRACT : Sound.BLOCK_PISTON_EXTEND, 1F, j == 0 ? 1F : 2F); - } else { - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - outputInv.addItem(adding); - } - }, i*20L); - } - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - } - } - Messages.local.sendTranslation(p, "machines.unknown-material", true); - } - } - return true; - } - else return false; - } - }); + new GrindStone().register(); + new ArmorForge().register(); + new OreCrusher().register(); + new Compressor().register(); new SlimefunItem(Categories.LUMPS_AND_MAGIC, SlimefunItems.MAGIC_LUMP_1, "MAGIC_LUMP_1", RecipeType.GRIND_STONE, new ItemStack[] {null, null, null, null, new ItemStack(Material.NETHER_WART), null, null, null, null}, new CustomItem(SlimefunItems.MAGIC_LUMP_1, 2)) @@ -572,7 +264,7 @@ public class SlimefunSetup { new ItemStack[] {SlimefunItems.ENDER_LUMP_2, SlimefunItems.ENDER_LUMP_2, null, SlimefunItems.ENDER_LUMP_2, SlimefunItems.ENDER_LUMP_2, null, null, null, null}) .register(true); - new SlimefunItem(Categories.PORTABLE, SlimefunItems.ENDER_BACKPACK, "ENDER_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE, + new SlimefunItem(Categories.MAGIC, SlimefunItems.ENDER_BACKPACK, "ENDER_BACKPACK", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItems.ENDER_LUMP_2, new ItemStack(Material.LEATHER), SlimefunItems.ENDER_LUMP_2, new ItemStack(Material.LEATHER), new ItemStack(Material.CHEST), new ItemStack(Material.LEATHER), SlimefunItems.ENDER_LUMP_2, new ItemStack(Material.LEATHER), SlimefunItems.ENDER_LUMP_2}) .register(true, new ItemInteractionHandler() { @@ -613,11 +305,9 @@ public class SlimefunSetup { if (SlimefunManager.isItemSimiliar(item, SlimefunItems.MAGIC_EYE_OF_ENDER, true)) { e.getParentEvent().setCancelled(true); PlayerInventory.update(p); - if (p.getInventory().getHelmet() != null && p.getInventory().getChestplate() != null && p.getInventory().getLeggings() != null && p.getInventory().getBoots() != null) { - if (SlimefunManager.isItemSimiliar(p.getInventory().getHelmet(), SlimefunItems.ENDER_HELMET, true) && SlimefunManager.isItemSimiliar(p.getInventory().getChestplate(), SlimefunItems.ENDER_CHESTPLATE, true) && SlimefunManager.isItemSimiliar(p.getInventory().getLeggings(), SlimefunItems.ENDER_LEGGINGS, true) && SlimefunManager.isItemSimiliar(p.getInventory().getBoots(), SlimefunItems.ENDER_BOOTS, true)) { - p.launchProjectile(EnderPearl.class); - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1, 1); - } + if (p.getInventory().getHelmet() != null && p.getInventory().getChestplate() != null && p.getInventory().getLeggings() != null && p.getInventory().getBoots() != null && SlimefunManager.isItemSimiliar(p.getInventory().getHelmet(), SlimefunItems.ENDER_HELMET, true) && SlimefunManager.isItemSimiliar(p.getInventory().getChestplate(), SlimefunItems.ENDER_CHESTPLATE, true) && SlimefunManager.isItemSimiliar(p.getInventory().getLeggings(), SlimefunItems.ENDER_LEGGINGS, true) && SlimefunManager.isItemSimiliar(p.getInventory().getBoots(), SlimefunItems.ENDER_BOOTS, true)) { + p.launchProjectile(EnderPearl.class); + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1, 1); } return true; } @@ -625,23 +315,11 @@ public class SlimefunSetup { } }); - new SlimefunItem(Categories.FOOD, SlimefunItems.MAGIC_SUGAR, "MAGIC_SUGAR", RecipeType.ENHANCED_CRAFTING_TABLE, + new MagicSugar(Categories.FOOD, SlimefunItems.MAGIC_SUGAR, "MAGIC_SUGAR", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {new ItemStack(Material.SUGAR), new ItemStack(Material.REDSTONE), new ItemStack(Material.GLOWSTONE_DUST), null, null, null, null, null, null}, new String[] {"effects.SPEED"}, new Integer[] {4}) - .register(true, new ItemInteractionHandler() { + .register(true); - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.MAGIC_SUGAR, true)) { - PlayerInventory.consumeItemInHand(p); - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_GENERIC_EAT, 1, 1); - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 600, (Integer) Slimefun.getItemValue("MAGIC_SUGAR", "effects.SPEED"))); - return true; - } - else return false; - } - }); - - new SlimefunItem(Categories.FOOD, SlimefunItems.MONSTER_JERKY, "MONSTER_JERKY", RecipeType.ENHANCED_CRAFTING_TABLE, + new MonsterJerky(Categories.FOOD, SlimefunItems.MONSTER_JERKY, "MONSTER_JERKY", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.SALT, new ItemStack(Material.ROTTEN_FLESH), null, null, null, null, null, null, null}) .register(true); @@ -663,7 +341,7 @@ public class SlimefunSetup { new PotionEffect[] {new PotionEffect(PotionEffectType.JUMP, 300, 5)}) .register(true); - new SlimefunItem(Categories.WEAPONS, SlimefunItems.SWORD_OF_BEHEADING, "SWORD_OF_BEHEADING", RecipeType.ENHANCED_CRAFTING_TABLE, + new SwordOfBeheading(Categories.WEAPONS, SlimefunItems.SWORD_OF_BEHEADING, "SWORD_OF_BEHEADING", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.EMERALD), null, SlimefunItems.MAGIC_LUMP_2, new ItemStack(Material.EMERALD), SlimefunItems.MAGIC_LUMP_2, null, new ItemStack(Material.BLAZE_ROD), null}, new String[] {"chance.PLAYER", "chance.SKELETON", "chance.WITHER_SKELETON", "chance.ZOMBIE", "chance.CREEPER"}, new Integer[] {70, 40, 25, 40, 40}) .register(true); @@ -679,206 +357,26 @@ public class SlimefunSetup { new ItemStack[] {new ItemStack(Material.LAPIS_BLOCK), new ItemStack(Material.LAPIS_BLOCK), new ItemStack(Material.LAPIS_BLOCK), new ItemStack(Material.REDSTONE_BLOCK), SlimefunItems.BASIC_CIRCUIT_BOARD, new ItemStack(Material.REDSTONE_BLOCK), new ItemStack(Material.LAPIS_BLOCK), new ItemStack(Material.LAPIS_BLOCK), new ItemStack(Material.LAPIS_BLOCK)}) .register(true); - new SlimefunGadget(Categories.TOOLS, SlimefunItems.GOLD_PAN, "GOLD_PAN", RecipeType.ENHANCED_CRAFTING_TABLE, + new GoldPan(Categories.TOOLS, SlimefunItems.GOLD_PAN, "GOLD_PAN", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, null, null, new ItemStack(Material.STONE), new ItemStack(Material.BOWL), new ItemStack(Material.STONE), new ItemStack(Material.STONE), new ItemStack(Material.STONE), new ItemStack(Material.STONE)}, new ItemStack[] {new ItemStack(Material.GRAVEL), new ItemStack(Material.FLINT), new ItemStack(Material.GRAVEL), new ItemStack(Material.CLAY_BALL), new ItemStack(Material.GRAVEL), SlimefunItems.SIFTED_ORE}, new String[] {"chance.FLINT", "chance.CLAY", "chance.SIFTED_ORE"}, new Integer[] {47, 28, 15}) - .register(true, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GOLD_PAN, true)) { - if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.GRAVEL) { - if (CSCoreLib.getLib().getProtectionManager().canBuild(p.getUniqueId(), e.getClickedBlock(), true)) { - List drops = new ArrayList(); - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.SIFTED_ORE"))) drops.add(SlimefunItems.SIFTED_ORE); - else if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.CLAY"))) drops.add(new ItemStack(Material.CLAY_BALL)); - else if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.FLINT"))) drops.add(new ItemStack(Material.FLINT)); - - - - e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, e.getClickedBlock().getType()); - e.getClickedBlock().setType(Material.AIR); - for (ItemStack drop: drops) { - e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), drop); - } - } - } - e.setCancelled(true); - return true; - } - else return false; - } - }); + .register(true); new SlimefunItem(Categories.MISC, SlimefunItems.SIFTED_ORE, "SIFTED_ORE", RecipeType.GOLD_PAN, new ItemStack[] {new ItemStack(Material.GRAVEL), null, null, null, null, null, null, null, null}) .register(true); - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.SMELTERY, "SMELTERY", - new ItemStack[] {null, new ItemStack(Material.NETHER_BRICK_FENCE), null, new ItemStack(Material.NETHER_BRICKS), new CustomItem(Material.DISPENSER, "Dispencer (Faced up)"), new ItemStack(Material.NETHER_BRICKS), null, new ItemStack(Material.FLINT_AND_STEEL), null}, - new ItemStack[] {SlimefunItems.IRON_DUST, new ItemStack(Material.IRON_INGOT)}, Material.NETHER_BRICK_FENCE, - new String[] {"chance.fireBreak"}, new Integer[] {34}) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(Player p, MultiBlock mb, Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("SMELTERY"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - List inputs = RecipeType.getRecipeInputList(machine); - - for (int i = 0; i < inputs.size(); i++) { - boolean craft = true; - for (ItemStack converting: inputs.get(i)) { - if (converting != null) { - for (int j = 0; j < inv.getContents().length; j++) { - if (j == (inv.getContents().length - 1) && !SlimefunManager.isItemSimiliar(converting, inv.getContents()[j], true)) { - craft = false; - break; - } - else if (SlimefunManager.isItemSimiliar(inv.getContents()[j], converting, true)) break; - } - } - } - - if (craft) { - ItemStack adding = RecipeType.getRecipeOutputList(machine, inputs.get(i)).clone(); - if (Slimefun.hasUnlocked(p, adding, true)) { - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - for (ItemStack removing: inputs.get(i)) { - if (removing != null) inv.removeItem(removing); - } - outputInv.addItem(adding); - p.getWorld().playSound(p.getLocation(), Sound.BLOCK_LAVA_POP, 1, 1); - p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); - // Block raw_disp = b.getRelative(BlockFace.DOWN); - // raw_disp has been removed since the outputInv functionality already uses such an object which is declared above as dispBlock. - // The chamber methods have been updated to reflect this change. - // Maybe this code snippet should be turned into a loop? - Hopper chamber = null; - if (BlockStorage.check(dispBlock.getRelative(BlockFace.EAST).getState().getBlock(), "IGNITION_CHAMBER")) { - chamber = (Hopper) dispBlock.getRelative(BlockFace.EAST).getState(); - } else if (BlockStorage.check(dispBlock.getRelative(BlockFace.WEST).getState().getBlock(), "IGNITION_CHAMBER")) { - chamber = (Hopper) dispBlock.getRelative(BlockFace.WEST).getState(); - } else if (BlockStorage.check(dispBlock.getRelative(BlockFace.NORTH).getState().getBlock(), "IGNITION_CHAMBER")) { - chamber = (Hopper) dispBlock.getRelative(BlockFace.NORTH).getState(); - } else if (BlockStorage.check(dispBlock.getRelative(BlockFace.SOUTH).getState().getBlock(), "IGNITION_CHAMBER")){ - chamber = (Hopper) dispBlock.getRelative(BlockFace.SOUTH).getState(); - } - - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SMELTERY", "chance.fireBreak"))) { - if (chamber != null) { - if (chamber.getInventory().contains(Material.FLINT_AND_STEEL)) { - ItemStack item = chamber.getInventory().getItem(chamber.getInventory().first(Material.FLINT_AND_STEEL)); - ItemMeta meta = item.getItemMeta(); - ((Damageable) meta).setDamage(((Damageable) meta).getDamage() + 1); - item.setItemMeta(meta); - if (((Damageable) item.getItemMeta()).getDamage() >= item.getType().getMaxDurability()) { - item.setAmount(0); - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1); - } - p.getWorld().playSound(p.getLocation(), Sound.ITEM_FLINTANDSTEEL_USE, 1, 1); - } - else { - Messages.local.sendTranslation(p, "machines.ignition-chamber-no-flint", true); - - Block fire = b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN); - fire.getWorld().playEffect(fire.getLocation(), Effect.STEP_SOUND, fire.getType()); - fire.setType(Material.AIR); - } - } - else { - Block fire = b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN); - fire.getWorld().playEffect(fire.getLocation(), Effect.STEP_SOUND, fire.getType()); - fire.setType(Material.AIR); - } - } - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - } - return true; - } - } - Messages.local.sendTranslation(p, "machines.pattern-not-found", true); - } - } - return true; - } - else return false; - } - }); - + new Smeltery().register(); new SlimefunItem(Categories.MACHINES_1, SlimefunItems.IGNITION_CHAMBER, "IGNITION_CHAMBER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.STEEL_PLATE, SlimefunItems.BASIC_CIRCUIT_BOARD, SlimefunItems.STEEL_PLATE, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.STEEL_PLATE, SlimefunItems.ELECTRIC_MOTOR, null, new ItemStack(Material.HOPPER), null}) .register(true); - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.PRESSURE_CHAMBER, "PRESSURE_CHAMBER", - new ItemStack[] {new ItemStack(Material.STONE_SLAB), new CustomItem(Material.DISPENSER, "Dispenser (Facing down)"), new ItemStack(Material.STONE_SLAB), new ItemStack(Material.PISTON), new ItemStack(Material.GLASS), new ItemStack(Material.PISTON), new ItemStack(Material.PISTON), new ItemStack(Material.CAULDRON), new ItemStack(Material.PISTON)}, - new ItemStack[] {SlimefunItems.CARBON_CHUNK, SlimefunItems.SYNTHETIC_DIAMOND, SlimefunItems.RAW_CARBONADO, SlimefunItems.CARBONADO}, - Material.CAULDRON) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(final Player p, MultiBlock mb, final Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("PRESSURE_CHAMBER"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = b.getRelative(BlockFace.UP).getRelative(BlockFace.UP); - Dispenser disp = (Dispenser) dispBlock.getState(); - final Inventory inv = disp.getInventory(); - for (ItemStack current: inv.getContents()) { - for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { - if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { - final ItemStack adding = RecipeType.getRecipeOutput(machine, convert); - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(convert.getAmount()); - inv.removeItem(removing); - for (int i = 0; i < 4; i++) { - int j = i; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - p.getWorld().playSound(b.getLocation(), Sound.ENTITY_TNT_PRIMED, 1, 1); - p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4); - p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4); - p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4); - if (j < 3) { - p.getWorld().playSound(b.getLocation(), Sound.ENTITY_TNT_PRIMED, 1F, 1F); - } else { - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - outputInv.addItem(adding); - } - }, i*20L); - } - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - } - } - Messages.local.sendTranslation(p, "machines.unknown-material", true); - } - } - return true; - } - else return false; - } - }); + new PressureChamber().register(); new SlimefunItem(Categories.TECH_MISC, SlimefunItems.BATTERY, "BATTERY", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] { null, new ItemStack(Material.REDSTONE), null, SlimefunItems.ZINC_INGOT, SlimefunItems.SULFATE, SlimefunItems.COPPER_INGOT, SlimefunItems.ZINC_INGOT, SlimefunItems.SULFATE, SlimefunItems.COPPER_INGOT }) + new ItemStack[] {null, new ItemStack(Material.REDSTONE), null, SlimefunItems.ZINC_INGOT, SlimefunItems.SULFATE, SlimefunItems.COPPER_INGOT, SlimefunItems.ZINC_INGOT, SlimefunItems.SULFATE, SlimefunItems.COPPER_INGOT }) .register(true); SlimefunManager.registerArmorSet(new ItemStack(Material.GLOWSTONE), new ItemStack[] {SlimefunItems.GLOWSTONE_HELMET, SlimefunItems.GLOWSTONE_CHESTPLATE, SlimefunItems.GLOWSTONE_LEGGINGS, SlimefunItems.GLOWSTONE_BOOTS}, "GLOWSTONE", @@ -1101,6 +599,10 @@ public class SlimefunSetup { new ItemStack[] {SlimefunItems.CLOTH, SlimefunItems.CLOTH, SlimefunItems.CLOTH, SlimefunItems.CHAIN, null, SlimefunItems.CHAIN, null, null, null}) .register(true); + new HologramProjector(Categories.TECH, SlimefunItems.HOLOGRAM_PROJECTOR, "HOLOGRAM_PROJECTOR", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {null, SlimefunItems.POWER_CRYSTAL, null, SlimefunItems.ALUMINUM_BRASS_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.ALUMINUM_BRASS_INGOT, null, SlimefunItems.ALUMINUM_BRASS_INGOT, null}, new CustomItem(SlimefunItems.HOLOGRAM_PROJECTOR, 3)) + .register(true); + new SlimefunItem(Categories.MISC, SlimefunItems.CHAIN, "CHAIN", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, null, SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, null, null}, new CustomItem(SlimefunItems.CHAIN, 8)) .register(true); @@ -1109,182 +611,12 @@ public class SlimefunSetup { new ItemStack[] {null, SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, null, null, null}) .register(true); - new SlimefunItem(Categories.TOOLS, SlimefunItems.GRAPPLING_HOOK, "GRAPPLING_HOOK", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {null, SlimefunItems.HOOK, SlimefunItems.HOOK, null, SlimefunItems.CHAIN, SlimefunItems.HOOK, SlimefunItems.CHAIN, null, null}) - .register(true, new ItemInteractionHandler() { + new GrapplingHook(Categories.TOOLS, SlimefunItems.GRAPPLING_HOOK, "GRAPPLING_HOOK", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {null, SlimefunItems.HOOK, SlimefunItems.HOOK, null, SlimefunItems.CHAIN, SlimefunItems.HOOK, SlimefunItems.CHAIN, null, null}, + new String[] {"despawn-seconds"}, new Object[] {60}) + .register(true); - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GRAPPLING_HOOK, true)) { - if (e.getClickedBlock() == null && !Variables.jump_state.containsKey(p.getUniqueId())) { - e.setCancelled(true); - if (p.getInventory().getItemInOffHand().getType().equals(Material.BOW)) { - // Cancel, to fix dupe #740 - return false; - } - Variables.jump_state.put(p.getUniqueId(), p.getInventory().getItemInMainHand().getType() != Material.SHEARS); - if (p.getInventory().getItemInMainHand().getType() == Material.LEAD) PlayerInventory.consumeItemInHand(p); - - Vector direction = p.getEyeLocation().getDirection().multiply(2.0); - Projectile projectile = p.getWorld().spawn(p.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), Arrow.class); - projectile.setShooter(p); - projectile.setVelocity(direction); - Arrow arrow = (Arrow) projectile; - Bat b = (Bat) p.getWorld().spawnEntity(p.getLocation(), EntityType.BAT); - b.setCanPickupItems(false); - b.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 100000, 100000)); - b.setLeashHolder(arrow); - - Variables.damage.add(p.getUniqueId()); - Variables.remove.put(p.getUniqueId(), new Entity[] {b, arrow}); - } - return true; - } - else return false; - } - }); - - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.MAGIC_WORKBENCH, "MAGIC_WORKBENCH", - new ItemStack[] {null, null, null, null, null, null, new ItemStack(Material.BOOKSHELF), new ItemStack(Material.CRAFTING_TABLE), new ItemStack(Material.DISPENSER)}, - new ItemStack[0], Material.CRAFTING_TABLE) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(final Player p, MultiBlock mb, final Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("MAGIC_WORKBENCH"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = null; - // Maybe this could be implemented by instead looping over a BlockFace<> array? - if (b.getRelative(1, 0, 0).getType() == Material.DISPENSER) dispBlock = b.getRelative(1, 0, 0); - else if (b.getRelative(0, 0, 1).getType() == Material.DISPENSER) dispBlock = b.getRelative(0, 0, 1); - else if (b.getRelative(-1, 0, 0).getType() == Material.DISPENSER) dispBlock = b.getRelative(-1, 0, 0); - else if (b.getRelative(0, 0, -1).getType() == Material.DISPENSER) dispBlock = b.getRelative(0, 0, -1); - - Dispenser disp = (Dispenser) dispBlock.getState(); - final Inventory inv = disp.getInventory(); - List inputs = RecipeType.getRecipeInputList(machine); - - for (int i = 0; i < inputs.size(); i++) { - boolean craft = true; - for (int j = 0; j < inv.getContents().length; j++) { - if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) { - if (SlimefunItem.getByItem(inputs.get(i)[j]) instanceof SlimefunBackpack) { - if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], false)) { - craft = false; - break; - } - } - else { - craft = false; - break; - } - } - } - - if (craft) { - final ItemStack adding = RecipeType.getRecipeOutputList(machine, inputs.get(i)).clone(); - if (Slimefun.hasUnlocked(p, adding, true)) { - Inventory inv2 = Bukkit.createInventory(null, 9, "test"); - for (int j = 0; j < inv.getContents().length; j++) { - inv2.setItem(j, inv.getContents()[j] != null ? (inv.getContents()[j].getAmount() > 1 ? new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1): null): null); - } - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv, inv2); - if (outputInv != null) { - SlimefunItem sfItem = SlimefunItem.getByItem(adding); - - if (sfItem instanceof SlimefunBackpack) { - ItemStack backpack = null; - - for (int j = 0; j < 9; j++) { - if (inv.getContents()[j] != null) { - if (inv.getContents()[j].getType() != Material.AIR) { - if (SlimefunItem.getByItem(inv.getContents()[j]) instanceof SlimefunBackpack) { - backpack = inv.getContents()[j]; - break; - } - } - } - } - String id = ""; - int size = ((SlimefunBackpack) sfItem).size; - - if (backpack != null) { - for (String line: backpack.getItemMeta().getLore()) { - if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) { - id = line.replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), ""); - PlayerProfile.fromUUID(UUID.fromString(id.split("#")[0])).getBackpack(Integer.parseInt(id.split("#")[1])).setSize(size); - break; - } - } - } - - if (id.equals("")) { - for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { - if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID(); - - ItemMeta im = adding.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", p.getUniqueId() + "#" + backpackID)); - im.setLore(lore); - adding.setItemMeta(im); - break; - } - } - } - else { - for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { - if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = adding.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", id)); - im.setLore(lore); - adding.setItemMeta(im); - break; - } - } - } - } - - for (int j = 0; j < 9; j++) { - if (inv.getContents()[j] != null) { - if (inv.getContents()[j].getType() != Material.AIR) { - if (inv.getContents()[j].getAmount() > 1) inv.setItem(j, new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1)); - else inv.setItem(j, null); - } - } - } - for (int j = 0; j < 4; j++) { - int current = j; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); - p.getWorld().playEffect(b.getLocation(), Effect.ENDER_SIGNAL, 1); - if (current < 3) { - p.getWorld().playSound(b.getLocation(), Sound.BLOCK_WOODEN_BUTTON_CLICK_ON, 1F, 1F); - } else { - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - outputInv.addItem(adding); - } - }, j*20L); - } - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - } - return true; - } - } - Messages.local.sendTranslation(p, "machines.pattern-not-found", true); - } - } - return true; - } - else return false; - } - }); + new MagicWorkbench().register(); new SlimefunItem(Categories.MAGIC, SlimefunItems.STAFF_ELEMENTAL, "STAFF_ELEMENTAL", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {null, SlimefunItems.MAGICAL_BOOK_COVER, SlimefunItems.MAGIC_LUMP_3, null, new ItemStack(Material.STICK), SlimefunItems.MAGICAL_BOOK_COVER, SlimefunItems.MAGIC_LUMP_3, null, null}) @@ -1306,7 +638,7 @@ public class SlimefunSetup { p.setVelocity(p.getEyeLocation().getDirection().multiply(4)); p.getWorld().playSound(p.getLocation(), Sound.ENTITY_TNT_PRIMED, 1, 1); p.getWorld().playEffect(p.getLocation(), Effect.SMOKE, 1); - p.setFallDistance(0.0f); + p.setFallDistance(0F); } else { Messages.local.sendTranslation(p, "messages.hungry", true); @@ -1367,97 +699,7 @@ public class SlimefunSetup { new String[] {"mode.0.enabled", "mode.0.name", "mode.0.item", "mode.1.enabled", "mode.1.name", "mode.1.item", "mode.2.enabled", "mode.2.name", "mode.2.item", "mode.3.enabled", "mode.3.name", "mode.3.item", "mode.4.enabled", "mode.4.name", "mode.4.item"}, new Object[] {true, "Portable Crafter", "PORTABLE_CRAFTER", true, "Magic Eye of Ender", "MAGIC_EYE_OF_ENDER", true, "Wind Staff", "STAFF_ELEMENTAL_WIND", true, "Grappling Hook", "GRAPPLING_HOOK", true, "Gold Pan", "GOLD_PAN"}) .register(true); - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.ORE_WASHER, "ORE_WASHER", - new ItemStack[] {null, new ItemStack(Material.DISPENSER), null, null, new ItemStack(Material.OAK_FENCE), null, null, new ItemStack(Material.CAULDRON), null}, - new ItemStack[] {SlimefunItems.SIFTED_ORE, SlimefunItems.IRON_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.GOLD_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.COPPER_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.TIN_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.ZINC_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.ALUMINUM_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.MAGNESIUM_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.LEAD_DUST, SlimefunItems.SIFTED_ORE, SlimefunItems.SILVER_DUST}, - Material.OAK_FENCE) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(Player p, MultiBlock mb, Block b) { - - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("ORE_WASHER"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, machine.getItem(), true)) { - Block dispBlock = b.getRelative(BlockFace.UP); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - for (ItemStack current: inv.getContents()) { - if (current != null) { - if (SlimefunManager.isItemSimiliar(current, SlimefunItems.SIFTED_ORE, true)) { - ItemStack adding = SlimefunItems.IRON_DUST; - if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.GOLD_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.ALUMINUM_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.COPPER_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.ZINC_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.TIN_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.MAGNESIUM_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.LEAD_DUST; - else if (SlimefunStartup.chance(100, 25)) adding = SlimefunItems.SILVER_DUST; - - Inventory outputInv = null; - - if (!legacy_ore_washer) { - // This is a fancy way of checking if there is empty space in the inv; by checking if an unobtainable item could fit in it. - // However, due to the way the method findValidOutputInv() functions, the dummyAdding will never actually be added to the real inventory, - // so it really doesn't matter what item the ItemStack is made by. SlimefunItems.DEBUG_FISH however, signals that it's - // not supposed to be given to the player. - ItemStack dummyAdding = SlimefunItems.DEBUG_FISH; - outputInv = SlimefunMachine.findValidOutputInv(dummyAdding, dispBlock, inv); - } else outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(1); - inv.removeItem(removing); - outputInv.addItem(adding); - p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1, 1); - p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.WATER); - if (InvUtils.fits(outputInv, SlimefunItems.STONE_CHUNK)) outputInv.addItem(SlimefunItems.STONE_CHUNK); - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - else if (SlimefunManager.isItemSimiliar(current, new ItemStack(Material.SAND, 4), false)) { - ItemStack adding = SlimefunItems.SALT; - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(4); - inv.removeItem(removing); - outputInv.addItem(adding); - p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.WATER); - p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1, 1); - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - else if (SlimefunManager.isItemSimiliar(current, SlimefunItems.PULVERIZED_ORE, true)) { - ItemStack adding = SlimefunItems.PURE_ORE_CLUSTER; - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(1); - inv.removeItem(removing); - outputInv.addItem(adding); - p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.WATER); - p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1, 1); - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - } - } - Messages.local.sendTranslation(p, "machines.unknown-material", true); - } - } - return true; - } - else return false; - } - }); + new OreWasher().register(); new SlimefunItem(Categories.RESOURCES, SlimefunItems.GOLD_24K, "GOLD_24K", RecipeType.SMELTERY, new ItemStack[] {SlimefunItems.GOLD_DUST, SlimefunItems.GOLD_22K, null, null, null, null, null, null, null}) @@ -1527,35 +769,14 @@ public class SlimefunSetup { new SlimefunItem(Categories.MAGIC, SlimefunItems.STAFF_FIRE, "STAFF_ELEMENTAL_FIRE", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {null, null, SlimefunItems.LAVA_CRYSTAL, null, SlimefunItems.STAFF_ELEMENTAL, null, SlimefunItems.STAFF_ELEMENTAL, null, null}) .register(true); + + new StormStaff(Categories.MAGIC, SlimefunItems.STAFF_STORM, "STAFF_ELEMENTAL_STORM", RecipeType.ANCIENT_ALTAR, + new ItemStack[] {SlimefunItems.RUNE_LIGHTNING, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_LIGHTNING, SlimefunItems.STAFF_WATER, SlimefunItems.MAGIC_SUGAR, SlimefunItems.STAFF_WIND, SlimefunItems.RUNE_LIGHTNING, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_LIGHTNING}) + .register(true); - new SlimefunItem(Categories.TOOLS, SlimefunItems.AUTO_SMELT_PICKAXE, "SMELTERS_PICKAXE", RecipeType.ENHANCED_CRAFTING_TABLE, + new SmeltersPickaxe(Categories.TOOLS, SlimefunItems.AUTO_SMELT_PICKAXE, "SMELTERS_PICKAXE", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.LAVA_CRYSTAL, SlimefunItems.LAVA_CRYSTAL, SlimefunItems.LAVA_CRYSTAL, null, SlimefunItems.FERROSILICON, null, null, SlimefunItems.FERROSILICON, null}) - .register(true, new BlockBreakHandler() { - - @Override - public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.AUTO_SMELT_PICKAXE, true)) { - if (BlockStorage.hasBlockInfo(e.getBlock())) return true; - if (e.getBlock().getType().equals(Material.PLAYER_HEAD)) return true; - - int j = -1; - List dropsList = (List) e.getBlock().getDrops(); - for (int i = 0; i < dropsList.size(); i++) { - if (dropsList.get(i) != null) { - j++; - drops.add(e.getBlock().getType().toString().endsWith("_ORE") ? new CustomItem(dropsList.get(i), fortune): dropsList.get(i)); - if (RecipeCalculator.getSmeltedOutput(drops.get(i).getType()) != null) { - e.getBlock().getWorld().playEffect(e.getBlock().getLocation(), Effect.MOBSPAWNER_FLAMES, 1); - drops.set(j, new CustomItem(RecipeCalculator.getSmeltedOutput(drops.get(i).getType()), drops.get(i).getAmount())); - } - } - } - - return true; - } - else return false; - } - }); + .register(true); new SlimefunItem(Categories.LUMPS_AND_MAGIC, SlimefunItems.TALISMAN, "COMMON_TALISMAN", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItems.MAGIC_LUMP_2, SlimefunItems.GOLD_8K, SlimefunItems.MAGIC_LUMP_2, null, new ItemStack(Material.EMERALD), null, SlimefunItems.MAGIC_LUMP_2, SlimefunItems.GOLD_8K, SlimefunItems.MAGIC_LUMP_2}, @@ -1564,17 +785,17 @@ public class SlimefunSetup { new Talisman(SlimefunItems.TALISMAN_ANVIL, "ANVIL_TALISMAN", new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.ANVIL), SlimefunItems.TALISMAN, new ItemStack(Material.ANVIL), SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3}, - true, false, "anvil", new PotionEffect[0]) + true, false, "anvil") .register(true); new Talisman(SlimefunItems.TALISMAN_MINER, "MINER_TALISMAN", new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.SYNTHETIC_SAPPHIRE, SlimefunItems.TALISMAN, SlimefunItems.SIFTED_ORE, SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3}, - false, false, "miner", 20, new PotionEffect[0]) + false, false, "miner", 20) .register(true); - new Talisman(SlimefunItems.TALISMAN_HUNTER, "HUNTER_TALISMAN", + new HunterTalisman(SlimefunItems.TALISMAN_HUNTER, "HUNTER_TALISMAN", new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.SYNTHETIC_SAPPHIRE, SlimefunItems.TALISMAN, SlimefunItems.MONSTER_JERKY, SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3}, - false, false, "hunter", 20, new PotionEffect[0]) + false, false, "hunter", 20) .register(true); new Talisman(SlimefunItems.TALISMAN_LAVA, "LAVA_TALISMAN", @@ -1589,7 +810,7 @@ public class SlimefunSetup { new Talisman(SlimefunItems.TALISMAN_ANGEL, "ANGEL_TALISMAN", new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.FEATHER), SlimefunItems.TALISMAN, new ItemStack(Material.FEATHER), SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3}, - false, true, "angel", 75, new PotionEffect[0]) + false, true, "angel", 75) .register(true); new Talisman(SlimefunItems.TALISMAN_FIRE, "FIRE_TALISMAN", @@ -1599,15 +820,9 @@ public class SlimefunSetup { new Talisman(SlimefunItems.TALISMAN_MAGICIAN, "MAGICIAN_TALISMAN", new ItemStack[] {SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.ENCHANTING_TABLE), SlimefunItems.TALISMAN, new ItemStack(Material.ENCHANTING_TABLE), SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3}, - false, false, "magician", 80, new PotionEffect[0]) + false, false, "magician", 80) .register(true); - for (Enchantment e : Enchantment.values()) { - for (int i = 1; i <= e.getMaxLevel(); i++) { - Slimefun.setItemVariable("MAGICIAN_TALISMAN", "allow-enchantments." + e.getKey().getKey() + ".level." + i, true); - } - } - new Talisman(SlimefunItems.TALISMAN_TRAVELLER, "TRAVELLER_TALISMAN", new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.STAFF_WIND, SlimefunItems.TALISMAN_ANGEL, SlimefunItems.STAFF_WIND, SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3}, false, false, "traveller", 60, new PotionEffect(PotionEffectType.SPEED, 3600, 2)) @@ -1635,41 +850,17 @@ public class SlimefunSetup { new Talisman(SlimefunItems.TALISMAN_WHIRLWIND, "WHIRLWIND_TALISMAN", new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.STAFF_WIND, SlimefunItems.TALISMAN_TRAVELLER, SlimefunItems.STAFF_WIND, SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3} - , false, true, "whirlwind", 60, new PotionEffect[0]) + , false, true, "whirlwind", 60) .register(true); new Talisman(SlimefunItems.TALISMAN_WIZARD, "WIZARD_TALISMAN", new ItemStack[] {SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGIC_EYE_OF_ENDER, SlimefunItems.TALISMAN_MAGICIAN, SlimefunItems.MAGIC_EYE_OF_ENDER, SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3}, - false, false, "wizard", 60, new PotionEffect[0]) + false, false, "wizard", 60) .register(true); - new ExcludedTool(Categories.TOOLS, SlimefunItems.LUMBER_AXE, "LUMBER_AXE", RecipeType.MAGIC_WORKBENCH, + new LumberAxe(Categories.TOOLS, SlimefunItems.LUMBER_AXE, "LUMBER_AXE", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItems.SYNTHETIC_DIAMOND, SlimefunItems.SYNTHETIC_DIAMOND, null, SlimefunItems.SYNTHETIC_EMERALD, SlimefunItems.GILDED_IRON, null, null, SlimefunItems.GILDED_IRON, null}) - .register(true, new BlockBreakHandler() { - - @Override - public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.LUMBER_AXE, true)) { - if (MaterialHelper.isLog( e.getBlock().getType())) { - List logs = new ArrayList(); - TreeCalculator.getTree(e.getBlock().getLocation(), e.getBlock().getLocation(), logs); - - if (logs.contains(e.getBlock().getLocation())) logs.remove(e.getBlock().getLocation()); - for (Location b: logs) { - if (CSCoreLib.getLib().getProtectionManager().canBuild(e.getPlayer().getUniqueId(), b.getBlock())) { - b.getWorld().playEffect(b, Effect.STEP_SOUND, b.getBlock().getType()); - for (ItemStack drop: b.getBlock().getDrops()) { - b.getWorld().dropItemNaturally(b, drop); - } - b.getBlock().setType(Material.AIR); - } - } - } - return true; - } - else return false; - } - }); + .register(true); new SlimefunItem(Categories.MISC, SlimefunItems.SALT, "SALT", RecipeType.ORE_WASHER, new ItemStack[] {null, null, null, null, new ItemStack(Material.SAND, 4), null, null, null, null}) @@ -1813,8 +1004,8 @@ public class SlimefunSetup { if (p.hasPotionEffect(PotionEffectType.WEAKNESS)) p.removePotionEffect(PotionEffectType.WEAKNESS); if (p.hasPotionEffect(PotionEffectType.CONFUSION)) p.removePotionEffect(PotionEffectType.CONFUSION); if (p.hasPotionEffect(PotionEffectType.BLINDNESS)) p.removePotionEffect(PotionEffectType.BLINDNESS); - p.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 2)); p.setFireTicks(0); + p.addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 2)); e.setCancelled(true); return true; } @@ -1824,97 +1015,40 @@ public class SlimefunSetup { new SlimefunItem(Categories.PORTABLE, SlimefunItems.MEDICINE, "MEDICINE", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.VITAMINS, new ItemStack(Material.GLASS_BOTTLE), SlimefunItems.HEAVY_CREAM, null, null, null, null, null, null}) - .register(true); + .register(true, new ItemConsumptionHandler() { + + @Override + public boolean onConsume(PlayerItemConsumeEvent e, Player p, ItemStack item) { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.MEDICINE, true)) { + if (p.hasPotionEffect(PotionEffectType.POISON)) p.removePotionEffect(PotionEffectType.POISON); + if (p.hasPotionEffect(PotionEffectType.WITHER)) p.removePotionEffect(PotionEffectType.WITHER); + if (p.hasPotionEffect(PotionEffectType.SLOW)) p.removePotionEffect(PotionEffectType.SLOW); + if (p.hasPotionEffect(PotionEffectType.SLOW_DIGGING)) p.removePotionEffect(PotionEffectType.SLOW_DIGGING); + if (p.hasPotionEffect(PotionEffectType.WEAKNESS)) p.removePotionEffect(PotionEffectType.WEAKNESS); + if (p.hasPotionEffect(PotionEffectType.CONFUSION)) p.removePotionEffect(PotionEffectType.CONFUSION); + if (p.hasPotionEffect(PotionEffectType.BLINDNESS)) p.removePotionEffect(PotionEffectType.BLINDNESS); + + p.setFireTicks(0); + return true; + } + else return false; + } + }); new SlimefunArmorPiece(Categories.TECH, SlimefunItems.NIGHT_VISION_GOGGLES, "NIGHT_VISION_GOGGLES", RecipeType.ARMOR_FORGE, new ItemStack[] {new ItemStack(Material.COAL_BLOCK), new ItemStack(Material.COAL_BLOCK), new ItemStack(Material.COAL_BLOCK), new ItemStack(Material.LIME_STAINED_GLASS_PANE), new ItemStack(Material.COAL_BLOCK), new ItemStack(Material.LIME_STAINED_GLASS_PANE), new ItemStack(Material.COAL_BLOCK), null, new ItemStack(Material.COAL_BLOCK)}, new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 20)}) .register(true); - new SlimefunItem(Categories.TOOLS, SlimefunItems.PICKAXE_OF_CONTAINMENT, "PICKAXE_OF_CONTAINMENT", RecipeType.MAGIC_WORKBENCH, + new PickaxeOfContainment(Categories.TOOLS, SlimefunItems.PICKAXE_OF_CONTAINMENT, "PICKAXE_OF_CONTAINMENT", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItems.FERROSILICON, SlimefunItems.FERROSILICON, SlimefunItems.FERROSILICON, null, SlimefunItems.GILDED_IRON, null, null, SlimefunItems.GILDED_IRON, null}) - .register(true, new BlockBreakHandler() { + .register(true); - @Override - public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) { - Block b = e.getBlock(); // Refactored it into this so we don't need to call e.getBlock() all the time. - if (b.getType() != Material.SPAWNER) return true; - // If the spawner's BlockStorage has BlockInfo, then it's not a vanilla spawner and shouldn't give a broken spawner. - ItemStack spawner = SlimefunItems.BROKEN_SPAWNER.clone(); - if(BlockStorage.hasBlockInfo(b)) - spawner = SlimefunItems.REPAIRED_SPAWNER.clone(); - ItemMeta im = spawner.getItemMeta(); - List lore = im.getLore(); - for (int i = 0; i < lore.size(); i++) { - if (lore.get(i).contains("")) lore.set(i, lore.get(i).replace("", StringUtils.format(((CreatureSpawner) b.getState()).getSpawnedType().toString()))); - } - im.setLore(lore); - spawner.setItemMeta(im); - b.getLocation().getWorld().dropItemNaturally(b.getLocation(), spawner); - e.setExpToDrop(0); - e.setDropItems(false); - return true; - } - else { - if (e.getBlock().getType() == Material.SPAWNER) e.setDropItems(false); - return false; - } - } - }); - - new SlimefunItem(Categories.TOOLS, SlimefunItems.HERCULES_PICKAXE, "HERCULES_PICKAXE", RecipeType.MAGIC_WORKBENCH, + new HerculesPickaxe(Categories.TOOLS, SlimefunItems.HERCULES_PICKAXE, "HERCULES_PICKAXE", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.HARDENED_METAL_INGOT, null, SlimefunItems.FERROSILICON, null, null, SlimefunItems.FERROSILICON, null}) - .register(true, new BlockBreakHandler() { - - @Override - public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.HERCULES_PICKAXE, true) && e.getBlock().getType().toString().endsWith("_ORE")) { - if (e.getBlock().getType() == Material.IRON_ORE) drops.add(new CustomItem(SlimefunItems.IRON_DUST, 2)); - else if (e.getBlock().getType() == Material.GOLD_ORE) drops.add(new CustomItem(SlimefunItems.GOLD_DUST, 2)); - else { - for (ItemStack drop: e.getBlock().getDrops()) { - drops.add(new CustomItem(drop, 2)); - } - } - return true; - } - else return false; - } - }); + .register(true); - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.TABLE_SAW, "TABLE_SAW", - new ItemStack[] {null, null, null, new ItemStack(Material.STONE_SLAB), new ItemStack(Material.STONECUTTER), new ItemStack(Material.STONE_SLAB), null, new ItemStack(Material.IRON_BLOCK), null}, - new ItemStack[] {}, Material.STONECUTTER) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(Player p, MultiBlock mb, Block b) { - if (mb.isMultiBlock(SlimefunItem.getByID("TABLE_SAW"))) { - if (CSCoreLib.getLib().getProtectionManager().canBuild(p.getUniqueId(), b.getRelative(BlockFace.UP), true)) { - if (Slimefun.hasUnlocked(p, SlimefunItems.TABLE_SAW, true)) { - if(p.getInventory().getItemInMainHand() != null && Tag.LOGS.getValues().contains(p.getInventory().getItemInMainHand().getType())) { - ItemStack log = p.getInventory().getItemInMainHand(); - - ItemStack item = new ItemStack(MaterialHelper.getWoodFromLog(log.getType()), 8); - if(item == null || item.getType() == Material.AIR) { - return false; - } - b.getWorld().dropItemNaturally(b.getLocation(), item); - b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, log.getType()); - log.setAmount(log.getAmount() -1); - if(log.getAmount() <= 0) - p.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); - - - } - } - } - return true; - } - else return false; - } - }); + new TableSaw().register(); /* * dNiym 7/30/2019 added the Table_Saw machine to replace the Saw_mill, as the sawmill's design does not work with @@ -1932,19 +1066,7 @@ public class SlimefunSetup { @Override public boolean onInteract(Player p, MultiBlock mb, Block b) { if (mb.isMultiBlock(SlimefunItem.getByID("SAW_MILL"))) { - if (CSCoreLib.getLib().getProtectionManager().canBuild(p.getUniqueId(), b.getRelative(BlockFace.UP), true)) { - if (Slimefun.hasUnlocked(p, SlimefunItems.SAW_MILL, true)) { - if (MaterialHelper.isLog(b.getRelative(BlockFace.UP).getType())) { - Block log = b.getRelative(BlockFace.UP); - if (!BlockStorage.hasBlockInfo(log)) { - ItemStack item = new ItemStack(MaterialHelper.getWoodFromLog(log.getType()), 8); - log.getWorld().dropItemNaturally(log.getLocation(), item); - log.getWorld().playEffect(log.getLocation(), Effect.STEP_SOUND, log.getType()); - log.setType(Material.AIR); - } - } - } - } + p.sendMessage(ChatColor.RED + "This Item has been deprecated! Use the Table Saw instead!"); return true; } else return false; @@ -1981,49 +1103,49 @@ public class SlimefunSetup { @Override public boolean onInteract(final Player p, MultiBlock mb, final Block b) { if (mb.isMultiBlock(SlimefunItem.getByID("DIGITAL_MINER"))) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, SlimefunItems.DIGITAL_MINER, true)) { - Block chestBlock = b.getRelative(BlockFace.UP); + p.sendMessage(ChatColor.DARK_RED + "THIS MACHINE WILL SOON BE REMOVED!"); + if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true) && Slimefun.hasUnlocked(p, SlimefunItems.DIGITAL_MINER, true)) { + Block chestBlock = b.getRelative(BlockFace.UP); - if(!(BlockStorage.check(chestBlock.getRelative(BlockFace.WEST), "SOLAR_PANEL") && BlockStorage.check(chestBlock.getRelative(BlockFace.EAST), "SOLAR_PANEL")) && + if(!(BlockStorage.check(chestBlock.getRelative(BlockFace.WEST), "SOLAR_PANEL") && BlockStorage.check(chestBlock.getRelative(BlockFace.EAST), "SOLAR_PANEL")) && !(BlockStorage.check(chestBlock.getRelative(BlockFace.NORTH), "SOLAR_PANEL") && BlockStorage.check(chestBlock.getRelative(BlockFace.SOUTH), "SOLAR_PANEL"))) { - return false; - } - - Chest chest = (Chest) chestBlock.getState(); - final Inventory inv = chest.getInventory(); - List ores = new ArrayList(); - for (int x = b.getX() - 4; x <= b.getX() + 4; x++) { - for (int z = b.getZ() - 4; z <= b.getZ() + 4; z++) { - for (int y = b.getY(); y > 0; y--) { - if (b.getWorld().getBlockAt(x, y, z).getType().toString().endsWith("_ORE")) { - ores.add(b.getWorld().getBlockAt(x, y, z).getLocation()); - } - } - } - } - if (!ores.isEmpty()) { - final Material ore = ores.get(0).getBlock().getType(); - final ItemStack adding = new ItemStack(ore); - ores.get(0).getBlock().setType(Material.AIR); - ores.clear(); - if (InvUtils.fits(inv, adding)) { - for (int i = 0; i < 4; i++) { - int j = i; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - if (j < 3) { - b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, ore); - } else { - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - inv.addItem(adding); - } - }, i*20L); - } - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - } - else Messages.local.sendTranslation(p, "miner.no-ores", true); + return false; } + + Chest chest = (Chest) chestBlock.getState(); + final Inventory inv = chest.getInventory(); + List ores = new ArrayList<>(); + + for (int x = b.getX() - 4; x <= b.getX() + 4; x++) { + for (int z = b.getZ() - 4; z <= b.getZ() + 4; z++) { + for (int y = b.getY(); y > 0; y--) { + if (b.getWorld().getBlockAt(x, y, z).getType().toString().endsWith("_ORE")) { + ores.add(b.getWorld().getBlockAt(x, y, z).getLocation()); + } + } + } + } + if (!ores.isEmpty()) { + final Material ore = ores.get(0).getBlock().getType(); + final ItemStack adding = new ItemStack(ore); + ores.get(0).getBlock().setType(Material.AIR); + ores.clear(); + if (InvUtils.fits(inv, adding)) { + for (int i = 0; i < 4; i++) { + int j = i; + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + if (j < 3) { + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, ore); + } else { + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + inv.addItem(adding); + } + }, i*20L); + } + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + } + else Messages.local.sendTranslation(p, "miner.no-ores", true); } return true; } @@ -2039,61 +1161,62 @@ public class SlimefunSetup { @Override public boolean onInteract(final Player p, MultiBlock mb, final Block b) { if (mb.isMultiBlock(SlimefunItem.getByID("ADVANCED_DIGITAL_MINER"))) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, SlimefunItems.ADVANCED_DIGITAL_MINER, true)) { - Block chestBlock = b.getRelative(BlockFace.UP); + p.sendMessage(ChatColor.DARK_RED + "THIS MACHINE WILL SOON BE REMOVED!"); + if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true) && Slimefun.hasUnlocked(p, SlimefunItems.ADVANCED_DIGITAL_MINER, true)) { + Block chestBlock = b.getRelative(BlockFace.UP); - if(!(BlockStorage.check(chestBlock.getRelative(BlockFace.WEST), "SOLAR_PANEL") && BlockStorage.check(chestBlock.getRelative(BlockFace.EAST), "SOLAR_PANEL")) && + if(!(BlockStorage.check(chestBlock.getRelative(BlockFace.WEST), "SOLAR_PANEL") && BlockStorage.check(chestBlock.getRelative(BlockFace.EAST), "SOLAR_PANEL")) && !(BlockStorage.check(chestBlock.getRelative(BlockFace.NORTH), "SOLAR_PANEL") && BlockStorage.check(chestBlock.getRelative(BlockFace.SOUTH), "SOLAR_PANEL"))) { - return false; - } - - Chest chest = (Chest) chestBlock.getState(); - final Inventory inv = chest.getInventory(); - List ores = new ArrayList(); - for (int x = b.getX() - 6; x <= b.getX() + 6; x++) { - for (int z = b.getZ() - 6; z <= b.getZ() + 6; z++) { - for (int y = b.getY(); y > 0; y--) { - if (b.getWorld().getBlockAt(x, y, z).getType().toString().endsWith("_ORE")) { - ores.add(b.getWorld().getBlockAt(x, y, z).getLocation()); - } - } - } - } - if (!ores.isEmpty()) { - final Material ore = ores.get(0).getBlock().getType(); - ItemStack drop = new ItemStack(ore); - if (ore == Material.COAL_ORE) drop = new ItemStack(Material.COAL, 4); - else if (ore == Material.IRON_ORE) drop = new CustomItem(SlimefunItems.IRON_DUST, 2); - else if (ore == Material.GOLD_ORE) drop = new CustomItem(SlimefunItems.GOLD_DUST, 2); - else if (ore == Material.REDSTONE_ORE) drop = new ItemStack(Material.REDSTONE, 8); - else if (ore == Material.NETHER_QUARTZ_ORE) drop = new ItemStack(Material.QUARTZ, 4); - else if (ore == Material.LAPIS_ORE) drop = new ItemStack(Material.LAPIS_LAZULI, 12); - else { - for (ItemStack drops: ores.get(0).getBlock().getDrops()) { - if (!drops.getType().isBlock()) drop = new CustomItem(drops, 2); - } - } - final ItemStack adding = drop; - ores.get(0).getBlock().setType(Material.AIR); - ores.clear(); - if (InvUtils.fits(inv, adding)) { - for (int i = 0; i < 4; i++) { - int j = i; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - if (j < 3) { - b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, ore); - } else { - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - inv.addItem(adding); - } - }, i*20L); - } - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - } - else Messages.local.sendTranslation(p, "miner.no-ores", true); + return false; } + + Chest chest = (Chest) chestBlock.getState(); + final Inventory inv = chest.getInventory(); + List ores = new ArrayList<>(); + + for (int x = b.getX() - 6; x <= b.getX() + 6; x++) { + for (int z = b.getZ() - 6; z <= b.getZ() + 6; z++) { + for (int y = b.getY(); y > 0; y--) { + if (b.getWorld().getBlockAt(x, y, z).getType().toString().endsWith("_ORE")) { + ores.add(b.getWorld().getBlockAt(x, y, z).getLocation()); + } + } + } + } + if (!ores.isEmpty()) { + final Material ore = ores.get(0).getBlock().getType(); + ItemStack drop = new ItemStack(ore); + if (ore == Material.COAL_ORE) drop = new ItemStack(Material.COAL, 4); + else if (ore == Material.IRON_ORE) drop = new CustomItem(SlimefunItems.IRON_DUST, 2); + else if (ore == Material.GOLD_ORE) drop = new CustomItem(SlimefunItems.GOLD_DUST, 2); + else if (ore == Material.REDSTONE_ORE) drop = new ItemStack(Material.REDSTONE, 8); + else if (ore == Material.NETHER_QUARTZ_ORE) drop = new ItemStack(Material.QUARTZ, 4); + else if (ore == Material.LAPIS_ORE) drop = new ItemStack(Material.LAPIS_LAZULI, 12); + else { + for (ItemStack drops: ores.get(0).getBlock().getDrops()) { + if (!drops.getType().isBlock()) drop = new CustomItem(drops, 2); + } + } + final ItemStack adding = drop; + ores.get(0).getBlock().setType(Material.AIR); + ores.clear(); + if (InvUtils.fits(inv, adding)) { + for (int i = 0; i < 4; i++) { + int j = i; + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + if (j < 3) { + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, ore); + } + else { + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); + inv.addItem(adding); + } + }, i*20L); + } + } + else Messages.local.sendTranslation(p, "machines.full-inventory", true); + } + else Messages.local.sendTranslation(p, "miner.no-ores", true); } return true; } @@ -2105,7 +1228,7 @@ public class SlimefunSetup { new ItemStack[] {SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K, SlimefunItems.GOLD_24K}) .register(true); - new SlimefunGadget(Categories.MACHINES_1, SlimefunItems.COMPOSTER, "COMPOSTER", RecipeType.ENHANCED_CRAFTING_TABLE, + new Composter(Categories.MACHINES_1, SlimefunItems.COMPOSTER, "COMPOSTER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {new ItemStack(Material.OAK_SLAB), null, new ItemStack(Material.OAK_SLAB), new ItemStack(Material.OAK_SLAB), null, new ItemStack(Material.OAK_SLAB), new ItemStack(Material.OAK_SLAB), new ItemStack(Material.CAULDRON), new ItemStack(Material.OAK_SLAB)}, new ItemStack[] { new ItemStack(Material.OAK_LEAVES, 8), new ItemStack(Material.DIRT), @@ -2125,204 +1248,31 @@ public class SlimefunSetup { new ItemStack(Material.STONE, 4), new ItemStack(Material.NETHERRACK), new ItemStack(Material.SAND, 2), new ItemStack(Material.SOUL_SAND), new ItemStack(Material.WHEAT, 4), new ItemStack(Material.NETHER_WART) - }).register(true, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(ItemUseEvent e, final Player p, ItemStack item) { - if (e.getClickedBlock() != null) { - SlimefunItem machine = BlockStorage.check(e.getClickedBlock()); - if (machine != null && machine.getID().equals("COMPOSTER")) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), e.getClickedBlock(), true)) { - final ItemStack input = p.getInventory().getItemInMainHand(); - final Block b = e.getClickedBlock(); - for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { - if (convert != null && SlimefunManager.isItemSimiliar(input, convert, true)) { - ItemStack removing = input.clone(); - removing.setAmount(convert.getAmount()); - p.getInventory().removeItem(removing); - final ItemStack adding = RecipeType.getRecipeOutput(machine, convert); - - for (int i = 1; i < 12; i++) { - int j = i; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - if (j < 11) { - b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, input.getType().isBlock() ? input.getType() : Material.HAY_BLOCK); - } else { - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - b.getWorld().dropItemNaturally(b.getRelative(BlockFace.UP).getLocation(), adding); - } - }, i*30L); - } - - return true; - } - } - Messages.local.sendTranslation(p, "machines.wrong-item", true); - return true; - } - return true; - } - } - return false; - } - }); + }).register(true); new SlimefunItem(Categories.MAGIC_ARMOR, SlimefunItems.FARMER_SHOES, "FARMER_SHOES", RecipeType.ARMOR_FORGE, new ItemStack[] {null, null, null, new ItemStack(Material.HAY_BLOCK), null, new ItemStack(Material.HAY_BLOCK), new ItemStack(Material.HAY_BLOCK), null, new ItemStack(Material.HAY_BLOCK)}) .register(true); - - @SuppressWarnings("unchecked") - final String[] explosiveblacklist = Slimefun.getItemValue("EXPLOSIVE_PICKAXE", "unbreakable-blocks") != null ? ((List) Slimefun.getItemValue("EXPLOSIVE_PICKAXE", "unbreakable-blocks")).toArray(new String[((List) Slimefun.getItemValue("EXPLOSIVE_PICKAXE", "unbreakable-blocks")).size()]): new String[] {"BEDROCK", "BARRIER", "COMMAND", "COMMAND_CHAIN", "COMMAND_REPEATING"}; - final boolean damageOnUse = Boolean.TRUE.equals(((Boolean) Slimefun.getItemValue("EXPLOSIVE_PICKAXE", "damage-on-use"))); - - new SlimefunItem(Categories.TOOLS, SlimefunItems.EXPLOSIVE_PICKAXE, "EXPLOSIVE_PICKAXE", RecipeType.MAGIC_WORKBENCH, + + new ExplosivePickaxe(Categories.TOOLS, SlimefunItems.EXPLOSIVE_PICKAXE, "EXPLOSIVE_PICKAXE", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {new ItemStack(Material.TNT), SlimefunItems.SYNTHETIC_DIAMOND, new ItemStack(Material.TNT), null, SlimefunItems.FERROSILICON, null, null, SlimefunItems.FERROSILICON, null}, - new String[] {"unbreakable-blocks", "damage-on-use"}, new Object[] {Arrays.asList("BEDROCK", "BARRIER", "COMMAND", "COMMAND_CHAIN", "COMMAND_REPEATING"), Boolean.FALSE }) - .register(true, new BlockBreakHandler() { + new String[] {"unbreakable-blocks", "damage-on-use"}, new Object[] {Stream.of(Material.BEDROCK, Material.END_PORTAL_FRAME, Material.END_PORTAL, Material.NETHER_PORTAL, Material.BARRIER, Material.STRUCTURE_BLOCK, Material.COMMAND_BLOCK, Material.CHAIN_COMMAND_BLOCK, Material.REPEATING_COMMAND_BLOCK).map(Material::toString).collect(Collectors.toList()), Boolean.FALSE }) + .register(true); - @Override - public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_PICKAXE, true)) { - e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F); - e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F); - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - for (int z = -1; z <= 1; z++) { - Block b = e.getBlock().getRelative(x, y, z); - if (b.getType() != Material.AIR && !b.isLiquid() && !StringUtils.equals(b.getType().toString(), explosiveblacklist)) { - if (CSCoreLib.getLib().getProtectionManager().canBuild(e.getPlayer().getUniqueId(), b)) { - if (SlimefunStartup.instance.isCoreProtectInstalled()) SlimefunStartup.instance.getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData()); - b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType()); - SlimefunItem sfItem = BlockStorage.check(b); - boolean allow = false; - if (sfItem != null && !(sfItem instanceof HandledBlock)) { - if (SlimefunItem.blockhandler.containsKey(sfItem.getID())) { - allow = SlimefunItem.blockhandler.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK); - } - if (allow) { - drops.add(BlockStorage.retrieve(e.getBlock())); - } - } - else if (b.getType().equals(Material.PLAYER_HEAD)) { - b.breakNaturally(); - } - else if (b.getType().name().endsWith("_SHULKER_BOX")) { - b.breakNaturally(); - } - else { - for (ItemStack drop: b.getDrops()) { - b.getWorld().dropItemNaturally(b.getLocation(), (b.getType().toString().endsWith("_ORE") && !b.getType().equals(Material.IRON_ORE) && !b.getType().equals(Material.GOLD_ORE)) ? new CustomItem(drop, fortune): drop); - } - b.setType(Material.AIR); - } - if (damageOnUse) { - if (!item.getEnchantments().containsKey(Enchantment.DURABILITY) || SlimefunStartup.randomize(100) <= (60 + 40 / (item.getEnchantmentLevel(Enchantment.DURABILITY) + 1))) { - PlayerInventory.damageItemInHand(e.getPlayer()); - } - } - } - } - } - } - } + new ExplosiveShovel(Categories.TOOLS, SlimefunItems.EXPLOSIVE_SHOVEL, "EXPLOSIVE_SHOVEL", RecipeType.MAGIC_WORKBENCH, + new ItemStack[] {null, SlimefunItems.SYNTHETIC_DIAMOND, null, null, new ItemStack(Material.TNT), null, null, SlimefunItems.FERROSILICON, null}, + new String[] {"damage-on-use"}, new Object[] {Boolean.FALSE }) + .register(true); - PlayerInventory.update(e.getPlayer()); - return true; - } - else return false; - } - }); - - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.AUTOMATED_PANNING_MACHINE, "AUTOMATED_PANNING_MACHINE", - new ItemStack[] {null, null, null, null, new ItemStack(Material.OAK_TRAPDOOR), null, null, new ItemStack(Material.CAULDRON), null}, - new ItemStack[] {new ItemStack(Material.GRAVEL), new ItemStack(Material.FLINT), new ItemStack(Material.GRAVEL), new ItemStack(Material.CLAY_BALL), new ItemStack(Material.GRAVEL), SlimefunItems.SIFTED_ORE}, Material.OAK_TRAPDOOR) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(final Player p, MultiBlock mb, final Block b) { - if (mb.isMultiBlock(SlimefunItem.getByID("AUTOMATED_PANNING_MACHINE"))) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - final ItemStack input = p.getInventory().getItemInMainHand(); - ItemStack output = null; - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.SIFTED_ORE"))) output = SlimefunItems.SIFTED_ORE; - else if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.CLAY"))) output = new ItemStack(Material.CLAY_BALL); - else if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.FLINT"))) output = new ItemStack(Material.FLINT); - final ItemStack drop = output; - if (input != null) { - if (input.getType() == Material.GRAVEL) { - PlayerInventory.consumeItemInHand(p); - for (int i = 1; i < 7; i++) { - int j = i; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - b.getWorld().playEffect(b.getRelative(BlockFace.DOWN).getLocation(), Effect.STEP_SOUND, Material.GRAVEL); - if (j == 6) { - if (drop != null) b.getWorld().dropItemNaturally(b.getLocation(), drop); - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); - } - }, i*30L); - } - return true; - } - } - Messages.local.sendTranslation(p, "machines.wrong-item", true); - return true; - } - return true; - } - else return false; - } - }); + new AutomatedPanningMachine().register(); new SlimefunItem(Categories.MAGIC_ARMOR, SlimefunItems.BOOTS_OF_THE_STOMPER, "BOOTS_OF_THE_STOMPER", RecipeType.ARMOR_FORGE, new ItemStack[] {null, null, null, new ItemStack(Material.YELLOW_WOOL), null, new ItemStack(Material.YELLOW_WOOL), new ItemStack(Material.PISTON), null, new ItemStack(Material.PISTON)}) .register(true); - new SlimefunItem(Categories.TOOLS, SlimefunItems.PICKAXE_OF_THE_SEEKER, "PICKAXE_OF_THE_SEEKER", RecipeType.MAGIC_WORKBENCH, + new PickaxeOfTheSeeker(Categories.TOOLS, SlimefunItems.PICKAXE_OF_THE_SEEKER, "PICKAXE_OF_THE_SEEKER", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {new ItemStack(Material.COMPASS), SlimefunItems.SYNTHETIC_DIAMOND, new ItemStack(Material.COMPASS), null, SlimefunItems.FERROSILICON, null, null, SlimefunItems.FERROSILICON, null}) - .register(true, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_THE_SEEKER, true)) { - Block closest = null; - - for (int x = -4; x <= 4; x++) { - for (int y = -4; y <= 4; y++) { - for (int z = -4; z <= 4; z++) { - if (p.getLocation().getBlock().getRelative(x, y, z).getType().toString().endsWith("_ORE")) { - if (closest == null) closest = p.getLocation().getBlock().getRelative(x, y, z); - else if (p.getLocation().distance(closest.getLocation()) < p.getLocation().distance(p.getLocation().getBlock().getRelative(x, y, z).getLocation())) closest = p.getLocation().getBlock().getRelative(x, y, z); - } - } - } - } - - if (closest == null) Messages.local.sendTranslation(p, "miner.no-ores", true); - else { - double l = closest.getX() + 0.5 - p.getLocation().getX(); - double w = closest.getZ() + 0.5 - p.getLocation().getZ(); - float yaw, pitch; - double c = Math.sqrt(l * l + w * w); - double alpha1 = -Math.asin(l / c) / Math.PI * 180; - double alpha2 = Math.acos(w / c) / Math.PI * 180; - if (alpha2 > 90) yaw = (float) (180 - alpha1); - else yaw = (float) alpha1; - pitch = (float) ((-Math.atan((closest.getY() - 0.5 - p.getLocation().getY()) / Math.sqrt(l * l + w * w))) * 180F / Math.PI); - - p.teleport(new Location(p.getWorld(), p.getLocation().getX(), p.getLocation().getY(), p.getLocation().getZ(), yaw, pitch)); - } - - if (e.getPlayer().getInventory().getItemInMainHand().getEnchantments().containsKey(Enchantment.DURABILITY)) { - if (SlimefunStartup.randomize(100) <= (60 + 40 / (e.getPlayer().getInventory().getItemInMainHand().getEnchantmentLevel(Enchantment.DURABILITY) + 1))) PlayerInventory.damageItemInHand(e.getPlayer()); - } - else PlayerInventory.damageItemInHand(e.getPlayer()); - - PlayerInventory.update(e.getPlayer()); - return true; - } - else return false; - } - }); + .register(true); new SlimefunBackpack(9, Categories.PORTABLE, SlimefunItems.BACKPACK_SMALL, "SMALL_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {new ItemStack(Material.LEATHER), null, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_6K, new ItemStack(Material.CHEST), SlimefunItems.GOLD_6K, new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER)}) @@ -2340,82 +1290,37 @@ public class SlimefunSetup { new ItemStack[] {SlimefunItems.CLOTH, null, SlimefunItems.CLOTH, SlimefunItems.GOLD_16K, SlimefunItems.BACKPACK_LARGE, SlimefunItems.GOLD_16K, SlimefunItems.CLOTH, SlimefunItems.CLOTH, SlimefunItems.CLOTH}) .register(true); - new SlimefunGadget(Categories.MACHINES_1, SlimefunItems.CRUCIBLE, "CRUCIBLE", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack [] {new ItemStack(Material.TERRACOTTA), null, new ItemStack(Material.TERRACOTTA), new ItemStack(Material.TERRACOTTA), null, new ItemStack(Material.TERRACOTTA), new ItemStack(Material.TERRACOTTA), new ItemStack(Material.FLINT_AND_STEEL), new ItemStack(Material.TERRACOTTA)}, - new ItemStack [] { - new ItemStack(Material.COBBLESTONE, 16), new ItemStack(Material.LAVA_BUCKET), + new Crucible(Categories.MACHINES_1, SlimefunItems.CRUCIBLE, "CRUCIBLE", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack [] {new ItemStack(Material.TERRACOTTA), null, new ItemStack(Material.TERRACOTTA), new ItemStack(Material.TERRACOTTA), null, new ItemStack(Material.TERRACOTTA), new ItemStack(Material.TERRACOTTA), new ItemStack(Material.FLINT_AND_STEEL), new ItemStack(Material.TERRACOTTA)}, + new ItemStack [] { + new ItemStack(Material.COBBLESTONE, 16), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.STONE, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.OAK_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), - new ItemStack(Material.BIRCH_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), - new ItemStack(Material.SPRUCE_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), - new ItemStack(Material.JUNGLE_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), - new ItemStack(Material.ACACIA_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), - new ItemStack(Material.DARK_OAK_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), - - new ItemStack(Material.WHITE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.ORANGE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.MAGENTA_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.LIGHT_BLUE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.YELLOW_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.LIME_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.PINK_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.GRAY_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.LIGHT_GRAY_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.CYAN_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.PURPLE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.BROWN_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.GREEN_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.RED_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), - new ItemStack(Material.BLACK_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET) - }) - .register(true, new ItemInteractionHandler() { + new ItemStack(Material.OAK_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), + new ItemStack(Material.BIRCH_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), + new ItemStack(Material.SPRUCE_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), + new ItemStack(Material.JUNGLE_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), + new ItemStack(Material.ACACIA_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), + new ItemStack(Material.DARK_OAK_LEAVES, 16), new ItemStack(Material.WATER_BUCKET), - @Override - public boolean onRightClick(ItemUseEvent e, final Player p, ItemStack item) { - if (e.getClickedBlock() != null) { - SlimefunItem machine = BlockStorage.check(e.getClickedBlock()); - if (machine != null && machine.getID().equals("CRUCIBLE")) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), e.getClickedBlock(), true)) { - final ItemStack input = p.getInventory().getItemInMainHand(); - final Block block = e.getClickedBlock().getRelative(BlockFace.UP); - for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { - if (input != null && SlimefunManager.isItemSimiliar(input, convert, true)) { - e.setCancelled(true); - ItemStack removing = input.clone(); - removing.setAmount(convert.getAmount()); - p.getInventory().removeItem(removing); - - for (int i = 1; i < 9; i++) { - int j = 8 - i; - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - if (input.getType() == Material.COBBLESTONE || input.getType() == Material.TERRACOTTA || MaterialHelper.isTerracotta(input.getType())) { - block.setType(Material.LAVA); - Levelled le = (Levelled) block.getBlockData(); - le.setLevel(j); - block.setBlockData(le, false); - block.getWorld().playSound(block.getLocation(), Sound.BLOCK_LAVA_POP, 1F, 1F); - } else if (MaterialHelper.isLeavesBlock(input.getType())) { - block.setType(Material.WATER); - Levelled le = (Levelled) block.getBlockData(); - le.setLevel(j); - block.setBlockData(le, false); - block.getWorld().playSound(block.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1F, 1F); - } - }, i*50L); - } - - return true; - } - } - Messages.local.sendTranslation(p, "machines.wrong-item", true); - return true; - } - return true; - } - } - return false; - } - }); + new ItemStack(Material.TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.WHITE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.ORANGE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.MAGENTA_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.LIGHT_BLUE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.YELLOW_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.LIME_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.PINK_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.GRAY_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.LIGHT_GRAY_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.CYAN_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.PURPLE_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.BROWN_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.GREEN_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.RED_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET), + new ItemStack(Material.BLACK_TERRACOTTA, 12), new ItemStack(Material.LAVA_BUCKET) + }) + .register(true); new SlimefunBackpack(45, Categories.PORTABLE, SlimefunItems.GILDED_BACKPACK, "GILDED_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.GOLD_22K, null, SlimefunItems.GOLD_22K, new ItemStack(Material.LEATHER), SlimefunItems.WOVEN_BACKPACK, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_22K, null, SlimefunItems.GOLD_22K}) @@ -2489,90 +1394,13 @@ public class SlimefunSetup { 0.45) .register(true); - new ExcludedTool(Categories.WEAPONS, SlimefunItems.SEISMIC_AXE, "SEISMIC_AXE", RecipeType.MAGIC_WORKBENCH, + new SeismicAxe(Categories.WEAPONS, SlimefunItems.SEISMIC_AXE, "SEISMIC_AXE", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.HARDENED_METAL_INGOT, null, SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.STAFF_ELEMENTAL, null, null, SlimefunItems.STAFF_ELEMENTAL, null}) - .register(true, new ItemInteractionHandler() { + .register(true); - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SEISMIC_AXE, true)) { - List blocks = p.getLineOfSight((HashSet) null, 10); - for (int i = 0; i < blocks.size(); i++) { - Block b = blocks.get(i); - Location ground = b.getLocation(); - if (b.getType() == null || b.getType() == Material.AIR) { - for (int y = ground.getBlockY(); y > 0; y--) { - if (b.getWorld().getBlockAt(b.getX(), y, b.getZ()) != null) { - if (b.getWorld().getBlockAt(b.getX(), y, b.getZ()).getType() != null) { - if (b.getWorld().getBlockAt(b.getX(), y, b.getZ()).getType() != Material.AIR) { - ground = new Location(b.getWorld(), b.getX(), y, b.getZ()); - break; - } - } - } - } - } - b.getWorld().playEffect(ground, Effect.STEP_SOUND, ground.getBlock().getType()); - if (ground.getBlock().getRelative(BlockFace.UP).getType() == null || ground.getBlock().getRelative(BlockFace.UP).getType() == Material.AIR) { - FallingBlock block = ground.getWorld().spawnFallingBlock(ground.getBlock().getRelative(BlockFace.UP).getLocation(), ground.getBlock().getBlockData()); - block.setDropItem(false); - block.setVelocity(new Vector(0, 0.4 + i * 0.01, 0)); - Variables.blocks.add(block.getUniqueId()); - } - for (Entity n: ground.getChunk().getEntities()) { - if (n instanceof LivingEntity) { - if (n.getLocation().distance(ground) <= 2.0D && n.getUniqueId() != p.getUniqueId()) { - Vector vector = n.getLocation().toVector().subtract(p.getLocation().toVector()).normalize().multiply(1.4); - vector.setY(0.9); - n.setVelocity(vector); - if (p.getWorld().getPVP()) { - EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(p, n, DamageCause.ENTITY_ATTACK, 6D); - Bukkit.getPluginManager().callEvent(event); - if (!event.isCancelled()) ((LivingEntity) n).damage(6D); - } - } - } - } - } - - for (int i = 0; i < 4; i++) { - if (e.getPlayer().getInventory().getItemInMainHand() != null) { - if (e.getPlayer().getInventory().getItemInMainHand().getEnchantments().containsKey(Enchantment.DURABILITY)) { - if (SlimefunStartup.randomize(100) <= (60 + 40 / (e.getPlayer().getInventory().getItemInMainHand().getEnchantmentLevel(Enchantment.DURABILITY) + 1))) PlayerInventory.damageItemInHand(e.getPlayer()); - } - else PlayerInventory.damageItemInHand(e.getPlayer()); - } - } - return true; - } - else return false; - } - }); - - new SlimefunItem(Categories.TOOLS, SlimefunItems.PICKAXE_OF_VEIN_MINING, "PICKAXE_OF_VEIN_MINING", RecipeType.MAGIC_WORKBENCH, + new PickaxeOfVeinMining(Categories.TOOLS, SlimefunItems.PICKAXE_OF_VEIN_MINING, "PICKAXE_OF_VEIN_MINING", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {new ItemStack(Material.EMERALD_ORE), SlimefunItems.SYNTHETIC_DIAMOND, new ItemStack(Material.EMERALD_ORE), null, SlimefunItems.GILDED_IRON, null, null, SlimefunItems.GILDED_IRON, null}) - .register(true, new BlockBreakHandler() { - - @Override - public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.PICKAXE_OF_VEIN_MINING, true)) { - if (e.getBlock().getType().toString().endsWith("_ORE")) { - List blocks = new ArrayList(); - Vein.calculate(e.getBlock().getLocation(), e.getBlock().getLocation(), blocks, 16); - for (Location block: blocks) { - Block b = block.getBlock(); - b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType()); - for (ItemStack drop: b.getDrops()) { - b.getWorld().dropItemNaturally(b.getLocation(), drop.getType().isBlock() ? drop: new CustomItem(drop, fortune)); - } - b.setType(Material.AIR); - } - } - return true; - } - else return false; - } - }); + .register(true); new SoulboundItem(Categories.WEAPONS, SlimefunItems.SOULBOUND_SWORD, "SOULBOUND_SWORD", new ItemStack[] {null, SlimefunItems.ESSENCE_OF_AFTERLIFE, null, null, new ItemStack(Material.DIAMOND_SWORD), null, null, SlimefunItems.ESSENCE_OF_AFTERLIFE, null}) @@ -2614,52 +1442,7 @@ public class SlimefunSetup { new ItemStack[] {null, SlimefunItems.ESSENCE_OF_AFTERLIFE, null, null, new ItemStack(Material.DIAMOND_BOOTS), null, null, SlimefunItems.ESSENCE_OF_AFTERLIFE, null}) .register(true); - new SlimefunMachine(Categories.MACHINES_1, SlimefunItems.JUICER, "JUICER", - new ItemStack[] {null, new ItemStack(Material.GLASS), null, null, new ItemStack(Material.NETHER_BRICK_FENCE), null, null, new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), null}, - new ItemStack[] { - new ItemStack(Material.APPLE), SlimefunItems.APPLE_JUICE, - new ItemStack(Material.MELON), SlimefunItems.MELON_JUICE, - new ItemStack(Material.CARROT), SlimefunItems.CARROT_JUICE, - new ItemStack(Material.PUMPKIN), SlimefunItems.PUMPKIN_JUICE}, - Material.NETHER_BRICK_FENCE) - .register(true, new MultiBlockInteractionHandler() { - - @Override - public boolean onInteract(Player p, MultiBlock mb, Block b) { - SlimefunMachine machine = (SlimefunMachine) SlimefunItem.getByID("JUICER"); - - if (mb.isMultiBlock(machine)) { - if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true)) { - if (Slimefun.hasUnlocked(p, SlimefunItems.JUICER, true)) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - for (ItemStack current: inv.getContents()) { - for (ItemStack convert: RecipeType.getRecipeInputs(machine)) { - if (convert != null && SlimefunManager.isItemSimiliar(current, convert, true)) { - ItemStack adding = RecipeType.getRecipeOutput(machine, convert); - Inventory outputInv = SlimefunMachine.findValidOutputInv(adding, dispBlock, inv); - if (outputInv != null) { - ItemStack removing = current.clone(); - removing.setAmount(1); - inv.removeItem(removing); - outputInv.addItem(adding); - p.getWorld().playSound(b.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1F, 1F); - p.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, Material.HAY_BLOCK); - } - else Messages.local.sendTranslation(p, "machines.full-inventory", true); - return true; - } - } - } - Messages.local.sendTranslation(p, "machines.unknown-material", true); - } - } - return true; - } - else return false; - } - }); + new Juicer().register(); new Juice(Categories.FOOD, SlimefunItems.APPLE_JUICE, "APPLE_JUICE", RecipeType.JUICER, new ItemStack[] {null, null, null, null, new ItemStack(Material.APPLE), null, null, null, null}) @@ -2678,7 +1461,7 @@ public class SlimefunSetup { .register(true); new Juice(Categories.FOOD, SlimefunItems.GOLDEN_APPLE_JUICE, "GOLDEN_APPLE_JUICE", RecipeType.JUICER, - new ItemStack[] {new ItemStack(Material.GOLDEN_APPLE), null, null, null, null, null, null, null, null}) + new ItemStack[] {null, null, null, null, new ItemStack(Material.GOLDEN_APPLE), null, null, null, null}) .register(true); new SlimefunItem(Categories.LUMPS_AND_MAGIC, SlimefunItems.BROKEN_SPAWNER, "BROKEN_SPAWNER", new RecipeType(SlimefunItems.PICKAXE_OF_CONTAINMENT), @@ -2776,77 +1559,15 @@ public class SlimefunSetup { new SlimefunItem(Categories.TECH_MISC, SlimefunItems.COPPER_WIRE, "COPPER_WIRE", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, null, null, SlimefunItems.COPPER_INGOT, SlimefunItems.COPPER_INGOT, SlimefunItems.COPPER_INGOT, null, null, null}, new CustomItem(SlimefunItems.COPPER_WIRE, 8)) .register(true); - - - @SuppressWarnings("unchecked") - final String[] blockPlacerBlacklist = Slimefun.getItemValue("BLOCK_PLACER", "unplaceable-blocks") != null ? ((List) Slimefun.getItemValue("BLOCK_PLACER", "unplaceable-blocks")).toArray(new String[((List) Slimefun.getItemValue("BLOCK_PLACER", "unplaceable-blocks")).size()]) : new String[] {"STRUCTURE_BLOCK"}; - - new SlimefunItem(Categories.MACHINES_1, SlimefunItems.BLOCK_PLACER, "BLOCK_PLACER", RecipeType.ENHANCED_CRAFTING_TABLE, + + new BlockPlacer(Categories.MACHINES_1, SlimefunItems.BLOCK_PLACER, "BLOCK_PLACER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.GOLD_4K, new ItemStack(Material.PISTON), SlimefunItems.GOLD_4K, new ItemStack(Material.IRON_INGOT), SlimefunItems.ELECTRIC_MOTOR, new ItemStack(Material.IRON_INGOT), SlimefunItems.GOLD_4K, new ItemStack(Material.PISTON), SlimefunItems.GOLD_4K}, - new String[] {"unplaceable-blocks"}, new Object[] {Arrays.asList("STRUCTURE_BLOCK")}) - .register(true, new AutonomousMachineHandler() { + new String[] {"unplaceable-blocks"}, new Object[] {Stream.of(Material.STRUCTURE_BLOCK, Material.COMMAND_BLOCK, Material.CHAIN_COMMAND_BLOCK, Material.REPEATING_COMMAND_BLOCK).map(Material::toString).collect(Collectors.toList())}) + .register(true); - @Override - public boolean onBlockDispense(final BlockDispenseEvent e, Block dispenser, final Dispenser d, Block block, Block chest, SlimefunItem machine) { - if (machine.getID().equalsIgnoreCase("BLOCK_PLACER")) { - e.setCancelled(true); - if ((block.getType() == null || block.getType() == Material.AIR) && e.getItem().getType().isBlock()) { - for(String blockType : blockPlacerBlacklist) { - if (e.getItem().getType().toString().equals(blockType)) { - return false; - } - } - - SlimefunItem sfItem = SlimefunItem.getByItem(e.getItem()); - if (sfItem != null) { - if (!SlimefunItem.blockhandler.containsKey(sfItem.getID())) { - block.setType(e.getItem().getType()); - BlockStorage.store(block, sfItem.getID()); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, e.getItem().getType()); - if (d.getInventory().containsAtLeast(e.getItem(), 2)) d.getInventory().removeItem(new CustomItem(e.getItem(), 1)); - else { - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - d.getInventory().removeItem(e.getItem()); - }, 2L); - } - } - } - else { - block.setType(e.getItem().getType()); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, e.getItem().getType()); - if (d.getInventory().containsAtLeast(e.getItem(), 2)) d.getInventory().removeItem(new CustomItem(e.getItem(), 1)); - else { - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - d.getInventory().removeItem(e.getItem()); - }, 2L); - } - } - } - return true; - } - else return false; - } - }); - - new SlimefunItem(Categories.MAGIC, SlimefunItems.SCROLL_OF_DIMENSIONAL_TELEPOSITION, "SCROLL_OF_DIMENSIONAL_TELEPOSITION", RecipeType.MAGIC_WORKBENCH, + new TelepositionScroll(Categories.MAGIC, SlimefunItems.SCROLL_OF_DIMENSIONAL_TELEPOSITION, "SCROLL_OF_DIMENSIONAL_TELEPOSITION", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {null, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGIC_EYE_OF_ENDER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGICAL_BOOK_COVER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGIC_EYE_OF_ENDER, SlimefunItems.ENDER_LUMP_3, null}) - .register(true, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SCROLL_OF_DIMENSIONAL_TELEPOSITION, true)) { - for (Entity n: p.getNearbyEntities(10.0, 10.0, 10.0)) { - if (n instanceof LivingEntity && !(n instanceof ArmorStand) &&n.getUniqueId() != p.getUniqueId()) { - float yaw = n.getLocation().getYaw() + 180.0F; - if (yaw > 360.0F) yaw = yaw - 360.0F; - n.teleport(new Location(n.getWorld(), n.getLocation().getX(), n.getLocation().getY(), n.getLocation().getZ(), yaw, n.getLocation().getPitch())); - } - } - return true; - } - else return false; - } - }); + .register(true); new SlimefunBow(SlimefunItems.EXPLOSIVE_BOW, "EXPLOSIVE_BOW", new ItemStack[] {null, new ItemStack(Material.STICK), new ItemStack(Material.GUNPOWDER), SlimefunItems.STAFF_FIRE, null, SlimefunItems.SULFATE, null, new ItemStack(Material.STICK), new ItemStack(Material.GUNPOWDER)}) @@ -2854,7 +1575,7 @@ public class SlimefunSetup { @Override public boolean onHit(EntityDamageByEntityEvent e, LivingEntity n) { - if (SlimefunManager.isItemSimiliar(Variables.arrows.get(e.getDamager().getUniqueId()), SlimefunItems.EXPLOSIVE_BOW, true)) { + if (SlimefunManager.isItemSimiliar(SlimefunPlugin.getUtilities().arrows.get(e.getDamager().getUniqueId()), SlimefunItems.EXPLOSIVE_BOW, true)) { Vector vector = n.getVelocity(); vector.setY(0.6); n.setVelocity(vector); @@ -2872,7 +1593,7 @@ public class SlimefunSetup { @Override public boolean onHit(EntityDamageByEntityEvent e, LivingEntity n) { - if (SlimefunManager.isItemSimiliar(Variables.arrows.get(e.getDamager().getUniqueId()), SlimefunItems.ICY_BOW, true)) { + if (SlimefunManager.isItemSimiliar(SlimefunPlugin.getUtilities().arrows.get(e.getDamager().getUniqueId()), SlimefunItems.ICY_BOW, true)) { n.getWorld().playEffect(n.getLocation(), Effect.STEP_SOUND, Material.ICE); n.getWorld().playEffect(n.getEyeLocation(), Effect.STEP_SOUND, Material.ICE); n.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 20 * 2, 10)); @@ -2883,53 +1604,15 @@ public class SlimefunSetup { } }); - new SlimefunItem(Categories.MAGIC, SlimefunItems.TOME_OF_KNOWLEDGE_SHARING, "TOME_OF_KNOWLEDGE_SHARING", RecipeType.MAGIC_WORKBENCH, + new KnowledgeTome(Categories.MAGIC, SlimefunItems.TOME_OF_KNOWLEDGE_SHARING, "TOME_OF_KNOWLEDGE_SHARING", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {null, new ItemStack(Material.FEATHER), null, new ItemStack(Material.INK_SAC), SlimefunItems.MAGICAL_BOOK_COVER, new ItemStack(Material.GLASS_BOTTLE), null, new ItemStack(Material.WRITABLE_BOOK), null}) - .register(true, new ItemInteractionHandler() { + .register(true); - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.TOME_OF_KNOWLEDGE_SHARING, true)) { - List lore = item.getItemMeta().getLore(); - lore.set(0, ChatColor.translateAlternateColorCodes('&', "&7Owner: &b" + p.getName())); - lore.set(1, ChatColor.BLACK + "" + p.getUniqueId()); - ItemMeta im = item.getItemMeta(); - im.setLore(lore); - item.setItemMeta(im); - p.getEquipment().setItemInMainHand(item); - p.getWorld().playSound(p.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1F, 1F); - return true; - } - else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.TOME_OF_KNOWLEDGE_SHARING, false)) { - PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); - Set researches = PlayerProfile.fromUUID(UUID.fromString(ChatColor.stripColor(item.getItemMeta().getLore().get(1)))).getResearches(); - researches.forEach((research) -> profile.setResearched(research, true)); - - PlayerInventory.consumeItemInHand(p); - return true; - } - else return false; - } - }); - - new SlimefunItem(Categories.MAGIC, SlimefunItems.FLASK_OF_KNOWLEDGE, "FLASK_OF_KNOWLEDGE", RecipeType.MAGIC_WORKBENCH, + new KnowledgeFlask(Categories.MAGIC, SlimefunItems.FLASK_OF_KNOWLEDGE, "FLASK_OF_KNOWLEDGE", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {null, null, null, SlimefunItems.MAGIC_LUMP_2, new ItemStack(Material.GLASS_PANE), SlimefunItems.MAGIC_LUMP_2, null, SlimefunItems.MAGIC_LUMP_2, null}, new CustomItem(SlimefunItems.FLASK_OF_KNOWLEDGE, 8)) - .register(true, new ItemInteractionHandler() { + .register(true); - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.FLASK_OF_KNOWLEDGE, true) && p.getLevel() >= 1) { - p.setLevel(p.getLevel() - 1); - p.getInventory().addItem(new CustomItem(Material.EXPERIENCE_BOTTLE, "&aFlask of Knowledge")); - PlayerInventory.consumeItemInHand(p); - PlayerInventory.update(p); - return true; - } - else return false; - } - }); - - new SlimefunItem(Categories.BIRTHDAY, new CustomItem(new ItemStack(Material.CAKE), "&bBirthday Cake"), "BIRTHDAY_CAKE", RecipeType.ENHANCED_CRAFTING_TABLE, + new ExcludedBlock(Categories.BIRTHDAY, new CustomItem(new ItemStack(Material.CAKE), "&bBirthday Cake"), "BIRTHDAY_CAKE", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.TORCH), null, new ItemStack(Material.SUGAR), new ItemStack(Material.CAKE), new ItemStack(Material.SUGAR), null, null, null}) .register(true); @@ -3004,23 +1687,18 @@ public class SlimefunSetup { PlayerInventory.consumeItemInHand(e.getPlayer()); FireworkShow.launchRandom(e.getPlayer(), 2); - List gifts = new ArrayList(); + List gifts = new ArrayList<>(); + for (int i = 0; i < 2; i++) { gifts.add(new CustomItem(SlimefunItems.EASTER_CARROT_PIE, 4)); - gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_PIE, 4)); gifts.add(new CustomItem(SlimefunItems.CARROT_JUICE, 1)); + gifts.add(new ItemStack(Material.EMERALD)); + gifts.add(new ItemStack(Material.CAKE)); + gifts.add(new ItemStack(Material.RABBIT_FOOT)); + gifts.add(new ItemStack(Material.GOLDEN_CARROT, 4)); } - gifts.add(new SkullItem("mrCookieSlime")); - gifts.add(new SkullItem("timtower")); - gifts.add(new SkullItem("bwfcwalshy")); - gifts.add(new SkullItem("jadedcat")); - gifts.add(new SkullItem("ZeldoKavira")); - gifts.add(new SkullItem("eyamaz")); - gifts.add(new SkullItem("Kaelten")); - gifts.add(new SkullItem("Myrathi")); - - p.getWorld().dropItemNaturally(p.getLocation(), gifts.get(SlimefunStartup.randomize(gifts.size()))); + p.getWorld().dropItemNaturally(p.getLocation(), gifts.get(random.nextInt(gifts.size()))); return true; } else return false; @@ -3053,65 +1731,19 @@ public class SlimefunSetup { new CustomItem(SlimefunItems.WITHER_PROOF_OBSIDIAN, 4)) .register(true); - new SlimefunItem(Categories.LUMPS_AND_MAGIC, SlimefunItems.ANCIENT_PEDESTAL, "ANCIENT_PEDESTAL", RecipeType.MAGIC_WORKBENCH, + new AncientPedestal(Categories.LUMPS_AND_MAGIC, SlimefunItems.ANCIENT_PEDESTAL, "ANCIENT_PEDESTAL", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {new ItemStack(Material.OBSIDIAN), SlimefunItems.GOLD_8K, new ItemStack(Material.OBSIDIAN), null, new ItemStack(Material.STONE), null, new ItemStack(Material.OBSIDIAN), SlimefunItems.GOLD_8K, new ItemStack(Material.OBSIDIAN)}, new CustomItem(SlimefunItems.ANCIENT_PEDESTAL, 4)) .register(true); - SlimefunItem.registerBlockHandler("ANCIENT_PEDESTAL", new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - Item stack = AncientAltarListener.findItem(b); - if (stack != null) { - stack.removeMetadata("item_placed", SlimefunStartup.instance); - b.getWorld().dropItem(b.getLocation(), AncientAltarListener.fixItemStack(stack.getItemStack(), stack.getCustomName())); - stack.remove(); - } - return true; - } - }); - new SlimefunItem(Categories.MAGIC, SlimefunItems.ANCIENT_ALTAR, "ANCIENT_ALTAR", RecipeType.MAGIC_WORKBENCH, new ItemStack[] {null, new ItemStack(Material.ENCHANTING_TABLE), null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.GOLD_8K, SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.OBSIDIAN), SlimefunItems.GOLD_8K, new ItemStack(Material.OBSIDIAN)}) .register(true); // Slimefun 4 - new SlimefunItem(Categories.ELECTRICITY, SlimefunItems.ENERGY_REGULATOR, "ENERGY_REGULATOR", RecipeType.ENHANCED_CRAFTING_TABLE, + new EnergyRegulator(Categories.ELECTRICITY, SlimefunItems.ENERGY_REGULATOR, "ENERGY_REGULATOR", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.SILVER_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.SILVER_INGOT}) - .register(true, new BlockTicker() { - - @Override - public boolean isSynchronized() { - return false; - } - - @Override - public void uniqueTick() { - } - - @Override - public void tick(Block b, SlimefunItem item, Config data) { - EnergyNet.getNetworkFromLocationOrCreate(b.getLocation()).tick(b); - } - }); - - SlimefunItem.registerBlockHandler("ENERGY_REGULATOR", new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - EnergyHologram.remove(b); - return true; - } - }); + .register(true); new SlimefunItem(Categories.MISC, SlimefunItems.DUCT_TAPE, "DUCT_TAPE", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.ALUMINUM_DUST, SlimefunItems.ALUMINUM_DUST, SlimefunItems.ALUMINUM_DUST, new ItemStack(Material.SLIME_BALL), new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.SLIME_BALL), new ItemStack(Material.PAPER), new ItemStack(Material.PAPER), new ItemStack(Material.PAPER)}, new CustomItem(SlimefunItems.DUCT_TAPE, 2)) @@ -3370,17 +2002,7 @@ public class SlimefunSetup { new ElectricIngotFactory(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_INGOT_FACTORY, "ELECTRIC_INGOT_FACTORY", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.FLINT_AND_STEEL), null, SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRIC_DUST_WASHER, SlimefunItems.HEATING_COIL, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.DAMASCUS_STEEL_INGOT}) { - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - - @Override - public String getInventoryTitle() { - return "&cElectric Ingot Factory"; - } - + @Override public int getEnergyConsumption() { return 4; @@ -3396,16 +2018,6 @@ public class SlimefunSetup { new ElectricIngotFactory(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_INGOT_FACTORY_2, "ELECTRIC_INGOT_FACTORY_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.GILDED_IRON, new ItemStack(Material.FLINT_AND_STEEL), SlimefunItems.GILDED_IRON, SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRIC_INGOT_FACTORY, SlimefunItems.HEATING_COIL, SlimefunItems.BRASS_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.BRASS_INGOT}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - - @Override - public String getInventoryTitle() { - return "&cElectric Ingot Factory"; - } - @Override public int getEnergyConsumption() { return 7; @@ -3421,16 +2033,6 @@ public class SlimefunSetup { new ElectricIngotFactory(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_INGOT_FACTORY_3, "ELECTRIC_INGOT_FACTORY_3", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.GILDED_IRON, new ItemStack(Material.FLINT_AND_STEEL), SlimefunItems.GILDED_IRON, SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRIC_INGOT_FACTORY_2, SlimefunItems.HEATING_COIL, SlimefunItems.BRASS_INGOT, SlimefunItems.BLISTERING_INGOT_3, SlimefunItems.BRASS_INGOT}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - - @Override - public String getInventoryTitle() { - return "&cElectric Ingot Factory"; - } - @Override public int getEnergyConsumption() { return 20; @@ -3488,23 +2090,9 @@ public class SlimefunSetup { }.registerChargeableBlock(true, 1024); - new AContainer(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_ORE_GRINDER, "ELECTRIC_ORE_GRINDER", RecipeType.ENHANCED_CRAFTING_TABLE, + new ElectricOreGrinder(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_ORE_GRINDER, "ELECTRIC_ORE_GRINDER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.DIAMOND_PICKAXE), null, SlimefunItems.GILDED_IRON, SlimefunItems.HEATING_COIL, SlimefunItems.GILDED_IRON, SlimefunItems.GILDED_IRON, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.GILDED_IRON}) { - - @Override - public void registerDefaultRecipes() { - } - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.STONE_PICKAXE); - } - - @Override - public String getInventoryTitle() { - return "&bElectric Ore Grinder"; - } - + @Override public int getEnergyConsumption() { return 6; @@ -3515,30 +2103,11 @@ public class SlimefunSetup { return 1; } - @Override - public String getMachineIdentifier() { - return "ELECTRIC_ORE_GRINDER"; - } - }.registerChargeableBlock(true, 128); - new AContainer(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_ORE_GRINDER_2, "ELECTRIC_ORE_GRINDER_2", RecipeType.ENHANCED_CRAFTING_TABLE, + new ElectricOreGrinder(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_ORE_GRINDER_2, "ELECTRIC_ORE_GRINDER_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.DIAMOND_PICKAXE), null, SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRIC_ORE_GRINDER, SlimefunItems.HEATING_COIL, SlimefunItems.GILDED_IRON, SlimefunItems.BLISTERING_INGOT_3, SlimefunItems.GILDED_IRON}) { - @Override - public void registerDefaultRecipes() { - } - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.DIAMOND_PICKAXE); - } - - @Override - public String getInventoryTitle() { - return "&bElectric Ore Grinder"; - } - @Override public int getEnergyConsumption() { return 15; @@ -3549,21 +2118,11 @@ public class SlimefunSetup { return 4; } - @Override - public String getMachineIdentifier() { - return "ELECTRIC_ORE_GRINDER"; - } - }.registerChargeableBlock(true, 512); new HeatedPressureChamber(Categories.ELECTRICITY, SlimefunItems.HEATED_PRESSURE_CHAMBER, "HEATED_PRESSURE_CHAMBER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.LEAD_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.LEAD_INGOT, SlimefunItems.LEAD_INGOT, new ItemStack(Material.GLASS), SlimefunItems.LEAD_INGOT, SlimefunItems.LEAD_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.LEAD_INGOT}) { - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - + @Override public int getEnergyConsumption() { return 5; @@ -3579,11 +2138,6 @@ public class SlimefunSetup { new HeatedPressureChamber(Categories.ELECTRICITY, SlimefunItems.HEATED_PRESSURE_CHAMBER_2, "HEATED_PRESSURE_CHAMBER_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.LEAD_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.LEAD_INGOT, SlimefunItems.LEAD_INGOT, SlimefunItems.HEATED_PRESSURE_CHAMBER, SlimefunItems.LEAD_INGOT, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.REINFORCED_ALLOY_INGOT}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - @Override public int getEnergyConsumption() { return 22; @@ -3596,86 +2150,13 @@ public class SlimefunSetup { }.registerChargeableBlock(true, 256); - new AContainer(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_INGOT_PULVERIZER, "ELECTRIC_INGOT_PULVERIZER", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {null, SlimefunItems.ELECTRIC_ORE_GRINDER, null, SlimefunItems.LEAD_INGOT, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.LEAD_INGOT, SlimefunItems.LEAD_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.LEAD_INGOT}){ - @Override - public String getInventoryTitle() { - return "&bElectric Ingot Pulverizer"; - } + new ElectricIngotPulverizer(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_INGOT_PULVERIZER, "ELECTRIC_INGOT_PULVERIZER", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {null, SlimefunItems.ELECTRIC_ORE_GRINDER, null, SlimefunItems.LEAD_INGOT, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.LEAD_INGOT, SlimefunItems.LEAD_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.LEAD_INGOT}) + .registerChargeableBlock(true, 512); - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.IRON_PICKAXE); - } - - @Override - public void registerDefaultRecipes() { - registerRecipe(3, new ItemStack[]{SlimefunItems.ALUMINUM_INGOT}, new ItemStack[]{SlimefunItems.ALUMINUM_DUST}); - registerRecipe(3, new ItemStack[]{SlimefunItems.COPPER_INGOT}, new ItemStack[]{SlimefunItems.COPPER_DUST}); - registerRecipe(3, new ItemStack[]{SlimefunItems.GOLD_4K}, new ItemStack[]{SlimefunItems.GOLD_DUST}); - registerRecipe(3, new ItemStack[]{new ItemStack(Material.IRON_INGOT)}, new ItemStack[]{SlimefunItems.IRON_DUST}); - registerRecipe(3, new ItemStack[]{SlimefunItems.LEAD_INGOT}, new ItemStack[]{SlimefunItems.LEAD_DUST}); - registerRecipe(3, new ItemStack[]{SlimefunItems.MAGNESIUM_INGOT}, new ItemStack[]{SlimefunItems.MAGNESIUM_DUST}); - registerRecipe(3, new ItemStack[]{SlimefunItems.SILVER_INGOT}, new ItemStack[]{SlimefunItems.SILVER_DUST}); - registerRecipe(3, new ItemStack[]{SlimefunItems.TIN_INGOT}, new ItemStack[]{SlimefunItems.TIN_DUST}); - registerRecipe(3, new ItemStack[]{SlimefunItems.ZINC_INGOT}, new ItemStack[]{SlimefunItems.ZINC_DUST}); - - - } - - @Override - public int getEnergyConsumption() { - return 7; - } - - @Override - public int getSpeed() { - return 1; - } - - @Override - public String getMachineIdentifier() { - return "ELECTRIC_INGOT_PULVERIZER"; - } - }.registerChargeableBlock(true, 512); - - new AGenerator(Categories.ELECTRICITY, SlimefunItems.COAL_GENERATOR, "COAL_GENERATOR", RecipeType.ENHANCED_CRAFTING_TABLE, + new CoalGenerator(Categories.ELECTRICITY, SlimefunItems.COAL_GENERATOR, "COAL_GENERATOR", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.HEATING_COIL, new ItemStack(Material.FURNACE), SlimefunItems.HEATING_COIL, SlimefunItems.NICKEL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.NICKEL_INGOT, null, SlimefunItems.NICKEL_INGOT, null}) { - - @Override - public void registerDefaultRecipes() { - registerFuel(new MachineFuel(8, new ItemStack(Material.COAL))); - registerFuel(new MachineFuel(8, new ItemStack(Material.CHARCOAL))); - registerFuel(new MachineFuel(80, new ItemStack(Material.COAL_BLOCK))); - registerFuel(new MachineFuel(12, new ItemStack(Material.BLAZE_ROD))); - - // Logs - registerFuel(new MachineFuel(1, new ItemStack(Material.OAK_LOG))); - registerFuel(new MachineFuel(1, new ItemStack(Material.SPRUCE_LOG))); - registerFuel(new MachineFuel(1, new ItemStack(Material.BIRCH_LOG))); - registerFuel(new MachineFuel(1, new ItemStack(Material.JUNGLE_LOG))); - registerFuel(new MachineFuel(1, new ItemStack(Material.ACACIA_LOG))); - registerFuel(new MachineFuel(1, new ItemStack(Material.DARK_OAK_LOG))); - - // Wooden Planks - registerFuel(new MachineFuel(1, new ItemStack(Material.OAK_WOOD))); - registerFuel(new MachineFuel(1, new ItemStack(Material.SPRUCE_WOOD))); - registerFuel(new MachineFuel(1, new ItemStack(Material.BIRCH_WOOD))); - registerFuel(new MachineFuel(1, new ItemStack(Material.JUNGLE_WOOD))); - registerFuel(new MachineFuel(1, new ItemStack(Material.ACACIA_WOOD))); - registerFuel(new MachineFuel(1, new ItemStack(Material.DARK_OAK_WOOD))); - } - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - - @Override - public String getInventoryTitle() { - return "&cCoal Generator"; - } - + @Override public int getEnergyProduction() { return 8; @@ -3683,6 +2164,16 @@ public class SlimefunSetup { }.registerUnrechargeableBlock(true, 64); + new CoalGenerator(Categories.ELECTRICITY, SlimefunItems.COAL_GENERATOR_2, "COAL_GENERATOR_2", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {new ItemStack(Material.MAGMA_BLOCK), SlimefunItems.HEATING_COIL, new ItemStack(Material.MAGMA_BLOCK), SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.COAL_GENERATOR, SlimefunItems.HARDENED_METAL_INGOT, null, SlimefunItems.ELECTRIC_MOTOR, null}) { + + @Override + public int getEnergyProduction() { + return 15; + } + + }.registerUnrechargeableBlock(true, 256); + new AGenerator(Categories.ELECTRICITY, SlimefunItems.BIO_REACTOR, "BIO_REACTOR", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.HEATING_COIL, SlimefunItems.COMPOSTER, SlimefunItems.HEATING_COIL, SlimefunItems.ALUMINUM_BRASS_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.ALUMINUM_BRASS_INGOT, null, SlimefunItems.ALUMINUM_BRASS_INGOT, null}) { @@ -3746,6 +2237,10 @@ public class SlimefunSetup { }.registerUnrechargeableBlock(true, 128); + new AutoDrier(Categories.ELECTRICITY, SlimefunItems.AUTO_DRIER, "AUTO_DRIER", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {null, null, null, SlimefunItems.HEATING_COIL, new ItemStack(Material.SMOKER), SlimefunItems.HEATING_COIL, null, new ItemStack(Material.CAMPFIRE), null}) + .registerChargeableBlock(true, 128); + new AutoEnchanter(Categories.ELECTRICITY, SlimefunItems.AUTO_ENCHANTER, "AUTO_ENCHANTER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.ENCHANTING_TABLE), null, SlimefunItems.CARBONADO, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.CARBONADO, SlimefunItems.WITHER_PROOF_OBSIDIAN, SlimefunItems.WITHER_PROOF_OBSIDIAN, SlimefunItems.WITHER_PROOF_OBSIDIAN}) .registerChargeableBlock(true, 128); @@ -3820,14 +2315,10 @@ public class SlimefunSetup { public void tick(Block b, SlimefunItem item, Config data) { int charge = ChargableBlock.getCharge(b); if (charge > 0) { - Slimefun.getGPSNetwork().updateTransmitter(b, UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); - ChargableBlock.setCharge(b, charge - 1); + Slimefun.getGPSNetwork().updateTransmitter(b.getLocation(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); + ChargableBlock.setCharge(b.getLocation(), charge - 1); } - else Slimefun.getGPSNetwork().updateTransmitter(b, UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); - } - - @Override - public void uniqueTick() { + else Slimefun.getGPSNetwork().updateTransmitter(b.getLocation(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); } @Override @@ -3845,7 +2336,7 @@ public class SlimefunSetup { @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - Slimefun.getGPSNetwork().updateTransmitter(b, UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + Slimefun.getGPSNetwork().updateTransmitter(b.getLocation(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); return true; } }); @@ -3856,20 +2347,16 @@ public class SlimefunSetup { @Override public void tick(Block b, SlimefunItem item, Config data) { - int charge = ChargableBlock.getCharge(b); + int charge = ChargableBlock.getCharge(b.getLocation()); if (charge > 2) { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 4 + 100, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); - ChargableBlock.setCharge(b, charge - 3); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 4.0 + 100, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); + ChargableBlock.setCharge(b.getLocation(), charge - 3); } else { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 4 + 100, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 4.0 + 100, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); } } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return false; @@ -3885,7 +2372,7 @@ public class SlimefunSetup { @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 4 + 100, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 4.0 + 100, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); return true; } }); @@ -3896,20 +2383,16 @@ public class SlimefunSetup { @Override public void tick(Block b, SlimefunItem item, Config data) { - int charge = ChargableBlock.getCharge(b); + int charge = ChargableBlock.getCharge(b.getLocation()); if (charge > 10) { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 16 + 500, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); - ChargableBlock.setCharge(b, charge - 11); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 16.0 + 500, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); + ChargableBlock.setCharge(b.getLocation(), charge - 11); } else { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 16 + 500, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 16.0 + 500, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); } } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return false; @@ -3925,7 +2408,7 @@ public class SlimefunSetup { @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 16 + 500, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 16.0 + 500, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); return true; } }); @@ -3936,20 +2419,16 @@ public class SlimefunSetup { @Override public void tick(Block b, SlimefunItem item, Config data) { - int charge = ChargableBlock.getCharge(b); + int charge = ChargableBlock.getCharge(b.getLocation()); if (charge > 45) { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 64 + 800, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); - ChargableBlock.setCharge(b, charge - 46); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 64.0 + 800, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.ONLINE); + ChargableBlock.setCharge(b.getLocation(), charge - 46); } else { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 64 + 800, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 64.0 + 800, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); } } - @Override - public void uniqueTick() { - } - @Override public boolean isSynchronized() { return false; @@ -3965,7 +2444,7 @@ public class SlimefunSetup { @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 64 + 800, b.getZ()).getBlock(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + Slimefun.getGPSNetwork().updateTransmitter(new Location(b.getWorld(), b.getX(), b.getY() * 64.0 + 800, b.getZ()), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); return true; } }); @@ -3977,14 +2456,11 @@ public class SlimefunSetup { @Override public boolean onRightClick(ItemUseEvent e, Player p, ItemStack stack) { if (e.getClickedBlock() == null) return false; - SlimefunItem item = BlockStorage.check(e.getClickedBlock()); - if (item == null || !item.getID().equals("GPS_CONTROL_PANEL")) return false; + String item = BlockStorage.checkID(e.getClickedBlock()); + if (item == null || !item.equals("GPS_CONTROL_PANEL")) return false; e.setCancelled(true); - try { - Slimefun.getGPSNetwork().openTransmitterControlPanel(p); - } catch (Exception e1) { - e1.printStackTrace(); - } + + Slimefun.getGPSNetwork().openTransmitterControlPanel(p); return true; } }); @@ -4301,34 +2777,20 @@ public class SlimefunSetup { .register(true); new SlimefunItem(Categories.LUMPS_AND_MAGIC, SlimefunItems.RUNE_ENDER, "ANCIENT_RUNE_ENDER", RecipeType.ANCIENT_ALTAR, - new ItemStack[] {new ItemStack(Material.ENDER_PEARL), SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.ENDER_PEARL), new ItemStack(Material.ENDER_EYE), SlimefunItems.BLANK_RUNE, new ItemStack(Material.ENDER_EYE) ,new ItemStack(Material.ENDER_PEARL), SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.ENDER_PEARL)}, new CustomItem(SlimefunItems.RUNE_ENDER, 6)) + new ItemStack[] {new ItemStack(Material.ENDER_PEARL), SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.ENDER_PEARL), new ItemStack(Material.ENDER_EYE), SlimefunItems.BLANK_RUNE, new ItemStack(Material.ENDER_EYE), new ItemStack(Material.ENDER_PEARL), SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.ENDER_PEARL)}, new CustomItem(SlimefunItems.RUNE_ENDER, 6)) + .register(true); + + new SlimefunItem(Categories.LUMPS_AND_MAGIC, SlimefunItems.RUNE_LIGHTNING, "ANCIENT_RUNE_LIGHTNING", RecipeType.ANCIENT_ALTAR, + new ItemStack[] {new ItemStack(Material.IRON_INGOT), SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.IRON_INGOT), SlimefunItems.RUNE_AIR, new ItemStack(Material.PHANTOM_MEMBRANE), SlimefunItems.RUNE_WATER, new ItemStack(Material.IRON_INGOT), SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.IRON_INGOT)}, new CustomItem(SlimefunItems.RUNE_LIGHTNING, 4)) .register(true); new SlimefunItem(Categories.LUMPS_AND_MAGIC, SlimefunItems.RUNE_RAINBOW, "ANCIENT_RUNE_RAINBOW", RecipeType.ANCIENT_ALTAR, - new ItemStack[] {new ItemStack(Material.RED_DYE), SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.CYAN_DYE), new ItemStack(Material.WHITE_WOOL), SlimefunItems.RUNE_ENDER, new ItemStack(Material.WHITE_WOOL) , new ItemStack(Material.YELLOW_DYE), SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.MAGENTA_DYE)}) + new ItemStack[] {new ItemStack(Material.RED_DYE), SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.CYAN_DYE), new ItemStack(Material.WHITE_WOOL), SlimefunItems.RUNE_ENDER, new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.YELLOW_DYE), SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.MAGENTA_DYE)}) .register(true); - new SlimefunItem(Categories.MAGIC, SlimefunItems.INFERNAL_BONEMEAL, "INFERNAL_BONEMEAL", RecipeType.ANCIENT_ALTAR, + new InfernalBonemeal(Categories.MAGIC, SlimefunItems.INFERNAL_BONEMEAL, "INFERNAL_BONEMEAL", RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.NETHER_WART), SlimefunItems.RUNE_EARTH, new ItemStack(Material.NETHER_WART), SlimefunItems.MAGIC_LUMP_2, new ItemStack(Material.BONE_MEAL), SlimefunItems.MAGIC_LUMP_2, new ItemStack(Material.NETHER_WART), new ItemStack(Material.BLAZE_POWDER), new ItemStack(Material.NETHER_WART)}, new CustomItem(SlimefunItems.INFERNAL_BONEMEAL, 8)) - .register(true, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) { - if (SlimefunManager.isItemSimiliar(e.getItem(), SlimefunItems.INFERNAL_BONEMEAL, true)) { - if (e.getClickedBlock() != null && e.getClickedBlock().getType().equals(Material.NETHER_WART)) { - Ageable ageable = (Ageable)e.getClickedBlock().getBlockData(); - if (ageable.getAge() < ageable.getMaximumAge()) { - ageable.setAge(ageable.getMaximumAge()); - e.getClickedBlock().setBlockData(ageable); - e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, Material.REDSTONE_BLOCK); - PlayerInventory.consumeItemInHand(p); - } - } - return true; - } - return false; - } - }); + .register(true); new SlimefunItem(Categories.MAGIC, SlimefunItems.ELYTRA_SCALE, "ELYTRA_SCALE", RecipeType.ANCIENT_ALTAR, new ItemStack[] {SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_ENDER, new ItemStack(Material.FEATHER), SlimefunItems.RUNE_ENDER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3}) @@ -4413,14 +2875,11 @@ public class SlimefunSetup { @Override public boolean onRightClick(ItemUseEvent e, Player p, ItemStack stack) { if (e.getClickedBlock() == null) return false; - SlimefunItem item = BlockStorage.check(e.getClickedBlock()); - if (item == null || !item.getID().equals("GPS_GEO_SCANNER")) return false; + String item = BlockStorage.checkID(e.getClickedBlock()); + if (item == null || !item.equals("GPS_GEO_SCANNER")) return false; e.setCancelled(true); - try { - Slimefun.getGPSNetwork().scanChunk(p, e.getClickedBlock().getChunk()); - } catch (Exception e1) { - e1.printStackTrace(); - } + + Slimefun.getGPSNetwork().scanChunk(p, e.getClickedBlock().getChunk()); return true; } }); @@ -4436,7 +2895,7 @@ public class SlimefunSetup { @Override public int getSpeed() { return 1; - }; + } }.registerChargeableBlock(true, 200); @@ -4476,28 +2935,13 @@ public class SlimefunSetup { @Override public int getSpeed() { return 1; - }; + } }.registerChargeableBlock(true, 256); - new AGenerator(Categories.ELECTRICITY, SlimefunItems.LAVA_GENERATOR, "LAVA_GENERATOR", RecipeType.ENHANCED_CRAFTING_TABLE, + new LavaGenerator(Categories.ELECTRICITY, SlimefunItems.LAVA_GENERATOR, "LAVA_GENERATOR", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, SlimefunItems.GOLD_16K, null, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.HEATING_COIL}) { - - @Override - public void registerDefaultRecipes() { - registerFuel(new MachineFuel(40, new ItemStack(Material.LAVA_BUCKET))); - } - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - - @Override - public String getInventoryTitle() { - return "&4Lava Generator"; - } - + @Override public int getEnergyProduction() { return 10; @@ -4505,25 +2949,19 @@ public class SlimefunSetup { }.registerUnrechargeableBlock(true, 512); - new AGenerator(Categories.ELECTRICITY, SlimefunItems.COMBUSTION_REACTOR, "COMBUSTION_REACTOR", RecipeType.ENHANCED_CRAFTING_TABLE, + new LavaGenerator(Categories.ELECTRICITY, SlimefunItems.LAVA_GENERATOR_2, "LAVA_GENERATOR_2", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {SlimefunItems.CORINTHIAN_BRONZE_INGOT, SlimefunItems.CORINTHIAN_BRONZE_INGOT, SlimefunItems.CORINTHIAN_BRONZE_INGOT, SlimefunItems.COMPRESSED_CARBON, SlimefunItems.LAVA_GENERATOR, SlimefunItems.COMPRESSED_CARBON, SlimefunItems.HEATING_COIL, SlimefunItems.COMPRESSED_CARBON, SlimefunItems.HEATING_COIL}) { + + @Override + public int getEnergyProduction() { + return 20; + } + + }.registerUnrechargeableBlock(true, 1024); + + new CombustionGenerator(Categories.ELECTRICITY, SlimefunItems.COMBUSTION_REACTOR, "COMBUSTION_REACTOR", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, SlimefunItems.STEEL_INGOT, null, SlimefunItems.STEEL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.STEEL_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.STEEL_INGOT, SlimefunItems.HEATING_COIL}) { - - @Override - public void registerDefaultRecipes() { - registerFuel(new MachineFuel(30, SlimefunItems.BUCKET_OF_OIL)); - registerFuel(new MachineFuel(90, SlimefunItems.BUCKET_OF_FUEL)); - } - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.FLINT_AND_STEEL); - } - - @Override - public String getInventoryTitle() { - return "&cCombustion Reactor"; - } - + @Override public int getEnergyProduction() { return 12; @@ -4537,10 +2975,9 @@ public class SlimefunSetup { new Teleporter(Categories.GPS, SlimefunItems.GPS_TELEPORTATION_MATRIX, "GPS_TELEPORTATION_MATRIX", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.GPS_TELEPORTER_PYLON, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.GPS_TELEPORTER_PYLON, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.GPS_CONTROL_PANEL, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.GPS_TELEPORTER_PYLON, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.GPS_TELEPORTER_PYLON}) { - - + @Override - public void onInteract(final Player p, final Block b) throws Exception { + public void onInteract(final Player p, final Block b) { GPSNetwork.openTeleporterGUI(p, UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), b, Slimefun.getGPSNetwork().getNetworkComplexity(UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")))); } @@ -4568,91 +3005,9 @@ public class SlimefunSetup { } }); - new SlimefunItem(Categories.TECH, SlimefunItems.HOLOGRAM_PROJECTOR, "HOLOGRAM_PROJECTOR", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {null, SlimefunItems.POWER_CRYSTAL, null, SlimefunItems.ALUMINUM_BRASS_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.ALUMINUM_BRASS_INGOT, null, SlimefunItems.ALUMINUM_BRASS_INGOT, null}, new CustomItem(SlimefunItems.HOLOGRAM_PROJECTOR, 3)) - .register(true, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack stack) { - if (e.getClickedBlock() == null) return false; - SlimefunItem item = BlockStorage.check(e.getClickedBlock()); - if (item == null || !item.getID().equals("HOLOGRAM_PROJECTOR")) return false; - e.setCancelled(true); - - if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "owner").equals(p.getUniqueId().toString())) { - Projector.openEditor(p, e.getClickedBlock()); - } - - return true; - } - }); - - SlimefunItem.registerBlockHandler("HOLOGRAM_PROJECTOR", new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - BlockStorage.addBlockInfo(b, "text", "&bHi, I am a Hologram, &3configure me using the Projector"); - BlockStorage.addBlockInfo(b, "offset", "-0.5"); - BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString()); - - Projector.getArmorStand(b); - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - Projector.getArmorStand(b).remove(); - return true; - } - }); - - new SlimefunItem(Categories.MAGIC, SlimefunItems.INFUSED_HOPPER, "INFUSED_HOPPER", RecipeType.ANCIENT_ALTAR, + new InfusedHopper(Categories.MAGIC, SlimefunItems.INFUSED_HOPPER, "INFUSED_HOPPER", RecipeType.ANCIENT_ALTAR, new ItemStack[] {new ItemStack(Material.OBSIDIAN), SlimefunItems.RUNE_EARTH, new ItemStack(Material.HOPPER), SlimefunItems.RUNE_ENDER, SlimefunItems.INFUSED_MAGNET, SlimefunItems.RUNE_ENDER, new ItemStack(Material.HOPPER), SlimefunItems.RUNE_EARTH, new ItemStack(Material.OBSIDIAN)}) - .register(true, new BlockTicker() { - - @Override - public void uniqueTick() { - } - - @Override - public void tick(Block b, SlimefunItem item, Config data) { - if (b.getType() != Material.HOPPER) { - // we're no longer a hopper, we were probably destroyed. skipping this tick. - return; - } - ArmorStand hologram = InfusedHopper.getArmorStand(b, true); - boolean sound = false; - for (Entity n: hologram.getNearbyEntities(3.5D, 3.5D, 3.5D)) { - if (n instanceof Item && !n.hasMetadata("no_pickup") && n.getLocation().distance(hologram.getLocation()) > 0.4D) { - n.setVelocity(new Vector(0, 0.1, 0)); - n.teleport(hologram); - sound = true; - } - } - if (sound) b.getWorld().playSound(b.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 5F, 2F); - } - - @Override - public boolean isSynchronized() { - return true; - } - }); - - SlimefunItem.registerBlockHandler("INFUSED_HOPPER", new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - InfusedHopper.getArmorStand(b, true); - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - final ArmorStand hologram = InfusedHopper.getArmorStand(b, false); - if (hologram != null) { - hologram.remove(); - } - return true; - } - }); + .register(true); new SlimefunItem(Categories.RESOURCES, SlimefunItems.BLISTERING_INGOT, "BLISTERING_INGOT", RecipeType.HEATED_PRESSURE_CHAMBER, new ItemStack[] {SlimefunItems.GOLD_24K, SlimefunItems.URANIUM, null, null, null, null, null, null, null}) @@ -4670,50 +3025,14 @@ public class SlimefunSetup { new ItemStack[]{SlimefunItems.NETHER_ICE, SlimefunItems.PLUTONIUM, null, null, null, null, null, null, null}) .register(true); - new SlimefunItem(Categories.GPS, SlimefunItems.ELEVATOR, "ELEVATOR_PLATE", RecipeType.ENHANCED_CRAFTING_TABLE, + new ElevatorPlate(Categories.GPS, SlimefunItems.ELEVATOR, "ELEVATOR_PLATE", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, new ItemStack(Material.STONE_PRESSURE_PLATE), null, new ItemStack(Material.PISTON), SlimefunItems.ELECTRIC_MOTOR, new ItemStack(Material.PISTON), SlimefunItems.ALUMINUM_BRONZE_INGOT, SlimefunItems.ALUMINUM_BRONZE_INGOT, SlimefunItems.ALUMINUM_BRONZE_INGOT}, new CustomItem(SlimefunItems.ELEVATOR, 2)) - .register(true, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(final ItemUseEvent e, Player p, ItemStack stack) { - if (e.getClickedBlock() == null) return false; - SlimefunItem item = BlockStorage.check(e.getClickedBlock()); - if (item == null) return false; - if (!item.getID().equals("ELEVATOR_PLATE")) return false; - - if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "owner").equals(p.getUniqueId().toString())) Elevator.openEditor(p, e.getClickedBlock()); - return true; - } - }); - - SlimefunItem.registerBlockHandler("ELEVATOR_PLATE", new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - BlockStorage.addBlockInfo(b, "floor", "&rFloor #0"); - BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString()); - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - return true; - } - }); + .register(true); new FoodFabricator(Categories.ELECTRICITY, SlimefunItems.FOOD_FABRICATOR, "FOOD_FABRICATOR", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.BILLON_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.BILLON_INGOT, SlimefunItems.CAN, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.CAN, null, SlimefunItems.ELECTRIC_MOTOR, null}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.GOLDEN_HOE); - } - - @Override - public String getInventoryTitle() { - return "&cFood Fabricator"; - } - @Override public int getEnergyConsumption() { return 7; @@ -4722,23 +3041,13 @@ public class SlimefunSetup { @Override public int getSpeed() { return 1; - }; + } }.registerChargeableBlock(true, 256); new FoodFabricator(Categories.ELECTRICITY, SlimefunItems.FOOD_FABRICATOR_2, "FOOD_FABRICATOR_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.FOOD_FABRICATOR, SlimefunItems.ELECTRIC_MOTOR, null, SlimefunItems.ELECTRO_MAGNET, null}) { - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.DIAMOND_HOE); - } - - @Override - public String getInventoryTitle() { - return "&cFood Fabricator"; - } - + @Override public int getEnergyConsumption() { return 24; @@ -4747,7 +3056,7 @@ public class SlimefunSetup { @Override public int getSpeed() { return 6; - }; + } }.registerChargeableBlock(true, 512); @@ -4793,17 +3102,7 @@ public class SlimefunSetup { new FoodComposter(Categories.ELECTRICITY, SlimefunItems.FOOD_COMPOSTER, "FOOD_COMPOSTER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.FOOD_FABRICATOR, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.CAN, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.CAN, null, SlimefunItems.ELECTRIC_MOTOR, null}) { - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.GOLDEN_HOE); - } - - @Override - public String getInventoryTitle() { - return "&cFood Composter"; - } - + @Override public int getEnergyConsumption() { return 8; @@ -4819,16 +3118,6 @@ public class SlimefunSetup { new FoodComposter(Categories.ELECTRICITY, SlimefunItems.FOOD_COMPOSTER_2, "FOOD_COMPOSTER_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.FOOD_COMPOSTER, SlimefunItems.ELECTRIC_MOTOR, null, SlimefunItems.ELECTRO_MAGNET, null}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.DIAMOND_HOE); - } - - @Override - public String getInventoryTitle() { - return "&cFood Composter"; - } - @Override public int getEnergyConsumption() { return 26; @@ -4870,8 +3159,7 @@ public class SlimefunSetup { .register(true); new CropGrowthAccelerator(Categories.ELECTRICITY, SlimefunItems.CROP_GROWTH_ACCELERATOR, "CROP_GROWTH_ACCELERATOR", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {null, SlimefunItems.BLISTERING_INGOT_3, null, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.PROGRAMMABLE_ANDROID_FARMER, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.ANIMAL_GROWTH_ACCELERATOR, SlimefunItems.ELECTRO_MAGNET}) - { + new ItemStack[] {null, SlimefunItems.BLISTERING_INGOT_3, null, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.PROGRAMMABLE_ANDROID_FARMER, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.ANIMAL_GROWTH_ACCELERATOR, SlimefunItems.ELECTRO_MAGNET}) { @Override public int getEnergyConsumption() { @@ -4891,8 +3179,7 @@ public class SlimefunSetup { }.registerChargeableBlock(true, 1024); new CropGrowthAccelerator(Categories.ELECTRICITY, SlimefunItems.CROP_GROWTH_ACCELERATOR_2, "CROP_GROWTH_ACCELERATOR_2", RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {null, SlimefunItems.BLISTERING_INGOT_3, null, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.CROP_GROWTH_ACCELERATOR, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.ADVANCED_CIRCUIT_BOARD, SlimefunItems.ELECTRO_MAGNET}) - { + new ItemStack[] {null, SlimefunItems.BLISTERING_INGOT_3, null, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.CROP_GROWTH_ACCELERATOR, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.ADVANCED_CIRCUIT_BOARD, SlimefunItems.ELECTRO_MAGNET}) { @Override public int getEnergyConsumption() { @@ -4913,17 +3200,7 @@ public class SlimefunSetup { new Freezer(Categories.ELECTRICITY, SlimefunItems.FREEZER, "FREEZER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, SlimefunItems.SILVER_INGOT, null, SlimefunItems.ELECTRIC_MOTOR, new ItemStack(Material.PACKED_ICE), SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.COOLING_UNIT, SlimefunItems.MEDIUM_CAPACITOR, SlimefunItems.COOLING_UNIT}) { - - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.GOLDEN_PICKAXE); - } - - @Override - public String getInventoryTitle() { - return "&bFreezer"; - } - + @Override public int getEnergyConsumption() { return 9; @@ -4939,16 +3216,6 @@ public class SlimefunSetup { new Freezer(Categories.ELECTRICITY, SlimefunItems.FREEZER_2, "FREEZER_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, SlimefunItems.SILVER_INGOT, null, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.FREEZER, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.COOLING_UNIT, SlimefunItems.ALUMINUM_BRASS_INGOT, SlimefunItems.COOLING_UNIT}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.DIAMOND_PICKAXE); - } - - @Override - public String getInventoryTitle() { - return "&bFreezer"; - } - @Override public int getEnergyConsumption() { return 15; @@ -4962,7 +3229,7 @@ public class SlimefunSetup { }.registerChargeableBlock(true, 256); new SlimefunItem(Categories.TECH_MISC, SlimefunItems.REACTOR_COOLANT_CELL, "REACTOR_COOLANT_CELL", new RecipeType(SlimefunItems.FREEZER), - new ItemStack[] {new ItemStack(Material.PACKED_ICE), null, null, null, null, null, null, null, null}) + new ItemStack[] {new ItemStack(Material.BLUE_ICE), null, null, null, null, null, null, null, null}) .register(true); new SlimefunItem(Categories.TECH_MISC, SlimefunItems.NETHER_ICE_COOLANT_CELL, "NETHER_ICE_COOLANT_CELL", new RecipeType(SlimefunItems.HEATED_PRESSURE_CHAMBER), @@ -5007,16 +3274,12 @@ public class SlimefunSetup { return 250; } - @Override - public void extraTick(Location l) { - - } - @Override public ItemStack getProgressBar() { try { return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTNhZDhlZTg0OWVkZjA0ZWQ5YTI2Y2EzMzQxZjYwMzNiZDc2ZGNjNDIzMWVkMWVhNjNiNzU2NTc1MWIyN2FjIn19fQ=="); } catch (Exception e) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Progressbar of a Reactor for Slimefun " + Slimefun.getVersion()); return new ItemStack(Material.BLAZE_POWDER); } } @@ -5025,6 +3288,12 @@ public class SlimefunSetup { public ItemStack getCoolant() { return SlimefunItems.REACTOR_COOLANT_CELL; } + + @Override + public void extraTick(Location l) { + // This machine does not need to perform anything while ticking + // The Nether Star Reactor uses this method to generate the Wither Effect + } } .registerChargeableBlock(true, 16384); @@ -5048,8 +3317,8 @@ public class SlimefunSetup { @Override public void extraTick(final Location l) { - Bukkit.getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - for (Entity entity : ReactorHologram.getArmorStand(l).getNearbyEntities(5, 5, 5)) { + Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> { + for (Entity entity : ReactorHologram.getArmorStand(l, true).getNearbyEntities(5, 5, 5)) { if (entity instanceof LivingEntity) { ((LivingEntity) entity).addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 60, 1)); } @@ -5073,56 +3342,9 @@ public class SlimefunSetup { new ItemStack[] {SlimefunItems.HARDENED_GLASS, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.HARDENED_GLASS, SlimefunItems.SILVER_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.SILVER_INGOT, SlimefunItems.HARDENED_GLASS, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.HARDENED_GLASS}, new CustomItem(SlimefunItems.CARGO_MOTOR, 4)) .register(true); - new SlimefunItem(Categories.CARGO, SlimefunItems.CARGO_MANAGER, "CARGO_MANAGER", RecipeType.ENHANCED_CRAFTING_TABLE, + new CargoManagerBlock(Categories.CARGO, SlimefunItems.CARGO_MANAGER, "CARGO_MANAGER", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {null, SlimefunItems.HOLOGRAM_PROJECTOR, null, SlimefunItems.REINFORCED_PLATE, SlimefunItems.CARGO_MOTOR, SlimefunItems.REINFORCED_PLATE, SlimefunItems.ALUMINUM_BRONZE_INGOT, SlimefunItems.ANDROID_MEMORY_CORE, SlimefunItems.ALUMINUM_BRONZE_INGOT}) - .register(true, new BlockTicker() { - - @Override - public void uniqueTick() { - } - - @Override - public void tick(Block b, SlimefunItem item, Config data) { - CargoNet.getNetworkFromLocationOrCreate(b.getLocation()).tick(b); - } - - @Override - public boolean isSynchronized() { - return false; - } - }, new ItemInteractionHandler() { - - @Override - public boolean onRightClick(ItemUseEvent e, Player p, ItemStack stack) { - if (e.getClickedBlock() == null) return false; - SlimefunItem item = BlockStorage.check(e.getClickedBlock()); - if (item == null || !item.getID().equals("CARGO_MANAGER")) return false; - e.setCancelled(true); - - if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "visualizer") == null) { - BlockStorage.addBlockInfo(e.getClickedBlock(), "visualizer", "disabled"); - p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&4\u2718")); - } - else { - BlockStorage.addBlockInfo(e.getClickedBlock(), "visualizer", null); - p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&2\u2714")); - } - return true; - } - }); - - SlimefunItem.registerBlockHandler("CARGO_MANAGER", new SlimefunBlockHandler() { - - @Override - public void onPlace(Player p, Block b, SlimefunItem item) { - } - - @Override - public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - CargoHologram.remove(b); - return true; - } - }); + .register(true); new SlimefunItem(Categories.CARGO, SlimefunItems.CARGO_NODE, "CARGO_NODE", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.BRONZE_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.BRONZE_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.CARGO_MOTOR, SlimefunItems.SILVER_INGOT, SlimefunItems.BRONZE_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.BRONZE_INGOT}, new CustomItem(SlimefunItems.CARGO_NODE, 4)) @@ -5131,9 +3353,8 @@ public class SlimefunSetup { @Override public boolean onRightClick(final ItemUseEvent e, Player p, ItemStack stack) { if (e.getClickedBlock() == null) return false; - SlimefunItem item = BlockStorage.check(e.getClickedBlock()); - if (item == null) return false; - if (!item.getID().equals("CARGO_NODE")) return false; + String id = BlockStorage.checkID(e.getClickedBlock()); + if (id == null || !id.equals("CARGO_NODE")) return false; if (CargoNet.getNetworkFromLocation(e.getClickedBlock().getLocation()) != null) { p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7Connected: " + "&2\u2714")); @@ -5164,6 +3385,7 @@ public class SlimefunSetup { public int getEnergyConsumption() { return 10; } + }.registerChargeableBlock(true, 256); new ReactorAccessPort(Categories.ELECTRICITY, SlimefunItems.REACTOR_ACCESS_PORT, "REACTOR_ACCESS_PORT", RecipeType.ENHANCED_CRAFTING_TABLE, @@ -5182,16 +3404,6 @@ public class SlimefunSetup { new CarbonPress(Categories.ELECTRICITY, SlimefunItems.CARBON_PRESS, "CARBON_PRESS", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.CARBON, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.CARBON, SlimefunItems.CARBON, SlimefunItems.HEATED_PRESSURE_CHAMBER, SlimefunItems.CARBON, SlimefunItems.HEATING_COIL, SlimefunItems.CARBONADO, SlimefunItems.HEATING_COIL}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.DIAMOND_PICKAXE); - } - - @Override - public String getInventoryTitle() { - return "&cCarbon Press"; - } - @Override public int getEnergyConsumption() { return 10; @@ -5207,16 +3419,6 @@ public class SlimefunSetup { new CarbonPress(Categories.ELECTRICITY, SlimefunItems.CARBON_PRESS_2, "CARBON_PRESS_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.CARBONADO, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.CARBONADO, SlimefunItems.CARBON, SlimefunItems.CARBON_PRESS, SlimefunItems.CARBON, SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.HEATING_COIL}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.DIAMOND_PICKAXE); - } - - @Override - public String getInventoryTitle() { - return "&cCarbon Press"; - } - @Override public int getEnergyConsumption() { return 25; @@ -5232,16 +3434,6 @@ public class SlimefunSetup { new CarbonPress(Categories.ELECTRICITY, SlimefunItems.CARBON_PRESS_3, "CARBON_PRESS_3", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.CARBONADO, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.CARBONADO, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.CARBON_PRESS_2, SlimefunItems.REINFORCED_ALLOY_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRO_MAGNET, SlimefunItems.HEATING_COIL}) { - @Override - public ItemStack getProgressBar() { - return new ItemStack(Material.DIAMOND_PICKAXE); - } - - @Override - public String getInventoryTitle() { - return "&cCarbon Press"; - } - @Override public int getEnergyConsumption() { return 90; @@ -5257,10 +3449,6 @@ public class SlimefunSetup { new ElectricSmeltery(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_SMELTERY, "ELECTRIC_SMELTERY", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {new ItemStack(Material.NETHER_BRICKS), SlimefunItems.ELECTRIC_MOTOR, new ItemStack(Material.NETHER_BRICKS), SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRIC_INGOT_FACTORY, SlimefunItems.HEATING_COIL, SlimefunItems.GILDED_IRON, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.GILDED_IRON}) { - @Override - public void registerDefaultRecipes() { - } - @Override public int getEnergyConsumption() { return 10; @@ -5275,11 +3463,7 @@ public class SlimefunSetup { new ElectricSmeltery(Categories.ELECTRICITY, SlimefunItems.ELECTRIC_SMELTERY_2, "ELECTRIC_SMELTERY_2", RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.HEATING_COIL, SlimefunItems.ELECTRIC_SMELTERY, SlimefunItems.HEATING_COIL, SlimefunItems.GILDED_IRON, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.GILDED_IRON}) { - - @Override - public void registerDefaultRecipes() { - } - + @Override public int getEnergyConsumption() { return 20; @@ -5299,7 +3483,7 @@ public class SlimefunSetup { } public static void registerPostHandler(PostSlimefunLoadingHandler handler) { - MiscSetup.post_handlers.add(handler); + SlimefunPlugin.getUtilities().postHandlers.add(handler); } } diff --git a/src/me/mrCookieSlime/Slimefun/Setup/WikiSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/WikiSetup.java index a9ac22381..cd1750ce2 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/WikiSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/WikiSetup.java @@ -7,8 +7,10 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; * * @since 4.1.2 */ -public class WikiSetup { +public final class WikiSetup { + private WikiSetup() {} + /** * Setups the official Wiki links. */ diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java b/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java index 479d46b5d..7c17a612d 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java @@ -2,12 +2,11 @@ package me.mrCookieSlime.Slimefun; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.logging.Level; import java.util.stream.Collectors; import org.bukkit.Bukkit; @@ -34,50 +33,37 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.Slimefun.Lists.RecipeType; -import me.mrCookieSlime.Slimefun.Misc.BookDesign; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.LockedCategory; import me.mrCookieSlime.Slimefun.Objects.Research; -import me.mrCookieSlime.Slimefun.Objects.SeasonCategory; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget; +import me.mrCookieSlime.Slimefun.Objects.SeasonalCategory; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.GuideHandler; import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.api.SlimefunGuideLayout; import me.mrCookieSlime.Slimefun.hooks.github.Contributor; import me.mrCookieSlime.Slimefun.hooks.github.IntegerFormat; -public class SlimefunGuide { +public final class SlimefunGuide { - public static Map> history = new HashMap<>(); - public static int month = 0; + private SlimefunGuide() {} - public static List contributors = new ArrayList<>(); - public static int issues = 0; - public static int forks = 0; - /** - * Represents the number of stars on the Slimefun4 GitHub repository. - * @since 4.1.13 - */ - public static int stars = 0; - public static int code_bytes = 0; - public static Date last_update = new Date(); - - protected static boolean all_recipes = true; private static final int category_size = 36; @Deprecated public static ItemStack getItem() { - return getItem(BookDesign.CHEST); + return getItem(SlimefunGuideLayout.CHEST); } - public static ItemStack getItem(BookDesign design) { + public static ItemStack getItem(SlimefunGuideLayout design) { switch (design) { case BOOK: return new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&aSlimefun Guide &7(Book GUI)", "", "&eRight Click &8\u21E8 &7Browse Items", "&eShift + Right Click &8\u21E8 &7Open Settings / Credits"); @@ -92,9 +78,10 @@ public class SlimefunGuide { @Deprecated public static ItemStack getItem(boolean book) { - return getItem(book ? BookDesign.BOOK: BookDesign.CHEST); + return getItem(book ? SlimefunGuideLayout.BOOK: SlimefunGuideLayout.CHEST); } + @Deprecated public static ItemStack getDeprecatedItem(boolean book) { return new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&eSlimefun Guide &7(Right Click)", (book ? "": "&2"), "&rThis is your basic Guide for Slimefun", "&rYou can see all Items added by this Plugin", "&ror its Addons including their Recipes", "&ra bit of information and more"); } @@ -117,11 +104,11 @@ public class SlimefunGuide { } - if (SlimefunManager.isItemSimiliar(guide, getItem(BookDesign.CHEST), true)) { + if (SlimefunManager.isItemSimiliar(guide, getItem(SlimefunGuideLayout.CHEST), true)) { if (p.hasPermission("slimefun.cheat.items")) { menu.addItem(19, new CustomItem(new ItemStack(Material.CHEST), "&7Guide Layout: &eChest GUI", "", "&aChest GUI", "&7Book GUI", "&7Cheat Sheet", "", "&e Click &8\u21E8 &7Change Layout")); menu.addMenuClickHandler(19, (pl, slot, item, action) -> { - pl.getInventory().setItemInMainHand(getItem(BookDesign.BOOK)); + pl.getInventory().setItemInMainHand(getItem(SlimefunGuideLayout.BOOK)); openSettings(pl, pl.getInventory().getItemInMainHand()); return false; }); @@ -129,17 +116,17 @@ public class SlimefunGuide { else { menu.addItem(19, new CustomItem(new ItemStack(Material.CHEST), "&7Guide Layout: &eChest GUI", "", "&aChest GUI", "&7Book GUI", "", "&e Click &8\u21E8 &7Change Layout")); menu.addMenuClickHandler(19, (pl, slot, item, action) -> { - pl.getInventory().setItemInMainHand(getItem(BookDesign.BOOK)); + pl.getInventory().setItemInMainHand(getItem(SlimefunGuideLayout.BOOK)); openSettings(pl, pl.getInventory().getItemInMainHand()); return false; }); } } - else if (SlimefunManager.isItemSimiliar(guide, getItem(BookDesign.BOOK), true)) { + else if (SlimefunManager.isItemSimiliar(guide, getItem(SlimefunGuideLayout.BOOK), true)) { if (p.hasPermission("slimefun.cheat.items")) { menu.addItem(19, new CustomItem(new ItemStack(Material.CHEST), "&7Guide Layout: &eBook GUI", "", "&7Chest GUI", "&aBook GUI", "&7Cheat Sheet", "", "&e Click &8\u21E8 &7Change Layout")); menu.addMenuClickHandler(19, (pl, slot, item, action) -> { - pl.getInventory().setItemInMainHand(getItem(BookDesign.CHEAT_SHEET)); + pl.getInventory().setItemInMainHand(getItem(SlimefunGuideLayout.CHEAT_SHEET)); openSettings(pl, pl.getInventory().getItemInMainHand()); return false; }); @@ -147,29 +134,29 @@ public class SlimefunGuide { else { menu.addItem(19, new CustomItem(new ItemStack(Material.CHEST), "&7Guide Layout: &eBook GUI", "", "&7Chest GUI", "&aBook GUI", "", "&e Click &8\u21E8 &7Change Layout")); menu.addMenuClickHandler(19, (pl, slot, item, action) -> { - pl.getInventory().setItemInMainHand(getItem(BookDesign.CHEST)); + pl.getInventory().setItemInMainHand(getItem(SlimefunGuideLayout.CHEST)); openSettings(pl, pl.getInventory().getItemInMainHand()); return false; }); } } - else if (SlimefunManager.isItemSimiliar(guide, getItem(BookDesign.CHEAT_SHEET), true)) { + else if (SlimefunManager.isItemSimiliar(guide, getItem(SlimefunGuideLayout.CHEAT_SHEET), true)) { menu.addItem(19, new CustomItem(new ItemStack(Material.CHEST), "&7Guide Layout: &eCheat Sheet", "", "&7Chest GUI", "&7Book GUI", "&aCheat Sheet", "", "&e Click &8\u21E8 &7Change Layout")); menu.addMenuClickHandler(19, (pl, slot, item, action) -> { - pl.getInventory().setItemInMainHand(getItem(BookDesign.CHEST)); + pl.getInventory().setItemInMainHand(getItem(SlimefunGuideLayout.CHEST)); openSettings(pl, pl.getInventory().getItemInMainHand()); return false; }); } - menu.addItem(1, new CustomItem(new ItemStack(Material.WRITABLE_BOOK), "&aCredits", "", "&7Version: &a" + SlimefunStartup.instance.getDescription().getVersion(), "&7Contributors: &e" + contributors.size(), "", "&7\u21E8 Click to see the people behind this Plugin")); + menu.addItem(1, new CustomItem(new ItemStack(Material.WRITABLE_BOOK), "&aCredits", "", "&7Version: &a" + SlimefunPlugin.instance.getDescription().getVersion(), "&7Contributors: &e" + SlimefunPlugin.getUtilities().contributors.size(), "", "&7\u21E8 Click to see the people behind this Plugin")); menu.addMenuClickHandler(1, (pl, slot, item, action) -> { openCredits(pl, guide); return false; }); try { - menu.addItem(4, new CustomItem(new ItemStack(Material.COMPARATOR), "&eSource Code", "", "&7Bytes of Code: &6" + IntegerFormat.formatBigNumber(code_bytes), "&7Last Update: &a" + IntegerFormat.timeDelta(last_update) + " ago", "&7Forks: &e" + forks, "&7Stars: &e" + stars, "", "&7&oSlimefun 4 is a community project,", "&7&othe source code is available on GitHub", "&7&oand if you want to keep this Plugin alive,", "&7&othen please consider contributing to it", "", "&7\u21E8 Click to go to GitHub")); + menu.addItem(4, new CustomItem(new ItemStack(Material.COMPARATOR), "&eSource Code", "", "&7Bytes of Code: &6" + IntegerFormat.formatBigNumber(SlimefunPlugin.getUtilities().codeBytes), "&7Last Update: &a" + IntegerFormat.timeDelta(SlimefunPlugin.getUtilities().lastUpdate) + " ago", "&7Forks: &e" + SlimefunPlugin.getUtilities().forks, "&7Stars: &e" + SlimefunPlugin.getUtilities().stars, "", "&7&oSlimefun 4 is a community project,", "&7&othe source code is available on GitHub", "&7&oand if you want to keep this Plugin alive,", "&7&othen please consider contributing to it", "", "&7\u21E8 Click to go to GitHub")); menu.addMenuClickHandler(4, (pl, slot, item, action) -> { pl.closeInventory(); pl.sendMessage(""); @@ -177,11 +164,11 @@ public class SlimefunGuide { pl.sendMessage(""); return false; }); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Info-Panel for Slimefun " + Slimefun.getVersion(), x); } - menu.addItem(7, new CustomItem(new ItemStack(Material.REDSTONE), "&4Bug Tracker", "", "&7Unsolved Issues: &a" + issues, "", "&7\u21E8 Click to go to the Slimefun Bug Tracker")); + menu.addItem(7, new CustomItem(new ItemStack(Material.REDSTONE), "&4Bug Tracker", "", "&7Unsolved Issues: &a" + SlimefunPlugin.getUtilities().issues, "", "&7\u21E8 Click to go to the Slimefun Bug Tracker")); menu.addMenuClickHandler(7, (pl, slot, item, action) -> { pl.closeInventory(); pl.sendMessage(""); @@ -220,18 +207,18 @@ public class SlimefunGuide { int index = 9; double total = 0; - for (Contributor contributor : contributors) { + for (Contributor contributor : SlimefunPlugin.getUtilities().contributors) { total += contributor.getCommits(); } - for (final Contributor contributor: contributors) { + for (final Contributor contributor: SlimefunPlugin.getUtilities().contributors) { ItemStack skull = new ItemStack(Material.PLAYER_HEAD); try { String texture = contributor.getTexture(); if (texture != null) skull = CustomSkull.getItem(texture); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while fetching a Contributor Head for Slimefun " + Slimefun.getVersion(), x); } SkullMeta meta = (SkullMeta) skull.getItemMeta(); @@ -270,9 +257,9 @@ public class SlimefunGuide { } public static void openGuide(Player p, boolean book) { - if (!SlimefunStartup.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled")) return; - if (!SlimefunStartup.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE")) return; - if (!history.containsKey(p.getUniqueId())) openMainMenu(p, true, book, 1); + if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled")) return; + if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE")) return; + if (!getHistory().containsKey(p.getUniqueId())) openMainMenu(p, true, book, 1); else { Object last = getLastEntry(p, false); if (last instanceof Category) openCategory(p, (Category) last, true, 1, book); @@ -281,16 +268,16 @@ public class SlimefunGuide { else displayItem(p, (ItemStack) last, false, book, 0); } } - + public static void openMainMenu(final Player p, final boolean survival, final boolean book, final int selected_page) { if (survival) clearHistory(p.getUniqueId()); if (book) { - List pages = new ArrayList(); - List texts = new ArrayList(); - List tooltips = new ArrayList(); - List actions = new ArrayList(); + List pages = new ArrayList<>(); + List texts = new ArrayList<>(); + List tooltips = new ArrayList<>(); + List actions = new ArrayList<>(); int tier = 0; @@ -346,16 +333,14 @@ public class SlimefunGuide { tooltips.add(parents.toString()); actions.add(null); } - else if (category instanceof SeasonCategory) { - if (((SeasonCategory) category).isUnlocked()) { + else if (category instanceof SeasonalCategory) { + if (((SeasonalCategory) category).isUnlocked()) { texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&a", StringUtils.formatItemName(category.getItem(), false)))); tooltips.add(ChatColor.translateAlternateColorCodes('&', "&eClick to open the following Category:\n" + StringUtils.formatItemName(category.getItem(), false))); actions.add(new PlayerRunnable(1) { @Override public void run(final Player p) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - openCategory(p, category, survival, 1, book); - }, 1L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> openCategory(p, category, survival, 1, book), 1L); } }); } @@ -366,9 +351,7 @@ public class SlimefunGuide { actions.add(new PlayerRunnable(1) { @Override public void run(final Player p) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - openCategory(p, category, survival, 1, book); - }, 1L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> openCategory(p, category, survival, 1, book), 1L); } }); } @@ -421,8 +404,8 @@ public class SlimefunGuide { pl -> pl.playSound(pl.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 0.7F) ); - List categories = Slimefun.current_categories; - List handlers = Slimefun.guide_handlers.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList()); + List categories = SlimefunPlugin.getUtilities().enabledCategories; + List handlers = SlimefunPlugin.getUtilities().guideHandlers.values().stream().flatMap(List::stream).collect(Collectors.toList()); int index = 9; int pages = 1; @@ -471,7 +454,7 @@ public class SlimefunGuide { // Dont display that Category... } else if (!(category instanceof LockedCategory)) { - if (!(category instanceof SeasonCategory)) { + if (!(category instanceof SeasonalCategory)) { menu.addItem(index, category.getItem()); menu.addMenuClickHandler(index, (pl, slot, item, action) -> { openCategory(pl, category, survival, 1, book); @@ -480,7 +463,7 @@ public class SlimefunGuide { index++; } else { - if (((SeasonCategory) category).isUnlocked()) { + if (((SeasonalCategory) category).isUnlocked()) { menu.addItem(index, category.getItem()); menu.addMenuClickHandler(index, (pl, slot, item, action) -> { openCategory(pl, category, survival, 1, book); @@ -499,7 +482,7 @@ public class SlimefunGuide { index++; } else { - List parents = new ArrayList(); + List parents = new ArrayList<>(); parents.add(""); parents.add(ChatColor.translateAlternateColorCodes('&', "&rYou need to unlock all Items")); parents.add(ChatColor.translateAlternateColorCodes('&', "&rfrom the following Categories first:")); @@ -547,10 +530,10 @@ public class SlimefunGuide { if (category == null) return; if (book && category.getItems().size() < 250) { - List pages = new ArrayList(); - List texts = new ArrayList(); - List tooltips = new ArrayList(); - List actions = new ArrayList(); + List pages = new ArrayList<>(); + List texts = new ArrayList<>(); + List tooltips = new ArrayList<>(); + List actions = new ArrayList<>(); for (final SlimefunItem item: category.getItems()) { if (Slimefun.hasPermission(p, item, false)) { @@ -572,23 +555,19 @@ public class SlimefunGuide { openCategory(p, category, true, selected_page, book); } else { - if (!(p.getGameMode() == GameMode.CREATIVE && Research.creative_research)) { + if (!(p.getGameMode() == GameMode.CREATIVE && SlimefunPlugin.getSettings().researchesFreeInCreative)) { p.setLevel(p.getLevel() - research.getCost()); } if (p.getGameMode() == GameMode.CREATIVE) { research.unlock(p, true); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - openCategory(p, category, survival, selected_page, book); - }, 1L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> openCategory(p, category, survival, selected_page, book), 1L); } else { research.unlock(p, false); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - openCategory(p, category, survival, selected_page, book); - }, 103L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> openCategory(p, category, survival, selected_page, book), 103L); } } } else Messages.local.sendTranslation(p, "messages.not-enough-xp", true); @@ -643,9 +622,7 @@ public class SlimefunGuide { page.addClickEvent(new PlayerRunnable(2) { @Override public void run(final Player p) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - openMainMenu(p, survival, true, 1); - }, 1L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> openMainMenu(p, survival, true, 1), 1L); } }); pages.add(page); @@ -657,17 +634,13 @@ public class SlimefunGuide { final ChestMenu menu = new ChestMenu("Slimefun Guide"); menu.setEmptySlotsClickable(false); - menu.addMenuOpeningHandler( - pl -> pl.playSound(pl.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 0.7F) - ); + menu.addMenuOpeningHandler(pl -> pl.playSound(pl.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 0.7F)); int index = 9; final int pages = (category.getItems().size() - 1) / category_size + 1; for (int i = 0; i < 4; i++) { menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " ")); - menu.addMenuClickHandler(i, - (pl, slot, item, action) -> false - ); + menu.addMenuClickHandler(i, (pl, slot, item, action) -> false); } menu.addItem(4, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back")); @@ -678,16 +651,12 @@ public class SlimefunGuide { for (int i = 5; i < 9; i++) { menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " ")); - menu.addMenuClickHandler(i, - (pl, slot, item, action) -> false - ); + menu.addMenuClickHandler(i, (pl, slot, item, action) -> false); } for (int i = 45; i < 54; i++) { menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " ")); - menu.addMenuClickHandler(i, - (pl, slot, item, action) -> false - ); + menu.addMenuClickHandler(i, (pl, slot, item, action) -> false); } menu.addItem(46, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&r\u21E6 Previous Page", "", "&7(" + selected_page + " / " + pages + ")")); @@ -706,9 +675,9 @@ public class SlimefunGuide { return false; }); - int category_index = category_size * (selected_page - 1); + int categoryIndex = category_size * (selected_page - 1); for (int i = 0; i < category_size; i++) { - int target = category_index + i; + int target = categoryIndex + i; if (target >= category.getItems().size()) break; final SlimefunItem sfitem = category.getItems().get(target); if (Slimefun.isEnabled(p, sfitem, false)) { @@ -725,29 +694,32 @@ public class SlimefunGuide { openCategory(p, category, true, selected_page, book); } else { - if (!(pl.getGameMode() == GameMode.CREATIVE && Research.creative_research)) { + if (!(pl.getGameMode() == GameMode.CREATIVE && SlimefunPlugin.getSettings().researchesFreeInCreative)) { pl.setLevel(pl.getLevel() - research.getCost()); } if (pl.getGameMode() == GameMode.CREATIVE) { - research.unlock(pl, Research.creative_research); + research.unlock(pl, SlimefunPlugin.getSettings().researchesFreeInCreative); openCategory(pl, category, survival, selected_page, book); } else { research.unlock(pl, false); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - openCategory(pl, category, survival, selected_page, book); - }, 103L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> openCategory(pl, category, survival, selected_page, book), 103L); } } - } else Messages.local.sendTranslation(pl, "messages.not-enough-xp", true); + } + else Messages.local.sendTranslation(pl, "messages.not-enough-xp", true); } return false; }); + index++; } else { - menu.addItem(index, new CustomItem(Material.BARRIER, StringUtils.formatItemName(sfitem.getItem(), false), new String[] {"", "&rYou do not have Permission", "&rto access this Item"})); + List list = Messages.local.getTranslation("tooltips.item-permission"); + String[] strings = list.toArray(new String[list.size()]); + CustomItem display = new CustomItem(Material.BARRIER, StringUtils.formatItemName(sfitem.getItem(), false), strings); + menu.addItem(index, display); menu.addMenuClickHandler(index, (pl, slot, item, action) -> false); index++; } @@ -774,22 +746,22 @@ public class SlimefunGuide { public static void addToHistory(Player p, Object obj) { List list = new ArrayList<>(); - if (history.containsKey(p.getUniqueId())) list = history.get(p.getUniqueId()); + if (getHistory().containsKey(p.getUniqueId())) list = getHistory().get(p.getUniqueId()); list.add(obj); - history.put(p.getUniqueId(), list); + getHistory().put(p.getUniqueId(), list); } private static Object getLastEntry(Player p, boolean remove) { List list = new ArrayList<>(); - if (history.containsKey(p.getUniqueId())) list = history.get(p.getUniqueId()); + if (getHistory().containsKey(p.getUniqueId())) list = getHistory().get(p.getUniqueId()); - if (remove && list.size() >= 1) { + if (remove && !list.isEmpty()) { Object obj = list.get(list.size() - 1); list.remove(obj); } - if (list.isEmpty()) history.remove(p.getUniqueId()); - else history.put(p.getUniqueId(), list); + if (list.isEmpty()) getHistory().remove(p.getUniqueId()); + else getHistory().put(p.getUniqueId(), list); return list.isEmpty() ? null: list.get(list.size() - 1); } @@ -799,9 +771,7 @@ public class SlimefunGuide { final SlimefunItem sfItem = SlimefunItem.getByItem(item); - if (sfItem == null) { - if (!all_recipes) return; - } + if (sfItem == null && !SlimefunPlugin.getSettings().guideShowVanillaRecipes) return; ItemStack[] recipe = new ItemStack[9]; ItemStack recipeType = null; @@ -864,7 +834,7 @@ public class SlimefunGuide { if (addToHistory) addToHistory(p, sfItem != null ? sfItem: item); - if (history.containsKey(p.getUniqueId()) && history.get(p.getUniqueId()).size() > 1) { + if (getHistory().containsKey(p.getUniqueId()) && getHistory().get(p.getUniqueId()).size() > 1) { menu.addItem(0, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back", "", "&rLeft Click: &7Go back to previous Page", "&rShift + left Click: &7Go back to Main Menu")); menu.addMenuClickHandler(0, (pl, slot, itemstack, action) -> { if (action.isShiftClicked()) openMainMenu(p, true, book, 1); @@ -905,18 +875,18 @@ public class SlimefunGuide { }); if (sfItem != null) { - if (Slimefun.getItemConfig().contains(sfItem.getID() + ".wiki")) { + if (sfItem.hasWiki()) { try { menu.addItem(8, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzY2OTJmOTljYzZkNzgyNDIzMDQxMTA1NTM1ODk0ODQyOThiMmU0YTAyMzNiNzY3NTNmODg4ZTIwN2VmNSJ9fX0="), "&rView this Item in our Wiki &7(Slimefun Wiki)", "", "&7\u21E8 Click to open")); menu.addMenuClickHandler(8, (pl, slot, itemstack, action) -> { pl.closeInventory(); pl.sendMessage(""); - pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7&o" + Slimefun.getItemConfig().getString(sfItem.getID() + ".wiki"))); + pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7&o" + sfItem.getWiki())); pl.sendMessage(""); return false; }); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while adding a Wiki Page for Slimefun " + Slimefun.getVersion(), x); } } @@ -930,8 +900,8 @@ public class SlimefunGuide { pl.sendMessage(""); return false; }); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while adding a Youtube Video for Slimefun " + Slimefun.getVersion(), x); } } } @@ -979,7 +949,7 @@ public class SlimefunGuide { }); if (sfItem != null) { - if ((sfItem instanceof SlimefunMachine && ((SlimefunMachine) sfItem).getDisplayRecipes().size() > 0) || (sfItem instanceof SlimefunGadget && ((SlimefunGadget) sfItem).getRecipes().size() > 0)) { + if (sfItem instanceof RecipeDisplayItem && !((RecipeDisplayItem) sfItem).getDisplayRecipes().isEmpty()) { for (int i = 27; i < 36; i++) { menu.addItem(i, new CustomItem(Material.LIME_STAINED_GLASS_PANE, SlimefunItem.getByItem(item) instanceof SlimefunMachine ? "&7\u21E9 Recipes made in this Machine \u21E9": " ")); menu.addMenuClickHandler(i, @@ -987,12 +957,13 @@ public class SlimefunGuide { ); } - List recipes = SlimefunItem.getByItem(item) instanceof SlimefunMachine ? ((SlimefunMachine) SlimefunItem.getByItem(item)).getDisplayRecipes() : ((SlimefunGadget) SlimefunItem.getByItem(item)).getDisplayRecipes(); - int recipe_size = recipes.size(); - if (recipe_size > 18) recipe_size = 18; - int inputs = -1, outputs = -1; + List recipes = ((RecipeDisplayItem) SlimefunItem.getByItem(item)).getDisplayRecipes(); + int recipeSize = recipes.size(); + if (recipeSize > 18) recipeSize = 18; + int inputs = -1; + int outputs = -1; - for (int i = 0; i < recipe_size; i++) { + for (int i = 0; i < recipeSize; i++) { int slot = 36; if (i % 2 == 1) { slot = slot + 9; @@ -1002,7 +973,7 @@ public class SlimefunGuide { int addition = (i % 2 == 0 ? inputs: outputs); - menu.addItem(slot + addition, recipes.get(i)); + menu.addItem(slot + addition, recipes.get(i).clone()); menu.addMenuClickHandler(slot + addition, (pl, slotn, itemstack, action) -> { displayItem(pl, itemstack, true, book, 0); return false; @@ -1018,7 +989,7 @@ public class SlimefunGuide { List lore = new ArrayList<>(); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + (((AGenerator) sfItem).getEnergyProduction() * 2) + " J/s")); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble(fuel.getTicks() * ((AGenerator) sfItem).getEnergyProduction()) + " J in total")); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble((double) fuel.getTicks() * ((AGenerator) sfItem).getEnergyProduction()) + " J in total")); im.setLore(lore); fItem.setItemMeta(im); menu.addItem(slot, fItem); @@ -1037,13 +1008,11 @@ public class SlimefunGuide { List lore = new ArrayList<>(); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + (((AReactor) sfItem).getEnergyProduction() * 2) + " J/s")); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble(fuel.getTicks() * ((AReactor) sfItem).getEnergyProduction()) + " J in total")); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble((double) fuel.getTicks() * ((AReactor) sfItem).getEnergyProduction()) + " J in total")); im.setLore(lore); fItem.setItemMeta(im); menu.addItem(slot, fItem); - menu.addMenuClickHandler(slot, (pl, slotn, itemstack, action) -> { - return false; - }); + menu.addMenuClickHandler(slot, (pl, slotn, itemstack, action) -> false); slot++; } } @@ -1052,18 +1021,21 @@ public class SlimefunGuide { menu.open(p); } - public static void clearHistory(UUID uuid) { - history.remove(uuid); + private static Map> getHistory() { + return SlimefunPlugin.getUtilities().guideHistory; } - private static String getTimeLeft(int l) { + public static void clearHistory(UUID uuid) { + getHistory().remove(uuid); + } + + private static String getTimeLeft(int seconds) { String timeleft = ""; - final int minutes = (int) (l / 60L); + final int minutes = (int) (seconds / 60L); if (minutes > 0) { timeleft = String.valueOf(timeleft) + minutes + "m "; } - l -= minutes * 60; - final int seconds = (int)l; + seconds -= minutes * 60; timeleft = String.valueOf(timeleft) + seconds + "s"; return "&7" + timeleft; } diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java b/src/me/mrCookieSlime/Slimefun/SlimefunPlugin.java similarity index 56% rename from src/me/mrCookieSlime/Slimefun/SlimefunStartup.java rename to src/me/mrCookieSlime/Slimefun/SlimefunPlugin.java index be4d316eb..0e4000e04 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunPlugin.java @@ -1,6 +1,7 @@ package me.mrCookieSlime.Slimefun; import java.io.File; +import java.util.logging.Level; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; @@ -11,6 +12,7 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionManager; import io.github.thebusybiscuit.cscorelib2.updater.BukkitUpdater; import io.github.thebusybiscuit.cscorelib2.updater.GitHubBuildsUpdater; import io.github.thebusybiscuit.cscorelib2.updater.Updater; @@ -18,55 +20,43 @@ import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.PluginUtils; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Reflection.ReflectionUtils; -import me.mrCookieSlime.Slimefun.AncientAltar.Pedestals; -import me.mrCookieSlime.Slimefun.CSCoreLibSetup.CSCoreLibLoader; import me.mrCookieSlime.Slimefun.GEO.OreGenSystem; -import me.mrCookieSlime.Slimefun.GEO.Resources.NetherIceResource; -import me.mrCookieSlime.Slimefun.GEO.Resources.OilResource; -import me.mrCookieSlime.Slimefun.GPS.Elevator; +import me.mrCookieSlime.Slimefun.GEO.resources.NetherIceResource; +import me.mrCookieSlime.Slimefun.GEO.resources.OilResource; +import me.mrCookieSlime.Slimefun.GPS.GPSNetwork; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; -import me.mrCookieSlime.Slimefun.Objects.MultiBlock; -import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoEnchanter; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricDustWasher; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.OreWasher; +import me.mrCookieSlime.Slimefun.Setup.CSCoreLibLoader; import me.mrCookieSlime.Slimefun.Setup.Files; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.MiscSetup; import me.mrCookieSlime.Slimefun.Setup.ResearchSetup; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunSetup; +import me.mrCookieSlime.Slimefun.ancient_altar.AncientAltarListener; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunBackup; import me.mrCookieSlime.Slimefun.api.TickerTask; -import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; -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.inventory.UniversalBlockMenu; -import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; -import me.mrCookieSlime.Slimefun.api.item_transport.ChestManipulator; import me.mrCookieSlime.Slimefun.autosave.BlockAutoSaver; import me.mrCookieSlime.Slimefun.autosave.PlayerAutoSaver; import me.mrCookieSlime.Slimefun.commands.SlimefunCommand; import me.mrCookieSlime.Slimefun.commands.SlimefunTabCompleter; -import me.mrCookieSlime.Slimefun.hooks.PlaceholderAPIHook; -import me.mrCookieSlime.Slimefun.hooks.WorldEditHook; -import me.mrCookieSlime.Slimefun.hooks.github.Contributor; +import me.mrCookieSlime.Slimefun.hooks.SlimefunHooks; import me.mrCookieSlime.Slimefun.hooks.github.GitHubConnector; import me.mrCookieSlime.Slimefun.hooks.github.GitHubSetup; -import me.mrCookieSlime.Slimefun.listeners.AncientAltarListener; import me.mrCookieSlime.Slimefun.listeners.AndroidKillingListener; import me.mrCookieSlime.Slimefun.listeners.ArmorListener; import me.mrCookieSlime.Slimefun.listeners.AutonomousToolsListener; import me.mrCookieSlime.Slimefun.listeners.BackpackListener; import me.mrCookieSlime.Slimefun.listeners.BlockListener; import me.mrCookieSlime.Slimefun.listeners.BowListener; -import me.mrCookieSlime.Slimefun.listeners.ClearLaggIntegration; import me.mrCookieSlime.Slimefun.listeners.CoolerListener; import me.mrCookieSlime.Slimefun.listeners.DamageListener; import me.mrCookieSlime.Slimefun.listeners.FurnaceListener; @@ -80,29 +70,27 @@ import me.mrCookieSlime.Slimefun.listeners.TalismanListener; import me.mrCookieSlime.Slimefun.listeners.TeleporterListener; import me.mrCookieSlime.Slimefun.listeners.ToolListener; import me.mrCookieSlime.Slimefun.listeners.WorldListener; -import net.coreprotect.CoreProtect; -import net.coreprotect.CoreProtectAPI; +import me.mrCookieSlime.Slimefun.utils.Settings; +import me.mrCookieSlime.Slimefun.utils.Utilities; -public class SlimefunStartup extends JavaPlugin { +public final class SlimefunPlugin extends JavaPlugin { - public static SlimefunStartup instance; - - static PluginUtils utils; - static Config researches; - static Config items; - static Config whitelist; - static Config config; - - public static TickerTask ticker; - - private CoreProtectAPI coreProtectAPI; - - private boolean clearlag = false; - private boolean exoticGarden = false; - private boolean coreProtect = false; + public static SlimefunPlugin instance; + private TickerTask ticker; + private Config researches; + private Config items; + private Config whitelist; + private Config config; + + private final GPSNetwork gps = new GPSNetwork(); + private ProtectionManager protections; + private Utilities utilities = new Utilities(); + private Settings settings; + private SlimefunHooks hooks; + // Supported Versions of Minecraft - final String[] supported = {"v1_14_"}; + private final String[] supported = {"v1_14_"}; @Override public void onEnable() { @@ -130,41 +118,44 @@ public class SlimefunStartup extends JavaPlugin { // Looks like you are using an unsupported Minecraft Version if (!compatibleVersion) { - System.err.println("### Slimefun failed to load!"); - System.err.println("###"); - System.err.println("### You are using the wrong Version of Minecraft!!!"); - System.err.println("###"); - System.err.println("### You are using Minecraft " + ReflectionUtils.getVersion()); - System.err.println("### but Slimefun v" + getDescription().getVersion() + " requires you to be using"); - System.err.println("### Minecraft " + versions.toString()); - System.err.println("###"); - System.err.println("### Please use an older Version of Slimefun and disable auto-updating"); - System.err.println("### or consider updating your Server Software."); + getLogger().log(Level.SEVERE, "### Slimefun was not installed correctly!"); + getLogger().log(Level.SEVERE, "###"); + getLogger().log(Level.SEVERE, "### You are using the wrong Version of Minecraft!"); + getLogger().log(Level.SEVERE, "###"); + getLogger().log(Level.SEVERE, "### You are using Minecraft " + ReflectionUtils.getVersion()); + getLogger().log(Level.SEVERE, "### but Slimefun v" + getDescription().getVersion() + " requires you to be using"); + getLogger().log(Level.SEVERE, "### Minecraft " + versions.toString()); + getLogger().log(Level.SEVERE, "###"); + getLogger().log(Level.SEVERE, "### Please use an older Version of Slimefun and disable auto-updating"); + getLogger().log(Level.SEVERE, "### or consider updating your Server Software."); getServer().getPluginManager().disablePlugin(this); return; } } instance = this; - System.out.println("[Slimefun] Loading Files..."); - Files.cleanup(); + getLogger().log(Level.INFO, "Loading Files..."); + Files files = new Files(); + files.cleanup(); - System.out.println("[Slimefun] Loading Config..."); + getLogger().log(Level.INFO, "Loading Config..."); - utils = new PluginUtils(this); + // Setup config.yml + PluginUtils utils = new PluginUtils(this); utils.setupConfig(); + config = utils.getConfig(); + settings = new Settings(config); // Loading all extra configs - researches = new Config(Files.RESEARCHES); - items = new Config(Files.ITEMS); - whitelist = new Config(Files.WHITELIST); + researches = new Config(files.researches); + items = new Config(files.items); + whitelist = new Config(files.whitelist); - // Setup Config and messages.yml + // Setup messages.yml utils.setupLocalization(); - config = utils.getConfig(); Messages.local = utils.getLocalization(); Messages.setup(); - + // Setting up bStats new Metrics(this); @@ -188,27 +179,26 @@ public class SlimefunStartup extends JavaPlugin { for (String s : storage) createDir("data-storage/Slimefun/" + s); for (String s : general) createDir("plugins/Slimefun/" + s); - SlimefunManager.plugin = this; - - System.out.println("[Slimefun] Loading Items..."); + getLogger().log(Level.INFO, "Loading Items..."); MiscSetup.setupItemSettings(); try { SlimefunSetup.setupItems(); - } catch (Exception e1) { - e1.printStackTrace(); + } catch (Exception x) { + getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + Slimefun.getVersion(), x); } + MiscSetup.loadDescriptions(); + + settings.researchesEnabled = getResearchCfg().getBoolean("enable-researching"); + settings.smelteryFireBreakChance = (Integer) Slimefun.getItemValue("SMELTERY", "chance.fireBreak"); - System.out.println("[Slimefun] Loading Researches..."); - Research.enableResearching = getResearchCfg().getBoolean("enable-researching"); + getLogger().log(Level.INFO, "Loading Researches..."); ResearchSetup.setupResearches(); MiscSetup.setupMisc(); - BlockStorage.info_delay = config.getInt("URID.info-delay"); - - System.out.println("[Slimefun] Loading World Generators..."); + getLogger().log(Level.INFO, "Loading World Generators..."); // Generating Oil as an OreGenResource (its a cool API) OreGenSystem.registerResource(new OilResource()); @@ -249,61 +239,40 @@ public class SlimefunStartup extends JavaPlugin { // Initiating various Stuff and all Items with a slightly delay (0ms after the Server finished loading) getServer().getScheduler().scheduleSyncDelayedTask(this, () -> { - Slimefun.emeraldenchants = getServer().getPluginManager().isPluginEnabled("EmeraldEnchants"); - SlimefunGuide.all_recipes = config.getBoolean("options.show-vanilla-recipes-in-guide"); - MiscSetup.loadItems(); + protections = new ProtectionManager(getServer()); + MiscSetup.loadItems(settings); for (World world: Bukkit.getWorlds()) { new BlockStorage(world); } - if (SlimefunItem.getByID("ANCIENT_ALTAR") != null) new AncientAltarListener((SlimefunStartup) instance); + if (SlimefunItem.getByID("ANCIENT_ALTAR") != null) new AncientAltarListener((SlimefunPlugin) instance); }, 0); - - // WorldEdit Hook to clear Slimefun Data upon //set 0 //cut or any other equivalent - if (getServer().getPluginManager().isPluginEnabled("WorldEdit")) { - try { - Class.forName("com.sk89q.worldedit.extent.Extent"); - new WorldEditHook(); - System.out.println("[Slimefun] Successfully hooked into WorldEdit!"); - } catch (Exception x) { - System.err.println("[Slimefun] Failed to hook into WorldEdit!"); - System.err.println("[Slimefun] Maybe consider updating WorldEdit or Slimefun?"); - } - } - if (getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { - new PlaceholderAPIHook().register(); - } + SlimefunCommand command = new SlimefunCommand(this); - getCommand("slimefun").setExecutor(new SlimefunCommand(this)); - getCommand("slimefun").setTabCompleter(new SlimefunTabCompleter()); + getCommand("slimefun").setExecutor(command); + getCommand("slimefun").setTabCompleter(new SlimefunTabCompleter(command)); // Armor Update Task if (config.getBoolean("options.enable-armor-effects")) { getServer().getScheduler().runTaskTimer(this, () -> { for (Player p: Bukkit.getOnlinePlayers()) { for (ItemStack armor: p.getInventory().getArmorContents()) { - if (armor != null) { - if (Slimefun.hasUnlocked(p, armor, true)) { - if (SlimefunItem.getByItem(armor) instanceof SlimefunArmorPiece) { - for (PotionEffect effect: ((SlimefunArmorPiece) SlimefunItem.getByItem(armor)).getEffects()) { - p.removePotionEffect(effect.getType()); - p.addPotionEffect(effect); - } - } - if (SlimefunManager.isItemSimiliar(armor, SlimefunItem.getItem("SOLAR_HELMET"), false)) { - if (p.getWorld().getTime() < 12300 || p.getWorld().getTime() > 23850) { - if (p.getEyeLocation().getBlock().getLightFromSky() == 15) { - ItemEnergy.chargeInventory(p, Float.valueOf(String.valueOf(Slimefun.getItemValue("SOLAR_HELMET", "charge-amount")))); - } - } + if (armor != null && Slimefun.hasUnlocked(p, armor, true)) { + if (SlimefunItem.getByItem(armor) instanceof SlimefunArmorPiece) { + for (PotionEffect effect: ((SlimefunArmorPiece) SlimefunItem.getByItem(armor)).getEffects()) { + p.removePotionEffect(effect.getType()); + p.addPotionEffect(effect); } } + if (SlimefunManager.isItemSimiliar(armor, SlimefunItem.getItem("SOLAR_HELMET"), false) && p.getWorld().getTime() < 12300 || p.getWorld().getTime() > 23850 && p.getEyeLocation().getBlock().getLightFromSky() == 15) { + ItemEnergy.chargeInventory(p, Float.valueOf(String.valueOf(Slimefun.getItemValue("SOLAR_HELMET", "charge-amount")))); + } } } - for (ItemStack radioactive: SlimefunItem.radioactive) { + for (ItemStack radioactive: utilities.radioactiveItems) { if (p.getInventory().containsAtLeast(radioactive, 1) || SlimefunManager.isItemSimiliar(p.getInventory().getItemInOffHand(), radioactive, true)) { // Check if player is wearing the hazmat suit // If so, break the loop @@ -323,7 +292,8 @@ public class SlimefunStartup extends JavaPlugin { p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 400, 1)); p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_DIGGING, 400, 1)); p.setFireTicks(400); - break; // Break the loop to save some calculations + break; + // Break the loop to save some calculations } } } @@ -333,39 +303,19 @@ public class SlimefunStartup extends JavaPlugin { ticker = new TickerTask(); - getServer().getScheduler().runTaskTimer(this, new PlayerAutoSaver(), 2000L, config.getInt("options.auto-save-delay-in-minutes") * 60L * 20L); + getServer().getScheduler().runTaskTimer(this, new PlayerAutoSaver(), 2000L, settings.blocksAutoSaveDelay * 60L * 20L); // Starting all ASYNC Tasks - getServer().getScheduler().runTaskTimerAsynchronously(this, new BlockAutoSaver(), 2000L, config.getInt("options.auto-save-delay-in-minutes") * 60L * 20L); + getServer().getScheduler().runTaskTimerAsynchronously(this, new BlockAutoSaver(), 2000L, settings.blocksAutoSaveDelay * 60L * 20L); getServer().getScheduler().runTaskTimerAsynchronously(this, ticker, 100L, config.getInt("URID.custom-ticker-delay")); - getServer().getScheduler().runTaskTimerAsynchronously(this, () -> { - for (GitHubConnector connector : GitHubConnector.connectors) { - connector.pullFile(); - } - }, 80L, 60 * 60 * 20L); + getServer().getScheduler().runTaskTimerAsynchronously(this, () -> utilities.connectors.forEach(GitHubConnector::pullFile), 80L, 60 * 60 * 20L); // Hooray! - System.out.println("[Slimefun] Finished!"); - - clearlag = getServer().getPluginManager().isPluginEnabled("ClearLag"); - coreProtect = getServer().getPluginManager().isPluginEnabled("CoreProtect"); - - getServer().getScheduler().runTaskLater(this, () -> { - exoticGarden = getServer().getPluginManager().isPluginEnabled("ExoticGarden"); // Had to do it this way, otherwise it seems disabled. - }, 0); - - if (clearlag) new ClearLaggIntegration(this); - - if (coreProtect) coreProtectAPI = ((CoreProtect) getServer().getPluginManager().getPlugin("CoreProtect")).getAPI(); - - Research.creative_research = config.getBoolean("options.allow-free-creative-research"); - Research.titles = config.getStringList("research-ranks"); + getLogger().log(Level.INFO, "Finished!"); + hooks = new SlimefunHooks(this); - AutoEnchanter.max_emerald_enchantments = config.getInt("options.emerald-enchantment-limit"); - - SlimefunSetup.legacy_ore_washer = config.getBoolean("options.legacy-ore-washer"); - ElectricDustWasher.legacy_dust_washer = config.getBoolean("options.legacy-dust-washer"); + OreWasher.items = new ItemStack[] {SlimefunItems.IRON_DUST, SlimefunItems.GOLD_DUST, SlimefunItems.ALUMINUM_DUST, SlimefunItems.COPPER_DUST, SlimefunItems.ZINC_DUST, SlimefunItems.TIN_DUST, SlimefunItems.LEAD_DUST, SlimefunItems.SILVER_DUST, SlimefunItems.MAGNESIUM_DUST}; // Do not show /sf elevator command in our Log, it could get quite spammy CSCoreLib.getLib().filterLog("([A-Za-z0-9_]{3,16}) issued server command: /sf elevator (.{0,})"); @@ -378,11 +328,11 @@ public class SlimefunStartup extends JavaPlugin { if (ticker != null) { // Finishes all started movements/removals of block data - ticker.HALTED = true; + ticker.halt(); ticker.run(); } - PlayerProfile.iterator().forEachRemaining((profile) -> { + PlayerProfile.iterator().forEachRemaining(profile -> { if (profile.isDirty()) profile.save(); }); @@ -394,78 +344,26 @@ public class SlimefunStartup extends JavaPlugin { storage.save(true); } else { - System.err.println("[Slimefun] Could not save Slimefun Blocks for World \"" + world.getName() + "\""); + getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"" + world.getName() + "\""); } } catch (Exception x) { - x.printStackTrace(); + getLogger().log(Level.SEVERE, "An Error occured while saving Slimefun-Blocks in World '" + world.getName() + "' for Slimefun " + Slimefun.getVersion()); } } - for (UniversalBlockMenu menu: BlockStorage.universal_inventories.values()) { + for (UniversalBlockMenu menu: utilities.universalInventories.values()) { menu.save(); } SlimefunBackup.start(); // Prevent Memory Leaks - config = null; - researches = null; - items = null; - whitelist = null; - instance = null; Messages.local = null; - Files.CONFIG = null; - Files.DATABASE = null; - Files.ITEMS = null; - Files.RESEARCHES = null; - Files.WHITELIST = null; - MultiBlock.list = null; - Research.list = null; - Research.researching = null; - SlimefunItem.all = null; - SlimefunItem.items = null; - SlimefunItem.map_id = null; - SlimefunItem.handlers = null; - SlimefunItem.radioactive = null; - Variables.damage = null; - Variables.jump_state = null; - Variables.mode = null; - SlimefunGuide.history = null; - Variables.altarinuse = null; - Variables.enchanting = null; - Variables.backpack = null; - Variables.soulbound = null; - Variables.blocks = null; - Variables.cancelPlace = null; - Variables.arrows = null; - SlimefunCommand.arguments = null; - SlimefunCommand.descriptions = null; - SlimefunCommand.tabs = null; - SlimefunItem.blockhandler = null; - BlockMenuPreset.presets = null; - BlockStorage.loaded_tickers = null; - BlockStorage.ticking_chunks = null; - BlockStorage.worlds = null; - ChargableBlock.capacitors = null; - ChargableBlock.max_charges = null; AContainer.processing = null; AContainer.progress = null; - Slimefun.guide_handlers = null; - Pedestals.recipes = null; - Elevator.ignored = null; - EnergyNet.listeners = null; - EnergyNet.machines_input = null; - EnergyNet.machines_output = null; - EnergyNet.machines_storage = null; - CargoNet.faces = null; - BlockStorage.universal_inventories = null; - TickerTask.block_timings = null; - OreGenSystem.map = null; - SlimefunGuide.contributors = null; - GitHubConnector.connectors = null; - Contributor.textures = null; - ChestManipulator.listeners = null; - PlayerProfile.profiles = null; + OreWasher.items = null; + + instance = null; for (Player p: Bukkit.getOnlinePlayers()) { p.closeInventory(); @@ -474,50 +372,63 @@ public class SlimefunStartup extends JavaPlugin { private void createDir(String path) { File file = new File(path); - if (!file.exists()) - file.mkdirs(); + if (!file.exists()) file.mkdirs(); } public static Config getCfg() { - return config; + return instance.config; } public static Config getResearchCfg() { - return researches; + return instance.researches; } public static Config getItemCfg() { - return items; + return instance.items; } public static Config getWhitelist() { - return whitelist; + return instance.whitelist; } + @Deprecated public static int randomize(int max) { if (max < 1) return 0; return CSCoreLib.randomizer().nextInt(max); } + @Deprecated public static boolean chance(int max, int percentage) { if (max < 1) return false; return CSCoreLib.randomizer().nextInt(max) <= percentage; } - public boolean isClearLagInstalled() { - return clearlag; + public GPSNetwork getGPS() { + return gps; } - public boolean isExoticGardenInstalled () { - return exoticGarden; + public static SlimefunHooks getHooks() { + return instance.hooks; + } + + public static Utilities getUtilities() { + return instance.utilities; + } + + public static Settings getSettings() { + return instance.settings; + } + + public static TickerTask getTicker() { + return instance.ticker; + } + + public static boolean isActive() { + return instance != null; } - public boolean isCoreProtectInstalled() { - return coreProtect; - } - - public CoreProtectAPI getCoreProtectAPI() { - return coreProtectAPI; + public static ProtectionManager getProtectionManager() { + return instance.protections; } } diff --git a/src/me/mrCookieSlime/Slimefun/Variables.java b/src/me/mrCookieSlime/Slimefun/Variables.java deleted file mode 100644 index f6839c089..000000000 --- a/src/me/mrCookieSlime/Slimefun/Variables.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.mrCookieSlime.Slimefun; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.inventory.ItemStack; - -@Deprecated -public class Variables { - - public static Map jump_state = new HashMap<>(); - public static Set damage = new HashSet<>(); - public static Map remove = new HashMap<>(); - public static Map mode = new HashMap<>(); - - public static Map enchanting = new HashMap<>(); - public static Map backpack = new HashMap<>(); - public static HashSet altarinuse = new HashSet<>(); - - public static Map> soulbound = new HashMap<>(); - public static List blocks = new ArrayList<>(); - public static List cancelPlace = new ArrayList<>(); - public static Map arrows = new HashMap<>(); - -} diff --git a/src/me/mrCookieSlime/Slimefun/AncientAltar/AltarRecipe.java b/src/me/mrCookieSlime/Slimefun/ancient_altar/AltarRecipe.java similarity index 75% rename from src/me/mrCookieSlime/Slimefun/AncientAltar/AltarRecipe.java rename to src/me/mrCookieSlime/Slimefun/ancient_altar/AltarRecipe.java index 8bcbbb810..70f827194 100644 --- a/src/me/mrCookieSlime/Slimefun/AncientAltar/AltarRecipe.java +++ b/src/me/mrCookieSlime/Slimefun/ancient_altar/AltarRecipe.java @@ -1,15 +1,17 @@ -package me.mrCookieSlime.Slimefun.AncientAltar; +package me.mrCookieSlime.Slimefun.ancient_altar; import java.util.ArrayList; import java.util.List; import org.bukkit.inventory.ItemStack; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; + public class AltarRecipe { - ItemStack catalyst; - List input; - ItemStack output; + private ItemStack catalyst; + private List input; + private ItemStack output; public AltarRecipe(List input, ItemStack output) { this.catalyst = input.get(4); @@ -27,7 +29,7 @@ public class AltarRecipe { this.output = output; - Pedestals.recipes.add(this); + SlimefunPlugin.getUtilities().altarRecipes.add(this); } public ItemStack getCatalyst() { diff --git a/src/me/mrCookieSlime/Slimefun/listeners/AncientAltarListener.java b/src/me/mrCookieSlime/Slimefun/ancient_altar/AncientAltarListener.java similarity index 69% rename from src/me/mrCookieSlime/Slimefun/listeners/AncientAltarListener.java rename to src/me/mrCookieSlime/Slimefun/ancient_altar/AncientAltarListener.java index 3263d8000..1cbb5baba 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/AncientAltarListener.java +++ b/src/me/mrCookieSlime/Slimefun/ancient_altar/AncientAltarListener.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.listeners; +package me.mrCookieSlime.Slimefun.ancient_altar; import java.util.ArrayList; import java.util.HashSet; @@ -29,51 +29,50 @@ import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.AncientAltar.Pedestals; -import me.mrCookieSlime.Slimefun.AncientAltar.RitualAnimation; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.utils.Utilities; public class AncientAltarListener implements Listener { + + private Utilities utilities; - public AncientAltarListener(SlimefunStartup plugin) { + public AncientAltarListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); + + utilities = SlimefunPlugin.getUtilities(); } - List altars = new ArrayList<>(); - Set removed_items = new HashSet<>(); + private List altars = new ArrayList<>(); + private Set removedItems = new HashSet<>(); @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onInteract(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK) return; Block b = e.getClickedBlock(); - SlimefunItem item = BlockStorage.check(b); + String item = BlockStorage.checkID(b); if (item != null) { - if (item.getID().equals("ANCIENT_PEDESTAL")) { - if (Variables.altarinuse.contains(b.getLocation())) { + if (item.equals("ANCIENT_PEDESTAL")) { + if (utilities.altarinuse.contains(b.getLocation())) { e.setCancelled(true); return; } e.setCancelled(true); Item stack = findItem(b); if (stack == null) { - if(e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.AIR)) return; + if(e.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR) return; if(b.getRelative(0, 1, 0).getType() != Material.AIR) { Messages.local.sendTranslation(e.getPlayer(), "machines.ANCIENT_PEDESTAL.obstructed", true); return; } insertItem(e.getPlayer(), b); } - else if (!removed_items.contains(stack.getUniqueId())) { + else if (!removedItems.contains(stack.getUniqueId())) { final UUID uuid = stack.getUniqueId(); - removed_items.add(uuid); + removedItems.add(uuid); - SlimefunStartup.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - removed_items.remove(uuid); - }, 30L); + SlimefunPlugin.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> removedItems.remove(uuid), 30L); stack.remove(); e.getPlayer().getInventory().addItem(fixItemStack(stack.getItemStack(), stack.getCustomName())); @@ -81,12 +80,14 @@ public class AncientAltarListener implements Listener { PlayerInventory.update(e.getPlayer()); } } - else if (item.getID().equals("ANCIENT_ALTAR")) { - if (Variables.altarinuse.contains(b.getLocation())) { + else if (item.equals("ANCIENT_ALTAR")) { + if (utilities.altarinuse.contains(b.getLocation())) { e.setCancelled(true); return; } - Variables.altarinuse.add(b.getLocation()); // make altarinuse simply because that was the last block clicked. + + // Make altarinuse simply because that was the last block clicked. + utilities.altarinuse.add(b.getLocation()); e.setCancelled(true); ItemStack catalyst = new CustomItem(e.getPlayer().getInventory().getItemInMainHand(), 1); @@ -95,10 +96,9 @@ public class AncientAltarListener implements Listener { if (!altars.contains(e.getClickedBlock())) { altars.add(e.getClickedBlock()); if (pedestals.size() == 8) { - pedestals.forEach((pblock)->{ - Variables.altarinuse.add(pblock.getLocation()); - }); - if (catalyst != null && !catalyst.getType().equals(Material.AIR)) { + pedestals.forEach(block -> utilities.altarinuse.add(block.getLocation())); + + if (catalyst != null && catalyst.getType() != Material.AIR) { List input = new ArrayList<>(); for (Block pedestal: pedestals) { Item stack = findItem(pedestal); @@ -110,30 +110,34 @@ public class AncientAltarListener implements Listener { List consumed = new ArrayList<>(); consumed.add(catalyst); PlayerInventory.consumeItemInHand(e.getPlayer()); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new RitualAnimation(altars, b, b.getLocation().add(0.5, 1.3, 0.5), result, pedestals, consumed), 10L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, new RitualAnimation(altars, b, b.getLocation().add(0.5, 1.3, 0.5), result, pedestals, consumed), 10L); } else { altars.remove(e.getClickedBlock()); Messages.local.sendTranslation(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-recipe", true); - pedestals.forEach((pblock)->{ - Variables.altarinuse.remove(pblock.getLocation()); - }); - Variables.altarinuse.remove(b.getLocation()); // bad recipe, no longer in use. + + pedestals.forEach(block -> utilities.altarinuse.remove(block.getLocation())); + + // Bad recipe, no longer in use. + utilities.altarinuse.remove(b.getLocation()); } } else { altars.remove(e.getClickedBlock()); Messages.local.sendTranslation(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-catalyst", true); - pedestals.forEach((pblock)->{ - Variables.altarinuse.remove(pblock.getLocation()); - }); - Variables.altarinuse.remove(b.getLocation()); // unkown catalyst, no longer in use + + pedestals.forEach(block -> utilities.altarinuse.remove(block.getLocation())); + + // Unknown catalyst, no longer in use + utilities.altarinuse.remove(b.getLocation()); } } else { altars.remove(e.getClickedBlock()); Messages.local.sendTranslation(e.getPlayer(), "machines.ANCIENT_ALTAR.not-enough-pedestals", true, new Variable("%pedestals%", String.valueOf(pedestals.size()))); - Variables.altarinuse.remove(b.getLocation()); // not a valid altar so remove from inuse + + // Not a valid altar so remove from inuse + utilities.altarinuse.remove(b.getLocation()); } } } @@ -158,9 +162,7 @@ public class AncientAltarListener implements Listener { public static Item findItem(Block b) { for (Entity n: b.getChunk().getEntities()) { - if (n instanceof Item) { - if (b.getLocation().add(0.5, 1.2, 0.5).distanceSquared(n.getLocation()) < 0.5D && n.getCustomName() != null) return (Item) n; - } + if (n instanceof Item && b.getLocation().add(0.5, 1.2, 0.5).distanceSquared(n.getLocation()) < 0.5D && n.getCustomName() != null) return (Item) n; } return null; } @@ -172,7 +174,7 @@ public class AncientAltarListener implements Listener { String nametag = StringUtils.formatItemName(stack, false); Item entity = b.getWorld().dropItem(b.getLocation().add(0.5, 1.2, 0.5), new CustomItem(new CustomItem(stack, 1), "&5&dALTAR &3Probe - &e" + System.nanoTime())); entity.setVelocity(new Vector(0, 0.1, 0)); - entity.setMetadata("no_pickup", new FixedMetadataValue(SlimefunStartup.instance, "altar_item")); + entity.setMetadata("no_pickup", new FixedMetadataValue(SlimefunPlugin.instance, "altar_item")); entity.setCustomNameVisible(true); entity.setCustomName(nametag); p.playSound(b.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.3F, 0.3F); @@ -182,9 +184,9 @@ public class AncientAltarListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent e) { Block b = e.getBlockPlaced().getRelative(0, -1, 0); - SlimefunItem item = BlockStorage.check(b); - if(item == null) return; - if(item.getID().equalsIgnoreCase("ANCIENT_PEDESTAL")) { + String item = BlockStorage.checkID(b); + + if (item != null && item.equalsIgnoreCase("ANCIENT_PEDESTAL")) { Messages.local.sendTranslation(e.getPlayer(), "messages.cannot-place", true); e.setCancelled(true); } diff --git a/src/me/mrCookieSlime/Slimefun/AncientAltar/Pedestals.java b/src/me/mrCookieSlime/Slimefun/ancient_altar/Pedestals.java similarity index 53% rename from src/me/mrCookieSlime/Slimefun/AncientAltar/Pedestals.java rename to src/me/mrCookieSlime/Slimefun/ancient_altar/Pedestals.java index 018acf6ea..7b23a31b2 100644 --- a/src/me/mrCookieSlime/Slimefun/AncientAltar/Pedestals.java +++ b/src/me/mrCookieSlime/Slimefun/ancient_altar/Pedestals.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.AncientAltar; +package me.mrCookieSlime.Slimefun.ancient_altar; import java.util.ArrayList; import java.util.Arrays; @@ -8,39 +8,41 @@ import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; -public class Pedestals { - - public static List recipes = new ArrayList<>(); +public final class Pedestals { + + private Pedestals() {} public static List getPedestals(Block altar) { + String pedestal = "ANCIENT_PEDESTAL"; List list = new ArrayList<>(); - if (BlockStorage.check(altar.getRelative(2, 0, -2), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(2, 0, -2), pedestal)) { list.add(altar.getRelative(2, 0, -2)); } - if (BlockStorage.check(altar.getRelative(3, 0, 0), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(3, 0, 0), pedestal)) { list.add(altar.getRelative(3, 0, 0)); } - if (BlockStorage.check(altar.getRelative(2, 0, 2), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(2, 0, 2), pedestal)) { list.add(altar.getRelative(2, 0, 2)); } - if (BlockStorage.check(altar.getRelative(0, 0, 3), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(0, 0, 3), pedestal)) { list.add(altar.getRelative(0, 0, 3)); } - if (BlockStorage.check(altar.getRelative(-2, 0, 2), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(-2, 0, 2), pedestal)) { list.add(altar.getRelative(-2, 0, 2)); } - if (BlockStorage.check(altar.getRelative(-3, 0, 0), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(-3, 0, 0), pedestal)) { list.add(altar.getRelative(-3, 0, 0)); } - if (BlockStorage.check(altar.getRelative(-2, 0, -2), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(-2, 0, -2), pedestal)) { list.add(altar.getRelative(-2, 0, -2)); } - if (BlockStorage.check(altar.getRelative(0, 0, -3), "ANCIENT_PEDESTAL")) { + if (BlockStorage.check(altar.getRelative(0, 0, -3), pedestal)) { list.add(altar.getRelative(0, 0, -3)); } @@ -49,6 +51,7 @@ public class Pedestals { public static ItemStack getRecipeOutput(ItemStack catalyst, List input) { if (input.size() != 8) return null; + if (SlimefunManager.isItemSimiliar(catalyst, SlimefunItems.BROKEN_SPAWNER, false)) { if (checkRecipe(SlimefunItems.BROKEN_SPAWNER, input) == null) return null; final ItemStack spawner = SlimefunItems.REPAIRED_SPAWNER.clone(); @@ -62,25 +65,21 @@ public class Pedestals { } private static ItemStack checkRecipe(ItemStack catalyst, List items) { - loop: - for (AltarRecipe recipe: recipes) { - if (!SlimefunManager.isItemSimiliar(catalyst, recipe.getCatalyst(), true)) { - continue; + for (AltarRecipe recipe: SlimefunPlugin.getUtilities().altarRecipes) { + if (SlimefunManager.isItemSimiliar(catalyst, recipe.getCatalyst(), true)) { + for (int i = 0; i < 8; i++) { + if (SlimefunManager.isItemSimiliar(items.get(i), recipe.getInput().get(0), true)) { + for (int j = 1; j < 8; j++) { + if (!SlimefunManager.isItemSimiliar(items.get((i + j) % items.size()), recipe.getInput().get(j), true)) { + break; + } + else if (j == 7) { + return recipe.getOutput(); + } + } + } + } } - - for (int i = 0; i < 8; i++) { - if (!SlimefunManager.isItemSimiliar(items.get(i), recipe.getInput().get(0), true)) { - continue; - } - - for (int j = 1; j < 8; j++) { - if (!SlimefunManager.isItemSimiliar(items.get((i + j) % items.size()), recipe.getInput().get(j), true)) { - continue loop; - } - } - - return recipe.getOutput(); - } } return null; diff --git a/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java b/src/me/mrCookieSlime/Slimefun/ancient_altar/RitualAnimation.java similarity index 59% rename from src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java rename to src/me/mrCookieSlime/Slimefun/ancient_altar/RitualAnimation.java index 7edd12b1e..d7c9655b1 100644 --- a/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java +++ b/src/me/mrCookieSlime/Slimefun/ancient_altar/RitualAnimation.java @@ -1,13 +1,14 @@ -package me.mrCookieSlime.Slimefun.AncientAltar; +package me.mrCookieSlime.Slimefun.ancient_altar; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.listeners.AncientAltarListener; -import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.utils.Utilities; import org.bukkit.Effect; import org.bukkit.Location; @@ -20,19 +21,21 @@ import org.bukkit.inventory.ItemStack; public class RitualAnimation implements Runnable { - List altars; + private List altars; - Block altar; - Location l; - ItemStack output; - List pedestals; - List items; + private Block altar; + private Location l; + private ItemStack output; + private List pedestals; + private List items; - List particles; - Map itemLock = new HashMap<>(); + private List particles; + private Map itemLock = new HashMap<>(); - boolean running; - int stage; + private boolean running; + private int stage; + + private Utilities utilities = SlimefunPlugin.getUtilities(); public RitualAnimation(List altars, Block altar, Location drop, ItemStack output, List pedestals, List items) { this.l = drop; @@ -45,9 +48,10 @@ public class RitualAnimation implements Runnable { this.running = true; this.stage = 0; - for(Block ped:this.pedestals) { - Item itm = AncientAltarListener.findItem(ped); - this.itemLock.put(itm, itm.getLocation().clone()); + + for (Block pedestal: this.pedestals) { + Item item = AncientAltarListener.findItem(pedestal); + this.itemLock.put(item, item.getLocation().clone()); } } @@ -55,27 +59,27 @@ public class RitualAnimation implements Runnable { public void run() { idle(); - if(!checkLockedItems()) { + if (!checkLockedItems()) { abort(); return; } - if(this.stage == 36) { + if (this.stage == 36) { finish(); return; } - if(this.stage > 0 && this.stage % 4 == 0) { + if (this.stage > 0 && this.stage % 4 == 0) { checkPedestal(pedestals.get(this.stage / 4 - 1)); } this.stage += 1; - SlimefunStartup.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, this, 8); + SlimefunPlugin.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, this, 8); } private boolean checkLockedItems() { - for (Item item : this.itemLock.keySet()) { - if (item.getLocation().distance(this.itemLock.get(item)) > 0.3) { + for (Map.Entry entry: itemLock.entrySet()) { + if (entry.getKey().getLocation().distance(entry.getValue()) > 0.3) { return false; } } @@ -92,8 +96,8 @@ public class RitualAnimation implements Runnable { l.getWorld().spawnParticle(Particle.ENCHANTMENT_TABLE, l2,16, 0.3F, 0.2F, 0.3F); l.getWorld().spawnParticle(Particle.CRIT_MAGIC,l2,8, 0.3F, 0.2F, 0.3F); } - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while playing Ritual Animation for Slimefun " + Slimefun.getVersion(), x); } } @@ -111,25 +115,23 @@ public class RitualAnimation implements Runnable { try { l.getWorld().spawnParticle(Particle.ENCHANTMENT_TABLE,pedestal.getLocation().add(0.5, 1.5, 0.5),16, 0.3F, 0.2F, 0.3F); l.getWorld().spawnParticle(Particle.CRIT_MAGIC,pedestal.getLocation().add(0.5, 1.5, 0.5), 8,0.3F, 0.2F, 0.3F); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while playing Pedestal Animation for Slimefun " + Slimefun.getVersion(), x); } itemLock.remove(item); item.remove(); - pedestal.removeMetadata("item_placed", SlimefunStartup.instance); + pedestal.removeMetadata("item_placed", SlimefunPlugin.instance); } } private void abort() { running = false; + pedestals.forEach(b -> utilities.altarinuse.remove(b.getLocation())); - pedestals.forEach((pblock)-> { - Variables.altarinuse.remove(pblock.getLocation()); - }); - - Variables.altarinuse.remove(altar.getLocation()); // should re-enable altar blocks on craft failure. + // This should re-enable altar blocks on craft failure. + utilities.altarinuse.remove(altar.getLocation()); l.getWorld().playSound(l, Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 5F, 1F); itemLock.clear(); altars.remove(altar); @@ -141,10 +143,10 @@ public class RitualAnimation implements Runnable { l.getWorld().playEffect(l, Effect.STEP_SOUND, Material.EMERALD_BLOCK); l.getWorld().dropItemNaturally(l.add(0, 1, 0), output); - pedestals.forEach((pblock)->{ - Variables.altarinuse.remove(pblock.getLocation()); - }); - Variables.altarinuse.remove(altar.getLocation()); // should re-enable altar blocks on craft completion. + pedestals.forEach(b -> utilities.altarinuse.remove(b.getLocation())); + + // This should re-enable altar blocks on craft completion. + utilities.altarinuse.remove(altar.getLocation()); altars.remove(altar); } else { diff --git a/src/me/mrCookieSlime/Slimefun/Android/AndroidObject.java b/src/me/mrCookieSlime/Slimefun/androids/AndroidObject.java similarity index 74% rename from src/me/mrCookieSlime/Slimefun/Android/AndroidObject.java rename to src/me/mrCookieSlime/Slimefun/androids/AndroidObject.java index 0ce2ca259..9f4d60d25 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/AndroidObject.java +++ b/src/me/mrCookieSlime/Slimefun/androids/AndroidObject.java @@ -1,11 +1,11 @@ -package me.mrCookieSlime.Slimefun.Android; +package me.mrCookieSlime.Slimefun.androids; import org.bukkit.block.Block; public class AndroidObject { - ProgrammableAndroid android; - Block b; + private ProgrammableAndroid android; + private Block b; public AndroidObject(ProgrammableAndroid android, Block b) { this.android = android; diff --git a/src/me/mrCookieSlime/Slimefun/Android/AndroidType.java b/src/me/mrCookieSlime/Slimefun/androids/AndroidType.java similarity index 53% rename from src/me/mrCookieSlime/Slimefun/Android/AndroidType.java rename to src/me/mrCookieSlime/Slimefun/androids/AndroidType.java index 083a7614a..fdb72441f 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/AndroidType.java +++ b/src/me/mrCookieSlime/Slimefun/androids/AndroidType.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Android; +package me.mrCookieSlime.Slimefun.androids; public enum AndroidType { @@ -12,7 +12,7 @@ public enum AndroidType { NON_FIGHTER; public boolean isType(AndroidType type) { - return type.equals(NONE) || type.equals(this) || (type.equals(NON_FIGHTER) && !this.equals(FIGHTER)); + return type == NONE || type == this || (type == NON_FIGHTER && this != FIGHTER); } } diff --git a/src/me/mrCookieSlime/Slimefun/androids/ProgrammableAndroid.java b/src/me/mrCookieSlime/Slimefun/androids/ProgrammableAndroid.java new file mode 100644 index 000000000..e615a2e43 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/androids/ProgrammableAndroid.java @@ -0,0 +1,1069 @@ +package me.mrCookieSlime.Slimefun.androids; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import java.util.function.Predicate; +import java.util.logging.Level; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.block.Skull; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.Rotatable; +import org.bukkit.entity.Animals; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; + +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; +import me.mrCookieSlime.CSCoreLibPlugin.general.Block.TreeCalculator; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; +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.MenuHelper; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; +import me.mrCookieSlime.ExoticGarden.ExoticGarden; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +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.MachineFuel; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.androids.comparators.ScriptReputationSorter; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; +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.holograms.AndroidHologram; + +public abstract class ProgrammableAndroid extends SlimefunItem implements InventoryBlock { + + private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 18, 24, 25, 26, 27, 33, 35, 36, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; + private static final int[] border_out = {10, 11, 12, 13, 14, 19, 23, 28, 32, 37, 38, 39, 40, 41}; + + private static final ItemStack[] fish = new ItemStack[] {new ItemStack(Material.COD), new ItemStack(Material.SALMON), new ItemStack(Material.PUFFERFISH), new ItemStack(Material.TROPICAL_FISH), new ItemStack(Material.STRING), new ItemStack(Material.BONE), new ItemStack(Material.STICK)}; + + private static final List directions = Arrays.asList(BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST); + private static final List blockblacklist = new ArrayList<>(); + + + static { + blockblacklist.add(Material.BEDROCK); + blockblacklist.add(Material.BARRIER); + blockblacklist.add(Material.END_PORTAL_FRAME); + blockblacklist.add(Material.END_PORTAL); + blockblacklist.add(Material.NETHER_PORTAL); + blockblacklist.add(Material.COMMAND_BLOCK); + blockblacklist.add(Material.CHAIN_COMMAND_BLOCK); + blockblacklist.add(Material.REPEATING_COMMAND_BLOCK); + blockblacklist.add(Material.STRUCTURE_BLOCK); + } + + private Set recipes = new HashSet<>(); + private Random random = new Random(); + + public String getInventoryTitle() { + return "Programmable Android"; + } + + @Override + public int[] getInputSlots() { + return new int[0]; + } + + @Override + public int[] getOutputSlots() { + return new int[] {20, 21, 22, 29, 30, 31}; + } + + public abstract AndroidType getAndroidType(); + public abstract float getFuelEfficiency(); + public abstract int getTier(); + + public ProgrammableAndroid(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, name, recipeType, recipe); + + if (getTier() == 1) { + registerFuel(new MachineFuel(80, new ItemStack(Material.COAL))); + registerFuel(new MachineFuel(80, new ItemStack(Material.CHARCOAL))); + registerFuel(new MachineFuel(800, new ItemStack(Material.COAL_BLOCK))); + registerFuel(new MachineFuel(45, new ItemStack(Material.BLAZE_ROD))); + + // Logs + registerFuel(new MachineFuel(4, new ItemStack(Material.OAK_LOG))); + registerFuel(new MachineFuel(4, new ItemStack(Material.BIRCH_LOG))); + registerFuel(new MachineFuel(4, new ItemStack(Material.SPRUCE_LOG))); + registerFuel(new MachineFuel(4, new ItemStack(Material.JUNGLE_LOG))); + registerFuel(new MachineFuel(4, new ItemStack(Material.DARK_OAK_LOG))); + registerFuel(new MachineFuel(4, new ItemStack(Material.ACACIA_LOG))); + + // Wooden Planks + registerFuel(new MachineFuel(1, new ItemStack(Material.OAK_PLANKS))); + registerFuel(new MachineFuel(1, new ItemStack(Material.BIRCH_PLANKS))); + registerFuel(new MachineFuel(1, new ItemStack(Material.SPRUCE_PLANKS))); + registerFuel(new MachineFuel(1, new ItemStack(Material.JUNGLE_PLANKS))); + registerFuel(new MachineFuel(1, new ItemStack(Material.DARK_OAK_PLANKS))); + registerFuel(new MachineFuel(1, new ItemStack(Material.ACACIA_PLANKS))); + } + else if (getTier() == 2){ + registerFuel(new MachineFuel(100, new ItemStack(Material.LAVA_BUCKET))); + registerFuel(new MachineFuel(200, SlimefunItems.BUCKET_OF_OIL)); + registerFuel(new MachineFuel(500, SlimefunItems.BUCKET_OF_FUEL)); + } + else { + registerFuel(new MachineFuel(2500, SlimefunItems.URANIUM)); + registerFuel(new MachineFuel(1200, SlimefunItems.NEPTUNIUM)); + registerFuel(new MachineFuel(3000, SlimefunItems.BOOSTED_URANIUM)); + } + + new BlockMenuPreset(name, getInventoryTitle()) { + + @Override + public void init() { + try { + constructMenu(this); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while constructing an Android Inventory for Slimefun " + Slimefun.getVersion(), x); + } + } + + @Override + public boolean canOpen(Block b, Player p) { + boolean open = BlockStorage.getLocationInfo(b.getLocation(), "owner").equals(p.getUniqueId().toString()) || p.hasPermission("slimefun.android.bypass"); + if (!open) { + Messages.local.sendTranslation(p, "inventory.no-access", true); + } + return open; + } + + @Override + public void newInstance(BlockMenu menu, final Block b) { + try { + menu.replaceExistingItem(15, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTAxYzdiNTcyNjE3ODk3NGIzYjNhMDFiNDJhNTkwZTU0MzY2MDI2ZmQ0MzgwOGYyYTc4NzY0ODg0M2E3ZjVhIn19fQ=="), "&aStart/Continue")); + menu.addMenuClickHandler(15, (p, slot, item, action) -> { + Messages.local.sendTranslation(p, "robot.started", true); + BlockStorage.addBlockInfo(b, "paused", "false"); + p.closeInventory(); + return false; + }); + + menu.replaceExistingItem(17, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTYxMzlmZDFjNTY1NGU1NmU5ZTRlMmM4YmU3ZWIyYmQ1YjQ5OWQ2MzM2MTY2NjNmZWVlOTliNzQzNTJhZDY0In19fQ=="), "&4Pause")); + menu.addMenuClickHandler(17, (p, slot, item, action) -> { + BlockStorage.addBlockInfo(b, "paused", "true"); + Messages.local.sendTranslation(p, "robot.stopped", true); + return false; + }); + + menu.replaceExistingItem(16, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDc4ZjJiN2U1ZTc1NjM5ZWE3ZmI3OTZjMzVkMzY0YzRkZjI4YjQyNDNlNjZiNzYyNzdhYWRjZDYyNjEzMzcifX19"), "&bMemory Core", "", "&8\u21E8 &7Click to open the Script Editor")); + menu.addMenuClickHandler(16, (p, slot, item, action) -> { + BlockStorage.addBlockInfo(b, "paused", "true"); + Messages.local.sendTranslation(p, "robot.stopped", true); + openScriptEditor(p, b); + return false; + }); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a new Instance of an Android Inventory for Slimefun " + Slimefun.getVersion(), x); + } + } + + @Override + public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { + return new int[0]; + } + }; + + registerBlockHandler(name, new SlimefunBlockHandler() { + + @Override + public void onPlace(Player p, Block b, SlimefunItem item) { + BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString()); + BlockStorage.addBlockInfo(b, "script", "START-TURN_LEFT-REPEAT"); + BlockStorage.addBlockInfo(b, "index", "0"); + BlockStorage.addBlockInfo(b, "fuel", "0"); + BlockStorage.addBlockInfo(b, "rotation", p.getFacing().getOppositeFace().toString()); + BlockStorage.addBlockInfo(b, "paused", "true"); + b.setType(Material.PLAYER_HEAD); + Rotatable blockData = (Rotatable) b.getBlockData(); + blockData.setRotation(p.getFacing()); + b.setBlockData(blockData); + } + + @Override + public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { + boolean allow = reason == UnregisterReason.PLAYER_BREAK && (BlockStorage.getLocationInfo(b.getLocation(), "owner").equals(p.getUniqueId().toString()) || p.hasPermission("slimefun.android.bypass")); + + if (allow) { + BlockMenu inv = BlockStorage.getInventory(b); + if (inv != null) { + if (inv.getItemInSlot(43) != null) { + b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(43)); + inv.replaceExistingItem(43, null); + } + for (int slot: getOutputSlots()) { + if (inv.getItemInSlot(slot) != null) { + b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); + inv.replaceExistingItem(slot, null); + } + } + } + AndroidHologram.remove(b); + } + + return allow; + } + }); + } + + protected void tick(Block b) { + if (!(b.getState() instanceof Skull)) { + // The Android was destroyed or moved. + return; + } + + if (BlockStorage.getLocationInfo(b.getLocation(), "paused").equals("false")) { + float fuel = Float.parseFloat(BlockStorage.getLocationInfo(b.getLocation(), "fuel")); + if (fuel < 0.001) { + ItemStack item = BlockStorage.getInventory(b).getItemInSlot(43); + + if (item != null) { + for (MachineFuel recipe: recipes) { + if (SlimefunManager.isItemSimiliar(item, recipe.getInput(), true)) { + BlockStorage.getInventory(b).replaceExistingItem(43, InvUtils.decreaseItem(item, 1)); + + if (getTier() == 2) { + pushItems(b, new ItemStack(Material.BUCKET)); + } + + BlockStorage.addBlockInfo(b, "fuel", String.valueOf((int) (recipe.getTicks() * this.getFuelEfficiency()))); + break; + } + } + } + } + else { + String[] script = BlockStorage.getLocationInfo(b.getLocation(), "script").split("-"); + int index = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "index")) + 1; + if (index >= script.length) index = 0; + + boolean refresh = true; + BlockStorage.addBlockInfo(b, "fuel", String.valueOf(fuel - 1)); + ScriptPart part = ScriptPart.valueOf(script[index]); + + if (getAndroidType().isType(part.getRequiredType())) { + BlockFace face = BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation")); + double damage = getTier() < 2 ? 20D : 4D * getTier(); + + switch (part) { + case GO_DOWN: + move(b, face, b.getRelative(BlockFace.DOWN)); + break; + case GO_FORWARD: + move(b, face, b.getRelative(face)); + break; + case GO_UP: + move(b, face, b.getRelative(BlockFace.UP)); + break; + case REPEAT: + BlockStorage.addBlockInfo(b, "index", String.valueOf(0)); + break; + case TURN_LEFT: + int indexLeft = directions.indexOf(BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) - 1; + if (indexLeft < 0) indexLeft = directions.size() - 1; + Rotatable rotatableLeft = (Rotatable) b.getBlockData(); + rotatableLeft.setRotation(directions.get(indexLeft)); + b.setBlockData(rotatableLeft); + BlockStorage.addBlockInfo(b, "rotation", directions.get(indexLeft).toString()); + break; + case TURN_RIGHT: + int indexRight = directions.indexOf(BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) + 1; + if (indexRight == directions.size()) indexRight = 0; + Rotatable rotatableRight = (Rotatable) b.getBlockData(); + rotatableRight.setRotation(directions.get(indexRight)); + b.setBlockData(rotatableRight); + BlockStorage.addBlockInfo(b, "rotation", directions.get(indexRight).toString()); + break; + case DIG_FORWARD: + mine(b, b.getRelative(face)); + break; + case DIG_UP: + mine(b, b.getRelative(BlockFace.UP)); + break; + case DIG_DOWN: + mine(b, b.getRelative(BlockFace.DOWN)); + break; + case CATCH_FISH: + Block water = b.getRelative(BlockFace.DOWN); + if (water.getType() == Material.WATER) { + water.getWorld().playSound(water.getLocation(), Sound.ENTITY_PLAYER_SPLASH, 1F, 1F); + if (random.nextInt(100) < 10 * getTier()) { + ItemStack drop = fish[random.nextInt(fish.length)]; + if (fits(b, drop)) pushItems(b, drop); + } + + } + break; + case MOVE_AND_DIG_FORWARD: + movedig(b, face, b.getRelative(face)); + break; + case MOVE_AND_DIG_UP: + movedig(b, face, b.getRelative(BlockFace.UP)); + break; + case MOVE_AND_DIG_DOWN: + movedig(b, face, b.getRelative(BlockFace.DOWN)); + break; + case INTERFACE_ITEMS: + if (BlockStorage.check(b.getRelative(face), "ANDROID_INTERFACE_ITEMS") && b.getRelative(face).getState() instanceof Dispenser) { + Dispenser d = (Dispenser) b.getRelative(face).getState(); + for (int slot: getOutputSlots()) { + ItemStack stack = BlockStorage.getInventory(b).getItemInSlot(slot); + if (stack != null) { + Optional optional = d.getInventory().addItem(stack).values().stream().findFirst(); + + if (optional.isPresent()) { + BlockStorage.getInventory(b).replaceExistingItem(slot, optional.get()); + } + else { + BlockStorage.getInventory(b).replaceExistingItem(slot, null); + } + } + } + } + break; + case INTERFACE_FUEL: + if (BlockStorage.check(b.getRelative(face), "ANDROID_INTERFACE_FUEL") && b.getRelative(face).getState() instanceof Dispenser) { + Dispenser d = (Dispenser) b.getRelative(face).getState(); + for (int slot = 0; slot < 9; slot++) { + ItemStack item = d.getInventory().getItem(slot); + if (item != null) { + if (BlockStorage.getInventory(b).getItemInSlot(43) == null) { + BlockStorage.getInventory(b).replaceExistingItem(43, item); + d.getInventory().setItem(slot, null); + break; + } + else if (SlimefunManager.isItemSimiliar(item, BlockStorage.getInventory(b).getItemInSlot(43), true)) { + int rest = item.getType().getMaxStackSize() - BlockStorage.getInventory(b).getItemInSlot(43).getAmount(); + if (rest > 0) { + int amt = item.getAmount() > rest ? rest: item.getAmount(); + BlockStorage.getInventory(b).replaceExistingItem(43, new CustomItem(item, BlockStorage.getInventory(b).getItemInSlot(43).getAmount() + amt)); + d.getInventory().setItem(slot, InvUtils.decreaseItem(item, amt)); + } + break; + } + } + } + } + break; + case FARM_FORWARD: + farm(b, b.getRelative(face)); + break; + case FARM_DOWN: + farm(b, b.getRelative(BlockFace.DOWN)); + break; + case FARM_EXOTIC_FORWARD: + exoticFarm(b, b.getRelative(face)); + break; + case FARM_EXOTIC_DOWN: + exoticFarm(b, b.getRelative(BlockFace.DOWN)); + break; + case CHOP_TREE: + if (MaterialHelper.isLog(b.getRelative(face).getType())) { + List list = new ArrayList<>(); + list.add(b.getRelative(face).getLocation()); + TreeCalculator.getTree(b.getRelative(face).getLocation(), b.getRelative(face).getLocation(), list); + if (!list.isEmpty()) { + refresh = false; + Block log = list.get(list.size() - 1).getBlock(); + Collection drops = log.getDrops(); + log.getWorld().playEffect(log.getLocation(), Effect.STEP_SOUND, log.getType()); + + if (!drops.isEmpty() && CSCoreLib.getLib().getProtectionManager().canBuild(UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), log)) { + ItemStack[] items = drops.toArray(new ItemStack[drops.size()]); + + if (fits(b, items)) { + pushItems(b, items); + log.getWorld().playEffect(log.getLocation(), Effect.STEP_SOUND, log.getType()); + + if (log.getY() == b.getRelative(face).getY()) { + log.setType(MaterialHelper.getSaplingFromLog(log.getType())); + } + else log.setType(Material.AIR); + } + + } + } + } + break; + case ATTACK_MOBS_ANIMALS: + killEntities(b, damage, e -> true); + break; + case ATTACK_MOBS: + killEntities(b, damage, e -> e instanceof Monster); + break; + case ATTACK_ANIMALS: + killEntities(b, damage, e -> e instanceof Animals); + break; + case ATTACK_ANIMALS_ADULT: + killEntities(b, damage, e -> e instanceof Animals && e instanceof org.bukkit.entity.Ageable && ((org.bukkit.entity.Ageable) e).isAdult()); + break; + default: + break; + } + } + if (refresh) BlockStorage.addBlockInfo(b, "index", String.valueOf(index)); + } + } + } + + private void killEntities(Block b, double damage, Predicate predicate) { + for (Entity n: AndroidHologram.getNearbyEntities(b, 4D + getTier())) { + if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && predicate.test(n)) { + boolean attack = false; + + switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) { + case NORTH: + attack = n.getLocation().getZ() < b.getZ(); + break; + case EAST: + attack = n.getLocation().getX() > b.getX(); + break; + case SOUTH: + attack = n.getLocation().getZ() > b.getZ(); + break; + case WEST: + attack = n.getLocation().getX() < b.getX(); + break; + default: + break; + } + + if (attack) { + if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunPlugin.instance); + n.setMetadata("android_killer", new FixedMetadataValue(SlimefunPlugin.instance, new AndroidObject(this, b))); + + ((LivingEntity) n).damage(damage); + break; + } + } + } + } + + private void move(Block b, BlockFace face, Block block) { + if (block.getY() > 0 && block.getY() < block.getWorld().getMaxHeight() && (block.getType() == Material.AIR || block.getType() == Material.CAVE_AIR)) { + block.setType(Material.PLAYER_HEAD); + Rotatable blockData = (Rotatable) block.getBlockData(); + blockData.setRotation(face.getOppositeFace()); + block.setBlockData(blockData); + + try { + CustomSkull.setSkull(block, CustomSkull.getTexture(getItem())); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while moving an Android for Slimefun " + Slimefun.getVersion(), x); + } + + b.setType(Material.AIR); + BlockStorage.moveBlockInfo(b.getLocation(), block.getLocation()); + } + } + + private void mine(Block b, Block block) { + Collection drops = block.getDrops(); + if (!blockblacklist.contains(block.getType()) && !drops.isEmpty() && CSCoreLib.getLib().getProtectionManager().canBuild(UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), block)) { + String item = BlockStorage.checkID(block); + + if (item == null) { + ItemStack[] items = drops.toArray(new ItemStack[drops.size()]); + if (fits(b, items)) { + pushItems(b, items); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + block.setType(Material.AIR); + } + } + /* + else if (fits(b, item.getItem())) { + if (SlimefunItem.blockhandler.containsKey(item.getID())) { + if (SlimefunItem.blockhandler.get(item.getID()).onBreak(null, block, item, UnregisterReason.ANDROID_DIG)) { + pushItems(b, BlockStorage.retrieve(block)); + if (SlimefunItem.blockhandler.containsKey(item.getID())) SlimefunItem.blockhandler.get(item.getID()).onBreak(null, block, item, UnregisterReason.ANDROID_DIG); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + block.setType(Material.AIR); + } + } + }*/ + } + } + + + private void movedig(Block b, BlockFace face, Block block) { + Collection drops = block.getDrops(); + if (!blockblacklist.contains(block.getType()) && !drops.isEmpty() && CSCoreLib.getLib().getProtectionManager().canBuild(UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), block)) { + SlimefunItem item = BlockStorage.check(block); + if (item != null) { + if (fits(b, item.getItem()) && SlimefunPlugin.getUtilities().blockHandlers.containsKey(item.getID()) && SlimefunPlugin.getUtilities().blockHandlers.get(item.getID()).onBreak(null, block, item, UnregisterReason.ANDROID_DIG)) { + pushItems(b, BlockStorage.retrieve(block)); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + + block.setType(Material.AIR); + move(b, face, block); + + b.setType(Material.AIR); + BlockStorage.moveBlockInfo(b.getLocation(), block.getLocation()); + } + } + else { + ItemStack[] items = drops.toArray(new ItemStack[drops.size()]); + if (fits(b, items)) { + pushItems(b, items); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + + block.setType(Material.AIR); + move(b, face, block); + + b.setType(Material.AIR); + BlockStorage.moveBlockInfo(b.getLocation(), block.getLocation()); + } + } + } + else { + move(b, face, block); + } + } + + private boolean isFullGrown(Block block){ + if (!(block.getBlockData() instanceof Ageable)) return false; + Ageable ageable = ((Ageable) block.getBlockData()); + return ageable.getAge() >= ageable.getMaximumAge(); + } + + private void farm(Block b, Block block) { + if (isFullGrown(block)) { + ItemStack drop = null; + switch (block.getType()) { + case WHEAT: + drop = new ItemStack(Material.WHEAT, random.nextInt(2) + 1); + break; + case POTATOES: + drop = new ItemStack(Material.POTATO, random.nextInt(3) + 1); + break; + case CARROTS: + drop = new ItemStack(Material.CARROT, random.nextInt(3) + 1); + break; + case BEETROOTS: + drop = new ItemStack(Material.BEETROOT, random.nextInt(3) + 1); + break; + case COCOA: + drop = new ItemStack(Material.COCOA_BEANS, random.nextInt(3) + 1); + break; + case NETHER_WART: + drop = new ItemStack(Material.NETHER_WART, random.nextInt(3) + 1); + break; + case SWEET_BERRY_BUSH: + drop = new ItemStack(Material.SWEET_BERRIES, random.nextInt(3) + 1); + break; + default: + break; + } + + if (drop != null && fits(b, drop)) { + pushItems(b, drop); + Ageable ageable = (Ageable) block.getBlockData(); + ageable.setAge(0); + block.setBlockData(ageable); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + } + + private void exoticFarm(Block b, Block block) { + farm(b, block); + if (SlimefunPlugin.getHooks().isExoticGardenInstalled()) { + ItemStack drop = ExoticGarden.harvestPlant(block); + if (drop != null && fits(b, drop)) { + pushItems(b, drop); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + } + + private void constructMenu(BlockMenuPreset preset) throws Exception { + 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); + } + + 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; + } + }); + } + + if (getTier() == 1) { + preset.addItem(34, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&8\u21E9 &cFuel Input &8\u21E9", "", "&rThis Android runs on solid Fuel", "&re.g. Coal, Wood, etc..."), (p, slot, item, action) -> false); + } + else if (getTier() == 2){ + preset.addItem(34, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&8\u21E9 &cFuel Input &8\u21E9", "", "&rThis Android runs on liquid Fuel", "&re.g. Lava, Oil, Fuel, etc..."), (p, slot, item, action) -> false); + } + else { + preset.addItem(34, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&8\u21E9 &cFuel Input &8\u21E9", "", "&rThis Android runs on radioactive Fuel", "&re.g. Uranium, Neptunium or Boosted Uranium"), (p, slot, item, action) -> false); + } + } + + public void openScriptEditor(Player p, final Block b) { + ChestMenu menu = new ChestMenu("&eScript Editor"); + + try { + menu.addItem(1, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDliZjZkYjRhZWRhOWQ4ODIyYjlmNzM2NTM4ZThjMThiOWE0ODQ0Zjg0ZWI0NTUwNGFkZmJmZWU4N2ViIn19fQ=="), "&2> Edit Script", "", "&aEdits your current Script")); + menu.addMenuClickHandler(1, (pl, slot, item, action) -> { + openScript(pl, b, BlockStorage.getLocationInfo(b.getLocation(), "script")); + return false; + }); + + menu.addItem(3, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTcxZDg5NzljMTg3OGEwNTk4N2E3ZmFmMjFiNTZkMWI3NDRmOWQwNjhjNzRjZmZjZGUxZWExZWRhZDU4NTIifX19"), "&4> Create new Script", "", "&cDeletes your current Script", "&cand creates a blank one")); + menu.addMenuClickHandler(3, (pl, slot, item, action) -> { + openScript(pl, b, "START-TURN_LEFT-REPEAT"); + return false; + }); + + menu.addItem(5, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzAxNTg2ZTM5ZjZmZmE2M2I0ZmIzMDFiNjVjYTdkYThhOTJmNzM1M2FhYWI4OWQzODg2NTc5MTI1ZGZiYWY5In19fQ=="), "&6> Download a Script", "", "&eDownload a Script from the Server", "&eYou can edit or simply use it")); + menu.addMenuClickHandler(5, (pl, slot, item, action) -> { + openScriptDownloader(pl, b, 1); + return false; + }); + + menu.addItem(8, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTE4NWM5N2RiYjgzNTNkZTY1MjY5OGQyNGI2NDMyN2I3OTNhM2YzMmE5OGJlNjdiNzE5ZmJlZGFiMzVlIn19fQ=="), "&6> Back", "", "&7Return to the Android's interface")); + menu.addMenuClickHandler(8, (pl, slot, item, action) -> { + BlockStorage.getInventory(b).open(p); + return false; + }); + } + catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Script Editor for Slimefun " + Slimefun.getVersion(), x); + } + + menu.open(p); + } + + public void openScript(final Player p, final Block b, final String script) { + ChestMenu menu = new ChestMenu("&eScript Editor"); + final String[] commands = script.split("-"); + + menu.addItem(0, new CustomItem(ScriptPart.START.toItemStack(), ScriptPart.START.toItemStack().getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to return to the Android's interface")); + menu.addMenuClickHandler(0, (pl, slot, item, action) -> { + BlockStorage.getInventory(b).open(pl); + return false; + }); + + for (int i = 1; i < commands.length; i++) { + final int index = i; + + if (i == commands.length - 1) { + int additional = commands.length == 54 ? 0: 1; + + if (additional == 1) { + try { + menu.addItem(i, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTcxZDg5NzljMTg3OGEwNTk4N2E3ZmFmMjFiNTZkMWI3NDRmOWQwNjhjNzRjZmZjZGUxZWExZWRhZDU4NTIifX19"), "&7> Add new Command")); + menu.addMenuClickHandler(i, (pl, slot, item, action) -> { + openScriptComponentEditor(pl, b, script, index); + return false; + }); + } + catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Script Editor for Slimefun " + Slimefun.getVersion(), x); + } + } + + menu.addItem(i + additional, new CustomItem(ScriptPart.REPEAT.toItemStack(), ScriptPart.REPEAT.toItemStack().getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to return to the Android's interface")); + menu.addMenuClickHandler(i + additional, (pl, slot, item, action) -> { + BlockStorage.getInventory(b).open(pl); + return false; + }); + } + else { + ItemStack stack = ScriptPart.valueOf(commands[i]).toItemStack(); + menu.addItem(i, new CustomItem(stack, stack.getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to edit", "&7\u21E8 &eRight Click &7to delete", "&7\u21E8 &eShift + Right Click &7to duplicate")); + menu.addMenuClickHandler(i, (pl, slot, item, action) -> { + if (action.isRightClicked() && action.isShiftClicked()) { + if (commands.length == 54) return false; + + int j = 0; + StringBuilder builder = new StringBuilder("START-"); + for (String command : commands) { + if (j > 0) { + if (j == index) { + builder.append(commands[j] + "-"); + builder.append(commands[j] + "-"); + } + else if (j < commands.length - 1) builder.append(command + "-"); + } + j++; + } + builder.append("REPEAT"); + BlockStorage.addBlockInfo(b, "script", builder.toString()); + + openScript(pl, b, builder.toString()); + } + else if (action.isRightClicked()) { + int j = 0; + StringBuilder builder = new StringBuilder("START-"); + for (String command : commands) { + if (j != index && j > 0 && j < commands.length - 1) builder.append(command + "-"); + j++; + } + builder.append("REPEAT"); + BlockStorage.addBlockInfo(b, "script", builder.toString()); + + openScript(pl, b, builder.toString()); + } + else { + openScriptComponentEditor(pl, b, script, index); + } + return false; + }); + } + } + + menu.open(p); + } + + private void openScriptDownloader(final Player p, final Block b, final int page) { + final ChestMenu menu = new ChestMenu("Android Scripts"); + + menu.addMenuOpeningHandler(pl -> pl.playSound(pl.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 0.7F, 0.7F)); + + List scripts = getUploadedScripts(); + + int index = 0; + final int pages = (scripts.size() / 45) + 1; + + for (int i = 45; i < 54; i++) { + menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " ")); + menu.addMenuClickHandler(i, (pl, slot, item, action) -> false); + } + + menu.addItem(46, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&r\u21E6 Previous Page", "", "&7(" + page + " / " + pages + ")")); + menu.addMenuClickHandler(46, (pl, slot, item, action) -> { + int next = page - 1; + if (next < 1) next = pages; + if (next != page) { + openScriptDownloader(pl, b, next); + } + return false; + }); + + try { + menu.addItem(48, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTA1YTJjYWI4YjY4ZWE1N2UzYWY5OTJhMzZlNDdjOGZmOWFhODdjYzg3NzYyODE5NjZmOGMzY2YzMWEzOCJ9fX0="), "&eUpload a Script", "", "&6Click &7to upload your Android's Script", "&7to the Database")); + menu.addMenuClickHandler(48, (pl, slot, item, action) -> { + final String code = BlockStorage.getLocationInfo(b.getLocation(), "script"); + int num = 1; + + for (Config script: getUploadedScripts()) { + if (script.getString("author").equals(pl.getUniqueId().toString())) num++; + if (script.getString("code").equals(code)) { + Messages.local.sendTranslation(pl, "android.scripts.already-uploaded", true); + return false; + } + } + + final int id = num; + + pl.closeInventory(); + Messages.local.sendTranslation(pl, "android.scripts.enter-name", true); + + MenuHelper.awaitChatInput(pl, (player, message) -> { + Config script = new Config("plugins/Slimefun/scripts/" + getAndroidType().toString() + "/" + p.getName() + " " + id + ".sfs"); + + script.setValue("author", player.getUniqueId().toString()); + script.setValue("author_name", player.getName()); + script.setValue("name", ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', message))); + script.setValue("code", code); + script.setValue("downloads", 0); + script.setValue("android", getAndroidType().toString()); + script.setValue("rating.positive", new ArrayList()); + script.setValue("rating.negative", new ArrayList()); + script.save(); + + Messages.local.sendTranslation(player, "android.uploaded", true); + openScriptDownloader(player, b, page); + + return false; + }); + return false; + }); + + menu.addItem(50, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&rNext Page \u21E8", "", "&7(" + page + " / " + pages + ")")); + menu.addMenuClickHandler(50, (pl, slot, item, action) -> { + int next = page + 1; + if (next > pages) next = 1; + if (next != page) { + openScriptDownloader(pl, b, next); + } + return false; + }); + + menu.addItem(53, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTE4NWM5N2RiYjgzNTNkZTY1MjY5OGQyNGI2NDMyN2I3OTNhM2YzMmE5OGJlNjdiNzE5ZmJlZGFiMzVlIn19fQ=="), "&6> Back", "", "&7Return to the Android's interface")); + menu.addMenuClickHandler(53, (pl, slot, item, action) -> { + openScriptEditor(pl, b); + return false; + }); + } + catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Script Download Menu for Slimefun " + Slimefun.getVersion(), x); + } + + int categoryIndex = 45 * (page - 1); + + for (int i = 0; i < 45; i++) { + int target = categoryIndex + i; + if (target >= scripts.size()) break; + else { + final Config script = scripts.get(target); + + OfflinePlayer op = Bukkit.getOfflinePlayer(script.getUUID("author")); + String author = (op != null && op.getName() != null) ? op.getName(): script.getString("author_name"); + + if (script.getString("author").equals(p.getUniqueId().toString())) { + menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)")); + } + else { + menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)", "&eShift + Left Click &rto leave a positive Rating", "&eShift + Right Click &rto leave a negative Rating")); + } + + menu.addMenuClickHandler(index, (pl, slot, item, action) -> { + Config script2 = new Config(script.getFile()); + + if (action.isShiftClicked()) { + if (script2.getString("author").equals(pl.getUniqueId().toString())) { + Messages.local.sendTranslation(pl, "android.scripts.rating.own", true); + } + else if (action.isRightClicked()) { + if (!script2.getStringList("rating.negative").contains(pl.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(pl.getUniqueId().toString())) { + List list = script2.getStringList("rating.negative"); + list.add(p.getUniqueId().toString()); + + script2.setValue("rating.negative", list); + script2.save(); + + openScriptDownloader(pl, b, page); + } + else { + Messages.local.sendTranslation(pl, "android.scripts.rating.already", true); + } + } + else { + if (!script2.getStringList("rating.negative").contains(pl.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(pl.getUniqueId().toString())) { + List list = script2.getStringList("rating.positive"); + list.add(pl.getUniqueId().toString()); + + script2.setValue("rating.positive", list); + script2.save(); + + openScriptDownloader(pl, b, page); + } + else { + Messages.local.sendTranslation(pl, "android.scripts.rating.already", true); + } + } + } + else if (!action.isRightClicked()) { + script2.setValue("downloads", script2.getInt("downloads") + 1); + script2.save(); + + BlockStorage.addBlockInfo(b, "script", script2.getString("code")); + openScriptEditor(pl, b); + } + return false; + }); + + index++; + } + } + + menu.open(p); + } + + public float getScriptRating(Config script) { + int positive = getScriptRating(script, true) + 1; + int negative = getScriptRating(script, false); + return Math.round((positive / (double) (positive + negative)) * 100.0F) / 100.0F; + } + + private int getScriptRating(Config script, boolean positive) { + if (positive) return script.getStringList("rating.positive").size(); + else return script.getStringList("rating.negative").size(); + } + + private String getScriptRatingPercentage(Config script) { + String progress = String.valueOf(getScriptRating(script)); + if (Float.parseFloat(progress) < 16.0F) progress = "&4" + progress + "&r% "; + else if (Float.parseFloat(progress) < 32.0F) progress = "&c" + progress + "&r% "; + else if (Float.parseFloat(progress) < 48.0F) progress = "&6" + progress + "&r% "; + else if (Float.parseFloat(progress) < 64.0F) progress = "&e" + progress + "&r% "; + else if (Float.parseFloat(progress) < 80.0F) progress = "&2" + progress + "&r% "; + else progress = "&a" + progress + "&r% "; + + return progress; + } + + protected void openScriptComponentEditor(Player p, final Block b, final String script, final int index) { + ChestMenu menu = new ChestMenu("&eScript Editor"); + + final String[] commands = script.split("-"); + + for (int i = 0; i < 9; i++) { + menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (pl, slot, item, action) -> false); + } + + try { + menu.addItem(9, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTYxMzlmZDFjNTY1NGU1NmU5ZTRlMmM4YmU3ZWIyYmQ1YjQ5OWQ2MzM2MTY2NjNmZWVlOTliNzQzNTJhZDY0In19fQ=="), "&rDo nothing"), (pl, slot, item, action) -> { + int i = 0; + StringBuilder builder = new StringBuilder("START-"); + + for (String command : commands) { + if (i != index && i > 0 && i < commands.length - 1) builder.append(command + "-"); + i++; + } + + builder.append("REPEAT"); + BlockStorage.addBlockInfo(b, "script", builder.toString()); + + openScript(p, b, builder.toString()); + return false; + }); + } + catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Script Editor for Slimefun " + Slimefun.getVersion(), x); + } + + int i = 10; + for (final ScriptPart part : getAccessibleScriptParts()) { + menu.addItem(i, part.toItemStack()); + menu.addMenuClickHandler(i, (pl, slot, item, action) -> { + int j = 0; + StringBuilder builder = new StringBuilder("START-"); + + for (String command : commands) { + if (j > 0) { + if (j == index) builder.append(part.toString() + "-"); + else if (j < commands.length - 1) builder.append(command + "-"); + } + j++; + } + + builder.append("REPEAT"); + BlockStorage.addBlockInfo(b, "script", builder.toString()); + + openScript(pl, b, builder.toString()); + return false; + }); + i++; + } + + menu.open(p); + } + + public void addItems(Block b, ItemStack... items) { + this.pushItems(b, items); + } + + @Override + public void register(boolean slimefun) { + addItemHandler(new BlockTicker() { + + @Override + public void tick(Block b, SlimefunItem sf, Config data) { + if (b != null) ProgrammableAndroid.this.tick(b); + } + + @Override + public boolean isSynchronized() { + return true; + } + }); + + super.register(slimefun); + } + + public void registerFuel(MachineFuel fuel) { + this.recipes.add(fuel); + } + + public List getUploadedScripts() { + List scripts = new ArrayList<>(); + + File directory = new File("plugins/Slimefun/scripts/" + this.getAndroidType().toString()); + if (!directory.exists()) directory.mkdirs(); + + for (File script : directory.listFiles()) { + if (script.getName().endsWith("sfs")) scripts.add(new Config(script)); + } + + if (this.getAndroidType() != AndroidType.NONE) { + File directory2 = new File("plugins/Slimefun/scripts/NONE"); + if (!directory2.exists()) directory2.mkdirs(); + + for (File script : directory2.listFiles()) { + if (script.getName().endsWith("sfs")) scripts.add(new Config(script)); + } + } + + Collections.sort(scripts, new ScriptReputationSorter(this)); + + return scripts; + } + + public List getAccessibleScriptParts() { + List list = new ArrayList<>(); + + for (final ScriptPart part : ScriptPart.values()) { + if (part != ScriptPart.START && part != ScriptPart.REPEAT && getAndroidType().isType(part.getRequiredType())) { + list.add(part); + } + } + + return list; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Android/ScriptPart.java b/src/me/mrCookieSlime/Slimefun/androids/ScriptPart.java similarity index 96% rename from src/me/mrCookieSlime/Slimefun/Android/ScriptPart.java rename to src/me/mrCookieSlime/Slimefun/androids/ScriptPart.java index f311e7364..f022af028 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/ScriptPart.java +++ b/src/me/mrCookieSlime/Slimefun/androids/ScriptPart.java @@ -1,9 +1,12 @@ -package me.mrCookieSlime.Slimefun.Android; +package me.mrCookieSlime.Slimefun.androids; + +import java.util.logging.Level; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; +import me.mrCookieSlime.Slimefun.api.Slimefun; public enum ScriptPart { @@ -63,7 +66,7 @@ public enum ScriptPart { this.type = type; this.item = new CustomItem(CustomSkull.getItem(texture), name); } catch(Exception x) { - x.printStackTrace(); + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while initializing Android-Script Texture for Slimefun " + Slimefun.getVersion(), x); } } diff --git a/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptDownloadSorter.java b/src/me/mrCookieSlime/Slimefun/androids/comparators/ScriptDownloadSorter.java similarity index 64% rename from src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptDownloadSorter.java rename to src/me/mrCookieSlime/Slimefun/androids/comparators/ScriptDownloadSorter.java index a2b133ee0..0163f3b32 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptDownloadSorter.java +++ b/src/me/mrCookieSlime/Slimefun/androids/comparators/ScriptDownloadSorter.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Android.comparators; +package me.mrCookieSlime.Slimefun.androids.comparators; import java.util.Comparator; @@ -8,7 +8,7 @@ public class ScriptDownloadSorter implements Comparator { @Override public int compare(Config c1, Config c2) { - return (int) (c2.getInt("downloads") - c1.getInt("downloads")); + return c2.getInt("downloads") - c1.getInt("downloads"); } } diff --git a/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptReputationSorter.java b/src/me/mrCookieSlime/Slimefun/androids/comparators/ScriptReputationSorter.java similarity index 78% rename from src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptReputationSorter.java rename to src/me/mrCookieSlime/Slimefun/androids/comparators/ScriptReputationSorter.java index 082feeb0b..df96e75c4 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptReputationSorter.java +++ b/src/me/mrCookieSlime/Slimefun/androids/comparators/ScriptReputationSorter.java @@ -1,9 +1,9 @@ -package me.mrCookieSlime.Slimefun.Android.comparators; +package me.mrCookieSlime.Slimefun.androids.comparators; import java.util.Comparator; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid; +import me.mrCookieSlime.Slimefun.androids.ProgrammableAndroid; public class ScriptReputationSorter implements Comparator { diff --git a/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java index 7b91d54a8..da5d9e6a0 100644 --- a/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -9,6 +9,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -27,7 +29,7 @@ import com.google.gson.JsonPrimitive; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; @@ -37,29 +39,18 @@ public class BlockStorage { private static final String path_blocks = "data-storage/Slimefun/stored-blocks/"; private static final String path_chunks = "data-storage/Slimefun/stored-chunks/"; - - public static Map worlds = new HashMap<>(); - public static Map> ticking_chunks = new HashMap<>(); - public static Set loaded_tickers = new HashSet<>(); private World world; - private Map storage = new HashMap<>(); - private static Map map_chunks = new HashMap<>(); - private Map inventories = new HashMap<>(); - public static Map universal_inventories = new HashMap<>(); - - private Map cache_blocks = new HashMap<>(); - - public static int info_delay; + private Map blocksCache = new HashMap<>(); public static BlockStorage getStorage(World world) { - return worlds.get(world.getName()); + return SlimefunPlugin.getUtilities().worlds.get(world.getName()); } public static BlockStorage getForcedStorage(World world) { - return isWorldRegistered(world.getName()) ? worlds.get(world.getName()): new BlockStorage(world); + return isWorldRegistered(world.getName()) ? SlimefunPlugin.getUtilities().worlds.get(world.getName()): new BlockStorage(world); } private static String serializeLocation(Location l) { @@ -76,41 +67,50 @@ public class BlockStorage { private static Location deserializeLocation(String l) { try { - World w = Bukkit.getWorld(l.split(";")[0]); - if (w != null) return new Location(w, Integer.parseInt(l.split(";")[1]), Integer.parseInt(l.split(";")[2]), Integer.parseInt(l.split(";")[3])); + String[] components = l.split(";"); + if (components.length != 4) return null; + + World w = Bukkit.getWorld(components[0]); + if (w != null) return new Location(w, Integer.parseInt(components[1]), Integer.parseInt(components[2]), Integer.parseInt(components[3])); } catch (NumberFormatException x) { + Slimefun.getLogger().log(Level.WARNING, "Could not parse Number", x); } return null; } public BlockStorage(final World w) { - if (worlds.containsKey(w.getName())) return; + if (SlimefunPlugin.getUtilities().worlds.containsKey(w.getName())) return; this.world = w; - System.out.println("[Slimefun] Loading Blocks for World \"" + w.getName() + "\""); - System.out.println("[Slimefun] This may take a long time..."); + + Slimefun.getLogger().log(Level.INFO, "Loading Blocks for World \"" + w.getName() + "\""); + Slimefun.getLogger().log(Level.INFO, "This may take a long time..."); File f = new File(path_blocks + w.getName()); if (f.exists()) { - long total = f.listFiles().length, start = System.currentTimeMillis(); - long done = 0, timestamp = System.currentTimeMillis(), totalBlocks = 0; + long total = f.listFiles().length; + long start = System.currentTimeMillis(); + long done = 0; + long timestamp = System.currentTimeMillis(); + long totalBlocks = 0; try { for (File file: f.listFiles()) { if (file.getName().equals("null.sfb")) { - System.err.println("[Slimefun] Corrupted file detected!"); - System.err.println("[Slimefun] Slimefun will simply skip this File, but you"); - System.err.println("[Slimefun] should probably look into it!"); + Slimefun.getLogger().log(Level.WARNING, "Corrupted file detected!"); + Slimefun.getLogger().log(Level.WARNING, "Slimefun will simply skip this File, but you"); + Slimefun.getLogger().log(Level.WARNING, "should maybe look into it!"); + Slimefun.getLogger().log(Level.WARNING, file.getPath()); } else if (file.getName().endsWith(".sfb")) { - if (timestamp + info_delay < System.currentTimeMillis()) { - System.out.println("[Slimefun] Loading Blocks... " + Math.round((((done * 100.0f) / total) * 100.0f) / 100.0f) + "% done (\"" + w.getName() + "\")"); + if (timestamp + SlimefunPlugin.getSettings().blocksInfoLoadingDelay < System.currentTimeMillis()) { + Slimefun.getLogger().log(Level.INFO, "Loading Blocks... " + Math.round((((done * 100.0F) / total) * 100.0F) / 100.0F) + "% done (\"" + w.getName() + "\")"); timestamp = System.currentTimeMillis(); } FileConfiguration cfg = YamlConfiguration.loadConfiguration(file); for (String key: cfg.getKeys(false)) { Location l = deserializeLocation(key); - String chunk_string = locationToChunkString(l); + String chunkString = locationToChunkString(l); try { totalBlocks++; String json = cfg.getString(key); @@ -120,22 +120,24 @@ public class BlockStorage { // It should not be possible to have two blocks on the same location. Ignore the // new entry if a block is already present and print an error to the console. - System.out.println("[Slimefun] Ignoring duplicate block @ " + l.getBlockX() + ", " + l.getBlockY() + ", " + l.getBlockZ()); - System.out.println("[Slimefun] Old block data: " + serializeBlockInfo(storage.get(l))); - System.out.println("[Slimefun] New block data (" + key + "): " + json); + Slimefun.getLogger().log(Level.INFO, "Ignoring duplicate block @ " + l.getBlockX() + ", " + l.getBlockY() + ", " + l.getBlockZ()); + Slimefun.getLogger().log(Level.INFO, "Old block data: " + serializeBlockInfo(storage.get(l))); + Slimefun.getLogger().log(Level.INFO, "New block data (" + key + "): " + json); continue; } storage.put(l, blockInfo); if (SlimefunItem.isTicking(file.getName().replace(".sfb", ""))) { - Set locations = ticking_chunks.containsKey(chunk_string) ? ticking_chunks.get(chunk_string): new HashSet(); + Set locations = SlimefunPlugin.getUtilities().tickingChunks.getOrDefault(chunkString, new HashSet<>()); locations.add(l); - ticking_chunks.put(chunk_string, locations); - if (!loaded_tickers.contains(chunk_string)) loaded_tickers.add(chunk_string); + SlimefunPlugin.getUtilities().tickingChunks.put(chunkString, locations); + + if (!SlimefunPlugin.getUtilities().loadedTickers.contains(chunkString)) { + SlimefunPlugin.getUtilities().loadedTickers.add(chunkString); + } } } catch (Exception x) { - System.err.println("[Slimefun] Failed to load " + file.getName() + "(ERR: " + key + ")"); - x.printStackTrace(); + Slimefun.getLogger().log(Level.WARNING, "Failed to load " + file.getName() + "(" + key + ") for Slimefun " + Slimefun.getVersion(), x); } } done++; @@ -143,9 +145,12 @@ public class BlockStorage { } } finally { long time = (System.currentTimeMillis() - start); - System.out.println("[Slimefun] Loading Blocks... 100% (FINISHED - " + time + "ms)"); - System.out.println("[Slimefun] Loaded a total of " + totalBlocks + " Blocks for World \"" + world.getName() + "\""); - if (totalBlocks > 0) System.out.println("[Slimefun] Avg: " + DoubleHandler.fixDouble((double) time / (double) totalBlocks, 3) + "ms/Block"); + Slimefun.getLogger().log(Level.INFO, "Loading Blocks... 100% (FINISHED - " + time + "ms)"); + Slimefun.getLogger().log(Level.INFO, "Loaded a total of " + totalBlocks + " Blocks for World \"" + world.getName() + "\""); + + if (totalBlocks > 0) { + Slimefun.getLogger().log(Level.INFO, "Avg: " + DoubleHandler.fixDouble((double) time / (double) totalBlocks, 3) + "ms/Block"); + } } } else f.mkdirs(); @@ -155,31 +160,32 @@ public class BlockStorage { FileConfiguration cfg = YamlConfiguration.loadConfiguration(chunks); for (String key: cfg.getKeys(false)) { try { - if (world.getName().equals(key.split(";")[0])) map_chunks.put(key, cfg.getString(key)); + if (world.getName().equals(key.split(";")[0])) SlimefunPlugin.getUtilities().mapChunks.put(key, cfg.getString(key)); } catch (Exception x) { - System.err.println("[Slimefun] Failed to load " + chunks.getName() + " for World \"" + world.getName() + "\" (ERR: " + key + ")"); - x.printStackTrace(); + Slimefun.getLogger().log(Level.WARNING, "Failed to load " + chunks.getName() + " in World " + world.getName() + "(" + key + ") for Slimefun " + Slimefun.getVersion(), x); } } } - worlds.put(world.getName(), this); + SlimefunPlugin.getUtilities().worlds.put(world.getName(), this); for (File file: new File("data-storage/Slimefun/stored-inventories").listFiles()) { if (file.getName().startsWith(w.getName()) && file.getName().endsWith(".sfi")) { Location l = deserializeLocation(file.getName().replace(".sfi", "")); Config cfg = new Config(file); + try { - if (cfg.getString("preset") != null) { - BlockMenuPreset preset = BlockMenuPreset.getPreset(cfg.getString("preset")); - inventories.put(l, new BlockMenu(preset, l, cfg)); + BlockMenuPreset preset = BlockMenuPreset.getPreset(cfg.getString("preset")); + if (preset == null) { + preset = BlockMenuPreset.getPreset(checkID(l)); } - else { - BlockMenuPreset preset = BlockMenuPreset.getPreset(checkID(l)); + + if (preset != null) { inventories.put(l, new BlockMenu(preset, l, cfg)); } } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while loading this Inventory: " + file.getName(), x); } } } @@ -190,25 +196,25 @@ public class BlockStorage { BlockMenuPreset preset = BlockMenuPreset.getPreset(cfg.getString("preset")); if (preset != null) { - universal_inventories.put(preset.getID(), new UniversalBlockMenu(preset, cfg)); + SlimefunPlugin.getUtilities().universalInventories.put(preset.getID(), new UniversalBlockMenu(preset, cfg)); } } } } - private static int chunk_changes = 0; + private static int chunkChanges = 0; private int changes = 0; public void computeChanges() { - changes = cache_blocks.size() + chunk_changes; + changes = blocksCache.size() + chunkChanges; Map inventories2 = new HashMap<>(inventories); for (Map.Entry entry: inventories2.entrySet()) { changes += entry.getValue().getUnsavedChanges(); } - Map universal_inventories2 = new HashMap<>(universal_inventories); - for (Map.Entry entry: universal_inventories2.entrySet()) { + Map universalInventories2 = new HashMap<>(SlimefunPlugin.getUtilities().universalInventories); + for (Map.Entry entry: universalInventories2.entrySet()) { changes += entry.getValue().getUnsavedChanges(); } } @@ -223,26 +229,28 @@ public class BlockStorage { public void save(boolean computeChanges, boolean remove) { if (computeChanges) computeChanges(); - if (changes == 0) return; - System.out.println("[Slimefun] Saving Blocks for World \"" + world.getName() + "\" (" + changes + " Changes queued)"); + Slimefun.getLogger().log(Level.INFO, "Saving Blocks for World \"" + world.getName() + "\" (" + changes + " Change(s) queued)"); - Map cache = new HashMap<>(cache_blocks); + Map cache = new HashMap<>(blocksCache); for (Map.Entry entry: cache.entrySet()) { - cache_blocks.remove(entry.getKey()); + blocksCache.remove(entry.getKey()); Config cfg = entry.getValue(); if (cfg.getKeys().isEmpty()) { - cfg.getFile().delete(); + if (!cfg.getFile().delete()) { + Slimefun.getLogger().log(Level.WARNING, "Could not delete File: " + cfg.getFile().getName()); + } } else { File tmpFile = new File(cfg.getFile().getParentFile(), cfg.getFile().getName() + ".tmp"); cfg.save(tmpFile); + try { Files.move(tmpFile.toPath(), cfg.getFile().toPath(), StandardCopyOption.ATOMIC_MOVE); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while copying a temporary File for Slimefun " + Slimefun.getVersion(), x); } } } @@ -253,29 +261,29 @@ public class BlockStorage { entry.getValue().save(entry.getKey()); } - Map universal_inventories2 = new HashMap<>(universal_inventories); + Map universalInventories2 = new HashMap<>(SlimefunPlugin.getUtilities().universalInventories); - for (Map.Entry entry: universal_inventories2.entrySet()) { + for (Map.Entry entry: universalInventories2.entrySet()) { entry.getValue().save(); } - if (chunk_changes > 0) { + if (chunkChanges > 0) { File chunks = new File(path_chunks + "chunks.sfc"); Config cfg = new Config("data-storage/Slimefun/temp.yml"); - for (Map.Entry entry: map_chunks.entrySet()) { + for (Map.Entry entry: SlimefunPlugin.getUtilities().mapChunks.entrySet()) { cfg.setValue(entry.getKey(), entry.getValue()); } cfg.save(chunks); if (remove) { - worlds.remove(world.getName()); + SlimefunPlugin.getUtilities().worlds.remove(world.getName()); } } changes = 0; - chunk_changes = 0; + chunkChanges = 0; } public static void store(Block block, ItemStack item) { @@ -317,9 +325,9 @@ public class BlockStorage { } public static Config getLocationInfo(Location l) { - BlockStorage storage = getStorage(l.getWorld()); - Config cfg = storage.storage.get(l); - return cfg == null ? new BlockInfoConfig() : cfg; + BlockStorage storage = getStorage(l.getWorld()); + Config cfg = storage.storage.get(l); + return cfg == null ? new BlockInfoConfig() : cfg; } private static Map parseJSON(String json) { @@ -339,13 +347,14 @@ public class BlockStorage { try { return new BlockInfoConfig(parseJSON(json)); } catch(Exception x) { - System.err.println(x.getClass().getName()); - System.err.println("[Slimefun] Failed to parse BlockInfo for Block @ " + l.getBlockX() + ", " + l.getBlockY() + ", " + l.getBlockZ()); - System.err.println(json); - System.err.println("[Slimefun] "); - System.err.println("[Slimefun] IGNORE THIS ERROR UNLESS IT IS SPAMMING"); - System.err.println("[Slimefun] "); - x.printStackTrace(); + Logger logger = Slimefun.getLogger(); + logger.log(Level.WARNING, x.getClass().getName()); + logger.log(Level.WARNING, "Failed to parse BlockInfo for Block @ " + l.getBlockX() + ", " + l.getBlockY() + ", " + l.getBlockZ()); + logger.log(Level.WARNING, json); + logger.log(Level.WARNING, ""); + logger.log(Level.WARNING, "IGNORE THIS ERROR UNLESS IT IS SPAMMING"); + logger.log(Level.WARNING, ""); + logger.log(Level.SEVERE, "An Error occured while parsing Block Info for Slimefun " + Slimefun.getVersion(), x); return null; } } @@ -359,7 +368,8 @@ public class BlockStorage { } private static String getJSONData(Chunk chunk) { - return map_chunks.get(serializeChunk(chunk)); + if (chunk == null) return null; + return SlimefunPlugin.getUtilities().mapChunks.get(serializeChunk(chunk)); } @Deprecated @@ -373,7 +383,7 @@ public class BlockStorage { } public static String getLocationInfo(Location l, String key) { - return getBlockInfo(l).getString(key); + return getLocationInfo(l).getString(key); } public static void addBlockInfo(Location l, String key, String value) { @@ -412,7 +422,7 @@ public class BlockStorage { storage.storage.put(l, cfg); if (BlockMenuPreset.isInventory(cfg.getString("id"))) { if (BlockMenuPreset.isUniversalInventory(cfg.getString("id"))) { - if (!universal_inventories.containsKey(cfg.getString("id"))) storage.loadUniversalInventory(BlockMenuPreset.getPreset(cfg.getString("id"))); + if (!SlimefunPlugin.getUtilities().universalInventories.containsKey(cfg.getString("id"))) storage.loadUniversalInventory(BlockMenuPreset.getPreset(cfg.getString("id"))); } else if (!storage.hasInventory(l)) { File file = new File("data-storage/Slimefun/stored-inventories/" + serializeLocation(l) + ".sfi"); @@ -445,7 +455,7 @@ public class BlockStorage { } public static void clearBlockInfo(Location l, boolean destroy) { - SlimefunStartup.ticker.delete.put(l, destroy); + SlimefunPlugin.getTicker().delete.put(l, destroy); } public static void _integrated_removeBlockInfo(Location l, boolean destroy) { @@ -461,15 +471,15 @@ public class BlockStorage { storage.getUniversalInventory(l).close(); storage.getUniversalInventory(l).save(); } - String chunk_string = locationToChunkString(l); - if (ticking_chunks.containsKey(chunk_string)) { - Set locations = ticking_chunks.get(chunk_string); + String chunkString = locationToChunkString(l); + if (SlimefunPlugin.getUtilities().tickingChunks.containsKey(chunkString)) { + Set locations = SlimefunPlugin.getUtilities().tickingChunks.get(chunkString); locations.remove(l); if (locations.isEmpty()) { - ticking_chunks.remove(chunk_string); - loaded_tickers.remove(chunk_string); + SlimefunPlugin.getUtilities().tickingChunks.remove(chunkString); + SlimefunPlugin.getUtilities().loadedTickers.remove(chunkString); } - else ticking_chunks.put(chunk_string, locations); + else SlimefunPlugin.getUtilities().tickingChunks.put(chunkString, locations); } } } @@ -480,7 +490,7 @@ public class BlockStorage { } public static void moveBlockInfo(Location from, Location to) { - SlimefunStartup.ticker.move.put(from, to); + SlimefunPlugin.getTicker().move.put(from, to); } @Deprecated @@ -503,32 +513,34 @@ public class BlockStorage { refreshCache(storage, from, getLocationInfo(from).getString("id"), null, true); storage.storage.remove(from); - String chunk_string = locationToChunkString(from); - if (ticking_chunks.containsKey(chunk_string)) { - Set locations = ticking_chunks.get(chunk_string); + String chunkString = locationToChunkString(from); + if (SlimefunPlugin.getUtilities().tickingChunks.containsKey(chunkString)) { + Set locations = SlimefunPlugin.getUtilities().tickingChunks.get(chunkString); locations.remove(from); if (locations.isEmpty()) { - ticking_chunks.remove(chunk_string); - loaded_tickers.remove(chunk_string); + SlimefunPlugin.getUtilities().tickingChunks.remove(chunkString); + SlimefunPlugin.getUtilities().loadedTickers.remove(chunkString); } - else ticking_chunks.put(chunk_string, locations); + else SlimefunPlugin.getUtilities().tickingChunks.put(chunkString, locations); } } private static void refreshCache(BlockStorage storage, Location l, String key, String value, boolean updateTicker) { - Config cfg = storage.cache_blocks.containsKey(key) ? storage.cache_blocks.get(key): new Config(path_blocks + l.getWorld().getName() + "/" + key + ".sfb"); + Config cfg = storage.blocksCache.containsKey(key) ? storage.blocksCache.get(key): new Config(path_blocks + l.getWorld().getName() + "/" + key + ".sfb"); cfg.setValue(serializeLocation(l), value); - storage.cache_blocks.put(key, cfg); + storage.blocksCache.put(key, cfg); if (updateTicker) { SlimefunItem item = SlimefunItem.getByID(key); if (item != null && item.isTicking()) { - String chunk_string = locationToChunkString(l); + String chunkString = locationToChunkString(l); if (value != null) { - Set locations = ticking_chunks.containsKey(chunk_string) ? ticking_chunks.get(chunk_string): new HashSet(); + Set locations = SlimefunPlugin.getUtilities().tickingChunks.get(chunkString); + if (locations == null) locations = new HashSet<>(); + locations.add(l); - ticking_chunks.put(chunk_string, locations); - if (!loaded_tickers.contains(chunk_string)) loaded_tickers.add(chunk_string); + SlimefunPlugin.getUtilities().tickingChunks.put(chunkString, locations); + if (!SlimefunPlugin.getUtilities().loadedTickers.contains(chunkString)) SlimefunPlugin.getUtilities().loadedTickers.add(chunkString); } } } @@ -568,11 +580,11 @@ public class BlockStorage { } public static boolean isWorldRegistered(String name) { - return worlds.containsKey(name); + return SlimefunPlugin.getUtilities().worlds.containsKey(name); } public static Set getTickingChunks() { - return new HashSet<>(loaded_tickers); + return new HashSet<>(SlimefunPlugin.getUtilities().loadedTickers); } @Deprecated @@ -594,7 +606,7 @@ public class BlockStorage { } public static Set getTickingLocations(String chunk) { - return new HashSet<>(ticking_chunks.get(chunk)); + return new HashSet<>(SlimefunPlugin.getUtilities().tickingChunks.get(chunk)); } public BlockMenu loadInventory(Location l, BlockMenuPreset preset) { @@ -604,21 +616,21 @@ public class BlockStorage { } public void loadUniversalInventory(BlockMenuPreset preset) { - universal_inventories.put(preset.getID(), new UniversalBlockMenu(preset)); + SlimefunPlugin.getUtilities().universalInventories.put(preset.getID(), new UniversalBlockMenu(preset)); } public void clearInventory(Location l) { BlockMenu menu = getInventory(l); + + if (menu != null) { + for (HumanEntity human : new ArrayList<>(menu.toInventory().getViewers())) { + // Prevents "java.lang.IllegalStateException: Asynchronous entity add!" when closing inventory while holding an item + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, human::closeInventory); + } - for (HumanEntity human : new ArrayList<>(menu.toInventory().getViewers())) { - // Prevents "java.lang.IllegalStateException: Asynchronous entity add!" when closing inventory while holding an item - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - human.closeInventory(); - }); + inventories.get(l).delete(l); + inventories.remove(l); } - - inventories.get(l).delete(l); - inventories.remove(l); } public boolean hasInventory(Location l) { @@ -626,7 +638,7 @@ public class BlockStorage { } public boolean hasUniversalInventory(String id) { - return universal_inventories.containsKey(id); + return SlimefunPlugin.getUtilities().universalInventories.containsKey(id); } public UniversalBlockMenu getUniversalInventory(Block block) { @@ -639,7 +651,7 @@ public class BlockStorage { } public UniversalBlockMenu getUniversalInventory(String id) { - return universal_inventories.get(id); + return SlimefunPlugin.getUtilities().universalInventories.get(id); } public static BlockMenu getInventory(Block b) { @@ -656,7 +668,7 @@ public class BlockStorage { public static Config getChunkInfo(Chunk chunk) { try { Config cfg = new Config("data-storage/Slimefun/temp.yml"); - if (!map_chunks.containsKey(serializeChunk(chunk))) return cfg; + if (!SlimefunPlugin.getUtilities().mapChunks.containsKey(serializeChunk(chunk))) return cfg; for (Map.Entry entry: parseJSON(getJSONData(chunk)).entrySet()) { cfg.setValue(entry.getKey(), entry.getValue()); @@ -664,20 +676,13 @@ public class BlockStorage { return cfg; } catch (Exception x) { - System.err.println(x.getClass().getName()); - System.err.println("[Slimefun] Failed to parse ChunkInfo for Chunk @ " + chunk.getX() + ", " + chunk.getZ()); - try { - System.err.println(getJSONData(chunk)); - } catch (Exception x2) { - System.err.println("No Metadata found!"); - } - x.printStackTrace(); + Slimefun.getLogger().log(Level.SEVERE, "Failed to parse ChunkInfo for Chunk: " + (chunk == null ? "?": chunk.getX()) + ", " + (chunk == null ? "?": chunk.getZ()) + " (" + getJSONData(chunk) + ") for Slimefun " + Slimefun.getVersion(), x); return new Config("data-storage/Slimefun/temp.yml"); } } public static boolean hasChunkInfo(Chunk chunk) { - return map_chunks.containsKey(serializeChunk(chunk)); + return SlimefunPlugin.getUtilities().mapChunks.containsKey(serializeChunk(chunk)); } public static void setChunkInfo(Chunk chunk, String key, String value) { @@ -690,9 +695,9 @@ public class BlockStorage { json.add(path, new JsonPrimitive(cfg.getString(path))); } - map_chunks.put(serializeChunk(chunk), json.toString()); + SlimefunPlugin.getUtilities().mapChunks.put(serializeChunk(chunk), json.toString()); - chunk_changes++; + chunkChanges++; } public static String getChunkInfo(Chunk chunk, String key) { @@ -704,7 +709,7 @@ public class BlockStorage { } public static void clearChunkInfo(Chunk chunk) { - map_chunks.remove(serializeChunk(chunk)); + SlimefunPlugin.getUtilities().mapChunks.remove(serializeChunk(chunk)); } public static String getBlockInfoAsJson(Block block) { @@ -721,6 +726,6 @@ public class BlockStorage { public boolean hasUniversalInventory(Location l) { String id = checkID(l); - return id == null ? false: hasUniversalInventory(id); + return id != null && hasUniversalInventory(id); } } diff --git a/src/me/mrCookieSlime/Slimefun/api/ErrorReport.java b/src/me/mrCookieSlime/Slimefun/api/ErrorReport.java index ae48ee3a6..546dc2e80 100644 --- a/src/me/mrCookieSlime/Slimefun/api/ErrorReport.java +++ b/src/me/mrCookieSlime/Slimefun/api/ErrorReport.java @@ -5,71 +5,98 @@ import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.stream.IntStream; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.general.Clock; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; public class ErrorReport { private File file; - public ErrorReport(TickerTask task, Location l, SlimefunItem item, Exception x) { - int try_count = 1; - file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err"); - - while (file.exists()) { - try_count += 1; - file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(" + try_count + ").err"); - } - - PrintStream stream = null; - - try { - stream = new PrintStream(file); - stream.println(); - stream.println("Java Environment:"); - stream.println(" Operating System: " + System.getProperty("os.name")); - stream.println(" Java Version: " + System.getProperty("java.version")); - stream.println(); - stream.println("Server Software: " + Bukkit.getName()); - stream.println(" Build: " + Bukkit.getVersion()); - stream.println(" Minecraft: " + Bukkit.getBukkitVersion()); - stream.println(); - stream.println("Slimefun Environment:"); - stream.println(" CS-CoreLib v" + CSCoreLib.getLib().getDescription().getVersion()); - stream.println(" Slimefun v" + SlimefunStartup.instance.getDescription().getVersion()); - stream.println(); - - List plugins = new ArrayList<>(); - List addons = new ArrayList<>(); - for (Plugin p: Bukkit.getPluginManager().getPlugins()) { - if (Bukkit.getPluginManager().isPluginEnabled(p)) { - plugins.add(" + " + p.getName() + " " + p.getDescription().getVersion()); - if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) - addons.add(" + " + p.getName() + " " + p.getDescription().getVersion()); - } - else { - plugins.add(" - " + p.getName() + " " + p.getDescription().getVersion()); - if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) - addons.add(" - " + p.getName() + " " + p.getDescription().getVersion()); - } + public ErrorReport(Throwable throwable, Consumer printer) { + SlimefunPlugin.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + String path = "plugins/Slimefun/error-reports/" + Clock.getFormattedTime(); + file = new File(path + ".err"); + + if (file.exists()) { + IntStream stream = IntStream.iterate(1, i -> i + 1).filter(i -> !new File(path + " (" + i + ").err").exists()); + int id = stream.findFirst().getAsInt(); + + file = new File(path + " (" + id + ").err"); } - stream.println("Installed Addons (" + addons.size() + ")"); - addons.forEach(stream::println); - - stream.println(); - - stream.println("Installed Plugins (" + plugins.size() + "):"); - plugins.forEach(stream::println); - - stream.println(); + try (PrintStream stream = new PrintStream(file)) { + stream.println(); + stream.println("Java Environment:"); + stream.println(" Operating System: " + System.getProperty("os.name")); + stream.println(" Java Version: " + System.getProperty("java.version")); + stream.println(); + stream.println("Server Software: " + Bukkit.getName()); + stream.println(" Build: " + Bukkit.getVersion()); + stream.println(" Minecraft: " + Bukkit.getBukkitVersion()); + stream.println(); + stream.println("Slimefun Environment:"); + stream.println(" CS-CoreLib v" + CSCoreLib.getLib().getDescription().getVersion()); + stream.println(" Slimefun v" + SlimefunPlugin.instance.getDescription().getVersion()); + stream.println(); + + List plugins = new ArrayList<>(); + List addons = new ArrayList<>(); + + for (Plugin p: Bukkit.getPluginManager().getPlugins()) { + if (Bukkit.getPluginManager().isPluginEnabled(p)) { + plugins.add(" + " + p.getName() + " " + p.getDescription().getVersion()); + if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) + addons.add(" + " + p.getName() + " " + p.getDescription().getVersion()); + } + else { + plugins.add(" - " + p.getName() + " " + p.getDescription().getVersion()); + if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) + addons.add(" - " + p.getName() + " " + p.getDescription().getVersion()); + } + } + + stream.println("Installed Addons (" + addons.size() + ")"); + addons.forEach(stream::println); + + stream.println(); + + stream.println("Installed Plugins (" + plugins.size() + "):"); + plugins.forEach(stream::println); + + stream.println(); + + printer.accept(stream); + + stream.println("Stacktrace:"); + stream.println(); + throwable.printStackTrace(stream); + + Slimefun.getLogger().log(Level.WARNING, ""); + Slimefun.getLogger().log(Level.WARNING, "An Error occured! It has been saved as: "); + Slimefun.getLogger().log(Level.WARNING, "/plugins/Slimefun/error-reports/" + file.getName()); + Slimefun.getLogger().log(Level.WARNING, "Please consider sending this File to the developer(s) of Slimefun, this message does not have to be included."); + Slimefun.getLogger().log(Level.WARNING, "You can put the file on Pastebin and then post it here: https://github.com/TheBusyBiscuit/Slimefun4/issues"); + Slimefun.getLogger().log(Level.WARNING, ""); + } catch (FileNotFoundException x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while saving an Error-Report for Slimefun " + Slimefun.getVersion(), x); + } + }); + } + + public ErrorReport(Throwable throwable, TickerTask task, Location l, SlimefunItem item) { + this(throwable, stream -> { stream.println("Block Info:"); stream.println(" World: " + l.getWorld().getName()); stream.println(" X: " + l.getBlockX()); @@ -87,18 +114,57 @@ public class ErrorReport { stream.println(" Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l)); stream.println(" Data: " + BlockStorage.getBlockInfoAsJson(l)); stream.println(); - stream.println("Stacktrace:"); + }); + } + + public ErrorReport(Throwable throwable, Player p) { + this(throwable, stream -> { + stream.println("Player Info:"); + stream.println(" ID: " + p.getUniqueId() + " (" + p.getName() + ")"); + stream.println(" World: " + p.getWorld().getName()); + stream.println(" X: " + p.getLocation().getX()); + stream.println(" Y: " + p.getLocation().getY()); + stream.println(" Z: " + p.getLocation().getZ()); + stream.println(" Profile in RAM? " + PlayerProfile.isLoaded(p.getUniqueId())); stream.println(); - x.printStackTrace(stream); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } finally { - if (stream != null) stream.close(); - } + stream.println("Item in Main Hand:"); + stream.println(p.getInventory().getItemInMainHand()); + stream.println(SlimefunItem.getByItem(p.getInventory().getItemInMainHand())); + stream.println(); + stream.println("Item in Off Hand:"); + stream.println(p.getInventory().getItemInOffHand()); + stream.println(SlimefunItem.getByItem(p.getInventory().getItemInOffHand())); + stream.println(); + stream.println("Helmet:"); + stream.println(p.getInventory().getHelmet()); + stream.println(SlimefunItem.getByItem(p.getInventory().getHelmet())); + stream.println(); + stream.println("Chestplate:"); + stream.println(p.getInventory().getChestplate()); + stream.println(SlimefunItem.getByItem(p.getInventory().getChestplate())); + stream.println(); + stream.println("Leggings:"); + stream.println(p.getInventory().getLeggings()); + stream.println(SlimefunItem.getByItem(p.getInventory().getLeggings())); + stream.println(); + stream.println("Boots:"); + stream.println(p.getInventory().getBoots()); + stream.println(SlimefunItem.getByItem(p.getInventory().getBoots())); + stream.println(); + }); } public File getFile() { return file; } + + public static void tryCatch(Function function, Runnable runnable) { + try { + runnable.run(); + } + catch(Exception x) { + function.apply(x); + } + } } diff --git a/src/me/mrCookieSlime/Slimefun/api/GuideHandler.java b/src/me/mrCookieSlime/Slimefun/api/GuideHandler.java index 4870ba2c6..f2fafefbb 100644 --- a/src/me/mrCookieSlime/Slimefun/api/GuideHandler.java +++ b/src/me/mrCookieSlime/Slimefun/api/GuideHandler.java @@ -8,7 +8,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.PlayerRunnable; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; import me.mrCookieSlime.Slimefun.SlimefunGuide; -public abstract class GuideHandler { +public interface GuideHandler { public abstract void addEntry(List texts, List tooltips); public abstract PlayerRunnable getRunnable(); @@ -17,11 +17,11 @@ public abstract class GuideHandler { public abstract int next(Player p, int index, ChestMenu menu); - public PlayerRunnable getRunnable(boolean book) { + default PlayerRunnable getRunnable(boolean book) { return this.getRunnable(); } - public void run(Player p, boolean survival, boolean book) { + default void run(Player p, boolean survival, boolean book) { this.getRunnable(book).run(p); if (survival && this.trackHistory()) { diff --git a/src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java b/src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java index a4e995882..d551985b0 100644 --- a/src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java +++ b/src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java @@ -4,6 +4,7 @@ import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -14,6 +15,7 @@ import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.api.inventory.BackpackInventory; @@ -23,9 +25,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BackpackInventory; * @author TheBusyBiscuit * */ -public class PlayerProfile { - - public static Map profiles = new HashMap<>(); +public final class PlayerProfile { private UUID uuid; private Config cfg; @@ -159,17 +159,19 @@ public class PlayerProfile { } public String getTitle() { - int index = Math.round(Float.valueOf(String.valueOf(Math.round(((researches.size() * 100.0f) / Research.titles.size()))))); + List titles = SlimefunPlugin.getSettings().researchesTitles; + + int index = Math.round(Float.valueOf(String.valueOf(Math.round(((researches.size() * 100.0F) / Research.list().size()) * 100.0F) / 100.0F)) / 100.0F) * titles.size(); if (index > 0) index--; - return Research.titles.get(index); + return titles.get(index); } public static PlayerProfile fromUUID(UUID uuid) { - PlayerProfile profile = profiles.get(uuid); + PlayerProfile profile = SlimefunPlugin.getUtilities().profiles.get(uuid); if (profile == null) { profile = new PlayerProfile(uuid); - profiles.put(uuid, profile); + SlimefunPlugin.getUtilities().profiles.put(uuid, profile); } else { profile.markedForDeletion = false; @@ -179,11 +181,11 @@ public class PlayerProfile { } public static boolean isLoaded(UUID uuid) { - return profiles.containsKey(uuid); + return SlimefunPlugin.getUtilities().profiles.containsKey(uuid); } public static Iterator iterator() { - return profiles.values().iterator(); + return SlimefunPlugin.getUtilities().profiles.values().iterator(); } public static BackpackInventory getBackpack(ItemStack item) { @@ -210,5 +212,10 @@ public class PlayerProfile { return null; } } + + @Override + public String toString() { + return "PlayerProfile {" + uuid + "}"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/api/Slimefun.java b/src/me/mrCookieSlime/Slimefun/api/Slimefun.java index b11f58920..4afb7deb0 100644 --- a/src/me/mrCookieSlime/Slimefun/api/Slimefun.java +++ b/src/me/mrCookieSlime/Slimefun/api/Slimefun.java @@ -2,15 +2,14 @@ package me.mrCookieSlime.Slimefun.api; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.logging.Logger; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.GPS.GPSNetwork; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Research; @@ -24,30 +23,14 @@ import me.mrCookieSlime.Slimefun.Setup.Messages; * * @since 4.0 */ -public class Slimefun { +public final class Slimefun { - public static Map> guide_handlers = new HashMap<>(); - - /** - * Instance of the GPSNetwork. - */ - private static GPSNetwork gps = new GPSNetwork(); + private Slimefun() {} - /** - * Whether EmeraldEnchants is enabled or not. - */ - public static boolean emeraldenchants = false; - - /** - * Lists all the registered categories. - */ - public static List current_categories = new ArrayList<>(); - public static void registerGuideHandler(GuideHandler handler) { - List handlers = new ArrayList<>(); - if (guide_handlers.containsKey(handler.getTier())) handlers = guide_handlers.get(handler.getTier()); + List handlers = SlimefunPlugin.getUtilities().guideHandlers.getOrDefault(handler.getTier(), new ArrayList<>()); handlers.add(handler); - guide_handlers.put(handler.getTier(), handlers); + SlimefunPlugin.getUtilities().guideHandlers.put(handler.getTier(), handlers); } /** @@ -56,7 +39,11 @@ public class Slimefun { * @return the GPSNetwork instance. */ public static GPSNetwork getGPSNetwork() { - return gps; + return SlimefunPlugin.instance.getGPS(); + } + + public static Logger getLogger() { + return SlimefunPlugin.instance.getLogger(); } /** @@ -91,7 +78,7 @@ public class Slimefun { * @return the Items.yml Config instance. */ public static Config getItemConfig() { - return SlimefunStartup.getItemCfg(); + return SlimefunPlugin.getItemCfg(); } /** @@ -207,10 +194,10 @@ public class Slimefun { String world = p.getWorld().getName(); SlimefunItem sfItem = SlimefunItem.getByItem(item); if (sfItem == null) return !SlimefunItem.isDisabled(item); - if (SlimefunStartup.getWhitelist().contains(world + ".enabled")) { - if (SlimefunStartup.getWhitelist().getBoolean(world + ".enabled")) { - if (!SlimefunStartup.getWhitelist().contains(world + ".enabled-items." + sfItem.getID())) SlimefunStartup.getWhitelist().setDefaultValue(world + ".enabled-items." + sfItem.getID(), true); - if (SlimefunStartup.getWhitelist().getBoolean(world + ".enabled-items." + sfItem.getID())) return true; + if (SlimefunPlugin.getWhitelist().contains(world + ".enabled")) { + if (SlimefunPlugin.getWhitelist().getBoolean(world + ".enabled")) { + if (!SlimefunPlugin.getWhitelist().contains(world + ".enabled-items." + sfItem.getID())) SlimefunPlugin.getWhitelist().setDefaultValue(world + ".enabled-items." + sfItem.getID(), true); + if (SlimefunPlugin.getWhitelist().getBoolean(world + ".enabled-items." + sfItem.getID())) return true; else { if (message) Messages.local.sendTranslation(p, "messages.disabled-in-world", true); return false; @@ -236,10 +223,10 @@ public class Slimefun { */ public static boolean isEnabled(Player p, SlimefunItem sfItem, boolean message) { String world = p.getWorld().getName(); - if (SlimefunStartup.getWhitelist().contains(world + ".enabled")) { - if (SlimefunStartup.getWhitelist().getBoolean(world + ".enabled")) { - if (!SlimefunStartup.getWhitelist().contains(world + ".enabled-items." + sfItem.getID())) SlimefunStartup.getWhitelist().setDefaultValue(world + ".enabled-items." + sfItem.getID(), true); - if (SlimefunStartup.getWhitelist().getBoolean(world + ".enabled-items." + sfItem.getID())) return true; + if (SlimefunPlugin.getWhitelist().contains(world + ".enabled")) { + if (SlimefunPlugin.getWhitelist().getBoolean(world + ".enabled")) { + if (!SlimefunPlugin.getWhitelist().contains(world + ".enabled-items." + sfItem.getID())) SlimefunPlugin.getWhitelist().setDefaultValue(world + ".enabled-items." + sfItem.getID(), true); + if (SlimefunPlugin.getWhitelist().getBoolean(world + ".enabled-items." + sfItem.getID())) return true; else { if (message) Messages.local.sendTranslation(p, "messages.disabled-in-world", true); return false; @@ -259,7 +246,7 @@ public class Slimefun { * @return the list of all the IDs of the enabled items. */ public static List listIDs() { - List ids = new ArrayList(); + List ids = new ArrayList<>(); for (SlimefunItem item: SlimefunItem.list()) { ids.add(item.getID()); } @@ -270,10 +257,10 @@ public class Slimefun { * Returns a list of all the ItemStacks representing the registered categories. * * @return the list of the display items of all the registered categories. - * @see #current_categories + * @see #currentCategories */ public static List listCategories() { - List items = new ArrayList(); + List items = new ArrayList<>(); for (Category c: Category.list()) { items.add(c.getItem()); } @@ -335,19 +322,11 @@ public class Slimefun { addWikiPage(id, "https://github.com/TheBusyBiscuit/Slimefun4/wiki/" + page); } - /** - * Returns whether EmeraldEnchants is enabled or not. - *

- * It can be directly accessed by {@link #emeraldenchants}. - * - * @return true if EmeraldEnchants is enabled, - * false otherwise. - */ - public static boolean isEmeraldEnchantsInstalled() { - return emeraldenchants; + public static List getGuideHandlers(int tier) { + return SlimefunPlugin.getUtilities().guideHandlers.getOrDefault(tier, new ArrayList<>()); } - public static List getGuideHandlers(int tier) { - return guide_handlers.containsKey(tier) ? guide_handlers.get(tier): new ArrayList(); + public static String getVersion() { + return SlimefunPlugin.instance.getDescription().getVersion(); } } \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java b/src/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java index 170197ce6..7193ba6d6 100644 --- a/src/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java +++ b/src/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java @@ -8,111 +8,114 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.List; +import java.util.logging.Level; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import me.mrCookieSlime.CSCoreLibPlugin.general.Clock; -public class SlimefunBackup { +public final class SlimefunBackup { + + private SlimefunBackup() {} public static void start() { File folder = new File("data-storage/Slimefun/block-backups"); List backups = Arrays.asList(folder.listFiles()); - if (backups.size() > 20) { - Collections.sort(backups, new Comparator() { - @Override - public int compare(File f1, File f2) { - try { - return (int) (new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f1.getName().replace(".zip", "")).getTime() - new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f2.getName().replace(".zip", "")).getTime()); - } catch (ParseException e) { - return 0; - } + if (backups.size() > 20) { + Collections.sort(backups, (a, b) -> { + try { + return (int) (new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(a.getName().replace(".zip", "")).getTime() - new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(b.getName().replace(".zip", "")).getTime()); + } catch (ParseException e) { + return 0; } }); for (int i = backups.size() - 20; i > 0; i--) { - backups.get(i).delete(); + if (!backups.get(i).delete()) { + Slimefun.getLogger().log(Level.WARNING, "Could not delete Backup: " + backups.get(i).getName()); + } } } File file = new File("data-storage/Slimefun/block-backups/" + Clock.format(new Date()) + ".zip"); byte[] buffer = new byte[1024]; - if (file.exists()) { - file.delete(); - } + if (!file.exists() || file.delete()) { + try { + if (file.createNewFile()) { + try (ZipOutputStream output = new ZipOutputStream(new FileOutputStream(file))) { + for (File f1: new File("data-storage/Slimefun/stored-blocks/").listFiles()) { + for (File f: f1.listFiles()) { + ZipEntry entry = new ZipEntry("stored-blocks/" + f1.getName() + "/" + f.getName()); + output.putNextEntry(entry); - try { - file.createNewFile(); + try (FileInputStream input = new FileInputStream(f)) { + int length; + while ((length = input.read(buffer)) > 0) { + output.write(buffer, 0, length); + } + } - ZipOutputStream output = new ZipOutputStream(new FileOutputStream(file)); + output.closeEntry(); + } + } - for (File f1: new File("data-storage/Slimefun/stored-blocks/").listFiles()) { - for (File f: f1.listFiles()) { - ZipEntry entry = new ZipEntry("stored-blocks/" + f1.getName() + "/" + f.getName()); - output.putNextEntry(entry); - FileInputStream input = new FileInputStream(f); + for (File f: new File("data-storage/Slimefun/universal-inventories/").listFiles()) { + ZipEntry entry = new ZipEntry("universal-inventories/" + f.getName()); + output.putNextEntry(entry); - int length; - while ((length = input.read(buffer)) > 0) { - output.write(buffer, 0, length); + try (FileInputStream input = new FileInputStream(f)) { + int length; + while ((length = input.read(buffer)) > 0) { + output.write(buffer, 0, length); + } + } + + output.closeEntry(); + } + + for (File f: new File("data-storage/Slimefun/stored-inventories/").listFiles()) { + ZipEntry entry = new ZipEntry("stored-inventories/" + f.getName()); + output.putNextEntry(entry); + + try (FileInputStream input = new FileInputStream(f)) { + int length; + while ((length = input.read(buffer)) > 0) { + output.write(buffer, 0, length); + } + } + + output.closeEntry(); + } + + File chunks = new File("data-storage/Slimefun/stored-chunks/chunks.sfc"); + + if (chunks.exists()) { + ZipEntry entry = new ZipEntry("stored-chunks/chunks.sfc"); + output.putNextEntry(entry); + + try (FileInputStream input = new FileInputStream(chunks)) { + int length; + while ((length = input.read(buffer)) > 0) { + output.write(buffer, 0, length); + } + } + + output.closeEntry(); + } } - input.close(); - output.closeEntry(); + Slimefun.getLogger().log(Level.INFO, "Backed up Data to: " + file.getName()); } - } - - for (File f: new File("data-storage/Slimefun/universal-inventories/").listFiles()) { - ZipEntry entry = new ZipEntry("universal-inventories/" + f.getName()); - output.putNextEntry(entry); - FileInputStream input = new FileInputStream(f); - - int length; - while ((length = input.read(buffer)) > 0) { - output.write(buffer, 0, length); + else { + Slimefun.getLogger().log(Level.WARNING, "Could not create backup-file: " + file.getName()); } - - input.close(); - output.closeEntry(); + } catch(IOException x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a World-Backup for Slimefun " + Slimefun.getVersion(), x); } - - for (File f: new File("data-storage/Slimefun/stored-inventories/").listFiles()) { - ZipEntry entry = new ZipEntry("stored-inventories/" + f.getName()); - output.putNextEntry(entry); - FileInputStream input = new FileInputStream(f); - - int length; - while ((length = input.read(buffer)) > 0) { - output.write(buffer, 0, length); - } - - input.close(); - output.closeEntry(); - } - - if (new File("data-storage/Slimefun/stored-chunks/chunks.sfc").exists()) { - ZipEntry entry = new ZipEntry("stored-chunks/chunks.sfc"); - output.putNextEntry(entry); - FileInputStream input = new FileInputStream(new File("data-storage/Slimefun/stored-chunks/chunks.sfc")); - - int length; - while ((length = input.read(buffer)) > 0) { - output.write(buffer, 0, length); - } - - input.close(); - output.closeEntry(); - } - - output.close(); - System.out.println("[Slimefun] Backed up Blocks to " + file.getName()); - } catch(IOException e) { - e.printStackTrace(); } } diff --git a/src/me/mrCookieSlime/Slimefun/api/SlimefunGuideLayout.java b/src/me/mrCookieSlime/Slimefun/api/SlimefunGuideLayout.java new file mode 100644 index 000000000..d46fea780 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/SlimefunGuideLayout.java @@ -0,0 +1,9 @@ +package me.mrCookieSlime.Slimefun.api; + +public enum SlimefunGuideLayout { + + BOOK, + CHEST, + CHEAT_SHEET; + +} diff --git a/src/me/mrCookieSlime/Slimefun/api/SlimefunRecipes.java b/src/me/mrCookieSlime/Slimefun/api/SlimefunRecipes.java index de9cc2392..5b17246d6 100644 --- a/src/me/mrCookieSlime/Slimefun/api/SlimefunRecipes.java +++ b/src/me/mrCookieSlime/Slimefun/api/SlimefunRecipes.java @@ -1,18 +1,19 @@ package me.mrCookieSlime.Slimefun.api; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; - import org.bukkit.inventory.ItemStack; -public class SlimefunRecipes { +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; +public final class SlimefunRecipes { + + private SlimefunRecipes() {} + public static void registerMachineRecipe(String machine, int seconds, ItemStack[] input, ItemStack[] output) { - for (SlimefunItem item: SlimefunItem.all) { - if (item instanceof AContainer) { - if (((AContainer) item).getMachineIdentifier().equals(machine)) { - ((AContainer) item).registerRecipe(seconds, input, output); - } + for (SlimefunItem item: SlimefunPlugin.getUtilities().allItems) { + if (item instanceof AContainer && ((AContainer) item).getMachineIdentifier().equals(machine)) { + ((AContainer) item).registerRecipe(seconds, input, output); } } } diff --git a/src/me/mrCookieSlime/Slimefun/api/Soul.java b/src/me/mrCookieSlime/Slimefun/api/Soul.java index ad5589808..a516a216e 100644 --- a/src/me/mrCookieSlime/Slimefun/api/Soul.java +++ b/src/me/mrCookieSlime/Slimefun/api/Soul.java @@ -1,39 +1,39 @@ package me.mrCookieSlime.Slimefun.api; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; -import me.mrCookieSlime.Slimefun.Variables; - import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -@Deprecated -public class Soul { +import me.mrCookieSlime.Slimefun.SlimefunPlugin; + +public final class Soul { - public static void storeItem(UUID uuid, ItemStack drop) { - List items = new ArrayList<>(); - if (Variables.soulbound.containsKey(uuid)) items = Variables.soulbound.get(uuid); - items.add(drop); - Variables.soulbound.put(uuid, items); + private Soul() {} + + public static void storeItem(UUID uuid, int slot, ItemStack item) { + Map items = SlimefunPlugin.getUtilities().soulbound.get(uuid); + + if (items == null) { + items = new HashMap<>(); + SlimefunPlugin.getUtilities().soulbound.put(uuid, items); + } + + items.put(slot, item); } public static void retrieveItems(Player p) { - if (Variables.soulbound.containsKey(p.getUniqueId())) { - for (ItemStack item: Variables.soulbound.get(p.getUniqueId())) { - if (item.equals(p.getInventory().getHelmet())) continue; - if (item.equals(p.getInventory().getChestplate())) continue; - if (item.equals(p.getInventory().getLeggings())) continue; - if (item.equals(p.getInventory().getBoots())) continue; - if (item.equals(p.getInventory().getItemInOffHand())) continue; - - if(!p.getInventory().contains(item)) { - p.getInventory().addItem(item); - } + Map items = SlimefunPlugin.getUtilities().soulbound.get(p.getUniqueId()); + + if (items != null) { + for (Map.Entry entry: items.entrySet()) { + p.getInventory().setItem(entry.getKey(), entry.getValue()); } - Variables.soulbound.remove(p.getUniqueId()); } + + SlimefunPlugin.getUtilities().soulbound.remove(p.getUniqueId()); } } diff --git a/src/me/mrCookieSlime/Slimefun/api/TickerTask.java b/src/me/mrCookieSlime/Slimefun/api/TickerTask.java index 40fbf9c91..261120a65 100644 --- a/src/me/mrCookieSlime/Slimefun/api/TickerTask.java +++ b/src/me/mrCookieSlime/Slimefun/api/TickerTask.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -17,30 +18,31 @@ import org.bukkit.entity.Player; import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage; import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage.HoverAction; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; public class TickerTask implements Runnable { - public boolean HALTED = false; + private boolean halted = false; - public Map move = new HashMap<>(); - public Map delete = new HashMap<>(); + protected Map move = new HashMap<>(); + protected Map delete = new HashMap<>(); + protected Map blockTimings = new HashMap<>(); private Set tickers = new HashSet<>(); - private int skipped = 0, chunks = 0, machines = 0; + private int skipped = 0; + private int chunks = 0; + private int machines = 0; private long time = 0; - private Map map_chunk = new HashMap<>(); - private Map map_machine = new HashMap<>(); - private Map map_machinetime = new HashMap<>(); - private Map map_chunktime = new HashMap<>(); - private Set skipped_chunks = new HashSet<>(); - - public static Map block_timings = new HashMap<>(); - public static Map bugged_blocks = new HashMap<>(); + private Map chunkItemCount = new HashMap<>(); + private Map machineCount = new HashMap<>(); + private Map machineTimings = new HashMap<>(); + private Map chunkTimings = new HashMap<>(); + private Set chunksSkipped = new HashSet<>(); + private Map buggedBlocks = new HashMap<>(); @Override public void run() { @@ -49,16 +51,16 @@ public class TickerTask implements Runnable { skipped = 0; chunks = 0; machines = 0; - map_chunk.clear(); - map_machine.clear(); + chunkItemCount.clear(); + machineCount.clear(); time = 0; - map_chunktime.clear(); - skipped_chunks.clear(); - map_machinetime.clear(); - block_timings.clear(); + chunkTimings.clear(); + chunksSkipped.clear(); + machineTimings.clear(); + blockTimings.clear(); - final Map bugged = new HashMap<>(bugged_blocks); - bugged_blocks.clear(); + final Map bugged = new HashMap<>(buggedBlocks); + buggedBlocks.clear(); Map remove = new HashMap<>(delete); @@ -67,12 +69,11 @@ public class TickerTask implements Runnable { delete.remove(entry.getKey()); } - if (!HALTED) { + if (!halted) { for (final String c: BlockStorage.getTickingChunks()) { long timestamp2 = System.currentTimeMillis(); chunks++; - blocks: for (final Location l: BlockStorage.getTickingLocations(c)) { if (l.getWorld().isChunkLoaded(l.getBlockX() >> 4, l.getBlockZ() >> 4)) { final Block b = l.getBlock(); @@ -85,19 +86,19 @@ public class TickerTask implements Runnable { item.getBlockTicker().update(); if (item.getBlockTicker().isSynchronized()) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { try { long timestamp3 = System.currentTimeMillis(); item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l)); - Long machinetime = map_machinetime.get(item.getID()); - Integer chunk = map_chunk.get(c); - Integer machine = map_machine.get(item.getID()); + Long machinetime = machineTimings.get(item.getID()); + Integer chunk = chunkItemCount.get(c); + Integer machine = machineCount.get(item.getID()); - map_machinetime.put(item.getID(), (machinetime != null ? machinetime: 0) + (System.currentTimeMillis() - timestamp3)); - map_chunk.put(c, (chunk != null ? chunk: 0) + 1); - map_machine.put(item.getID(), (machine != null ? machine: 0) + 1); - block_timings.put(l, System.currentTimeMillis() - timestamp3); + machineTimings.put(item.getID(), (machinetime != null ? machinetime: 0) + (System.currentTimeMillis() - timestamp3)); + chunkItemCount.put(c, (chunk != null ? chunk: 0) + 1); + machineCount.put(item.getID(), (machine != null ? machine: 0) + 1); + blockTimings.put(l, System.currentTimeMillis() - timestamp3); } catch (Exception x) { int errors = 0; if (bugged.containsKey(l)) errors = bugged.get(l); @@ -105,31 +106,22 @@ public class TickerTask implements Runnable { if (errors == 1) { // Generate a new Error-Report - ErrorReport report = new ErrorReport(this, l, item, x); + new ErrorReport(x, this, l, item); - System.err.println("[Slimefun] Exception caught while ticking a Block:" + x.getClass().getName()); - System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ()); - System.err.println("[Slimefun] Saved as: "); - System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + report.getFile().getName()); - System.err.println("[Slimefun] Please consider sending this File to the developer(s) of Slimefun, sending this Error won't get you any help though."); - System.err.println("[Slimefun] "); - - bugged_blocks.put(l, errors); + buggedBlocks.put(l, errors); } else if (errors == 4) { - System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getID() + ")"); - System.err.println("[Slimefun] has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated."); - System.err.println("[Slimefun] Check your /plugins/Slimefun/error-reports/ folder for details."); - System.err.println("[Slimefun] "); + Slimefun.getLogger().log(Level.SEVERE, "X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getID() + ")"); + Slimefun.getLogger().log(Level.SEVERE, "has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated."); + Slimefun.getLogger().log(Level.SEVERE, "Check your /plugins/Slimefun/error-reports/ folder for details."); + Slimefun.getLogger().log(Level.SEVERE, " "); BlockStorage._integrated_removeBlockInfo(l, true); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - l.getBlock().setType(Material.AIR); - }); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> l.getBlock().setType(Material.AIR)); } else { - bugged_blocks.put(l, errors); + buggedBlocks.put(l, errors); } } }); @@ -138,10 +130,10 @@ public class TickerTask implements Runnable { long timestamp3 = System.currentTimeMillis(); item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l)); - map_machinetime.put(item.getID(), (map_machinetime.containsKey(item.getID()) ? map_machinetime.get(item.getID()): 0) + (System.currentTimeMillis() - timestamp3)); - map_chunk.put(c, (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + 1); - map_machine.put(item.getID(), (map_machine.containsKey(item.getID()) ? map_machine.get(item.getID()): 0) + 1); - block_timings.put(l, System.currentTimeMillis() - timestamp3); + machineTimings.put(item.getID(), (machineTimings.containsKey(item.getID()) ? machineTimings.get(item.getID()): 0) + (System.currentTimeMillis() - timestamp3)); + chunkItemCount.put(c, (chunkItemCount.containsKey(c) ? chunkItemCount.get(c): 0) + 1); + machineCount.put(item.getID(), (machineCount.containsKey(item.getID()) ? machineCount.get(item.getID()): 0) + 1); + blockTimings.put(l, System.currentTimeMillis() - timestamp3); } tickers.add(item.getBlockTicker()); } catch (Exception x) { @@ -151,31 +143,21 @@ public class TickerTask implements Runnable { if (errors == 1) { // Generate a new Error-Report - ErrorReport report = new ErrorReport(this, l, item, x); - - System.err.println("[Slimefun] Exception caught while ticking a Block:" + x.getClass().getName()); - System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ()); - System.err.println("[Slimefun] Saved as: "); - System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + report.getFile().getName()); - System.err.println("[Slimefun] Please consider sending this File to the developer(s) of Slimefun, sending this Error won't get you any help though."); - System.err.println("[Slimefun] "); - - bugged_blocks.put(l, errors); + new ErrorReport(x, this, l, item); + buggedBlocks.put(l, errors); } else if (errors == 4) { - System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getID() + ")"); - System.err.println("[Slimefun] has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated."); - System.err.println("[Slimefun] Check your /plugins/Slimefun/error-reports/ folder for details."); - System.err.println("[Slimefun] "); + Slimefun.getLogger().log(Level.SEVERE, "X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getID() + ")"); + Slimefun.getLogger().log(Level.SEVERE, "has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated."); + Slimefun.getLogger().log(Level.SEVERE, "Check your /plugins/Slimefun/error-reports/ folder for details."); + Slimefun.getLogger().log(Level.SEVERE, " "); BlockStorage._integrated_removeBlockInfo(l, true); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - l.getBlock().setType(Material.AIR); - }); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> l.getBlock().setType(Material.AIR)); } else { - bugged_blocks.put(l, errors); + buggedBlocks.put(l, errors); } } } @@ -183,13 +165,13 @@ public class TickerTask implements Runnable { } else { skipped += BlockStorage.getTickingLocations(c).size(); - skipped_chunks.add(c); + chunksSkipped.add(c); chunks--; - break blocks; + break; } } - map_chunktime.put(c, System.currentTimeMillis() - timestamp2); + chunkTimings.put(c, System.currentTimeMillis() - timestamp2); } } @@ -200,7 +182,7 @@ public class TickerTask implements Runnable { Iterator iterator = tickers.iterator(); while (iterator.hasNext()) { - iterator.next().unique = true; + iterator.next().startNewTick(); iterator.remove(); } @@ -213,7 +195,7 @@ public class TickerTask implements Runnable { public void info(CommandSender sender) { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2== &aSlimefun Diagnostic Tool &2==")); - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Halted: &e&l" + String.valueOf(HALTED).toUpperCase())); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Halted: &e&l" + String.valueOf(halted).toUpperCase())); sender.sendMessage(""); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Impact: &e" + time + "ms / 50-750ms")); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Chunks: &e" + chunks)); @@ -227,24 +209,31 @@ public class TickerTask implements Runnable { tellraw.addText(" &7&oHover for more Info"); StringBuilder hover = new StringBuilder(); int hidden = 0; - for (String item: map_machine.keySet()) { - if (map_machinetime.get(item) > 0) hover.append("\n&c" + item + " - " + map_machine.get(item) + "x &7(" + map_machinetime.get(item) + "ms)"); + + for (Map.Entry entry: machineCount.entrySet()) { + long timings = machineTimings.get(entry.getKey()); + if (timings > 0) hover.append("\n&c" + entry.getKey() + " - " + entry.getValue()+ "x &7(" + timings + "ms)"); else hidden++; } + hover.append("\n\n&c+ &4" + hidden + " Hidden"); tellraw.addHoverEvent(HoverAction.SHOW_TEXT, hover.toString()); + try { tellraw.send((Player) sender); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while sending a Timings Summary for Slimefun " + Slimefun.getVersion(), x); } } else { int hidden = 0; - for (String item: map_machine.keySet()) { - if (map_machinetime.get(item) > 0) sender.sendMessage(ChatColor.translateAlternateColorCodes('&', " &e" + item + " - " + map_machine.get(item) + "x &7(" + map_machinetime.get(item) + "ms)")); + + for (Map.Entry entry: machineCount.entrySet()) { + long timings = machineTimings.get(entry.getKey()); + if (timings > 0) sender.sendMessage(ChatColor.translateAlternateColorCodes('&', " &e" + entry.getKey() + " - " + entry.getValue()+ "x &7(" + timings + "ms)")); else hidden++; } + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c+ &4" + hidden + " Hidden")); } @@ -256,26 +245,28 @@ public class TickerTask implements Runnable { tellraw.addText(" &7&oHover for more Info"); StringBuilder hover = new StringBuilder(); int hidden = 0; - for (String c: map_chunktime.keySet()) { - if (!skipped_chunks.contains(c)) { - if (map_chunktime.get(c) > 0) hover.append("\n&c" + c.replace("CraftChunk", "") + " - " + (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + "x &7(" + map_chunktime.get(c) + "ms)"); + + for (Map.Entry entry: chunkTimings.entrySet()) { + if (!chunksSkipped.contains(entry.getKey())) { + if (entry.getValue() > 0) hover.append("\n&c" + entry.getKey().replace("CraftChunk", "") + " - " + (chunkItemCount.containsKey(entry.getKey()) ? chunkItemCount.get(entry.getKey()): 0) + "x &7(" + entry.getValue() + "ms)"); else hidden++; } } + hover.append("\n\n&c+ &4" + hidden + " Hidden"); tellraw.addHoverEvent(HoverAction.SHOW_TEXT, hover.toString()); try { tellraw.send((Player) sender); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while sending a Timings Summary for Slimefun " + Slimefun.getVersion(), x); } } else { int hidden = 0; - for (String c: map_chunktime.keySet()) { - if (!skipped_chunks.contains(c)) { - if (map_chunktime.get(c) > 0) sender.sendMessage(" &c" + c.replace("CraftChunk", "") + " - " + (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + "x &7(" + map_chunktime.get(c) + "ms)"); + for (Map.Entry entry: chunkTimings.entrySet()) { + if (!chunksSkipped.contains(entry.getKey())) { + if (entry.getValue() > 0) sender.sendMessage(" &c" + entry.getKey().replace("CraftChunk", "") + " - " + (chunkItemCount.containsKey(entry.getKey()) ? chunkItemCount.get(entry.getKey()): 0) + "x &7(" + entry.getValue() + "ms)"); else hidden++; } } @@ -284,29 +275,41 @@ public class TickerTask implements Runnable { } public long getTimings(Block b) { - return block_timings.containsKey(b.getLocation()) ? block_timings.get(b.getLocation()): 0L; + return blockTimings.containsKey(b.getLocation()) ? blockTimings.get(b.getLocation()): 0L; } public long getTimings(String item) { - return map_machinetime.containsKey(item) ? map_machinetime.get(item): 0L; + return machineTimings.containsKey(item) ? machineTimings.get(item): 0L; } public long getTimings(Chunk c) { - return map_chunktime.containsKey(c.toString()) ? map_chunktime.get(c.toString()): 0L; + return chunkTimings.containsKey(c.toString()) ? chunkTimings.get(c.toString()): 0L; + } + + public void addBlockTimings(Location l, long time) { + blockTimings.put(l, time); + } + + public boolean isHalted() { + return halted; + } + + public void halt() { + halted = true; } @Override public String toString() { return "TickerTask {\n" - + " HALTED = " + HALTED + "\n" - + " tickers = " + tickers + "\n" - + " move = " + move + "\n" - + " delete = " + delete + "\n" - + " chunks = " + map_chunk + "\n" - + " machines = " + map_machine + "\n" - + " machinetime = " + map_machinetime + "\n" - + " chunktime = " + map_chunktime + "\n" - + " skipped = " + skipped_chunks + "\n" + + " HALTED = " + halted + "\n" + + " tickers = " + tickers + "\n" + + " move = " + move + "\n" + + " delete = " + delete + "\n" + + " chunks = " + chunkItemCount + "\n" + + " machines = " + machineCount + "\n" + + " machinetime = " + machineTimings + "\n" + + " chunktime = " + chunkTimings + "\n" + + " skipped = " + chunksSkipped + "\n" + "}"; } diff --git a/src/me/mrCookieSlime/Slimefun/api/energy/ChargableBlock.java b/src/me/mrCookieSlime/Slimefun/api/energy/ChargableBlock.java index 7707c9cdc..6387f817c 100644 --- a/src/me/mrCookieSlime/Slimefun/api/energy/ChargableBlock.java +++ b/src/me/mrCookieSlime/Slimefun/api/energy/ChargableBlock.java @@ -1,36 +1,32 @@ package me.mrCookieSlime.Slimefun.api.energy; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; -import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.api.BlockStorage; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.Skull; -public class ChargableBlock { +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; +import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public final class ChargableBlock { - public static Map max_charges = new HashMap<>(); - public static Set rechargeable = new HashSet<>(); - public static Set capacitors = new HashSet<>(); + private ChargableBlock() {} public static void registerChargableBlock(String id, int capacity, boolean recharge) { - max_charges.put(id, capacity); - if (recharge) rechargeable.add(id); + SlimefunPlugin.getUtilities().blocksEnergyCapacity.put(id, capacity); + if (recharge) SlimefunPlugin.getUtilities().rechargeableItems.add(id); } public static void registerCapacitor(String id, int capacity) { - max_charges.put(id, capacity); - rechargeable.add(id); - capacitors.add(id); + SlimefunPlugin.getUtilities().blocksEnergyCapacity.put(id, capacity); + SlimefunPlugin.getUtilities().rechargeableItems.add(id); + SlimefunPlugin.getUtilities().capacitorIDs.add(id); } public static boolean isChargable(Block b) { @@ -39,13 +35,13 @@ public class ChargableBlock { public static boolean isChargable(Location l) { if (!BlockStorage.hasBlockInfo(l)) return false; - return max_charges.containsKey(BlockStorage.checkID(l)); + return SlimefunPlugin.getUtilities().blocksEnergyCapacity.containsKey(BlockStorage.checkID(l)); } public static boolean isRechargable(Block b) { if (!BlockStorage.hasBlockInfo(b)) return false; String id = BlockStorage.checkID(b); - return max_charges.containsKey(id) && rechargeable.contains(id); + return SlimefunPlugin.getUtilities().blocksEnergyCapacity.containsKey(id) && SlimefunPlugin.getUtilities().rechargeableItems.contains(id); } public static boolean isCapacitor(Block b) { @@ -54,7 +50,7 @@ public class ChargableBlock { public static boolean isCapacitor(Location l) { if (!BlockStorage.hasBlockInfo(l)) return false; - return capacitors.contains(BlockStorage.checkID(l)); + return SlimefunPlugin.getUtilities().capacitorIDs.contains(BlockStorage.checkID(l)); } public static int getDefaultCapacity(Block b) { @@ -63,7 +59,7 @@ public class ChargableBlock { public static int getDefaultCapacity(Location l) { String id = BlockStorage.checkID(l); - return id == null ? 0: max_charges.get(id); + return id == null ? 0: SlimefunPlugin.getUtilities().blocksEnergyCapacity.get(id); } public static int getCharge(Block b) { @@ -96,28 +92,25 @@ public class ChargableBlock { if (charge != getCharge(l)) { BlockStorage.addBlockInfo(l, "energy-charge", String.valueOf(charge), false); if (updateTexture) { - try { - updateTexture(l); - } catch (Exception e) { - e.printStackTrace(); - } + updateTexture(l); } } } - private static void updateTexture(final Location l) throws Exception { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + private static void updateTexture(final Location l) { + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { try { Block b = l.getBlock(); - int charge = getCharge(b), capacity = getMaxCharge(b); + int charge = getCharge(b); + int capacity = getMaxCharge(b); if (b.getState() instanceof Skull) { if (charge < (int) (capacity * 0.25D)) CustomSkull.setSkull(b, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEzNjFlNTc2YjQ5M2NiZmRmYWUzMjg2NjFjZWRkMWFkZDU1ZmFiNGU1ZWI0MThiOTJjZWJmNjI3NWY4YmI0In19fQ=="); else if (charge < (int) (capacity * 0.5D)) CustomSkull.setSkull(b, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzA1MzIzMzk0YTdkOTFiZmIzM2RmMDZkOTJiNjNjYjQxNGVmODBmMDU0ZDA0NzM0ZWEwMTVhMjNjNTM5In19fQ=="); else if (charge < (int) (capacity * 0.75D)) CustomSkull.setSkull(b, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTU4NDQzMmFmNmYzODIxNjcxMjAyNThkMWVlZThjODdjNmU3NWQ5ZTQ3OWU3YjBkNGM3YjZhZDQ4Y2ZlZWYifX19"); else CustomSkull.setSkull(b, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2EyNTY5NDE1YzE0ZTMxYzk4ZWM5OTNhMmY5OWU2ZDY0ODQ2ZGIzNjdhMTNiMTk5OTY1YWQ5OWM0MzhjODZjIn19fQ=="); } - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while updating a Capacitor Texture for Slimefun " + Slimefun.getVersion(), x); } }); } @@ -134,6 +127,7 @@ public class ChargableBlock { int energy = getCharge(l); int space = getMaxCharge(l) - energy; int rest = charge; + if (space > 0 && charge > 0) { if (space > charge) { setCharge(l, energy + charge); @@ -143,22 +137,16 @@ public class ChargableBlock { rest = charge - space; setCharge(l, getMaxCharge(l)); } - if (capacitors.contains(BlockStorage.checkID(l))) { - try { - updateTexture(l); - } catch (Exception e) { - e.printStackTrace(); - } + + if (SlimefunPlugin.getUtilities().capacitorIDs.contains(BlockStorage.checkID(l))) { + updateTexture(l); } } else if (charge < 0 && energy >= -charge) { setCharge(l, energy + charge); - if (capacitors.contains(BlockStorage.checkID(l))) { - try { - updateTexture(l); - } catch (Exception e) { - e.printStackTrace(); - } + + if (SlimefunPlugin.getUtilities().capacitorIDs.contains(BlockStorage.checkID(l))) { + updateTexture(l); } } return rest; @@ -170,11 +158,15 @@ public class ChargableBlock { public static int getMaxCharge(Location l) { Config cfg = BlockStorage.getLocationInfo(l); + if (!cfg.contains("id")) { BlockStorage.clearBlockInfo(l); return 0; } - if (cfg.contains("energy-capacity")) return Integer.parseInt(cfg.getString("energy-capacity")); + + if (cfg.contains("energy-capacity")) { + return Integer.parseInt(cfg.getString("energy-capacity")); + } else { BlockStorage.addBlockInfo(l, "energy-capacity", String.valueOf(getDefaultCapacity(l)), false); return getDefaultCapacity(l); diff --git a/src/me/mrCookieSlime/Slimefun/api/energy/EnergyNet.java b/src/me/mrCookieSlime/Slimefun/api/energy/EnergyNet.java index 83117afbd..0df5f304e 100644 --- a/src/me/mrCookieSlime/Slimefun/api/energy/EnergyNet.java +++ b/src/me/mrCookieSlime/Slimefun/api/energy/EnergyNet.java @@ -1,69 +1,55 @@ package me.mrCookieSlime.Slimefun.api.energy; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; -import me.mrCookieSlime.Slimefun.api.network.Network; -import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.TickerTask; -import me.mrCookieSlime.Slimefun.holograms.EnergyHologram; - import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.network.Network; +import me.mrCookieSlime.Slimefun.api.network.NetworkComponent; +import me.mrCookieSlime.Slimefun.holograms.EnergyHologram; + public class EnergyNet extends Network { - public enum NetworkComponent { - SOURCE, - DISTRIBUTOR, - CONSUMER, - NONE; - } private static final int RANGE = 6; - - public static Set machines_input = new HashSet(); - public static Set machines_storage = new HashSet(); - public static Set machines_output = new HashSet(); - - public static Map listeners = new HashMap(); - - public static NetworkComponent getComponent(Block b) { + + public static EnergyNetComponent getComponent(Block b) { return getComponent(b.getLocation()); } - public static NetworkComponent getComponent(String id) { - if (machines_input.contains(id)) return NetworkComponent.SOURCE; - if (machines_storage.contains(id)) return NetworkComponent.DISTRIBUTOR; - if (machines_output.contains(id)) return NetworkComponent.CONSUMER; - return NetworkComponent.NONE; + public static EnergyNetComponent getComponent(String id) { + if (SlimefunPlugin.getUtilities().energyNetInput.contains(id)) return EnergyNetComponent.SOURCE; + if (SlimefunPlugin.getUtilities().energyNetStorage.contains(id)) return EnergyNetComponent.DISTRIBUTOR; + if (SlimefunPlugin.getUtilities().energyNetOutput.contains(id)) return EnergyNetComponent.CONSUMER; + return EnergyNetComponent.NONE; } - public static NetworkComponent getComponent(Location l) { - if (!BlockStorage.hasBlockInfo(l)) return NetworkComponent.NONE; + public static EnergyNetComponent getComponent(Location l) { + if (!BlockStorage.hasBlockInfo(l)) return EnergyNetComponent.NONE; String id = BlockStorage.checkID(l); - if (machines_input.contains(id)) return NetworkComponent.SOURCE; - if (machines_storage.contains(id)) return NetworkComponent.DISTRIBUTOR; - if (machines_output.contains(id)) return NetworkComponent.CONSUMER; - return NetworkComponent.NONE; + if (SlimefunPlugin.getUtilities().energyNetInput.contains(id)) return EnergyNetComponent.SOURCE; + if (SlimefunPlugin.getUtilities().energyNetStorage.contains(id)) return EnergyNetComponent.DISTRIBUTOR; + if (SlimefunPlugin.getUtilities().energyNetOutput.contains(id)) return EnergyNetComponent.CONSUMER; + return EnergyNetComponent.NONE; } - public static void registerComponent(String id, NetworkComponent component) { + public static void registerComponent(String id, EnergyNetComponent component) { switch (component) { case CONSUMER: - machines_output.add(id); + SlimefunPlugin.getUtilities().energyNetOutput.add(id); break; case DISTRIBUTOR: - machines_storage.add(id); + SlimefunPlugin.getUtilities().energyNetStorage.add(id); break; case SOURCE: - machines_input.add(id); + SlimefunPlugin.getUtilities().energyNetInput.add(id); break; default: break; @@ -75,17 +61,17 @@ public class EnergyNet extends Network { } public static EnergyNet getNetworkFromLocationOrCreate(Location l) { - EnergyNet energy_network = getNetworkFromLocation(l); - if (energy_network == null) { - energy_network = new EnergyNet(l); - registerNetwork(energy_network); + EnergyNet energyNetwork = getNetworkFromLocation(l); + if (energyNetwork == null) { + energyNetwork = new EnergyNet(l); + registerNetwork(energyNetwork); } - return energy_network; + return energyNetwork; } - private Set input = new HashSet(); - private Set storage = new HashSet(); - private Set output = new HashSet(); + private Set input = new HashSet<>(); + private Set storage = new HashSet<>(); + private Set output = new HashSet<>(); protected EnergyNet(Location l) { super(l); @@ -95,24 +81,25 @@ public class EnergyNet extends Network { return RANGE; } - public Network.Component classifyLocation(Location l) { - if (regulator.equals(l)) return Network.Component.REGULATOR; + public NetworkComponent classifyLocation(Location l) { + if (regulator.equals(l)) return NetworkComponent.REGULATOR; switch (getComponent(l)) { case DISTRIBUTOR: - return Network.Component.CONNECTOR; + return NetworkComponent.CONNECTOR; case CONSUMER: case SOURCE: - return Network.Component.TERMINUS; + return NetworkComponent.TERMINUS; default: return null; } } - public void locationClassificationChange(Location l, Network.Component from, Network.Component to) { - if (from == Network.Component.TERMINUS) { + public void locationClassificationChange(Location l, NetworkComponent from, NetworkComponent to) { + if (from == NetworkComponent.TERMINUS) { input.remove(l); output.remove(l); } + switch (getComponent(l)) { case DISTRIBUTOR: if (ChargableBlock.isCapacitor(l)) storage.add(l); @@ -150,7 +137,7 @@ public class EnergyNet extends Network { if (item.getEnergyTicker().explode(source)) { exploded.add(source); BlockStorage.clearBlockInfo(source); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { source.getBlock().setType(Material.LAVA); source.getWorld().createExplosion(source, 0F, false); }); @@ -158,7 +145,7 @@ public class EnergyNet extends Network { else { supply = supply + energy; } - TickerTask.block_timings.put(source, System.currentTimeMillis() - timestamp); + SlimefunPlugin.getTicker().addBlockTimings(source, System.currentTimeMillis() - timestamp); } input.removeAll(exploded); diff --git a/src/me/mrCookieSlime/Slimefun/api/energy/EnergyNetComponent.java b/src/me/mrCookieSlime/Slimefun/api/energy/EnergyNetComponent.java new file mode 100644 index 000000000..76bfe8714 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/energy/EnergyNetComponent.java @@ -0,0 +1,10 @@ +package me.mrCookieSlime.Slimefun.api.energy; + +public enum EnergyNetComponent { + + SOURCE, + DISTRIBUTOR, + CONSUMER, + NONE; + +} \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/api/energy/EnergyTicker.java b/src/me/mrCookieSlime/Slimefun/api/energy/EnergyTicker.java index 2f41bd73e..83367c69c 100644 --- a/src/me/mrCookieSlime/Slimefun/api/energy/EnergyTicker.java +++ b/src/me/mrCookieSlime/Slimefun/api/energy/EnergyTicker.java @@ -1,12 +1,12 @@ package me.mrCookieSlime.Slimefun.api.energy; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; - import org.bukkit.Location; -public abstract class EnergyTicker extends ItemHandler { +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; + +public abstract class EnergyTicker implements ItemHandler { public abstract double generateEnergy(Location l, SlimefunItem item, Config data); public abstract boolean explode(Location l); diff --git a/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java b/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java index b00ddd62d..1cc902279 100644 --- a/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java +++ b/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java @@ -11,12 +11,14 @@ import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; -public class ItemEnergy { +public final class ItemEnergy { -// "&c&o&8\u21E8 &e\u26A1 &70 / 50 J" + private ItemEnergy() {} + + // "&c&o&8\u21E8 &e\u26A1 &70 / 50 J" public static float getStoredEnergy(ItemStack item) { - if (item == null || item.getType() == null || item.getType().equals(Material.AIR)) return 0F; + if (item == null || item.getType() == null || item.getType() == Material.AIR) return 0F; if (!item.hasItemMeta() || !item.getItemMeta().hasLore()) return 0F; for (String line: item.getItemMeta().getLore()) { @@ -29,7 +31,7 @@ public class ItemEnergy { } public static float getMaxEnergy(ItemStack item) { - if (item == null || item.getType() == null || item.getType().equals(Material.AIR)) return 0F; + if (item == null || item.getType() == null || item.getType() == Material.AIR) return 0F; if (!item.hasItemMeta() || !item.getItemMeta().hasLore()) return 0F; for (String line: item.getItemMeta().getLore()) { @@ -42,7 +44,7 @@ public class ItemEnergy { } public static float addStoredEnergy(ItemStack item, float energy) { - if (item == null || item.getType() == null || item.getType().equals(Material.AIR)) return 0F; + if (item == null || item.getType() == null || item.getType() == Material.AIR) return 0F; if (!item.hasItemMeta() || !item.getItemMeta().hasLore()) return 0F; float rest = 0F; diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java index 471b42150..b96ab9ee7 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java @@ -2,6 +2,7 @@ package me.mrCookieSlime.Slimefun.api.inventory; import java.io.File; import java.util.ArrayList; +import java.util.logging.Level; import org.bukkit.Location; import org.bukkit.block.Block; @@ -10,6 +11,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.api.Slimefun; public class BlockMenu extends DirtyChestMenu { @@ -44,9 +46,7 @@ public class BlockMenu extends DirtyChestMenu { preset.clone(this); - if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1)) { - if (cfg.contains(String.valueOf(preset.getSize() - 1))) addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); - } + if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1) && cfg.contains(String.valueOf(preset.getSize() - 1))) addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); this.getContents(); } @@ -95,7 +95,13 @@ public class BlockMenu extends DirtyChestMenu { } public void delete(Location l) { - new File("data-storage/Slimefun/stored-inventories/" + serializeLocation(l) + ".sfi").delete(); + File file = new File("data-storage/Slimefun/stored-inventories/" + serializeLocation(l) + ".sfi"); + + if (file.exists()) { + if (!file.delete()) { + Slimefun.getLogger().log(Level.WARNING, "Could not delete File: " + file.getName()); + } + } } public BlockMenuPreset getPreset() { diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java index dd3ddb3ca..149da1a29 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java @@ -1,8 +1,6 @@ package me.mrCookieSlime.Slimefun.api.inventory; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; import org.bukkit.Bukkit; @@ -12,48 +10,50 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; public abstract class BlockMenuPreset extends ChestMenu { - public static Map presets = new HashMap(); - - private String title; - private Set occupied = new HashSet(); + private String inventoryTitle; + private Set occupied = new HashSet<>(); private String id; private int size = -1; private boolean universal; private ItemManipulationEvent event; - public BlockMenuPreset(String id, String title) { - super(title); + public BlockMenuPreset(String id, String inventoryTitle) { + super(inventoryTitle); this.id = id; - this.title = title; + this.inventoryTitle = inventoryTitle; this.init(); this.universal = false; - presets.put(id, this); + SlimefunPlugin.getUtilities().blockMenuPresets.put(id, this); } public void registerEvent(ItemManipulationEvent event) { this.event = event; } - public BlockMenuPreset(String id, String title, boolean universal) { - super(title); + public BlockMenuPreset(String id, String inventoryTitle, boolean universal) { + super(inventoryTitle); this.id = id; - this.title = title; + this.inventoryTitle = inventoryTitle; this.init(); this.universal = universal; - presets.put(id, this); + SlimefunPlugin.getUtilities().blockMenuPresets.put(id, this); } public abstract void init(); - public abstract void newInstance(BlockMenu menu, Block b); public abstract boolean canOpen(Block b, Player p); public abstract int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow); + + public void newInstance(BlockMenu menu, Block b) { + // This method can optionally be overridden by implementations + } + public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) { return this.getSlotsAccessedByItemTransport(flow); } @@ -74,11 +74,11 @@ public abstract class BlockMenuPreset extends ChestMenu { } public int getSize() { - return this.size; + return size; } public String getTitle() { - return this.title; + return inventoryTitle; } public Set getPresetSlots() { @@ -86,7 +86,7 @@ public abstract class BlockMenuPreset extends ChestMenu { } public Set getInventorySlots() { - Set empty = new HashSet(); + Set empty = new HashSet<>(); if (size > -1) { for (int i = 0; i < size; i++) { if (!occupied.contains(i)) empty.add(i); @@ -101,15 +101,16 @@ public abstract class BlockMenuPreset extends ChestMenu { } public static BlockMenuPreset getPreset(String id) { - return presets.get(id); + return id == null ? null: SlimefunPlugin.getUtilities().blockMenuPresets.get(id); } public static boolean isInventory(String id) { - return presets.containsKey(id); + return SlimefunPlugin.getUtilities().blockMenuPresets.containsKey(id); } public static boolean isUniversalInventory(String id) { - return presets.containsKey(id) && presets.get(id).isUniversal(); + BlockMenuPreset preset = SlimefunPlugin.getUtilities().blockMenuPresets.get(id); + return preset != null && preset.isUniversal(); } public boolean isUniversal() { @@ -157,9 +158,7 @@ public abstract class BlockMenuPreset extends ChestMenu { } public void newInstance(final BlockMenu menu, final Location l) { - Bukkit.getScheduler().runTask(SlimefunStartup.instance, () -> { - newInstance(menu, l.getBlock()); - }); + Bukkit.getScheduler().runTask(SlimefunPlugin.instance, () -> newInstance(menu, l.getBlock())); } } diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java b/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java index e1be5239e..3f2a17128 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/ItemManipulationEvent.java @@ -2,8 +2,9 @@ package me.mrCookieSlime.Slimefun.api.inventory; import org.bukkit.inventory.ItemStack; +@FunctionalInterface public interface ItemManipulationEvent { - public ItemStack onEvent(int slot, ItemStack previous, ItemStack next); + 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 e2a982d9f..7576dcae1 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java @@ -12,8 +12,8 @@ import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; public class UniversalBlockMenu extends DirtyChestMenu { - BlockMenuPreset preset; - ItemManipulationEvent event; + private BlockMenuPreset preset; + private ItemManipulationEvent event; public UniversalBlockMenu(BlockMenuPreset preset) { super(preset.getTitle()); @@ -35,9 +35,7 @@ public class UniversalBlockMenu extends DirtyChestMenu { preset.clone(this); - if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1)) { - if (cfg.contains(String.valueOf(preset.getSize() - 1))) addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); - } + if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1) && cfg.contains(String.valueOf(preset.getSize() - 1))) addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); this.getContents(); } diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java index 9fe206b40..598981a1b 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java @@ -3,20 +3,21 @@ package me.mrCookieSlime.Slimefun.api.item_transport; import java.util.ArrayList; import java.util.List; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; -import me.mrCookieSlime.Slimefun.Setup.SlimefunManager.DataType; -import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; -import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; - import org.bukkit.block.Block; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -public class CargoManager { +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; +import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; + +public final class CargoManager { + + private CargoManager() {} public static ItemStack withdraw(Block node, BlockStorage storage, Block target, ItemStack template) { if (storage.hasUniversalInventory(target)) { @@ -195,14 +196,14 @@ public class CargoManager { String id = BlockStorage.checkID(block); if (id.equals("CARGO_NODE_OUTPUT")) return true; - Config blockInfo = BlockStorage.getLocationInfo(block.getLocation()); // Store the returned Config instance to avoid heavy calls + // Store the returned Config instance to avoid heavy calls + Config blockInfo = BlockStorage.getLocationInfo(block.getLocation()); BlockMenu menu = BlockStorage.getInventory(block.getLocation()); boolean lore = blockInfo.getString("filter-lore").equals("true"); - boolean data = blockInfo.getString("filter-durability").equals("true"); if (blockInfo.getString("filter-type").equals("whitelist")) { - List items = new ArrayList(); + List items = new ArrayList<>(); for (int slot: slots) { ItemStack template = menu.getItemInSlot(slot); if (template != null) items.add(new CustomItem(template, 1)); @@ -218,18 +219,18 @@ public class CargoManager { BlockStorage.addBlockInfo(block, "index", String.valueOf(index)); - return SlimefunManager.isItemSimiliar(item, items.get(index), lore, data ? DataType.ALWAYS: DataType.NEVER); + return SlimefunManager.isItemSimiliar(item, items.get(index), lore); } else { for (ItemStack stack: items) { - if (SlimefunManager.isItemSimiliar(item, stack, lore, data ? DataType.ALWAYS: DataType.NEVER)) return true; + if (SlimefunManager.isItemSimiliar(item, stack, lore)) return true; } return false; } } else { for (int slot: slots) { - if (menu.getItemInSlot(slot) != null && SlimefunManager.isItemSimiliar(item, new CustomItem(menu.getItemInSlot(slot), 1), lore, data ? DataType.ALWAYS: DataType.NEVER)) { + if (menu.getItemInSlot(slot) != null && SlimefunManager.isItemSimiliar(item, new CustomItem(menu.getItemInSlot(slot), 1), lore)) { return false; } } diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java index 72112f786..fa9cac3dc 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java @@ -1,7 +1,6 @@ package me.mrCookieSlime.Slimefun.api.item_transport; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -9,12 +8,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Level; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.block.data.Directional; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -24,28 +23,29 @@ import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuClickHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; 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; public class CargoNet extends Network { - public static boolean EXTRA_CHANNELS = false; + + public static boolean extraChannels = false; private static final int RANGE = 5; - public static List faces = Arrays.asList(BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST); - public static Map round_robin = new HashMap<>(); - public static Set requests = new HashSet<>(); - - private static int[] slots = new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39}; + + private static final int[] slots = new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39}; // Chest Terminal Stuff - private static final ChestTerminalSorter sorter = new ChestTerminalSorter(); public static final int[] terminal_slots = new int[] {0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42}; - private static final int TERMINAL_OUT_SLOT = 17; + public static final int TERMINAL_OUT_SLOT = 17; + + private static final ChestTerminalSorter sorter = new ChestTerminalSorter(); private static final ItemStack terminal_noitem_item = new CustomItem(new ItemStack(Material.BARRIER), "&4No Item cached"); private static final MenuClickHandler terminal_noitem_handler = (p, slot, item, action) -> false; @@ -54,12 +54,12 @@ public class CargoNet extends Network { } public static CargoNet getNetworkFromLocationOrCreate(Location l) { - CargoNet cargo_network = getNetworkFromLocation(l); - if (cargo_network == null) { - cargo_network = new CargoNet(l); - registerNetwork(cargo_network); + CargoNet cargoNetwork = getNetworkFromLocation(l); + if (cargoNetwork == null) { + cargoNetwork = new CargoNet(l); + registerNetwork(cargoNetwork); } - return cargo_network; + return cargoNetwork; } @Deprecated @@ -67,15 +67,15 @@ public class CargoNet extends Network { return getNetworkFromLocation(b.getLocation()) != null; } - private Set inputNodes = new HashSet(); - private Set outputNodes = new HashSet(); - private Set advancedOutputNodes = new HashSet(); + private Set inputNodes = new HashSet<>(); + private Set outputNodes = new HashSet<>(); + private Set advancedOutputNodes = new HashSet<>(); //Chest Terminal Stuff - final Set terminals = new HashSet(); - final Set imports = new HashSet(); - final Set exports = new HashSet(); + private final Set terminals = new HashSet<>(); + private final Set imports = new HashSet<>(); + private final Set exports = new HashSet<>(); protected CargoNet(Location l) { super(l); @@ -85,28 +85,28 @@ public class CargoNet extends Network { return RANGE; } - public Network.Component classifyLocation(Location l) { + public NetworkComponent classifyLocation(Location l) { String id = BlockStorage.checkID(l); if (id == null) return null; switch(id) { case "CARGO_MANAGER": - return Component.REGULATOR; + return NetworkComponent.REGULATOR; case "CARGO_NODE": - return Component.CONNECTOR; + return NetworkComponent.CONNECTOR; case "CARGO_NODE_INPUT": case "CARGO_NODE_OUTPUT": case "CARGO_NODE_OUTPUT_ADVANCED": case "CT_IMPORT_BUS": case "CT_EXPORT_BUS": case "CHEST_TERMINAL": - return Component.TERMINUS; + return NetworkComponent.TERMINUS; default: return null; } } - public void locationClassificationChange(Location l, Component from, Component to) { - if (from == Component.TERMINUS) { + public void locationClassificationChange(Location l, NetworkComponent from, NetworkComponent to) { + if (from == NetworkComponent.TERMINUS) { inputNodes.remove(l); outputNodes.remove(l); advancedOutputNodes.remove(l); @@ -114,7 +114,7 @@ public class CargoNet extends Network { imports.remove(l); exports.remove(l); } - if (to == Component.TERMINUS) { + if (to == NetworkComponent.TERMINUS) { switch(BlockStorage.checkID(l)) { case "CARGO_NODE_INPUT": inputNodes.add(l); @@ -134,6 +134,8 @@ public class CargoNet extends Network { case "CT_EXPORT_BUS": exports.add(l); break; + default: + break; } } } @@ -146,13 +148,12 @@ public class CargoNet extends Network { super.tick(); if (connectorNodes.isEmpty() && terminusNodes.isEmpty()) { CargoHologram.update(b, "&7Status: &4&lOFFLINE"); - return; } else { CargoHologram.update(b, "&7Status: &a&lONLINE"); - final Map> output = new HashMap>(); + final Map> output = new HashMap<>(); for (Location outputNode: outputNodes) { @@ -171,12 +172,12 @@ public class CargoNet extends Network { } //Chest Terminal Stuff - final Set providers = new HashSet(); + final Set providers = new HashSet<>(); final Set destinations; if (output.containsKey(16)) { - destinations = new HashSet(output.get(16)); + destinations = new HashSet<>(output.get(16)); } else { - destinations = new HashSet(); + destinations = new HashSet<>(); } for (Location inputNode: inputNodes) { int frequency = getFrequency(inputNode); @@ -187,12 +188,12 @@ public class CargoNet extends Network { CargoNet self = this; final BlockStorage storage = BlockStorage.getStorage(b.getWorld()); - SlimefunStartup.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + SlimefunPlugin.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { if (BlockStorage.getLocationInfo(b.getLocation(), "visualizer") == null) { self.display(); } //Chest Terminal Code - if (EXTRA_CHANNELS) { + if (extraChannels) { for (Location bus : imports) { BlockMenu menu = BlockStorage.getInventory(bus); @@ -206,7 +207,7 @@ public class CargoNet extends Network { } if (menu.getItemInSlot(17) != null) { - requests.add(new ItemRequest(bus, 17, menu.getItemInSlot(17), ItemTransportFlow.INSERT)); + SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(bus, 17, menu.getItemInSlot(17), ItemTransportFlow.INSERT)); } } @@ -220,7 +221,7 @@ public class CargoNet extends Network { } if (menu.getItemInSlot(17) == null) { - List items = new ArrayList(); + List items = new ArrayList<>(); for (int slot: slots) { ItemStack template = menu.getItemInSlot(slot); if (template != null) items.add(new CustomItem(template, 1)); @@ -234,7 +235,7 @@ public class CargoNet extends Network { BlockStorage.addBlockInfo(bus, "index", String.valueOf(index)); - requests.add(new ItemRequest(bus, 17, items.get(index), ItemTransportFlow.WITHDRAW)); + SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(bus, 17, items.get(index), ItemTransportFlow.WITHDRAW)); } } } @@ -242,39 +243,38 @@ public class CargoNet extends Network { for (final Location terminal : terminals) { BlockMenu menu = BlockStorage.getInventory(terminal); - ItemStack sending_item = menu.getItemInSlot(TERMINAL_OUT_SLOT); - if (sending_item != null) { - requests.add(new ItemRequest(terminal, TERMINAL_OUT_SLOT, sending_item, ItemTransportFlow.INSERT)); + ItemStack sendingItem = menu.getItemInSlot(TERMINAL_OUT_SLOT); + if (sendingItem != null) { + SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(terminal, TERMINAL_OUT_SLOT, sendingItem, ItemTransportFlow.INSERT)); } } - Iterator iterator = requests.iterator(); + Iterator iterator = SlimefunPlugin.getUtilities().itemRequests.iterator(); while (iterator.hasNext()) { ItemRequest request = iterator.next(); if (terminals.contains(request.getTerminal()) || imports.contains(request.getTerminal()) || exports.contains(request.getTerminal())) { BlockMenu menu = BlockStorage.getInventory(request.getTerminal()); switch (request.getDirection()) { - case INSERT: { - ItemStack stack = request.getItem(); - nodes: + case INSERT: + ItemStack requestedItem = request.getItem(); + for (Location l: destinations) { Block target = getAttachedBlock(l.getBlock()); - stack = CargoManager.insert(l.getBlock(), storage, target, stack, -1); - if (stack == null) { + requestedItem = CargoManager.insert(l.getBlock(), storage, target, requestedItem, -1); + if (requestedItem == null) { menu.replaceExistingItem(request.getSlot(), null); - break nodes; + break; } } - if (stack != null) { - menu.replaceExistingItem(request.getSlot(), stack); + if (requestedItem != null) { + menu.replaceExistingItem(request.getSlot(), requestedItem); } iterator.remove(); break; - } - case WITHDRAW: { + case WITHDRAW: int slot = request.getSlot(); ItemStack prevStack = menu.getItemInSlot(slot); if (!(prevStack == null || (prevStack.getAmount() + request.getItem().getAmount() <= prevStack.getMaxStackSize() && SlimefunManager.isItemSimiliar(prevStack, new CustomItem(request.getItem(), 1), true)))) { @@ -284,7 +284,7 @@ public class CargoNet extends Network { ItemStack stack = null; ItemStack requested = request.getItem(); - nodes: + for (Location l : providers) { Block target = getAttachedBlock(l.getBlock()); ItemStack is = CargoManager.withdraw(l.getBlock(), storage, target, requested); @@ -297,7 +297,7 @@ public class CargoNet extends Network { } if (is.getAmount() == requested.getAmount()) { - break nodes; + break; } else { requested = new CustomItem(requested, requested.getAmount() - is.getAmount()); @@ -314,20 +314,20 @@ public class CargoNet extends Network { iterator.remove(); break; - } - default: { + default: break; } - } } } } // All operations happen here: Everything gets iterated from the Input Nodes. (Apart from ChestTerminal Buses) for (Location input: inputNodes) { Integer frequency = getFrequency(input); + if (frequency < 0 || frequency > 15) { continue; } + Block inputTarget = getAttachedBlock(input.getBlock()); ItemStack stack = null; int previousSlot = -1; @@ -343,34 +343,33 @@ public class CargoNet extends Network { } if (stack != null && output.containsKey(frequency)) { - List outputlist = new ArrayList(output.get(frequency)); + List outputlist = new ArrayList<>(output.get(frequency)); if (roundrobin) { - if (!round_robin.containsKey(input)) { - round_robin.put(input, 0); + if (!SlimefunPlugin.getUtilities().roundRobin.containsKey(input)) { + SlimefunPlugin.getUtilities().roundRobin.put(input, 0); } - int c_index = round_robin.get(input); + int cIndex = SlimefunPlugin.getUtilities().roundRobin.get(input); - if (c_index < outputlist.size()) { - for (int i = 0; i < c_index; i++) { + if (cIndex < outputlist.size()) { + for (int i = 0; i < cIndex; i++) { final Location temp = outputlist.get(0); outputlist.remove(temp); outputlist.add(temp); } - c_index++; + cIndex++; } - else c_index = 1; + else cIndex = 1; - round_robin.put(input, c_index); + SlimefunPlugin.getUtilities().roundRobin.put(input, cIndex); } - - destinations: + for (Location out : outputlist) { Block target = getAttachedBlock(out.getBlock()); if (target != null) { stack = CargoManager.insert(out.getBlock(), storage, target, stack, -1); - if (stack == null) break destinations; + if (stack == null) break; } } } @@ -391,8 +390,8 @@ public class CargoNet extends Network { } } //Chest Terminal Code - if (EXTRA_CHANNELS) { - List items = new ArrayList(); + if (extraChannels) { + List items = new ArrayList<>(); for (Location l: providers) { Block target = getAttachedBlock(l.getBlock()); if (storage.hasUniversalInventory(target)) { @@ -417,7 +416,7 @@ public class CargoNet extends Network { else if (storage.hasInventory(target.getLocation())) { BlockMenu menu = BlockStorage.getInventory(target.getLocation()); if (BlockStorage.checkID(target.getLocation()).startsWith("BARREL_") && BlockStorage.getLocationInfo(target.getLocation(), "storedItems") != null) { - int stored = Integer.valueOf(BlockStorage.getLocationInfo(target.getLocation(), "storedItems")); + int stored = Integer.parseInt(BlockStorage.getLocationInfo(target.getLocation(), "storedItems")); for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { ItemStack is = menu.getItemInSlot(slot); if (is != null && CargoManager.matchesFilter(l.getBlock(), is, -1)) { @@ -491,7 +490,7 @@ public class CargoNet extends Network { ItemStack stack = item.getItem().clone(); ItemMeta im = stack.getItemMeta(); - List lore = new ArrayList(); + List lore = new ArrayList<>(); lore.add(""); lore.add(ChatColor.translateAlternateColorCodes('&', "&7Stored Items: &r" + DoubleHandler.getFancyDouble(item.getAmount()))); if (stack.getMaxStackSize() > 1) lore.add(ChatColor.translateAlternateColorCodes('&', "&7 stack.getMaxStackSize() ? stack.getMaxStackSize(): item.getAmount()) + ">")); @@ -506,7 +505,7 @@ public class CargoNet extends Network { stack.setItemMeta(im); menu.replaceExistingItem(slot, stack); menu.addMenuClickHandler(slot, (p, sl, is, action) -> { - requests.add(new ItemRequest(l, 44, new CustomItem(item.getItem(), action.isRightClicked() ? (item.getAmount() > item.getItem().getMaxStackSize() ? item.getItem().getMaxStackSize(): item.getAmount()): 1), ItemTransportFlow.WITHDRAW)); + SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(l, 44, new CustomItem(item.getItem(), action.isRightClicked() ? (item.getAmount() > item.getItem().getMaxStackSize() ? item.getItem().getMaxStackSize(): item.getAmount()): 1), ItemTransportFlow.WITHDRAW)); return false; }); @@ -532,8 +531,11 @@ public class CargoNet extends Network { private static int getFrequency(Location l) { int freq = 0; try { - freq = Integer.parseInt(BlockStorage.getLocationInfo(l).getString("frequency")); - } catch (Exception e) {} + String str = BlockStorage.getLocationInfo(l).getString("frequency"); + if (str != null) freq = Integer.parseInt(str); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while parsing a Cargo Node Frequency", x); + } return freq; } diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java index 17905428f..4dbbc2d5b 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/CargoTransportEvent.java @@ -3,8 +3,9 @@ package me.mrCookieSlime.Slimefun.api.item_transport; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; +@FunctionalInterface public interface CargoTransportEvent { - public ItemStack onEvent(Block b, int slot, ItemStack previous, ItemStack next); - + ItemStack onEvent(Block b, int slot, ItemStack previous, ItemStack next); + } diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/ChannelIndex.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/ChannelIndex.java index eb17c6894..a6d751d36 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/ChannelIndex.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/ChannelIndex.java @@ -2,8 +2,8 @@ package me.mrCookieSlime.Slimefun.api.item_transport; public class ChannelIndex { - public int channel; - public int index; + private int channel; + private int index; public ChannelIndex(int channel, int index) { this.channel = channel; diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java index 921b0ab9f..a562c90d3 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/ChestManipulator.java @@ -1,21 +1,20 @@ 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 { +import me.mrCookieSlime.Slimefun.SlimefunPlugin; - public static List listeners = new ArrayList<>(); +public final class ChestManipulator { + + private ChestManipulator() {} public static void registerListener(CargoTransportEvent listener) { - listeners.add(listener); + SlimefunPlugin.getUtilities().cargoTransportEvents.add(listener); } public static ItemStack trigger(Block b, int slot, ItemStack prev, ItemStack next) { - for (CargoTransportEvent listener: listeners) { + for (CargoTransportEvent listener: SlimefunPlugin.getUtilities().cargoTransportEvents) { next = listener.onEvent(b, slot, prev, next); } diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemRequest.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemRequest.java index ee6d54199..1ff9215fc 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemRequest.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemRequest.java @@ -5,10 +5,10 @@ import org.bukkit.inventory.ItemStack; public class ItemRequest { - ItemStack item; - ItemTransportFlow flow; - Location terminal; - int slot; + private ItemStack item; + private ItemTransportFlow flow; + private Location terminal; + private int slot; public ItemRequest(Location terminal, int slot, ItemStack item, ItemTransportFlow flow) { this.terminal = terminal; diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemSlot.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemSlot.java index 0b873940e..6e9c0ef9b 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemSlot.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/ItemSlot.java @@ -4,8 +4,8 @@ import org.bukkit.inventory.ItemStack; public class ItemSlot { - public int slot; - public ItemStack item; + private int slot; + private ItemStack item; public ItemSlot(ItemStack item, int slot) { this.slot = slot; diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/RecipeSorter.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/RecipeSorter.java index d4fbf9a7c..c4ed77b11 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/RecipeSorter.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/RecipeSorter.java @@ -6,7 +6,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; public class RecipeSorter implements Comparator { - BlockMenu menu; + private BlockMenu menu; public RecipeSorter(BlockMenu menu) { this.menu = menu; diff --git a/src/me/mrCookieSlime/Slimefun/api/item_transport/StoredItem.java b/src/me/mrCookieSlime/Slimefun/api/item_transport/StoredItem.java index f3e0645de..71fc5621f 100644 --- a/src/me/mrCookieSlime/Slimefun/api/item_transport/StoredItem.java +++ b/src/me/mrCookieSlime/Slimefun/api/item_transport/StoredItem.java @@ -4,8 +4,8 @@ import org.bukkit.inventory.ItemStack; public class StoredItem { - public int amount; - public ItemStack item; + private int amount; + private ItemStack item; public StoredItem(ItemStack item, int amount) { this.amount = amount; diff --git a/src/me/mrCookieSlime/Slimefun/api/network/Network.java b/src/me/mrCookieSlime/Slimefun/api/network/Network.java index cb192e3e2..c51fdc1ea 100644 --- a/src/me/mrCookieSlime/Slimefun/api/network/Network.java +++ b/src/me/mrCookieSlime/Slimefun/api/network/Network.java @@ -1,6 +1,7 @@ package me.mrCookieSlime.Slimefun.api.network; import java.util.Set; +import java.util.logging.Level; import java.util.List; import java.util.Queue; import java.util.HashSet; @@ -10,14 +11,15 @@ import java.util.ArrayList; import org.bukkit.Location; import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.MC_1_13.ParticleEffect; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.Slimefun; public abstract class Network { - private static List NETWORK_LIST = new ArrayList<>(); + private static List networkList = new ArrayList<>(); public static T getNetworkFromLocation(Location l, Class type) { - for(Network n: NETWORK_LIST) { + for(Network n: networkList) { if(type.isInstance(n) && n.connectsTo(l)) { return type.cast(n); } @@ -27,7 +29,7 @@ public abstract class Network { public static List getNetworksFromLocation(Location l, Class type) { List ret = new ArrayList<>(); - for(Network n: NETWORK_LIST) { + for(Network n: networkList) { if(type.isInstance(n) && n.connectsTo(l)) { ret.add(type.cast(n)); } @@ -36,11 +38,11 @@ public abstract class Network { } public static void registerNetwork(Network n) { - NETWORK_LIST.add(n); + networkList.add(n); } public static void unregisterNetwork(Network n) { - NETWORK_LIST.remove(n); + networkList.remove(n); } public static void handleAllNetworkLocationUpdate(Location l) { @@ -49,16 +51,9 @@ public abstract class Network { } } - public static enum Component { - CONNECTOR, - REGULATOR, - TERMINUS; - } - - public abstract int getRange(); - public abstract Component classifyLocation(Location l); - public abstract void locationClassificationChange(Location l, Component from, Component to); + public abstract NetworkComponent classifyLocation(Location l); + public abstract void locationClassificationChange(Location l, NetworkComponent from, NetworkComponent to); protected Location regulator; private Queue nodeQueue = new ArrayDeque<>(); @@ -94,40 +89,48 @@ public abstract class Network { return connectedLocations.contains(l); } - private Component getCurrentClassification(Location l) { + private NetworkComponent getCurrentClassification(Location l) { if(regulatorNodes.contains(l)) { - return Component.REGULATOR; - } else if(connectorNodes.contains(l)) { - return Component.CONNECTOR; - } else if(terminusNodes.contains(l)) { - return Component.TERMINUS; + return NetworkComponent.REGULATOR; + } + else if(connectorNodes.contains(l)) { + return NetworkComponent.CONNECTOR; + } + else if(terminusNodes.contains(l)) { + return NetworkComponent.TERMINUS; } return null; } private void discoverStep() { int steps = 0; - while(nodeQueue.peek() != null) { + while (nodeQueue.peek() != null) { Location l = nodeQueue.poll(); - Component currentAssignment = getCurrentClassification(l); - Component classification = classifyLocation(l); - if(classification != currentAssignment) { - if(currentAssignment == Component.REGULATOR || currentAssignment == Component.CONNECTOR) { + NetworkComponent currentAssignment = getCurrentClassification(l); + NetworkComponent classification = classifyLocation(l); + + if (classification != currentAssignment) { + if (currentAssignment == NetworkComponent.REGULATOR || currentAssignment == NetworkComponent.CONNECTOR) { // Requires a complete rebuild of the network, so we just throw the current one away. unregisterNetwork(this); return; - } else if(currentAssignment == Component.TERMINUS) { + } + else if (currentAssignment == NetworkComponent.TERMINUS) { terminusNodes.remove(l); } - if(classification == Component.REGULATOR) { + + if (classification == NetworkComponent.REGULATOR) { regulatorNodes.add(l); discoverNeighbors(l); - } else if(classification == Component.CONNECTOR) { + } + else if(classification == NetworkComponent.CONNECTOR) { connectorNodes.add(l); discoverNeighbors(l); - } else if(classification == Component.TERMINUS) { + } + else if(classification == NetworkComponent.TERMINUS) { terminusNodes.add(l); } + locationClassificationChange(l, currentAssignment, classification); } steps += 1; @@ -137,32 +140,29 @@ public abstract class Network { } } - private void discoverNeighbors(Location l, int xDiff, int yDiff, int zDiff) { + private void discoverNeighbors(Location l, double xDiff, double yDiff, double zDiff) { for(int i = getRange() + 1; i > 0; i --) { - Location new_location = l.clone().add(i * xDiff, i * yDiff, i * zDiff); - addLocationToNetwork(new_location); + Location newLocation = l.clone().add(i * xDiff, i * yDiff, i * zDiff); + addLocationToNetwork(newLocation); } } private void discoverNeighbors(Location l) { - discoverNeighbors(l, 1, 0, 0); - discoverNeighbors(l, -1, 0, 0); - discoverNeighbors(l, 0, 1, 0); - discoverNeighbors(l, 0, -1, 0); - discoverNeighbors(l, 0, 0, 1); - discoverNeighbors(l, 0, 0, -1); + discoverNeighbors(l, 1.0, 0.0, 0.0); + discoverNeighbors(l, -1.0, 0.0, 0.0); + discoverNeighbors(l, 0.0, 1.0, 0.0); + discoverNeighbors(l, 0.0, -1.0, 0.0); + discoverNeighbors(l, 0.0, 0.0, 1.0); + discoverNeighbors(l, 0.0, 0.0, -1.0); } public void display() { - SlimefunStartup.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() { - @Override - public void run() { - for(Location l: connectedLocations) { - try { - ParticleEffect.REDSTONE.display(l.clone().add(0.5, 0.5, 0.5), 0, 0, 0, 1, 1); - } catch(Exception e) { - e.printStackTrace(); - } + SlimefunPlugin.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + for(Location l: connectedLocations) { + try { + ParticleEffect.REDSTONE.display(l.clone().add(0.5, 0.5, 0.5), 0, 0, 0, 1, 1); + } catch(Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while playing Network Animation for Slimefun " + Slimefun.getVersion(), x); } } }); diff --git a/src/me/mrCookieSlime/Slimefun/api/network/NetworkComponent.java b/src/me/mrCookieSlime/Slimefun/api/network/NetworkComponent.java new file mode 100644 index 000000000..dd8bc53c7 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/network/NetworkComponent.java @@ -0,0 +1,7 @@ +package me.mrCookieSlime.Slimefun.api.network; + +public enum NetworkComponent { + CONNECTOR, + REGULATOR, + TERMINUS; +} \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/autosave/BlockAutoSaver.java b/src/me/mrCookieSlime/Slimefun/autosave/BlockAutoSaver.java index db39f8bbf..e46224fe4 100644 --- a/src/me/mrCookieSlime/Slimefun/autosave/BlockAutoSaver.java +++ b/src/me/mrCookieSlime/Slimefun/autosave/BlockAutoSaver.java @@ -2,12 +2,14 @@ package me.mrCookieSlime.Slimefun.autosave; import java.util.HashSet; import java.util.Set; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.World; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; public class BlockAutoSaver implements Runnable { @@ -27,7 +29,7 @@ public class BlockAutoSaver implements Runnable { } if (!worlds.isEmpty()) { - System.out.println("[Slimefun] Auto-Saving Block Data... (Next Auto-Save: " + SlimefunStartup.getCfg().getInt("options.auto-save-delay-in-minutes") + "m)"); + Slimefun.getLogger().log(Level.INFO, "Auto-Saving Block Data... (Next Auto-Save: " + SlimefunPlugin.getCfg().getInt("options.auto-save-delay-in-minutes") + "m)"); for (BlockStorage storage: worlds) { storage.save(false); diff --git a/src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java b/src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java index 3ccc999e6..bd359328b 100644 --- a/src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java +++ b/src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java @@ -1,8 +1,10 @@ package me.mrCookieSlime.Slimefun.autosave; import java.util.Iterator; +import java.util.logging.Level; import me.mrCookieSlime.Slimefun.api.PlayerProfile; +import me.mrCookieSlime.Slimefun.api.Slimefun; public class PlayerAutoSaver implements Runnable { @@ -23,7 +25,7 @@ public class PlayerAutoSaver implements Runnable { } if (players > 0) { - System.out.println("[Slimefun] Auto-Saved Player Data for " + players + " Player(s)!"); + Slimefun.getLogger().log(Level.INFO, "Auto-Saved Player Data for " + players + " Player(s)!"); } } diff --git a/src/me/mrCookieSlime/Slimefun/commands/SlimefunCommand.java b/src/me/mrCookieSlime/Slimefun/commands/SlimefunCommand.java index 9fe6a7546..b7336dc5e 100644 --- a/src/me/mrCookieSlime/Slimefun/commands/SlimefunCommand.java +++ b/src/me/mrCookieSlime/Slimefun/commands/SlimefunCommand.java @@ -2,6 +2,7 @@ package me.mrCookieSlime.Slimefun.commands; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -27,26 +28,26 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Reflection.ReflectionUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder; import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder.TitleType; import me.mrCookieSlime.Slimefun.SlimefunGuide; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.GPS.Elevator; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.GPS.GPSNetwork; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; -import me.mrCookieSlime.Slimefun.Misc.BookDesign; import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.api.SlimefunGuideLayout; public class SlimefunCommand implements CommandExecutor, Listener { - public SlimefunStartup plugin; + private SlimefunPlugin plugin; - public static List arguments = new ArrayList<>(); - public static List descriptions = new ArrayList<>(); - public static List tabs = new ArrayList<>(); + private List arguments = new ArrayList<>(); + private List descriptions = new ArrayList<>(); + private List tabs = new ArrayList<>(); - public SlimefunCommand(SlimefunStartup plugin) { + public SlimefunCommand(SlimefunPlugin plugin) { this.plugin = plugin; arguments.add("/sf help"); @@ -107,14 +108,14 @@ public class SlimefunCommand implements CommandExecutor, Listener { } else if (args[0].equalsIgnoreCase("guide")) { if (sender instanceof Player) { - if (sender.hasPermission("slimefun.command.guide")) ((Player) sender).getInventory().addItem(SlimefunGuide.getItem(SlimefunStartup.getCfg().getBoolean("guide.default-view-book") ? BookDesign.BOOK : BookDesign.CHEST)); + if (sender.hasPermission("slimefun.command.guide")) ((Player) sender).getInventory().addItem(SlimefunGuide.getItem(SlimefunPlugin.getCfg().getBoolean("guide.default-view-book") ? SlimefunGuideLayout.BOOK : SlimefunGuideLayout.CHEST)); else Messages.local.sendTranslation(sender, "messages.no-permission", true); } else Messages.local.sendTranslation(sender, "messages.only-players", true); } else if (args[0].equalsIgnoreCase("open_guide")) { if (sender instanceof Player) { - if (sender.hasPermission("slimefun.command.open_guide")) SlimefunGuide.openGuide((Player) sender, SlimefunStartup.getCfg().getBoolean("guide.default-view-book")); + if (sender.hasPermission("slimefun.command.open_guide")) SlimefunGuide.openGuide((Player) sender, SlimefunPlugin.getCfg().getBoolean("guide.default-view-book")); else Messages.local.sendTranslation(sender, "messages.no-permission", true); } else Messages.local.sendTranslation(sender, "messages.only-players", true); @@ -143,7 +144,7 @@ public class SlimefunCommand implements CommandExecutor, Listener { double z = Integer.parseInt(args[3]) + 0.5D; if (BlockStorage.getLocationInfo(((Player) sender).getWorld().getBlockAt(Integer.parseInt(args[1]), Integer.parseInt(args[2]), Integer.parseInt(args[3])).getLocation(), "floor") != null) { - Elevator.ignored.add(((Player) sender).getUniqueId()); + SlimefunPlugin.getUtilities().elevatorUsers.add(((Player) sender).getUniqueId()); float yaw = ((Player) sender).getEyeLocation().getYaw() + 180; if (yaw > 180) yaw = -180 + (yaw - 180); ((Player) sender).teleport(new Location(((Player) sender).getWorld(), x, y, z, yaw, ((Player) sender).getEyeLocation().getPitch())); @@ -153,15 +154,15 @@ public class SlimefunCommand implements CommandExecutor, Listener { title.send(TitleType.TITLE, ((Player) sender)); subtitle.send(TitleType.SUBTITLE, ((Player) sender)); - } catch (Exception x1) { - x1.printStackTrace(); + } catch (Exception e) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while a Player used an Elevator in Slimefun " + Slimefun.getVersion(), e); } } } } else if (args[0].equalsIgnoreCase("timings")) { if (sender.hasPermission("slimefun.command.timings")|| sender instanceof ConsoleCommandSender) { - SlimefunStartup.ticker.info(sender); + SlimefunPlugin.getTicker().info(sender); } else Messages.local.sendTranslation(sender, "messages.no-permission", true); } @@ -201,8 +202,9 @@ public class SlimefunCommand implements CommandExecutor, Listener { if (args.length == 3) { if (Players.isOnline(args[1])) { if (Slimefun.listIDs().contains(args[2].toUpperCase())) { - Messages.local.sendTranslation(Bukkit.getPlayer(args[1]), "messages.given-item", true, new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", "1")); - Bukkit.getPlayer(args[1]).getInventory().addItem(SlimefunItem.getByID(args[2].toUpperCase()).getItem()); + Player p = Bukkit.getPlayer(args[1]); + Messages.local.sendTranslation(p, "messages.given-item", true, new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", "1")); + p.getInventory().addItem(SlimefunItem.getByID(args[2].toUpperCase()).getItem()); Messages.local.sendTranslation(sender, "messages.give-item", true, new Variable("%player%", args[1]), new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", "1")); } else Messages.local.sendTranslation(sender, "messages.not-valid-item", true, new Variable("%item%", args[2])); @@ -238,11 +240,7 @@ public class SlimefunCommand implements CommandExecutor, Listener { if (sender.hasPermission("slimefun.command.teleporter") && sender instanceof Player) { OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]); if (player.getName() != null) { - try { - GPSNetwork.openTeleporterGUI((Player) sender, player.getUniqueId(), ((Player) sender).getLocation().getBlock().getRelative(BlockFace.DOWN), 999999999); - } catch (Exception e) { - e.printStackTrace(); - } + GPSNetwork.openTeleporterGUI((Player) sender, player.getUniqueId(), ((Player) sender).getLocation().getBlock().getRelative(BlockFace.DOWN), 999999999); } else sender.sendMessage("&4Unknown Player: &c" + args[1]); } @@ -255,15 +253,17 @@ public class SlimefunCommand implements CommandExecutor, Listener { if (sender.hasPermission("slimefun.cheat.researches") || !(sender instanceof Player)) { if (Players.isOnline(args[1])) { Player p = Bukkit.getPlayer(args[1]); + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + if (args[2].equalsIgnoreCase("all")) { for (Research res : Research.list()) { - if (!res.hasUnlocked(p)) Messages.local.sendTranslation(sender, "messages.give-research", true, new Variable("%player%", p.getName()), new Variable("%research%", res.getName())); + if (!profile.hasUnlocked(res)) Messages.local.sendTranslation(sender, "messages.give-research", true, new Variable("%player%", p.getName()), new Variable("%research%", res.getName())); res.unlock(p, true); } } else if (args[2].equalsIgnoreCase("reset")) { for (Research res : Research.list()) { - res.lock(p); + profile.setResearched(res, false); } Messages.local.sendTranslation(p, "commands.research.reset", true, new Variable("%player%", args[1])); } @@ -319,4 +319,8 @@ public class SlimefunCommand implements CommandExecutor, Listener { } } + public List getTabArguments() { + return tabs; + } + } diff --git a/src/me/mrCookieSlime/Slimefun/commands/SlimefunTabCompleter.java b/src/me/mrCookieSlime/Slimefun/commands/SlimefunTabCompleter.java index ca644427c..9d79ec269 100644 --- a/src/me/mrCookieSlime/Slimefun/commands/SlimefunTabCompleter.java +++ b/src/me/mrCookieSlime/Slimefun/commands/SlimefunTabCompleter.java @@ -11,18 +11,24 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; public class SlimefunTabCompleter implements TabCompleter { + + private SlimefunCommand command; + + public SlimefunTabCompleter(SlimefunCommand command) { + this.command = command; + } @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] args) { if (args.length == 1) { - return createReturnList(SlimefunCommand.tabs, args[0]); + return createReturnList(command.getTabArguments(), args[0]); } else if (args.length == 3) { if (args[0].equalsIgnoreCase("give")) { return createReturnList(Slimefun.listIDs(), args[2]); } else if (args[0].equalsIgnoreCase("research")) { - List researches = new ArrayList(); + List researches = new ArrayList<>(); for (Research res : Research.list()) { researches.add(res.getName().toUpperCase().replace(" ", "_")); } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/AndroidStatusHologram.java b/src/me/mrCookieSlime/Slimefun/holograms/AndroidHologram.java similarity index 65% rename from src/me/mrCookieSlime/Slimefun/holograms/AndroidStatusHologram.java rename to src/me/mrCookieSlime/Slimefun/holograms/AndroidHologram.java index eb970868c..1b9ce0caa 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/AndroidStatusHologram.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/AndroidHologram.java @@ -9,39 +9,41 @@ import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -public class AndroidStatusHologram { +public final class AndroidHologram { + + private AndroidHologram() {} private static final double offset = 1.2; public static void update(final Block b, final String name) { - ArmorStand hologram = getArmorStand(b); + ArmorStand hologram = getArmorStand(b, true); hologram.setCustomName(name); } public static void remove(final Block b) { - ArmorStand hologram = getArmorStand(b); - hologram.remove(); + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); } public static List getNearbyEntities(final Block b, double radius) { - ArmorStand hologram = getArmorStand(b); + ArmorStand hologram = getArmorStand(b, true); return hologram.getNearbyEntities(radius, 1D, radius); } public static List getNearbyEntities(final Block b, double radius, double y) { - ArmorStand hologram = getArmorStand(b); + ArmorStand hologram = getArmorStand(b, true); return hologram.getNearbyEntities(radius, y, radius); } - private static ArmorStand getArmorStand(Block b) { + private static ArmorStand getArmorStand(Block b, boolean createIfNoneExists) { Location l = new Location(b.getWorld(), b.getX() + 0.5, b.getY() + offset, b.getZ() + 0.5); for (Entity n: l.getChunk().getEntities()) { - if (n instanceof ArmorStand) { - if (n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } + if (!createIfNoneExists) return null; + ArmorStand hologram = ArmorStandFactory.createHidden(l); hologram.setCustomNameVisible(false); hologram.setCustomName(null); diff --git a/src/me/mrCookieSlime/Slimefun/holograms/AnimalGrowthAccelerator.java b/src/me/mrCookieSlime/Slimefun/holograms/AnimalGrowthAcceleratorHologram.java similarity index 55% rename from src/me/mrCookieSlime/Slimefun/holograms/AnimalGrowthAccelerator.java rename to src/me/mrCookieSlime/Slimefun/holograms/AnimalGrowthAcceleratorHologram.java index c420fc62e..eae0f3be4 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/AnimalGrowthAccelerator.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/AnimalGrowthAcceleratorHologram.java @@ -7,23 +7,30 @@ import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -public class AnimalGrowthAccelerator { +public final class AnimalGrowthAcceleratorHologram { + + private AnimalGrowthAcceleratorHologram() {} private static final double offset = 1.2; - public static ArmorStand getArmorStand(Block hopper) { + public static ArmorStand getArmorStand(Block hopper, boolean createIfNoneExists) { Location l = new Location(hopper.getWorld(), hopper.getX() + 0.5, hopper.getY() + offset, hopper.getZ() + 0.5); for (Entity n: l.getChunk().getEntities()) { - if (n instanceof ArmorStand) { - if (n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } + if (!createIfNoneExists) return null; + ArmorStand hologram = ArmorStandFactory.createHidden(l); hologram.setCustomNameVisible(false); hologram.setCustomName(null); return hologram; } + public static void remove(Block b) { + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); + } + } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/AutoBreeder.java b/src/me/mrCookieSlime/Slimefun/holograms/AutoBreederHologram.java similarity index 55% rename from src/me/mrCookieSlime/Slimefun/holograms/AutoBreeder.java rename to src/me/mrCookieSlime/Slimefun/holograms/AutoBreederHologram.java index dc88d7b97..fdbc70afd 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/AutoBreeder.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/AutoBreederHologram.java @@ -7,21 +7,28 @@ import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -public class AutoBreeder { +public final class AutoBreederHologram { - public static ArmorStand getArmorStand(Block hopper) { + private AutoBreederHologram() {} + + public static ArmorStand getArmorStand(Block hopper, boolean createIfNonExists) { Location l = new Location(hopper.getWorld(), hopper.getX() + 0.5, hopper.getY(), hopper.getZ() + 0.5); for (Entity n: l.getChunk().getEntities()) { - if (n instanceof ArmorStand) { - if (n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } + if (!createIfNonExists) return null; + ArmorStand hologram = ArmorStandFactory.createHidden(l); hologram.setCustomNameVisible(false); hologram.setCustomName(null); return hologram; } + public static void remove(Block b) { + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); + } + } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/CargoHologram.java b/src/me/mrCookieSlime/Slimefun/holograms/CargoHologram.java index 9b34dcd01..c1db9d860 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/CargoHologram.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/CargoHologram.java @@ -8,33 +8,33 @@ import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; -public class CargoHologram { +public final class CargoHologram { + + private CargoHologram() {} public static void update(final Block b, final String name) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - ArmorStand hologram = getArmorStand(b); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + ArmorStand hologram = getArmorStand(b, true); hologram.setCustomName(ChatColor.translateAlternateColorCodes('&', name)); }); } public static void remove(Block b) { - ArmorStand hologram = getArmorStand(b); - hologram.remove(); + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); } - private static ArmorStand getArmorStand(Block b) { + private static ArmorStand getArmorStand(Block b, boolean createIfNonExists) { 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) { - if (n.getCustomName() != null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && n.getCustomName() != null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } - ArmorStand hologram = ArmorStandFactory.createHidden(l); - return hologram; + if (!createIfNonExists) return null; + else return ArmorStandFactory.createHidden(l); } } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java b/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java index c64421125..5625467e9 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/EnergyHologram.java @@ -9,39 +9,39 @@ import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; -public class EnergyHologram { +public final class EnergyHologram { + + private EnergyHologram() {} public static void update(Block b, double supply, double demand) { update(b, demand > supply ? ("&4&l- &c" + DoubleHandler.getFancyDouble(Math.abs(supply - demand)) + " &7J &e\u26A1"): ("&2&l+ &a" + DoubleHandler.getFancyDouble(supply - demand) + " &7J &e\u26A1")); } public static void update(final Block b, final String name) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - ArmorStand hologram = getArmorStand(b); + 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(SlimefunStartup.instance, () -> { - ArmorStand hologram = getArmorStand(b); - hologram.remove(); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); }); } - private static ArmorStand getArmorStand(Block b) { + private static ArmorStand getArmorStand(Block b, boolean createIfNonExists) { 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) { - if (n.getCustomName() != null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && n.getCustomName() != null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } - ArmorStand hologram = ArmorStandFactory.createHidden(l); - return hologram; + if (!createIfNonExists) return null; + else return ArmorStandFactory.createHidden(l); } } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/Projector.java b/src/me/mrCookieSlime/Slimefun/holograms/HologramProjectorHologram.java similarity index 78% rename from src/me/mrCookieSlime/Slimefun/holograms/Projector.java rename to src/me/mrCookieSlime/Slimefun/holograms/HologramProjectorHologram.java index 7e4d5f143..b04a86d0d 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/Projector.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/HologramProjectorHologram.java @@ -17,23 +17,32 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; -public class Projector { +public final class HologramProjectorHologram { - public static ArmorStand getArmorStand(Block projector) { + private HologramProjectorHologram() {} + + public static ArmorStand getArmorStand(Block projector, boolean createIfNoneExists) { String nametag = BlockStorage.getLocationInfo(projector.getLocation(), "text"); - double offset = Double.valueOf(BlockStorage.getLocationInfo(projector.getLocation(), "offset")); + double offset = Double.parseDouble(BlockStorage.getLocationInfo(projector.getLocation(), "offset")); Location l = new Location(projector.getWorld(), projector.getX() + 0.5, projector.getY() + offset, projector.getZ() + 0.5); for (Entity n : l.getChunk().getEntities()) { - if (n instanceof ArmorStand) { - if (n.getCustomName() != null && n.getCustomName().equals(nametag) && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && n.getCustomName() != null && n.getCustomName().equals(nametag) && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; + } + + if (!createIfNoneExists) { + return null; } ArmorStand hologram = ArmorStandFactory.createHidden(l); hologram.setCustomName(nametag); return hologram; } + + public static void remove(Block b) { + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); + } public static void openEditor(Player p, final Block projector) { ChestMenu menu = new ChestMenu("Hologram Settings"); @@ -43,7 +52,7 @@ public class Projector { pl.closeInventory(); Messages.local.sendTranslation(pl, "machines.HOLOGRAM_PROJECTOR.enter-text", true); MenuHelper.awaitChatInput(pl, (player, message) -> { - ArmorStand hologram = getArmorStand(projector); + ArmorStand hologram = getArmorStand(projector, true); hologram.setCustomName(ChatColor.translateAlternateColorCodes('&', message)); BlockStorage.addBlockInfo(projector, "text", hologram.getCustomName()); openEditor(player, projector); @@ -55,7 +64,7 @@ public class Projector { menu.addItem(1, new CustomItem(new ItemStack(Material.CLOCK), "&7Offset: &e" + DoubleHandler.fixDouble(Double.valueOf(BlockStorage.getLocationInfo(projector.getLocation(), "offset")) + 1.0D), "", "&rLeft Click: &7+0.1", "&rRight Click: &7-0.1")); menu.addMenuClickHandler(1, (pl, slot, item, action) -> { double offset = DoubleHandler.fixDouble(Double.valueOf(BlockStorage.getLocationInfo(projector.getLocation(), "offset")) + (action.isRightClicked() ? -0.1F : 0.1F)); - ArmorStand hologram = getArmorStand(projector); + ArmorStand hologram = getArmorStand(projector, true); Location l = new Location(projector.getWorld(), projector.getX() + 0.5, projector.getY() + offset, projector.getZ() + 0.5); hologram.teleport(l); BlockStorage.addBlockInfo(projector, "offset", String.valueOf(offset)); diff --git a/src/me/mrCookieSlime/Slimefun/holograms/XPCollector.java b/src/me/mrCookieSlime/Slimefun/holograms/InfusedHopperHologram.java similarity index 57% rename from src/me/mrCookieSlime/Slimefun/holograms/XPCollector.java rename to src/me/mrCookieSlime/Slimefun/holograms/InfusedHopperHologram.java index 9d329979e..cf72d9769 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/XPCollector.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/InfusedHopperHologram.java @@ -7,23 +7,30 @@ import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -public class XPCollector { +public final class InfusedHopperHologram { + + private InfusedHopperHologram() {} private static final double offset = 1.2; - public static ArmorStand getArmorStand(Block hopper) { + public static ArmorStand getArmorStand(Block hopper, boolean createIfNoneExists) { Location l = new Location(hopper.getWorld(), hopper.getX() + 0.5, hopper.getY() + offset, hopper.getZ() + 0.5); for (Entity n: l.getChunk().getEntities()) { - if (n instanceof ArmorStand) { - if (n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } + + if (!createIfNoneExists) return null; ArmorStand hologram = ArmorStandFactory.createHidden(l); hologram.setCustomNameVisible(false); hologram.setCustomName(null); return hologram; } + + public static void remove(Block b) { + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); + } } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/ReactorHologram.java b/src/me/mrCookieSlime/Slimefun/holograms/ReactorHologram.java index ed1e174df..f05dc9921 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/ReactorHologram.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/ReactorHologram.java @@ -7,19 +7,20 @@ import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +public final class ReactorHologram { + + private ReactorHologram() {} -public class ReactorHologram { - - public static ArmorStand getArmorStand(Location reactor) { + public static ArmorStand getArmorStand(Location reactor, boolean createIfNoneExists) { Location l = new Location(reactor.getWorld(), reactor.getX() + 0.5, reactor.getY() + 0.7, reactor.getZ() + 0.5); for (Entity n : l.getChunk().getEntities()) { - if (n instanceof ArmorStand) { - if (l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } + if (n instanceof ArmorStand && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } + + if (!createIfNoneExists) return null; ArmorStand hologram = ArmorStandFactory.createHidden(l); hologram.setCustomNameVisible(false); @@ -28,15 +29,17 @@ public class ReactorHologram { } public static void update(final Location l, final String name) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - ArmorStand hologram = getArmorStand(l); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + ArmorStand hologram = getArmorStand(l, true); if (!hologram.isCustomNameVisible()) hologram.setCustomNameVisible(true); hologram.setCustomName(ChatColor.translateAlternateColorCodes('&', name)); }); } public static void remove(Location l) { - ArmorStand hologram = getArmorStand(l); - hologram.remove(); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + ArmorStand hologram = getArmorStand(l, false); + if (hologram != null) hologram.remove(); + }); } } diff --git a/src/me/mrCookieSlime/Slimefun/holograms/InfusedHopper.java b/src/me/mrCookieSlime/Slimefun/holograms/XPCollectorHologram.java similarity index 63% rename from src/me/mrCookieSlime/Slimefun/holograms/InfusedHopper.java rename to src/me/mrCookieSlime/Slimefun/holograms/XPCollectorHologram.java index da1a5767e..bf0dd22c6 100644 --- a/src/me/mrCookieSlime/Slimefun/holograms/InfusedHopper.java +++ b/src/me/mrCookieSlime/Slimefun/holograms/XPCollectorHologram.java @@ -7,27 +7,30 @@ import org.bukkit.entity.Entity; import me.mrCookieSlime.CSCoreLibPlugin.general.World.ArmorStandFactory; -public class InfusedHopper { +public final class XPCollectorHologram { + + private XPCollectorHologram() {} private static final double offset = 1.2; - public static ArmorStand getArmorStand(Block hopper, boolean createIfNoneFound) { + public static ArmorStand getArmorStand(Block hopper, boolean createIfNoneExists) { Location l = new Location(hopper.getWorld(), hopper.getX() + 0.5, hopper.getY() + offset, hopper.getZ() + 0.5); for (Entity n: l.getChunk().getEntities()) { - if (n instanceof ArmorStand) { - if (n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; - } - } - - if (!createIfNoneFound) { - return null; + if (n instanceof ArmorStand && n.getCustomName() == null && l.distanceSquared(n.getLocation()) < 0.4D) return (ArmorStand) n; } + if (!createIfNoneExists) return null; + ArmorStand hologram = ArmorStandFactory.createHidden(l); hologram.setCustomNameVisible(false); hologram.setCustomName(null); return hologram; } + + public static void remove(Block b) { + ArmorStand hologram = getArmorStand(b, false); + if (hologram != null) hologram.remove(); + } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ClearLaggIntegration.java b/src/me/mrCookieSlime/Slimefun/hooks/ClearLagHook.java similarity index 62% rename from src/me/mrCookieSlime/Slimefun/listeners/ClearLaggIntegration.java rename to src/me/mrCookieSlime/Slimefun/hooks/ClearLagHook.java index 0ebea10e0..170e1c27b 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ClearLaggIntegration.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/ClearLagHook.java @@ -1,18 +1,18 @@ -package me.mrCookieSlime.Slimefun.listeners; +package me.mrCookieSlime.Slimefun.hooks; import java.util.Iterator; import me.minebuilders.clearlag.events.EntityRemoveEvent; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -public class ClearLaggIntegration implements Listener { +public class ClearLagHook implements Listener { - public ClearLaggIntegration(SlimefunStartup plugin) { + public ClearLagHook(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -21,9 +21,7 @@ public class ClearLaggIntegration implements Listener { Iterator iterator = e.getEntityList().iterator(); while (iterator.hasNext()) { Entity n = iterator.next(); - if (n instanceof Item) { - if (n.hasMetadata("no_pickup")) iterator.remove(); - } + if (n instanceof Item && n.hasMetadata("no_pickup")) iterator.remove(); } } } diff --git a/src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java b/src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java index c8dc2042b..f8bf8b952 100644 --- a/src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java @@ -6,7 +6,7 @@ import java.util.stream.Stream; import org.bukkit.OfflinePlayer; import me.clip.placeholderapi.expansion.PlaceholderExpansion; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; @@ -15,7 +15,7 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { @Override public String getAuthor() { - return SlimefunStartup.instance.getDescription().getAuthors().toString(); + return SlimefunPlugin.instance.getDescription().getAuthors().toString(); } @Override @@ -25,7 +25,7 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { @Override public String getVersion() { - return SlimefunStartup.instance.getDescription().getVersion(); + return SlimefunPlugin.instance.getDescription().getVersion(); } @Override @@ -42,7 +42,7 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { public String onRequest(OfflinePlayer p, String params) { if (params.equals("researches_total_xp_levels_spent")) { Stream stream = PlayerProfile.fromUUID(p.getUniqueId()).getResearches().stream(); - return String.valueOf(stream.mapToInt(r -> r.getCost()).sum()); + return String.valueOf(stream.mapToInt(Research::getCost).sum()); } if (params.equals("researches_total_researches_unlocked")) { @@ -56,7 +56,7 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { if (params.equals("researches_percentage_researches_unlocked")) { Set set = PlayerProfile.fromUUID(p.getUniqueId()).getResearches(); - return String.valueOf(Math.round(((set.size() * 100.0f) / Research.list().size()) * 100.0f) / 100.0f); + return String.valueOf(Math.round(((set.size() * 100.0F) / Research.list().size()) * 100.0F) / 100.0F); } if (params.equals("researches_title")) { @@ -68,7 +68,7 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { } if (params.equals("timings_lag")) { - return SlimefunStartup.ticker.getTime() + "ms"; + return SlimefunPlugin.getTicker().getTime() + "ms"; } return null; diff --git a/src/me/mrCookieSlime/Slimefun/hooks/SlimefunHooks.java b/src/me/mrCookieSlime/Slimefun/hooks/SlimefunHooks.java new file mode 100644 index 000000000..0f074b8ba --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/hooks/SlimefunHooks.java @@ -0,0 +1,101 @@ +package me.mrCookieSlime.Slimefun.hooks; + +import java.util.logging.Level; + +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.Slimefun; +import net.coreprotect.CoreProtect; +import net.coreprotect.CoreProtectAPI; + +public final class SlimefunHooks { + + private SlimefunPlugin plugin; + + private boolean exoticGarden = false; + private boolean emeraldEnchants = false; + private boolean coreProtect = false; + private boolean clearLag = false; + private boolean worldEdit = false; + private boolean placeHolderAPI = false; + + private CoreProtectAPI coreProtectAPI; + + public SlimefunHooks(SlimefunPlugin plugin) { + this.plugin = plugin; + + if (isPluginInstalled("PlaceholderAPI")) { + placeHolderAPI = true; + new PlaceholderAPIHook().register(); + } + + /* + * These Items are not marked as soft-dependencies and + * therefore need to be loaded after the Server has finished + * loading all plugins + */ + plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (isPluginInstalled("ClearLag")) { + clearLag = true; + new ClearLagHook(plugin); + } + + exoticGarden = isPluginInstalled("ExoticGarden"); + emeraldEnchants = isPluginInstalled("EmeraldEnchants"); + + if (isPluginInstalled("CoreProtect")) { + coreProtectAPI = ((CoreProtect) plugin.getServer().getPluginManager().getPlugin("CoreProtect")).getAPI(); + } + + // WorldEdit Hook to clear Slimefun Data upon //set 0 //cut or any other equivalent + if (isPluginInstalled("WorldEdit")) { + try { + Class.forName("com.sk89q.worldedit.extent.Extent"); + worldEdit = true; + new WorldEditHook(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.WARNING, "Failed to hook into WorldEdit!"); + Slimefun.getLogger().log(Level.WARNING, "Maybe consider updating WorldEdit or Slimefun?"); + } + } + }); + } + + private boolean isPluginInstalled(String hook) { + if (plugin.getServer().getPluginManager().isPluginEnabled(hook)) { + Slimefun.getLogger().log(Level.INFO, "Hooked into Plugin: " + hook); + return true; + } + else { + return false; + } + } + + public boolean isExoticGardenInstalled() { + return exoticGarden; + } + + public boolean isEmeraldEnchantsInstalled() { + return emeraldEnchants; + } + + public boolean isCoreProtectInstalled() { + return coreProtect; + } + + public boolean isClearLagInstalled() { + return clearLag; + } + + public boolean isWorldEditInstalled() { + return worldEdit; + } + + public boolean isPlaceholderAPIInstalled() { + return placeHolderAPI; + } + + public CoreProtectAPI getCoreProtectAPI() { + return coreProtectAPI; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/hooks/github/Contributor.java b/src/me/mrCookieSlime/Slimefun/hooks/github/Contributor.java index a16211c91..c165ce4eb 100644 --- a/src/me/mrCookieSlime/Slimefun/hooks/github/Contributor.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/Contributor.java @@ -1,7 +1,6 @@ package me.mrCookieSlime.Slimefun.hooks.github; -import java.util.HashMap; -import java.util.Map; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; /** * Represents a contributor on Slimefun4's GitHub repository. @@ -10,8 +9,6 @@ import java.util.Map; */ public class Contributor { - public static Map textures = new HashMap<>(); - private String name; private String job; private String profile; @@ -72,6 +69,6 @@ public class Contributor { * @return A Base64-Head Texture */ public String getTexture() { - return textures.get(name); + return SlimefunPlugin.getUtilities().contributorHeads.get(name); } } diff --git a/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubConnector.java b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubConnector.java index 450fb4691..ea760b4f6 100644 --- a/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubConnector.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubConnector.java @@ -9,49 +9,53 @@ import java.net.URL; import java.net.URLConnection; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; -import java.util.HashSet; -import java.util.Set; +import java.util.logging.Level; import com.google.gson.JsonElement; import com.google.gson.JsonParser; -import me.mrCookieSlime.Slimefun.SlimefunStartup; + +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.Slimefun; public abstract class GitHubConnector { - - public static Set connectors = new HashSet(); - + private File file; public GitHubConnector() { this.file = new File("plugins/Slimefun/cache/github/" + this.getFileName() + ".json"); - connectors.add(this); + SlimefunPlugin.getUtilities().connectors.add(this); } - + public abstract String getFileName(); public abstract String getRepository(); public abstract String getURLSuffix(); public abstract void onSuccess(JsonElement element); public abstract void onFailure(); - + public void pullFile() { - if (SlimefunStartup.getCfg().getBoolean("options.print-out-github-data-retrieving")) System.out.println("[Slimefun - GitHub] Retrieving '" + this.getFileName() + ".json' from GitHub..."); - + if (SlimefunPlugin.getCfg().getBoolean("options.print-out-github-data-retrieving")) { + Slimefun.getLogger().log(Level.INFO, "Retrieving '" + this.getFileName() + ".json' from GitHub..."); + } + try { URL website = new URL("https://api.github.com/repos/" + this.getRepository() + this.getURLSuffix()); - + URLConnection connection = website.openConnection(); - connection.setConnectTimeout(3000); - connection.addRequestProperty("User-Agent", "Slimefun 4 GitHub Agent (by TheBusyBiscuit)"); - connection.setDoOutput(true); - - ReadableByteChannel rbc = Channels.newChannel(connection.getInputStream()); - FileOutputStream fos = new FileOutputStream(file); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - this.parseData(); + connection.setConnectTimeout(3000); + connection.addRequestProperty("User-Agent", "Slimefun 4 GitHub Agent (by TheBusyBiscuit)"); + connection.setDoOutput(true); + + try (ReadableByteChannel channel = Channels.newChannel(connection.getInputStream())) { + try (FileOutputStream stream = new FileOutputStream(file)) { + stream.getChannel().transferFrom(channel, 0, Long.MAX_VALUE); + this.parseData(); + } + } } catch (IOException e) { - if (SlimefunStartup.getCfg().getBoolean("options.print-out-github-data-retrieving")) System.err.println("[Slimefun - GitHub] ERROR - Could not connect to GitHub in time."); - + if (SlimefunPlugin.getCfg().getBoolean("options.print-out-github-data-retrieving")) { + Slimefun.getLogger().log(Level.WARNING, "Could not connect to GitHub in time."); + } + if (hasData()) { this.parseData(); } @@ -60,34 +64,29 @@ public abstract class GitHubConnector { } } } - + public boolean hasData() { return this.getFile().exists(); } - + public File getFile() { return this.file; } public void parseData() { - try { - BufferedReader reader = new BufferedReader(new FileReader(this.getFile())); - - String full = ""; - + try (BufferedReader reader = new BufferedReader(new FileReader(this.getFile()))) { + StringBuilder builder = new StringBuilder(); + String line; - while ((line = reader.readLine()) != null) { - full = full + line; - } - - reader.close(); - - JsonElement element = new JsonParser().parse(full); - - this.onSuccess(element); + while ((line = reader.readLine()) != null) { + builder.append(line); + } + + JsonElement element = new JsonParser().parse(builder.toString()); + this.onSuccess(element); } - catch (IOException e) { - e.printStackTrace(); + catch (IOException x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while parsing GitHub-Data for Slimefun " + Slimefun.getVersion(), x); this.onFailure(); } } diff --git a/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubSetup.java b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubSetup.java index bef92fced..23613a607 100644 --- a/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubSetup.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubSetup.java @@ -3,23 +3,26 @@ package me.mrCookieSlime.Slimefun.hooks.github; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; +import java.util.logging.Level; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import me.mrCookieSlime.Slimefun.SlimefunGuide; -import me.mrCookieSlime.Slimefun.SlimefunStartup; - -public class GitHubSetup { +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.Slimefun; +public final class GitHubSetup { + + private GitHubSetup() {} + public static void setup() { new GitHubConnector() { @Override public void onSuccess(JsonElement element) { - SlimefunGuide.contributors.clear(); + SlimefunPlugin.getUtilities().contributors.clear(); JsonArray array = element.getAsJsonArray(); for (int i = 0; i < array.size(); i++) { @@ -33,49 +36,52 @@ public class GitHubSetup { if (!name.equals("invalid-email-address")) { Contributor contributor = new Contributor(name, job, commits); contributor.setProfile(profile); - SlimefunGuide.contributors.add(contributor); + SlimefunPlugin.getUtilities().contributors.add(contributor); } } - SlimefunGuide.contributors.add(new Contributor("AquaLazuryt", "&6Lead Head Artist", 0)); + SlimefunPlugin.getUtilities().contributors.add(new Contributor("AquaLazuryt", "&6Lead Head Artist", 0)); - SlimefunStartup.instance.getServer().getScheduler().runTaskAsynchronously(SlimefunStartup.instance, () -> { + SlimefunPlugin.instance.getServer().getScheduler().runTaskAsynchronously(SlimefunPlugin.instance, () -> { for (JsonElement e: array) { String name = e.getAsJsonObject().get("login").getAsString(); - if (Contributor.textures.containsKey(name)) continue; + if (SlimefunPlugin.getUtilities().contributorHeads.containsKey(name)) { + continue; + } - InputStreamReader profile_reader = null, session_reader = null; + InputStreamReader profileReader = null; + InputStreamReader sessionReader = null; try { URL profile = new URL("https://api.mojang.com/users/profiles/minecraft/" + name); - profile_reader = new InputStreamReader(profile.openStream()); - String uuid = new JsonParser().parse(profile_reader).getAsJsonObject().get("id").getAsString(); + profileReader = new InputStreamReader(profile.openStream()); + String uuid = new JsonParser().parse(profileReader).getAsJsonObject().get("id").getAsString(); URL session = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false"); - session_reader = new InputStreamReader(session.openStream()); - JsonArray properties = new JsonParser().parse(session_reader).getAsJsonObject().get("properties").getAsJsonArray(); + sessionReader = new InputStreamReader(session.openStream()); + JsonArray properties = new JsonParser().parse(sessionReader).getAsJsonObject().get("properties").getAsJsonArray(); for (JsonElement el: properties) { if (el.isJsonObject() && el.getAsJsonObject().get("name").getAsString().equals("textures")) { - Contributor.textures.put(name, el.getAsJsonObject().get("value").getAsString()); + SlimefunPlugin.getUtilities().contributorHeads.put(name, el.getAsJsonObject().get("value").getAsString()); break; } } } catch (Exception x) { - Contributor.textures.put(name, null); + if (SlimefunPlugin.isActive()) SlimefunPlugin.getUtilities().contributorHeads.put(name, null); } finally { - if (profile_reader != null) { + if (profileReader != null) { try { - profile_reader.close(); + profileReader.close(); } catch (IOException x) { - x.printStackTrace(); + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while closing GitHub-Stream for Slimefun " + Slimefun.getVersion(), x); } } - if (session_reader != null) { + if (sessionReader != null) { try { - session_reader.close(); + sessionReader.close(); } catch (IOException x) { - x.printStackTrace(); + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while closing GitHub-Stream for Slimefun " + Slimefun.getVersion(), x); } } } @@ -85,10 +91,10 @@ public class GitHubSetup { @Override public void onFailure() { - SlimefunGuide.contributors.clear(); - SlimefunGuide.contributors.add(new Contributor("TheBusyBiscuit", "&cAuthor", 3)); - SlimefunGuide.contributors.add(new Contributor("John000708", "&cAuthor", 2)); - SlimefunGuide.contributors.add(new Contributor("AquaLazuryt", "&6Lead Head Artist", 0)); + SlimefunPlugin.getUtilities().contributors.clear(); + SlimefunPlugin.getUtilities().contributors.add(new Contributor("TheBusyBiscuit", "&cAuthor", 3)); + SlimefunPlugin.getUtilities().contributors.add(new Contributor("John000708", "&cAuthor", 2)); + SlimefunPlugin.getUtilities().contributors.add(new Contributor("AquaLazuryt", "&6Lead Head Artist", 0)); } @Override @@ -112,14 +118,15 @@ public class GitHubSetup { @Override public void onSuccess(JsonElement element) { JsonObject object = element.getAsJsonObject(); - SlimefunGuide.issues = object.get("open_issues_count").getAsInt(); - SlimefunGuide.forks = object.get("forks").getAsInt(); - SlimefunGuide.stars = object.get("stargazers_count").getAsInt(); - SlimefunGuide.last_update = IntegerFormat.parseGitHubDate(object.get("pushed_at").getAsString()); + SlimefunPlugin.getUtilities().issues = object.get("open_issues_count").getAsInt(); + SlimefunPlugin.getUtilities().forks = object.get("forks").getAsInt(); + SlimefunPlugin.getUtilities().stars = object.get("stargazers_count").getAsInt(); + SlimefunPlugin.getUtilities().lastUpdate = IntegerFormat.parseGitHubDate(object.get("pushed_at").getAsString()); } @Override public void onFailure() { + // We don't have to do anything on failure } @Override @@ -143,11 +150,12 @@ public class GitHubSetup { @Override public void onSuccess(JsonElement element) { JsonObject object = element.getAsJsonObject(); - SlimefunGuide.code_bytes = object.get("Java").getAsInt(); + SlimefunPlugin.getUtilities().codeBytes = object.get("Java").getAsInt(); } @Override public void onFailure() { + // We don't have to do anything on failure } @Override diff --git a/src/me/mrCookieSlime/Slimefun/hooks/github/IntegerFormat.java b/src/me/mrCookieSlime/Slimefun/hooks/github/IntegerFormat.java index 3b4d1cf82..794a5f1bf 100644 --- a/src/me/mrCookieSlime/Slimefun/hooks/github/IntegerFormat.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/IntegerFormat.java @@ -5,20 +5,23 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +import java.util.logging.Level; -public class IntegerFormat { +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public final class IntegerFormat { + + private IntegerFormat() {} - private static final SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - public static String formatBigNumber(int i) { return NumberFormat.getNumberInstance(Locale.US).format(i); } public static Date parseGitHubDate(String str) { try { - return date_format.parse(str.replace("T", " ").replace("Z", "")); - } catch (ParseException e) { - e.printStackTrace(); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(str.replace("T", " ").replace("Z", "")); + } catch (ParseException x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while parsing a GitHub-Date for Slimefun " + Slimefun.getVersion(), x); return null; } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java b/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java index 46f042e97..36d33a926 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java @@ -16,12 +16,12 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Android.AndroidObject; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.androids.AndroidObject; public class AndroidKillingListener implements Listener { - public AndroidKillingListener(SlimefunStartup plugin) { + public AndroidKillingListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -30,8 +30,9 @@ public class AndroidKillingListener implements Listener { if (e.getEntity().hasMetadata("android_killer")) { final AndroidObject obj = (AndroidObject) e.getEntity().getMetadata("android_killer").get(0).value(); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { List items = new ArrayList<>(); + for (Entity n : e.getEntity().getNearbyEntities(0.5D, 0.5D, 0.5D)) { if (n instanceof Item && !n.hasMetadata("no_pickup")) { items.add(((Item) n).getItemStack()); @@ -40,18 +41,15 @@ public class AndroidKillingListener implements Listener { } switch (e.getEntityType()) { - case BLAZE: { + case BLAZE: items.add(new ItemStack(Material.BLAZE_ROD, 1 + CSCoreLib.randomizer().nextInt(2))); break; - } - case PIG_ZOMBIE: { + case PIG_ZOMBIE: items.add(new ItemStack(Material.GOLD_NUGGET, 1 + CSCoreLib.randomizer().nextInt(3))); break; - } - case WITHER_SKELETON: { + case WITHER_SKELETON: if (CSCoreLib.randomizer().nextInt(250) < 2) items.add(new ItemStack(Material.WITHER_SKELETON_SKULL)); break; - } default: break; } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ArmorListener.java b/src/me/mrCookieSlime/Slimefun/listeners/ArmorListener.java index e6b61681e..14eea8608 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ArmorListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/ArmorListener.java @@ -1,6 +1,6 @@ package me.mrCookieSlime.Slimefun.listeners; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; @@ -28,7 +28,7 @@ import org.bukkit.util.Vector; public class ArmorListener implements Listener { - public ArmorListener(SlimefunStartup plugin) { + public ArmorListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -39,9 +39,7 @@ public class ArmorListener implements Listener { for (ItemStack armor: p.getInventory().getArmorContents()) { if (armor != null && SlimefunItem.getByItem(armor) != null) { if (SlimefunItem.getByItem(armor).isItem(SlimefunItems.ENDER_BOOTS) && Slimefun.hasUnlocked(p, SlimefunItems.ENDER_BOOTS, true)) { - if (e instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) e).getDamager() instanceof EnderPearl) e.setCancelled(true); - } + if (e instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) e).getDamager() instanceof EnderPearl) e.setCancelled(true); } else if (SlimefunItem.getByItem(armor).isItem(SlimefunItems.SLIME_BOOTS) && Slimefun.hasUnlocked(p, SlimefunItems.SLIME_BOOTS, true)) { if (e.getCause() == DamageCause.FALL) e.setCancelled(true); @@ -68,9 +66,7 @@ public class ArmorListener implements Listener { } } } - else if (SlimefunItem.getByItem(armor).isItem(SlimefunItems.SLIME_BOOTS_STEEL) && Slimefun.hasUnlocked(p, SlimefunItems.SLIME_BOOTS_STEEL, true)) { - if (e.getCause() == DamageCause.FALL) e.setCancelled(true); - } + else if (SlimefunItem.getByItem(armor).isItem(SlimefunItems.SLIME_BOOTS_STEEL) && Slimefun.hasUnlocked(p, SlimefunItems.SLIME_BOOTS_STEEL, true) && e.getCause() == DamageCause.FALL) e.setCancelled(true); } } } @@ -78,8 +74,6 @@ public class ArmorListener implements Listener { @EventHandler public void onTrample(PlayerInteractEvent e) { - if (e.getAction() == Action.PHYSICAL && e.getClickedBlock().getType() == Material.FARMLAND) { - if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getBoots(), SlimefunItem.getItem("FARMER_SHOES"), true)) e.setCancelled(true); - } + if (e.getAction() == Action.PHYSICAL && e.getClickedBlock().getType() == Material.FARMLAND && SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getBoots(), SlimefunItem.getItem("FARMER_SHOES"), true)) e.setCancelled(true); } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/AutonomousToolsListener.java b/src/me/mrCookieSlime/Slimefun/listeners/AutonomousToolsListener.java index a9301e426..41ccc545a 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/AutonomousToolsListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/AutonomousToolsListener.java @@ -1,12 +1,5 @@ package me.mrCookieSlime.Slimefun.listeners; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.AutonomousMachineHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.AutonomousToolHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; -import me.mrCookieSlime.Slimefun.api.BlockStorage; - import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -16,9 +9,15 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockDispenseEvent; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.AutonomousMachineHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + public class AutonomousToolsListener implements Listener { - public AutonomousToolsListener(SlimefunStartup plugin) { + public AutonomousToolsListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -39,13 +38,6 @@ public class AutonomousToolsListener implements Listener { if (((AutonomousMachineHandler) handler).onBlockDispense(e, dispenser, d, block, chest, machine)) break; } } - else { - for (int i = 0; i < d.getInventory().getContents().length; i++) { - for (ItemHandler handler: SlimefunItem.getHandlers("AutonomousToolHandler")) { - if (((AutonomousToolHandler) handler).onBlockDispense(e, dispenser, d, block, chest, i)) break; - } - } - } } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java b/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java index 3f9a94908..bfcba58bb 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java @@ -17,8 +17,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Juice; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack; @@ -28,27 +27,31 @@ import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.inventory.BackpackInventory; +import me.mrCookieSlime.Slimefun.utils.Utilities; public class BackpackListener implements Listener { - public BackpackListener(SlimefunStartup plugin) { + private Utilities utilities; + + public BackpackListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); + utilities = SlimefunPlugin.getUtilities(); } @EventHandler public void onClose(InventoryCloseEvent e) { - if (Variables.enchanting.containsKey(e.getPlayer().getUniqueId())) Variables.enchanting.remove(e.getPlayer().getUniqueId()); + if (utilities.enchanting.containsKey(e.getPlayer().getUniqueId())) utilities.enchanting.remove(e.getPlayer().getUniqueId()); - if (Variables.backpack.containsKey(e.getPlayer().getUniqueId())) { + if (utilities.backpack.containsKey(e.getPlayer().getUniqueId())) { ((Player) e.getPlayer()).playSound(e.getPlayer().getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - PlayerProfile.getBackpack(Variables.backpack.get(e.getPlayer().getUniqueId())).markDirty(); - Variables.backpack.remove(e.getPlayer().getUniqueId()); + PlayerProfile.getBackpack(utilities.backpack.get(e.getPlayer().getUniqueId())).markDirty(); + utilities.backpack.remove(e.getPlayer().getUniqueId()); } } @EventHandler public void onItemDrop(PlayerDropItemEvent e) { - if (Variables.backpack.containsKey(e.getPlayer().getUniqueId())){ + if (utilities.backpack.containsKey(e.getPlayer().getUniqueId())){ ItemStack item = e.getItemDrop().getItemStack(); SlimefunItem sfItem = SlimefunItem.getByItem(item); if (sfItem instanceof SlimefunBackpack) e.setCancelled(true); @@ -57,22 +60,23 @@ public class BackpackListener implements Listener { @EventHandler public void onClick(InventoryClickEvent e) { - if (Variables.backpack.containsKey(e.getWhoClicked().getUniqueId())) { - ItemStack item = Variables.backpack.get(e.getWhoClicked().getUniqueId()); + if (utilities.backpack.containsKey(e.getWhoClicked().getUniqueId())) { + ItemStack item = utilities.backpack.get(e.getWhoClicked().getUniqueId()); if (e.getClick() == ClickType.NUMBER_KEY) { ItemStack hotbarItem = e.getWhoClicked().getInventory().getItem(e.getHotbarButton()); SlimefunItem sfItem = SlimefunItem.getByItem(hotbarItem); - if (hotbarItem != null && hotbarItem.getType().toString().contains("SHULKER_BOX")) e.setCancelled(true); - else if (sfItem instanceof SlimefunBackpack) e.setCancelled(true); + if ((hotbarItem != null && hotbarItem.getType().toString().contains("SHULKER_BOX")) || + sfItem instanceof SlimefunBackpack) + + e.setCancelled(true); } - else { + else if (e.getCurrentItem() != null && e.getCurrentItem().getType() != Material.AIR) { SlimefunItem sfItem = SlimefunItem.getByItem(e.getCurrentItem()); - if (SlimefunManager.isItemSimiliar(item, SlimefunItem.getItem("COOLER"), false)) { - if (e.getCurrentItem() == null || e.getCurrentItem().getType().equals(Material.AIR)); - else if (!(sfItem instanceof Juice)) e.setCancelled(true); - } - else if (e.getCurrentItem() != null && e.getCurrentItem().getType().toString().contains("SHULKER_BOX")) e.setCancelled(true); - else if (sfItem instanceof SlimefunBackpack) e.setCancelled(true); + if ((SlimefunManager.isItemSimiliar(item, SlimefunItem.getItem("COOLER"), false) && !(sfItem instanceof Juice)) || + e.getCurrentItem().getType().toString().contains("SHULKER_BOX") || + sfItem instanceof SlimefunBackpack) + + e.setCancelled(true); } } } @@ -130,10 +134,10 @@ public class BackpackListener implements Listener { } } - if(!Variables.backpack.containsValue(item)) { + if(!utilities.backpack.containsValue(item)) { PlayerProfile.getBackpack(item).open(p); p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); + utilities.backpack.put(p.getUniqueId(), item); } else Messages.local.sendTranslation(p, "backpack.already-open", true); } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java b/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java index 7d48511c1..652d5e2e9 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java @@ -3,15 +3,6 @@ package me.mrCookieSlime.Slimefun.listeners; import java.util.ArrayList; import java.util.List; -import me.mrCookieSlime.CSCoreLibPlugin.general.Block.BlockAdjacents; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Events.MultiBlockInteractEvent; -import me.mrCookieSlime.Slimefun.Objects.MultiBlock; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.MultiBlockInteractionHandler; -import me.mrCookieSlime.Slimefun.api.BlockStorage; - import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; @@ -28,21 +19,28 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import me.mrCookieSlime.CSCoreLibPlugin.general.Block.BlockAdjacents; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Events.MultiBlockInteractEvent; +import me.mrCookieSlime.Slimefun.Objects.MultiBlock; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.MultiBlockInteractionHandler; +import me.mrCookieSlime.Slimefun.api.BlockStorage; + public class BlockListener implements Listener { - public BlockListener(SlimefunStartup plugin) { + public BlockListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler public void onBlockFall(EntityChangeBlockEvent event) { - if (event.getEntity() instanceof FallingBlock) { - if (BlockStorage.hasBlockInfo(event.getBlock())) { - event.setCancelled(true); - FallingBlock fb = (FallingBlock) event.getEntity(); - if (fb.getDropItem()) { - fb.getWorld().dropItemNaturally(fb.getLocation(), new ItemStack(fb.getBlockData().getMaterial(), 1)); - } + if (event.getEntity() instanceof FallingBlock && BlockStorage.hasBlockInfo(event.getBlock())) { + event.setCancelled(true); + FallingBlock fb = (FallingBlock) event.getEntity(); + if (fb.getDropItem()) { + fb.getWorld().dropItemNaturally(fb.getLocation(), new ItemStack(fb.getBlockData().getMaterial(), 1)); } } } @@ -50,13 +48,11 @@ public class BlockListener implements Listener { @EventHandler public void onPistonExtend(BlockPistonExtendEvent e) { for (Block b : e.getBlocks()) { - if (BlockStorage.hasBlockInfo(b)) { - e.setCancelled(true); - return; - } - else if (b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { - e.setCancelled(true); - return; + if (BlockStorage.hasBlockInfo(b) || + b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { + + e.setCancelled(true); + return; } } } @@ -65,13 +61,11 @@ public class BlockListener implements Listener { public void onPistonRetract(BlockPistonRetractEvent e) { if (e.isSticky()) { for (Block b : e.getBlocks()) { - if (BlockStorage.hasBlockInfo(b)) { - e.setCancelled(true); - return; - } - else if (b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { - e.setCancelled(true); - return; + if (BlockStorage.hasBlockInfo(b) || + b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { + + e.setCancelled(true); + return; } } } @@ -80,7 +74,7 @@ public class BlockListener implements Listener { @EventHandler public void onRightClick(PlayerInteractEvent e) { if (e.getAction() == Action.RIGHT_CLICK_BLOCK) { - if (!e.getHand().equals(EquipmentSlot.HAND)) return; + if (e.getHand() != EquipmentSlot.HAND) return; Player p = e.getPlayer(); Block b = e.getClickedBlock(); List multiblocks = new ArrayList<>(); @@ -105,51 +99,48 @@ public class BlockListener implements Listener { else multiblocks.add(mb); } } - else if (mb.getTriggerBlock() == blocks[4]) { - if ( - BlockAdjacents.hasMaterialOnSide(b, blocks[3]) && - BlockAdjacents.hasMaterialOnSide(b, blocks[5]) && - BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN), blocks[7]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[6]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[8]) && - BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[1]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[0]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[2]) - ) { - if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[0])); - else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[5])); - else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -1, 0), blocks[8])); - else multiblocks.add(mb);; - } + else if (mb.getTriggerBlock() == blocks[4] && + BlockAdjacents.hasMaterialOnSide(b, blocks[3]) && + BlockAdjacents.hasMaterialOnSide(b, blocks[5]) && + BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN), blocks[7]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[6]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[8]) && + BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[1]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[0]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[2]) + ) { + if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[0])); + else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[5])); + else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -1, 0), blocks[8])); + else multiblocks.add(mb); } - else if (mb.getTriggerBlock() == blocks[7]) { - if ( - BlockAdjacents.hasMaterialOnSide(b, blocks[6]) && - BlockAdjacents.hasMaterialOnSide(b, blocks[8]) && - BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[1]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[0]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[2]) && - BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[4]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[3]) && - BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[5]) - ) { - if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 2, 0), blocks[0])); - else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[5])); - else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[8])); - else multiblocks.add(mb);; - } + else if (mb.getTriggerBlock() == blocks[7] && + BlockAdjacents.hasMaterialOnSide(b, blocks[6]) && + BlockAdjacents.hasMaterialOnSide(b, blocks[8]) && + BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[1]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[0]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[2]) && + BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[4]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[3]) && + BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[5]) + ) { + if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 2, 0), blocks[0])); + else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[5])); + else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[8])); + else multiblocks.add(mb); } } } if (!multiblocks.isEmpty()) { e.setCancelled(true); + MultiBlock multiblock = multiblocks.get(multiblocks.size() - 1); for (ItemHandler handler: SlimefunItem.getHandlers("MultiBlockInteractionHandler")) { - if (((MultiBlockInteractionHandler) handler).onInteract(p, multiblocks.get(multiblocks.size() - 1), b)) break; + if (((MultiBlockInteractionHandler) handler).onInteract(p, multiblock, b)) break; } - MultiBlockInteractEvent event = new MultiBlockInteractEvent(p, multiblocks.get(multiblocks.size() - 1), b); + MultiBlockInteractEvent event = new MultiBlockInteractEvent(p, multiblock, b); Bukkit.getPluginManager().callEvent(event); } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/BowListener.java b/src/me/mrCookieSlime/Slimefun/listeners/BowListener.java index db9a5fb12..244690593 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/BowListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/BowListener.java @@ -14,81 +14,83 @@ import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.util.Vector; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BowShootHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.utils.Utilities; public class BowListener implements Listener { - public BowListener(SlimefunStartup plugin) { - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } + private Utilities utilities; + public BowListener(SlimefunPlugin plugin) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + utilities = SlimefunPlugin.getUtilities(); + } + @EventHandler public void onBowUse(EntityShootBowEvent e) { if (!(e.getEntity() instanceof Player) || !(e.getProjectile() instanceof Arrow)) return; - if (SlimefunItem.getByItem(e.getBow()) != null) Variables.arrows.put(e.getProjectile().getUniqueId(), e.getBow()); + if (SlimefunItem.getByItem(e.getBow()) != null) utilities.arrows.put(e.getProjectile().getUniqueId(), e.getBow()); } @EventHandler public void onArrowHit(final ProjectileHitEvent e) { - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { if (!e.getEntity().isValid()) return; - if (Variables.arrows.containsKey(e.getEntity().getUniqueId())) Variables.arrows.remove(e.getEntity().getUniqueId()); + utilities.arrows.remove(e.getEntity().getUniqueId()); if (e.getEntity() instanceof Arrow) handleGrapplingHook((Arrow) e.getEntity()); }, 4L); } private void handleGrapplingHook(Arrow arrow) { - if (arrow != null) { - if (arrow.getShooter() instanceof Player && Variables.jump_state.containsKey(((Player) arrow.getShooter()).getUniqueId())) { - final Player p = (Player) arrow.getShooter(); - if (p.getGameMode() != GameMode.CREATIVE && Variables.jump_state.get(p.getUniqueId())) arrow.getWorld().dropItem(arrow.getLocation(), SlimefunItem.getItem("GRAPPLING_HOOK")); - if (p.getLocation().distance(arrow.getLocation()) < 3.0D) { - if (arrow.getLocation().getY() > p.getLocation().getY()) { - p.setVelocity(new Vector(0.0D, 0.25D, 0.0D)); - } - else p.setVelocity(arrow.getLocation().toVector().subtract(p.getLocation().toVector())); - for (Entity n: Variables.remove.get(p.getUniqueId())) { - n.remove(); - } - - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - Variables.jump_state.remove(p.getUniqueId()); - Variables.remove.remove(p.getUniqueId()); - }, 20L); + if (arrow != null && arrow.getShooter() instanceof Player && utilities.jumpState.containsKey(((Player) arrow.getShooter()).getUniqueId())) { + final Player p = (Player) arrow.getShooter(); + if (p.getGameMode() != GameMode.CREATIVE && utilities.jumpState.get(p.getUniqueId())) arrow.getWorld().dropItem(arrow.getLocation(), SlimefunItem.getItem("GRAPPLING_HOOK")); + if (p.getLocation().distance(arrow.getLocation()) < 3.0D) { + if (arrow.getLocation().getY() > p.getLocation().getY()) { + p.setVelocity(new Vector(0.0D, 0.25D, 0.0D)); } - else { - Location l = p.getLocation(); - l.setY(l.getY() + 0.5D); - p.teleport(l); - - double g = -0.08D; - double d = arrow.getLocation().distance(l); - double t = d; - double v_x = (1.0D + 0.08000000000000001D * t) * (arrow.getLocation().getX() - l.getX()) / t; - double v_y = (1.0D + 0.04D * t) * (arrow.getLocation().getY() - l.getY()) / t - 0.5D * g * t; - double v_z = (1.0D + 0.08000000000000001D * t) * (arrow.getLocation().getZ() - l.getZ()) / t; + else p.setVelocity(arrow.getLocation().toVector().subtract(p.getLocation().toVector())); - Vector v = p.getVelocity(); - - v.setX(v_x); - v.setY(v_y); - v.setZ(v_z); - - p.setVelocity(v); - - for (Entity n: Variables.remove.get(p.getUniqueId())) { - n.remove(); - } - - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - Variables.jump_state.remove(p.getUniqueId()); - Variables.remove.remove(p.getUniqueId()); - }, 20L); + for (Entity n: utilities.remove.get(p.getUniqueId())) { + if (n.isValid()) n.remove(); } + + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + utilities.jumpState.remove(p.getUniqueId()); + utilities.remove.remove(p.getUniqueId()); + }, 20L); + } + else { + Location l = p.getLocation(); + l.setY(l.getY() + 0.5D); + p.teleport(l); + + double g = -0.08D; + double d = arrow.getLocation().distance(l); + double t = d; + double vX = (1.0D + 0.08000000000000001D * t) * (arrow.getLocation().getX() - l.getX()) / t; + double vY = (1.0D + 0.04D * t) * (arrow.getLocation().getY() - l.getY()) / t - 0.5D * g * t; + double vZ = (1.0D + 0.08000000000000001D * t) * (arrow.getLocation().getZ() - l.getZ()) / t; + + Vector v = p.getVelocity(); + + v.setX(vX); + v.setY(vY); + v.setZ(vZ); + + p.setVelocity(v); + + for (Entity n: utilities.remove.get(p.getUniqueId())) { + if (n.isValid()) n.remove(); + } + + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + utilities.jumpState.remove(p.getUniqueId()); + utilities.remove.remove(p.getUniqueId()); + }, 20L); } } } @@ -96,11 +98,11 @@ public class BowListener implements Listener { @EventHandler public void onArrowSuccessfulHit(EntityDamageByEntityEvent e) { if (e.getDamager() instanceof Arrow) { - if (Variables.arrows.containsKey(e.getDamager().getUniqueId()) && e.getEntity() instanceof LivingEntity) { + if (utilities.arrows.containsKey(e.getDamager().getUniqueId()) && e.getEntity() instanceof LivingEntity) { for (ItemHandler handler: SlimefunItem.getHandlers("BowShootHandler")) { if (((BowShootHandler) handler).onHit(e, (LivingEntity) e.getEntity())) break; } - Variables.arrows.remove(e.getDamager().getUniqueId()); + utilities.arrows.remove(e.getDamager().getUniqueId()); } handleGrapplingHook((Arrow) e.getDamager()); diff --git a/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java b/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java index 81e3cf788..2f86191e3 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java @@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionEffect; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.PlayerProfile; @@ -19,7 +19,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BackpackInventory; public class CoolerListener implements Listener { - public CoolerListener(SlimefunStartup plugin) { + public CoolerListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java b/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java index ebb266e4c..e64d53b3b 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java @@ -1,19 +1,12 @@ package me.mrCookieSlime.Slimefun.listeners; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; import java.util.Iterator; -import java.util.List; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.ChestedHorse; -import org.bukkit.entity.Creeper; import org.bukkit.entity.Player; -import org.bukkit.entity.Skeleton; -import org.bukkit.entity.WitherSkeleton; -import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; @@ -21,28 +14,29 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.SkullMeta; import me.mrCookieSlime.EmeraldEnchants.EmeraldEnchants; import me.mrCookieSlime.EmeraldEnchants.ItemEnchantment; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Talisman; +import me.mrCookieSlime.Slimefun.Objects.handlers.EntityKillHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.Soul; +import me.mrCookieSlime.Slimefun.utils.Utilities; public class DamageListener implements Listener { - public DamageListener(SlimefunStartup plugin) { - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - private SimpleDateFormat format = new SimpleDateFormat("(MMM d, yyyy @ hh:mm)"); + private Utilities utilities; + + public DamageListener(SlimefunPlugin plugin) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + utilities = SlimefunPlugin.getUtilities(); + } @EventHandler public void onDamage(EntityDeathEvent e) { @@ -51,97 +45,55 @@ public class DamageListener implements Listener { if (p.getInventory().containsAtLeast(SlimefunItems.GPS_EMERGENCY_TRANSMITTER, 1)) { Slimefun.getGPSNetwork().addWaypoint(p, "&4Deathpoint &7" + format.format(new Date()), p.getLocation().getBlock().getLocation()); } + + for (int slot = 0; slot < p.getInventory().getSize(); slot++) { + ItemStack item = p.getInventory().getItem(slot); + + if (isSoulbound(item)) { + Soul.storeItem(p.getUniqueId(), slot, item); + } + } + Iterator drops = e.getDrops().iterator(); while (drops.hasNext()) { ItemStack item = drops.next(); - if (item != null) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) { - Soul.storeItem(e.getEntity().getUniqueId(), item); - drops.remove(); - } else if (SlimefunItem.getByItem(removeEnchantments(item)) != null) { - if (SlimefunItem.getByItem(removeEnchantments(item)) instanceof SoulboundItem) { - Soul.storeItem(e.getEntity().getUniqueId(), item); - drops.remove(); - } - } - } + if (isSoulbound(item)) drops.remove(); } } + if (e.getEntity().getKiller() instanceof Player) { - Player p = (Player) e.getEntity().getKiller(); + Player p = e.getEntity().getKiller(); ItemStack item = p.getInventory().getItemInMainHand(); - if (SlimefunManager.drops.containsKey(e.getEntity().getType())) { - for (ItemStack drop : SlimefunManager.drops.get(e.getEntity().getType())) { - if (Slimefun.hasUnlocked(p, item, true)) { + if (SlimefunPlugin.getUtilities().drops.containsKey(e.getEntity().getType())) { + for (ItemStack drop : SlimefunPlugin.getUtilities().drops.get(e.getEntity().getType())) { + if (Slimefun.hasUnlocked(p, drop, true)) { e.getDrops().add(drop); } } } - - if (item != null) { - if (Slimefun.hasUnlocked(p, item, true)) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItem.getItem("SWORD_OF_BEHEADING"), true)) { - if (e.getEntity() instanceof Zombie) { - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.ZOMBIE"))) { - e.getDrops().add(new ItemStack(Material.ZOMBIE_HEAD)); - } - } - else if (e.getEntity() instanceof WitherSkeleton) { - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.WITHER_SKELETON"))) - e.getDrops().add(new ItemStack(Material.WITHER_SKELETON_SKULL)); - } - else if (e.getEntity() instanceof Skeleton) { - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.SKELETON"))) - e.getDrops().add(new ItemStack(Material.SKELETON_SKULL)); - } - else if (e.getEntity() instanceof Creeper) { - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.CREEPER"))) { - e.getDrops().add(new ItemStack(Material.CREEPER_HEAD)); - } - } - else if (e.getEntity() instanceof Player) { - if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.PLAYER"))) { - ItemStack skull = new ItemStack(Material.PLAYER_HEAD); - ItemMeta meta = skull.getItemMeta(); - ((SkullMeta) meta).setOwningPlayer((Player) e.getEntity()); - skull.setItemMeta(meta); - - e.getDrops().add(skull); - } - } - } - } - } - - if (!e.getEntity().getCanPickupItems() && Talisman.checkFor(e, SlimefunItem.getByID("HUNTER_TALISMAN")) && !(e.getEntity() instanceof Player)) { - - List newDrops = new ArrayList(); - for (ItemStack drop : e.getDrops()) { - newDrops.add(drop); - } - for (ItemStack drop : newDrops) { - e.getDrops().add(drop); - } - - if(e.getEntity() instanceof ChestedHorse) { - for(ItemStack invItem : ((ChestedHorse) e.getEntity()).getInventory().getStorageContents()) { - e.getDrops().remove(invItem); - } - e.getDrops().remove(new ItemStack(Material.CHEST)); //The chest is not included in getStorageContents() - } + + if (item != null && item.getType() != null && item.getType() != Material.AIR && Slimefun.hasUnlocked(p, item, true)) { + for (ItemHandler handler : SlimefunItem.getHandlers("EntityKillHandler")) { + if (((EntityKillHandler) handler).onKill(e, e.getEntity(), p, item)) return; + } } } } - @EventHandler + private boolean isSoulbound(ItemStack item) { + if (item == null || item.getType() == null || item.getType() == Material.AIR) return false; + else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) return true; + else if (SlimefunItem.getByItem(removeEnchantments(item)) instanceof SoulboundItem) return true; + else return false; + } + + @EventHandler public void onArrowHit(EntityDamageEvent e) { - if (e.getEntity() instanceof Player && e.getCause() == DamageCause.FALL) { - if (Variables.damage.contains(e.getEntity().getUniqueId())) { - e.setCancelled(true); - Variables.damage.remove(e.getEntity().getUniqueId()); - } + if (e.getEntity() instanceof Player && e.getCause() == DamageCause.FALL && utilities.damage.contains(e.getEntity().getUniqueId())) { + e.setCancelled(true); + utilities.damage.remove(e.getEntity().getUniqueId()); } } @@ -157,7 +109,7 @@ public class DamageListener implements Listener { strippedItem.removeEnchantment(enchantment); } - if (Slimefun.isEmeraldEnchantsInstalled()) { + if (SlimefunPlugin.getHooks().isEmeraldEnchantsInstalled()) { for(ItemEnchantment enchantment : EmeraldEnchants.getInstance().getRegistry().getEnchantments(itemStack)){ EmeraldEnchants.getInstance().getRegistry().applyEnchantment(strippedItem, enchantment.getEnchantment(), 0); } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/FurnaceListener.java b/src/me/mrCookieSlime/Slimefun/listeners/FurnaceListener.java index ff65159c0..829fd1d14 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/FurnaceListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/FurnaceListener.java @@ -10,14 +10,14 @@ import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Recipe.RecipeCalculator; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.EnhancedFurnace; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.BlockStorage; public class FurnaceListener implements Listener { - public FurnaceListener(SlimefunStartup plugin) { + public FurnaceListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -25,9 +25,8 @@ public class FurnaceListener implements Listener { public void onBurn(FurnaceBurnEvent e) { SlimefunItem furnace = BlockStorage.check(e.getBlock()); - if (furnace instanceof EnhancedFurnace) { - if (((EnhancedFurnace) furnace).getFuelEfficiency() > 0) - e.setBurnTime(((int) ((1 + 0.2 * ((EnhancedFurnace) furnace).getFuelEfficiency()) * e.getBurnTime()))); + if (furnace instanceof EnhancedFurnace && ((EnhancedFurnace) furnace).getFuelEfficiency() > 0) { + e.setBurnTime(((int) ((1 + 0.2 * ((EnhancedFurnace) furnace).getFuelEfficiency()) * e.getBurnTime()))); } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/GearListener.java b/src/me/mrCookieSlime/Slimefun/listeners/GearListener.java index 2a2bf960f..cc197b9ec 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/GearListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/GearListener.java @@ -1,6 +1,6 @@ package me.mrCookieSlime.Slimefun.listeners; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.JetBoots; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Jetpack; @@ -19,7 +19,7 @@ import org.bukkit.event.player.PlayerToggleSneakEvent; public class GearListener implements Listener { - public GearListener(SlimefunStartup plugin) { + public GearListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -37,33 +37,29 @@ public class GearListener implements Listener { if (thrust > 0.2) { JetpackTask task = new JetpackTask(p, thrust); - task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunStartup.instance, task, 0L, 3L)); + task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunPlugin.instance, task, 0L, 3L)); } } } - else if (item.isItem(SlimefunItems.PARACHUTE)) { - if (Slimefun.hasUnlocked(p, SlimefunItems.PARACHUTE, true)) { - ParachuteTask task = new ParachuteTask(p); - task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunStartup.instance, task, 0L, 3L)); - } + else if (item.isItem(SlimefunItems.PARACHUTE) && Slimefun.hasUnlocked(p, SlimefunItems.PARACHUTE, true)) { + ParachuteTask task = new ParachuteTask(p); + task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunPlugin.instance, task, 0L, 3L)); } } if (SlimefunItem.getByItem(p.getInventory().getBoots()) != null) { SlimefunItem item = SlimefunItem.getByItem(p.getInventory().getBoots()); - if (item instanceof JetBoots) { - if (Slimefun.hasUnlocked(p, item.getItem(), true)) { - double speed = ((JetBoots) item).getSpeed(); - if (speed > 0.2) { - JetBootsTask task = new JetBootsTask(p, speed); - task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunStartup.instance, task, 0L, 2L)); - } + if (item instanceof JetBoots && Slimefun.hasUnlocked(p, item.getItem(), true)) { + double speed = ((JetBoots) item).getSpeed(); + if (speed > 0.2) { + JetBootsTask task = new JetBootsTask(p, speed); + task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunPlugin.instance, task, 0L, 2L)); } } } if (p.getInventory().containsAtLeast(SlimefunItems.INFUSED_MAGNET, 1)) { MagnetTask task = new MagnetTask(p); - task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunStartup.instance, task, 0L, 8L)); + task.setID(Bukkit.getScheduler().scheduleSyncRepeatingTask(SlimefunPlugin.instance, task, 0L, 8L)); } } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/GuideOnJoinListener.java b/src/me/mrCookieSlime/Slimefun/listeners/GuideOnJoinListener.java index aa526499e..0dc47e2a6 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/GuideOnJoinListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/GuideOnJoinListener.java @@ -6,12 +6,12 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import me.mrCookieSlime.Slimefun.SlimefunGuide; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Misc.BookDesign; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.api.SlimefunGuideLayout; public class GuideOnJoinListener implements Listener { - public GuideOnJoinListener(SlimefunStartup plugin) { + public GuideOnJoinListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -19,10 +19,10 @@ public class GuideOnJoinListener implements Listener { public void onJoin(PlayerJoinEvent e) { if (!e.getPlayer().hasPlayedBefore()) { Player p = e.getPlayer(); - if (!SlimefunStartup.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled")) return; - if (!SlimefunStartup.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE")) return; + if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled")) return; + if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE")) return; - BookDesign type = SlimefunStartup.getCfg().getBoolean("guide.default-view-book") ? BookDesign.BOOK : BookDesign.CHEST; + SlimefunGuideLayout type = SlimefunPlugin.getCfg().getBoolean("guide.default-view-book") ? SlimefunGuideLayout.BOOK : SlimefunGuideLayout.CHEST; p.getInventory().addItem(SlimefunGuide.getItem(type)); } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java b/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java index d2c2c75f8..4b0b9a7d6 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java @@ -1,6 +1,7 @@ package me.mrCookieSlime.Slimefun.listeners; import java.util.List; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -20,10 +21,11 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.inventory.CraftItemEvent; -import org.bukkit.event.inventory.PrepareItemCraftEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.inventory.BrewerInventory; @@ -37,41 +39,41 @@ import org.bukkit.potion.PotionEffectType; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable; import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; -import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.Slimefun.SlimefunGuide; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; -import me.mrCookieSlime.Slimefun.Misc.BookDesign; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Juice; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.MultiTool; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.api.SlimefunGuideLayout; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; +import me.mrCookieSlime.Slimefun.utils.Utilities; public class ItemListener implements Listener { - - public ItemListener(SlimefunStartup plugin) { + + private Utilities utilities; + + public ItemListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); + utilities = SlimefunPlugin.getUtilities(); } @EventHandler public void onIgnitionChamberItemMove(InventoryMoveItemEvent e) { - if (e.getInitiator().getHolder() instanceof Hopper) { - if (BlockStorage.check(((Hopper) e.getInitiator().getHolder()).getBlock(), "IGNITION_CHAMBER")) { - e.setCancelled(true); - } + if (e.getInitiator().getHolder() instanceof Hopper && BlockStorage.check(((Hopper) e.getInitiator().getHolder()).getBlock(), "IGNITION_CHAMBER")) { + e.setCancelled(true); } } @@ -86,28 +88,44 @@ public class ItemListener implements Listener { e.setCancelled(true); - if (SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(BookDesign.BOOK), true)) + if (SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true)) e.setCancelled(true); - else if (SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(BookDesign.CHEST), true)) + else if (SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)) e.setCancelled(true); - if (SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(BookDesign.BOOK), true)) + if (SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true)) e.setCancelled(true); - else if (SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(BookDesign.CHEST), true)) + else if (SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)) e.setCancelled(true); } } + /* + * Handles Left click use and checks for disabled items. + */ + @EventHandler + public void enabledCheck(PlayerInteractEvent e) { + if (e.getAction() != Action.LEFT_CLICK_AIR && e.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + ItemStack item = e.getItem(); + if (item != null && !Slimefun.isEnabled(e.getPlayer(), item, true)) { + e.setCancelled(true); + } + } + @EventHandler public void debug(PlayerInteractEvent e) { - if (e.getAction().equals(Action.PHYSICAL) || !e.getHand().equals(EquipmentSlot.HAND)) return; + if (e.getAction() == Action.PHYSICAL || e.getHand() != EquipmentSlot.HAND) return; + Player p = e.getPlayer(); - if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.DEBUG_FISH, true) || SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInOffHand(), SlimefunItems.DEBUG_FISH, true)) { + if (SlimefunManager.isItemSimiliar(e.getItem(), SlimefunItems.DEBUG_FISH, true)) { e.setCancelled(true); if (p.isOp()) { switch (e.getAction()) { - case LEFT_CLICK_BLOCK: { + case LEFT_CLICK_BLOCK: if (p.isSneaking()) { if (BlockStorage.hasBlockInfo(e.getClickedBlock())) { BlockStorage.clearBlockInfo(e.getClickedBlock()); @@ -115,15 +133,14 @@ public class ItemListener implements Listener { } else e.setCancelled(false); break; - } - case RIGHT_CLICK_BLOCK: { + case RIGHT_CLICK_BLOCK: if (p.isSneaking()) { Block b = e.getClickedBlock().getRelative(e.getBlockFace()); b.setType(Material.PLAYER_HEAD); try { CustomSkull.setSkull(b, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTllYjlkYTI2Y2YyZDMzNDEzOTdhN2Y0OTEzYmEzZDM3ZDFhZDEwZWFlMzBhYjI1ZmEzOWNlYjg0YmMifX19"); - } catch (Exception e1) { - e1.printStackTrace(); + } catch (Exception x) { + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while using the Debug-Fish for Slimefun " + Slimefun.getVersion(), x); } } else if (BlockStorage.hasBlockInfo(e.getClickedBlock())) { @@ -143,14 +160,14 @@ public class ItemListener implements Listener { if (BlockStorage.check(e.getClickedBlock()).isTicking()) { p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&dTicking: " + "&2\u2714")); p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dAsync: &e" + (BlockStorage.check(e.getClickedBlock()).getBlockTicker().isSynchronized() ? "&4\u2718": "&2\u2714"))); - p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dTimings: &e" + SlimefunStartup.ticker.getTimings(e.getClickedBlock()) + "ms")); - p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dTotal Timings: &e" + SlimefunStartup.ticker.getTimings(BlockStorage.checkID(e.getClickedBlock())) + "ms")); - p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dChunk Timings: &e" + SlimefunStartup.ticker.getTimings(e.getClickedBlock().getChunk()) + "ms")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dTimings: &e" + SlimefunPlugin.getTicker().getTimings(e.getClickedBlock()) + "ms")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dTotal Timings: &e" + SlimefunPlugin.getTicker().getTimings(BlockStorage.checkID(e.getClickedBlock())) + "ms")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dChunk Timings: &e" + SlimefunPlugin.getTicker().getTimings(e.getClickedBlock().getChunk()) + "ms")); } else if (BlockStorage.check(e.getClickedBlock()).getEnergyTicker() != null) { p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&dTicking: " + "&b~ &3(Indirect)")); - p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dTimings: &e" + SlimefunStartup.ticker.getTimings(e.getClickedBlock()) + "ms")); - p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dChunk Timings: &e" + SlimefunStartup.ticker.getTimings(e.getClickedBlock().getChunk()) + "ms")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dTimings: &e" + SlimefunPlugin.getTicker().getTimings(e.getClickedBlock()) + "ms")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &dChunk Timings: &e" + SlimefunPlugin.getTicker().getTimings(e.getClickedBlock().getChunk()) + "ms")); } else { p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&dTicking: " + "&4\u2718")); @@ -167,7 +184,6 @@ public class ItemListener implements Listener { p.sendMessage(" "); } break; - } default: break; @@ -175,60 +191,45 @@ public class ItemListener implements Listener { } } } + + @EventHandler + public void onBucketUse(PlayerBucketEmptyEvent e) { + // Fix for placing water on player heads + Location l = e.getBlockClicked().getRelative(e.getBlockFace()).getLocation(); + if (BlockStorage.hasBlockInfo(l)) { + e.setCancelled(true); + } + } @EventHandler(priority = EventPriority.NORMAL) public void onRightClick(ItemUseEvent e) { - if (e.getParentEvent() != null && !e.getParentEvent().getHand().equals(EquipmentSlot.HAND)) { + if (e.getParentEvent() != null && e.getParentEvent().getHand() != EquipmentSlot.HAND) { return; } final Player p = e.getPlayer(); ItemStack item = e.getItem(); - // Fix for placing water on player heads - if (e.getParentEvent().getAction() == Action.RIGHT_CLICK_BLOCK && item != null && item.getType() == Material.WATER_BUCKET) { - Location water = e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace()).getLocation(); - if ((p.getWorld().getBlockAt(water).getType() == Material.PLAYER_HEAD || p.getWorld().getBlockAt(water).getType() == Material.PLAYER_WALL_HEAD) && BlockStorage.hasBlockInfo(water)) { - e.setCancelled(true); - p.getWorld().getBlockAt(water).getState().update(true, false); - return; - } - } - - if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getItem(BookDesign.BOOK), true)) { + if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true)) { if (p.isSneaking()) SlimefunGuide.openSettings(p, item); else SlimefunGuide.openGuide(p, true); } - else if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getItem(BookDesign.CHEST), true)) { + else if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)) { if (p.isSneaking()) SlimefunGuide.openSettings(p, item); else SlimefunGuide.openGuide(p, false); } - else if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getItem(BookDesign.CHEAT_SHEET), true)) { + else if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getItem(SlimefunGuideLayout.CHEAT_SHEET), true)) { if (p.isSneaking()) SlimefunGuide.openSettings(p, item); else p.chat("/sf cheat"); } - else if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getDeprecatedItem(true), true)) { - item = SlimefunGuide.getItem(BookDesign.BOOK); - p.getInventory().setItemInMainHand(item); - PlayerInventory.update(p); - - if (p.isSneaking()) SlimefunGuide.openSettings(p, item); - else SlimefunGuide.openGuide(p, true); - } - else if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getDeprecatedItem(false), true)) { - item = SlimefunGuide.getItem(BookDesign.CHEST); - p.getInventory().setItemInMainHand(item); - PlayerInventory.update(p); - - if (p.isSneaking()) SlimefunGuide.openSettings(p, item); - else SlimefunGuide.openGuide(p, false); - } - else if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.DEBUG_FISH, true) || SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInOffHand(), SlimefunItems.DEBUG_FISH, true)) { + else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.DEBUG_FISH, true)) { + // Ignore the debug fish in here } else if (Slimefun.hasUnlocked(p, item, true)) { for (ItemHandler handler : SlimefunItem.getHandlers("ItemInteractionHandler")) { if (((ItemInteractionHandler) handler).onRightClick(e, p, item)) return; } + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.DURALUMIN_MULTI_TOOL, false) || SlimefunManager.isItemSimiliar(item, SlimefunItems.SOLDER_MULTI_TOOL, false) || SlimefunManager.isItemSimiliar(item, SlimefunItems.BILLON_MULTI_TOOL, false) @@ -247,7 +248,7 @@ public class ItemListener implements Listener { if (tool != null) { List modes = ((MultiTool) SlimefunItem.getByItem(tool)).getModes(); int index = 0; - if (Variables.mode.containsKey(p.getUniqueId())) index = Variables.mode.get(p.getUniqueId()); + if (utilities.mode.containsKey(p.getUniqueId())) index = utilities.mode.get(p.getUniqueId()); if (!p.isSneaking()) { float charge = ItemEnergy.getStoredEnergy(item); @@ -261,7 +262,7 @@ public class ItemListener implements Listener { index++; if (index == modes.size()) index = 0; Messages.local.sendTranslation(p, "messages.mode-change", true, new Variable("%device%", "Multi Tool"), new Variable("%mode%", (String) Slimefun.getItemValue(SlimefunItem.getByItem(tool).getID(), "mode." + modes.get(index) + ".name"))); - Variables.mode.put(p.getUniqueId(), index); + utilities.mode.put(p.getUniqueId(), index); } } } @@ -269,23 +270,26 @@ public class ItemListener implements Listener { if (e.getClickedBlock() != null && BlockStorage.hasBlockInfo(e.getClickedBlock())) { String id = BlockStorage.checkID(e.getClickedBlock()); - if (BlockMenuPreset.isInventory(id)) { - if (canPlaceBlock(p, e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace())) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_INPUT, true)); - else if (canPlaceBlock(p, e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace())) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT, true)); - else if (canPlaceBlock(p, e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace())) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT_ADVANCED, true)); - else if (canPlaceBlock(p, e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace())) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_IMPORT_BUS, true)); - else if (canPlaceBlock(p, e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace())) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_EXPORT_BUS, true)); - else if (!p.isSneaking() || item == null || item.getType() == Material.AIR) { - e.setCancelled(true); - BlockStorage storage = BlockStorage.getStorage(e.getClickedBlock().getWorld()); + if (BlockMenuPreset.isInventory(id) && !canPlaceCargoNodes(p, item, e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace())) && (!p.isSneaking() || item == null || item.getType() == Material.AIR)) { + e.setCancelled(true); + BlockStorage storage = BlockStorage.getStorage(e.getClickedBlock().getWorld()); - if (storage.hasUniversalInventory(id)) { - UniversalBlockMenu menu = storage.getUniversalInventory(id); - if (menu.canOpen(e.getClickedBlock(), p)) menu.open(p); + if (storage.hasUniversalInventory(id)) { + UniversalBlockMenu menu = storage.getUniversalInventory(id); + if (menu.canOpen(e.getClickedBlock(), p)) { + menu.open(p); } - else if (storage.hasInventory(e.getClickedBlock().getLocation())) { - BlockMenu menu = BlockStorage.getInventory(e.getClickedBlock().getLocation()); - if (menu.canOpen(e.getClickedBlock(), p)) menu.open(p); + else { + Messages.local.sendTranslation(p, "inventory.no-access", true); + } + } + else if (storage.hasInventory(e.getClickedBlock().getLocation())) { + BlockMenu menu = BlockStorage.getInventory(e.getClickedBlock().getLocation()); + if (menu.canOpen(e.getClickedBlock(), p)) { + menu.open(p); + } + else { + Messages.local.sendTranslation(p, "inventory.no-access", true); } } } @@ -294,8 +298,17 @@ public class ItemListener implements Listener { else e.setCancelled(true); } + private boolean canPlaceCargoNodes(Player p, ItemStack item, Block b) { + if (canPlaceBlock(p, b) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_INPUT, true)) return true; + else if (canPlaceBlock(p, b) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT, true)) return true; + else if (canPlaceBlock(p, b) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT_ADVANCED, true)) return true; + else if (canPlaceBlock(p, b) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_IMPORT_BUS, true)) return true; + else if (canPlaceBlock(p, b) && SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_EXPORT_BUS, true)) return true; + else return false; + } + private boolean canPlaceBlock(Player p, Block relative) { - return p.isSneaking() && relative.getType().equals(Material.AIR); + return p.isSneaking() && relative.getType() == Material.AIR; } @EventHandler @@ -303,33 +316,22 @@ public class ItemListener implements Listener { if (e.getItem() != null) { final Player p = e.getPlayer(); ItemStack item = e.getItem(); + if (Slimefun.hasUnlocked(p, item, true)) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.MONSTER_JERKY, true)) { - e.setCancelled(true); - if (SlimefunManager.isItemSimiliar(p.getInventory().getItemInOffHand(), SlimefunItems.MONSTER_JERKY, true)) { - p.getInventory().setItemInOffHand(InvUtils.decreaseItem(p.getInventory().getItemInOffHand(), 1)); - } - else{ - p.getInventory().setItemInMainHand(InvUtils.decreaseItem(p.getInventory().getItemInMainHand(), 1)); - } - PlayerInventory.update(p); - p.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, 5, 0)); + for (ItemHandler handler : SlimefunItem.getHandlers("ItemConsumptionHandler")) { + if (((ItemConsumptionHandler) handler).onConsume(e, p, item)) return; } - else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.FORTUNE_COOKIE, true)) p.sendMessage(ChatColor.translateAlternateColorCodes('&', Messages.local.getTranslation("messages.fortune-cookie").get(CSCoreLib.randomizer().nextInt(Messages.local.getTranslation("messages.fortune-cookie").size())))); - else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BEEF_JERKY, true)) p.setSaturation((Integer) Slimefun.getItemValue("BEEF_JERKY", "Saturation")); - else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.MEDICINE, true)) { - if (p.hasPotionEffect(PotionEffectType.POISON)) p.removePotionEffect(PotionEffectType.POISON); - if (p.hasPotionEffect(PotionEffectType.WITHER)) p.removePotionEffect(PotionEffectType.WITHER); - if (p.hasPotionEffect(PotionEffectType.SLOW)) p.removePotionEffect(PotionEffectType.SLOW); - if (p.hasPotionEffect(PotionEffectType.SLOW_DIGGING)) p.removePotionEffect(PotionEffectType.SLOW_DIGGING); - if (p.hasPotionEffect(PotionEffectType.WEAKNESS)) p.removePotionEffect(PotionEffectType.WEAKNESS); - if (p.hasPotionEffect(PotionEffectType.CONFUSION)) p.removePotionEffect(PotionEffectType.CONFUSION); - if (p.hasPotionEffect(PotionEffectType.BLINDNESS)) p.removePotionEffect(PotionEffectType.BLINDNESS); - p.setFireTicks(0); + + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.FORTUNE_COOKIE, true)) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', Messages.local.getTranslation("messages.fortune-cookie").get(CSCoreLib.randomizer().nextInt(Messages.local.getTranslation("messages.fortune-cookie").size())))); + } + else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BEEF_JERKY, true)) { + p.setSaturation((int) Slimefun.getItemValue("BEEF_JERKY", "Saturation")); } else if (item.getType() == Material.POTION) { SlimefunItem sfItem = SlimefunItem.getByItem(item); - if (sfItem != null && sfItem instanceof Juice) { + + if (sfItem instanceof Juice) { // Fix for Saturation on potions is no longer working for (PotionEffect effect : ((PotionMeta) item.getItemMeta()).getCustomEffects()) { if (effect.getType().equals(PotionEffectType.SATURATION)) { @@ -360,9 +362,9 @@ public class ItemListener implements Listener { // Remove the glass bottle once drunk final int m = mode; - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - if (m == 0) p.getEquipment().setItemInMainHand(null); - else if (m == 1) p.getEquipment().setItemInOffHand(null); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + if (m == 0) p.getEquipment().getItemInMainHand().setAmount(0); + else if (m == 1) p.getEquipment().getItemInOffHand().setAmount(0); else if (m == 2) p.getInventory().removeItem(new ItemStack(Material.GLASS_BOTTLE, 1)); }, 0L); } @@ -395,16 +397,16 @@ public class ItemListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onEntityChangeBlock(EntityChangeBlockEvent e) { if (e.getEntity() instanceof FallingBlock) { - if (Variables.blocks.contains(e.getEntity().getUniqueId())) { + if (utilities.blocks.contains(e.getEntity().getUniqueId())) { e.setCancelled(true); e.getEntity().remove(); } } else if (e.getEntity() instanceof Wither) { - SlimefunItem item = BlockStorage.check(e.getBlock()); - if (item != null) { - if (item.getID().equals("WITHER_PROOF_OBSIDIAN")) e.setCancelled(true); - else if (item.getID().equals("WITHER_PROOF_GLASS")) e.setCancelled(true); + String id = BlockStorage.checkID(e.getBlock()); + if (id != null) { + if (id.equals("WITHER_PROOF_OBSIDIAN")) e.setCancelled(true); + else if (id.equals("WITHER_PROOF_GLASS")) e.setCancelled(true); } } } @@ -414,30 +416,20 @@ public class ItemListener implements Listener { if (e.getRawSlot() == 2 && e.getWhoClicked() instanceof Player && e.getInventory().getType() == InventoryType.ANVIL) { ItemStack slot0 = e.getInventory().getContents()[0]; ItemStack slot1 = e.getInventory().getContents()[1]; + if (SlimefunManager.isItemSimiliar(slot0, SlimefunItems.ELYTRA, true)) return; - if (SlimefunItem.getByItem(slot0) != null && !SlimefunItem.isDisabled(slot0)) { - e.setCancelled(true); - Messages.local.sendTranslation((Player) e.getWhoClicked(), "anvil.not-working", true); - } else if (SlimefunItem.getByItem(slot1) != null && !SlimefunItem.isDisabled(slot1)) { - e.setCancelled(true); - Messages.local.sendTranslation((Player) e.getWhoClicked(), "anvil.not-working", true); - } + + if (SlimefunItem.getByItem(slot0) != null && !SlimefunItem.isDisabled(slot0) || + SlimefunItem.getByItem(slot1) != null && !SlimefunItem.isDisabled(slot1) || + SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true) || + SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)|| - if (SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(BookDesign.BOOK), true)) { - e.setCancelled(true); - Messages.local.sendTranslation((Player) e.getWhoClicked(), "anvil.not-working", true); - } else if (SlimefunManager.isItemSimiliar(slot0, SlimefunGuide.getItem(BookDesign.CHEST), true)) { - e.setCancelled(true); - Messages.local.sendTranslation((Player) e.getWhoClicked(), "anvil.not-working", true); - } + SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true) || + SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)) { - if (SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(BookDesign.BOOK), true)) { - e.setCancelled(true); - Messages.local.sendTranslation((Player) e.getWhoClicked(), "anvil.not-working", true); - } else if (SlimefunManager.isItemSimiliar(slot1, SlimefunGuide.getItem(BookDesign.CHEST), true)) { - e.setCancelled(true); - Messages.local.sendTranslation((Player) e.getWhoClicked(), "anvil.not-working", true); + e.setCancelled(true); + Messages.local.sendTranslation((Player) e.getWhoClicked(), "anvil.not-working", true); } } } @@ -445,9 +437,7 @@ public class ItemListener implements Listener { @EventHandler (ignoreCancelled = true) public void onPreBrew(InventoryClickEvent e) { Inventory inventory = e.getInventory(); - if (inventory instanceof BrewerInventory && inventory.getHolder() instanceof BrewingStand) { - if (e.getRawSlot() < inventory.getSize()) e.setCancelled(SlimefunItem.getByItem(e.getCursor()) != null); - } + if (inventory instanceof BrewerInventory && inventory.getHolder() instanceof BrewingStand && e.getRawSlot() < inventory.getSize()) e.setCancelled(SlimefunItem.getByItem(e.getCursor()) != null); } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ItemPickupListener.java b/src/me/mrCookieSlime/Slimefun/listeners/ItemPickupListener.java index 356b22159..e4cbc1882 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ItemPickupListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/ItemPickupListener.java @@ -1,6 +1,6 @@ package me.mrCookieSlime.Slimefun.listeners; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; @@ -17,7 +17,7 @@ import org.bukkit.event.inventory.InventoryPickupItemEvent; */ public class ItemPickupListener implements Listener { - public ItemPickupListener(SlimefunStartup plugin) { + public ItemPickupListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/NetworkListener.java b/src/me/mrCookieSlime/Slimefun/listeners/NetworkListener.java index 292a6fabe..5ea8b9556 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/NetworkListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/NetworkListener.java @@ -1,6 +1,6 @@ package me.mrCookieSlime.Slimefun.listeners; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.api.network.Network; import org.bukkit.event.EventHandler; @@ -11,7 +11,7 @@ import org.bukkit.event.block.BlockPlaceEvent; public class NetworkListener implements Listener { - public NetworkListener(SlimefunStartup plugin) { + public NetworkListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java b/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java index 8c5a25a26..f06f18fc9 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java @@ -4,19 +4,18 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import me.mrCookieSlime.Slimefun.SlimefunGuide; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.api.PlayerProfile; public class PlayerQuitListener implements Listener { - public PlayerQuitListener(SlimefunStartup plugin) { + public PlayerQuitListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler public void onDisconnect(PlayerQuitEvent e) { - SlimefunGuide.history.remove(e.getPlayer().getUniqueId()); + SlimefunPlugin.getUtilities().guideHistory.remove(e.getPlayer().getUniqueId()); if (PlayerProfile.isLoaded(e.getPlayer().getUniqueId())) { PlayerProfile.fromUUID(e.getPlayer().getUniqueId()).markForDeletion(); diff --git a/src/me/mrCookieSlime/Slimefun/listeners/TalismanListener.java b/src/me/mrCookieSlime/Slimefun/listeners/TalismanListener.java index 77dcf7c00..5e0b4ea45 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/TalismanListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/TalismanListener.java @@ -2,6 +2,7 @@ package me.mrCookieSlime.Slimefun.listeners; import java.util.ArrayList; import java.util.List; +import java.util.Random; import java.util.Set; import org.bukkit.Material; @@ -30,7 +31,7 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Talisman; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; @@ -38,39 +39,32 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; public class TalismanListener implements Listener { - public TalismanListener(SlimefunStartup plugin) { + private Random random = new Random(); + + public TalismanListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler(priority=EventPriority.MONITOR) public void onDamageGet(EntityDamageEvent e) { if (!e.isCancelled()) { - if (e instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) e).getDamager() instanceof Player && SlimefunStartup.chance(100, 45)) { - if (SlimefunManager.isItemSimiliar(((Player) ((EntityDamageByEntityEvent) e).getDamager()).getInventory().getItemInMainHand(), SlimefunItem.getItem("BLADE_OF_VAMPIRES"), true)) { - ((Player) ((EntityDamageByEntityEvent) e).getDamager()).playSound(((EntityDamageByEntityEvent) e).getDamager().getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 0.7F, 0.7F); - ((Player) ((EntityDamageByEntityEvent) e).getDamager()).addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 1)); - } - } + if (e instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) e).getDamager() instanceof Player && random.nextInt(100) < 45 && SlimefunManager.isItemSimiliar(((Player) ((EntityDamageByEntityEvent) e).getDamager()).getInventory().getItemInMainHand(), SlimefunItem.getItem("BLADE_OF_VAMPIRES"), true)) { + ((Player) ((EntityDamageByEntityEvent) e).getDamager()).playSound(((EntityDamageByEntityEvent) e).getDamager().getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 0.7F, 0.7F); + ((Player) ((EntityDamageByEntityEvent) e).getDamager()).addPotionEffect(new PotionEffect(PotionEffectType.HEAL, 1, 1)); } + if (e.getEntity() instanceof Player) { - if (!e.isCancelled()) { - if (e.getCause() == DamageCause.LAVA) Talisman.checkFor(e, SlimefunItem.getByID("LAVA_TALISMAN")); - if (e.getCause() == DamageCause.DROWNING) Talisman.checkFor(e, SlimefunItem.getByID("WATER_TALISMAN")); - if (e.getCause() == DamageCause.FALL) Talisman.checkFor(e, SlimefunItem.getByID("ANGEL_TALISMAN")); - if (e.getCause() == DamageCause.FIRE) Talisman.checkFor(e, SlimefunItem.getByID("FIRE_TALISMAN")); - if (e.getCause() == DamageCause.ENTITY_ATTACK) Talisman.checkFor(e, SlimefunItem.getByID("WARRIOR_TALISMAN")); - if (e.getCause() == DamageCause.ENTITY_ATTACK) Talisman.checkFor(e, SlimefunItem.getByID("KNIGHT_TALISMAN")); - if (e.getCause() == DamageCause.PROJECTILE) { - if (Talisman.checkFor(e, SlimefunItem.getByID("WHIRLWIND_TALISMAN"))) { - if (((EntityDamageByEntityEvent) e).getDamager() instanceof Projectile) { - Vector direction = ((Player) e.getEntity()).getEyeLocation().getDirection().multiply(2.0); - Projectile projectile = (Projectile) e.getEntity().getWorld().spawnEntity(((LivingEntity) e.getEntity()).getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), ((EntityDamageByEntityEvent) e).getDamager().getType()); - projectile.setVelocity(direction); - ((EntityDamageByEntityEvent) e).getDamager().remove(); - } - } - } + if (e.getCause() == DamageCause.LAVA) Talisman.checkFor(e, SlimefunItem.getByID("LAVA_TALISMAN")); + if (e.getCause() == DamageCause.DROWNING) Talisman.checkFor(e, SlimefunItem.getByID("WATER_TALISMAN")); + if (e.getCause() == DamageCause.FALL) Talisman.checkFor(e, SlimefunItem.getByID("ANGEL_TALISMAN")); + if (e.getCause() == DamageCause.FIRE) Talisman.checkFor(e, SlimefunItem.getByID("FIRE_TALISMAN")); + if (e.getCause() == DamageCause.ENTITY_ATTACK) Talisman.checkFor(e, SlimefunItem.getByID("WARRIOR_TALISMAN")); + if (e.getCause() == DamageCause.ENTITY_ATTACK) Talisman.checkFor(e, SlimefunItem.getByID("KNIGHT_TALISMAN")); + if (e.getCause() == DamageCause.PROJECTILE && Talisman.checkFor(e, SlimefunItem.getByID("WHIRLWIND_TALISMAN")) && ((EntityDamageByEntityEvent) e).getDamager() instanceof Projectile) { + Vector direction = ((Player) e.getEntity()).getEyeLocation().getDirection().multiply(2.0); + Projectile projectile = (Projectile) e.getEntity().getWorld().spawnEntity(((LivingEntity) e.getEntity()).getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), ((EntityDamageByEntityEvent) e).getDamager().getType()); + projectile.setVelocity(direction); + ((EntityDamageByEntityEvent) e).getDamager().remove(); } } } @@ -104,9 +98,7 @@ public class TalismanListener implements Listener { item.setItemMeta(meta); final int itemSlot = slot; - SlimefunStartup.instance.getServer().getScheduler().runTaskLater(SlimefunStartup.instance, () -> { - inv.setItem(itemSlot, item); - }, 1L); + SlimefunPlugin.instance.getServer().getScheduler().runTaskLater(SlimefunPlugin.instance, () -> inv.setItem(itemSlot, item), 1L); } } @@ -124,18 +116,16 @@ public class TalismanListener implements Listener { if ((Boolean) Slimefun.getItemValue("MAGICIAN_TALISMAN", "allow-enchantments." + en.getKey().getKey() + ".level." + i) && en.canEnchantItem(e.getItem())) enchantments.add(en.getKey().getKey() + "-" + i); } } - String enchant = enchantments.get(SlimefunStartup.randomize(enchantments.size())); + String enchant = enchantments.get(random.nextInt(enchantments.size())); e.getEnchantsToAdd().put(Enchantment.getByKey(NamespacedKey.minecraft(enchant.split("-")[0])), Integer.parseInt(enchant.split("-")[1])); } - if (!e.getEnchantsToAdd().containsKey(Enchantment.SILK_TOUCH) && Enchantment.LOOT_BONUS_BLOCKS.canEnchantItem(e.getItem())) { - if (Talisman.checkFor(e, SlimefunItem.getByID("WIZARD_TALISMAN"))) { - if (e.getEnchantsToAdd().containsKey(Enchantment.LOOT_BONUS_BLOCKS)) e.getEnchantsToAdd().remove(Enchantment.LOOT_BONUS_BLOCKS); - Set enchantments = e.getEnchantsToAdd().keySet(); - for (Enchantment en : enchantments) { - if (SlimefunStartup.chance(100, 40)) e.getEnchantsToAdd().put(en, SlimefunStartup.randomize(3) + 1); - } - e.getItem().addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, SlimefunStartup.randomize(3) + 3); + if (!e.getEnchantsToAdd().containsKey(Enchantment.SILK_TOUCH) && Enchantment.LOOT_BONUS_BLOCKS.canEnchantItem(e.getItem()) && Talisman.checkFor(e, SlimefunItem.getByID("WIZARD_TALISMAN"))) { + if (e.getEnchantsToAdd().containsKey(Enchantment.LOOT_BONUS_BLOCKS)) e.getEnchantsToAdd().remove(Enchantment.LOOT_BONUS_BLOCKS); + Set enchantments = e.getEnchantsToAdd().keySet(); + for (Enchantment en : enchantments) { + if (random.nextInt(100) < 40) e.getEnchantsToAdd().put(en, random.nextInt(3) + 1); } + e.getItem().addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, random.nextInt(3) + 3); } } @@ -152,17 +142,15 @@ public class TalismanListener implements Listener { if (item != null) { if (item.getEnchantments().containsKey(Enchantment.LOOT_BONUS_BLOCKS) && !item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)) { - fortune = SlimefunStartup.randomize(item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) + 2) - 1; + fortune =random.nextInt(item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) + 2) - 1; if (fortune <= 0) fortune = 1; - fortune = (e.getBlock().getType() == Material.LAPIS_ORE ? 4 + SlimefunStartup.randomize(5) : 1) * (fortune + 1); + fortune = (e.getBlock().getType() == Material.LAPIS_ORE ? 4 + random.nextInt(5) : 1) * (fortune + 1); } - if (!item.getEnchantments().containsKey(Enchantment.SILK_TOUCH) && e.getBlock().getType().toString().endsWith("_ORE")) { - if (Talisman.checkFor(e, SlimefunItem.getByID("MINER_TALISMAN"))) { - if (drops.isEmpty()) drops = (List) e.getBlock().getDrops(); - for (ItemStack drop : new ArrayList<>(drops)) { - if (!drop.getType().isBlock()) drops.add(new CustomItem(drop, fortune * 2)); - } + if (!item.getEnchantments().containsKey(Enchantment.SILK_TOUCH) && e.getBlock().getType().toString().endsWith("_ORE") && Talisman.checkFor(e, SlimefunItem.getByID("MINER_TALISMAN"))) { + if (drops.isEmpty()) drops = (List) e.getBlock().getDrops(); + for (ItemStack drop : new ArrayList<>(drops)) { + if (!drop.getType().isBlock()) drops.add(new CustomItem(drop, fortune * 2)); } } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/TeleporterListener.java b/src/me/mrCookieSlime/Slimefun/listeners/TeleporterListener.java index 7cf52335f..8791d446b 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/TeleporterListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/TeleporterListener.java @@ -1,10 +1,13 @@ package me.mrCookieSlime.Slimefun.listeners; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.GPS.Elevator; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.Teleporter; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +import java.util.logging.Level; import org.bukkit.block.BlockFace; import org.bukkit.event.EventHandler; @@ -15,21 +18,20 @@ import org.bukkit.event.player.PlayerInteractEvent; public class TeleporterListener implements Listener { - BlockFace[] faces = {BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST}; + private final BlockFace[] faces = {BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST}; - public TeleporterListener(SlimefunStartup plugin) { + public TeleporterListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler(priority=EventPriority.HIGHEST,ignoreCancelled=true) public void onStarve(PlayerInteractEvent e) { - if (!e.getAction().equals(Action.PHYSICAL)) return; + if (e.getAction() != Action.PHYSICAL || e.getClickedBlock() == null) return; - if (e.getClickedBlock() == null) return; - SlimefunItem item = BlockStorage.check(e.getClickedBlock()); - if (item == null) return; + String id = BlockStorage.checkID(e.getClickedBlock()); + if (id == null) return; - if (item.getID().equals("GPS_ACTIVATION_DEVICE_SHARED")) { + if (id.equals("GPS_ACTIVATION_DEVICE_SHARED") || (id.equals("GPS_ACTIVATION_DEVICE_PERSONAL") && BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "owner").equals(e.getPlayer().getUniqueId().toString()))) { SlimefunItem teleporter = BlockStorage.check(e.getClickedBlock().getRelative(BlockFace.DOWN)); if (teleporter instanceof Teleporter) { @@ -40,29 +42,11 @@ public class TeleporterListener implements Listener { try { ((Teleporter) teleporter).onInteract(e.getPlayer(), e.getClickedBlock().getRelative(BlockFace.DOWN)); } catch (Exception x) { - x.printStackTrace(); + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while interacting with a Teleporter", x); } } } - else if (item.getID().equals("GPS_ACTIVATION_DEVICE_PERSONAL")) { - if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "owner").equals(e.getPlayer().getUniqueId().toString())) { - SlimefunItem teleporter = BlockStorage.check(e.getClickedBlock().getRelative(BlockFace.DOWN)); - - if (teleporter instanceof Teleporter) { - for (BlockFace face: faces) { - if (!BlockStorage.check(e.getClickedBlock().getRelative(BlockFace.DOWN).getRelative(face), "GPS_TELEPORTER_PYLON")) return; - } - - try { - ((Teleporter) teleporter).onInteract(e.getPlayer(), e.getClickedBlock().getRelative(BlockFace.DOWN)); - } catch (Exception x) { - x.printStackTrace(); - } - } - } - else e.setCancelled(true); - } - else if (item.getID().equals("ELEVATOR_PLATE")) { + else if (id.equals("ELEVATOR_PLATE")) { Elevator.openDialogue(e.getPlayer(), e.getClickedBlock()); } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java b/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java index 29f7b1471..c73f414e0 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Random; import java.util.Set; import org.bukkit.Material; @@ -21,37 +22,39 @@ import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.SkullItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow; import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.HandledBlock; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockBreakHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockPlaceHandler; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockPlaceHandler; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.utils.Utilities; public class ToolListener implements Listener { // Materials that require a Block under it, e.g. Pressure Plates - private final Set sensitiveMaterials = new HashSet<>(); + private Set sensitiveMaterials = new HashSet<>(); + private Random random = new Random(); + private Utilities utilities; - public ToolListener(SlimefunStartup plugin) { + public ToolListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); + utilities = SlimefunPlugin.getUtilities(); sensitiveMaterials.add(Material.STONE_PRESSURE_PLATE); sensitiveMaterials.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE); sensitiveMaterials.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE); - Tag.SAPLINGS.getValues().forEach((mat) -> sensitiveMaterials.add(mat)); - Tag.WOODEN_PRESSURE_PLATES.getValues().forEach((mat) -> sensitiveMaterials.add(mat)); + Tag.SAPLINGS.getValues().forEach(mat -> sensitiveMaterials.add(mat)); + Tag.WOODEN_PRESSURE_PLATES.getValues().forEach(mat -> sensitiveMaterials.add(mat)); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -63,15 +66,12 @@ public class ToolListener implements Listener { ItemStack item = e.getItemInHand(); - // Why does this "Ink Sack" check exist?? - if (item != null && item.getType() == Material.INK_SAC) return; - SlimefunItem sfItem = SlimefunItem.getByItem(item); if (sfItem != null && !sfItem.isDisabled() && !(sfItem instanceof NotPlaceable)) { BlockStorage.addBlockInfo(e.getBlock(), "id", sfItem.getID(), true); - if (SlimefunItem.blockhandler.containsKey(sfItem.getID())) { - SlimefunItem.blockhandler.get(sfItem.getID()).onPlace(e.getPlayer(), e.getBlock(), sfItem); + if (utilities.blockHandlers.containsKey(sfItem.getID())) { + utilities.blockHandlers.get(sfItem.getID()).onPlace(e.getPlayer(), e.getBlock(), sfItem); } else { for (ItemHandler handler : SlimefunItem.getHandlers("BlockPlaceHandler")) { @@ -90,10 +90,11 @@ public class ToolListener implements Listener { public void onBlockPlace(BlockPlaceEvent e) { ItemStack item = e.getItemInHand(); - if (Variables.cancelPlace.contains(e.getPlayer().getUniqueId())) { + if (utilities.cancelPlace.contains(e.getPlayer().getUniqueId())) { e.setCancelled(true); - Variables.cancelPlace.remove(e.getPlayer().getUniqueId()); + utilities.cancelPlace.remove(e.getPlayer().getUniqueId()); } + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BASIC_CIRCUIT_BOARD, true)) e.setCancelled(true); else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.ADVANCED_CIRCUIT_BOARD, true)) e.setCancelled(true); @@ -130,6 +131,7 @@ public class ToolListener implements Listener { PlayerInventory.consumeItemInHand(e.getPlayer()); FireworkShow.launchRandom(e.getPlayer(), 3); List gifts = new ArrayList<>(); + for (int i = 0; i < 2; i++) { gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_HOT_CHOCOLATE, 1)); gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CHOCOLATE_APPLE, 4)); @@ -142,26 +144,10 @@ public class ToolListener implements Listener { gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_CIDER, 1)); gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_FRUIT_CAKE, 4)); gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_PIE, 4)); + gifts.add(new ItemStack(Material.EMERALD)); } - gifts.add(new SkullItem("mrCookieSlime")); - gifts.add(new SkullItem("timtower")); - gifts.add(new SkullItem("bwfcwalshy")); - gifts.add(new SkullItem("jadedcat")); - gifts.add(new SkullItem("ZeldoKavira")); - gifts.add(new SkullItem("eyamaz")); - gifts.add(new SkullItem("Kaelten")); - gifts.add(new SkullItem("ahamling27")); - gifts.add(new SkullItem("Myrathi")); - new String( - "Good day to whoever is just looking through my code." + - "Since it is Christmas, I wanted to add some Christmas flavour to this Plugin." + - "So, I hope you don't mind that I implemented some of your Heads >.>" + - "Merry Christmas everyone!" + - "" + - "- mrCookieSlime" - ); - e.getBlockPlaced().getWorld().dropItemNaturally(e.getBlockPlaced().getLocation(), gifts.get(SlimefunStartup.randomize(gifts.size()))); + e.getBlockPlaced().getWorld().dropItemNaturally(e.getBlockPlaced().getLocation(), gifts.get(random.nextInt(gifts.size()))); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_INPUT, false)) { if (e.getBlock().getY() != e.getBlockAgainst().getY()) { @@ -181,11 +167,9 @@ public class ToolListener implements Listener { e.setCancelled(true); } } - else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_IMPORT_BUS, false)) { - if (e.getBlock().getY() != e.getBlockAgainst().getY()) { - Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true); - e.setCancelled(true); - } + else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_IMPORT_BUS, false) && e.getBlock().getY() != e.getBlockAgainst().getY()) { + Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true); + e.setCancelled(true); } } @@ -202,8 +186,8 @@ public class ToolListener implements Listener { SlimefunItem sfItem = BlockStorage.check(e.getBlock().getRelative(BlockFace.UP)); if (sfItem != null && !(sfItem instanceof HandledBlock)) { - if (SlimefunItem.blockhandler.containsKey(sfItem.getID())) { - allow = SlimefunItem.blockhandler.get(sfItem.getID()).onBreak(e.getPlayer(), block2, sfItem, UnregisterReason.PLAYER_BREAK); + if (utilities.blockHandlers.containsKey(sfItem.getID())) { + allow = utilities.blockHandlers.get(sfItem.getID()).onBreak(e.getPlayer(), block2, sfItem, UnregisterReason.PLAYER_BREAK); } if (allow) { block2.getWorld().dropItemNaturally(block2.getLocation(), BlockStorage.retrieve(block2)); @@ -219,8 +203,8 @@ public class ToolListener implements Listener { SlimefunItem sfItem = BlockStorage.check(e.getBlock()); if (sfItem != null && !(sfItem instanceof HandledBlock)) { - if (SlimefunItem.blockhandler.containsKey(sfItem.getID())) { - allow = SlimefunItem.blockhandler.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK); + if (utilities.blockHandlers.containsKey(sfItem.getID())) { + allow = utilities.blockHandlers.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK); } else { // Walk over all registered block break handlers until one says that it'll handle it. @@ -238,9 +222,9 @@ public class ToolListener implements Listener { } else if (item != null) { if (item.getEnchantments().containsKey(Enchantment.LOOT_BONUS_BLOCKS) && !item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)) { - fortune = SlimefunStartup.randomize(item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) + 2) - 1; + fortune = random.nextInt(item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) + 2) - 1; if (fortune <= 0) fortune = 1; - fortune = (e.getBlock().getType() == Material.LAPIS_ORE ? 4 + SlimefunStartup.randomize(5) : 1) * (fortune + 1); + fortune = (e.getBlock().getType() == Material.LAPIS_ORE ? 4 + random.nextInt(5) : 1) * (fortune + 1); } for (ItemHandler handler : SlimefunItem.getHandlers("BlockBreakHandler")) { @@ -250,11 +234,13 @@ public class ToolListener implements Listener { if (!drops.isEmpty()) { e.getBlock().setType(Material.AIR); - if(e.isDropItems()) + + if (e.isDropItems()) { for (ItemStack drop : drops) { - if (drop != null) + if (drop != null) { e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), drop); - + } + } } } } @@ -265,13 +251,15 @@ public class ToolListener implements Listener { while (blocks.hasNext()) { Block block = blocks.next(); - SlimefunItem item = BlockStorage.check(block); - if (item != null) { + String id = BlockStorage.checkID(block); + if (id != null) { blocks.remove(); - if (!item.getID().equalsIgnoreCase("HARDENED_GLASS") && !item.getID().equalsIgnoreCase("WITHER_PROOF_OBSIDIAN") && !item.getID().equalsIgnoreCase("WITHER_PROOF_GLASS") && !item.getID().equalsIgnoreCase("FORCEFIELD_PROJECTOR") && !item.getID().equalsIgnoreCase("FORCEFIELD_RELAY")) { + if (!id.equalsIgnoreCase("HARDENED_GLASS") && !id.equalsIgnoreCase("WITHER_PROOF_OBSIDIAN") && !id.equalsIgnoreCase("WITHER_PROOF_GLASS") && !id.equalsIgnoreCase("FORCEFIELD_PROJECTOR") && !id.equalsIgnoreCase("FORCEFIELD_RELAY")) { boolean success = true; - if (SlimefunItem.blockhandler.containsKey(item.getID())) { - success = SlimefunItem.blockhandler.get(item.getID()).onBreak(null, block, item, UnregisterReason.EXPLODE); + SlimefunItem item = SlimefunItem.getByID(id); + + if (utilities.blockHandlers.containsKey(id)) { + success = utilities.blockHandlers.get(id).onBreak(null, block, item, UnregisterReason.EXPLODE); } if (success) { BlockStorage.clearBlockInfo(block); diff --git a/src/me/mrCookieSlime/Slimefun/listeners/WorldListener.java b/src/me/mrCookieSlime/Slimefun/listeners/WorldListener.java index 0e1be152b..4b2cc295c 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/WorldListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/WorldListener.java @@ -1,16 +1,19 @@ package me.mrCookieSlime.Slimefun.listeners; +import java.util.logging.Level; + import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.event.world.WorldUnloadEvent; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; public class WorldListener implements Listener { - public WorldListener(SlimefunStartup plugin) { + public WorldListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -18,16 +21,20 @@ public class WorldListener implements Listener { public void onWorldLoad(WorldLoadEvent e) { BlockStorage.getForcedStorage(e.getWorld()); - SlimefunStartup.getWhitelist().setDefaultValue(e.getWorld().getName() + ".enabled", true); - SlimefunStartup.getWhitelist().setDefaultValue(e.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE", true); - SlimefunStartup.getWhitelist().save(); + SlimefunPlugin.getWhitelist().setDefaultValue(e.getWorld().getName() + ".enabled", true); + SlimefunPlugin.getWhitelist().setDefaultValue(e.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE", true); + SlimefunPlugin.getWhitelist().save(); } @EventHandler public void onWorldUnload(WorldUnloadEvent e) { BlockStorage storage = BlockStorage.getStorage(e.getWorld()); - if (storage != null) storage.save(true); - else System.err.println("[Slimefun] Could not save Slimefun Blocks for World \"" + e.getWorld().getName() + "\""); + if (storage != null) { + storage.save(true); + } + else { + Slimefun.getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"" + e.getWorld().getName() + "\""); + } } } diff --git a/src/me/mrCookieSlime/Slimefun/utils/CategorySorter.java b/src/me/mrCookieSlime/Slimefun/utils/CategorySorter.java new file mode 100644 index 000000000..64cf469c4 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/utils/CategorySorter.java @@ -0,0 +1,17 @@ +package me.mrCookieSlime.Slimefun.utils; + +import java.util.Comparator; + +import me.mrCookieSlime.Slimefun.Objects.Category; + +public class CategorySorter implements Comparator { + + /** + * @since 4.0 + */ + @Override + public int compare(Category c1, Category c2) { + return Integer.compare(c1.getTier(), c2.getTier()); + } + +} \ No newline at end of file diff --git a/src/me/mrCookieSlime/Slimefun/utils/Settings.java b/src/me/mrCookieSlime/Slimefun/utils/Settings.java new file mode 100644 index 000000000..422ac66df --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/utils/Settings.java @@ -0,0 +1,46 @@ +package me.mrCookieSlime.Slimefun.utils; + +import java.util.List; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; + +public final class Settings { + + public final boolean printOutLoading; + + public boolean researchesEnabled; + public final boolean researchesFreeInCreative; + public final List researchesTitles; + + public final int blocksInfoLoadingDelay; + public final int blocksAutoSaveDelay; + + public final boolean guideShowVanillaRecipes; + + public final int emeraldEnchantsLimit; + + public final boolean legacyDustWasher; + public final boolean legacyOreGrinder; + public final boolean legacyOreWasher; + + public int smelteryFireBreakChance; + + public Settings(Config cfg) { + printOutLoading = cfg.getBoolean("options.print-out-loading"); + + researchesFreeInCreative = cfg.getBoolean("options.allow-free-creative-research"); + researchesTitles = cfg.getStringList("research-ranks"); + + blocksInfoLoadingDelay = cfg.getInt("URID.info-delay"); + blocksAutoSaveDelay = cfg.getInt("options.auto-save-delay-in-minutes"); + + guideShowVanillaRecipes = cfg.getBoolean("options.show-vanilla-recipes-in-guide"); + + emeraldEnchantsLimit = cfg.getInt("options.emerald-enchantment-limit"); + + legacyDustWasher = cfg.getBoolean("options.legacy-dust-washer"); + legacyOreWasher = cfg.getBoolean("options.legacy-ore-washer"); + legacyOreGrinder = cfg.getBoolean("options.legacy-ore-grinder"); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/utils/Utilities.java b/src/me/mrCookieSlime/Slimefun/utils/Utilities.java new file mode 100644 index 000000000..98ad43ece --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/utils/Utilities.java @@ -0,0 +1,162 @@ +package me.mrCookieSlime.Slimefun.utils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.Slimefun.GEO.OreGenResource; +import me.mrCookieSlime.Slimefun.Lists.Categories; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.MultiBlock; +import me.mrCookieSlime.Slimefun.Objects.Research; +import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.Setup.PostSlimefunLoadingHandler; +import me.mrCookieSlime.Slimefun.ancient_altar.AltarRecipe; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.GuideHandler; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; +import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; +import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; +import me.mrCookieSlime.Slimefun.api.item_transport.CargoTransportEvent; +import me.mrCookieSlime.Slimefun.api.item_transport.ItemRequest; +import me.mrCookieSlime.Slimefun.hooks.github.Contributor; +import me.mrCookieSlime.Slimefun.hooks.github.GitHubConnector; + +/** + * Really dirty way to store stuff, but you can dump + * some Objects into here that need to be used throughout + * multiple Classes. + * + * @author TheBusyBiscuit + * + */ +public final class Utilities { + + public int vanillaItems = 0; + + public final List allItems = new ArrayList<>(); + public final List enabledItems = new ArrayList<>(); + public final Map itemIDs = new HashMap<>(); + + public final List allMultiblocks = new LinkedList<>(); + public final List allResearches = new LinkedList<>(); + + /** + * List of the registered Categories. + * @since 4.0 + * @see Categories + */ + public final List allCategories = new ArrayList<>(); + public final List enabledCategories = new ArrayList<>(); + public final CategorySorter categorySorter = new CategorySorter(); + + public final Set radioactiveItems = new HashSet<>(); + public final Map> itemHandlers = new HashMap<>(); + public final Map blockHandlers = new HashMap<>(); + public final Set tickers = new HashSet<>(); + + public final Map blocksEnergyCapacity = new HashMap<>(); + public final Set rechargeableItems = new HashSet<>(); + public final Set capacitorIDs = new HashSet<>(); + + public final Set energyNetInput = new HashSet<>(); + public final Set energyNetStorage = new HashSet<>(); + public final Set energyNetOutput = new HashSet<>(); + + public final Map roundRobin = new HashMap<>(); + public final Set itemRequests = new HashSet<>(); + + public final Map blockMenuPresets = new HashMap<>(); + + public final Map automatedCraftingChamberRecipes = new HashMap<>(); + + public final Map worlds = new HashMap<>(); + public final Set loadedTickers = new HashSet<>(); + + public final Map mapChunks = new HashMap<>(); + public final Map> tickingChunks = new HashMap<>(); + public final Map universalInventories = new HashMap<>(); + + public final Map profiles = new HashMap<>(); + + public final Map> guideHandlers = new HashMap<>(); + public final List postHandlers = new ArrayList<>(); + + public final Map> drops = new EnumMap<>(EntityType.class); + + public final Map jumpState = new HashMap<>(); + public final Set damage = new HashSet<>(); + public final Map remove = new HashMap<>(); + public final Map mode = new HashMap<>(); + + public final Map enchanting = new HashMap<>(); + public final Map backpack = new HashMap<>(); + + public final Set altarinuse = new HashSet<>(); + public final Set altarRecipes = new HashSet<>(); + + public final Map> soulbound = new HashMap<>(); + public final List blocks = new ArrayList<>(); + public final List cancelPlace = new ArrayList<>(); + public final Map arrows = new HashMap<>(); + + public final Set elevatorUsers = new HashSet<>(); + public final Set teleporterUsers = new HashSet<>(); + + public final Map resources = new HashMap<>(); + + public final Set connectors = new HashSet<>(); + public final Map contributorHeads = new HashMap<>(); + public final List contributors = new ArrayList<>(); + + public final Map> guideHistory = new HashMap<>(); + + public final List cargoTransportEvents = new ArrayList<>(); + + /** + * Contains all the players (UUIDs) that are currently unlocking a research. + * @since 4.0 + */ + public final Set researching = new HashSet<>(); + + /** + * Represents the current month of the year + */ + public int month = 0; + + /** + * Represents the number of unresolved Issues on the Slimefun4 GitHub repository. + * @since 4.1.13 + */ + public int issues = 0; + + /** + * Represents the number of Forks of the Slimefun4 GitHub repository. + * @since 4.1.13 + */ + public int forks = 0; + + /** + * Represents the number of stars on the Slimefun4 GitHub repository. + * @since 4.1.13 + */ + public int stars = 0; + + public int codeBytes = 0; + public Date lastUpdate = new Date(); + +} diff --git a/src/plugin.yml b/src/plugin.yml index 4ed59644c..3381857ba 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -4,8 +4,8 @@ author: The Slimefun 4 Community description: Slimefun basically turns your entire Server into a FTB modpack without installing a single mod website: http://TheBusyBiscuit.github.io/ -main: me.mrCookieSlime.Slimefun.SlimefunStartup -softdepend: [CS-CoreLib, ClearLag, WorldEdit, PlaceholderAPI] +main: me.mrCookieSlime.Slimefun.SlimefunPlugin +softdepend: [CS-CoreLib, PlaceholderAPI] api-version: 1.14