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 ;
2011-03-22 17:20:21 +01:00
import org.bukkit.entity.Creeper ;
2011-02-06 13:36:11 +01:00
import org.bukkit.entity.Entity ;
2011-03-18 00:02:29 +01:00
import org.bukkit.entity.Fireball ;
2011-02-06 13:36:11 +01:00
import org.bukkit.entity.Player ;
2011-03-23 17:39:56 +01:00
import org.bukkit.event.entity.CreatureSpawnEvent ;
2011-02-06 13:36:11 +01:00
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-03-23 17:39:56 +01:00
import org.bukkit.event.entity.EntityTargetEvent ;
2011-02-06 13:36:11 +01:00
2011-03-18 17:33:23 +01:00
import com.bukkit.mcteam.factions.Board ;
import com.bukkit.mcteam.factions.Conf ;
2011-03-22 17:20:21 +01:00
import com.bukkit.mcteam.factions.FLocation ;
2011-03-18 17:33:23 +01:00
import com.bukkit.mcteam.factions.FPlayer ;
2011-03-23 17:39:56 +01:00
import com.bukkit.mcteam.factions.Faction ;
2011-02-06 13:36:11 +01:00
import com.bukkit.mcteam.factions.struct.Relation ;
2011-03-23 17:39:56 +01:00
import com.bukkit.mcteam.util.EntityUtil ;
2011-02-06 13:36:11 +01:00
public class FactionsEntityListener extends EntityListener {
@Override
public void onEntityDeath ( EntityDeathEvent event ) {
Entity entity = event . getEntity ( ) ;
if ( ! ( entity instanceof Player ) ) {
return ;
}
Player player = ( Player ) entity ;
2011-03-23 17:39:56 +01:00
FPlayer fplayer = FPlayer . get ( player ) ;
fplayer . onDeath ( ) ;
fplayer . sendMessage ( " Your power is now " + fplayer . getPowerRounded ( ) + " / " + fplayer . getPowerMaxRounded ( ) ) ;
2011-02-06 13:36:11 +01:00
}
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-03-22 17:20:21 +01:00
return ;
2011-02-06 13:36:11 +01:00
}
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
2011-03-22 17:20:21 +01:00
2011-03-23 17:39:56 +01:00
// TODO what happens with the creeper or fireball then? Must we delete them manually?
2011-03-06 21:13:48 +01:00
@Override
public void onEntityExplode ( EntityExplodeEvent event )
{
2011-03-22 17:20:21 +01:00
if ( event . isCancelled ( ) ) {
return ;
2011-03-06 21:13:48 +01:00
}
2011-03-22 17:20:21 +01:00
2011-03-23 17:39:56 +01:00
Faction faction = Board . getFactionAt ( new FLocation ( event . getLocation ( ) ) ) ;
2011-03-22 17:20:21 +01:00
// Explosions may happen in the wilderness
2011-03-23 17:39:56 +01:00
if ( faction . isNone ( ) ) {
2011-03-22 17:20:21 +01:00
return ;
}
2011-03-23 17:39:56 +01:00
if ( ( Conf . territoryBlockCreepers | | faction . isSafeZone ( ) ) & & event . getEntity ( ) instanceof Creeper ) {
2011-03-22 17:20:21 +01:00
// creeper which might need prevention, if inside faction territory
event . setCancelled ( true ) ;
2011-03-23 17:39:56 +01:00
} else if ( ( Conf . territoryBlockFireballs | | faction . isSafeZone ( ) ) & & event . getEntity ( ) instanceof Fireball ) {
2011-03-22 17:20:21 +01:00
// ghast fireball which might need prevention, if inside faction territory
event . setCancelled ( true ) ;
2011-03-18 00:02:29 +01:00
}
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
2011-02-13 09:33:42 +01:00
if ( ! ( damagee instanceof Player ) ) {
return true ;
}
2011-02-06 13:36:11 +01:00
2011-03-18 17:33:23 +01:00
FPlayer defender = FPlayer . get ( ( Player ) damagee ) ;
2011-03-23 17:39:56 +01:00
// Players can not take attack damage in a SafeZone
if ( Board . getFactionAt ( new FLocation ( defender ) ) . isSafeZone ( ) ) {
if ( damager instanceof Player ) {
FPlayer attacker = FPlayer . get ( ( Player ) damager ) ;
attacker . sendMessage ( " You cant hurt other players in a SafeZone. " ) ;
defender . sendMessage ( attacker . getNameAndRelevant ( defender ) + Conf . colorSystem + " tried to hurt you. " ) ;
}
return false ;
}
if ( ! ( damager instanceof Player ) ) {
return true ;
}
2011-03-18 17:33:23 +01:00
FPlayer attacker = FPlayer . get ( ( Player ) damager ) ;
2011-02-06 13:36:11 +01:00
Relation relation = defender . getRelation ( attacker ) ;
// Players without faction may be hurt anywhere
2011-03-23 17:39:56 +01:00
if ( defender . getFaction ( ) . isNone ( ) ) {
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-23 17:39:56 +01:00
int newDamage = ( int ) Math . ceil ( damage * ( 1D - Conf . territoryShieldFactor ) ) ;
2011-03-07 04:13:27 +01:00
sub . setDamage ( newDamage ) ;
2011-02-06 13:36:11 +01:00
// Send message
2011-03-23 17:39:56 +01:00
String perc = MessageFormat . format ( " {0,number,#%} " , ( Conf . territoryShieldFactor ) ) ; // TODO does this display correctly??
defender . sendMessage ( " 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
}
2011-03-23 17:39:56 +01:00
public void onCreatureSpawn ( CreatureSpawnEvent event ) {
if ( event . isCancelled ( ) ) {
return ;
}
if ( Conf . safeZoneNerfedCreatureTypes . contains ( event . getCreatureType ( ) ) & & Board . getFactionAt ( new FLocation ( event . getLocation ( ) ) ) . isSafeZone ( ) ) {
event . setCancelled ( true ) ;
}
}
@Override
public void onEntityTarget ( EntityTargetEvent event ) {
if ( event . isCancelled ( ) ) {
return ;
}
// if there is a target
Entity target = event . getTarget ( ) ;
if ( target = = null ) {
return ;
}
// We are interested in blocking targeting for certain mobs:
if ( ! Conf . safeZoneNerfedCreatureTypes . contains ( EntityUtil . creatureTypeFromEntity ( event . getEntity ( ) ) ) ) {
return ;
}
// in case the target is in a safe zone.
if ( Board . getFactionAt ( new FLocation ( target . getLocation ( ) ) ) . isSafeZone ( ) ) {
event . setCancelled ( true ) ;
}
}
2011-02-06 13:36:11 +01:00
}