Fix Essentials /sethome to more strictly obey home limits.

This commit is contained in:
KHobbits 2012-09-15 19:55:12 +01:00
parent cc0a65bace
commit a2886d76d2
4 changed files with 48 additions and 55 deletions

View File

@ -54,19 +54,21 @@ public class Settings implements ISettings
@Override @Override
public int getHomeLimit(final User user) public int getHomeLimit(final User user)
{ {
final Set<String> homeList = getMultipleHomes(); int limit = 1;
if (homeList == null) if (user.isAuthorized("essentials.sethome.multiple"))
{ {
//TODO: Replace this code to remove backwards compat, after settings are automatically updated limit = getHomeLimit("default");
// return getHomeLimit("default");
return config.getInt("multiple-homes", 5);
} }
int limit = getHomeLimit("default");
for (String set : homeList) final Set<String> homeList = getMultipleHomes();
if (homeList != null)
{ {
if (user.isAuthorized("essentials.sethome.multiple." + set) && (limit < getHomeLimit(set))) for (String set : homeList)
{ {
limit = getHomeLimit(set); if (user.isAuthorized("essentials.sethome.multiple." + set) && (limit < getHomeLimit(set)))
{
limit = getHomeLimit(set);
}
} }
} }
return limit; return limit;
@ -530,7 +532,6 @@ public class Settings implements ISettings
} }
return newSigns; return newSigns;
} }
private boolean warnOnBuildDisallow; private boolean warnOnBuildDisallow;
private boolean _warnOnBuildDisallow() private boolean _warnOnBuildDisallow()

View File

@ -248,16 +248,6 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
return getHome(getHomes().get(0)); return getHome(getHomes().get(0));
} }
public void setHome()
{
setHome("home", getLocation());
}
public void setHome(final String name)
{
setHome(name, getLocation());
}
@Override @Override
public void setLastLocation() public void setLastLocation()
{ {

View File

@ -3,6 +3,7 @@ package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._; import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User; import com.earth2me.essentials.User;
import java.util.Locale; import java.util.Locale;
import org.bukkit.Location;
import org.bukkit.Server; import org.bukkit.Server;
@ -16,6 +17,10 @@ public class Commandsethome extends EssentialsCommand
@Override @Override
public void run(final Server server, final User user, final String commandLabel, String[] args) throws Exception public void run(final Server server, final User user, final String commandLabel, String[] args) throws Exception
{ {
User usersHome = user;
String name = "home";
final Location location = user.getLocation();
if (args.length > 0) if (args.length > 0)
{ {
//Allowing both formats /sethome khobbits house | /sethome khobbits:house //Allowing both formats /sethome khobbits house | /sethome khobbits:house
@ -27,33 +32,13 @@ public class Commandsethome extends EssentialsCommand
if (args.length < 2) if (args.length < 2)
{ {
if (user.isAuthorized("essentials.sethome.multiple")) name = args[0].toLowerCase(Locale.ENGLISH);
{
if ("bed".equals(args[0].toLowerCase(Locale.ENGLISH)))
{
throw new NotEnoughArgumentsException();
}
if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getSettings().getHomeLimit(user))
|| (user.getHomes().contains(args[0].toLowerCase(Locale.ENGLISH))))
{
user.setHome(args[0].toLowerCase(Locale.ENGLISH));
}
else
{
throw new Exception(_("maxHomes", ess.getSettings().getHomeLimit(user)));
}
}
else
{
throw new Exception(_("maxHomes", 1));
}
} }
else else
{ {
if (user.isAuthorized("essentials.sethome.others")) if (user.isAuthorized("essentials.sethome.others"))
{ {
User usersHome = ess.getUser(ess.getServer().getPlayer(args[0])); usersHome = ess.getUser(ess.getServer().getPlayer(args[0]));
if (usersHome == null) if (usersHome == null)
{ {
usersHome = ess.getOfflineUser(args[0]); usersHome = ess.getOfflineUser(args[0]);
@ -62,24 +47,41 @@ public class Commandsethome extends EssentialsCommand
{ {
throw new Exception(_("playerNotFound")); throw new Exception(_("playerNotFound"));
} }
String name = args[1].toLowerCase(Locale.ENGLISH); name = args[1].toLowerCase(Locale.ENGLISH);
if (!user.isAuthorized("essentials.sethome.multiple"))
{
name = "home";
}
if ("bed".equals(name.toLowerCase(Locale.ENGLISH)))
{
throw new NotEnoughArgumentsException();
}
usersHome.setHome(name, user.getLocation());
} }
} }
} }
else if (checkHomeLimit(user, usersHome, name))
{ {
user.setHome(); name = "home";
} }
if ("bed".equals(name))
{
throw new NotEnoughArgumentsException();
}
usersHome.setHome(name, location);
user.sendMessage(_("homeSet", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ())); user.sendMessage(_("homeSet", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ()));
} }
private boolean checkHomeLimit(final User user, final User usersHome, String name) throws Exception
{
if (!user.isAuthorized("essentials.sethome.multiple.unlimited"))
{
int limit = ess.getSettings().getHomeLimit(user);
if (usersHome.getHomes().size() == limit && usersHome.getHomes().contains(name))
{
return false;
}
if (usersHome.getHomes().size() >= limit)
{
throw new Exception(_("maxHomes", ess.getSettings().getHomeLimit(user)));
}
if (limit == 1)
{
return true;
}
}
return false;
}
} }

View File

@ -51,7 +51,7 @@ public class UserTest extends TestCase
{ {
User user = ess.getUser(base1); User user = ess.getUser(base1);
Location loc = base1.getLocation(); Location loc = base1.getLocation();
user.setHome(); user.setHome("home", loc);
OfflinePlayer base2 = server.createPlayer(base1.getName(), ess); OfflinePlayer base2 = server.createPlayer(base1.getName(), ess);
User user2 = ess.getUser(base2); User user2 = ess.getUser(base2);