diff --git a/plugin.yml b/plugin.yml index e646a23f..9846e19f 100644 --- a/plugin.yml +++ b/plugin.yml @@ -27,6 +27,7 @@ permissions: factions.flag.set: true factions.powerboost: true factions.join.any: true + factions.join.others: true factions.leader.any: true factions.officer.any: true factions.kit.halfmod: @@ -109,6 +110,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.leader: diff --git a/src/com/massivecraft/factions/cmd/CmdJoin.java b/src/com/massivecraft/factions/cmd/CmdJoin.java index 4870c567..4527430e 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"); - //this.optionalArgs.put("", ""); + this.optionalArgs.put("player", "you"); this.permission = Permission.JOIN.node; this.disableOnLock = true; @@ -30,54 +31,65 @@ public class CmdJoin extends FCommand Faction faction = this.argAsFaction(0); if (faction == null) return; - /*if ( ! faction.isNormal()) - { - msg("You may only join normal factions. This is a system faction."); - return; - }*/ + FPlayer fplayer = this.argAsBestFPlayerMatch(1, fme, false); + boolean samePlayer = fplayer == fme; - if (faction == myFaction) + if (!samePlayer && ! Permission.JOIN_OTHERS.has(sender, false)) { - msg("You are already a member of %s", faction.getTag(fme)); + msg("You do not have permission to move other players into a 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.hasAdminMode() || Permission.JOIN_ANY.has(sender, false))) + if( ! (faction.getOpen() || faction.isInvited(fplayer) || fme.hasAdminMode() || 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/struct/Permission.java b/src/com/massivecraft/factions/struct/Permission.java index 9c31b226..d106ff65 100644 --- a/src/com/massivecraft/factions/struct/Permission.java +++ b/src/com/massivecraft/factions/struct/Permission.java @@ -22,6 +22,7 @@ public enum Permission INVITE("invite"), JOIN("join"), JOIN_ANY("join.any"), + JOIN_OTHERS("join.others"), KICK("kick"), LEADER("leader"), LEADER_ANY("leader.any"), diff --git a/src/com/massivecraft/factions/zcore/MPlugin.java b/src/com/massivecraft/factions/zcore/MPlugin.java index 1fc362cd..b5254da5 100644 --- a/src/com/massivecraft/factions/zcore/MPlugin.java +++ b/src/com/massivecraft/factions/zcore/MPlugin.java @@ -216,7 +216,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);