diff --git a/plugin.yml b/plugin.yml index cbe0f5e1..3b969038 100644 --- a/plugin.yml +++ b/plugin.yml @@ -32,6 +32,7 @@ permissions: factions.sethome.any: true factions.money.*: true factions.join.any: true + factions.join.others: true factions.admin.any: true factions.mod.any: true factions.kit.halfmod: @@ -120,6 +121,8 @@ permissions: description: join a faction factions.join.any: description: join any faction, bypassing invitation process for closed factions + factions.join.others: + description: specify another player in the join command, to move them to the specified faction factions.kick: description: kick a player from the faction factions.kick.any: diff --git a/src/com/massivecraft/factions/cmd/CmdJoin.java b/src/com/massivecraft/factions/cmd/CmdJoin.java index 3e3d1da7..1677af5f 100644 --- a/src/com/massivecraft/factions/cmd/CmdJoin.java +++ b/src/com/massivecraft/factions/cmd/CmdJoin.java @@ -2,6 +2,7 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.Conf; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.P; import com.massivecraft.factions.struct.Permission; @@ -13,7 +14,7 @@ public class CmdJoin extends FCommand this.aliases.add("join"); this.requiredArgs.add("faction name"); - //this.optionalArgs.put("", ""); + this.optionalArgs.put("player", "you"); this.permission = Permission.JOIN.node; this.disableOnLock = true; @@ -30,54 +31,71 @@ public class CmdJoin extends FCommand Faction faction = this.argAsFaction(0); if (faction == null) return; - if ( ! faction.isNormal()) + FPlayer fplayer = this.argAsBestFPlayerMatch(1, fme, false); + boolean samePlayer = fplayer == fme; + + if (!samePlayer && ! Permission.JOIN_OTHERS.has(sender, false)) { - msg("You may only join normal factions. This is a system faction."); + msg("You do not have permission to move other players into a faction."); return; } - if (faction == myFaction) + if ( ! faction.isNormal()) { - msg("You are already a member of %s", faction.getTag(fme)); + msg("Players may only join normal factions. This is a system faction."); + return; + } + + if (faction == fplayer.getFaction()) + { + msg("%s %s already a member of %s", fplayer.describeTo(fme, true), (samePlayer ? "are" : "is"), faction.getTag(fme)); return; } if (Conf.factionMemberLimit > 0 && faction.getFPlayers().size() >= Conf.factionMemberLimit) { - msg("The faction %s is at the limit of %d members, so you cannot currently join.", faction.getTag(fme)); + msg("The faction %s is at the limit of %d members, so %s cannot currently join.", faction.getTag(fme), fplayer.describeTo(fme, false)); return; } - if (fme.hasFaction()) + if (fplayer.hasFaction()) { - msg("You must leave your current faction first."); + msg("%s must leave %s current faction first.", fplayer.describeTo(fme, true), (samePlayer ? "your" : "their")); return; } - if (!Conf.canLeaveWithNegativePower && fme.getPower() < 0) + if (!Conf.canLeaveWithNegativePower && fplayer.getPower() < 0) { - msg("You cannot join a faction until your power is positive."); + msg("%s cannot join a faction with a negative power level.", fplayer.describeTo(fme, true)); return; } - if( ! (faction.getOpen() || faction.isInvited(fme) || fme.isAdminBypassing() || Permission.JOIN_ANY.has(sender, false))) + if( ! (faction.getOpen() || faction.isInvited(fplayer) || fme.isAdminBypassing() || Permission.JOIN_ANY.has(sender, false))) { msg("This faction requires invitation."); - faction.msg("%s tried to join your faction.", fme.describeTo(faction, true)); + if (samePlayer) + faction.msg("%s tried to join your faction.", fplayer.describeTo(faction, true)); 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.econCostJoin, "to join a faction", "for joining a faction")) return; + if (samePlayer && ! payForCommand(Conf.econCostJoin, "to join a faction", "for joining a faction")) return; - fme.msg("You successfully joined %s", faction.getTag(fme)); - faction.msg("%s joined your faction.", fme.describeTo(faction, true)); + fme.msg("%s successfully joined %s.", fplayer.describeTo(fme, true), faction.getTag(fme)); + if (!samePlayer) + fplayer.msg("%s moved you into the faction %s.", fme.describeTo(fplayer, true), faction.getTag(fplayer)); + faction.msg("%s joined your faction.", fplayer.describeTo(faction, true)); - fme.resetFactionData(); - fme.setFaction(faction); - faction.deinvite(fme); + fplayer.resetFactionData(); + fplayer.setFaction(faction); + faction.deinvite(fplayer); if (Conf.logFactionJoin) - P.p.log(fme.getName()+" joined the faction: "+faction.getTag()); + { + if (samePlayer) + P.p.log("%s joined the faction %s.", fplayer.getName(), faction.getTag()); + else + P.p.log("%s moved the player %s into the faction %s.", fme.getName(), fplayer.getName(), faction.getTag()); + } } } diff --git a/src/com/massivecraft/factions/cmd/CmdPermanent.java b/src/com/massivecraft/factions/cmd/CmdPermanent.java index 36c23bc3..fd6efcc2 100644 --- a/src/com/massivecraft/factions/cmd/CmdPermanent.java +++ b/src/com/massivecraft/factions/cmd/CmdPermanent.java @@ -44,18 +44,18 @@ public class CmdPermanent extends FCommand faction.setPermanent(true); } - P.p.log((fme == null ? "A server admin" : fme.getName())+" has "+change+" the faction \"" + faction.getTag() + "\"."); + P.p.log((fme == null ? "A server admin" : fme.getName())+" "+change+" the faction \"" + faction.getTag() + "\"."); // Inform all players for (FPlayer fplayer : FPlayers.i.getOnline()) { if (fplayer.getFaction() == faction) { - fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+" has "+change+" your faction."); + fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+" "+change+" your faction."); } else { - fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+" has "+change+" the faction \"" + faction.getTag(fplayer) + "\"."); + fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+" "+change+" the faction \"" + faction.getTag(fplayer) + "\"."); } } } diff --git a/src/com/massivecraft/factions/struct/Permission.java b/src/com/massivecraft/factions/struct/Permission.java index f03e4ae1..e5a501b9 100644 --- a/src/com/massivecraft/factions/struct/Permission.java +++ b/src/com/massivecraft/factions/struct/Permission.java @@ -27,6 +27,7 @@ public enum Permission INVITE("invite"), JOIN("join"), JOIN_ANY("join.any"), + JOIN_OTHERS("join.others"), KICK("kick"), KICK_ANY("kick.any"), LEAVE("leave"), diff --git a/src/com/massivecraft/factions/zcore/MPlugin.java b/src/com/massivecraft/factions/zcore/MPlugin.java index 4955a75d..5e246a7a 100644 --- a/src/com/massivecraft/factions/zcore/MPlugin.java +++ b/src/com/massivecraft/factions/zcore/MPlugin.java @@ -219,7 +219,17 @@ public abstract class MPlugin extends JavaPlugin { log(Level.INFO, msg); } - + + public void log(String str, Object... args) + { + log(Level.INFO, this.txt.parse(str, args)); + } + + public void log(Level level, String str, Object... args) + { + log(level, this.txt.parse(str, args)); + } + public void log(Level level, Object msg) { Logger.getLogger("Minecraft").log(level, "["+this.getDescription().getFullName()+"] "+msg);