package com.massivecraft.factions.cmd; import java.util.List; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import com.massivecraft.factions.ConfServer; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayerColl; import com.massivecraft.factions.Faction; import com.massivecraft.factions.FactionColl; import com.massivecraft.factions.Factions; import com.massivecraft.factions.struct.FFlag; import com.massivecraft.factions.struct.FPerm; import com.massivecraft.factions.struct.Rel; import com.massivecraft.factions.zcore.MCommand; public abstract class FCommand extends MCommand { public boolean disableOnLock; public FPlayer fme; public Faction myFaction; public boolean senderMustBeMember; public boolean senderMustBeOfficer; public boolean senderMustBeLeader; public boolean isMoneyCommand; public FCommand() { super(Factions.get()); // Due to safety reasons it defaults to disable on lock. disableOnLock = true; // The money commands must be disabled if money should not be used. isMoneyCommand = false; senderMustBeMember = false; senderMustBeOfficer = false; senderMustBeLeader = false; } @Override public void execute(CommandSender sender, List args, List> commandChain) { if (sender instanceof Player) { this.fme = FPlayerColl.i.get((Player)sender); this.myFaction = this.fme.getFaction(); } else { this.fme = null; this.myFaction = null; } super.execute(sender, args, commandChain); } @Override public boolean isEnabled() { if (p.getLocked() && this.disableOnLock) { msg("Factions was locked by an admin. Please try again later."); return false; } if (this.isMoneyCommand && ! ConfServer.econEnabled) { msg("Faction economy features are disabled on this server."); return false; } if (this.isMoneyCommand && ! ConfServer.bankEnabled) { msg("The faction bank system is disabled on this server."); return false; } return true; } @Override public boolean validSenderType(CommandSender sender, boolean informSenderIfNot) { boolean superValid = super.validSenderType(sender, informSenderIfNot); if ( ! superValid) return false; if ( ! (this.senderMustBeMember || this.senderMustBeOfficer || this.senderMustBeLeader)) return true; if ( ! (sender instanceof Player)) return false; FPlayer fplayer = FPlayerColl.i.get((Player)sender); if ( ! fplayer.hasFaction()) { sender.sendMessage(p.txt.parse("You are not member of any faction.")); return false; } if (this.senderMustBeOfficer && ! fplayer.getRole().isAtLeast(Rel.OFFICER)) { sender.sendMessage(p.txt.parse("Only faction moderators can %s.", this.getHelpShort())); return false; } if (this.senderMustBeLeader && ! fplayer.getRole().isAtLeast(Rel.LEADER)) { sender.sendMessage(p.txt.parse("Only faction admins can %s.", this.getHelpShort())); return false; } return true; } // -------------------------------------------- // // Assertions // -------------------------------------------- // public boolean assertHasFaction() { if (me == null) return true; if ( ! fme.hasFaction()) { sendMessage("You are not member of any faction."); return false; } return true; } public boolean assertMinRole(Rel role) { if (me == null) return true; if (fme.getRole().isLessThan(role)) { msg("You must be "+role+" to "+this.getHelpShort()+"."); return false; } return true; } // -------------------------------------------- // // Argument Readers // -------------------------------------------- // // FPLAYER ====================== public FPlayer strAsFPlayer(String name, FPlayer def, boolean msg) { FPlayer ret = def; if (name != null) { FPlayer fplayer = FPlayerColl.i.get(name); if (fplayer != null) { ret = fplayer; } } if (msg && ret == null) { this.msg("No player \"

%s\" could be found.", name); } return ret; } public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg) { return this.strAsFPlayer(this.argAsString(idx), def, msg); } public FPlayer argAsFPlayer(int idx, FPlayer def) { return this.argAsFPlayer(idx, def, true); } public FPlayer argAsFPlayer(int idx) { return this.argAsFPlayer(idx, null); } // BEST FPLAYER MATCH ====================== public FPlayer strAsBestFPlayerMatch(String name, FPlayer def, boolean msg) { FPlayer ret = def; if (name != null) { FPlayer fplayer = FPlayerColl.i.getBestIdMatch(name); if (fplayer != null) { ret = fplayer; } } if (msg && ret == null) { this.msg("No player match found for \"

%s\".", name); } return ret; } public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg) { return this.strAsBestFPlayerMatch(this.argAsString(idx), def, msg); } public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def) { return this.argAsBestFPlayerMatch(idx, def, true); } public FPlayer argAsBestFPlayerMatch(int idx) { return this.argAsBestFPlayerMatch(idx, null); } // FACTION ====================== public Faction strAsFaction(String name, Faction def, boolean msg) { Faction ret = def; if (name != null) { Faction faction = null; // First we try an exact match if (faction == null) { faction = FactionColl.i.getByTag(name); } // Next we match faction tags if (faction == null) { faction = FactionColl.i.getBestTagMatch(name); } // Next we match player names if (faction == null) { FPlayer fplayer = FPlayerColl.i.getBestIdMatch(name); if (fplayer != null) { faction = fplayer.getFaction(); } } if (faction != null) { ret = faction; } } if (msg && ret == null) { this.msg("The faction or player \"

