Burns monsters or animals in acid

https://github.com/tastybento/bskyblock/projects/3#card-10259918
This commit is contained in:
tastybento 2018-06-02 18:45:11 -07:00
parent 94ab94e4bc
commit f6a52a4290
4 changed files with 101 additions and 4 deletions

View File

@ -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";

View File

@ -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

View File

@ -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;

View File

@ -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);
}
}