From 2c865aa0ffbc215838a97b74340a9e96ceb19546 Mon Sep 17 00:00:00 2001 From: Eric Stokes Date: Sun, 21 Aug 2011 08:34:07 -0600 Subject: [PATCH] Allow our own spawns to be more accurate, including decimal precision on XYZ and Pitch/Yaw. We still set the spawn in the bukkit worlds to the inaccurate setting. No migrator is included for this change, just do /mvss in game. --- .../onarandombox/MultiverseCore/MVWorld.java | 35 +++++++++++++++++-- .../MultiverseCore/commands/CoordCommand.java | 2 +- .../commands/SetSpawnCommand.java | 14 ++++++-- .../listeners/MVPlayerListener.java | 21 +++++++---- .../utils/LocationManipulation.java | 31 ++++++++++++---- 5 files changed, 85 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index a88e76da..568dff82 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.logging.Level; import org.bukkit.ChatColor; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.entity.Player; @@ -97,6 +98,7 @@ public class MVWorld { private boolean canSave = false; // Prevents all the setters from constantly saving to the config when being called from the constructor. private boolean allowWeather; + private Location spawnLocation; public MVWorld(World world, Configuration config, MultiverseCore instance, Long seed, String generatorString) { this.config = config; @@ -140,7 +142,7 @@ public class MVWorld { this.getWorldBlacklist().addAll(config.getStringList("worlds." + this.name + ".worldblacklist", new ArrayList())); this.getBlockBlacklist().addAll(config.getIntList("worlds." + this.name + ".blockblacklist", new ArrayList())); this.translateTempSpawn(config); - + this.readSpawnFromConfig(this.getCBWorld()); this.canSave = true; saveConfig(); @@ -202,7 +204,7 @@ public class MVWorld { coords[i] = Integer.parseInt(coordsString[i]); } - this.world.setSpawnLocation(coords[0], coords[1], coords[2]); + this.setSpawn(new Location(this.getCBWorld(), coords[0], coords[2], coords[3])); } catch (NumberFormatException e) { this.plugin.log(Level.WARNING, "A MV1 spawn value was found, but it could not be migrated. Format Error. Sorry."); } @@ -631,8 +633,35 @@ public class MVWorld { public boolean getWeatherEnabled() { return this.allowWeather; } - + public boolean getKeepSpawnInMemory() { return this.keepSpawnInMemory; } + + public boolean setSpawn(Location l) { + this.getCBWorld().setSpawnLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ()); + config.setProperty("worlds." + this.name + ".spawn.x", l.getX()); + config.setProperty("worlds." + this.name + ".spawn.y", l.getY()); + config.setProperty("worlds." + this.name + ".spawn.z", l.getZ()); + config.setProperty("worlds." + this.name + ".spawn.pitch", l.getPitch()); + config.setProperty("worlds." + this.name + ".spawn.yaw", l.getYaw()); + this.getCBWorld().setSpawnLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ()); + this.spawnLocation = l.clone(); + saveConfig(); + return true; + + } + + private void readSpawnFromConfig(World w) { + double x = config.getDouble("worlds." + this.name + ".spawn.x", w.getSpawnLocation().getX()); + double y = config.getDouble("worlds." + this.name + ".spawn.y", w.getSpawnLocation().getY()); + double z = config.getDouble("worlds." + this.name + ".spawn.z", w.getSpawnLocation().getZ()); + float pitch = (float) config.getDouble("worlds." + this.name + ".spawn.pitch", w.getSpawnLocation().getPitch()); + float yaw = (float) config.getDouble("worlds." + this.name + ".spawn.yaw", w.getSpawnLocation().getYaw()); + this.spawnLocation = new Location(w, x, y, z, yaw, pitch); + } + + public Location getSpawnLocation() { + return this.spawnLocation; + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java index 48d6619d..8233ece5 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java @@ -50,7 +50,7 @@ public class CoordCommand extends MultiverseCommand { DecimalFormat df = new DecimalFormat(); df.setMinimumFractionDigits(0); df.setMaximumFractionDigits(2); - p.sendMessage(ChatColor.AQUA + "Coordinates: " + ChatColor.WHITE + this.locMan.strCoords(p.getLocation()) + ChatColor.GOLD + "Pitch: " + df.format(p.getLocation().getPitch())); + p.sendMessage(ChatColor.AQUA + "Coordinates: " + ChatColor.WHITE + LocationManipulation.strCoords(p.getLocation())); p.sendMessage(ChatColor.AQUA + "Direction: " + ChatColor.WHITE + LocationManipulation.getDirection(p.getLocation())); p.sendMessage(ChatColor.AQUA + "Block: " + ChatColor.WHITE + Material.getMaterial(world.getBlockTypeIdAt(p.getLocation()))); } else { diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/SetSpawnCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/SetSpawnCommand.java index 77fa83b7..85fe0af0 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/SetSpawnCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/SetSpawnCommand.java @@ -8,7 +8,9 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionDefault; +import com.onarandombox.MultiverseCore.MVWorld; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.utils.LocationManipulation; public class SetSpawnCommand extends MultiverseCommand { @@ -31,8 +33,16 @@ public class SetSpawnCommand extends MultiverseCommand { Player p = (Player) sender; Location l = p.getLocation(); World w = p.getWorld(); - w.setSpawnLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ()); - p.sendMessage(w.getName() + " - Spawn set to X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ()); + MVWorld foundWorld = this.plugin.getMVWorld(w.getName()); + if(foundWorld != null) { + foundWorld.setSpawn(p.getLocation()); + sender.sendMessage("Spawn was set to: " + LocationManipulation.strCoords(p.getLocation())); + } else { + w.setSpawnLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ()); + sender.sendMessage("Multiverse does not know about this world, only X,Y and Z set. Please import it to set the spawn fully."); + } + + } else { sender.sendMessage("You cannot use this command from the console."); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/listeners/MVPlayerListener.java b/src/main/java/com/onarandombox/MultiverseCore/listeners/MVPlayerListener.java index a1bb819f..c4a7da16 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/listeners/MVPlayerListener.java +++ b/src/main/java/com/onarandombox/MultiverseCore/listeners/MVPlayerListener.java @@ -74,17 +74,26 @@ public class MVPlayerListener extends PlayerListener { } // If it's null then it either means the World doesn't exist or the value is blank, so we don't handle it. - if (respawnWorld == null) { - return; + // NOW: We'll always handle it to get more accurate spawns + if (respawnWorld != null) { + world = respawnWorld.getCBWorld(); } - - Location respawnLocation = respawnWorld.getCBWorld().getSpawnLocation(); + // World has been set to the appropriate world + Location respawnLocation = getMostAccurateRespawnLocation(world); MVRespawnEvent respawnEvent = new MVRespawnEvent(respawnLocation, event.getPlayer(), "compatability"); this.plugin.getServer().getPluginManager().callEvent(respawnEvent); event.setRespawnLocation(respawnEvent.getPlayersRespawnLocation()); } + private Location getMostAccurateRespawnLocation(World w) { + MVWorld mvw = this.plugin.getMVWorld(w.getName()); + if (mvw != null) { + return mvw.getSpawnLocation(); + } + return w.getSpawnLocation(); + } + @Override public void onPlayerJoin(PlayerJoinEvent event) { if (this.plugin.getMVWorlds().size() == 0 && this.plugin.getPermissions().hasPermission(event.getPlayer(), "multiverse.core.import", true)) { @@ -118,14 +127,14 @@ public class MVPlayerListener extends PlayerListener { return; } } - if(toWorld == null) { + if (toWorld == null) { // The toworld is not handled by MV, we don't care about payments return; } // Only check payments if it's a different world: if (!event.getTo().getWorld().equals(event.getFrom().getWorld())) { // If the player does not have to pay, return now. - if(toWorld.isExempt(event.getPlayer())) { + if (toWorld.isExempt(event.getPlayer())) { return; } GenericBank bank = plugin.getBank(); diff --git a/src/main/java/com/onarandombox/utils/LocationManipulation.java b/src/main/java/com/onarandombox/utils/LocationManipulation.java index 12bf936f..59f4bbcd 100644 --- a/src/main/java/com/onarandombox/utils/LocationManipulation.java +++ b/src/main/java/com/onarandombox/utils/LocationManipulation.java @@ -62,12 +62,11 @@ public class LocationManipulation { } /** - * Convert a Location to XYZ Coordinates. - * + * Returns a colored string with the coords * @param l * @return */ - public String strCoords(Location l) { + public static String strCoords(Location l) { String result = ""; DecimalFormat df = new DecimalFormat(); df.setMinimumFractionDigits(0); @@ -75,9 +74,15 @@ public class LocationManipulation { result += ChatColor.WHITE + "X: " + ChatColor.AQUA + df.format(l.getX()) + " "; result += ChatColor.WHITE + "Y: " + ChatColor.AQUA + df.format(l.getY()) + " "; result += ChatColor.WHITE + "Z: " + ChatColor.AQUA + df.format(l.getZ()) + " "; + result += ChatColor.WHITE + "P: " + ChatColor.GOLD + df.format(l.getPitch()) + " "; + result += ChatColor.WHITE + "Y: " + ChatColor.GOLD + df.format(l.getYaw()) + " "; return result; } - + /** + * Converts a location to a printable readable formatted string including pitch/yaw + * @param l + * @return + */ public static String strCoordsRaw(Location l) { String result = ""; DecimalFormat df = new DecimalFormat(); @@ -122,7 +127,11 @@ public class LocationManipulation { return dir; } - + /** + * Returns the float yaw position for the given cardianl direction + * @param orientation + * @return + */ public static float getYaw(String orientation) { if (orientation == null) { return 0; @@ -132,13 +141,23 @@ public class LocationManipulation { } return 0; } - + /** + * Returns a speed float from a given vector. + * @param v + * @return + */ public static float getSpeed(Vector v) { return (float) Math.sqrt(v.getX() * v.getX() + v.getZ() * v.getZ()); } // X, Y, Z // -W/+E,0, -N/+S + /** + * Returns a translated vector from the given direction + * @param v + * @param direction + * @return + */ public static Vector getTranslatedVector(Vector v, String direction) { if (direction == null) { return v;