From 1f5dc830be5187bb0864b2152a4404b4de24b884 Mon Sep 17 00:00:00 2001 From: alkarin Date: Mon, 17 Dec 2012 10:10:13 -0600 Subject: [PATCH 1/3] Added a new Factions event for power loss named PowerLossEvent. PowerLossEvent happens after each player death --- .../factions/event/PowerLossEvent.java | 78 +++++++++++++++++++ .../listeners/FactionsEntityListener.java | 36 ++++++--- 2 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 src/com/massivecraft/factions/event/PowerLossEvent.java diff --git a/src/com/massivecraft/factions/event/PowerLossEvent.java b/src/com/massivecraft/factions/event/PowerLossEvent.java new file mode 100644 index 00000000..3012beaf --- /dev/null +++ b/src/com/massivecraft/factions/event/PowerLossEvent.java @@ -0,0 +1,78 @@ +package com.massivecraft.factions.event; + +import src.com.massivecraft.factions.FPlayer; +import src.com.massivecraft.factions.Faction; + +public class PowerLossEvent extends Event implements Cancellable +{ + private static final HandlerList handlers = new HandlerList(); + + private boolean cancelled; + private Faction faction; + private FPlayer fplayer; + private String message; + + public PowerLossEvent(Faction f, FPlayer p) + { + cancelled = false; + faction = f; + fplayer = p; + } + + @Override + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public Faction getFaction() + { + return faction; + } + + public String getFactionId() + { + return faction.getId(); + } + + public String getFactionTag() + { + return faction.getTag(); + } + + public FPlayer getFPlayer() + { + return fplayer; + } + + public Player getPlayer() + { + return fplayer.getPlayer(); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean isCancelled() + { + return cancelled; + } + + @Override + public void setCancelled(boolean c) + { + this.cancelled = c; + } + +} diff --git a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java index b506237e..3ff30992 100644 --- a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -57,6 +57,7 @@ public class FactionsEntityListener implements Listener this.p = p; } + @EventHandler(priority = EventPriority.NORMAL) public void onEntityDeath(EntityDeathEvent event) { @@ -66,21 +67,36 @@ public class FactionsEntityListener implements Listener Player player = (Player) entity; FPlayer fplayer = FPlayers.i.get(player); Faction faction = Board.getFactionAt(new FLocation(player.getLocation())); - + + PowerLossEvent powerLossEvent = new PowerLossEvent(faction,fplayer); + // Check for no power loss conditions if ( ! faction.getFlag(FFlag.POWERLOSS)) { - fplayer.msg("You didn't lose any power since the territory you died in works that way."); - return; + powerLossEvent.setMessage("You didn't lose any power since the territory you died in works that way."); + powerLossEvent.setCancelled(true); } - - if (Conf.worldsNoPowerLoss.contains(player.getWorld().getName())) + else if (Conf.worldsNoPowerLoss.contains(player.getWorld().getName())) { - fplayer.msg("You didn't lose any power due to the world you died in."); - return; + powerLossEvent.setMessage("You didn't lose any power due to the world you died in."); + powerLossEvent.setCancelled(true); + } + else { + powerLossEvent.setMessage("Your power is now "+fplayer.getPowerRounded()+" / "+fplayer.getPowerMaxRounded()); + } + // call Event + Bukkit.getPluginManager().callEvent(powerLossEvent); + + // Send the message from the powerLossEvent + final String msg = powerLossEvent.getMessage(); + if (msg != null && !msg.isEmpty()) + { + fplayer.msg(msg); + } + // Call player onDeath if the event is not cancelled + if(!powerLossEvent.isCancelled()) + { + fplayer.onDeath(); } - - fplayer.onDeath(); - fplayer.msg("Your power is now "+fplayer.getPowerRounded()+" / "+fplayer.getPowerMaxRounded()); } @EventHandler(priority = EventPriority.NORMAL) From 6eb23a200e6bc0bad7d306649a1aab93ecd0fb2b Mon Sep 17 00:00:00 2001 From: alkarin Date: Mon, 17 Dec 2012 11:34:19 -0600 Subject: [PATCH 2/3] Fix for PowerLossEvent Messages --- .../listeners/FactionsEntityListener.java | 71 ++++++++++--------- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java index 3ff30992..93701dd6 100644 --- a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -1,14 +1,15 @@ package com.massivecraft.factions.listeners; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; -import java.text.MessageFormat; import java.util.Set; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Enderman; @@ -44,6 +45,8 @@ import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.Faction; import com.massivecraft.factions.P; +import com.massivecraft.factions.event.PowerLossEvent; +import com.massivecraft.factions.listeners.FactionsBlockListener; import com.massivecraft.factions.struct.FFlag; import com.massivecraft.factions.struct.Rel; import com.massivecraft.factions.util.MiscUtil; @@ -81,7 +84,7 @@ public class FactionsEntityListener implements Listener powerLossEvent.setCancelled(true); } else { - powerLossEvent.setMessage("Your power is now "+fplayer.getPowerRounded()+" / "+fplayer.getPowerMaxRounded()); + powerLossEvent.setMessage("Your power is now %d / %d"); } // call Event Bukkit.getPluginManager().callEvent(powerLossEvent); @@ -90,7 +93,7 @@ public class FactionsEntityListener implements Listener final String msg = powerLossEvent.getMessage(); if (msg != null && !msg.isEmpty()) { - fplayer.msg(msg); + fplayer.msg(msg,fplayer.getPowerRounded(),fplayer.getPowerMaxRounded()); } // Call player onDeath if the event is not cancelled if(!powerLossEvent.isCancelled()) @@ -98,12 +101,12 @@ public class FactionsEntityListener implements Listener fplayer.onDeath(); } } - + @EventHandler(priority = EventPriority.NORMAL) public void onEntityDamage(EntityDamageEvent event) { if (event.isCancelled()) return; - + if (event instanceof EntityDamageByEntityEvent) { EntityDamageByEntityEvent sub = (EntityDamageByEntityEvent)event; @@ -170,7 +173,7 @@ public class FactionsEntityListener implements Listener public void onEntityCombustByEntity(EntityCombustByEntityEvent event) { if (event.isCancelled()) return; - + EntityDamageByEntityEvent sub = new EntityDamageByEntityEvent(event.getCombuster(), event.getEntity(), EntityDamageEvent.DamageCause.FIRE, 0); if ( ! this.canDamagerHurtDamagee(sub, false)) event.setCancelled(true); @@ -224,14 +227,14 @@ public class FactionsEntityListener implements Listener Entity damager = sub.getDamager(); Entity damagee = sub.getEntity(); int damage = sub.getDamage(); - + if ( ! (damagee instanceof Player)) return true; - + FPlayer defender = FPlayers.i.get((Player)damagee); - + if (defender == null || defender.getPlayer() == null) return true; - + Location defenderLoc = defender.getPlayer().getLocation(); Faction defLocFaction = Board.getFactionAt(new FLocation(defenderLoc)); @@ -244,7 +247,7 @@ public class FactionsEntityListener implements Listener return true; // Players can not take attack damage in a SafeZone, or possibly peaceful territory - + if (defLocFaction.getFlag(FFlag.PVP) == false) { if (damager instanceof Player) @@ -258,12 +261,12 @@ public class FactionsEntityListener implements Listener } return defLocFaction.getFlag(FFlag.MONSTERS); } - + if ( ! (damager instanceof Player)) return true; - + FPlayer attacker = FPlayers.i.get((Player)damager); - + if (attacker == null || attacker.getPlayer() == null) return true; @@ -274,9 +277,9 @@ public class FactionsEntityListener implements Listener if (notify) attacker.msg("You can't hurt other players for " + Conf.noPVPDamageToOthersForXSecondsAfterLogin + " seconds after logging in."); return false; } - + Faction locFaction = Board.getFactionAt(new FLocation(attacker)); - + // so we know from above that the defender isn't in a safezone... what about the attacker, sneaky dog that he might be? if (locFaction.getFlag(FFlag.PVP) == false) { @@ -289,7 +292,7 @@ public class FactionsEntityListener implements Listener Faction defendFaction = defender.getFaction(); Faction attackFaction = attacker.getFaction(); - + if (attackFaction.isNone() && Conf.disablePVPForFactionlessPlayers) { if (notify) attacker.msg("You can't hurt other players until you join a faction."); @@ -308,16 +311,16 @@ public class FactionsEntityListener implements Listener return false; } } - + Rel relation = defendFaction.getRelationTo(attackFaction); - + // Check the relation if (defender.hasFaction() && relation.isAtLeast(Conf.friendlyFireFromRel) && defLocFaction.getFlag(FFlag.FRIENDLYFIRE) == false) { if (notify) attacker.msg("You can't hurt %s.", relation.getDescPlayerMany()); return false; } - + // You can not hurt neutrals in their own territory. boolean ownTerritory = defender.isInOwnTerritory(); if (defender.hasFaction() && ownTerritory && relation == Rel.NEUTRAL) @@ -329,13 +332,13 @@ public class FactionsEntityListener implements Listener } return false; } - + // Damage will be dealt. However check if the damage should be reduced. if (damage > 0.0 && defender.hasFaction() && ownTerritory && Conf.territoryShieldFactor > 0) { int newDamage = (int)Math.ceil(damage * (1D - Conf.territoryShieldFactor)); sub.setDamage(newDamage); - + // Send message if (notify) { @@ -343,42 +346,42 @@ public class FactionsEntityListener implements Listener defender.msg("Enemy damage reduced by %s.", perc); } } - + return true; } - + @EventHandler(priority = EventPriority.NORMAL) public void onCreatureSpawn(CreatureSpawnEvent event) { if (event.isCancelled()) return; if (event.getLocation() == null) return; - + FLocation floc = new FLocation(event.getLocation()); Faction faction = Board.getFactionAt(floc); - + if (faction.getFlag(FFlag.MONSTERS)) return; if ( ! Conf.monsters.contains(event.getEntityType())) return; - + event.setCancelled(true); } - + @EventHandler(priority = EventPriority.NORMAL) 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.monsters.contains(MiscUtil.creatureTypeFromEntity(event.getEntity()))) return; - + FLocation floc = new FLocation(target.getLocation()); Faction faction = Board.getFactionAt(floc); - + if (faction.getFlag(FFlag.MONSTERS)) return; - + event.setCancelled(true); } @@ -437,7 +440,7 @@ public class FactionsEntityListener implements Listener FLocation floc = new FLocation(event.getBlock()); Faction faction = Board.getFactionAt(floc); - + if (entity instanceof Enderman) { if ( ! faction.getFlag(FFlag.ENDERGRIEF)) From efcf97d375106629dee6d00a833bd7b54c610c4d Mon Sep 17 00:00:00 2001 From: alkarin Date: Mon, 17 Dec 2012 11:43:57 -0600 Subject: [PATCH 3/3] Fix for PowerLossEvent Messages --- .../factions/listeners/FactionsEntityListener.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java index 93701dd6..0cb77c36 100644 --- a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -89,17 +89,17 @@ public class FactionsEntityListener implements Listener // call Event Bukkit.getPluginManager().callEvent(powerLossEvent); + // Call player onDeath if the event is not cancelled + if(!powerLossEvent.isCancelled()) + { + fplayer.onDeath(); + } // Send the message from the powerLossEvent final String msg = powerLossEvent.getMessage(); if (msg != null && !msg.isEmpty()) { fplayer.msg(msg,fplayer.getPowerRounded(),fplayer.getPowerMaxRounded()); } - // Call player onDeath if the event is not cancelled - if(!powerLossEvent.isCancelled()) - { - fplayer.onDeath(); - } } @EventHandler(priority = EventPriority.NORMAL)