From 6329fd0eaf4e4a406e59c669d66b3741f6235643 Mon Sep 17 00:00:00 2001 From: donington Date: Fri, 9 Mar 2012 17:09:33 -0500 Subject: [PATCH] updated patrickfreed's custom event system Patrick's Custom Event System Changes: ---------------------------------------- * FPlayerLeaveEvent now fires for all faction players in cmdDisband() * FPlayerLeaveEvent removed from cmdJoin() * FPlayerJoinEvent now only fires when the faction is different in cmdLeade * Added FactionRenameEvent, firing on cmdTag() * Added FactionRelationEvent, firing on FRelationCommand extensions * Fixed FPlayerJoinEvent to fire after tag is set in cmdCreate() * Added getFactionId() to FactionCreateEvent TODO: ------- * cmdLeader() might need a FPlayerLeaveEvent for the same reason it needs a FPlayerJoinEvent? On branch CustomFactionEvents modified: src/com/massivecraft/factions/cmd/CmdCreate.java modified: src/com/massivecraft/factions/cmd/CmdDisband.java modified: src/com/massivecraft/factions/cmd/CmdJoin.java modified: src/com/massivecraft/factions/cmd/CmdKick.java modified: src/com/massivecraft/factions/cmd/CmdLeader.java modified: src/com/massivecraft/factions/cmd/CmdTag.java modified: src/com/massivecraft/factions/cmd/FRelationCommand.java modified: src/com/massivecraft/factions/event/FPlayerLeaveEvent.java modified: src/com/massivecraft/factions/event/FactionCreateEvent.java new file: src/com/massivecraft/factions/event/FactionRelationEvent.java new file: src/com/massivecraft/factions/event/FactionRenameEvent.java modified: src/com/massivecraft/factions/event/LandClaimEvent.java --- .../massivecraft/factions/cmd/CmdCreate.java | 19 +- .../massivecraft/factions/cmd/CmdDisband.java | 187 +++++++++--------- .../massivecraft/factions/cmd/CmdJoin.java | 12 +- .../massivecraft/factions/cmd/CmdKick.java | 1 + .../massivecraft/factions/cmd/CmdLeader.java | 15 +- src/com/massivecraft/factions/cmd/CmdTag.java | 16 +- .../factions/cmd/FRelationCommand.java | 13 ++ .../factions/event/FPlayerLeaveEvent.java | 2 +- .../factions/event/FactionCreateEvent.java | 10 +- .../factions/event/FactionRelationEvent.java | 56 ++++++ .../factions/event/FactionRenameEvent.java | 73 +++++++ .../factions/event/LandClaimEvent.java | 6 +- 12 files changed, 287 insertions(+), 123 deletions(-) create mode 100644 src/com/massivecraft/factions/event/FactionRelationEvent.java create mode 100644 src/com/massivecraft/factions/event/FactionRenameEvent.java diff --git a/src/com/massivecraft/factions/cmd/CmdCreate.java b/src/com/massivecraft/factions/cmd/CmdCreate.java index dd18e005..1babc225 100644 --- a/src/com/massivecraft/factions/cmd/CmdCreate.java +++ b/src/com/massivecraft/factions/cmd/CmdCreate.java @@ -57,10 +57,10 @@ public class CmdCreate extends FCommand sendMessage(tagValidationErrors); return; } - - FactionCreateEvent createEvent = new FactionCreateEvent(tag, me); - Bukkit.getServer().getPluginManager().callEvent(createEvent); + // trigger the faction creation event (cancellable) + FactionCreateEvent createEvent = new FactionCreateEvent(me, tag); + Bukkit.getServer().getPluginManager().callEvent(createEvent); if(createEvent.isCancelled()) return; // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay @@ -75,10 +75,15 @@ public class CmdCreate extends FCommand return; } - FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me),faction,FPlayerJoinEvent.PlayerJoinReason.CREATE); - Bukkit.getServer().getPluginManager().callEvent(joinEvent); - - faction.setTag(tag); + // finish setting up the Faction + faction.setTag(tag); + + // trigger the faction join event for the creator + FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me),faction,FPlayerJoinEvent.PlayerJoinReason.CREATE); + Bukkit.getServer().getPluginManager().callEvent(joinEvent); + // join event cannot be cancelled or you'll have an empty faction + + // finish setting up the FPlayer fme.setRole(Rel.LEADER); fme.setFaction(faction); diff --git a/src/com/massivecraft/factions/cmd/CmdDisband.java b/src/com/massivecraft/factions/cmd/CmdDisband.java index a1c4fa52..1c59b722 100644 --- a/src/com/massivecraft/factions/cmd/CmdDisband.java +++ b/src/com/massivecraft/factions/cmd/CmdDisband.java @@ -1,91 +1,96 @@ -package com.massivecraft.factions.cmd; - -import org.bukkit.Bukkit; - -import com.massivecraft.factions.Conf; -import com.massivecraft.factions.event.FPlayerLeaveEvent; -import com.massivecraft.factions.event.FactionDisbandEvent; -import com.massivecraft.factions.integration.Econ; -import com.massivecraft.factions.FPlayers; -import com.massivecraft.factions.Faction; -import com.massivecraft.factions.P; -import com.massivecraft.factions.FPlayer; -import com.massivecraft.factions.integration.SpoutFeatures; -import com.massivecraft.factions.struct.FFlag; -import com.massivecraft.factions.struct.FPerm; -import com.massivecraft.factions.struct.Permission; - -public class CmdDisband extends FCommand -{ - public CmdDisband() - { - super(); - this.aliases.add("disband"); - - //this.requiredArgs.add(""); - this.optionalArgs.put("faction", "your"); - - this.permission = Permission.DISBAND.node; - this.disableOnLock = true; - - senderMustBePlayer = false; - senderMustBeMember = false; - senderMustBeOfficer = false; - senderMustBeLeader = false; - } - - @Override - public void perform() - { - // The faction, default to your own.. but null if console sender. - Faction faction = this.argAsFaction(0, fme == null ? null : myFaction); - if (faction == null) return; - - if ( ! FPerm.DISBAND.has(sender, faction, true)) return; - - if (faction.getFlag(FFlag.PERMANENT)) - { - msg("This faction is designated as permanent, so you cannot disband it."); - return; - } - - FactionDisbandEvent disbandEvent = new FactionDisbandEvent(me, faction.getId()); - Bukkit.getServer().getPluginManager().callEvent(disbandEvent); - if(disbandEvent.isCancelled()) return; - - // Inform all players - for (FPlayer fplayer : FPlayers.i.getOnline()) - { - String who = senderIsConsole ? "A server admin" : fme.describeTo(fplayer); - if (fplayer.getFaction() == faction) - { - Bukkit.getServer().getPluginManager().callEvent(new FPlayerLeaveEvent(fplayer,faction, FPlayerLeaveEvent.PlayerLeaveReason.DISBAND)); - fplayer.msg("%s disbanded your faction.", who); - } - else - { - fplayer.msg("%s disbanded the faction %s.", who, faction.getTag(fplayer)); - } - } - if (Conf.logFactionDisband) - P.p.log("The faction "+faction.getTag()+" ("+faction.getId()+") was disbanded by "+(senderIsConsole ? "console command" : fme.getName())+"."); - - if (Econ.shouldBeUsed() && ! senderIsConsole) - { - //Give all the faction's money to the disbander - double amount = Econ.getBalance(faction.getAccountId()); - Econ.transferMoney(fme, faction, fme, amount, false); - - if (amount > 0.0) - { - String amountString = Econ.moneyString(amount); - msg("You have been given the disbanded faction's bank, totaling %s.", amountString); - P.p.log(fme.getName() + " has been given bank holdings of "+amountString+" from disbanding "+faction.getTag()+"."); - } - } - - faction.detach(); - - SpoutFeatures.updateAppearances(); - } -} +package com.massivecraft.factions.cmd; + +import org.bukkit.Bukkit; + +import com.massivecraft.factions.Conf; +import com.massivecraft.factions.event.FPlayerLeaveEvent; +import com.massivecraft.factions.event.FactionDisbandEvent; +import com.massivecraft.factions.integration.Econ; +import com.massivecraft.factions.FPlayers; +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.P; +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.integration.SpoutFeatures; +import com.massivecraft.factions.struct.FFlag; +import com.massivecraft.factions.struct.FPerm; +import com.massivecraft.factions.struct.Permission; + +public class CmdDisband extends FCommand +{ + public CmdDisband() + { + super(); + this.aliases.add("disband"); + + //this.requiredArgs.add(""); + this.optionalArgs.put("faction", "your"); + + this.permission = Permission.DISBAND.node; + this.disableOnLock = true; + + senderMustBePlayer = false; + senderMustBeMember = false; + senderMustBeOfficer = false; + senderMustBeLeader = false; + } + + @Override + public void perform() + { + // The faction, default to your own.. but null if console sender. + Faction faction = this.argAsFaction(0, fme == null ? null : myFaction); + if (faction == null) return; + + if ( ! FPerm.DISBAND.has(sender, faction, true)) return; + + if (faction.getFlag(FFlag.PERMANENT)) + { + msg("This faction is designated as permanent, so you cannot disband it."); + return; + } + + FactionDisbandEvent disbandEvent = new FactionDisbandEvent(me, faction.getId()); + Bukkit.getServer().getPluginManager().callEvent(disbandEvent); + if(disbandEvent.isCancelled()) return; + + // Send FPlayerLeaveEvent for each player in the faction + for ( FPlayer fplayer : faction.getFPlayers() ) + { + Bukkit.getServer().getPluginManager().callEvent(new FPlayerLeaveEvent(fplayer, faction, FPlayerLeaveEvent.PlayerLeaveReason.DISBAND)); + } + + // Inform all players + for (FPlayer fplayer : FPlayers.i.getOnline()) + { + String who = senderIsConsole ? "A server admin" : fme.describeTo(fplayer); + if (fplayer.getFaction() == faction) + { + fplayer.msg("%s disbanded your faction.", who); + } + else + { + fplayer.msg("%s disbanded the faction %s.", who, faction.getTag(fplayer)); + } + } + if (Conf.logFactionDisband) + P.p.log("The faction "+faction.getTag()+" ("+faction.getId()+") was disbanded by "+(senderIsConsole ? "console command" : fme.getName())+"."); + + if (Econ.shouldBeUsed() && ! senderIsConsole) + { + //Give all the faction's money to the disbander + double amount = Econ.getBalance(faction.getAccountId()); + Econ.transferMoney(fme, faction, fme, amount, false); + + if (amount > 0.0) + { + String amountString = Econ.moneyString(amount); + msg("You have been given the disbanded faction's bank, totaling %s.", amountString); + P.p.log(fme.getName() + " has been given bank holdings of "+amountString+" from disbanding "+faction.getTag()+"."); + } + } + + faction.detach(); + + SpoutFeatures.updateAppearances(); + } +} diff --git a/src/com/massivecraft/factions/cmd/CmdJoin.java b/src/com/massivecraft/factions/cmd/CmdJoin.java index 79bd1e4c..63cad4b6 100644 --- a/src/com/massivecraft/factions/cmd/CmdJoin.java +++ b/src/com/massivecraft/factions/cmd/CmdJoin.java @@ -8,9 +8,7 @@ import com.massivecraft.factions.Faction; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.P; import com.massivecraft.factions.event.FPlayerJoinEvent; -import com.massivecraft.factions.event.FPlayerLeaveEvent; import com.massivecraft.factions.struct.Permission; -import com.massivecraft.factions.zcore.persist.EM; public class CmdJoin extends FCommand { @@ -82,14 +80,8 @@ public class CmdJoin extends FCommand if (samePlayer && ! payForCommand(Conf.econCostJoin, "to join a faction", "for joining a faction")) return; fme.msg("%s successfully joined %s.", fplayer.describeTo(fme, true), faction.getTag(fme)); - - if(!EM.detached(myFaction)) - { - FPlayerLeaveEvent leaveEvent = new FPlayerLeaveEvent(FPlayers.i.get(me),faction,FPlayerLeaveEvent.PlayerLeaveReason.JOINOTHER); - Bukkit.getServer().getPluginManager().callEvent(leaveEvent); - if (leaveEvent.isCancelled()) return; - } - + + // trigger the join event (cancellable) FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me),faction,FPlayerJoinEvent.PlayerJoinReason.COMMAND); Bukkit.getServer().getPluginManager().callEvent(joinEvent); if (joinEvent.isCancelled()) return; diff --git a/src/com/massivecraft/factions/cmd/CmdKick.java b/src/com/massivecraft/factions/cmd/CmdKick.java index 7c27f683..71cb51cf 100644 --- a/src/com/massivecraft/factions/cmd/CmdKick.java +++ b/src/com/massivecraft/factions/cmd/CmdKick.java @@ -63,6 +63,7 @@ public class CmdKick extends FCommand // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay if ( ! payForCommand(Conf.econCostKick, "to kick someone from the faction", "for kicking someone from the faction")) return; + // trigger the leave event (cancellable) [reason:kicked] FPlayerLeaveEvent event = new FPlayerLeaveEvent(you, you.getFaction(), FPlayerLeaveEvent.PlayerLeaveReason.KICKED); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) return; diff --git a/src/com/massivecraft/factions/cmd/CmdLeader.java b/src/com/massivecraft/factions/cmd/CmdLeader.java index 3068a9f3..52b1c4e2 100644 --- a/src/com/massivecraft/factions/cmd/CmdLeader.java +++ b/src/com/massivecraft/factions/cmd/CmdLeader.java @@ -66,11 +66,16 @@ public class CmdLeader extends FCommand return; } } - - FPlayerJoinEvent event = new FPlayerJoinEvent(FPlayers.i.get(me),targetFaction,FPlayerJoinEvent.PlayerJoinReason.LEADER); - Bukkit.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return; - + + // only perform a FPlayerJoinEvent when newLeader isn't actually in the faction + // (only possibly triggered by console) + if (newLeader.getFaction() != targetFaction) + { + FPlayerJoinEvent event = new FPlayerJoinEvent(FPlayers.i.get(me),targetFaction,FPlayerJoinEvent.PlayerJoinReason.LEADER); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) return; + } + // if target player is currently leader, demote and replace him if (targetFactionCurrentLeader == newLeader) { diff --git a/src/com/massivecraft/factions/cmd/CmdTag.java b/src/com/massivecraft/factions/cmd/CmdTag.java index 9c569fc9..cd3da2a8 100644 --- a/src/com/massivecraft/factions/cmd/CmdTag.java +++ b/src/com/massivecraft/factions/cmd/CmdTag.java @@ -2,9 +2,12 @@ package com.massivecraft.factions.cmd; import java.util.ArrayList; +import org.bukkit.Bukkit; + import com.massivecraft.factions.Conf; import com.massivecraft.factions.Faction; import com.massivecraft.factions.Factions; +import com.massivecraft.factions.event.FactionRenameEvent; import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.util.MiscUtil; @@ -39,7 +42,7 @@ public class CmdTag extends FCommand msg("That tag is already taken"); return; } - + ArrayList errors = new ArrayList(); errors.addAll(Factions.validateTag(tag)); if (errors.size() > 0) @@ -48,12 +51,17 @@ public class CmdTag extends FCommand return; } + // trigger the faction rename event (cancellable) + FactionRenameEvent renameEvent = new FactionRenameEvent(fme, tag); + Bukkit.getServer().getPluginManager().callEvent(renameEvent); + if(renameEvent.isCancelled()) return; + // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay if ( ! payForCommand(Conf.econCostTag, "to change the faction tag", "for changing the faction tag")) return; - - String oldtag = myFaction.getTag(); + + String oldtag = myFaction.getTag(); myFaction.setTag(tag); - + // Inform myFaction.msg("%s changed your faction tag to %s", fme.describeTo(myFaction, true), myFaction.getTag(myFaction)); for (Faction faction : Factions.i.get()) diff --git a/src/com/massivecraft/factions/cmd/FRelationCommand.java b/src/com/massivecraft/factions/cmd/FRelationCommand.java index 234c1669..37efc8af 100644 --- a/src/com/massivecraft/factions/cmd/FRelationCommand.java +++ b/src/com/massivecraft/factions/cmd/FRelationCommand.java @@ -1,7 +1,10 @@ package com.massivecraft.factions.cmd; +import org.bukkit.Bukkit; + import com.massivecraft.factions.Conf; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.event.FactionRelationEvent; import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.struct.FFlag; import com.massivecraft.factions.struct.Permission; @@ -47,13 +50,22 @@ public abstract class FRelationCommand extends FCommand // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay if ( ! payForCommand(targetRelation.getRelationCost(), "to change a relation wish", "for changing a relation wish")) return; + // try to set the new relation + Rel oldRelation = myFaction.getRelationTo(them, true); myFaction.setRelationWish(them, targetRelation); Rel currentRelation = myFaction.getRelationTo(them, true); + + // if the relation change was successful if (targetRelation == currentRelation) { + // trigger the faction relation event + FactionRelationEvent relationEvent = new FactionRelationEvent(myFaction, them, oldRelation, currentRelation); + Bukkit.getServer().getPluginManager().callEvent(relationEvent); + them.msg("%s is now %s.", myFaction.describeTo(them, true), targetRelation.getDescFactionOne()); myFaction.msg("%s is now %s.", them.describeTo(myFaction, true), targetRelation.getDescFactionOne()); } + // inform the other faction of your request else { them.msg("%s wishes to be %s.", myFaction.describeTo(them, true), targetRelation.getColor()+targetRelation.getDescFactionOne()); @@ -62,6 +74,7 @@ public abstract class FRelationCommand extends FCommand } // TODO: The ally case should work!! + // * this might have to be bumped up to make that happen, & allow ALLY,NEUTRAL only if ( targetRelation != Rel.TRUCE && them.getFlag(FFlag.PEACEFUL)) { them.msg("This will have no effect while your faction is peaceful."); diff --git a/src/com/massivecraft/factions/event/FPlayerLeaveEvent.java b/src/com/massivecraft/factions/event/FPlayerLeaveEvent.java index 167933f0..12e951bb 100644 --- a/src/com/massivecraft/factions/event/FPlayerLeaveEvent.java +++ b/src/com/massivecraft/factions/event/FPlayerLeaveEvent.java @@ -15,7 +15,7 @@ public class FPlayerLeaveEvent extends Event implements Cancellable Faction Faction; boolean cancelled = false; - public enum PlayerLeaveReason + public enum PlayerLeaveReason { KICKED, DISBAND, RESET, JOINOTHER, LEAVE } diff --git a/src/com/massivecraft/factions/event/FactionCreateEvent.java b/src/com/massivecraft/factions/event/FactionCreateEvent.java index 0f9a66bd..088e0021 100644 --- a/src/com/massivecraft/factions/event/FactionCreateEvent.java +++ b/src/com/massivecraft/factions/event/FactionCreateEvent.java @@ -7,6 +7,7 @@ import org.bukkit.event.HandlerList; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayers; +import com.massivecraft.factions.Factions; public class FactionCreateEvent extends Event implements Cancellable { @@ -16,7 +17,7 @@ public class FactionCreateEvent extends Event implements Cancellable private Player sender; private boolean cancelled; - public FactionCreateEvent(String tag, Player sender) + public FactionCreateEvent(Player sender, String tag) { this.factionTag = tag; this.sender = sender; @@ -28,11 +29,16 @@ public class FactionCreateEvent extends Event implements Cancellable return FPlayers.i.get(sender); } + public String getFactionId() + { + return Factions.i.getNextId(); + } + public String getFactionTag() { return factionTag; } - + public HandlerList getHandlers() { return handlers; diff --git a/src/com/massivecraft/factions/event/FactionRelationEvent.java b/src/com/massivecraft/factions/event/FactionRelationEvent.java new file mode 100644 index 00000000..7279777a --- /dev/null +++ b/src/com/massivecraft/factions/event/FactionRelationEvent.java @@ -0,0 +1,56 @@ +package com.massivecraft.factions.event; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import com.massivecraft.factions.struct.Rel; +import com.massivecraft.factions.Faction; + + +public class FactionRelationEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + private Faction fsender; + private Faction ftarget; + private Rel foldrel; + private Rel frel; + + public FactionRelationEvent(Faction sender, Faction target, Rel oldrel, Rel rel) + { + fsender = sender; + ftarget = target; + foldrel = oldrel; + frel = rel; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public Rel getOldRelation() + { + return foldrel; + } + + public Rel getRelation() + { + return frel; + } + + public Faction getFaction() + { + return fsender; + } + + public Faction getTargetFaction() + { + return ftarget; + } + +} diff --git a/src/com/massivecraft/factions/event/FactionRenameEvent.java b/src/com/massivecraft/factions/event/FactionRenameEvent.java new file mode 100644 index 00000000..7c111332 --- /dev/null +++ b/src/com/massivecraft/factions/event/FactionRenameEvent.java @@ -0,0 +1,73 @@ +package com.massivecraft.factions.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.Faction; + +public class FactionRenameEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + + private boolean cancelled; + private FPlayer fplayer; + private Faction faction; + private String tag; + + public FactionRenameEvent(FPlayer sender, String newTag) + { + fplayer = sender; + faction = sender.getFaction(); + tag = newTag; + this.cancelled = false; + } + + public Faction getFaction() + { + return(faction); + } + + public FPlayer getFPlayer() + { + return(fplayer); + } + + public Player getPlayer() + { + return(fplayer.getPlayer()); + } + + public String getOldFactionTag() + { + return(faction.getTag()); + } + + public String getFactionTag() + { + return(tag); + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + @Override + public boolean isCancelled() + { + return cancelled; + } + + @Override + public void setCancelled(boolean c) + { + this.cancelled = c; + } +} diff --git a/src/com/massivecraft/factions/event/LandClaimEvent.java b/src/com/massivecraft/factions/event/LandClaimEvent.java index 4d27ce9a..b1216bd8 100644 --- a/src/com/massivecraft/factions/event/LandClaimEvent.java +++ b/src/com/massivecraft/factions/event/LandClaimEvent.java @@ -18,12 +18,12 @@ public class LandClaimEvent extends Event implements Cancellable private FLocation location; private String factionId, playerId; - public LandClaimEvent(FLocation loc, String id, String pid) + public LandClaimEvent(FLocation loc, String fid, String pid) { cancelled = false; location = loc; - factionId = id; - playerId = pid; + this.factionId = fid; + this.playerId = pid; } public HandlerList getHandlers()