1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-09-25 21:59:08 +02:00

Added multiple homes.

Permissions currently: essentials.sethome.multiple and essentials.sethome.multiple.unlimited
New config setting: multiple-homes (default value 5)
This commit is contained in:
KHobbits
2011-08-23 03:42:32 +01:00
parent 1138e32292
commit 0592c1fe11
10 changed files with 206 additions and 116 deletions

View File

@@ -287,12 +287,12 @@ public class EssentialsUpgrade
} }
if (world != null) if (world != null)
{ {
user.setHome(new Location(world, user.setHome("home", new Location(world,
((Number)vals.get(0)).doubleValue(), ((Number)vals.get(0)).doubleValue(),
((Number)vals.get(1)).doubleValue(), ((Number)vals.get(1)).doubleValue(),
((Number)vals.get(2)).doubleValue(), ((Number)vals.get(2)).doubleValue(),
((Number)vals.get(3)).floatValue(), ((Number)vals.get(3)).floatValue(),
((Number)vals.get(4)).floatValue()), true); ((Number)vals.get(4)).floatValue()));
} }
} }
} }
@@ -513,5 +513,6 @@ public class EssentialsUpgrade
moveUsersDataToUserdataFolder(); moveUsersDataToUserdataFolder();
convertWarps(); convertWarps();
updateUsersPowerToolsFormat(); updateUsersPowerToolsFormat();
//TODO: Convert 2.5.7 homes to new format
} }
} }

View File

@@ -72,6 +72,8 @@ public interface ISettings extends IConf
boolean getReclaimSetting(); boolean getReclaimSetting();
boolean getRespawnAtHome(); boolean getRespawnAtHome();
int getMultipleHomes();
boolean getSortListByGroups(); boolean getSortListByGroups();

View File

@@ -45,7 +45,9 @@ public interface IUser
void setLastLocation(); void setLastLocation();
Location getHome(Location location); Location getHome(String name);
Location getHome(Location loc);
String getName(); String getName();

View File

@@ -30,6 +30,12 @@ public class Settings implements ISettings
{ {
return config.getBoolean("respawn-at-home", false); return config.getBoolean("respawn-at-home", false);
} }
@Override
public int getMultipleHomes()
{
return config.getInt("multiple-homes", 5);
}
@Override @Override
public boolean getBedSetsHome() public boolean getBedSetsHome()

View File

