Break out Territory Shield logic and increase its event priority.

This commit is contained in:
Olof Larsson 2015-01-19 10:35:12 +01:00
parent 91bdeb4f3c
commit 454acc91d6

View File

@ -847,7 +847,7 @@ public class EngineMain extends EngineAbstract
Entity edefender = event.getEntity(); Entity edefender = event.getEntity();
if (!(edefender instanceof Player)) return true; if (!(edefender instanceof Player)) return true;
Player defender = (Player)edefender; Player defender = (Player)edefender;
MPlayer udefender = MPlayer.get(edefender); MPlayer mdefender = MPlayer.get(edefender);
// ... and the attacker is someone else ... // ... and the attacker is someone else ...
Entity eattacker = MUtil.getLiableDamager(event); Entity eattacker = MUtil.getLiableDamager(event);
@ -907,7 +907,7 @@ public class EngineMain extends EngineAbstract
// ... are PVP rules completely ignored in this world? ... // ... are PVP rules completely ignored in this world? ...
if (!MConf.get().worldsPvpRulesEnabled.contains(defenderPs.getWorld())) return true; if (!MConf.get().worldsPvpRulesEnabled.contains(defenderPs.getWorld())) return true;
Faction defendFaction = udefender.getFaction(); Faction defendFaction = mdefender.getFaction();
Faction attackFaction = uattacker.getFaction(); Faction attackFaction = uattacker.getFaction();
if (attackFaction.isNone() && MConf.get().disablePVPForFactionlessPlayers) if (attackFaction.isNone() && MConf.get().disablePVPForFactionlessPlayers)
@ -934,7 +934,7 @@ public class EngineMain extends EngineAbstract
Rel relation = defendFaction.getRelationTo(attackFaction); Rel relation = defendFaction.getRelationTo(attackFaction);
// Check the relation // Check the relation
if (udefender.hasFaction() && relation.isFriend() && defenderPsFaction.getFlag(MFlag.getFlagFriendlyire()) == false) if (mdefender.hasFaction() && relation.isFriend() && defenderPsFaction.getFlag(MFlag.getFlagFriendlyire()) == false)
{ {
ret = falseUnlessDisallowedPvpEventCancelled(attacker, defender, event); ret = falseUnlessDisallowedPvpEventCancelled(attacker, defender, event);
if (!ret && notify) uattacker.msg("<i>You can't hurt %s<i>.", relation.getDescPlayerMany()); if (!ret && notify) uattacker.msg("<i>You can't hurt %s<i>.", relation.getDescPlayerMany());
@ -942,37 +942,53 @@ public class EngineMain extends EngineAbstract
} }
// You can not hurt neutrals in their own territory. // You can not hurt neutrals in their own territory.
boolean ownTerritory = udefender.isInOwnTerritory(); boolean ownTerritory = mdefender.isInOwnTerritory();
if (udefender.hasFaction() && ownTerritory && relation == Rel.NEUTRAL) if (mdefender.hasFaction() && ownTerritory && relation == Rel.NEUTRAL)
{ {
ret = falseUnlessDisallowedPvpEventCancelled(attacker, defender, event); ret = falseUnlessDisallowedPvpEventCancelled(attacker, defender, event);
if (!ret && notify) if (!ret && notify)
{ {
uattacker.msg("<i>You can't hurt %s<i> in their own territory unless you declare them as an enemy.", udefender.describeTo(uattacker)); uattacker.msg("<i>You can't hurt %s<i> in their own territory unless you declare them as an enemy.", mdefender.describeTo(uattacker));
udefender.msg("%s<i> tried to hurt you.", uattacker.describeTo(udefender, true)); mdefender.msg("%s<i> tried to hurt you.", uattacker.describeTo(mdefender, true));
} }
return ret; return ret;
} }
// Damage will be dealt. However check if the damage should be reduced.
double damage = event.getDamage();
if (damage > 0.0 && udefender.hasFaction() && ownTerritory && MConf.get().territoryShieldFactor > 0)
{
double newDamage = damage * (1D - MConf.get().territoryShieldFactor);
MUtil.setDamage(event, newDamage);
// Send message
if (notify)
{
String perc = MessageFormat.format("{0,number,#%}", (MConf.get().territoryShieldFactor)); // TODO does this display correctly??
udefender.msg("<i>Enemy damage reduced by <rose>%s<i>.", perc);
}
}
return true; return true;
} }
// -------------------------------------------- //
// TERRITORY SHIELD
// -------------------------------------------- //
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void territoryShield(EntityDamageByEntityEvent event)
{
// If the entity is a player ...
Entity entity = event.getEntity();
if (!(entity instanceof Player)) return;
Player player = (Player)entity;
MPlayer mplayer = MPlayer.get(player);
// ... and that player has a faction ...
if ( ! mplayer.hasFaction()) return;
// ... and that player is in their own territory ...
if ( ! mplayer.isInOwnTerritory()) return;
// ... and a territoryShieldFactor is configured ...
if (MConf.get().territoryShieldFactor <= 0) return;
// ... then scale the damage ...
double factor = 1D - MConf.get().territoryShieldFactor;
MUtil.scaleDamage(event, factor);
// ... and inform.
String perc = MessageFormat.format("{0,number,#%}", (MConf.get().territoryShieldFactor));
mplayer.msg("<i>Enemy damage reduced by <rose>%s<i>.", perc);
}
// -------------------------------------------- // // -------------------------------------------- //
// REMOVE PLAYER DATA WHEN BANNED // REMOVE PLAYER DATA WHEN BANNED
// -------------------------------------------- // // -------------------------------------------- //