EpicEnchants/src/main/java/com/songoda/epicenchants/listeners/EntityListener.java

140 lines
5.6 KiB
Java

package com.songoda.epicenchants.listeners;
import com.songoda.core.nms.NmsManager;
import com.songoda.epicenchants.EpicEnchants;
import com.songoda.epicenchants.enums.TriggerType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
import org.bukkit.projectiles.ProjectileSource;
import static com.songoda.epicenchants.enums.TriggerType.*;
public class EntityListener implements Listener {
private final EpicEnchants instance;
public EntityListener(EpicEnchants instance) {
this.instance = instance;
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDeath(EntityDeathEvent event) {
if (event.getEntity() instanceof Monster && event.getEntity().getKiller() != null) {
instance.getEnchantUtils().handlePlayer(event.getEntity().getKiller(), event.getEntity(), event, KILLED_MOB);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (!(event.getEntity() instanceof LivingEntity)) {
return;
}
LivingEntity hitEntity = (LivingEntity) event.getEntity();
//Hit by projectile
if (event.getDamager() instanceof Projectile) {
ProjectileSource source = ((Projectile) event.getDamager()).getShooter();
if (hitEntity instanceof Player) {
LivingEntity opponent = source instanceof LivingEntity ? ((LivingEntity) source) : null;
TriggerType type = source instanceof Player ? DEFENSE_PLAYER_RANGE : DEFENSE_MOB_RANGE;
instance.getEnchantUtils().handlePlayer(((Player) hitEntity), opponent, event, type);
}
if (source instanceof Player) {
TriggerType type = event.getEntity() instanceof Player ? ATTACK_PLAYER_RANGE : ATTACK_MOB_RANGE;
instance.getEnchantUtils().handlePlayer(((Player) source), hitEntity, event, type);
}
}
//Player got hit
if (event.getEntity() instanceof Player) {
Player defender = (Player) event.getEntity();
TriggerType triggerType = null;
LivingEntity opponent = null;
if (event.getDamager() instanceof Player) {
opponent = ((LivingEntity) event.getDamager());
triggerType = DEFENSE_PLAYER_MELEE;
} else if (event.getDamager() instanceof LivingEntity && !(event.getDamager() instanceof Player)) {
opponent = ((LivingEntity) event.getDamager());
triggerType = DEFENSE_MOB_MELEE;
}
if (triggerType != null) {
instance.getEnchantUtils().handlePlayer(defender, opponent, event, triggerType);
}
}
//Player damaged an entity
if (event.getDamager() instanceof Player) {
Player attacker = (Player) event.getDamager();
TriggerType triggerType = null;
if (event.getEntity() instanceof Player) {
triggerType = ATTACK_PLAYER_MELEE;
} else if (event.getEntity() instanceof LivingEntity) {
triggerType = ATTACK_MOB_MELEE;
}
if (triggerType != null) {
instance.getEnchantUtils().handlePlayer(attacker, ((LivingEntity) event.getEntity()), event, triggerType);
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageEvent event) {
if (!(event.getEntity() instanceof Player)) {
return;
}
switch (event.getCause()) {
case FALL:
instance.getEnchantUtils().handlePlayer(((Player) event.getEntity()), null, event, FALL_DAMAGE);
break;
case FIRE:
case FIRE_TICK:
instance.getEnchantUtils().handlePlayer(((Player) event.getEntity()), null, event, FIRE_DAMAGE);
break;
case LAVA:
instance.getEnchantUtils().handlePlayer(((Player) event.getEntity()), null, event, LAVA_DAMAGE);
break;
case BLOCK_EXPLOSION:
case ENTITY_EXPLOSION:
instance.getEnchantUtils().handlePlayer(((Player) event.getEntity()), null, event, EXPLOSION_DAMAGE);
break;
case POISON:
instance.getEnchantUtils().handlePlayer(((Player) event.getEntity()), null, event, POISON_DAMAGE);
break;
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityTargetLivingEntity(EntityTargetLivingEntityEvent event) {
if (event.getTarget() == null)
return;
if (NmsManager.getNbt().of(event.getEntity()).has(event.getTarget().getUniqueId().toString())) {
//TODO: Add team support.
event.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityExplode(EntityExplodeEvent event) {
if (event.getEntity().getCustomName() != null && event.getEntity().getCustomName().equals("ee")) {
event.blockList().clear();
}
}
}