%s\" could not be found.", name); } return ret; } public Faction argAsFaction(int idx, Faction def, boolean msg) { return this.strAsFaction(this.argAsString(idx), def, msg); } public Faction argAsFaction(int idx, Faction def) { return this.argAsFaction(idx, def, true); } public Faction argAsFaction(int idx) { return this.argAsFaction(idx, null); } // FACTION FLAG ====================== public FFlag strAsFactionFlag(String name, FFlag def, boolean msg) { FFlag ret = def; if (name != null) { FFlag flag = FFlag.parse(name); if (flag != null) { ret = flag; } } if (msg && ret == null) { this.msg("The faction-flag \"

%s\" could not be found.", name); } return ret; } public FFlag argAsFactionFlag(int idx, FFlag def, boolean msg) { return this.strAsFactionFlag(this.argAsString(idx), def, msg); } public FFlag argAsFactionFlag(int idx, FFlag def) { return this.argAsFactionFlag(idx, def, true); } public FFlag argAsFactionFlag(int idx) { return this.argAsFactionFlag(idx, null); } // FACTION PERM ====================== public FPerm strAsFactionPerm(String name, FPerm def, boolean msg) { FPerm ret = def; if (name != null) { FPerm perm = FPerm.parse(name); if (perm != null) { ret = perm; } } if (msg && ret == null) { this.msg("The faction-perm \"

%s\" could not be found.", name); } return ret; } public FPerm argAsFactionPerm(int idx, FPerm def, boolean msg) { return this.strAsFactionPerm(this.argAsString(idx), def, msg); } public FPerm argAsFactionPerm(int idx, FPerm def) { return this.argAsFactionPerm(idx, def, true); } public FPerm argAsFactionPerm(int idx) { return this.argAsFactionPerm(idx, null); } // FACTION REL ====================== public Rel strAsRel(String name, Rel def, boolean msg) { Rel ret = def; if (name != null) { Rel perm = Rel.parse(name); if (perm != null) { ret = perm; } } if (msg && ret == null) { this.msg("The role \"

%s\" could not be found.", name); } return ret; } public Rel argAsRel(int idx, Rel def, boolean msg) { return this.strAsRel(this.argAsString(idx), def, msg); } public Rel argAsRel(int idx, Rel def) { return this.argAsRel(idx, def, true); } public Rel argAsRel(int idx) { return this.argAsRel(idx, null); } // -------------------------------------------- // // Commonly used logic // -------------------------------------------- // public boolean canIAdministerYou(FPlayer i, FPlayer you) { if ( ! i.getFaction().equals(you.getFaction())) { i.sendMessage(p.txt.parse("%s is not in the same faction as you.",you.describeTo(i, true))); return false; } if (i.getRole().isMoreThan(you.getRole()) || i.getRole().equals(Rel.LEADER) ) { return true; } if (you.getRole().equals(Rel.LEADER)) { i.sendMessage(p.txt.parse("Only the faction admin can do that.")); } else if (i.getRole().equals(Rel.OFFICER)) { if ( i == you ) { return true; //Moderators can control themselves } else { i.sendMessage(p.txt.parse("Moderators can't control each other...")); } } else { i.sendMessage(p.txt.parse("You must be a faction moderator to do that.")); } return false; } // if economy is enabled and they're not on the bypass list, make 'em pay; returns true unless person can't afford the cost public boolean payForCommand(double cost, String toDoThis, String forDoingThis) { if ( ! Econ.shouldBeUsed() || this.fme == null || cost == 0.0 || fme.hasAdminMode()) return true; if(ConfServer.bankEnabled && ConfServer.bankFactionPaysCosts && fme.hasFaction()) return Econ.modifyMoney(myFaction, -cost, toDoThis, forDoingThis); else return Econ.modifyMoney(fme, -cost, toDoThis, forDoingThis); } // like above, but just make sure they can pay; returns true unless person can't afford the cost public boolean canAffordCommand(double cost, String toDoThis) { if ( ! Econ.shouldBeUsed() || this.fme == null || cost == 0.0 || fme.hasAdminMode()) return true; if(ConfServer.bankEnabled && ConfServer.bankFactionPaysCosts && fme.hasFaction()) return Econ.hasAtLeast(myFaction, cost, toDoThis); else return Econ.hasAtLeast(fme, cost, toDoThis); } }