From a9197b1b58cee91bb6d0f081250edf9632780100 Mon Sep 17 00:00:00 2001 From: Brianna O'Keefe Date: Thu, 27 Sep 2018 22:54:43 -0400 Subject: [PATCH] Added auto breeding. Added Sheep and Chicken support. Added Animation. --- .../epicfarming/api/farming/Level.java | 2 + .../epicfarming/api/farming/LevelManager.java | 2 +- .../epicfarming/EpicFarmingPlugin.java | 14 +- .../epicfarming/boost/BoostManager.java | 5 +- .../songoda/epicfarming/farming/ELevel.java | 11 +- .../epicfarming/farming/ELevelManager.java | 4 +- .../epicfarming/listeners/BlockListeners.java | 53 ++++- .../songoda/epicfarming/tasks/EntityTask.java | 217 ++++++++++++++++++ .../songoda/epicfarming/tasks/FarmTask.java | 11 +- .../songoda/epicfarming/utils/EntityInfo.java | 21 ++ .../songoda/epicfarming/utils/Methods.java | 31 +++ .../epicfarming/utils/SettingsManager.java | 21 +- .../src/main/resources/en_US.lang | 1 + 13 files changed, 362 insertions(+), 31 deletions(-) create mode 100644 EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/EntityTask.java create mode 100644 EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/EntityInfo.java diff --git a/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/Level.java b/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/Level.java index eebb2e4..9ee6833 100644 --- a/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/Level.java +++ b/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/Level.java @@ -13,6 +13,8 @@ public interface Level { boolean isAutoReplant(); + boolean isAutoBreeding(); + double getSpeedMultiplier(); int getCostExperiance(); diff --git a/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/LevelManager.java b/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/LevelManager.java index 16f09cb..b724cc2 100644 --- a/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/LevelManager.java +++ b/EpicFarming-API/src/main/java/com/songoda/epicfarming/api/farming/LevelManager.java @@ -4,7 +4,7 @@ import java.util.Map; public interface LevelManager { - void addLevel(int level, int costExperiance, int costEconomy, double speedMultiplier, int radius, boolean autoHarvest, boolean autoReplant); + void addLevel(int level, int costExperiance, int costEconomy, double speedMultiplier, int radius, boolean autoHarvest, boolean autoReplant, boolean autoBreeding); Level getLevel(int level); diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/EpicFarmingPlugin.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/EpicFarmingPlugin.java index cf71cde..26925c4 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/EpicFarmingPlugin.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/EpicFarmingPlugin.java @@ -21,6 +21,7 @@ import com.songoda.epicfarming.listeners.InteractListeners; import com.songoda.epicfarming.listeners.InventoryListeners; import com.songoda.epicfarming.player.PlayerActionManager; import com.songoda.epicfarming.player.PlayerData; +import com.songoda.epicfarming.tasks.EntityTask; import com.songoda.epicfarming.tasks.FarmTask; import com.songoda.epicfarming.tasks.GrowthTask; import com.songoda.epicfarming.tasks.HopperTask; @@ -69,6 +70,7 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { private GrowthTask growthTask; private HopperTask hopperTask; private FarmTask farmTask; + private EntityTask entityTask; public static EpicFarmingPlugin getInstance() { return INSTANCE; @@ -182,6 +184,7 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { this.growthTask = GrowthTask.startTask(this); this.hopperTask = HopperTask.startTask(this); this.farmTask = FarmTask.startTask(this); + this.entityTask = entityTask.startTask(this); Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this::saveToFile, 6000, 6000); @@ -220,7 +223,8 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { double speedMultiplier = getConfig().getDouble("settings.levels." + levelName + ".Speed-Multiplier"); boolean autoHarvest = getConfig().getBoolean("settings.levels." + levelName + ".Auto-Harvest"); boolean autoReplant = getConfig().getBoolean("settings.levels." + levelName + ".Auto-Replant"); - levelManager.addLevel(level, costExperiance, costEconomy, speedMultiplier, radius, autoHarvest, autoReplant); + boolean autoBreeding = getConfig().getBoolean("settings.levels." + levelName + ".Auto-Breeding"); + levelManager.addLevel(level, costExperiance, costEconomy, speedMultiplier, radius, autoHarvest, autoReplant, autoBreeding); } } @@ -286,6 +290,7 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { levels.set("Level-3.Speed-Multiplier", 1.5); levels.set("Level-3.Auto-Harvest", true); levels.set("Level-3.Auto-Replant", true); + levels.set("Level-3.Auto-Breeding", true); levels.set("Level-3.Cost-xp", 25); levels.set("Level-3.Cost-eco", 7500); @@ -293,6 +298,7 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { levels.set("Level-4.Speed-Multiplier", 2); levels.set("Level-4.Auto-Harvest", true); levels.set("Level-4.Auto-Replant", true); + levels.set("Level-4.Auto-Breeding", true); levels.set("Level-4.Cost-xp", 30); levels.set("Level-4.Cost-eco", 10000); @@ -300,6 +306,7 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { levels.set("Level-5.Speed-Multiplier", 2.5); levels.set("Level-5.Auto-Harvest", true); levels.set("Level-5.Auto-Replant", true); + levels.set("Level-5.Auto-Breeding", true); levels.set("Level-5.Cost-xp", 35); levels.set("Level-5.Cost-eco", 12000); @@ -307,6 +314,7 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { levels.set("Level-6.Speed-Multiplier", 3); levels.set("Level-6.Auto-Harvest", true); levels.set("Level-6.Auto-Replant", true); + levels.set("Level-6.Auto-Breeding", true); levels.set("Level-6.Cost-xp", 40); levels.set("Level-6.Cost-eco", 25000); } @@ -418,4 +426,8 @@ public class EpicFarmingPlugin extends JavaPlugin implements EpicFarming { public FarmTask getFarmTask() { return farmTask; } + + public EntityTask getEntityTask() { + return entityTask; + } } \ No newline at end of file diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/boost/BoostManager.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/boost/BoostManager.java index 640948a..71f7260 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/boost/BoostManager.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/boost/BoostManager.java @@ -1,8 +1,5 @@ package com.songoda.epicfarming.boost; -import com.songoda.epicfarming.EpicFarmingPlugin; -import org.bukkit.Bukkit; - import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -29,7 +26,7 @@ public class BoostManager { for (BoostData boostData : registeredBoosts) { if (boostData.getPlayer().toString().equals(player.toString())) { if (System.currentTimeMillis() >= boostData.getEndTime()) { - Bukkit.getScheduler().scheduleSyncDelayedTask(EpicFarmingPlugin.getInstance(), () -> removeBoostFromPlayer(boostData), 1); + removeBoostFromPlayer(boostData); } return boostData; } diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevel.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevel.java index 908670c..a752e4e 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevel.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevel.java @@ -12,11 +12,11 @@ public class ELevel implements Level { private double speedMultiplier; - private boolean autoHarvest, autoReplant; + private boolean autoHarvest, autoReplant, autoBreeding; private List description = new ArrayList<>(); - public ELevel(int level, int costExperiance, int costEconomy, double speedMultiplier, int radius, boolean autoHarvest, boolean autoReplant) { + public ELevel(int level, int costExperiance, int costEconomy, double speedMultiplier, int radius, boolean autoHarvest, boolean autoReplant, boolean autoBreeding) { this.level = level; this.costExperiance = costExperiance; this.costEconomy = costEconomy; @@ -24,6 +24,7 @@ public class ELevel implements Level { this.radius = radius; this.autoHarvest = autoHarvest; this.autoReplant = autoReplant; + this.autoBreeding = autoBreeding; EpicFarmingPlugin instance = EpicFarmingPlugin.getInstance(); @@ -36,6 +37,9 @@ public class ELevel implements Level { if (autoReplant) description.add(instance.getLocale().getMessage("interface.button.autoreplant", autoReplant)); + if (autoBreeding) + description.add(instance.getLocale().getMessage("interface.button.autobreeding", autoBreeding)); + } @Override @@ -63,6 +67,9 @@ public class ELevel implements Level { return autoReplant; } + @Override + public boolean isAutoBreeding() { return autoBreeding; } + @Override public double getSpeedMultiplier() { return speedMultiplier; diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevelManager.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevelManager.java index 5a51fc0..c13c8c4 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevelManager.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/farming/ELevelManager.java @@ -13,8 +13,8 @@ public class ELevelManager implements LevelManager { private final NavigableMap registeredLevels = new TreeMap<>(); @Override - public void addLevel(int level, int costExperiance, int costEconomy, double speedMultiplier, int radius, boolean autoHarvest, boolean autoReplant) { - registeredLevels.put(level, new ELevel(level, costExperiance, costEconomy, speedMultiplier, radius, autoHarvest, autoReplant)); + public void addLevel(int level, int costExperiance, int costEconomy, double speedMultiplier, int radius, boolean autoHarvest, boolean autoReplant, boolean autobreeding) { + registeredLevels.put(level, new ELevel(level, costExperiance, costEconomy, speedMultiplier, radius, autoHarvest, autoReplant, autobreeding)); } @Override diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/listeners/BlockListeners.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/listeners/BlockListeners.java index a992386..c8d496f 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/listeners/BlockListeners.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/listeners/BlockListeners.java @@ -10,6 +10,11 @@ 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.Chicken; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -17,8 +22,13 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockFadeEvent; import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.ItemSpawnEvent; +import org.bukkit.event.entity.SheepRegrowWoolEvent; import org.bukkit.inventory.ItemStack; +import java.util.Collection; +import java.util.List; + /** * Created by songoda on 3/14/2017. */ @@ -93,7 +103,7 @@ public class BlockListeners implements Listener { EFarmManager farmManager = instance.getFarmManager(); Block block = location.getBlock(); - for(Level level : instance.getLevelManager().getLevels().values()) { + for (Level level : instance.getLevelManager().getLevels().values()) { int radius = level.getRadius(); int bx = block.getX(); int by = block.getY(); @@ -105,10 +115,10 @@ public class BlockListeners implements Listener { Block b2 = block.getWorld().getBlockAt(bx + fx, by + fy, bz + fz); if (b2.getType() == Material.valueOf(instance.getConfig().getString("Main.Farm Block Material"))) { if (!farmManager.getFarms().containsKey(b2.getLocation())) continue; - if (level.getRadius() != farmManager.getFarm(b2.getLocation()).getLevel().getRadius()) continue; + if (level.getRadius() != farmManager.getFarm(b2.getLocation()).getLevel().getRadius()) + continue; return true; } - } } } @@ -135,14 +145,45 @@ public class BlockListeners implements Listener { Block block = event.getBlock(); block.setType(Material.AIR); - block.getLocation().getWorld().dropItemNaturally(block.getLocation().add(.5,.5,.5), item); + block.getLocation().getWorld().dropItemNaturally(block.getLocation().add(.5, .5, .5), item); - for (ItemStack itemStack : ((EFarm)farm).dumpInventory()) { + for (ItemStack itemStack : ((EFarm) farm).dumpInventory()) { if (itemStack == null) continue; - farm.getLocation().getWorld().dropItemNaturally(farm.getLocation().add(.5,.5,.5), itemStack); + farm.getLocation().getWorld().dropItemNaturally(farm.getLocation().add(.5, .5, .5), itemStack); } } catch (Exception ex) { Debugger.runReport(ex); } } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onSpawn(ItemSpawnEvent event) { + Item item = event.getEntity(); + + if (item.getItemStack().getType() != Material.EGG) return; + + Location location = event.getEntity().getLocation(); + Collection nearby = location.getWorld().getNearbyEntities(location, 0.01, 0.3, 0.01); + + Entity entity = null; + for (Entity e : nearby) { + if (e instanceof Player) return; + if (e instanceof Chicken) entity = e; + } + + if (instance.getEntityTask().getTicksLived().containsKey(entity)) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onSpawn(SheepRegrowWoolEvent event) { + if (instance.getEntityTask().getTicksLived().containsKey(event.getEntity())) { + event.setCancelled(true); + Block block = event.getEntity().getLocation().getBlock().getRelative(BlockFace.DOWN); + if (block.getType() == Material.DIRT) { + block.setType(Material.GRASS_BLOCK); + } + } + } } \ No newline at end of file diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/EntityTask.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/EntityTask.java new file mode 100644 index 0000000..2b84e56 --- /dev/null +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/EntityTask.java @@ -0,0 +1,217 @@ +package com.songoda.epicfarming.tasks; + +import com.songoda.epicfarming.EpicFarmingPlugin; +import com.songoda.epicfarming.api.farming.Farm; +import com.songoda.epicfarming.boost.BoostData; +import com.songoda.epicfarming.utils.Debugger; +import com.songoda.epicfarming.utils.EntityInfo; +import com.songoda.epicfarming.utils.Methods; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.*; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Wool; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.stream.Collectors; + +public class EntityTask extends BukkitRunnable { + + private static final Random random = new Random(); + private Map lastTicksLived = new HashMap<>(); + private static final Map ticksLived = new HashMap<>(); + private static EntityTask instance; + private static EpicFarmingPlugin plugin; + + public static EntityTask startTask(EpicFarmingPlugin pl) { + if (instance == null) { + instance = new EntityTask(); + plugin = pl; + instance.runTaskTimer(plugin, 0, plugin.getConfig().getInt("Main.Entity Tick Speed")); + } + return instance; + } + + @Override + public void run() { + for (Farm farm : plugin.getFarmManager().getFarms().values()) { + if (farm.getLocation() == null) continue; + + Location location = farm.getLocation(); + location.add(.5, .5, .5); + + double radius = farm.getLevel().getRadius() + .5; + Collection amt = location.getWorld().getNearbyEntities(location, radius, radius, radius); + amt.removeIf(e -> e instanceof Player || !(e instanceof LivingEntity) || e instanceof ArmorStand); + + if (farm.getLevel().isAutoBreeding()) doAutoBreeding(farm, amt); + + for (Entity entity : amt) { + if (!ticksLived.containsKey(entity)) ticksLived.put(entity, 0); + + int lived = ticksLived.get(entity); + + ticksLived.put(entity, lived + 100); + + int min = (int) Math.floor(getMin(entity) / farm.getLevel().getSpeedMultiplier()); + int max = (int) Math.floor(getMax(entity) / farm.getLevel().getSpeedMultiplier()); + + int rand = random.nextInt((int) Math.floor(100 / farm.getLevel().getSpeedMultiplier())); + + if (lived < min) continue; + + if (rand != 5 && lived < max) continue; + + if (entity instanceof Chicken) { + if (!((Ageable) entity).isAdult()) continue; + entity.getLocation().getWorld().playSound(entity.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 2); + if (!farm.getLevel().isAutoHarvest()) { + ticksLived.remove(entity); + entity.getLocation().getWorld().dropItemNaturally(entity.getLocation(), new ItemStack(Material.EGG)); + } else { + doDrop(farm, new ItemStack(Material.EGG, 1)); + } + Methods.animate(farm.getLocation(), Material.EGG); + } else if (entity instanceof Sheep) { + if (!((Ageable) entity).isAdult()) continue; + ((Sheep) entity).setSheared(true); + + Wool woolColor = new Wool(((Sheep) entity).getColor()); + ItemStack wool = woolColor.toItemStack((int) Math.round(1 + (Math.random() * 3))); + if (!farm.getLevel().isAutoHarvest()) { + entity.getLocation().getWorld().dropItemNaturally(entity.getLocation(), wool); + } else { + doDrop(farm, wool); + } + Methods.animate(farm.getLocation(), wool.getType()); + } + ticksLived.put(entity, 0); + } + } + + for (Map.Entry entry : lastTicksLived.entrySet()) { + int last = entry.getValue(); + if (!ticksLived.containsKey(entry.getKey())) continue; + int current = ticksLived.get(entry.getKey()); + + if (last == current) { + ticksLived.remove(entry.getKey()); + } + } + lastTicksLived = new HashMap<>(ticksLived); + + } + + private int getMin(Entity entity) { + switch (entity.getType()) { + case SHEEP: + return 0; + case CHICKEN: + return 6000; + default: + return 0; + } + } + + private int getMax(Entity entity) { + switch (entity.getType()) { + case SHEEP: + return 6000; + case CHICKEN: + return 12000; + default: + return 0; + } + } + + private static final Map lastBreed = new HashMap<>(); + + private void doAutoBreeding(Farm farm, Collection entities1) { + + for (Map.Entry entry : new HashMap<>(lastBreed).entrySet()) { + if (entry.getValue() >= 6000) lastBreed.remove(entry.getKey()); + lastBreed.put(entry.getKey(), entry.getValue() + 100); + } + + List entities = new ArrayList<>(entities1); + Collections.shuffle(entities); + entities.removeIf(e -> lastBreed.containsKey(e) || !(e instanceof Ageable) || !((Ageable)e).isAdult()); + + Map counts = + entities.stream().collect(Collectors.groupingBy(Entity::getType, Collectors.counting())); + + boolean mate1 = false; + + for (Map.Entry entry : counts.entrySet()) { + for (Entity entity : entities) { + if (entry.getKey() != entity.getType()) continue; + if (mate1) { + lastBreed.put(entity, 0); + return; + } + + if (entry.getValue() >= 2 && entry.getValue() < plugin.getConfig().getInt("Main.Auto Breeding Cap")) { + + EntityType entityType = entry.getKey(); + Inventory inventory = farm.getInventory(); + + for (int i = 27; i < inventory.getSize(); i++) { + if (inventory.getItem(i) == null || inventory.getItem(i).getType() == Material.AIR) continue; + + ItemStack item = inventory.getItem(i); + + if (item.getType() != EntityInfo.valueOf(entityType.name()).getMaterial() || item.getAmount() < 2) + continue; + + int newAmt = item.getAmount() - 2; + + if (newAmt <= 0) + inventory.setItem(i, null); + else + item.setAmount(newAmt); + + Location location = entity.getLocation(); + Entity newSpawn = location.getWorld().spawnEntity(location, entityType); + ((Ageable) newSpawn).setBaby(); + lastBreed.put(entity, 0); + mate1 = true; + } + } + } + } + } + + + private boolean doDrop(Farm farm, ItemStack stack) { + BoostData boostData = plugin.getBoostManager().getBoost(farm.getPlacedBy()); + + stack.setAmount(stack.getAmount() * (boostData == null ? 1 : boostData.getMultiplier())); + + if (!canMove(farm.getInventory(), stack)) return false; + farm.getInventory().addItem(stack); + return true; + } + + private boolean canMove(Inventory inventory, ItemStack item) { + try { + if (inventory.firstEmpty() != -1) return true; + + for (ItemStack stack : inventory.getContents()) { + if (stack.isSimilar(item) && stack.getAmount() < stack.getMaxStackSize()) { + return true; + } + } + } catch (Exception e) { + Debugger.runReport(e); + } + return false; + } + + public Map getTicksLived() { + return Collections.unmodifiableMap(ticksLived); + } +} \ No newline at end of file diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/FarmTask.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/FarmTask.java index 6b5dd2f..a839e48 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/FarmTask.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/tasks/FarmTask.java @@ -7,11 +7,11 @@ import com.songoda.epicfarming.boost.BoostData; import com.songoda.epicfarming.farming.Crop; import com.songoda.epicfarming.utils.CropType; import com.songoda.epicfarming.utils.Debugger; -import org.bukkit.CropState; -import org.bukkit.Location; -import org.bukkit.Material; +import com.songoda.epicfarming.utils.Methods; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockState; +import org.bukkit.entity.*; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.material.Crops; @@ -40,6 +40,7 @@ public class FarmTask extends BukkitRunnable { public void run() { for (Farm farm : plugin.getFarmManager().getFarms().values()) { if (farm.getLocation() == null) continue; + for (Block block : getCrops(farm, true)) { Crops crop = (Crops) block.getState().getData(); @@ -70,15 +71,13 @@ public class FarmTask extends BukkitRunnable { if (material == null || farm == null || cropTypeData == null) return false; - - - BoostData boostData = plugin.getBoostManager().getBoost(farm.getPlacedBy()); ItemStack stack = new ItemStack(cropTypeData.getYieldMaterial(), (useBoneMeal(farm) ? random.nextInt(2) + 2 : 1) * (boostData == null ? 1 : boostData.getMultiplier())); ItemStack seedStack = new ItemStack(cropTypeData.getSeedMaterial(), random.nextInt(3) + 1 + (useBoneMeal(farm) ? 1 : 0)); if (!canMove(farm.getInventory(), stack)) return false; + Methods.animate(farm.getLocation(), cropTypeData.getYieldMaterial()); farm.getInventory().addItem(stack); farm.getInventory().addItem(seedStack); return true; diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/EntityInfo.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/EntityInfo.java new file mode 100644 index 0000000..761ea11 --- /dev/null +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/EntityInfo.java @@ -0,0 +1,21 @@ +package com.songoda.epicfarming.utils; + +import org.bukkit.Material; + +public enum EntityInfo { + + CHICKEN(Material.WHEAT_SEEDS), + COW(Material.WHEAT), + PIG(Material.CARROT), + SHEEP(Material.WHEAT); + + Material material; + + EntityInfo(Material material) { + this.material = material; + } + + public Material getMaterial() { + return material; + } +} diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/Methods.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/Methods.java index 504fd62..0bb343c 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/Methods.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/Methods.java @@ -2,7 +2,15 @@ package com.songoda.epicfarming.utils; import com.songoda.arconix.plugin.Arconix; import com.songoda.epicfarming.EpicFarmingPlugin; +import com.songoda.epicfarming.api.EpicFarming; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Item; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.util.Vector; public class Methods { @@ -44,4 +52,27 @@ public class Methods { } return null; } + + + public static void animate(Location location, Material mat) { + try { + if (!EpicFarmingPlugin.getInstance().getConfig().getBoolean("Main.Animate")) return; + Block block = location.getBlock(); + if (block.getRelative(0, 1, 0).getType() != Material.AIR && EpicFarmingPlugin.getInstance().getConfig().getBoolean("Main.Do Dispenser Animation")) + return; + Item i = block.getWorld().dropItem(block.getLocation().add(0.5, 1, 0.5), new ItemStack(mat)); + + // Support for EpicHoppers suction. + i.setMetadata("grabbed", new FixedMetadataValue(EpicFarmingPlugin.getInstance(), "true")); + + i.setMetadata("betterdrops_ignore", new FixedMetadataValue(EpicFarmingPlugin.getInstance(), true)); + i.setPickupDelay(3600); + + i.setVelocity(new Vector(0, .3, 0)); + + Bukkit.getScheduler().scheduleSyncDelayedTask(EpicFarmingPlugin.getInstance(), i::remove, 10); + } catch (Exception ex) { + Debugger.runReport(ex); + } + } } \ No newline at end of file diff --git a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/SettingsManager.java b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/SettingsManager.java index 11022ca..09f4d4c 100644 --- a/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/SettingsManager.java +++ b/EpicFarming-Plugin/src/main/java/com/songoda/epicfarming/utils/SettingsManager.java @@ -194,17 +194,20 @@ public class SettingsManager implements Listener { o3("Main.Upgrade Particle Type", "SPELL_WITCH"), o4("Main.Sounds Enabled", true), o5("Main.Farm Tick Speed", 70), - o6("Main.Growth Tick Speed", 20), - o7("Main.Farm Block Material", "END_ROD"), - o8("Main.Allow Non Command Issued Farm Items", false), + o6("Main.Entity Tick Speed", 100), + o7("Main.Growth Tick Speed", 20), + o8("Main.Farm Block Material", "END_ROD"), + o9("Main.Allow Non Command Issued Farm Items", false), + o10("Main.Auto Breeding Cap", 15), + o11("Main.Animate", true), - o9("Interfaces.Economy Icon", "SUNFLOWER"), - o10("Interfaces.XP Icon", "EXPERIENCE_BOTTLE"), - o11("Interfaces.Glass Type 1", 7), - o12("Interfaces.Glass Type 2", 11), - o13("Interfaces.Glass Type 3", 3), + o12("Interfaces.Economy Icon", "SUNFLOWER"), + o13("Interfaces.XP Icon", "EXPERIENCE_BOTTLE"), + o14("Interfaces.Glass Type 1", 7), + o15("Interfaces.Glass Type 2", 11), + o16("Interfaces.Glass Type 3", 3), - o14("System.Debugger Enabled", false); + o17("System.Debugger Enabled", false); private String setting; private Object option; diff --git a/EpicFarming-Plugin/src/main/resources/en_US.lang b/EpicFarming-Plugin/src/main/resources/en_US.lang index fb2b804..4c0f330 100644 --- a/EpicFarming-Plugin/src/main/resources/en_US.lang +++ b/EpicFarming-Plugin/src/main/resources/en_US.lang @@ -14,6 +14,7 @@ interface.button.radius = "&7Radius: &6%speed%" interface.button.speed = "&7Speed: &6%speed%x" interface.button.autoharvest = "&7Auto Harvest: &6%status%" interface.button.autoreplant = "&7Auto Replant: &6%status%" +interface.button.autobreeding = "&7Auto Breeding: &6%status%" interface.button.boostedstats = "&a&lCurrently boosted!|&7Yeild rate multiplied by &6%amount%x&7.|&7Expires in &6%time%&7."