2011-02-07 21:42:14 +01:00
package com.bukkit.mcteam.factions.listeners ;
2011-02-06 13:36:11 +01:00
2011-03-07 04:13:27 +01:00
import java.text.MessageFormat ;
2011-02-06 13:36:11 +01:00
import org.bukkit.ChatColor ;
import org.bukkit.entity.Entity ;
2011-03-18 00:02:29 +01:00
import org.bukkit.entity.Fireball ;
2011-03-06 21:13:48 +01:00
import org.bukkit.entity.LivingEntity ;
2011-02-06 13:36:11 +01:00
import org.bukkit.entity.Player ;
import org.bukkit.event.entity.EntityDamageByEntityEvent ;
2011-02-13 09:08:20 +01:00
import org.bukkit.event.entity.EntityDamageByProjectileEvent ;
2011-02-13 17:04:06 +01:00
import org.bukkit.event.entity.EntityDamageEvent ;
2011-02-06 13:36:11 +01:00
import org.bukkit.event.entity.EntityDeathEvent ;
2011-03-06 21:13:48 +01:00
import org.bukkit.event.entity.EntityExplodeEvent ;
2011-02-06 13:36:11 +01:00
import org.bukkit.event.entity.EntityListener ;
2011-02-07 21:42:14 +01:00
import com.bukkit.mcteam.factions.Factions ;
2011-03-06 21:13:48 +01:00
import com.bukkit.mcteam.factions.entities.Board ;
2011-02-06 13:36:11 +01:00
import com.bukkit.mcteam.factions.entities.Conf ;
2011-03-06 21:13:48 +01:00
import com.bukkit.mcteam.factions.entities.Coord ;
2011-02-06 13:36:11 +01:00
import com.bukkit.mcteam.factions.entities.Follower ;
import com.bukkit.mcteam.factions.struct.Relation ;
public class FactionsEntityListener extends EntityListener {
public Factions plugin ;
public FactionsEntityListener ( Factions plugin ) {
this . plugin = plugin ;
}
@Override
public void onEntityDeath ( EntityDeathEvent event ) {
Entity entity = event . getEntity ( ) ;
if ( ! ( entity instanceof Player ) ) {
return ;
}
Player player = ( Player ) entity ;
Follower follower = Follower . get ( player ) ;
follower . onDeath ( ) ;
follower . sendMessage ( Conf . colorSystem + " Your power is now " + follower . getPowerRounded ( ) + " / " + follower . getPowerMaxRounded ( ) ) ;
}
2011-02-13 17:04:06 +01:00
2011-02-06 13:36:11 +01:00
/ * *
* Who can I hurt ?
* I can never hurt members or allies .
* I can always hurt enemies .
* I can hurt neutrals as long as they are outside their own territory .
* /
@Override
2011-02-13 17:04:06 +01:00
public void onEntityDamage ( EntityDamageEvent event ) {
2011-02-13 09:33:42 +01:00
if ( event . isCancelled ( ) ) {
2011-02-06 13:36:11 +01:00
return ; // Some other plugin decided. Alright then.
}
2011-02-13 17:04:06 +01:00
if ( event instanceof EntityDamageByEntityEvent ) {
EntityDamageByEntityEvent sub = ( EntityDamageByEntityEvent ) event ;
2011-03-07 04:13:27 +01:00
if ( ! this . canDamagerHurtDamagee ( sub ) ) {
2011-02-13 17:04:06 +01:00
event . setCancelled ( true ) ;
}
} else if ( event instanceof EntityDamageByProjectileEvent ) {
EntityDamageByProjectileEvent sub = ( EntityDamageByProjectileEvent ) event ;
2011-03-07 04:13:27 +01:00
if ( ! this . canDamagerHurtDamagee ( sub ) ) {
2011-02-13 17:04:06 +01:00
event . setCancelled ( true ) ;
}
}
2011-02-13 09:33:42 +01:00
}
2011-03-06 21:13:48 +01:00
@Override
public void onEntityExplode ( EntityExplodeEvent event )
{
if ( Conf . territoryBlockCreepers & & event . getEntity ( ) instanceof LivingEntity )
{ // creeper which might need prevention, if inside faction territory
if ( Board . get ( event . getLocation ( ) . getWorld ( ) ) . getFactionIdAt ( Coord . from ( event . getLocation ( ) ) ) > 0 )
{
event . setCancelled ( true ) ;
return ;
}
}
2011-03-18 00:02:29 +01:00
else if ( Conf . territoryBlockFireballs & & event . getEntity ( ) instanceof Fireball )
{ // ghast fireball which might need prevention, if inside faction territory
if ( Board . get ( event . getLocation ( ) . getWorld ( ) ) . getFactionIdAt ( Coord . from ( event . getLocation ( ) ) ) > 0 )
{
event . setCancelled ( true ) ;
return ;
}
}
2011-03-06 21:13:48 +01:00
}
2011-03-07 04:13:27 +01:00
public boolean canDamagerHurtDamagee ( EntityDamageByEntityEvent sub ) {
Entity damager = sub . getDamager ( ) ;
Entity damagee = sub . getEntity ( ) ;
int damage = sub . getDamage ( ) ;
2011-02-06 13:36:11 +01:00
if ( ! ( damager instanceof Player ) ) {
2011-02-13 09:33:42 +01:00
return true ;
2011-02-06 13:36:11 +01:00
}
2011-02-13 09:33:42 +01:00
if ( ! ( damagee instanceof Player ) ) {
return true ;
}
2011-02-06 13:36:11 +01:00
2011-02-13 09:33:42 +01:00
Follower defender = Follower . get ( ( Player ) damagee ) ;
2011-02-06 13:36:11 +01:00
Follower attacker = Follower . get ( ( Player ) damager ) ;
Relation relation = defender . getRelation ( attacker ) ;
2011-02-13 17:02:51 +01:00
//Log.debug(attacker.getName() + " attacked " + defender.getName());
2011-02-13 09:33:42 +01:00
2011-02-06 13:36:11 +01:00
// Players without faction may be hurt anywhere
if ( defender . factionId = = 0 ) {
2011-02-13 09:33:42 +01:00
return true ;
2011-02-06 13:36:11 +01:00
}
// You can never hurt faction members or allies
if ( relation = = Relation . MEMBER | | relation = = Relation . ALLY ) {
2011-02-12 18:05:05 +01:00
attacker . sendMessage ( Conf . colorSystem + " You can't hurt " + defender . getNameAndRelevant ( attacker ) ) ;
2011-02-13 09:33:42 +01:00
return false ;
2011-02-06 13:36:11 +01:00
}
// You can not hurt neutrals in their own territory.
if ( relation = = Relation . NEUTRAL & & defender . isInOwnTerritory ( ) ) {
2011-02-13 17:02:51 +01:00
attacker . sendMessage ( Conf . colorSystem + " You can't hurt " + relation . getColor ( ) + defender . getNameAndRelevant ( attacker ) + Conf . colorSystem + " in their own territory. " ) ;
2011-02-12 18:05:05 +01:00
defender . sendMessage ( attacker . getNameAndRelevant ( defender ) + Conf . colorSystem + " tried to hurt you. " ) ;
2011-02-13 09:33:42 +01:00
return false ;
2011-02-06 13:36:11 +01:00
}
// Damage will be dealt. However check if the damage should be reduced.
2011-02-13 09:33:42 +01:00
if ( defender . isInOwnTerritory ( ) & & Conf . territoryShieldFactor > 0 ) {
2011-03-07 04:13:27 +01:00
int newDamage = ( int ) ( damage * Conf . territoryShieldFactor ) ;
sub . setDamage ( newDamage ) ;
2011-02-06 13:36:11 +01:00
// Send message
2011-03-07 04:13:27 +01:00
String perc = MessageFormat . format ( " {0,number,#%} " , ( 1 . 0 - Conf . territoryShieldFactor ) ) ;
defender . sendMessage ( Conf . colorSystem + " Enemy damage reduced by " + ChatColor . RED + perc + Conf . colorSystem + " . " ) ;
2011-02-06 13:36:11 +01:00
}
2011-02-13 09:33:42 +01:00
return true ;
2011-02-06 13:36:11 +01:00
}
}