use of com.palmergames.bukkit.towny.event.player.PlayerKilledPlayerEvent in project Towny by TownyAdvanced.
the class TownyEntityMonitorListener method onPlayerDeath.
/**
* This handles PlayerDeathEvents on MONITOR in order to handle Towny features such as:
* - DeathPayments,
* - Jailing Players,
* @param event The event.
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerDeath(PlayerDeathEvent event) {
TownyUniverse townyUniverse = TownyUniverse.getInstance();
if (!TownyAPI.getInstance().isTownyWorld(event.getEntity().getWorld()))
return;
Player defenderPlayer = event.getEntity();
Resident defenderResident = TownyUniverse.getInstance().getResident(defenderPlayer.getUniqueId());
if (defenderResident == null) {
// Usually an NPC or a Bot of some kind.
return;
}
// Killed by another entity?
if (defenderPlayer.getLastDamageCause() instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) defenderPlayer.getLastDamageCause();
Entity attackerEntity = damageEvent.getDamager();
Player attackerPlayer = null;
Resident attackerResident = null;
if (attackerEntity instanceof Projectile) {
// Killed by projectile, try to narrow the true source of the kill.
Projectile projectile = (Projectile) attackerEntity;
if (projectile.getShooter() instanceof Player) {
// Player shot a projectile.
attackerPlayer = (Player) projectile.getShooter();
attackerResident = townyUniverse.getResident(attackerPlayer.getUniqueId());
} else {
// Something else shot a projectile.
try {
// Mob shot a projectile.
attackerEntity = (Entity) projectile.getShooter();
} catch (Exception e) {
// This would be a dispenser kill, should count as environmental death.
}
}
} else if (attackerEntity instanceof Player) {
// This was a player kill
attackerPlayer = (Player) attackerEntity;
attackerResident = townyUniverse.getResident(attackerPlayer.getUniqueId());
if (attackerResident == null)
// Probably an NPC.
return;
}
// This was a suicide, don't award money or jail.
if (attackerPlayer != null && attackerPlayer == defenderPlayer)
return;
/*
* Player has died by a player:
*
* - Fire PlayerKilledPlayerEvent.
*
* - charge death payment,
* - check for jailing attacking residents,
*/
if (attackerPlayer != null && attackerResident != null) {
PlayerKilledPlayerEvent deathEvent = new PlayerKilledPlayerEvent(attackerPlayer, defenderPlayer, attackerResident, defenderResident, defenderPlayer.getLocation(), event);
BukkitTools.getPluginManager().callEvent(deathEvent);
deathPayment(attackerPlayer, defenderPlayer, attackerResident, defenderResident);
isJailingAttackers(attackerPlayer, defenderPlayer, attackerResident, defenderResident);
/*
* Player has died from an entity but not a player & death price is not PVP only.
*/
} else if (!TownySettings.isDeathPricePVPOnly() && TownySettings.isChargingDeath()) {
deathPayment(defenderPlayer, defenderResident);
}
/*
* Player has died from non-entity cause, ie: Environmental.
*/
} else {
if (!TownySettings.isDeathPricePVPOnly() && TownySettings.isChargingDeath()) {
deathPayment(defenderPlayer, defenderResident);
}
}
}
Aggregations