Added possibility to specify a player in the /f join command (/f join <faction> [player=you]), to make a player other than yourself join the specified faction. The new permission factions.join.others (added to factions.kit.mod and above) is required to be able to specify a different player.

Note that the player cannot currently already be in another faction; if they are, you'll need to /f kick them first. Also note that if the faction isn't open (with no invitation required), the player isn't invited, and you don't have the factions.join.any permission or have admin bypass mode on, the attempt will also fail.

Also, added new log method which accepts arguments (like the msg method) and cleaned up /f permanent text a little.
This commit is contained in:
Brettflan 2012-02-26 12:29:46 -06:00
parent 503233b916
commit 7138e8d5f8
5 changed files with 55 additions and 23 deletions

View File

@ -32,6 +32,7 @@ permissions:
factions.sethome.any: true factions.sethome.any: true
factions.money.*: true factions.money.*: true
factions.join.any: true factions.join.any: true
factions.join.others: true
factions.admin.any: true factions.admin.any: true
factions.mod.any: true factions.mod.any: true
factions.kit.halfmod: factions.kit.halfmod:
@ -120,6 +121,8 @@ permissions:
description: join a faction description: join a faction
factions.join.any: factions.join.any:
description: join any faction, bypassing invitation process for closed factions 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: factions.kick:
description: kick a player from the faction description: kick a player from the faction
factions.kick.any: factions.kick.any:

View File

@ -2,6 +2,7 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
@ -13,7 +14,7 @@ public class CmdJoin extends FCommand
this.aliases.add("join"); this.aliases.add("join");
this.requiredArgs.add("faction name"); this.requiredArgs.add("faction name");
//this.optionalArgs.put("", ""); this.optionalArgs.put("player", "you");
this.permission = Permission.JOIN.node; this.permission = Permission.JOIN.node;
this.disableOnLock = true; this.disableOnLock = true;
@ -30,54 +31,71 @@ public class CmdJoin extends FCommand
Faction faction = this.argAsFaction(0); Faction faction = this.argAsFaction(0);
if (faction == null) return; 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("<b>You may only join normal factions. This is a system faction."); msg("<b>You do not have permission to move other players into a faction.");
return; return;
} }
if (faction == myFaction) if ( ! faction.isNormal())
{ {
msg("<b>You are already a member of %s", faction.getTag(fme)); msg("<b>Players may only join normal factions. This is a system faction.");
return;
}
if (faction == fplayer.getFaction())
{
msg("<b>%s %s already a member of %s", fplayer.describeTo(fme, true), (samePlayer ? "are" : "is"), faction.getTag(fme));
return; return;
} }
if (Conf.factionMemberLimit > 0 && faction.getFPlayers().size() >= Conf.factionMemberLimit) if (Conf.factionMemberLimit > 0 && faction.getFPlayers().size() >= Conf.factionMemberLimit)
{ {
msg("<b>The faction %s is at the limit of %d members, so you cannot currently join.", faction.getTag(fme)); msg("<b>The faction %s is at the limit of %d members, so %s cannot currently join.", faction.getTag(fme), fplayer.describeTo(fme, false));
return; return;
} }
if (fme.hasFaction()) if (fplayer.hasFaction())
{ {
msg("<b>You must leave your current faction first."); msg("<b>%s must leave %s current faction first.", fplayer.describeTo(fme, true), (samePlayer ? "your" : "their"));
return; return;
} }
if (!Conf.canLeaveWithNegativePower && fme.getPower() < 0) if (!Conf.canLeaveWithNegativePower && fplayer.getPower() < 0)
{ {
msg("<b>You cannot join a faction until your power is positive."); msg("<b>%s cannot join a faction with a negative power level.", fplayer.describeTo(fme, true));
return; 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("<i>This faction requires invitation."); msg("<i>This faction requires invitation.");
faction.msg("%s<i> tried to join your faction.", fme.describeTo(faction, true)); if (samePlayer)
faction.msg("%s<i> tried to join your faction.", fplayer.describeTo(faction, true));
return; return;
} }
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay // 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("<i>You successfully joined %s", faction.getTag(fme)); fme.msg("<i>%s successfully joined %s.", fplayer.describeTo(fme, true), faction.getTag(fme));
faction.msg("<i>%s joined your faction.", fme.describeTo(faction, true)); if (!samePlayer)
fplayer.msg("<i>%s moved you into the faction %s.", fme.describeTo(fplayer, true), faction.getTag(fplayer));
faction.msg("<i>%s joined your faction.", fplayer.describeTo(faction, true));
fme.resetFactionData(); fplayer.resetFactionData();
fme.setFaction(faction); fplayer.setFaction(faction);
faction.deinvite(fme); faction.deinvite(fplayer);
if (Conf.logFactionJoin) 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());
}
} }
} }

View File

@ -44,18 +44,18 @@ public class CmdPermanent extends FCommand
faction.setPermanent(true); faction.setPermanent(true);
} }
P.p.log((fme == null ? "A server admin" : fme.getName())+"<i> has "+change+" the faction \"" + faction.getTag() + "\"."); P.p.log((fme == null ? "A server admin" : fme.getName())+" "+change+" the faction \"" + faction.getTag() + "\".");
// Inform all players // Inform all players
for (FPlayer fplayer : FPlayers.i.getOnline()) for (FPlayer fplayer : FPlayers.i.getOnline())
{ {
if (fplayer.getFaction() == faction) if (fplayer.getFaction() == faction)
{ {
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> has "+change+" your faction."); fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> "+change+" your faction.");
} }
else else
{ {
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> has "+change+" the faction \"" + faction.getTag(fplayer) + "\"."); fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> "+change+" the faction \"" + faction.getTag(fplayer) + "\".");
} }
} }
} }

View File

@ -27,6 +27,7 @@ public enum Permission
INVITE("invite"), INVITE("invite"),
JOIN("join"), JOIN("join"),
JOIN_ANY("join.any"), JOIN_ANY("join.any"),
JOIN_OTHERS("join.others"),
KICK("kick"), KICK("kick"),
KICK_ANY("kick.any"), KICK_ANY("kick.any"),
LEAVE("leave"), LEAVE("leave"),

View File

@ -219,7 +219,17 @@ public abstract class MPlugin extends JavaPlugin
{ {
log(Level.INFO, msg); 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) public void log(Level level, Object msg)
{ {
Logger.getLogger("Minecraft").log(level, "["+this.getDescription().getFullName()+"] "+msg); Logger.getLogger("Minecraft").log(level, "["+this.getDescription().getFullName()+"] "+msg);