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
public int getHomeLimit(final User user)
{
final Set<String> homeList = getMultipleHomes();
if (homeList == null)
int limit = 1;
if (user.isAuthorized("essentials.sethome.multiple"))
{
//TODO: Replace this code to remove backwards compat, after settings are automatically updated
// return getHomeLimit("default");
return config.getInt("multiple-homes", 5);
limit = getHomeLimit("default");
}
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;
@ -530,7 +532,6 @@ public class Settings implements ISettings
}
return newSigns;
}
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));
}
public void setHome()
{
setHome("home", getLocation());
}
public void setHome(final String name)
{
setHome(name, getLocation());
}
@Override
public void setLastLocation()
{

View File

@ -3,6 +3,7 @@ package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User;
import java.util.Locale;
import org.bukkit.Location;
import org.bukkit.Server;
@ -16,6 +17,10 @@ public class Commandsethome extends EssentialsCommand
@Override
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)
{
//Allowing both formats /sethome khobbits house | /sethome khobbits:house
@ -27,33 +32,13 @@ public class Commandsethome extends EssentialsCommand
if (args.length < 2)
{
if (user.isAuthorized("essentials.sethome.multiple"))
{
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));
}
name = args[0].toLowerCase(Locale.ENGLISH);
}
else
{
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)
{
usersHome = ess.getOfflineUser(args[0]);
@ -62,24 +47,41 @@ public class Commandsethome extends EssentialsCommand
{
throw new Exception(_("playerNotFound"));
}
String 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());
name = args[1].toLowerCase(Locale.ENGLISH);
}
}
}
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()));
}
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);
Location loc = base1.getLocation();
user.setHome();
user.setHome("home", loc);
OfflinePlayer base2 = server.createPlayer(base1.getName(), ess);
User user2 = ess.getUser(base2);