UltimateStacker/src/main/java/com/songoda/ultimatestacker/listeners/DeathListeners.java

153 lines
6.0 KiB
Java
Raw Normal View History

package com.songoda.ultimatestacker.listeners;
2018-11-06 04:33:10 +01:00
2019-09-03 23:08:30 +02:00
import com.songoda.core.compatibility.ServerProject;
import com.songoda.core.compatibility.ServerVersion;
2019-07-23 16:55:49 +02:00
import com.songoda.lootables.loot.Drop;
2018-11-06 04:33:10 +01:00
import com.songoda.ultimatestacker.UltimateStacker;
2019-08-30 21:40:34 +02:00
import com.songoda.ultimatestacker.entity.EntityStack;
2019-09-07 23:55:16 +02:00
import com.songoda.ultimatestacker.settings.Settings;
2019-08-02 20:29:10 +02:00
import com.songoda.ultimatestacker.utils.DropUtils;
import org.bukkit.Material;
2019-08-30 21:40:34 +02:00
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.LivingEntity;
2019-07-26 03:40:13 +02:00
import org.bukkit.entity.Player;
2018-11-06 04:33:10 +01:00
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
2018-11-06 04:33:10 +01:00
import org.bukkit.event.Listener;
2019-08-30 21:40:34 +02:00
import org.bukkit.event.entity.EntityDamageByEntityEvent;
2018-11-06 04:33:10 +01:00
import org.bukkit.event.entity.EntityDeathEvent;
2019-07-08 18:39:57 +02:00
import org.bukkit.inventory.ItemStack;
2019-08-30 21:40:34 +02:00
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
2018-11-06 04:33:10 +01:00
2019-07-08 21:42:19 +02:00
import java.util.ArrayList;
import java.util.Arrays;
2019-07-08 18:39:57 +02:00
import java.util.List;
2019-08-30 21:40:34 +02:00
import java.util.Random;
2019-02-25 15:23:41 +01:00
2018-11-06 04:33:10 +01:00
public class DeathListeners implements Listener {
private final UltimateStacker instance;
2019-08-30 21:40:34 +02:00
private Random random;
2018-11-06 04:33:10 +01:00
public DeathListeners(UltimateStacker instance) {
this.instance = instance;
2019-08-30 21:40:34 +02:00
random = new Random();
2018-11-06 04:33:10 +01:00
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
2018-11-06 04:33:10 +01:00
public void onEntityDeath(EntityDeathEvent event) {
2019-07-26 03:40:13 +02:00
if (event.getEntity() instanceof Player) return;
2019-09-07 23:55:16 +02:00
boolean custom = Settings.CUSTOM_DROPS.getBoolean();
List<Drop> drops = custom ? instance.getLootablesManager().getDrops(event.getEntity()) : new ArrayList<>();
2019-07-08 18:39:57 +02:00
if (!custom) {
2019-07-09 22:10:41 +02:00
for (ItemStack item : event.getDrops())
drops.add(new Drop(item));
}
for (ItemStack item : new ArrayList<>(event.getDrops())) {
if (!shouldDrop(event.getEntity(), item.getType()))
event.getDrops().remove(item);
}
2019-07-08 18:39:57 +02:00
if (instance.getEntityStackManager().isStacked(event.getEntity()))
instance.getEntityStackManager().getStack(event.getEntity())
2019-07-09 22:10:41 +02:00
.onDeath(event.getEntity(), drops, custom, event.getDroppedExp());
2019-08-14 17:41:40 +02:00
else
DropUtils.processStackedDrop(event.getEntity(), drops);
2018-11-06 04:33:10 +01:00
}
private boolean shouldDrop(LivingEntity entity, Material material) {
if (entity.getEquipment() != null && entity.getEquipment().getArmorContents().length != 0) {
List<ItemStack> items = new ArrayList<>(Arrays.asList(entity.getEquipment().getArmorContents()));
items.add(entity.getEquipment().getItemInHand());
2019-09-03 23:08:30 +02:00
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9))
items.add(entity.getEquipment().getItemInOffHand());
for (ItemStack item : items) {
if (item.getType() == material)
return true;
}
}
2019-09-03 23:08:30 +02:00
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11) && entity instanceof ChestedHorse) {
if (((ChestedHorse) entity).getInventory().contains(material))
return true;
}
switch (material.name()) {
case "SADDLE":
return !entity.getType().name().equals("RAVAGER");
case "DIAMOND_HORSE_ARMOR":
case "GOLDEN_HORSE_ARMOR":
case "IRON_HORSE_ARMOR":
case "LEATHER_HORSE_ARMOR":
case "CYAN_CARPET":
case "BLACK_CARPET":
case "BLUE_CARPET":
case "BROWN_CARPET":
case "GRAY_CARPET":
case "GREEN_CARPET":
case "LIGHT_BLUE_CARPET":
case "LIGHT_GRAY_CARPET":
case "LIME_CARPET":
case "MAGENTA_CARPET":
case "ORANGE_CARPET":
case "PINK_CARPET":
case "PURPLE_CARPET":
case "RED_CARPET":
case "WHITE_CARPET":
case "YELLOW_CARPET":
case "CARPET":
case "CHEST":
return true;
default:
return false;
}
}
2019-08-30 21:40:34 +02:00
@EventHandler
public void onEntityHit(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player)) return;
if (!instance.getEntityStackManager().isStacked(event.getEntity())) return;
EntityStack stack = instance.getEntityStackManager().getStack(event.getEntity());
2019-09-07 23:55:16 +02:00
if (Settings.KILL_WHOLE_STACK_ON_DEATH.getBoolean() && Settings.REALISTIC_DAMAGE.getBoolean()) {
2019-08-30 21:40:34 +02:00
Player player = (Player) event.getDamager();
ItemStack tool = player.getInventory().getItemInMainHand();
if (tool.getType().getMaxDurability() < 1 || (tool.getItemMeta() != null && (tool.getItemMeta().isUnbreakable()
2019-09-03 23:08:30 +02:00
|| (ServerProject.isServer(ServerProject.SPIGOT, ServerProject.PAPER) && tool.getItemMeta().spigot().isUnbreakable()))))
2019-08-30 21:40:34 +02:00
return;
int unbreakingLevel = tool.getEnchantmentLevel(Enchantment.DURABILITY);
Damageable damageable = (Damageable) tool.getItemMeta();
int actualDamage = 0;
for (int i = 0; i < stack.getAmount(); i++)
if (checkUnbreakingChance(unbreakingLevel))
actualDamage++;
damageable.setDamage(damageable.getDamage() + actualDamage-1);
tool.setItemMeta((ItemMeta) damageable);
if (!this.hasEnoughDurability(tool, 1))
player.getInventory().setItemInMainHand(null);
}
}
public boolean hasEnoughDurability(ItemStack tool, int requiredAmount) {
if (!tool.hasItemMeta() || !(tool.getItemMeta() instanceof Damageable) || tool.getType().getMaxDurability() < 1)
return true;
Damageable damageable = (Damageable) tool.getItemMeta();
int durabilityRemaining = tool.getType().getMaxDurability() - damageable.getDamage();
return durabilityRemaining > requiredAmount;
}
public boolean checkUnbreakingChance(int level) {
return (1.0 / (level + 1)) > random.nextDouble();
}
2018-11-06 04:33:10 +01:00
}