diff --git a/src/me/mrCookieSlime/Slimefun/Android/AndroidType.java b/src/me/mrCookieSlime/Slimefun/Android/AndroidType.java index 12ca17c95..083a7614a 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/AndroidType.java +++ b/src/me/mrCookieSlime/Slimefun/Android/AndroidType.java @@ -5,6 +5,7 @@ public enum AndroidType { NONE, MINER, FARMER, + ADVANCED_FARMER, WOODCUTTER, FIGHTER, FISHERMAN, diff --git a/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java b/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java index 8e440e308..c88be9b8e 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java +++ b/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java @@ -1,16 +1,5 @@ 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.Map; -import java.util.Set; -import java.util.UUID; - import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Block.TreeCalculator; @@ -20,11 +9,11 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuClickHan import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuOpeningHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.MenuHelper; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.MenuHelper.ChatHandler; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; -import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.ExoticGarden.ExoticGarden; import me.mrCookieSlime.Slimefun.Android.ScriptComparators.ScriptReputationSorter; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; @@ -36,63 +25,54 @@ 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.SlimefunStartup; 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; - -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.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Dispenser; import org.bukkit.block.Skull; -import org.bukkit.entity.Ageable; -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.entity.*; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.metadata.FixedMetadataValue; +import java.io.File; +import java.util.*; + 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}; @SuppressWarnings("deprecation") private static final ItemStack[] fish = new ItemStack[] {new MaterialData(Material.RAW_FISH, (byte) 0).toItemStack(1), new MaterialData(Material.RAW_FISH, (byte) 1).toItemStack(1), new MaterialData(Material.RAW_FISH, (byte) 2).toItemStack(1), new MaterialData(Material.RAW_FISH, (byte) 3).toItemStack(1), 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.ENDER_PORTAL_FRAME); } - + 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(); @@ -100,13 +80,14 @@ public abstract class ProgrammableAndroid extends SlimefunItem { @SuppressWarnings("deprecation") 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 MaterialData(Material.COAL, (byte) 0).toItemStack(1))); registerFuel(new MachineFuel(80, new MaterialData(Material.COAL, (byte) 1).toItemStack(1))); registerFuel(new MachineFuel(800, new ItemStack(Material.COAL_BLOCK))); registerFuel(new MachineFuel(45, new ItemStack(Material.BLAZE_ROD))); - + // Logs registerFuel(new MachineFuel(4, new MaterialData(Material.LOG, (byte) 0).toItemStack(1))); registerFuel(new MachineFuel(4, new MaterialData(Material.LOG, (byte) 1).toItemStack(1))); @@ -114,7 +95,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { registerFuel(new MachineFuel(4, new MaterialData(Material.LOG, (byte) 3).toItemStack(1))); registerFuel(new MachineFuel(4, new MaterialData(Material.LOG_2, (byte) 0).toItemStack(1))); registerFuel(new MachineFuel(4, new MaterialData(Material.LOG_2, (byte) 1).toItemStack(1))); - + // Wooden Planks registerFuel(new MachineFuel(1, new MaterialData(Material.WOOD, (byte) 0).toItemStack(1))); registerFuel(new MachineFuel(1, new MaterialData(Material.WOOD, (byte) 1).toItemStack(1))); @@ -133,9 +114,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { registerFuel(new MachineFuel(1200, SlimefunItems.NEPTUNIUM)); registerFuel(new MachineFuel(3000, SlimefunItems.BOOSTED_URANIUM)); } - + new BlockMenuPreset(name, getInventoryTitle()) { - + @Override public void init() { try { @@ -166,9 +147,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { BlockStorage.addBlockInfo(b, "paused", "false"); p.closeInventory(); return false; - } + } }); - + menu.replaceExistingItem(17, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTYxMzlmZDFjNTY1NGU1NmU5ZTRlMmM4YmU3ZWIyYmQ1YjQ5OWQ2MzM2MTY2NjNmZWVlOTliNzQzNTJhZDY0In19fQ=="), "§4Pause")); menu.addMenuClickHandler(17, new MenuClickHandler() { @@ -177,9 +158,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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, new MenuClickHandler() { @@ -193,7 +174,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { e.printStackTrace(); } return false; - } + } }); } catch (Exception e) { e.printStackTrace(); @@ -205,9 +186,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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()); @@ -221,11 +202,11 @@ public abstract class ProgrammableAndroid extends SlimefunItem { skull.setRotation(BlockFace.NORTH); skull.update(); } - + @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { boolean allow = reason.equals(UnregisterReason.PLAYER_BREAK) && (BlockStorage.getBlockInfo(b, "owner").equals(p.getUniqueId().toString()) || p.hasPermission("slimefun.android.bypass")); - + if (allow) { if (BlockStorage.getInventory(b).getItemInSlot(43) != null) b.getWorld().dropItemNaturally(b.getLocation(), BlockStorage.getInventory(b).getItemInSlot(43)); for (int slot: getOutputSlots()) { @@ -233,12 +214,12 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } AndroidStatusHologram.remove(b); } - + return allow; } }); } - + @SuppressWarnings("deprecation") protected void tick(Block b) { try { @@ -248,7 +229,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } catch(NullPointerException x) { return; } - + if (BlockStorage.getBlockInfo(b, "paused").equals("false")) { float fuel = Float.parseFloat(BlockStorage.getBlockInfo(b, "fuel")); if (fuel == 0) { @@ -273,7 +254,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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: { @@ -353,7 +334,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { ItemStack drop = fish[CSCoreLib.randomizer().nextInt(fish.length)]; if (fits(b, drop)) pushItems(b, drop); } - + } break; } @@ -434,6 +415,17 @@ public abstract class ProgrammableAndroid extends SlimefunItem { farm(b, block); break; } + case FARM_EXOTIC_FORWARD: { + BlockFace face = BlockFace.valueOf(BlockStorage.getBlockInfo(b, "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.getBlockInfo(b, "rotation")); Block block = b.getRelative(face); @@ -459,7 +451,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } else log.setType(Material.AIR); } - + } } } @@ -467,7 +459,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } case ATTACK_MOBS_ANIMALS: { double damage = getTier() < 2 ? 20D: 4D * getTier(); - + entities: for (Entity n: AndroidStatusHologram.getNearbyEntities(b, 4D + getTier())) { switch (BlockFace.valueOf(BlockStorage.getBlockInfo(b, "rotation"))) { @@ -475,7 +467,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -485,7 +477,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -495,7 +487,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -505,7 +497,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -519,7 +511,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } case ATTACK_MOBS: { double damage = getTier() < 2 ? 20D: 4D * getTier(); - + entities: for (Entity n: AndroidStatusHologram.getNearbyEntities(b, 4D + getTier())) { if (n instanceof Animals) continue; @@ -528,7 +520,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -538,7 +530,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -548,7 +540,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -558,7 +550,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -573,7 +565,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { case ATTACK_ANIMALS: { double damage = getTier() < 2 ? 20D: 4D * getTier(); - + entities: for (Entity n: AndroidStatusHologram.getNearbyEntities(b, 4D + getTier())) { if (n instanceof Monster) continue; @@ -582,7 +574,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -592,7 +584,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -602,7 +594,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -612,7 +604,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -627,7 +619,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; @@ -637,7 +629,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -647,7 +639,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -657,7 +649,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -667,7 +659,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @@ -687,15 +679,15 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } } } - + @SuppressWarnings("deprecation") 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.setType(Material.SKULL); block.setData((byte) 1); - + Skull skull = (Skull) block.getState(); skull.setRotation(face); skull.update(); @@ -704,7 +696,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { BlockStorage.moveBlockInfo(b, block); } } - + 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.getBlockInfo(b, "owner")), block)) { @@ -716,7 +708,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } } } - + @SuppressWarnings("deprecation") private void movedig(Block b, BlockFace face, Block block) { Collection drops = block.getDrops(); @@ -728,7 +720,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); block.setType(Material.SKULL); block.setData((byte) 1); - + Skull skull = (Skull) block.getState(); skull.setRotation(face); skull.update(); @@ -739,7 +731,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } catch(Exception x) { x.printStackTrace(); } - } + } else { try { move(b, face, block); @@ -748,92 +740,104 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } } } - - @SuppressWarnings("deprecation") - private void farm(Block b, Block block) { - switch (block.getType()) { - case CROPS: { - if (block.getData() >= 7) { - ItemStack drop = new ItemStack(Material.WHEAT, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - block.setData((byte) 0); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case POTATO: { - if (block.getData() >= 7) { - ItemStack drop = new ItemStack(Material.POTATO_ITEM, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - block.setData((byte) 0); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case CARROT: { - if (block.getData() >= 7) { - ItemStack drop = new ItemStack(Material.CARROT_ITEM, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - block.setData((byte) 0); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case BEETROOT_BLOCK: { - if (block.getData() >= 3) { - ItemStack drop = new ItemStack(Material.BEETROOT, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - block.setData((byte) 0); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case COCOA: { - if (block.getData() >= 8) { - ItemStack drop = new MaterialData(Material.INK_SACK, (byte) 3).toItemStack(CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - block.setData((byte) (block.getData() - 8)); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - case NETHER_WARTS: { - if (block.getData() >= 3) { - ItemStack drop = new ItemStack(Material.NETHER_STALK, CSCoreLib.randomizer().nextInt(3) + 1); - if (fits(b, drop)) { - pushItems(b, drop); - block.setData((byte) 0); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); - } - } - break; - } - default: - break; - } - } + + @SuppressWarnings("deprecation") + private void farm(Block b, Block block) { + switch (block.getType()) { + case CROPS: { + if (block.getData() >= 7) { + ItemStack drop = new ItemStack(Material.WHEAT, CSCoreLib.randomizer().nextInt(3) + 1); + if (fits(b, drop)) { + pushItems(b, drop); + block.setData((byte) 0); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + break; + } + case POTATO: { + if (block.getData() >= 7) { + ItemStack drop = new ItemStack(Material.POTATO_ITEM, CSCoreLib.randomizer().nextInt(3) + 1); + if (fits(b, drop)) { + pushItems(b, drop); + block.setData((byte) 0); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + break; + } + case CARROT: { + if (block.getData() >= 7) { + ItemStack drop = new ItemStack(Material.CARROT_ITEM, CSCoreLib.randomizer().nextInt(3) + 1); + if (fits(b, drop)) { + pushItems(b, drop); + block.setData((byte) 0); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + break; + } + case BEETROOT_BLOCK: { + if (block.getData() >= 3) { + ItemStack drop = new ItemStack(Material.BEETROOT, CSCoreLib.randomizer().nextInt(3) + 1); + if (fits(b, drop)) { + pushItems(b, drop); + block.setData((byte) 0); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + break; + } + case COCOA: { + if (block.getData() >= 8) { + ItemStack drop = new MaterialData(Material.INK_SACK, (byte) 3).toItemStack(CSCoreLib.randomizer().nextInt(3) + 1); + if (fits(b, drop)) { + pushItems(b, drop); + block.setData((byte) (block.getData() - 8)); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + break; + } + case NETHER_WARTS: { + if (block.getData() >= 3) { + ItemStack drop = new ItemStack(Material.NETHER_STALK, CSCoreLib.randomizer().nextInt(3) + 1); + if (fits(b, drop)) { + pushItems(b, drop); + block.setData((byte) 0); + 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.setData((byte) 0); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType()); + } + } + } @SuppressWarnings("deprecation") private void constructMenu(BlockMenuPreset preset) throws Exception { for (int i: border) { preset.addItem(i, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); } for (int i: border_out) { @@ -844,13 +848,13 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); } - + for (int i: getOutputSlots()) { preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack cursor, ClickAction action) { return false; @@ -862,11 +866,11 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } }); } - + 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..."), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) { return false; @@ -876,7 +880,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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..."), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) { return false; @@ -886,7 +890,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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"), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) { return false; @@ -894,13 +898,13 @@ public abstract class ProgrammableAndroid extends SlimefunItem { }); } } - + public void openScriptEditor(Player p, final Block b) throws Exception { ChestMenu menu = new ChestMenu("§eScript Editor"); - + menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDliZjZkYjRhZWRhOWQ4ODIyYjlmNzM2NTM4ZThjMThiOWE0ODQ0Zjg0ZWI0NTUwNGFkZmJmZWU4N2ViIn19fQ=="), "§2> Edit Script", "", "§aEdits your current Script"), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) { try { @@ -911,10 +915,10 @@ public abstract class ProgrammableAndroid extends SlimefunItem { return false; } }); - + menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTcxZDg5NzljMTg3OGEwNTk4N2E3ZmFmMjFiNTZkMWI3NDRmOWQwNjhjNzRjZmZjZGUxZWExZWRhZDU4NTIifX19"), "§4> Create new Script", "", "§cDeletes your current Script", "§cand creates a blank one"), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) { try { @@ -925,10 +929,10 @@ public abstract class ProgrammableAndroid extends SlimefunItem { return false; } }); - + menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzAxNTg2ZTM5ZjZmZmE2M2I0ZmIzMDFiNjVjYTdkYThhOTJmNzM1M2FhYWI4OWQzODg2NTc5MTI1ZGZiYWY5In19fQ=="), "§6> Download a Script", "", "§eDownload a Script from the Server", "§eYou can edit or simply use it"), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) { try { @@ -939,32 +943,32 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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, ScriptPart.START.toItemStack()); menu.addMenuClickHandler(0, new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { 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, new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { try { @@ -976,10 +980,10 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } }); } - + menu.addItem(i + additional, ScriptPart.REPEAT.toItemStack()); menu.addMenuClickHandler(i + additional, new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; @@ -990,12 +994,12 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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, new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction action) { if (action.isRightClicked() && action.isShiftClicked()) { if (commands.length == 54) return false; - + int i = 0; StringBuilder builder = new StringBuilder("START-"); for (String command: commands) { @@ -1010,7 +1014,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } builder.append("REPEAT"); BlockStorage.addBlockInfo(b, "script", builder.toString()); - + try { openScript(p, b, builder.toString()); } catch (Exception e) { @@ -1044,41 +1048,41 @@ public abstract class ProgrammableAndroid extends SlimefunItem { }); } } - + menu.open(p); } - + @SuppressWarnings("deprecation") private void openScriptDownloader(final Player p, final Block b, final int page) throws Exception { final ChestMenu menu = new ChestMenu("Slimefun Guide"); - + menu.addMenuOpeningHandler(new MenuOpeningHandler() { - + @Override public void onOpen(Player p) { p.playSound(p.getLocation(), Sound.BLOCK_NOTE_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 MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " ")); menu.addMenuClickHandler(i, new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } }); } - + menu.addItem(46, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 5), "&r\u21E6 Previous Page", "", "&7(" + page + " / " + pages + ")")); menu.addMenuClickHandler(46, new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { int next = page - 1; @@ -1093,15 +1097,15 @@ public abstract class ProgrammableAndroid extends SlimefunItem { return false; } }); - + menu.addItem(49, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTA1YTJjYWI4YjY4ZWE1N2UzYWY5OTJhMzZlNDdjOGZmOWFhODdjYzg3NzYyODE5NjZmOGMzY2YzMWEzOCJ9fX0="), "&eUpload a Script", "", "§6Click §7to upload your Android's Script", "§7to the Database")); menu.addMenuClickHandler(49, new MenuClickHandler() { - + @Override public boolean onClick(Player p, int arg1, ItemStack arg2, ClickAction arg3) { final String code = BlockStorage.getBlockInfo(b, "script"); int num = 1; - + for (Config script: getUploadedScripts()) { if (script.getString("author").equals(p.getUniqueId().toString())) num++; if (script.getString("code").equals(code)) { @@ -1109,18 +1113,18 @@ public abstract class ProgrammableAndroid extends SlimefunItem { return false; } } - + final int id = num; - + p.closeInventory(); Messages.local.sendTranslation(p, "android.scripts.enter-name", true); - + MenuHelper.awaitChatInput(p, new ChatHandler() { - + @Override public boolean onChat(Player p, String message) { Config script = new Config("plugins/Slimefun/scripts/" + getAndroidType().toString() + "/" + p.getName() + " " + id + ".sfs"); - + script.setValue("author", p.getUniqueId().toString()); script.setValue("author_name", p.getName()); script.setValue("name", ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', message))); @@ -1130,24 +1134,24 @@ public abstract class ProgrammableAndroid extends SlimefunItem { script.setValue("rating.positive", new ArrayList()); script.setValue("rating.negative", new ArrayList()); script.save(); - + try { Messages.local.sendTranslation(p, "android.uploaded", true); openScriptDownloader(p, b, page); } catch (Exception e) { e.printStackTrace(); } - + return false; } }); return false; } }); - + menu.addItem(52, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 5), "&rNext Page \u21E8", "", "&7(" + page + " / " + pages + ")")); menu.addMenuClickHandler(52, new MenuClickHandler() { - + @Override public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { int next = page + 1; @@ -1162,30 +1166,30 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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, new MenuClickHandler() { - + @Override public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) { Config script2 = new Config(script.getFile()); - + if (action.isShiftClicked()) { if (script2.getString("author").equals(p.getUniqueId().toString())) { Messages.local.sendTranslation(p, "android.scripts.rating.own", true); @@ -1194,10 +1198,10 @@ public abstract class ProgrammableAndroid extends SlimefunItem { if (!script2.getStringList("rating.negative").contains(p.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(p.getUniqueId().toString())) { List list = script2.getStringList("rating.negative"); list.add(p.getUniqueId().toString()); - + script2.setValue("rating.negative", list); script2.save(); - + try { openScriptDownloader(p, b, page); } catch (Exception e) { @@ -1212,10 +1216,10 @@ public abstract class ProgrammableAndroid extends SlimefunItem { if (!script2.getStringList("rating.negative").contains(p.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(p.getUniqueId().toString())) { List list = script2.getStringList("rating.positive"); list.add(p.getUniqueId().toString()); - + script2.setValue("rating.positive", list); script2.save(); - + try { openScriptDownloader(p, b, page); } catch (Exception e) { @@ -1231,7 +1235,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { try { script2.setValue("downloads", script2.getInt("downloads") + 1); script2.save(); - + BlockStorage.addBlockInfo(b, "script", script2.getString("code")); openScriptEditor(p, b); } catch (Exception e) { @@ -1241,11 +1245,11 @@ public abstract class ProgrammableAndroid extends SlimefunItem { return false; } }); - + index++; } } - + menu.open(p); } @@ -1266,16 +1270,16 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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; } @SuppressWarnings("deprecation") 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("-"); - + menu.addItem(0, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1283,9 +1287,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(1, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1293,9 +1297,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(2, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1303,9 +1307,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(3, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1313,9 +1317,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(4, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1323,9 +1327,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(5, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1333,9 +1337,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(6, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1343,9 +1347,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(7, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1353,9 +1357,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(8, new CustomItem(new MaterialData(Material.STAINED_GLASS_PANE, (byte) 7), " "), new MenuClickHandler() { @@ -1363,12 +1367,12 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) { return false; } - + }); - + menu.addItem(9, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTYxMzlmZDFjNTY1NGU1NmU5ZTRlMmM4YmU3ZWIyYmQ1YjQ5OWQ2MzM2MTY2NjNmZWVlOTliNzQzNTJhZDY0In19fQ=="), "§rDo nothing"), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int arg1, ItemStack arg2, ClickAction arg3) { int i = 0; @@ -1387,12 +1391,12 @@ public abstract class ProgrammableAndroid extends SlimefunItem { return false; } }); - + int i = 10; for (final ScriptPart part: getAccessibleScriptParts()) { menu.addItem(i, part.toItemStack(), new MenuClickHandler() { - + @Override public boolean onClick(Player p, int arg1, ItemStack arg2, ClickAction arg3) { int i = 0; @@ -1406,7 +1410,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } builder.append("REPEAT"); BlockStorage.addBlockInfo(b, "script", builder.toString()); - + try { openScript(p, b, builder.toString()); } catch (Exception e) { @@ -1417,7 +1421,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { }); i++; } - + menu.open(p); } @@ -1432,28 +1436,28 @@ public abstract class ProgrammableAndroid extends SlimefunItem { } 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); @@ -1471,44 +1475,44 @@ public abstract class ProgrammableAndroid extends SlimefunItem { 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/Android/ScriptPart.java b/src/me/mrCookieSlime/Slimefun/Android/ScriptPart.java index 70573fb9f..0915f34e6 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/ScriptPart.java +++ b/src/me/mrCookieSlime/Slimefun/Android/ScriptPart.java @@ -45,7 +45,11 @@ public enum ScriptPart { // Action - Hoe FARM_FORWARD(AndroidType.FARMER, "§bHarvest and Replant", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGRlOWE1MjJjM2Q5ZTdkODVmM2Q4MmMzNzVkYzM3ZmVjYzg1NmRiZDgwMWViM2JjZWRjMTE2NTE5OGJmIn19fQ=="), FARM_DOWN(AndroidType.FARMER, "§bHarvest and Replant §7(Block underneath)", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmQ0Mjk2YjMzM2QyNTMxOWFmM2YzMzA1MTc5N2Y5ZTZkODIxY2QxOWEwMTRmYjcxMzdiZWI4NmE0ZTllOTYifX19"), - + + // Action - ExoticGarden + FARM_EXOTIC_FORWARD(AndroidType.ADVANCED_FARMER, "§bAdvanced Harvest and Replant", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGRlOWE1MjJjM2Q5ZTdkODVmM2Q4MmMzNzVkYzM3ZmVjYzg1NmRiZDgwMWViM2JjZWRjMTE2NTE5OGJmIn19fQ=="), + FARM_EXOTIC_DOWN(AndroidType.ADVANCED_FARMER, "§bAdvanced Harvest and Replant §7(Block underneath)", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmQ0Mjk2YjMzM2QyNTMxOWFmM2YzMzA1MTc5N2Y5ZTZkODIxY2QxOWEwMTRmYjcxMzdiZWI4NmE0ZTllOTYifX19"), + // Action - Interface INTERFACE_ITEMS(AndroidType.NONE, "§9Push Inventory Contents to the faced Interface", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTBhNGRiZjY2MjVjNDJiZTU3YThiYTJjMzMwOTU0YTc2YmRmMjI3ODU1NDBlODdhNWM5NjcyNjg1MjM4ZWMifX19"), INTERFACE_FUEL(AndroidType.NONE, "§cPull Fuel from the faced Interface", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjQzMmY1MjgyYTUwNzQ1YjkxMmJlMTRkZWRhNTgxYmQ0YTA5Yjk3N2EzYzMyZDdlOTU3ODQ5MWZlZThmYTcifX19"); diff --git a/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java b/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java index 4c1c10dfc..dfd5cf18d 100644 --- a/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java +++ b/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java @@ -512,6 +512,7 @@ public class SlimefunItems { 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; @@ -703,6 +704,7 @@ public class SlimefunItems { 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 harvest Exotic Garden plants"); 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"); diff --git a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index 1fde5f664..64620c464 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -4081,6 +4081,27 @@ public class SlimefunSetup { } .register(true); + + new ProgrammableAndroid(Categories.ELECTRICITY, SlimefunItems.PROGRAMMABLE_ANDROID_2_FARMER, "PROGRAMMABLE_ANDROID_2_FARMER", RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {null, SlimefunItems.GPS_TRANSMITTER, null, new ItemStack(Material.DIAMOND_HOE), SlimefunItems.PROGRAMMABLE_ANDROID_2, new ItemStack(Material.DIAMOND_HOE), null, SlimefunItems.ELECTRIC_MOTOR, null}) { + + @Override + public AndroidType getAndroidType() { + return AndroidType.ADVANCED_FARMER; + } + + @Override + public float getFuelEfficiency() { + return 1.5F; + } + + @Override + public int getTier() { + return 2; + } + + } + .register(true); new ProgrammableAndroid(Categories.ELECTRICITY, SlimefunItems.PROGRAMMABLE_ANDROID_3, "PROGRAMMABLE_ANDROID_3", RecipeType.ENHANCED_CRAFTING_TABLE, diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java index ced605c07..b4a1a731d 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java @@ -82,39 +82,42 @@ import me.mrCookieSlime.Slimefun.listeners.ItemListener; import me.mrCookieSlime.Slimefun.listeners.TalismanListener; import me.mrCookieSlime.Slimefun.listeners.TeleporterListener; import me.mrCookieSlime.Slimefun.listeners.ToolListener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; public class SlimefunStartup 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 boolean clearlag = false; + private boolean exoticGarden = false; // Supported Versions of Minecraft final String[] supported = {"v1_9_", "v1_10_", "PluginBukkitBridge"}; - + @SuppressWarnings("deprecation") @Override public void onEnable() { CSCoreLibLoader loader = new CSCoreLibLoader(this); if (loader.load()) { - + boolean compatibleVersion = false; - + for (String version: supported) { if (ReflectionUtils.getVersion().startsWith(version)) { compatibleVersion = true; break; } } - + // Looks like you are using an unsupported Minecraft Version if (!compatibleVersion) { System.err.println("### Slimefun failed to load!"); @@ -130,21 +133,21 @@ public class SlimefunStartup extends JavaPlugin { getServer().getPluginManager().disablePlugin(this); return; } - + instance = this; System.out.println("[Slimefun] Loading Files..."); Files.cleanup(); - + System.out.println("[Slimefun] Loading Config..."); - + utils = new PluginUtils(this); utils.setupConfig(); - + // Loading all extra configs researches = new Config(Files.RESEARCHES); items = new Config(Files.ITEMS); whitelist = new Config(Files.WHITELIST); - + // Init Config, Updater, Metrics and messages.yml utils.setupUpdater(53485, getFile()); utils.setupMetrics(); @@ -164,9 +167,9 @@ public class SlimefunStartup extends JavaPlugin { if (!new File("plugins/Slimefun/scripts").exists()) new File("plugins/Slimefun/scripts").mkdirs(); if (!new File("plugins/Slimefun/generators").exists()) new File("plugins/Slimefun/generators").mkdirs(); if (!new File("plugins/Slimefun/error-reports").exists()) new File("plugins/Slimefun/error-reports").mkdirs(); - + SlimefunManager.plugin = this; - + System.out.println("[Slimefun] Loading Items..."); MiscSetup.setupItemSettings(); try { @@ -175,17 +178,17 @@ public class SlimefunStartup extends JavaPlugin { e1.printStackTrace(); } MiscSetup.loadDescriptions(); - + System.out.println("[Slimefun] Loading Researches..."); Research.enabled = getResearchCfg().getBoolean("enable-researching"); ResearchSetup.setupResearches(); - + MiscSetup.setupMisc(); - + BlockStorage.info_delay = config.getInt("URID.info-delay"); System.out.println("[Slimefun] Loading World Generators..."); - + // Generating Oil as an OreGenResource (its a cool API) OreGenSystem.registerResource(new OreGenResource() { @@ -197,20 +200,20 @@ public class SlimefunStartup extends JavaPlugin { case BEACHES: { return CSCoreLib.randomizer().nextInt(6) + 2; } - + case DESERT: case DESERT_HILLS: case MUTATED_DESERT: { return CSCoreLib.randomizer().nextInt(40) + 19; } - + case EXTREME_HILLS: case MUTATED_EXTREME_HILLS: case SMALLER_EXTREME_HILLS: case RIVER: { return CSCoreLib.randomizer().nextInt(14) + 13; } - + case ICE_MOUNTAINS: case ICE_FLATS: case MUTATED_ICE_FLATS: @@ -218,13 +221,13 @@ public class SlimefunStartup extends JavaPlugin { case FROZEN_RIVER: { return CSCoreLib.randomizer().nextInt(11) + 3; } - + case SKY: case HELL: { return 0; } - - + + case MESA: case MESA_CLEAR_ROCK: case MESA_ROCK: @@ -240,12 +243,12 @@ public class SlimefunStartup extends JavaPlugin { case OCEAN: { return CSCoreLib.randomizer().nextInt(62) + 24; } - + case SWAMPLAND: case MUTATED_SWAMPLAND: { return CSCoreLib.randomizer().nextInt(20) + 4; } - + default: { return CSCoreLib.randomizer().nextInt(10) + 6; } @@ -267,7 +270,7 @@ public class SlimefunStartup extends JavaPlugin { return "Buckets"; } }); - + // All Slimefun Listeners new ArmorListener(this); new ItemListener(this); @@ -280,7 +283,7 @@ public class SlimefunStartup extends JavaPlugin { new FurnaceListener(this); new TeleporterListener(this); new AndroidKillingListener(this); - + // Toggleable Listeners for performance if (config.getBoolean("items.talismans")) new TalismanListener(this); if (config.getBoolean("items.backpacks")) new BackpackListener(this); @@ -290,7 +293,7 @@ public class SlimefunStartup extends JavaPlugin { // TODO: Move it to its own class, was too lazy if (config.getBoolean("options.give-guide-on-first-join")) { getServer().getPluginManager().registerEvents(new Listener() { - + @EventHandler public void onJoin(PlayerJoinEvent e) { if (!e.getPlayer().hasPlayedBefore()) { @@ -300,43 +303,43 @@ public class SlimefunStartup extends JavaPlugin { p.getInventory().addItem(SlimefunGuide.getItem(config.getBoolean("guide.default-view-book"))); } } - + }, this); } // Load/Unload Worlds in Slimefun // TODO: Move it to its own class, was too lazy getServer().getPluginManager().registerEvents(new Listener() { - + @EventHandler 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(); } - + @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() + "\""); } - + }, this); - + // Clear the Slimefun Guide History upon Player Leaving // TODO: Move it to its own class, was too lazy getServer().getPluginManager().registerEvents(new Listener() { - + @EventHandler public void onDisconnect(PlayerQuitEvent e) { if (SlimefunGuide.history.containsKey(e.getPlayer().getUniqueId())) SlimefunGuide.history.remove(e.getPlayer().getUniqueId()); } - + }, this); - + // Initiating various Stuff and all Items with a slightly delay (0ms after the Server finished loading) getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override @@ -344,15 +347,15 @@ public class SlimefunStartup extends JavaPlugin { Slimefun.emeraldenchants = getServer().getPluginManager().isPluginEnabled("EmeraldEnchants"); SlimefunGuide.all_recipes = config.getBoolean("options.show-vanilla-recipes-in-guide"); MiscSetup.loadItems(); - + for (World world: Bukkit.getWorlds()) { new BlockStorage(world); } - + if (SlimefunItem.getByName("ANCIENT_ALTAR") != null) new AncientAltarListener((SlimefunStartup) instance); } }, 0); - + // WorldEdit Hook to clear Slimefun Data upon //set 0 //cut or any other equivalent if (getServer().getPluginManager().isPluginEnabled("WorldEdit")) { try { @@ -364,14 +367,14 @@ public class SlimefunStartup extends JavaPlugin { System.err.println("[Slimefun] Maybe consider updating WorldEdit or Slimefun?"); } } - + getCommand("slimefun").setExecutor(new SlimefunCommand(this)); getCommand("slimefun").setTabCompleter(new SlimefunTabCompleter()); - + // Armor Update Task if (config.getBoolean("options.enable-armor-effects")) { getServer().getScheduler().runTaskTimer(this, new Runnable() { - + @Override public void run() { for (Player p: Bukkit.getOnlinePlayers()) { @@ -394,7 +397,7 @@ public class SlimefunStartup extends JavaPlugin { } } } - + for (ItemStack radioactive: SlimefunItem.radioactive) { if (p.getInventory().containsAtLeast(radioactive, 1)) { boolean hasFullHazmat = false; @@ -407,7 +410,7 @@ public class SlimefunStartup extends JavaPlugin { } } } - + if (!hasFullHazmat){ p.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 400, 3)); p.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 400, 3)); @@ -424,41 +427,48 @@ public class SlimefunStartup extends JavaPlugin { } }, 0L, config.getInt("options.armor-update-interval") * 20L); } - + ticker = new TickerTask(); - + // Starting all ASYNC Tasks getServer().getScheduler().scheduleAsyncRepeatingTask(this, new AutoSavingTask(), 1200L, config.getInt("options.auto-save-delay-in-minutes") * 60L * 20L); getServer().getScheduler().scheduleAsyncRepeatingTask(this, ticker, 100L, config.getInt("URID.custom-ticker-delay")); - + // Hooray! System.out.println("[Slimefun] Finished!"); - + clearlag = getServer().getPluginManager().isPluginEnabled("ClearLag"); - + + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new BukkitRunnable() { + @Override + public void run() { + exoticGarden = getServer().getPluginManager().isPluginEnabled("ExoticGarden"); //Had to do it this way, otherwise it seems disabled. + } + }, 0); + if (clearlag) new ClearLaggIntegration(this); - + // 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,})"); } } - + @Override public void onDisable() { Bukkit.getScheduler().cancelTasks(this); - + try { for (Map.Entry entry: ticker.move.entrySet()) { BlockStorage._integrated_moveBlockInfo(entry.getKey(), entry.getValue()); } ticker.move.clear(); - + for (World world: Bukkit.getWorlds()) { BlockStorage storage = BlockStorage.getStorage(world); if (storage != null) storage.save(true); else System.err.println("[Slimefun] Could not save Slimefun Blocks for World \"" + world.getName() + "\""); } - + File folder = new File("data-storage/Slimefun/block-backups"); List backups = Arrays.asList(folder.listFiles()); if (backups.size() > 20) { @@ -473,78 +483,78 @@ public class SlimefunStartup extends JavaPlugin { } } }); - + for (int i = backups.size() - 20; i > 0; i--) { backups.get(i).delete(); } } - + File file = new File("data-storage/Slimefun/block-backups/" + Clock.format(new Date()) + ".zip"); byte[] buffer = new byte[1024]; - + if (file.exists()) file.delete(); - + try { file.createNewFile(); - + 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); FileInputStream input = new FileInputStream(f); - + int length; while ((length = input.read(buffer)) > 0) { output.write(buffer, 0, length); } - + input.close(); output.closeEntry(); } } - + 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); } - + input.close(); output.closeEntry(); } - + 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(); } - + 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("[Slimfun] Backed up Blocks to " + file.getName()); } catch(IOException e) { @@ -552,7 +562,7 @@ public class SlimefunStartup extends JavaPlugin { } } catch(Exception x) { } - + config = null; researches = null; items = null; @@ -607,38 +617,41 @@ public class SlimefunStartup extends JavaPlugin { BlockStorage.universal_inventories = null; TickerTask.block_timings = null; OreGenSystem.map = null; - + for (Player p: Bukkit.getOnlinePlayers()) { p.closeInventory(); } } - + public static Config getCfg() { return config; } - + public static Config getResearchCfg() { return researches; } - + public static Config getItemCfg() { return items; } - + public static Config getWhitelist() { return whitelist; } - + public static int randomize(int max) { return CSCoreLib.randomizer().nextInt(max); } - + public static boolean chance(int max, int percentage) { return CSCoreLib.randomizer().nextInt(max) <= percentage; } - + public boolean isClearLagInstalled() { return clearlag; } + public boolean isExoticGardenInstalled () { + return exoticGarden; + } }