use of org.bukkit.projectiles.BlockProjectileSource in project Prism-Bukkit by prism.
the class PrismEntityEvents method onEntityDeath.
/**
* EntityDeathEvent.
* @param event EntityDeathEvent
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDeath(final EntityDeathEvent event) {
final LivingEntity entity = event.getEntity();
// Mob Death
if (!(entity instanceof Player)) {
// Log item drops
if (Prism.getIgnore().event("item-drop", entity.getWorld())) {
String name = entity.getType().name().toLowerCase();
// Inventory
if (entity instanceof InventoryHolder) {
final InventoryHolder holder = (InventoryHolder) entity;
for (final ItemStack i : holder.getInventory().getContents()) {
if (checkNotNullorAir(i)) {
RecordingQueue.addToQueue(ActionFactory.createItemStack("item-drop", i, i.getAmount(), -1, null, entity.getLocation(), name));
}
}
}
// Equipment
EntityEquipment equipment = entity.getEquipment();
if (equipment != null) {
for (final ItemStack i : equipment.getArmorContents()) {
if (checkNotNullorAir(i)) {
RecordingQueue.addToQueue(ActionFactory.createItemStack("item-drop", i, i.getAmount(), -1, null, entity.getLocation(), name));
}
}
}
// Hand items not stored in "getArmorContents"
ItemStack main = entity.getEquipment().getItemInMainHand();
ItemStack off = entity.getEquipment().getItemInOffHand();
if (checkNotNullorAir(main)) {
RecordingQueue.addToQueue(ActionFactory.createItemStack("item-drop", main, main.getAmount(), -1, null, entity.getLocation(), name));
}
if (checkNotNullorAir(off)) {
RecordingQueue.addToQueue(ActionFactory.createItemStack("item-drop", off, off.getAmount(), -1, null, entity.getLocation(), name));
}
}
EntityDamageEvent damageEvent = entity.getLastDamageCause();
Entity entitySource = null;
Block blockSource = null;
// Resolve source
if (damageEvent != null && !damageEvent.isCancelled()) {
if (damageEvent instanceof EntityDamageByEntityEvent) {
entitySource = ((EntityDamageByEntityEvent) damageEvent).getDamager();
if (entitySource instanceof Projectile) {
ProjectileSource ps = ((Projectile) entitySource).getShooter();
if (ps instanceof BlockProjectileSource) {
entitySource = null;
blockSource = ((BlockProjectileSource) ps).getBlock();
} else {
entitySource = (Entity) ps;
}
}
} else if (damageEvent instanceof EntityDamageByBlockEvent) {
blockSource = ((EntityDamageByBlockEvent) damageEvent).getDamager();
}
}
// Create handlers
if (entitySource instanceof Player) {
Player player = (Player) entitySource;
if (!Prism.getIgnore().event("player-kill", player)) {
return;
}
RecordingQueue.addToQueue(ActionFactory.createEntity("player-kill", entity, player));
} else if (entitySource != null) {
if (!Prism.getIgnore().event("entity-kill", entity.getWorld())) {
return;
}
String name = entitySource.getType().name().toLowerCase(Locale.ENGLISH).replace('_', ' ');
RecordingQueue.addToQueue(ActionFactory.createEntity("entity-kill", entity, name));
} else if (blockSource != null) {
if (!Prism.getIgnore().event("entity-kill", entity.getWorld())) {
return;
}
String name = "block:" + blockSource.getType().name().toLowerCase(Locale.ENGLISH).replace('_', ' ');
RecordingQueue.addToQueue(ActionFactory.createEntity("entity-kill", entity, name));
} else {
if (!Prism.getIgnore().event("entity-kill", entity.getWorld())) {
return;
}
String name = "unknown";
if (damageEvent != null && !damageEvent.isCancelled()) {
name = damageEvent.getCause().name().toLowerCase(Locale.ENGLISH).replace('_', ' ');
}
RecordingQueue.addToQueue(ActionFactory.createEntity("entity-kill", entity, name));
}
/*
* if (entity.getLastDamageCause() instanceof EntityDamageByEntityEvent) { final
* EntityDamageByEntityEvent entityDamageByEntityEvent =
* (EntityDamageByEntityEvent) entity .getLastDamageCause();
*
* // Mob killed by player if (entityDamageByEntityEvent.getDamager() instanceof
* Player) { final Player player = (Player)
* entityDamageByEntityEvent.getDamager(); if
* (!Prism.getIgnore().event("player-kill", player)) return;
* RecordingQueue.addToQueue(ActionFactory.createEntity("player-kill", entity,
* player));
*
* } // Mob shot by an arrow from a player else if
* (entityDamageByEntityEvent.getDamager() instanceof Arrow) { final Arrow arrow
* = (Arrow) entityDamageByEntityEvent.getDamager();
*
* if (arrow.getShooter() instanceof Player) { final Player player = (Player)
* arrow.getShooter(); if (!Prism.getIgnore().event("player-kill", player))
* return; RecordingQueue.addToQueue(ActionFactory.createEntity("player-kill",
* entity, player));
*
* } else if (arrow.getShooter() instanceof LivingEntity) { final Entity damager
* = (Entity) arrow.getShooter(); String name = "unknown"; if (damager != null)
* { name = damager.getType().name().toLowerCase(); }
*
* if (!Prism.getIgnore().event("entity-kill", entity.getWorld())) return;
* RecordingQueue.addToQueue(ActionFactory.createEntity("entity-kill", entity,
* name)); } else if (arrow.getShooter() instanceof BlockProjectileSource) {
*
* final Block damager = (Block)
* ((BlockProjectileSource)arrow.getShooter()).getBlock();
*
* if (!Prism.getIgnore().event("entity-kill", entity.getWorld())) return;
*
* String name = "block:" + damager.getType().name().toLowerCase();
*
* RecordingQueue.addToQueue(ActionFactory.createEntity("entity-kill", entity,
* name)); } } else { // Mob died by another mob final Entity damager =
* entityDamageByEntityEvent.getDamager(); String name = "unknown"; if (damager
* != null) { name = damager.getType().name().toLowerCase(); }
*
* if (!Prism.getIgnore().event("entity-kill", entity.getWorld())) return;
* RecordingQueue.addToQueue(ActionFactory.createEntity("entity-kill", entity,
* name)); } } else {
*
* if (!Prism.getIgnore().event("entity-kill", entity.getWorld())) return;
*
* String killer = "unknown"; final EntityDamageEvent damage =
* entity.getLastDamageCause(); if (damage != null) { final DamageCause cause =
* damage.getCause(); if (cause != null) { killer = cause.name().toLowerCase();
* } }
*
* // Record the death as natural
* RecordingQueue.addToQueue(ActionFactory.createEntity("entity-kill", entity,
* killer));
*
* }
*/
} else {
// Determine who died and what the exact cause was
final Player p = (Player) event.getEntity();
if (Prism.getIgnore().event("player-death", p)) {
final String cause = DeathUtils.getCauseNiceName(p);
String attacker = DeathUtils.getAttackerName(p);
if (attacker.equals("pvpwolf")) {
final String owner = DeathUtils.getTameWolfOwner(event);
attacker = owner + "'s wolf";
}
RecordingQueue.addToQueue(ActionFactory.createPlayerDeath("player-death", p, cause, attacker));
}
// Log item drops
if (Prism.getIgnore().event("item-drop", p)) {
if (!event.getDrops().isEmpty()) {
for (final ItemStack i : event.getDrops()) {
RecordingQueue.addToQueue(ActionFactory.createItemStack("item-drop", i, i.getAmount(), -1, null, p.getLocation(), p));
}
}
}
}
}
Aggregations