@@ -10,6 +10,8 @@ import org.bukkit.entity.Entity;
public class Teleport implements Runnable public class Teleport implements Runnable
{ {
private static final double MOVE_CONSTANT = 0.3; private static final double MOVE_CONSTANT = 0.3;
private static class Target private static class Target
{ {
private final Location location; private final Location location;
@@ -57,9 +59,9 @@ public class Teleport implements Runnable
this.started = System.currentTimeMillis(); this.started = System.currentTimeMillis();
this.delay = delay; this.delay = delay;
this.health = user.getHealth(); this.health = user.getHealth();
this.initX = Math.round(user.getLocation().getX()*MOVE_CONSTANT); this.initX = Math.round(user.getLocation().getX() * MOVE_CONSTANT);
this.initY = Math.round(user.getLocation().getY()*MOVE_CONSTANT); this.initY = Math.round(user.getLocation().getY() * MOVE_CONSTANT);
this.initZ = Math.round(user.getLocation().getZ()*MOVE_CONSTANT); this.initZ = Math.round(user.getLocation().getZ() * MOVE_CONSTANT);
this.teleportTarget = target; this.teleportTarget = target;
this.chargeFor = chargeFor; this.chargeFor = chargeFor;
} }
@@ -72,9 +74,9 @@ public class Teleport implements Runnable
cancel(); cancel();
return; return;
} }
if (Math.round(user.getLocation().getX()*MOVE_CONSTANT) != initX if (Math.round(user.getLocation().getX() * MOVE_CONSTANT) != initX
|| Math.round(user.getLocation().getY()*MOVE_CONSTANT) != initY || Math.round(user.getLocation().getY() * MOVE_CONSTANT) != initY
|| Math.round(user.getLocation().getZ()*MOVE_CONSTANT) != initZ || Math.round(user.getLocation().getZ() * MOVE_CONSTANT) != initZ
|| user.getHealth() < health) || user.getHealth() < health)
{ // user moved, cancel teleport { // user moved, cancel teleport
cancel(true); cancel(true);
@@ -92,7 +94,7 @@ public class Teleport implements Runnable
user.sendMessage(Util.i18n("teleportationCommencing")); user.sendMessage(Util.i18n("teleportationCommencing"));
try try
{ {
now(teleportTarget); now(teleportTarget);
if (chargeFor != null) if (chargeFor != null)
{ {
@@ -229,7 +231,7 @@ public class Teleport implements Runnable
cooldown(false); cooldown(false);
now(new Target(loc)); now(new Target(loc));
} }
public void now(Location loc, Trade chargeFor) throws Exception public void now(Location loc, Trade chargeFor) throws Exception
{ {
cooldown(false); cooldown(false);
@@ -261,9 +263,19 @@ public class Teleport implements Runnable
home(user, chargeFor); home(user, chargeFor);
} }
public void home(String home, Trade chargeFor) throws Exception
{
home(user, home, chargeFor);
}
public void home(IUser user, Trade chargeFor) throws Exception public void home(IUser user, Trade chargeFor) throws Exception
{ {
Location loc = user.getHome(this.user.getLocation()); home(user, "0", chargeFor);
}
public void home(IUser user, String home, Trade chargeFor) throws Exception
{
final Location loc = user.getHome(home);
if (loc == null) if (loc == null)
{ {
if (ess.getSettings().spawnIfNoHome()) if (ess.getSettings().spawnIfNoHome())

View File

@@ -6,6 +6,7 @@ import java.util.Calendar;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -20,44 +21,44 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
private final Teleport teleport; private final Teleport teleport;
private long lastActivity; private long lastActivity;
private boolean hidden = false; private boolean hidden = false;
User(Player base, IEssentials ess) User(Player base, IEssentials ess)
{ {
super(base, ess); super(base, ess);
teleport = new Teleport(this, ess); teleport = new Teleport(this, ess);
} }
User update(Player base) User update(Player base)
{ {
setBase(base); setBase(base);
return this; return this;
} }
public boolean isAuthorized(IEssentialsCommand cmd) public boolean isAuthorized(IEssentialsCommand cmd)
{ {
return isAuthorized(cmd, "essentials."); return isAuthorized(cmd, "essentials.");
} }
public boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix) public boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix)
{ {
return isAuthorized(permissionPrefix + (cmd.getName().equals("r") ? "msg" : cmd.getName())); return isAuthorized(permissionPrefix + (cmd.getName().equals("r") ? "msg" : cmd.getName()));
} }
public boolean isAuthorized(String node) public boolean isAuthorized(String node)
{ {
if (isOp()) if (isOp())
{ {
return true; return true;
} }
if (isJailed()) if (isJailed())
{ {
return false; return false;
} }
return ess.getPermissionsHandler().hasPermission(this, node); return ess.getPermissionsHandler().hasPermission(this, node);
} }
public void healCooldown() throws Exception public void healCooldown() throws Exception
{ {
Calendar now = new GregorianCalendar(); Calendar now = new GregorianCalendar();
@@ -75,12 +76,12 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
} }
setLastHealTimestamp(now.getTimeInMillis()); setLastHealTimestamp(now.getTimeInMillis());
} }
public void giveMoney(double value) public void giveMoney(double value)
{ {
giveMoney(value, null); giveMoney(value, null);
} }
public void giveMoney(double value, CommandSender initiator) public void giveMoney(double value, CommandSender initiator)
{ {
if (value == 0) if (value == 0)
@@ -94,7 +95,7 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
initiator.sendMessage((Util.format("addedToOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName()))); initiator.sendMessage((Util.format("addedToOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName())));
} }
} }
public void payUser(User reciever, double value) throws Exception public void payUser(User reciever, double value) throws Exception
{ {
if (value == 0) if (value == 0)
@@ -113,12 +114,12 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
reciever.sendMessage(Util.format("moneyRecievedFrom", Util.formatCurrency(value, ess), getDisplayName())); reciever.sendMessage(Util.format("moneyRecievedFrom", Util.formatCurrency(value, ess), getDisplayName()));
} }
} }
public void takeMoney(double value) public void takeMoney(double value)
{ {
takeMoney(value, null); takeMoney(value, null);
} }
public void takeMoney(double value, CommandSender initiator) public void takeMoney(double value, CommandSender initiator)
{ {
if (value == 0) if (value == 0)
@@ -132,43 +133,43 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
initiator.sendMessage((Util.format("takenFromOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName()))); initiator.sendMessage((Util.format("takenFromOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName())));
} }
} }
public boolean canAfford(double cost) public boolean canAfford(double cost)
{ {
double mon = getMoney(); double mon = getMoney();
return mon >= cost || isAuthorized("essentials.eco.loan"); return mon >= cost || isAuthorized("essentials.eco.loan");
} }
public void dispose() public void dispose()
{ {
this.base = new OfflinePlayer(getName(), ess); this.base = new OfflinePlayer(getName(), ess);
} }
public boolean getJustPortaled() public boolean getJustPortaled()
{ {
return justPortaled; return justPortaled;
} }
public void setJustPortaled(boolean value) public void setJustPortaled(boolean value)
{ {
justPortaled = value; justPortaled = value;
} }
public void setReplyTo(CommandSender user) public void setReplyTo(CommandSender user)
{ {
replyTo = user; replyTo = user;
} }
public CommandSender getReplyTo() public CommandSender getReplyTo()
{ {
return replyTo; return replyTo;
} }
public int compareTo(User t) public int compareTo(User t)
{ {
return ChatColor.stripColor(this.getDisplayName()).compareToIgnoreCase(ChatColor.stripColor(t.getDisplayName())); return ChatColor.stripColor(this.getDisplayName()).compareToIgnoreCase(ChatColor.stripColor(t.getDisplayName()));
} }
@Override @Override
public boolean equals(Object o) public boolean equals(Object o)
{ {
@@ -177,51 +178,56 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
return false; return false;
} }
return ChatColor.stripColor(this.getDisplayName()).equalsIgnoreCase(ChatColor.stripColor(((User)o).getDisplayName())); return ChatColor.stripColor(this.getDisplayName()).equalsIgnoreCase(ChatColor.stripColor(((User)o).getDisplayName()));
} }
@Override @Override
public int hashCode() public int hashCode()
{ {
return ChatColor.stripColor(this.getDisplayName()).hashCode(); return ChatColor.stripColor(this.getDisplayName()).hashCode();
} }
public Boolean canSpawnItem(int itemId) public Boolean canSpawnItem(int itemId)
{ {
return !ess.getSettings().itemSpawnBlacklist().contains(itemId); return !ess.getSettings().itemSpawnBlacklist().contains(itemId);
} }
public Location getHome()
{
return getHome(getHomes().get(0));
}
public void setHome() public void setHome()
{ {
setHome(getLocation(), true); setHome("home", getLocation());
} }
public void setHome(boolean defaultHome) public void setHome(String name)
{ {
setHome(getLocation(), defaultHome); setHome(name, getLocation());
} }
public void setLastLocation() public void setLastLocation()
{ {
setLastLocation(getLocation()); setLastLocation(getLocation());
} }
public void requestTeleport(User player, boolean here) public void requestTeleport(User player, boolean here)
{ {
teleportRequester = player; teleportRequester = player;
teleportRequestHere = here; teleportRequestHere = here;
} }
public User getTeleportRequest() public User getTeleportRequest()
{ {
return teleportRequester; return teleportRequester;
} }
public boolean isTeleportRequestHere() public boolean isTeleportRequestHere()
{ {
return teleportRequestHere; return teleportRequestHere;
} }
public String getNick() public String getNick()
{ {
final StringBuilder nickname = new StringBuilder(); final StringBuilder nickname = new StringBuilder();
@@ -245,12 +251,12 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
{ {
} }
} }
if (ess.getSettings().addPrefixSuffix()) if (ess.getSettings().addPrefixSuffix())
{ {
final String prefix = ess.getPermissionsHandler().getPrefix(this).replace('&', '§').replace("{WORLDNAME}", this.getWorld().getName()); final String prefix = ess.getPermissionsHandler().getPrefix(this).replace('&', '§').replace("{WORLDNAME}", this.getWorld().getName());
final String suffix = ess.getPermissionsHandler().getSuffix(this).replace('&', '§').replace("{WORLDNAME}", this.getWorld().getName()); final String suffix = ess.getPermissionsHandler().getSuffix(this).replace('&', '§').replace("{WORLDNAME}", this.getWorld().getName());
nickname.insert(0, prefix); nickname.insert(0, prefix);
nickname.append(suffix); nickname.append(suffix);
if (suffix.length() < 2 || !suffix.substring(suffix.length() - 2, suffix.length() - 1).equals("§")) if (suffix.length() < 2 || !suffix.substring(suffix.length() - 2, suffix.length() - 1).equals("§"))
@@ -258,25 +264,25 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
nickname.append("§f"); nickname.append("§f");
} }
} }
return nickname.toString(); return nickname.toString();
} }
public Teleport getTeleport() public Teleport getTeleport()
{ {
return teleport; return teleport;
} }
public long getLastActivity() public long getLastActivity()
{ {
return lastActivity; return lastActivity;
} }
public void setLastActivity(long timestamp) public void setLastActivity(long timestamp)
{ {
lastActivity = timestamp; lastActivity = timestamp;
} }
@Override @Override
public double getMoney() public double getMoney()
{ {
@@ -298,7 +304,7 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
} }
return super.getMoney(); return super.getMoney();
} }
@Override @Override
public void setMoney(double value) public void setMoney(double value)
{ {
@@ -320,14 +326,14 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
} }
super.setMoney(value); super.setMoney(value);
} }
@Override @Override
public void setAfk(boolean set) public void setAfk(boolean set)
{ {
this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : set); this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : set);
super.setAfk(set); super.setAfk(set);
} }
@Override @Override
public boolean toggleAfk() public boolean toggleAfk()
{ {
@@ -335,17 +341,17 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : now); this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : now);
return now; return now;
} }
public boolean isHidden() public boolean isHidden()
{ {
return hidden; return hidden;
} }
public void setHidden(boolean hidden) public void setHidden(boolean hidden)
{ {
this.hidden = hidden; this.hidden = hidden;
} }
public void checkJailTimeout(final long currentTime) public void checkJailTimeout(final long currentTime)
{ {
if (getJailTimeout() > 0 && getJailTimeout() < currentTime && isJailed()) if (getJailTimeout() > 0 && getJailTimeout() < currentTime && isJailed())
@@ -363,7 +369,7 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
} }
} }
} }
public void checkMuteTimeout(final long currentTime) public void checkMuteTimeout(final long currentTime)
{ {
if (getMuteTimeout() > 0 && getMuteTimeout() < currentTime && isMuted()) if (getMuteTimeout() > 0 && getMuteTimeout() < currentTime && isMuted())
@@ -373,7 +379,7 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
setMuted(false); setMuted(false);
} }
} }
public void checkBanTimeout(final long currentTime) public void checkBanTimeout(final long currentTime)
{ {
if (getBanTimeout() > 0 && getBanTimeout() < currentTime && ess.getBans().isNameBanned(getName())) if (getBanTimeout() > 0 && getBanTimeout() < currentTime && ess.getBans().isNameBanned(getName()))

View File

@@ -5,11 +5,9 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -36,7 +34,8 @@ public abstract class UserData extends PlayerExtension implements IConf
config.load(); config.load();
money = _getMoney(); money = _getMoney();
unlimited = _getUnlimited(); unlimited = _getUnlimited();
powertools = getPowertools(); powertools = _getPowertools();
homes = _getHomes();
lastLocation = _getLastLocation(); lastLocation = _getLastLocation();
lastTeleportTimestamp = _getLastTeleportTimestamp(); lastTeleportTimestamp = _getLastTeleportTimestamp();
lastHealTimestamp = _getLastHealTimestamp(); lastHealTimestamp = _getLastHealTimestamp();
@@ -89,6 +88,63 @@ public abstract class UserData extends PlayerExtension implements IConf
config.setProperty("money", value); config.setProperty("money", value);
config.save(); config.save();
} }
private Map<String, Object> homes;
private Map<String, Object> _getHomes()
{
Object o = config.getProperty("homes");
if (o instanceof Map)
{
return (Map<String, Object>)o;
}
else
{
return new HashMap<String, Object>();
}
}
public Location getHome(String name)
{
Location loc = (Location)homes.get(name);
if (loc == null)
{
loc = (Location)homes.get(getHomes().get(Integer.parseInt(name) - 1));
}
return loc;
}
public Location getHome(Location world)
{
Location loc;
for (String home : getHomes())
{
loc = (Location)homes.get(home);
if (world.getWorld() == loc.getWorld())
{
return loc;
}
}
loc = (Location)homes.get(getHomes().get(0));
return loc;
}
public List<String> getHomes()
{
List<String> list = new ArrayList(homes.keySet());
return list;
}
public void setHome(String name, Location loc)
{
homes.put(name, loc);
config.setProperty("homes." + name, loc);
config.save();
}
public boolean hasHome() public boolean hasHome()
{ {
@@ -99,40 +155,6 @@ public abstract class UserData extends PlayerExtension implements IConf
return false; return false;
} }
public Location getHome(Location location)
{
if (!hasHome())
{
return null;
}
World world = location.getWorld();
String worldHome = "home.worlds." + world.getName().toLowerCase();
if (!config.hasProperty(worldHome))
{
String defaultWorld = config.getString("home.default");
worldHome = "home.worlds." + defaultWorld;
}
Location loc = config.getLocation(worldHome, getServer());
return loc;
}
public void setHome(Location loc, boolean b)
{
String worldName = loc.getWorld().getName().toLowerCase();
if (worldName == null || worldName.isEmpty())
{
logger.log(Level.WARNING, Util.i18n("emptyWorldName"));
return;
}
if (b || !config.hasProperty("home.default"))
{
config.setProperty("home.default", worldName);
}
config.setProperty("home.worlds." + worldName, loc);
config.save();
}
public String getNickname() public String getNickname()
{ {
return config.getString("nickname"); return config.getString("nickname");
@@ -176,10 +198,10 @@ public abstract class UserData extends PlayerExtension implements IConf
private Map<Integer, Object> powertools; private Map<Integer, Object> powertools;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Map<Integer, Object> getPowertools() private Map<Integer, Object> _getPowertools()
{ {
Object o = config.getProperty("powertools"); Object o = config.getProperty("powertools");
if (o instanceof Map) if (o instanceof Map)
{ {
return (Map<Integer, Object>)o; return (Map<Integer, Object>)o;

View File

@@ -4,6 +4,7 @@ import com.earth2me.essentials.Trade;
import org.bukkit.Server; import org.bukkit.Server;
import com.earth2me.essentials.User; import com.earth2me.essentials.User;
import com.earth2me.essentials.Util; import com.earth2me.essentials.Util;
import java.util.List;
public class Commandhome extends EssentialsCommand public class Commandhome extends EssentialsCommand
@@ -18,24 +19,51 @@ public class Commandhome extends EssentialsCommand
{ {
Trade charge = new Trade(this.getName(), ess); Trade charge = new Trade(this.getName(), ess);
charge.isAffordableFor(user); charge.isAffordableFor(user);
if(args.length > 0 && user.isAuthorized("essentials.home.others")) if (args.length == 0)
{
List<String> homes = user.getHomes();
if (homes.isEmpty())
{
throw new Exception(Util.i18n("noHomeSet"));
}
else if (homes.size() == 1)
{
user.getTeleport().home(homes.get(0), charge);
}
else
{
//TODO: move to messages file
user.sendMessage("Homes: " + homes.toString());
}
}
else
{ {
User u; User u;
try String homeName;
String[] nameParts = args[0].split(":");
if (nameParts.length == 1)
{ {
u = getPlayer(server, args, 0); u = user;
homeName = nameParts[0];
} }
catch(NoSuchFieldException ex) else
{ {
u = ess.getOfflineUser(args[0]); try
{
u = getPlayer(server, args, 0);
}
catch (NoSuchFieldException ex)
{
u = ess.getOfflineUser(args[0]);
}
if (u == null)
{
throw new Exception(Util.i18n("playerNotFound"));
}
homeName = nameParts[1];
} }
if (u == null) user.getTeleport().home(u, homeName, charge);
{
throw new Exception(Util.i18n("playerNotFound"));
}
user.getTeleport().home(u, charge);
return;
} }
user.getTeleport().home(charge);
} }
} }

View File

@@ -19,14 +19,21 @@ public class Commandsethome extends EssentialsCommand
{ {
if (args.length < 2) if (args.length < 2)
{ {
user.setHome(args[0].equalsIgnoreCase("default")); if (user.isAuthorized("essentials.sethome.multiple"))
{
if (user.isAuthorized("essentials.sethome.multiple.unlimited") || user.getHomes().size() <= ess.getSettings().getMultipleHomes())
{
user.setHome(args[0]);
}
}
} }
else else
{ {
if (user.isAuthorized("essentials.sethome.others")) if (user.isAuthorized("essentials.sethome.others"))
{ {
User usersHome = ess.getUser(ess.getServer().getPlayer(args[0])); User usersHome = ess.getUser(ess.getServer().getPlayer(args[0]));
if(usersHome == null) if (usersHome == null)
{ {
usersHome = ess.getOfflineUser(args[0]); usersHome = ess.getOfflineUser(args[0]);
} }
@@ -34,13 +41,13 @@ public class Commandsethome extends EssentialsCommand
{ {
throw new Exception(Util.i18n("playerNotFound")); throw new Exception(Util.i18n("playerNotFound"));
} }
usersHome.setHome(user.getLocation(), args[1].equalsIgnoreCase("default")); usersHome.setHome(args[1], user.getLocation());
} }
} }
} }
else else
{ {
user.setHome(false); user.setHome();
} }
charge(user); charge(user);
user.sendMessage(Util.i18n("homeSet")); user.sendMessage(Util.i18n("homeSet"));

View File

@@ -246,6 +246,10 @@ bed-sethome: false
#if no home is set send you to spawn when /home is used #if no home is set send you to spawn when /home is used
spawn-if-no-home: false spawn-if-no-home: false
# If users have essentials.sethome.multiple how many homes can they have
# People with essentials.sethome.multiple.unlimited are not limited by this number
multiple-homes: 5
############################################################ ############################################################
# +------------------------------------------------------+ # # +------------------------------------------------------+ #