From b21b7b7e155a45227f9c629d51ee50ecbed1ca73 Mon Sep 17 00:00:00 2001 From: snowleo Date: Sat, 26 Nov 2011 22:30:40 +0100 Subject: [PATCH] New behavior of the /home command and beds - The behavior has been altered to match the vanilla server. - Using a bed will no longer create a home in the users file, if config option bed-sethome is set - The config option bed-sethome has been removed - It's now possible to go to /home bed or /home playername:bed - Bed locations stored before installing Essentials will be used - Players respawn at their bed location (if set) instead of the spawn, if respawn-at-home is set to false - The default value of spawn-if-no-home is set to true - If spawn-if-no-home is set and the player has not set a home, he will be either teleported to his bed location (if set) or the spawn, when he uses the /home command --- .../com/earth2me/essentials/Essentials.java | 1 - .../essentials/EssentialsPlayerListener.java | 40 ++++--------------- .../com/earth2me/essentials/ISettings.java | 2 - .../src/com/earth2me/essentials/Settings.java | 6 --- .../src/com/earth2me/essentials/UserData.java | 29 ++++++++------ .../essentials/commands/Commandhome.java | 24 ++++++++++- Essentials/src/config.yml | 10 ++--- .../com/earth2me/essentials/UserTest.java | 22 ++++------ .../spawn/EssentialsSpawnPlayerListener.java | 29 ++++++-------- 9 files changed, 70 insertions(+), 93 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 7c728b0b4..5ede55fc5 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -178,7 +178,6 @@ public class Essentials extends JavaPlugin implements IEssentials pm.registerEvent(Type.PLAYER_MOVE, playerListener, Priority.High, this); pm.registerEvent(Type.PLAYER_LOGIN, playerListener, Priority.High, this); pm.registerEvent(Type.PLAYER_TELEPORT, playerListener, Priority.High, this); - pm.registerEvent(Type.PLAYER_INTERACT, playerListener, Priority.High, this); pm.registerEvent(Type.PLAYER_EGG_THROW, playerListener, Priority.High, this); pm.registerEvent(Type.PLAYER_BUCKET_EMPTY, playerListener, Priority.High, this); pm.registerEvent(Type.PLAYER_ANIMATION, playerListener, Priority.High, this); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index c6cbfe232..f92f9d808 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -231,12 +231,12 @@ public class EssentialsPlayerListener extends PlayerListener private void updateCompass(final User user) { - try - { - user.setCompassTarget(user.getHome(user.getLocation())); + Location loc = user.getHome(user.getLocation()); + if (loc == null) { + loc = user.getBedSpawnLocation(); } - catch (Exception ex) - { + if (loc != null) { + user.setCompassTarget(loc); } } @@ -255,32 +255,6 @@ public class EssentialsPlayerListener extends PlayerListener updateCompass(user); } - @Override - public void onPlayerInteract(final PlayerInteractEvent event) - { - if (event.isCancelled()) - { - return; - } - if (event.getAction() != Action.RIGHT_CLICK_BLOCK) - { - return; - } - - if (ess.getSettings().getBedSetsHome() && event.getClickedBlock().getType() == Material.BED_BLOCK) - { - try - { - final User user = ess.getUser(event.getPlayer()); - user.setHome(); - user.sendMessage(_("homeSetToBed")); - } - catch (Throwable ex) - { - } - } - } - @Override public void onPlayerEggThrow(final PlayerEggThrowEvent event) { @@ -387,7 +361,7 @@ public class EssentialsPlayerListener extends PlayerListener } @Override - public void onPlayerChangedWorld(PlayerChangedWorldEvent event) + public void onPlayerChangedWorld(final PlayerChangedWorldEvent event) { if (ess.getSettings().getNoGodWorlds().contains(event.getPlayer().getLocation().getWorld().getName())) { User user = ess.getUser(event.getPlayer()); @@ -395,5 +369,5 @@ public class EssentialsPlayerListener extends PlayerListener user.sendMessage(_("noGodWorldWarning")); } } - } + } } diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 7891190dc..e7ce92a55 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -21,8 +21,6 @@ public interface ISettings extends IConf long getBackupInterval(); - boolean getBedSetsHome(); - String getChatFormat(String group); int getChatRadius(); diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index 47a102326..ab5b0a364 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -36,12 +36,6 @@ public class Settings implements ISettings return config.getBoolean("respawn-at-home", false); } - @Override - public boolean getBedSetsHome() - { - return config.getBoolean("bed-sethome", false); - } - @Override public List getMultipleHomes() { diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index d9dad769d..9df1b0342 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -130,27 +130,32 @@ public abstract class UserData extends PlayerExtension implements IConf return loc; } - public Location getHome(Location world) throws Exception + public Location getHome(final Location world) { - Location loc; - for (String home : getHomes()) + try { - loc = config.getLocation("homes." + home, getServer()); - if (world.getWorld() == loc.getWorld()) + Location loc; + for (String home : getHomes()) { - return loc; - } + loc = config.getLocation("homes." + home, getServer()); + if (world.getWorld() == loc.getWorld()) + { + return loc; + } + } + loc = config.getLocation("homes." + getHomes().get(0), getServer()); + return loc; + } + catch (Exception ex) + { + return null; } - loc = config.getLocation("homes." + getHomes().get(0), getServer()); - return loc; } public List getHomes() { - List list = new ArrayList(homes.keySet()); - return list; - + return new ArrayList(homes.keySet()); } public void setHome(String name, Location loc) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java index 5478ab986..090cebd4c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java @@ -6,6 +6,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.Util; import java.util.List; import java.util.Locale; +import org.bukkit.Location; import org.bukkit.Server; @@ -42,14 +43,32 @@ public class Commandhome extends EssentialsCommand } try { + if ("bed".equalsIgnoreCase(homeName)) { + final Location bed = player.getBedSpawnLocation(); + if (bed != null) + { + user.getTeleport().teleport(bed, charge); + } + } user.getTeleport().home(player, homeName.toLowerCase(Locale.ENGLISH), charge); } catch (NotEnoughArgumentsException e) { final List homes = player.getHomes(); - if (homes.isEmpty() && player.equals(user) && ess.getSettings().spawnIfNoHome()) + if (homes.isEmpty() && player.equals(user)) { - user.getTeleport().respawn(ess.getSpawn(), charge); + final Location loc = player.getBedSpawnLocation(); + if (loc == null) + { + if (ess.getSettings().spawnIfNoHome()) + { + user.getTeleport().respawn(ess.getSpawn(), charge); + } + } + else + { + user.getTeleport().teleport(loc, charge); + } } else if (homes.isEmpty()) { @@ -61,6 +80,7 @@ public class Commandhome extends EssentialsCommand } else { + homes.add("bed"); user.sendMessage(_("homes", Util.joinList(homes))); } } diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index cf39007e3..a68630f67 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -236,15 +236,11 @@ no-god-in-worlds: # +------------------------------------------------------+ # ############################################################ -# When users die, should they respawn at their homes, instead of the spawnpoint? +# When users die, should they respawn at their first home, instead of the spawnpoint or bed? respawn-at-home: false -# When a user interacts with a bed, should their home be set to that location? -# If you enable this and remove default user access to the /sethome command, you can make beds the only way for players to set their home location. -bed-sethome: false - -# If no home is set send you to spawn when /home is used -spawn-if-no-home: false +# If no home is set send you to bed or spawn when /home is used +spawn-if-no-home: true # Allow players to have multiple homes. # Define different amounts of multiple homes for different permissions, e.g. essentials.sethome.multiple.vip diff --git a/Essentials/test/com/earth2me/essentials/UserTest.java b/Essentials/test/com/earth2me/essentials/UserTest.java index 35244ac90..ef9ab515d 100644 --- a/Essentials/test/com/earth2me/essentials/UserTest.java +++ b/Essentials/test/com/earth2me/essentials/UserTest.java @@ -54,21 +54,15 @@ public class UserTest extends TestCase user.setHome(); OfflinePlayer base2 = server.createPlayer(base1.getName(), ess); User user2 = ess.getUser(base2); - try - { - Location home = user2.getHome(loc); - assertEquals(loc.getWorld().getName(), home.getWorld().getName()); - assertEquals(loc.getX(), home.getX()); - assertEquals(loc.getY(), home.getY()); - assertEquals(loc.getZ(), home.getZ()); - assertEquals(loc.getYaw(), home.getYaw()); - assertEquals(loc.getPitch(), home.getPitch()); - } - catch (Exception ex) - { - fail("Exception"); - } + Location home = user2.getHome(loc); + assertNotNull(home); + assertEquals(loc.getWorld().getName(), home.getWorld().getName()); + assertEquals(loc.getX(), home.getX()); + assertEquals(loc.getY(), home.getY()); + assertEquals(loc.getZ(), home.getZ()); + assertEquals(loc.getYaw(), home.getYaw()); + assertEquals(loc.getPitch(), home.getPitch()); } public void testMoney() diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java index a5d1efba9..57b842c82 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java @@ -15,8 +15,9 @@ public class EssentialsSpawnPlayerListener extends PlayerListener { private final transient IEssentials ess; - public EssentialsSpawnPlayerListener(IEssentials ess) + public EssentialsSpawnPlayerListener(final IEssentials ess) { + super(); this.ess = ess; } @@ -25,28 +26,24 @@ public class EssentialsSpawnPlayerListener extends PlayerListener { final User user = ess.getUser(event.getPlayer()); - try + if (ess.getSettings().getRespawnAtHome()) { - if (ess.getSettings().getRespawnAtHome()) + Location home = user.getHome(user.getLocation()); + if (home == null) + { + home = user.getBedSpawnLocation(); + } + if (home != null) { - Location home = user.getHome(user.getLocation()); - if (home == null) - { - throw new Exception(); - } event.setRespawnLocation(home); return; } } - catch (Throwable ex) + final Location spawn = ess.getSpawn().getSpawn(user.getGroup()); + if (spawn != null) { + event.setRespawnLocation(spawn); } - Location spawn = ess.getSpawn().getSpawn(user.getGroup()); - if (spawn == null) - { - return; - } - event.setRespawnLocation(spawn); } @Override @@ -54,7 +51,7 @@ public class EssentialsSpawnPlayerListener extends PlayerListener { final User user = ess.getUser(event.getPlayer()); - if (!user.isNew()) + if (!user.isNew() || user.getBedSpawnLocation() != null) { return; }