mirror of
https://github.com/BentoBoxWorld/AcidIsland.git
synced 2025-02-02 13:31:24 +01:00
Burns monsters or animals in acid
https://github.com/tastybento/bskyblock/projects/3#card-10259918
This commit is contained in:
parent
94ab94e4bc
commit
f6a52a4290
@ -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";
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
84
src/main/java/bskyblock/addon/acidisland/world/AcidTask.java
Normal file
84
src/main/java/bskyblock/addon/acidisland/world/AcidTask.java
Normal 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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user