diff --git a/src/main/java/bskyblock/addon/acidisland/AISettings.java b/src/main/java/bskyblock/addon/acidisland/AISettings.java index bf6c2ac..91e9cef 100644 --- a/src/main/java/bskyblock/addon/acidisland/AISettings.java +++ b/src/main/java/bskyblock/addon/acidisland/AISettings.java @@ -102,7 +102,7 @@ public class AISettings implements ISettings<AISettings>, WorldSettings { private int acidDamageAnimal = 10; @ConfigEntry(path = "acid.damage.acid.item") - private int acidDestroyItemTime = 0; + private long acidDestroyItemTime = 0; @ConfigEntry(path = "acid.damage.rain") private int acidRainDamage = 1; @@ -361,14 +361,14 @@ public class AISettings implements ISettings<AISettings>, WorldSettings { /** * @return the acidDestroyItemTime */ - public int getAcidDestroyItemTime() { + public long getAcidDestroyItemTime() { return acidDestroyItemTime; } /** * @param acidDestroyItemTime the acidDestroyItemTime to set */ - public void setAcidDestroyItemTime(int acidDestroyItemTime) { + public void setAcidDestroyItemTime(long acidDestroyItemTime) { this.acidDestroyItemTime = acidDestroyItemTime; } @@ -806,7 +806,6 @@ public class AISettings implements ISettings<AISettings>, WorldSettings { this.chestItems = chestItems; } - @SuppressWarnings("SameReturnValue") @Override public String getPermissionPrefix() { return "acidisland"; diff --git a/src/main/java/bskyblock/addon/acidisland/AcidIsland.java b/src/main/java/bskyblock/addon/acidisland/AcidIsland.java index 544a467..be7fad2 100644 --- a/src/main/java/bskyblock/addon/acidisland/AcidIsland.java +++ b/src/main/java/bskyblock/addon/acidisland/AcidIsland.java @@ -9,6 +9,7 @@ import bskyblock.addon.acidisland.listeners.AcidEffect; import bskyblock.addon.acidisland.listeners.IslandBuilder; import bskyblock.addon.acidisland.listeners.LavaCheck; import bskyblock.addon.acidisland.world.AcidIslandWorld; +import bskyblock.addon.acidisland.world.AcidTask; import us.tastybento.bskyblock.api.addons.Addon; /** @@ -49,6 +50,8 @@ public class AcidIsland extends Addon { // Register commands new AcidCommand(this); new AiCommand(this); + // Burn everything + new AcidTask(this); } @Override diff --git a/src/main/java/bskyblock/addon/acidisland/listeners/AcidEffect.java b/src/main/java/bskyblock/addon/acidisland/listeners/AcidEffect.java index d080202..8c6f8a1 100644 --- a/src/main/java/bskyblock/addon/acidisland/listeners/AcidEffect.java +++ b/src/main/java/bskyblock/addon/acidisland/listeners/AcidEffect.java @@ -27,6 +27,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; import bskyblock.addon.acidisland.AcidIsland; +import bskyblock.addon.acidisland.world.AcidTask; /** * Applies the acid effect to players @@ -49,6 +50,8 @@ public class AcidEffect implements Listener { public AcidEffect(AcidIsland addon) { this.addon = addon; + // Burn monsters or animals that fall into the acid + new AcidTask(addon); } @EventHandler(priority = EventPriority.LOW) @@ -253,6 +256,8 @@ public class AcidEffect implements Listener { case DIAMOND_HELMET: red = red + 0.12; break; + default: + break; } } if (boots != null) { @@ -272,6 +277,8 @@ public class AcidEffect implements Listener { case DIAMOND_BOOTS: red = red + 0.12; break; + default: + break; } } // Pants @@ -292,6 +299,8 @@ public class AcidEffect implements Listener { case DIAMOND_LEGGINGS: red = red + 0.24; break; + default: + break; } } // Chest plate @@ -312,6 +321,8 @@ public class AcidEffect implements Listener { case DIAMOND_CHESTPLATE: red = red + 0.32; break; + default: + break; } } return red; diff --git a/src/main/java/bskyblock/addon/acidisland/world/AcidTask.java b/src/main/java/bskyblock/addon/acidisland/world/AcidTask.java new file mode 100644 index 0000000..6d2a24f --- /dev/null +++ b/src/main/java/bskyblock/addon/acidisland/world/AcidTask.java @@ -0,0 +1,84 @@ +package bskyblock.addon.acidisland.world; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.WeakHashMap; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Animals; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Guardian; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Squid; + +import bskyblock.addon.acidisland.AcidIsland; + +public class AcidTask { + private final AcidIsland addon; + private Set<Entity> itemsInWater = Collections.newSetFromMap(new WeakHashMap<Entity, Boolean>()); + private int entityBurnTask = -1; + private int itemBurnTask = -1; + + /** + * Runs repeating tasks to deliver acid damage to mobs, etc. + * @param addon - addon + */ + public AcidTask(AcidIsland addon) { + this.addon = addon; + burnEntities(); + runAcidItemRemovalTask(); + } + + /** + * Start the entity buring task + */ + private void burnEntities() { + if (entityBurnTask >= 0) { + addon.getServer().getScheduler().cancelTask(entityBurnTask); + } + // This part will kill monsters if they fall into the water because it is acid + entityBurnTask = addon.getServer().getScheduler().scheduleSyncRepeatingTask(addon.getBSkyBlock(), () -> addon.getIslandWorld().getEntities().stream() + .filter(e -> !(e instanceof Guardian || e instanceof Squid)) + .filter(w -> w.getLocation().getBlock().getType().equals(Material.WATER) || w.getLocation().getBlock().getType().equals(Material.STATIONARY_WATER)) + .forEach(e -> { + if ((e instanceof Monster) && addon.getSettings().getAcidDamageMonster() > 0D) { + ((Monster) e).damage(addon.getSettings().getAcidDamageMonster()); + } else if ((e instanceof Animals) && addon.getSettings().getAcidDamageAnimal() > 0D + && (!e.getType().equals(EntityType.CHICKEN) || addon.getSettings().isAcidDamageChickens())) { + ((Animals) e).damage(addon.getSettings().getAcidDamageMonster()); + } + }), 0L, 20L); + } + + /** + * Start the item removal in acid task + */ + private void runAcidItemRemovalTask() { + if (itemBurnTask >= 0) { + addon.getServer().getScheduler().cancelTask(itemBurnTask); + } + if (addon.getSettings().getAcidDestroyItemTime() <= 0) { + return; + } + itemBurnTask = addon.getServer().getScheduler().scheduleSyncRepeatingTask(addon.getBSkyBlock(), () -> { + Set<Entity> newItemsInWater = new HashSet<>(); + addon.getIslandWorld().getEntities().stream() + .filter(e -> e.getType().equals(EntityType.DROPPED_ITEM) + && (e.getLocation().getBlock().getType().equals(Material.WATER) + || e.getLocation().getBlock().getType().equals(Material.STATIONARY_WATER)) + ) + .forEach(e -> { + if (itemsInWater.contains(e)) { + e.getWorld().playSound(e.getLocation(), Sound.ENTITY_CREEPER_PRIMED, 3F, 3F); + e.remove(); + } else { + newItemsInWater.add(e); + } + }); + itemsInWater = newItemsInWater; + }, addon.getSettings().getAcidDestroyItemTime() * 20L, addon.getSettings().getAcidDestroyItemTime() * 20L); + } +}