From 91f7debb08b776227439081c43e2b658acf26bda Mon Sep 17 00:00:00 2001 From: "main()" Date: Sun, 4 Mar 2012 15:14:42 +0100 Subject: [PATCH 01/22] MVWorld + SerializationConfig = Awesome Yes, I did it. --- pom.xml | 2 +- .../onarandombox/MultiverseCore/MVWorld.java | 1366 +++++++++-------- .../MultiverseCore/MultiverseCore.java | 3 + .../MultiverseCoreConfiguration.java | 13 + .../api/MultiverseCoreConfig.java | 2 +- .../MultiverseCore/api/MultiverseWorld.java | 524 ++++--- .../commands/ConfigCommand.java | 2 +- .../commands/ModifyAddCommand.java | 1 + .../commands/ModifyClearCommand.java | 1 + .../commands/ModifyRemoveCommand.java | 1 + .../commands/ModifySetCommand.java | 9 +- .../ActiveStringConfigProperty.java | 115 -- .../configuration/BooleanConfigProperty.java | 135 -- .../configuration/ColorConfigProperty.java | 98 -- .../configuration/ConfigPropertyFactory.java | 306 ---- .../DifficultyConfigProperty.java | 129 -- .../configuration/DoubleConfigProperty.java | 133 -- .../configuration/GameModeConfigProperty.java | 129 -- .../configuration/IntegerConfigProperty.java | 97 -- .../configuration/LocationConfigProperty.java | 154 -- .../configuration/MVActiveConfigProperty.java | 2 + .../configuration/MVConfigProperty.java | 2 + .../PortalTypeConfigProperty.java | 97 -- .../configuration/SpawnLocation.java | 98 ++ .../configuration/SpawnSettings.java | 50 + .../configuration/StringConfigProperty.java | 96 -- .../configuration/SubSpawnSettings.java | 59 + .../configuration/WorldPropertyValidator.java | 27 + .../enums/EnglishChatColor.java | 9 + .../event/MVWorldPropertyChangeEvent.java | 34 +- .../PropertyDoesNotExistException.java | 4 + .../MultiverseCore/utils/WorldManager.java | 178 +-- .../test/TestWorldProperties.java | 8 +- .../MultiverseCore/test/TestWorldStuff.java | 4 +- .../test/utils/MockWorldFactory.java | 40 + .../test/utils/TestInstanceCreator.java | 6 + 36 files changed, 1418 insertions(+), 2516 deletions(-) delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/ActiveStringConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/BooleanConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/ColorConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/ConfigPropertyFactory.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/DifficultyConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/DoubleConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/GameModeConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/IntegerConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/LocationConfigProperty.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/PortalTypeConfigProperty.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnLocation.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnSettings.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/StringConfigProperty.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/SubSpawnSettings.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/WorldPropertyValidator.java diff --git a/pom.xml b/pom.xml index 8739e055..158ab819 100644 --- a/pom.xml +++ b/pom.xml @@ -196,7 +196,7 @@ me.main__.util SerializationConfig - 1.3 + 1.5 jar compile diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 3d376a39..7fc86550 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -9,14 +9,23 @@ package com.onarandombox.MultiverseCore; import com.onarandombox.MultiverseCore.api.BlockSafety; import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.onarandombox.MultiverseCore.configuration.ConfigPropertyFactory; -import com.onarandombox.MultiverseCore.configuration.MVActiveConfigProperty; -import com.onarandombox.MultiverseCore.configuration.MVConfigProperty; +import com.onarandombox.MultiverseCore.configuration.SpawnLocation; +import com.onarandombox.MultiverseCore.configuration.SpawnSettings; +import com.onarandombox.MultiverseCore.configuration.WorldPropertyValidator; import com.onarandombox.MultiverseCore.enums.AllowedPortalType; import com.onarandombox.MultiverseCore.enums.EnglishChatColor; -import com.onarandombox.MultiverseCore.event.MVWorldPropertyChangeEvent; import com.onarandombox.MultiverseCore.exceptions.PropertyDoesNotExistException; import com.onarandombox.MultiverseCore.api.SafeTTeleporter; + +import me.main__.util.SerializationConfig.ChangeDeniedException; +import me.main__.util.SerializationConfig.IllegalPropertyValueException; +import me.main__.util.SerializationConfig.NoSuchPropertyException; +import me.main__.util.SerializationConfig.Property; +import me.main__.util.SerializationConfig.SerializationConfig; +import me.main__.util.SerializationConfig.Serializor; +import me.main__.util.SerializationConfig.ValidateAllWith; +import me.main__.util.SerializationConfig.VirtualProperty; + import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; @@ -25,15 +34,13 @@ import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.WorldType; import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.entity.Player; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Method; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -46,157 +53,429 @@ import java.util.regex.Pattern; /** * The implementation of a Multiverse handled world. */ -public class MVWorld implements MultiverseWorld { +@SerializableAs("MVWorld") +@ValidateAllWith(WorldPropertyValidator.class) +public class MVWorld extends SerializationConfig implements MultiverseWorld { + private static final int SPAWN_LOCATION_SEARCH_TOLERANCE = 16; + private static final int SPAWN_LOCATION_SEARCH_RADIUS = 16; + + /* + * We have to use setCBWorld(), setPlugin() and initPerms() to prepare this object for use. + */ + public MVWorld(Map values) { + super(values); + } private MultiverseCore plugin; // Hold the Plugin Instance. - private FileConfiguration config; // Hold the Configuration File. - private ConfigurationSection worldSection; // Holds the section of the config file for this world. - private World world; // The World Instance. + private Reference world; // A reference to the World Instance. private Environment environment; // Hold the Environment type EG Environment.NETHER / Environment.NORMAL - private Long seed; // The world seed + private long seed; // The world seed private String name; // The Worlds Name, EG its folder name. - private Map> masterList; - private Map> propertyList; + /** + * Validates the scale-property. + */ + private final class ScalePropertyValidator extends WorldPropertyValidator { + @Override + public Double validateChange(String property, Double newValue, Double oldValue, + MVWorld object) throws ChangeDeniedException { + if (newValue <= 0) { + plugin.log(Level.FINE, "Someone tried to set a scale <= 0, aborting!"); + throw new ChangeDeniedException(); + } + return super.validateChange(property, newValue, oldValue, object); + } + } + + /** + * Validates the respawnWorld-property. + */ + private final class RespawnWorldPropertyValidator extends WorldPropertyValidator { + @Override + public String validateChange(String property, String newValue, String oldValue, + MVWorld object) throws ChangeDeniedException { + if (!plugin.getMVWorldManager().isMVWorld(newValue)) + throw new ChangeDeniedException(); + return super.validateChange(property, newValue, oldValue, object); + } + } + + /** + * Serializor for the time-property. + */ + private static final class TimePropertySerializor implements Serializor { + // BEGIN CHECKSTYLE-SUPPRESSION: MagicNumberCheck + private static final String TIME_REGEX = "(\\d\\d?):?(\\d\\d)(a|p)?m?"; + private static final Map TIME_ALIASES; + static { + Map staticTimes = new HashMap(); + staticTimes.put("morning", "8:00"); + staticTimes.put("day", "12:00"); + staticTimes.put("noon", "12:00"); + staticTimes.put("midnight", "0:00"); + staticTimes.put("night", "20:00"); + + // now set TIME_ALIASES to a "frozen" map + TIME_ALIASES = Collections.unmodifiableMap(staticTimes); + } + + @Override + public String serialize(Long from) { + // I'm tired, so they get time in 24 hour for now. + // Someone else can add 12 hr format if they want :P + + int hours = (int) ((from / 1000 + 8) % 24); + int minutes = (int) (60 * (from % 1000) / 1000); + + return String.format("%d:%02d", hours, minutes); + } + + @Override + public Long deserialize(String serialized, Class wanted) throws IllegalPropertyValueException { + if (TIME_ALIASES.containsKey(serialized.toLowerCase())) { + serialized = TIME_ALIASES.get(serialized.toLowerCase()); + } + // Regex that extracts a time in the following formats: + // 11:11pm, 11:11, 23:11, 1111, 1111p, and the aliases at the top of this file. + Pattern pattern = Pattern.compile(TIME_REGEX, Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(serialized); + matcher.find(); + int hour = 0; + double minute = 0; + int count = matcher.groupCount(); + if (count >= 2) { + hour = Integer.parseInt(matcher.group(1)); + minute = Integer.parseInt(matcher.group(2)); + } + // If there were 4 matches (all, hour, min, am/pm) + if (count == 4) { + // We want 24 hour time for calcs, but if they + // added a p[m], turn it into a 24 hr one. + if (matcher.group(3).equals("p")) { + hour += 12; + } + } + // Translate 24th hour to 0th hour. + if (hour == 24) { + hour = 0; + } + // Clamp the hour + if (hour > 23 || hour < 0) { + throw new IllegalPropertyValueException("Illegal hour!"); + } + // Clamp the minute + if (minute > 59 || minute < 0) { + throw new IllegalPropertyValueException("Illegal minute!"); + } + // 60 seconds in a minute, time needs to be in hrs * 1000, per + // the bukkit docs. + double totaltime = (hour + (minute / 60.0)) * 1000; + // Somehow there's an 8 hour offset... + totaltime -= 8000; + if (totaltime < 0) { + totaltime = 24000 + totaltime; + } + + return (long) totaltime; + } + // END CHECKSTYLE-SUPPRESSION: MagicNumberCheck + } + + /** + * Used to apply the allowWeather-property. + */ + private final class AllowWeatherPropertyValidator extends WorldPropertyValidator { + @Override + public Boolean validateChange(String property, Boolean newValue, Boolean oldValue, + MVWorld object) throws ChangeDeniedException { + if (!newValue) { + world.get().setStorm(false); + world.get().setThundering(false); + } + return super.validateChange(property, newValue, oldValue, object); + } + } + + /** + * Used to apply the spawning-property. + */ + private final class SpawningPropertyValidator extends WorldPropertyValidator { + @Override + public Boolean validateChange(String property, Boolean newValue, Boolean oldValue, + MVWorld object) throws ChangeDeniedException { + boolean allowMonsters, allowAnimals; + if (getAnimalList().isEmpty()) { + allowAnimals = canAnimalsSpawn(); + } else { + allowAnimals = true; + } + if (getMonsterList().isEmpty()) { + allowMonsters = canMonstersSpawn(); + } else { + allowMonsters = true; + } + world.get().setSpawnFlags(allowMonsters, allowAnimals); + plugin.getMVWorldManager().getTheWorldPurger().purgeWorld(MVWorld.this); + return super.validateChange(property, newValue, oldValue, object); + } + } + + /** + * Serializor for the difficulty-property. + */ + private static final class DifficultyPropertySerializor implements Serializor { + @Override + public String serialize(Difficulty from) { + return from.toString(); + } + + @Override + public Difficulty deserialize(String serialized, Class wanted) throws IllegalPropertyValueException { + try { + return Difficulty.getByValue(Integer.parseInt(serialized)); + } catch (Exception e) { + } + try { + return Difficulty.valueOf(serialized.toUpperCase()); + } catch (Exception e) { + } + throw new IllegalPropertyValueException(); + } + } + + /** + * Serializor for the gameMode-property. + */ + private static final class GameModePropertySerializor implements Serializor { + @Override + public String serialize(GameMode from) { + return from.toString(); + } + + @Override + public GameMode deserialize(String serialized, Class wanted) throws IllegalPropertyValueException { + try { + return GameMode.getByValue(Integer.parseInt(serialized)); + } catch (NumberFormatException nfe) { + } + try { + return GameMode.valueOf(serialized.toUpperCase()); + } catch (Exception e) { + } + throw new IllegalPropertyValueException(); + } + } + + + /** + * Used to apply the gameMode-property. + */ + private final class GameModePropertyValidator extends WorldPropertyValidator { + @Override + public GameMode validateChange(String property, GameMode newValue, GameMode oldValue, + MVWorld object) throws ChangeDeniedException { + for (Player p : plugin.getServer().getWorld(getName()).getPlayers()) { + plugin.log(Level.FINER, String.format("Setting %s's GameMode to %s", + p.getName(), newValue.toString())); + plugin.getPlayerListener().handleGameMode(p, MVWorld.this); + } + return super.validateChange(property, newValue, oldValue, object); + } + } + + /** + * Validator for the spawnLocation-property. + */ + private final class SpawnLocationPropertyValidator extends WorldPropertyValidator { + @Override + public Location validateChange(String property, Location newValue, Location oldValue, + MVWorld object) throws ChangeDeniedException { + if (newValue == null) + throw new ChangeDeniedException(); + if (adjustSpawn) { + BlockSafety bs = plugin.getBlockSafety(); + // verify that the location is safe + if (!bs.playerCanSpawnHereSafely(newValue)) { + // it's not ==> find a better one! + plugin.log(Level.WARNING, String.format("Somebody tried to set the spawn location for '%s' to an unsafe value! Adjusting...", getAlias())); + plugin.log(Level.WARNING, "Old Location: " + plugin.getLocationManipulation().strCoordsRaw(oldValue)); + plugin.log(Level.WARNING, "New (unsafe) Location: " + plugin.getLocationManipulation().strCoordsRaw(newValue)); + SafeTTeleporter teleporter = plugin.getSafeTTeleporter(); + newValue = teleporter.getSafeLocation(newValue, SPAWN_LOCATION_SEARCH_TOLERANCE, SPAWN_LOCATION_SEARCH_RADIUS); + if (newValue == null) { + plugin.log(Level.WARNING, "Couldn't fix the location. I have to abort the spawn location-change :/"); + throw new ChangeDeniedException(); + } + plugin.log(Level.WARNING, "New (safe) Location: " + plugin.getLocationManipulation().strCoordsRaw(newValue)); + } + } + return super.validateChange(property, newValue, oldValue, object); + } + } + + /** + * Serializor for the color-property. + */ + private static final class EnumPropertySerializor> implements Serializor { + @Override + public String serialize(T from) { + return from.toString(); + } + + @Override + public T deserialize(String serialized, Class wanted) throws IllegalPropertyValueException { + try { + return Enum.valueOf(wanted, serialized.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalPropertyValueException(e); + } + } + } + + // -------------------------------------------------------------- + // Begin properties + @Property(description = "Sorry, 'hidden' must either be: true or false.") + private boolean hidden; + @Property(description = "Alias must be a valid string.") + private String alias; + @Property(serializor = EnumPropertySerializor.class, description = "Sorry, 'color' must be a valid color-name.") + private EnglishChatColor color; + @Property(description = "Sorry, 'pvp' must either be: true or false.") + private VirtualProperty pvp = new VirtualProperty() { + @Override + public void set(Boolean newValue) { + world.get().setPVP(newValue); + } + + @Override + public Boolean get() { + return world.get().getPVP(); + } + }; + @Property(validator = ScalePropertyValidator.class, description = "Scale must be a positive double value. ex: 2.3") + private double scale; + @Property(validator = RespawnWorldPropertyValidator.class, description = "You must set this to the NAME not alias of a world.") + private String respawnWorld; + @Property(validator = AllowWeatherPropertyValidator.class, description = "Sorry, this must either be: true or false.") + private boolean allowWeather; + @Property(serializor = DifficultyPropertySerializor.class, description = "Difficulty must be set as one of the following: peaceful easy normal hard") + private VirtualProperty difficulty = new VirtualProperty() { + @Override + public void set(Difficulty newValue) { + world.get().setDifficulty(newValue); + } + + @Override + public Difficulty get() { + return world.get().getDifficulty(); + } + }; + @Property(validator = SpawningPropertyValidator.class, description = "Sorry, 'animals' must either be: true or false.") + private SpawnSettings spawning; + @Property(description = "Currency must be an integer between -1 and the highest Minecraft item ID.") + private int currency; + @Property(description = "Price must be a double value. ex: 1.2. Set to a negative value to give players money for entering this world.") + private double price; + @Property(description = "Sorry, 'hunger' must either be: true or false.") + private boolean hunger; + @Property(description = "Sorry, 'autoheal' must either be: true or false.") + private boolean autoHeal; + @Property(description = "Sorry, 'adjustspawn' must either be: true or false.") + private boolean adjustSpawn; + @Property(serializor = EnumPropertySerializor.class, description = "Allow portal forming must be NONE, ALL, NETHER or END.") + private AllowedPortalType portalForm; + @Property(serializor = GameModePropertySerializor.class, validator = GameModePropertyValidator.class, + description = "GameMode must be set as one of the following: survival creative") + private GameMode gameMode; + @Property(description = "Sorry, this must either be: true or false.") + private VirtualProperty keepSpawnInMemory = new VirtualProperty() { + @Override + public void set(Boolean newValue) { + world.get().setKeepSpawnInMemory(newValue); + } + + @Override + public Boolean get() { + return world.get().getKeepSpawnInMemory(); + } + }; + @Property + private SpawnLocation spawnLocation; + @Property(validator = SpawnLocationPropertyValidator.class, + description = "There is no help available for this variable. Go bug Rigby90 about it.") + private VirtualProperty spawn = new VirtualProperty() { + @Override + public void set(Location newValue) { + world.get().setSpawnLocation(newValue.getBlockX(), newValue.getBlockY(), newValue.getBlockZ()); + spawnLocation = new SpawnLocation(newValue); + } + + @Override + public Location get() { + spawnLocation.setWorld(getCBWorld()); + // basically, everybody should accept our "SpawnLocation", right? + // so just returning it should be fine + return spawnLocation; + } + }; + @Property(description = "Set this to false ONLY if you don't want this world to load itself on server restart.") + private boolean autoLoad; + @Property(description = "If a player dies in this world, shoudld they go to their bed?") + private boolean bedRespawn; + @Property + private List worldBlacklist; + @SuppressWarnings("unused") // it IS used! + @Property(serializor = TimePropertySerializor.class, description = "Set the time to whatever you want! (Will NOT freeze time)") + private VirtualProperty time = new VirtualProperty() { + @Override + public void set(Long newValue) { + world.get().setTime(newValue); + } + + @Override + public Long get() { + return world.get().getTime(); + } + }; + // End of properties + // -------------------------------------------------------------- private Permission permission; private Permission exempt; - - private boolean canSave = false; // Prevents all the setters from constantly saving to the config when being called from the constructor. - private Map propertyAliases; private Permission ignoreperm; - private static final Map TIME_ALIASES; - private WorldType type; - - static { - Map staticTimes = new HashMap(); - staticTimes.put("morning", "8:00"); - staticTimes.put("day", "12:00"); - staticTimes.put("noon", "12:00"); - staticTimes.put("midnight", "0:00"); - staticTimes.put("night", "20:00"); - - // now set TIME_ALIASES to a "frozen" map - TIME_ALIASES = Collections.unmodifiableMap(staticTimes); + public MVWorld(boolean fixSpawn) { + if (!fixSpawn) { + this.adjustSpawn = false; + } } - public MVWorld(World world, FileConfiguration config, MultiverseCore instance, Long seed, String generatorString, boolean fixSpawn) { - this.config = config; - this.plugin = instance; + /** + * Sets the CB-World. + *

+ * This is used to set some values after deserialization. + * @param cbWorld The new world. + * @param thePlugin The reference to the plugin. + */ + public void init(World cbWorld, MultiverseCore thePlugin) { + this.plugin = thePlugin; - // Set local values that CANNOT be changed by user - this.world = world; - this.name = world.getName(); - this.seed = seed; - this.environment = world.getEnvironment(); - this.type = world.getWorldType(); + // Weak reference so the CB-World can be unloaded even if this object still exists! + this.world = new WeakReference(cbWorld); + this.environment = cbWorld.getEnvironment(); + this.seed = cbWorld.getSeed(); + this.name = cbWorld.getName(); + if (this.spawnLocation == null) + this.spawnLocation = new SpawnLocation(readSpawnFromWorld(cbWorld)); - // Initialize our lists - this.initLists(); - worldSection = config.getConfigurationSection("worlds." + this.name); - if (worldSection == null) { - config.createSection("worlds." + this.name); - worldSection = config.getConfigurationSection("worlds." + this.name); - } - // Write these files to the config (once it's saved) - if (generatorString != null) { - worldSection.set("generator", generatorString); - } - if (seed != null) { - worldSection.set("seed", this.seed); - } - worldSection.set("environment", this.environment.toString()); - - worldSection.set("type", this.type.toString()); - - // Start NEW config awesomeness. - ConfigPropertyFactory fac = new ConfigPropertyFactory(this.worldSection); - this.propertyList = new HashMap>(); - // The format of these are either: - // getNewProperty(name, defaultValue, helpText) - // or - // getNewProperty(name, defaultValue, yamlConfigNode, helpText) - // - // If the first type is used, name is used as the yamlConfigNode - this.propertyList.put("hidden", fac.getNewProperty("hidden", false, - "Sorry, 'hidden' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".")); - this.propertyList.put("alias", fac.getNewProperty("alias", "", "alias.name", - "Alias must be a valid string.")); - this.propertyList.put("color", fac.getNewProperty("color", EnglishChatColor.WHITE, "alias.color", - "Sorry, 'color' must either one of: " + EnglishChatColor.getAllColors())); - this.propertyList.put("pvp", fac.getNewProperty("pvp", true, "pvp", - "Sorry, 'pvp' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE - + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".", "setActualPVP")); - this.propertyList.put("scale", fac.getNewProperty("scale", this.getDefaultScale(this.environment), "scale", - "Scale must be a positive double value. ex: " + ChatColor.GOLD + "2.3", "verifyScaleSetProperly")); - this.propertyList.put("respawn", fac.getNewProperty("respawn", "", "respawnworld", - "You must set this to the " + ChatColor.GOLD + " NAME" + ChatColor.RED + " not alias of a world.")); - this.propertyList.put("weather", fac.getNewProperty("weather", true, "allowweather", - "Sorry, 'weather' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE - + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".", "setActualWeather")); - this.propertyList.put("difficulty", fac.getNewProperty("difficulty", Difficulty.EASY, - "Difficulty must be set as one of the following: " + ChatColor.GREEN + "peaceful " - + ChatColor.AQUA + "easy " + ChatColor.GOLD + "normal " + ChatColor.RED + "hard")); - this.propertyList.put("animals", fac.getNewProperty("animals", true, "animals.spawn", - "Sorry, 'animals' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE - + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".", "syncMobs")); - this.propertyList.put("monsters", fac.getNewProperty("monsters", true, "monsters.spawn", - "Sorry, 'monsters' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE - + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".", "syncMobs")); - this.propertyList.put("currency", fac.getNewProperty("currency", -1, "entryfee.currency", - "Currency must be an integer between -1 and the highest Minecraft item ID.")); - this.propertyList.put("price", fac.getNewProperty("price", 0.0, "entryfee.price", - "Price must be a double value. ex: " + ChatColor.GOLD + "1.2" + ChatColor.WHITE - + ". Set to a negative value to give players money for entering this world.")); - this.propertyList.put("hunger", fac.getNewProperty("hunger", true, - "Sorry, 'hunger' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".")); - this.propertyList.put("autoheal", fac.getNewProperty("autoheal", true, - "Sorry, 'autoheal' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".")); - this.propertyList.put("adjustspawn", fac.getNewProperty("adjustspawn", true, - "Sorry, 'adjustspawn' must either be:" + ChatColor.GREEN + " true " + ChatColor.WHITE - + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".")); - this.propertyList.put("portalform", fac.getNewProperty("portalform", AllowedPortalType.ALL, - "Allow portal forming must be NONE, ALL, NETHER or END.")); - if (!fixSpawn) { - this.setAdjustSpawn(false); - } - this.propertyList.put("gamemode", fac.getNewProperty("gamemode", GameMode.SURVIVAL, - "GameMode must be set as one of the following: " + ChatColor.RED + "survival " + ChatColor.GREEN + "creative ")); - this.propertyList.put("memory", fac.getNewProperty("keepspawninmemory", true, "keepspawninmemory", - "Sorry, 'memory' must either be:" + ChatColor.GREEN + " true " - + ChatColor.WHITE + "or" + ChatColor.RED + " false" + ChatColor.WHITE + ".", "setActualKeepSpawnInMemory")); - this.propertyList.put("spawn", fac.getNewProperty("spawn", this.world.getSpawnLocation(), "spawn", - "There is no help available for this variable. Go bug Rigby90 about it.", "setActualKeepSpawnInMemory")); - this.propertyList.put("autoload", fac.getNewProperty("autoload", true, - "Set this to false ONLY if you don't want this world to load itself on server restart.")); - this.propertyList.put("bedrespawn", fac.getNewProperty("bedrespawn", true, "If a player dies in this world, shoudld they go to their bed?")); - this.propertyList.put("time", fac.getNewProperty("time", "", "Set the time to whatever you want! (Will NOT freeze time)", "setActualTime", true)); - this.getKnownProperty("spawn", Location.class).setValue(this.readSpawnFromConfig(this.getCBWorld())); - - - // Set aliases - this.propertyAliases = new HashMap(); - this.propertyAliases.put("curr", "currency"); - this.propertyAliases.put("scaling", "scale"); - this.propertyAliases.put("aliascolor", "color"); - this.propertyAliases.put("heal", "autoheal"); - this.propertyAliases.put("storm", "weather"); - this.propertyAliases.put("spawnmemory", "memory"); - this.propertyAliases.put("mode", "gamemode"); - this.propertyAliases.put("diff", "difficulty"); - - // Things I haven't converted yet. - this.getMobExceptions(); - List tempWorldBlacklist = worldSection.getStringList("worldblacklist"); - if (tempWorldBlacklist != null) - this.getWorldBlacklist().addAll(tempWorldBlacklist); - - // Enable and do the save. - this.canSave = true; - this.saveConfig(); + this.initPerms(); + } + /** + * Initializes permissions. + */ + private void initPerms() { this.permission = new Permission("multiverse.access." + this.getName(), "Allows access to " + this.getName(), PermissionDefault.OP); // This guy is special. He shouldn't be added to any parent perms. this.ignoreperm = new Permission("mv.bypass.gamemode." + this.getName(), @@ -216,79 +495,104 @@ public class MVWorld implements MultiverseWorld { } catch (IllegalArgumentException e) { this.plugin.log(Level.FINER, "Permissions nodes were already added for " + this.name); } - - // Sync all active settings. - this.setActualPVP(); - this.verifyScaleSetProperly(); - this.setActualKeepSpawnInMemory(); - this.setActualDifficulty(); - this.setActualGameMode(); - this.setActualSpawn(); - this.syncMobs(); } - /** - * Used by the active PVP-property to set the "actual" PVP-property. - * @return True if the property was successfully set. - */ - public boolean setActualPVP() { - // Set the PVP mode - this.world.setPVP(this.getKnownProperty("pvp", Boolean.class).getValue()); - return true; - } - - /** - * Used by the active scale-property to set the "actual" scale-property. - * @return True if the property was successfully set. - */ - public boolean verifyScaleSetProperly() { - // Ensure the scale is above 0 - if (this.getKnownProperty("scale", Double.class).getValue() <= 0) { - // Disallow negative or 0 scalings. - this.getKnownProperty("scale", Double.class).setValue(1.0); - this.plugin.log(Level.WARNING, "Someone tried to set a scale <= 0, defaulting to 1."); + private Location readSpawnFromWorld(World w) { + Location location = w.getSpawnLocation(); + // Set the worldspawn to our configspawn + BlockSafety bs = this.plugin.getBlockSafety(); + // Verify that location was safe + if (!bs.playerCanSpawnHereSafely(location)) { + if (!this.getAdjustSpawn()) { + this.plugin.log(Level.FINE, "Spawn location from world.dat file was unsafe!!"); + this.plugin.log(Level.FINE, "NOT adjusting spawn for '" + this.getAlias() + "' because you told me not to."); + this.plugin.log(Level.FINE, "To turn on spawn adjustment for this world simply type:"); + this.plugin.log(Level.FINE, "/mvm set adjustspawn true " + this.getAlias()); + return location; + } + // If it's not, find a better one. + SafeTTeleporter teleporter = this.plugin.getSafeTTeleporter(); + this.plugin.log(Level.WARNING, "Spawn location from world.dat file was unsafe. Adjusting..."); + this.plugin.log(Level.WARNING, "Original Location: " + plugin.getLocationManipulation().strCoordsRaw(location)); + Location newSpawn = teleporter.getSafeLocation(location, + SPAWN_LOCATION_SEARCH_TOLERANCE, SPAWN_LOCATION_SEARCH_RADIUS); + // I think we could also do this, as I think this is what Notch does. + // Not sure how it will work in the nether... + //Location newSpawn = this.spawnLocation.getWorld().getHighestBlockAt(this.spawnLocation).getLocation(); + if (newSpawn != null) { + this.plugin.log(Level.INFO, String.format("New Spawn for '%s' is located at: %s", + this.getName(), plugin.getLocationManipulation().locationToString(newSpawn))); + return newSpawn; + } else { + // If it's a standard end world, let's check in a better place: + Location newerSpawn; + newerSpawn = bs.getTopBlock(new Location(w, 0, 0, 0)); + if (newerSpawn != null) { + this.plugin.log(Level.INFO, String.format("New Spawn for '%s' is located at: %s", + this.getName(), plugin.getLocationManipulation().locationToString(newerSpawn))); + return newerSpawn; + } else { + this.plugin.log(Level.SEVERE, "Safe spawn NOT found!!!"); + } + } } - return true; + return location; } /** - * Used by the active keepSpawnInMemory-property to set the "actual" property. - * @return True if the property was successfully set. + * {@inheritDoc} */ - public boolean setActualKeepSpawnInMemory() { - // Ensure the memory setting is correct - this.getCBWorld().setKeepSpawnInMemory(this.getKnownProperty("memory", Boolean.class).getValue()); - return true; + @Override + protected void setDefaults() { + this.hidden = false; + this.alias = new String(); + this.color = EnglishChatColor.WHITE; + this.scale = getDefaultScale(environment); + this.respawnWorld = new String(); + this.allowWeather = true; + this.spawning = new SpawnSettings(); + this.currency = -1; + this.price = 0D; + this.hunger = true; + this.autoHeal = true; + this.adjustSpawn = true; + this.portalForm = AllowedPortalType.ALL; + this.gameMode = GameMode.SURVIVAL; + this.spawnLocation = (world != null) ? new SpawnLocation(world.get().getSpawnLocation()) : null; + this.autoLoad = true; + this.bedRespawn = true; + this.worldBlacklist = new ArrayList(); } /** - * Used by the active difficulty-property to set the "actual" property. - * @return True if the property was successfully set. + * getAliases(). + * @return The alias-map. + * @see SerializationConfig */ - public boolean setActualDifficulty() { - this.getCBWorld().setDifficulty(this.getKnownProperty("difficulty", Difficulty.class).getValue()); - return true; + protected static Map getAliases() { + Map aliases = new HashMap(); + aliases.put("curr", "currency"); + aliases.put("scaling", "scale"); + aliases.put("aliascolor", "color"); + aliases.put("heal", "autoHeal"); + aliases.put("storm", "allowWeather"); + aliases.put("weather", "allowWeather"); + aliases.put("spawnmemory", "keepSpawnInMemory"); + aliases.put("memory", "keepSpawnInMemory"); + aliases.put("mode", "gameMode"); + aliases.put("diff", "difficulty"); + aliases.put("spawnlocation", "spawn"); + return aliases; } - /** - * Used by the active spawn-property to set the "actual" property. - * @return True if the property was successfully set. - */ - public boolean setActualSpawn() { - // Set the spawn location - Location spawnLocation = this.getKnownProperty("spawn", Location.class).getValue(); - this.getCBWorld().setSpawnLocation(spawnLocation.getBlockX(), spawnLocation.getBlockY(), spawnLocation.getBlockZ()); - return true; - } - - private double getDefaultScale(Environment environment) { + private static double getDefaultScale(Environment environment) { if (environment == Environment.NETHER) { return 8.0; // SUPPRESS CHECKSTYLE: MagicNumberCheck } return 1.0; } - private void addToUpperLists(Permission permission) { + private void addToUpperLists(Permission perm) { Permission all = this.plugin.getServer().getPluginManager().getPermission("multiverse.*"); Permission allWorlds = this.plugin.getServer().getPluginManager().getPermission("multiverse.access.*"); Permission allExemption = this.plugin.getServer().getPluginManager().getPermission("multiverse.exempt.*"); @@ -297,7 +601,7 @@ public class MVWorld implements MultiverseWorld { allWorlds = new Permission("multiverse.access.*"); this.plugin.getServer().getPluginManager().addPermission(allWorlds); } - allWorlds.getChildren().put(permission.getName(), true); + allWorlds.getChildren().put(perm.getName(), true); if (allExemption == null) { allExemption = new Permission("multiverse.exempt.*"); this.plugin.getServer().getPluginManager().addPermission(allExemption); @@ -314,283 +618,166 @@ public class MVWorld implements MultiverseWorld { this.plugin.getServer().getPluginManager().recalculatePermissionDefaults(allWorlds); } + /** + * {@inheritDoc} + */ + @Override + public World getCBWorld() { + return this.world.get(); + } + /** * {@inheritDoc} */ @Override public String getColoredWorldString() { - EnglishChatColor worldColor = this.getKnownProperty("color", EnglishChatColor.class).getValue(); - String alias = this.getKnownProperty("alias", String.class).getValue(); - if (worldColor == null) { - this.setKnownProperty("color", "WHITE", null); - return alias + ChatColor.WHITE; - } else if (worldColor.getColor() == null) { - return alias + ChatColor.WHITE; - } if (alias.length() == 0) { alias = this.getName(); } - return worldColor.getColor() + alias + ChatColor.WHITE; - } - - // TODO: Migrate this method. - private void getMobExceptions() { - List temp; - temp = this.worldSection.getStringList("animals.exceptions"); - // Add Animals to the exclusion list - if (temp != null) { - for (String s : temp) { - this.masterList.get("animals").add(s.toUpperCase()); - } - } - temp = this.worldSection.getStringList("monsters.exceptions"); - // Add Monsters to the exclusion list - if (temp != null) { - for (String s : temp) { - this.masterList.get("monsters").add(s.toUpperCase()); - } + if ((color == null) || (color.getColor() == null)) { + this.setPropertyValueUnchecked("color", EnglishChatColor.WHITE); } + return color.getColor() + alias + ChatColor.WHITE; } /** * {@inheritDoc} + * + * @deprecated This is deprecated. */ @Override - public World getCBWorld() { - return this.world; - } - - private void initLists() { - this.masterList = new HashMap>(); - this.masterList.put("worldblacklist", new ArrayList()); - this.masterList.put("animals", new ArrayList()); - this.masterList.put("monsters", new ArrayList()); + @Deprecated + public boolean clearList(String property) { + return clearVariable(property); } /** * {@inheritDoc} + * + * @deprecated This is deprecated. */ @Override + @Deprecated public boolean clearVariable(String property) { - if (this.masterList.keySet().contains(property)) { - this.masterList.get(property).clear(); - } else { + List list = getOldAndEvilList(property); + if (list == null) return false; - } - this.worldSection.set(property.toLowerCase(), new ArrayList()); - this.saveConfig(); + list.clear(); return true; } - /** - * {@inheritDoc} - */ - @Override - public boolean addToVariable(String property, String value) { - property = property.toLowerCase(); - if (this.masterList.keySet().contains(property)) { - - if (property.equals("animals") || property.equals("monsters")) { - this.masterList.get(property).add(value.toUpperCase()); - this.worldSection.set(property.toLowerCase() + ".exceptions", this.masterList.get(property)); - this.syncMobs(); - } else { - this.masterList.get(property).add(value); - this.worldSection.set(property.toLowerCase(), this.masterList.get(property)); - } - saveConfig(); - return true; - } - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean removeFromVariable(String property, String value) { - property = property.toLowerCase(); - if (this.masterList.keySet().contains(property)) { - - if (property.equals("animals") || property.equals("monsters")) { - this.masterList.get(property).remove(value.toUpperCase()); - this.worldSection.set(property + ".exceptions", this.masterList.get(property)); - this.syncMobs(); - } else { - this.masterList.get(property).remove(value); - this.worldSection.set(property, this.masterList.get(property)); - } - saveConfig(); - return true; - } - return false; - } - - /** - * Ensure that the value of the animals and monsters config - * properties are set in accordance with the current animals - * and monsters in the world, respectively. - */ - public void syncMobs() { - - if (this.getAnimalList().isEmpty()) { - this.world.setSpawnFlags(this.world.getAllowMonsters(), this.getKnownProperty("animals", Boolean.class).getValue()); - } else { - this.world.setSpawnFlags(this.world.getAllowMonsters(), true); - } - if (this.getMonsterList().isEmpty()) { - this.world.setSpawnFlags(this.getKnownProperty("monsters", Boolean.class).getValue(), this.world.getAllowAnimals()); - } else { - this.world.setSpawnFlags(true, this.world.getAllowAnimals()); - } - this.plugin.getMVWorldManager().getTheWorldPurger().purgeWorld(this); - } - - /** - * {@inheritDoc} - */ - @Override - public void setKeepSpawnInMemory(boolean value) { - this.getKnownProperty("memory", Boolean.class).setValue(value); - saveConfig(); - } - - /** - * {@inheritDoc} - */ - @Override - // TODO: Provide better feedback - public boolean setProperty(String name, String value, CommandSender sender) throws PropertyDoesNotExistException { - if (!this.isValidPropertyName(name)) { - throw new PropertyDoesNotExistException(name); - } - return this.setKnownProperty(name, value, sender) || this.setKnownProperty(this.propertyAliases.get(name), value, sender); - - } - - private boolean isValidPropertyName(String name) { - return this.propertyList.containsKey(name) || this.propertyAliases.containsKey(name); - } - - /** - * {@inheritDoc} - */ - @Override - public String getPropertyValue(String name) throws PropertyDoesNotExistException { - if (this.propertyList.containsKey(name)) { - return this.getKnownProperty(name, Object.class).toString(); - } - throw new PropertyDoesNotExistException(name); - } - /** * {@inheritDoc} * - * @deprecated Use {@link #getProperty(String, Class)} instead + * @deprecated This is deprecated. */ @Override @Deprecated - public MVConfigProperty getProperty(String property) throws PropertyDoesNotExistException { - return getProperty(property, Object.class); + public boolean addToVariable(String property, String value) { + List list = getOldAndEvilList(property); + if (list == null) + return false; + list.add(value); + return true; } /** * {@inheritDoc} + * + * @deprecated This is deprecated. */ @Override - public MVConfigProperty getProperty(String name, Class expected) throws PropertyDoesNotExistException { - MVConfigProperty p = this.getKnownProperty(name, expected); - if (p == null) { - throw new PropertyDoesNotExistException(name); - } - return p; + @Deprecated + public boolean removeFromVariable(String property, String value) { + List list = getOldAndEvilList(property); + if (list == null) + return false; + list.remove(value); + return true; } /** - * This method should only be used from inside this class when it is KNOWN that the property exists. - * - * @param name The known name of a property - * @param expected The Type of the expected value - * @return The property object. + * @deprecated This is deprecated. */ - @SuppressWarnings("unchecked") - private MVConfigProperty getKnownProperty(String name, Class expected) { - try { - if (this.propertyList.containsKey(name)) { - return (MVConfigProperty) this.propertyList.get(name); - } else if (this.propertyAliases.containsKey(name)) { - // If the property was defined in the alias table, make sure to grab the actual name - return (MVConfigProperty) this.propertyList.get(this.propertyAliases.get(name)); - } - } catch (ClassCastException e) { - return null; - } + @Deprecated + private List getOldAndEvilList(String property) { + if (property.equalsIgnoreCase("worldblacklist")) + return this.worldBlacklist; + else if (property.equalsIgnoreCase("animals")) + return this.spawning.getAnimalSettings().getExceptions(); + else if (property.equalsIgnoreCase("monsters")) + return this.spawning.getMonsterSettings().getExceptions(); return null; } /** - * This method should only be used from inside this class when it is KNOWN that the property exists. + * {@inheritDoc} * - * @param name The known name of a property. - * @param value The value that is trying to be set. - * @param sender The person sending the command, MAY BE NULL. - * @return True if the property was saved, false if not. + * @deprecated This is deprecated. */ - private boolean setKnownProperty(String name, String value, CommandSender sender) { - MVConfigProperty property; - if (this.propertyList.containsKey(name)) { - property = this.getKnownProperty(name, Object.class); - } else if (this.propertyAliases.containsKey(name)) { - return this.setKnownProperty(this.propertyAliases.get(name), value, sender); - } else { - return false; - } - // Only allow people to cancel events when they're not the initializations. - if (this.canSave) { - MVWorldPropertyChangeEvent propertyChangeEvent = new MVWorldPropertyChangeEvent(this, sender, name, value); - this.plugin.getServer().getPluginManager().callEvent(propertyChangeEvent); - if (propertyChangeEvent.isCancelled()) { - this.plugin.log(Level.FINE, "Someone else cancelled the WorldPropertyChanged Event!!!"); - return false; - } - value = propertyChangeEvent.getNewValue(); - } - if (property.parseValue(value)) { - if (property instanceof MVActiveConfigProperty) { - return this.setActiveProperty((MVActiveConfigProperty) property); - } - this.saveConfig(); - return true; - } - return false; + @Override + @Deprecated + public com.onarandombox.MultiverseCore.configuration.MVConfigProperty getProperty(String property, + Class expected) throws PropertyDoesNotExistException { + throw new UnsupportedOperationException("'MVConfigProperty getProperty(String,Class)' is no longer supported!"); } - private boolean setActiveProperty(MVActiveConfigProperty property) { + /** + * {@inheritDoc} + * + * @deprecated This is deprecated. + */ + @Override + @Deprecated + public boolean setProperty(String name, String value, CommandSender sender) throws PropertyDoesNotExistException { + return this.setPropertyValue(name, value); + } + + /** + * {@inheritDoc} + */ + @Override + public String getPropertyValue(String property) throws PropertyDoesNotExistException { try { - if (property.getMethod() == null) { - // This property did not have a method. - this.saveConfig(); - return true; - } - Method method = this.getClass().getMethod(property.getMethod()); - Object returnVal = method.invoke(this); - if (returnVal instanceof Boolean) { - if ((Boolean) returnVal) { - this.saveConfig(); - } - return (Boolean) returnVal; - } else { - this.saveConfig(); - return true; - } - } catch (Exception e) { - // TODO: I don't care about 3 catches, - // TODO: I hate pokemon errors :/ - FernFerret - e.printStackTrace(); - return false; + return this.getProperty(property, true); + } catch (NoSuchPropertyException e) { + throw new PropertyDoesNotExistException(property, e); } } + /** + * {@inheritDoc} + */ + @Override + public boolean setPropertyValue(String property, String value) throws PropertyDoesNotExistException { + try { + return this.setProperty(property, value, true); + } catch (NoSuchPropertyException e) { + throw new PropertyDoesNotExistException(property, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public String getPropertyHelp(String property) throws PropertyDoesNotExistException { + try { + return this.getPropertyDescription(property, true); + } catch (NoSuchPropertyException e) { + throw new PropertyDoesNotExistException(property, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public WorldType getWorldType() { + // This variable is not settable in-game, therefore does not get a property. + return world.get().getWorldType(); + } + /** * {@inheritDoc} */ @@ -622,7 +809,7 @@ public class MVWorld implements MultiverseWorld { * {@inheritDoc} */ @Override - public void setSeed(Long seed) { + public void setSeed(long seed) { // This variable is not settable in-game, therefore does not get a property. this.seed = seed; } @@ -649,12 +836,10 @@ public class MVWorld implements MultiverseWorld { */ @Override public String getAlias() { - String alias = this.getKnownProperty("alias", String.class).getValue(); - if (alias == null || alias.length() == 0) { + if (this.alias == null || this.alias.length() == 0) { return this.name; } - return alias; - + return this.alias; } /** @@ -662,7 +847,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setAlias(String alias) { - this.setKnownProperty("alias", alias, null); + this.setPropertyValueUnchecked("alias", alias); } /** @@ -670,7 +855,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean canAnimalsSpawn() { - return this.getKnownProperty("animals", Boolean.class).getValue(); + return this.spawning.getAnimalSettings().doSpawn(); } /** @@ -678,7 +863,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setAllowAnimalSpawn(boolean animals) { - this.setKnownProperty("animals", animals + "", null); + this.setPropertyValueUnchecked("spawning.animals.spawn", animals); } /** @@ -686,7 +871,8 @@ public class MVWorld implements MultiverseWorld { */ @Override public List getAnimalList() { - return this.masterList.get("animals"); + // These don't fire events at the moment. Should they? + return this.spawning.getAnimalSettings().getExceptions(); } /** @@ -694,7 +880,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean canMonstersSpawn() { - return this.getKnownProperty("monsters", Boolean.class).getValue(); + return this.spawning.getMonsterSettings().doSpawn(); } /** @@ -702,7 +888,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setAllowMonsterSpawn(boolean monsters) { - this.setKnownProperty("monsters", monsters + "", null); + this.setPropertyValueUnchecked("spawning.monsters.spawn", monsters); } /** @@ -710,7 +896,8 @@ public class MVWorld implements MultiverseWorld { */ @Override public List getMonsterList() { - return this.masterList.get("monsters"); + // These don't fire events at the moment. Should they? + return this.spawning.getMonsterSettings().getExceptions(); } /** @@ -718,7 +905,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean isPVPEnabled() { - return this.getKnownProperty("pvp", Boolean.class).getValue(); + return this.pvp.get(); } /** @@ -726,7 +913,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setPVPMode(boolean pvp) { - this.setKnownProperty("pvp", pvp + "", null); + this.setPropertyValueUnchecked("pvp", pvp); } /** @@ -734,7 +921,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean isHidden() { - return this.getKnownProperty("hidden", Boolean.class).getValue(); + return this.hidden; } /** @@ -742,7 +929,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setHidden(boolean hidden) { - this.setKnownProperty("hidden", hidden + "", null); + this.setPropertyValueUnchecked("hidden", hidden); } /** @@ -750,7 +937,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public List getWorldBlacklist() { - return this.masterList.get("worldblacklist"); + return this.worldBlacklist; } /** @@ -758,7 +945,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public double getScaling() { - return this.getKnownProperty("scale", Double.class).getValue(); + return this.scale; } /** @@ -766,7 +953,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean setScaling(double scaling) { - return this.setKnownProperty("scale", scaling + "", null); + return this.setPropertyValueUnchecked("scale", scaling); } /** @@ -774,13 +961,16 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean setColor(String aliasColor) { - return this.setKnownProperty("color", aliasColor, null); + return this.setPropertyUnchecked("color", aliasColor); } /** * {@inheritDoc} + * + * @deprecated This is deprecated. */ - @Override // TODO This method should be static. (Maybe EnglishChatColor would be a good place?) + @Override + @Deprecated public boolean isValidAliasColor(String aliasColor) { return (EnglishChatColor.fromString(aliasColor) != null); } @@ -790,22 +980,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public ChatColor getColor() { - return this.getKnownProperty("color", EnglishChatColor.class).getValue().getColor(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean clearList(String property) { - if (this.masterList.containsKey(property)) { - this.masterList.get(property).clear(); - this.worldSection.set(property.toLowerCase(), this.masterList.get(property)); - this.syncMobs(); - saveConfig(); - return true; - } - return false; + return this.color.getColor(); } /** @@ -824,7 +999,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public World getRespawnToWorld() { - return (this.plugin.getServer().getWorld(this.getKnownProperty("respawn", String.class).getValue())); + return this.plugin.getServer().getWorld(respawnWorld); } /** @@ -833,7 +1008,7 @@ public class MVWorld implements MultiverseWorld { @Override public boolean setRespawnToWorld(String respawnToWorld) { if (!this.plugin.getMVWorldManager().isMVWorld(respawnToWorld)) return false; - return this.setKnownProperty("respawn", respawnToWorld, null); + return this.setPropertyValueUnchecked("respawnWorld", respawnToWorld); } /** @@ -849,7 +1024,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public int getCurrency() { - return this.getKnownProperty("curr", Integer.class).getValue(); + return this.currency; } /** @@ -857,7 +1032,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setCurrency(int currency) { - this.setKnownProperty("curr", currency + "", null); + this.setPropertyValueUnchecked("currency", currency); } /** @@ -865,7 +1040,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public double getPrice() { - return this.getKnownProperty("price", Double.class).getValue(); + return this.price; } /** @@ -873,7 +1048,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setPrice(double price) { - this.setKnownProperty("price", price + "", null); + this.setPropertyValueUnchecked("price", price); } /** @@ -884,40 +1059,17 @@ public class MVWorld implements MultiverseWorld { return this.exempt; } - private void saveConfig() { - if (this.canSave) { - try { - this.config.save(new File(this.plugin.getDataFolder(), "worlds.yml")); - } catch (IOException e) { - this.plugin.log(Level.SEVERE, "Could not save worlds.yml. Please check your filesystem permissions."); - } - } - } - /** * {@inheritDoc} */ @Override - public boolean setGameMode(String gameMode) { - return this.setKnownProperty("mode", gameMode, null); + public boolean setGameMode(String mode) { + return this.setPropertyUnchecked("gameMode", mode); } - /** - * Sets the actual gamemode by iterating through players. - * - * gameMode is not used, but it's in the reflection template. - * - * Needs a bit o' refactoring. - * - * @return True if the gamemodes of players were set successfully. (always) - */ - public boolean setActualGameMode() { - for (Player p : this.plugin.getServer().getWorld(this.getName()).getPlayers()) { - this.plugin.log(Level.FINER, String.format("Setting %s's GameMode to %s", - p.getName(), this.getKnownProperty("mode", GameMode.class).getValue().toString())); - this.plugin.getPlayerListener().handleGameMode(p, this); - } - return true; + @Override + public boolean setGameMode(GameMode mode) { + return this.setPropertyValueUnchecked("gameMode", mode); } /** @@ -925,7 +1077,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public GameMode getGameMode() { - return this.getKnownProperty("mode", GameMode.class).getValue(); + return this.gameMode; } /** @@ -933,20 +1085,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setEnableWeather(boolean weather) { - this.setKnownProperty("weather", weather + "", null); - } - - /** - * Used by the active weather-property to set the "actual" property. - * @return True if the property was successfully set. - */ - public boolean setActualWeather() { - // Disable any current weather - if (!this.getKnownProperty("weather", Boolean.class).getValue()) { - this.getCBWorld().setStorm(false); - this.getCBWorld().setThundering(false); - } - return true; + this.setPropertyValueUnchecked("allowWeather", weather); } /** @@ -954,7 +1093,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean isWeatherEnabled() { - return this.getKnownProperty("weather", Boolean.class).getValue(); + return this.allowWeather; } /** @@ -962,15 +1101,15 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean isKeepingSpawnInMemory() { - return this.getKnownProperty("memory", Boolean.class).getValue(); + return this.keepSpawnInMemory.get(); } /** * {@inheritDoc} */ @Override - public void setHunger(boolean hunger) { - this.setKnownProperty("hunger", hunger + "", null); + public void setKeepSpawnInMemory(boolean value) { + this.setPropertyValueUnchecked("keepSpawnInMemory", value); } /** @@ -978,69 +1117,15 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean getHunger() { - return this.getKnownProperty("hunger", Boolean.class).getValue(); + return this.hunger; } /** * {@inheritDoc} */ @Override - public void setSpawnLocation(Location l) { - this.getCBWorld().setSpawnLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ()); - this.getKnownProperty("spawn", Location.class).setValue(l); - this.saveConfig(); - } - - private static final int SPAWN_LOCATION_SEARCH_TOLERANCE = 16; - private static final int SPAWN_LOCATION_SEARCH_RADIUS = 16; - - private Location readSpawnFromConfig(World w) { - Location spawnLocation = w.getSpawnLocation(); - Location configLocation = this.getSpawnLocation(); - - // Set the worldspawn to our configspawn - w.setSpawnLocation(configLocation.getBlockX(), configLocation.getBlockY(), configLocation.getBlockZ()); - SafeTTeleporter teleporter = this.plugin.getSafeTTeleporter(); - BlockSafety bs = this.plugin.getBlockSafety(); - // Verify that location was safe - if (!bs.playerCanSpawnHereSafely(configLocation)) { - if (!this.getAdjustSpawn()) { - this.plugin.log(Level.FINE, "Spawn location from world.dat file was unsafe!!"); - this.plugin.log(Level.FINE, "NOT adjusting spawn for '" + this.getAlias() + "' because you told me not to."); - this.plugin.log(Level.FINE, "To turn on spawn adjustment for this world simply type:"); - this.plugin.log(Level.FINE, "/mvm set adjustspawn true " + this.getAlias()); - return configLocation; - } - // If it's not, find a better one. - this.plugin.log(Level.WARNING, "Spawn location from world.dat file was unsafe. Adjusting..."); - this.plugin.log(Level.WARNING, "Original Location: " + plugin.getLocationManipulation().strCoordsRaw(spawnLocation)); - Location newSpawn = teleporter.getSafeLocation(spawnLocation, - SPAWN_LOCATION_SEARCH_TOLERANCE, SPAWN_LOCATION_SEARCH_RADIUS); - // I think we could also do this, as I think this is what Notch does. - // Not sure how it will work in the nether... - //Location newSpawn = this.spawnLocation.getWorld().getHighestBlockAt(this.spawnLocation).getLocation(); - if (newSpawn != null) { - this.setSpawnLocation(newSpawn); - configLocation = this.getSpawnLocation(); - this.plugin.log(Level.INFO, "New Spawn for '" + this.getName() - + "' is Located at: " + plugin.getLocationManipulation().locationToString(configLocation)); - } else { - // If it's a standard end world, let's check in a better place: - Location newerSpawn; - newerSpawn = bs.getTopBlock(new Location(w, 0, 0, 0)); - if (newerSpawn != null) { - this.setSpawnLocation(newerSpawn); - configLocation = this.getSpawnLocation(); - this.plugin.log(Level.INFO, "New Spawn for '" + this.getName() - + "' is Located at: " + plugin.getLocationManipulation().locationToString(configLocation)); - } else { - this.plugin.log(Level.SEVERE, "New safe spawn NOT found!!!"); - } - - - } - } - return configLocation; + public void setHunger(boolean hunger) { + this.setPropertyValueUnchecked("hunger", hunger); } /** @@ -1048,7 +1133,15 @@ public class MVWorld implements MultiverseWorld { */ @Override public Location getSpawnLocation() { - return this.getKnownProperty("spawn", Location.class).getValue(); + return this.spawn.get(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setSpawnLocation(Location l) { + this.setPropertyValueUnchecked("spawn", l); } /** @@ -1056,20 +1149,23 @@ public class MVWorld implements MultiverseWorld { */ @Override public Difficulty getDifficulty() { - return this.getCBWorld().getDifficulty(); + return this.difficulty.get(); } /** * {@inheritDoc} + * + * @deprecated This is deprecated. */ @Override + @Deprecated public boolean setDifficulty(String difficulty) { - if (this.setKnownProperty("diff", difficulty, null)) { - // Set the difficulty - this.getCBWorld().setDifficulty(this.getKnownProperty("diff", Difficulty.class).getValue()); - return true; - } - return false; + return this.setPropertyUnchecked("difficulty", difficulty); + } + + @Override + public boolean setDifficulty(Difficulty difficulty) { + return this.setPropertyValueUnchecked("difficulty", difficulty); } /** @@ -1077,7 +1173,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean getAutoHeal() { - return this.getKnownProperty("autoheal", Boolean.class).getValue(); + return this.autoHeal; } /** @@ -1085,7 +1181,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setAutoHeal(boolean heal) { - this.setKnownProperty("autoheal", heal + "", null); + this.setPropertyValueUnchecked("autoHeal", heal); } /** @@ -1093,7 +1189,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setAdjustSpawn(boolean adjust) { - this.setKnownProperty("adjustspawn", adjust + "", null); + this.setPropertyValueUnchecked("adjustSpawn", adjust); } /** @@ -1101,15 +1197,15 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean getAdjustSpawn() { - return this.getKnownProperty("adjustspawn", Boolean.class).getValue(); + return this.adjustSpawn; } /** * {@inheritDoc} */ @Override - public void setAutoLoad(boolean autoLoad) { - this.setKnownProperty("autoload", autoLoad + "", null); + public void setAutoLoad(boolean load) { + this.setPropertyValueUnchecked("autoLoad", load); } /** @@ -1117,7 +1213,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean getAutoLoad() { - return this.getKnownProperty("autoload", Boolean.class).getValue(); + return this.autoLoad; } /** @@ -1125,7 +1221,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public void setBedRespawn(boolean respawn) { - this.setKnownProperty("bedrespawn", respawn + "", null); + this.setPropertyValueUnchecked("bedRespawn", respawn); } /** @@ -1133,7 +1229,7 @@ public class MVWorld implements MultiverseWorld { */ @Override public boolean getBedRespawn() { - return this.getKnownProperty("bedrespawn", Boolean.class).getValue(); + return this.bedRespawn; } /** @@ -1141,13 +1237,14 @@ public class MVWorld implements MultiverseWorld { */ @Override public String getAllPropertyNames() { - ChatColor color = ChatColor.AQUA; - String result = ""; - for (String propertyNames : this.propertyList.keySet()) { - result += color + propertyNames + " "; - color = (color == ChatColor.AQUA) ? ChatColor.GOLD : ChatColor.AQUA; + ChatColor myColor = ChatColor.AQUA; + StringBuilder result = new StringBuilder(); + Map serialized = this.serialize(); + for (String key : serialized.keySet()) { + result.append(myColor).append(key).append(' '); + myColor = (myColor == ChatColor.AQUA) ? ChatColor.GOLD : ChatColor.AQUA; } - return result; + return result.toString(); } /** @@ -1155,32 +1252,15 @@ public class MVWorld implements MultiverseWorld { */ @Override public String getTime() { - long time = this.getCBWorld().getTime(); - // I'm tired, so they get time in 24 hour for now. - // Someone else can add 12 hr format if they want :P - - // BEGIN CHECKSTYLE-SUPPRESSION: MagicNumberCheck - int hours = (int) ((time / 1000 + 8) % 24); - int minutes = (int) (60 * (time % 1000) / 1000); - // END CHECKSTYLE-SUPPRESSION: MagicNumberCheck - - return String.format("%d:%02d", hours, minutes); + return this.getPropertyUnchecked("time"); } /** * {@inheritDoc} */ @Override - public WorldType getWorldType() { - return this.type; - } - - /** - * {@inheritDoc} - */ - @Override - public void allowPortalMaking(AllowedPortalType type) { - this.setKnownProperty("portalform", type.toString(), null); + public boolean setTime(String timeAsString) { + return this.setPropertyUnchecked("time", timeAsString); } /** @@ -1188,72 +1268,16 @@ public class MVWorld implements MultiverseWorld { */ @Override public AllowedPortalType getAllowedPortals() { - return this.getKnownProperty("portalform", AllowedPortalType.class).getValue(); - } - - /** - * Used by the active time-property to set the "actual" property. - * @return True if the property was successfully set. - */ - public boolean setActualTime() { - return this.setTime(this.getKnownProperty("time", String.class).toString()); + return portalForm; } /** * {@inheritDoc} */ @Override - // BEGIN CHECKSTYLE-SUPPRESSION: MagicNumberCheck - public boolean setTime(String timeAsString) { - if (TIME_ALIASES.containsKey(timeAsString.toLowerCase())) { - return this.setTime(TIME_ALIASES.get(timeAsString.toLowerCase())); - } - // Regex that extracts a time in the following formats: - // 11:11pm, 11:11, 23:11, 1111, 1111p, and the aliases at the top of this file. - String timeRegex = "(\\d\\d?):?(\\d\\d)(a|p)?m?"; - Pattern pattern = Pattern.compile(timeRegex, Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(timeAsString); - matcher.find(); - int hour = 0; - double minute = 0; - int count = matcher.groupCount(); - if (count >= 2) { - hour = Integer.parseInt(matcher.group(1)); - minute = Integer.parseInt(matcher.group(2)); - } - // If there were 4 matches (all, hour, min, ampm) - if (count == 4) { - // We want 24 hour time for calcs, but if they - // added a p[m], turn it into a 24 hr one. - if (matcher.group(3).equals("p")) { - hour += 12; - } - } - // Translate 24th hour to 0th hour. - if (hour == 24) { // SUPPRESS CHECKSTYLE MagicNumberCheck - hour = 0; - } - // Clamp the hour - if (hour > 23 || hour < 0) { - return false; - } - // Clamp the minute - if (minute > 59 || minute < 0) { - return false; - } - // 60 seconds in a minute, time needs to be in hrs * 1000, per - // the bukkit docs. - double totaltime = (hour + (minute / 60.0)) * 1000; - // Somehow there's an 8 hour offset... - totaltime -= 8000; - if (totaltime < 0) { - totaltime = 24000 + totaltime; - } - - this.getCBWorld().setTime((long) totaltime); - return true; + public void allowPortalMaking(AllowedPortalType portalType) { + this.setPropertyValueUnchecked("portalForm", portalType); } - // END CHECKSTYLE-SUPPRESSION: MagicNumberCheck @Override public String toString() { diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 2ad337c3..b3d58a46 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -171,6 +171,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { public void onLoad() { // Register our config SerializationConfig.registerAll(MultiverseCoreConfiguration.class); + // Register our world + SerializationConfig.registerAll(MVWorld.class); // Create our DataFolder getDataFolder().mkdirs(); // Setup our Debug Log @@ -422,6 +424,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { */ @Override public void onDisable() { + this.saveMVConfigs(); debugLog.close(); this.banker = null; this.bank = null; diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCoreConfiguration.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCoreConfiguration.java index 25e95cfc..0595609d 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCoreConfiguration.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCoreConfiguration.java @@ -4,6 +4,7 @@ import java.util.Map; import com.onarandombox.MultiverseCore.api.MultiverseCoreConfig; +import me.main__.util.SerializationConfig.NoSuchPropertyException; import me.main__.util.SerializationConfig.Property; import me.main__.util.SerializationConfig.SerializationConfig; @@ -80,6 +81,18 @@ public class MultiverseCoreConfiguration extends SerializationConfig implements // END CHECKSTYLE-SUPPRESSION: MagicNumberCheck } + /** + * {@inheritDoc} + */ + @Override + public boolean setConfigProperty(String property, String value) { + try { + return this.setProperty(property, value, true); + } catch (NoSuchPropertyException e) { + return false; + } + } + // And here we go: /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseCoreConfig.java b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseCoreConfig.java index 25f6fad4..a694f0b6 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseCoreConfig.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseCoreConfig.java @@ -12,7 +12,7 @@ public interface MultiverseCoreConfig extends ConfigurationSerializable { * @param value The value. * @return True on success, false if the operation failed. */ - boolean setProperty(String property, String value); + boolean setConfigProperty(String property, String value); /** * Sets portalCooldown. diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java index 5bd1eb11..cefbb78a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java @@ -7,7 +7,6 @@ package com.onarandombox.MultiverseCore.api; -import com.onarandombox.MultiverseCore.configuration.MVConfigProperty; import com.onarandombox.MultiverseCore.enums.AllowedPortalType; import com.onarandombox.MultiverseCore.exceptions.PropertyDoesNotExistException; @@ -26,7 +25,6 @@ import java.util.List; * The API for a Multiverse Handled World. */ public interface MultiverseWorld { - /** * Returns the Bukkit world object that this world describes. * @@ -35,79 +33,24 @@ public interface MultiverseWorld { World getCBWorld(); /** - * Adds the property to the given value. - * It will throw a PropertyDoesNotExistException if the property is not found. + * Gets the name of this world. The name cannot be changed. + *

+ * Note for plugin developers: Usually {@link #getAlias()} + * is what you want to use instead of this method. * - * @param property The name of a world property to set. - * @param value A value in string representation, it will be parsed to the correct type. - * @param sender The sender who wants this value to be set. - * @return True if the value was set, false if not. - * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. + * @return The name of the world as a String. */ - boolean setProperty(String property, String value, CommandSender sender) throws PropertyDoesNotExistException; + String getName(); /** - * Gets the actual MVConfigProperty from this world. - * It will throw a PropertyDoesNotExistException if the property is not found. + * Gets the type of this world. As of 1.1-R1 this will be: + * FLAT or NORMAL + *

+ * This is *not* the generator. * - * @param property The name of a world property to get. - * @return A valid MVWorldProperty. - * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. - * @deprecated Use {@link #getProperty(String, Class)} instead + * @return The Type of this world. */ - @Deprecated - MVConfigProperty getProperty(String property) throws PropertyDoesNotExistException; - - /** - * Gets the string representation of a property. - * It will throw a PropertyDoesNotExistException if the property is not found. - * - * @param property The name of a world property to get. - * @return A valid MVWorldProperty. - * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. - */ - String getPropertyValue(String property) throws PropertyDoesNotExistException; - - /** - * Gets the actual MVConfigProperty from this world. - * It will throw a PropertyDoesNotExistException if the property is not found. - * - * @param property The name of a world property to get. - * @param expected The type of the expected property. Use Object.class if this doesn't matter for you. - * @param The type of the expected property. - * - * @return A valid MVWorldProperty. - * - * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. - */ - MVConfigProperty getProperty(String property, Class expected) throws PropertyDoesNotExistException; - - /** - * Removes all values from the given property. The property must be a {@link com.onarandombox.MultiverseCore.enums.AddProperties}. - * - * @param property The name of a {@link com.onarandombox.MultiverseCore.enums.AddProperties} to clear. - * @return True if it was cleared, false if not. - */ - boolean clearVariable(String property); - - /** - * Adds a value to the given property. The property must be a {@link com.onarandombox.MultiverseCore.enums.AddProperties}. - * - * @param property The name of a {@link com.onarandombox.MultiverseCore.enums.AddProperties} to add a value to. - * @param value A value in string representation, it will be parsed to the correct type. - * @return True if the value was added, false if not. - */ - boolean addToVariable(String property, String value); - - /** - * Removes a value from the given property. The property must be a {@link com.onarandombox.MultiverseCore.enums.AddProperties}. - * - * @param property The name of a {@link com.onarandombox.MultiverseCore.enums.AddProperties} to remove a value - * from. - * @param value A value in string representation, it will be parsed to the correct type. - * @return True if the value was removed, false if not. - */ - boolean removeFromVariable(String property, String value); + WorldType getWorldType(); /** * Gets the environment of this world. @@ -125,6 +68,37 @@ public interface MultiverseWorld { */ void setEnvironment(World.Environment environment); + /** + * Gets the difficulty of this world. + * + * @return The difficulty of this world. + */ + Difficulty getDifficulty(); + + /** + * Sets the difficulty of this world and returns true if success. + * Valid string values are either an integer of difficulty(0-3) or + * the name that resides in the Bukkit enum, ex. {@code PEACEFUL} + * + * @param difficulty The difficulty to set the world to as a string. + * @return True if success, false if the provided string + * could not be translated to a difficulty. + * @deprecated Use {@link #setDifficulty(Difficulty)} or, if you have to + * pass a string, use {@link #setPropertyValue(String, String)} instead. + */ + @Deprecated + boolean setDifficulty(String difficulty); + + /** + * Sets the difficulty of this world and returns {@code true} on success. + * Valid string values are either an integer of difficulty(0-3) or + * the name that resides in the Bukkit enum, ex. PEACEFUL + * + * @param difficulty The new difficulty. + * @return True if success, false if the operation failed... for whatever reason. + */ + boolean setDifficulty(Difficulty difficulty); + /** * Gets the world seed of this world. * @@ -137,15 +111,111 @@ public interface MultiverseWorld { * * @param seed A Long that is the seed. */ - void setSeed(Long seed); + void setSeed(long seed); /** - * Gets the name of this world. This cannot be changed. - * - * @return The name of the world as a String. + * Gets the help-message for a property. + * @param property The name of the property. + * @return The help-message. + * @throws PropertyDoesNotExistException Thrown if the property was not found. */ - String getName(); + String getPropertyHelp(String property) throws PropertyDoesNotExistException; + /** + * Gets a property as {@link String}. + * + * @param property The name of a world property to get. + * @return The string-representation of that property. + * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. + */ + String getPropertyValue(String property) throws PropertyDoesNotExistException; + + /** + * Sets a property to a given value. + * + * @param property The name of a world property to set. + * @param value A value in string representation, it will be parsed to the correct type. + * @return True if the value was set, false if not. + * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. + */ + boolean setPropertyValue(String property, String value) throws PropertyDoesNotExistException; + + /** + * Gets the actual MVConfigProperty from this world. + * It will throw a PropertyDoesNotExistException if the property is not found. + * + * @param property The name of a world property to get. + * @param expected The type of the expected property. Use Object.class if this doesn't matter for you. + * @param The type of the expected property. + * + * @return A valid MVWorldProperty. + * + * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. + * @deprecated We don't use {@link com.onarandombox.MultiverseCore.configuration.MVConfigProperty} any longer! + */ + @Deprecated + com.onarandombox.MultiverseCore.configuration.MVConfigProperty getProperty(String property, Class expected) throws PropertyDoesNotExistException; + + // old config + /** + * Adds the property to the given value. + * It will throw a PropertyDoesNotExistException if the property is not found. + * + * @param property The name of a world property to set. + * @param value A value in string representation, it will be parsed to the correct type. + * @param sender The sender who wants this value to be set. + * @return True if the value was set, false if not. + * @throws PropertyDoesNotExistException Thrown if the property was not found in the world. + * @deprecated Use {@link #setPropertyValue(String, String)} instead. + */ + @Deprecated + boolean setProperty(String property, String value, CommandSender sender) throws PropertyDoesNotExistException; + + /** + * Adds a value to the given property. The property must be a {@link com.onarandombox.MultiverseCore.enums.AddProperties}. + * + * @param property The name of a {@link com.onarandombox.MultiverseCore.enums.AddProperties} to add a value to. + * @param value A value in string representation, it will be parsed to the correct type. + * @return True if the value was added, false if not. + * @deprecated We changed the entire world-config-system. This is not compatible any more. + */ + @Deprecated + boolean addToVariable(String property, String value); + + /** + * Removes a value from the given property. The property must be a {@link com.onarandombox.MultiverseCore.enums.AddProperties}. + * + * @param property The name of a {@link com.onarandombox.MultiverseCore.enums.AddProperties} to remove a value + * from. + * @param value A value in string representation, it will be parsed to the correct type. + * @return True if the value was removed, false if not. + * @deprecated We changed the entire world-config-system. This is not compatible any more. + */ + @Deprecated + boolean removeFromVariable(String property, String value); + + /** + * Removes all values from the given property. The property must be a {@link com.onarandombox.MultiverseCore.enums.AddProperties}. + * + * @param property The name of a {@link com.onarandombox.MultiverseCore.enums.AddProperties} to clear. + * @return True if it was cleared, false if not. + * @deprecated We changed the entire world-config-system. This is not compatible any more. + */ + @Deprecated + boolean clearVariable(String property); + + /** + * Clears a list property (sets it to []). + * + * @param property The property to clear. + * @return True if success, false if fail. + * @deprecated We changed the entire world-config-system. This is not compatible any more. + */ + @Deprecated + boolean clearList(String property); + // end of old config stuff + + // permission stuff /** * Gets the lowercased name of the world. This method is required, since the permissables * lowercase all permissions when recalculating. @@ -158,6 +228,21 @@ public interface MultiverseWorld { */ String getPermissibleName(); + /** + * Gets the permission required to enter this world. + * + * @return The permission required to be exempt from charges to/from this world. + */ + Permission getAccessPermission(); + + /** + * Gets the permission required to be exempt when entering. + * + * @return The permission required to be exempt when entering. + */ + Permission getExemptPermission(); + // end of permission stuff + /** * Gets the alias of this world. *

@@ -174,6 +259,13 @@ public interface MultiverseWorld { */ void setAlias(String alias); + /** + * Gets the color that this world's name/alias will display as. + * + * @return The color of this world. + */ + ChatColor getColor(); + /** * Sets the color that this world's name/alias will display as. * @@ -182,19 +274,15 @@ public interface MultiverseWorld { */ boolean setColor(String color); - /** - * Gets the color that this world's name/alias will display as. - * - * @return The color of this world. - */ - ChatColor getColor(); - /** * Tells you if someone entered a valid color. * * @param color A string that may translate to a color. * @return True if it is a color, false if not. + * + * @deprecated This has been moved: {@link com.onarandombox.MultiverseCore.enums.EnglishChatColor#isValidAliasColor(String)} */ + @Deprecated boolean isValidAliasColor(String color); /** @@ -204,6 +292,7 @@ public interface MultiverseWorld { */ String getColoredWorldString(); + // animals&monster stuff /** * Gets whether or not animals are allowed to spawn in this world. * @@ -211,6 +300,22 @@ public interface MultiverseWorld { */ boolean canAnimalsSpawn(); + /** + * Sets whether or not animals can spawn. + * If there are values in {@link #getAnimalList()} and this is false, + * those animals become the exceptions, and will spawn + * + * @param allowAnimalSpawn True to allow spawning of monsters, false to prevent. + */ + void setAllowAnimalSpawn(boolean allowAnimalSpawn); + + /** + * Returns a list of animals. This list always negates the {@link #canAnimalsSpawn()} result. + * + * @return A list of animals that will spawn if {@link #canAnimalsSpawn()} is false. + */ + List getAnimalList(); + /** * Gets whether or not monsters are allowed to spawn in this world. * @@ -219,7 +324,31 @@ public interface MultiverseWorld { boolean canMonstersSpawn(); /** - * Turn pvp on or off. This setting is used to set the world's PVP mode, and thus relies on fakePVP + * Sets whether or not monsters can spawn. + * If there are values in {@link #getMonsterList()} and this is false, + * those monsters become the exceptions, and will spawn + * + * @param allowMonsterSpawn True to allow spawning of monsters, false to prevent. + */ + void setAllowMonsterSpawn(boolean allowMonsterSpawn); + + /** + * Returns a list of monsters. This list always negates the {@link #canMonstersSpawn()} result. + * + * @return A list of monsters that will spawn if {@link #canMonstersSpawn()} is false. + */ + List getMonsterList(); + // end of animal&monster stuff + + /** + * Gets whether or not PVP is enabled in this world in some form (fake or not). + * + * @return True if players can take damage from other players. + */ + boolean isPVPEnabled(); + + /** + * Turn pvp on or off. This setting is used to set the world's PVP mode. * * @param pvpMode True to enable PVP damage, false to disable it. */ @@ -234,13 +363,6 @@ public interface MultiverseWorld { @Deprecated boolean getFakePVP(); - /** - * Gets whether or not PVP is enabled in this world in some form (fake or not). - * - * @return True if players can take damage from other players. - */ - boolean isPVPEnabled(); - /** * Gets whether or not this world will display in chat, mvw and mvl regardless if a user has the * access permissions to go to this world. @@ -257,6 +379,13 @@ public interface MultiverseWorld { */ void setHidden(boolean hidden); + /** + * Gets whether weather is enabled in this world. + * + * @return True if weather events will occur, false if not. + */ + boolean isWeatherEnabled(); + /** * Sets whether or not there will be weather events in a given world. * If set to false, Multiverse will disable the weather in the world immediately. @@ -266,11 +395,11 @@ public interface MultiverseWorld { void setEnableWeather(boolean enableWeather); /** - * Gets whether weather is enabled in this world. + * Gets whether or not CraftBukkit is keeping the chunks for this world in memory. * - * @return True if weather events will occur, false if not. + * @return True if CraftBukkit is keeping spawn chunks in memory. */ - boolean isWeatherEnabled(); + boolean isKeepingSpawnInMemory(); /** * If true, tells Craftbukkit to keep a worlds spawn chunks loaded in memory (default: true) @@ -282,29 +411,11 @@ public interface MultiverseWorld { void setKeepSpawnInMemory(boolean keepSpawnInMemory); /** - * Gets whether or not CraftBukkit is keeping the chunks for this world in memory. + * Gets the spawn location of this world. * - * @return True if CraftBukkit is keeping spawn chunks in memory. + * @return The spawn location of this world. */ - boolean isKeepingSpawnInMemory(); - - /** - * Sets the difficulty of this world and returns true if success. - * Valid string values are either an integer of difficulty(0-3) or - * the name that resides in the Bukkit enum, ex. PEACEFUL - * - * @param difficulty The difficulty to set the world to as a string. - * @return True if success, false if the provided string - * could not be translated to a difficulty. - */ - boolean setDifficulty(String difficulty); - - /** - * Gets the difficulty of this world. - * - * @return The difficulty of this world. - */ - Difficulty getDifficulty(); + Location getSpawnLocation(); /** * Sets the spawn location for a world. @@ -314,11 +425,11 @@ public interface MultiverseWorld { void setSpawnLocation(Location spawnLocation); /** - * Gets the spawn location of this world. + * Gets whether or not the hunger level of players will go down in a world. * - * @return The spawn location of this world. + * @return True if it will go down, false if it will remain steady. */ - Location getSpawnLocation(); + boolean getHunger(); /** * Sets whether or not the hunger level of players will go down in a world. @@ -328,22 +439,6 @@ public interface MultiverseWorld { */ void setHunger(boolean hungerEnabled); - /** - * Gets whether or not the hunger level of players will go down in a world. - * - * @return True if it will go down, false if it will remain steady. - */ - boolean getHunger(); - - /** - * Sets the game mode of this world. - * - * @param gameMode A valid game mode string (either - * an int ex. 0 or a string ex. creative). - * @return True if the game mode was successfully changed, false if not. - */ - boolean setGameMode(String gameMode); - /** * Gets the GameMode of this world. * @@ -352,18 +447,31 @@ public interface MultiverseWorld { GameMode getGameMode(); /** - * Gets the permission required to enter this world. + * Sets the game mode of this world. * - * @return The permission required to be exempt from charges to/from this world. + * @param gameMode A valid game mode string (either + * an int ex. 0 or a string ex. creative). + * @return True if the game mode was successfully changed, false if not. + * @deprecated Use {@link #setGameMode(GameMode)} instead. If you have to + * pass a string, use {@link #setPropertyValue(String, String)}. */ - Permission getAccessPermission(); + @Deprecated + boolean setGameMode(String gameMode); /** - * Gets the permission required to be exempt when entering. + * Sets the game mode of this world. * - * @return The permission required to be exempt when entering. + * @param gameMode The new {@link GameMode}. + * @return True if the game mode was successfully changed, false if not. */ - Permission getExemptPermission(); + boolean setGameMode(GameMode gameMode); + + /** + * Gets the amount of currency it requires to enter this world. + * + * @return The amount it costs to enter this world. + */ + double getPrice(); /** * Sets the price for entry to this world. @@ -375,11 +483,11 @@ public interface MultiverseWorld { void setPrice(double price); /** - * Gets the amount of currency it requires to enter this world. + * Gets the Type of currency that will be used when users enter this world. * - * @return The amount it costs to enter this world. + * @return The Type of currency that will be used when users enter this world. */ - double getPrice(); + int getCurrency(); /** * Sets the type of item that will be required given the price is not 0. @@ -390,11 +498,11 @@ public interface MultiverseWorld { void setCurrency(int item); /** - * Gets the Type of currency that will be used when users enter this world. + * Gets the world players will respawn in if they die in this one. * - * @return The Type of currency that will be used when users enter this world. + * @return A world that exists on the server. */ - int getCurrency(); + World getRespawnToWorld(); /** * Sets the world players will respawn in if they die in this one. @@ -406,11 +514,12 @@ public interface MultiverseWorld { boolean setRespawnToWorld(String respawnWorld); /** - * Gets the world players will respawn in if they die in this one. + * Gets the scaling value of this world.Really only has an effect if you use + * Multiverse-NetherPortals. * - * @return A world that exists on the server. + * @return This world's non-negative, non-zero scale. */ - World getRespawnToWorld(); + double getScaling(); /** * Sets the scale of this world. Really only has an effect if you use @@ -422,60 +531,11 @@ public interface MultiverseWorld { boolean setScaling(double scaling); /** - * Gets the scaling value of this world.Really only has an effect if you use - * Multiverse-NetherPortals. + * Gets whether or not a world will auto-heal players if the difficulty is on peaceful. * - * @return This world's non-negative, non-zero scale. + * @return True if the world should heal (default), false if not. */ - double getScaling(); - - /** - * Gets a list of all the worlds that players CANNOT travel to from this world, - * regardless of their access permissions. - * - * @return A List of world names. - */ - List getWorldBlacklist(); - - /** - * Returns a list of animals. This list always negates the {@link #canAnimalsSpawn()} result. - * - * @return A list of animals that will spawn if {@link #canAnimalsSpawn()} is false. - */ - List getAnimalList(); - - /** - * Sets whether or not animals can spawn. - * If there are values in {@link #getAnimalList()} and this is false, - * those animals become the exceptions, and will spawn - * - * @param allowAnimalSpawn True to allow spawning of monsters, false to prevent. - */ - void setAllowAnimalSpawn(boolean allowAnimalSpawn); - - /** - * Returns a list of monsters. This list always negates the {@link #canMonstersSpawn()} ()} result. - * - * @return A list of monsters that will spawn if {@link #canMonstersSpawn()} is false. - */ - List getMonsterList(); - - /** - * Sets whether or not monsters can spawn. - * If there are values in {@link #getMonsterList()} and this is false, - * those monsters become the exceptions, and will spawn - * - * @param allowMonsterSpawn True to allow spawning of monsters, false to prevent. - */ - void setAllowMonsterSpawn(boolean allowMonsterSpawn); - - /** - * Clears a list property (sets it to []). - * - * @param property The property to clear. - * @return True if success, false if fail. - */ - boolean clearList(String property); + boolean getAutoHeal(); /** * Sets whether or not a world will auto-heal players if the difficulty is on peaceful. @@ -485,11 +545,11 @@ public interface MultiverseWorld { void setAutoHeal(boolean heal); /** - * Gets whether or not a world will auto-heal players if the difficulty is on peaceful. + * Gets whether or not Multiverse should auto-adjust the spawn for this world. * - * @return True if the world should heal (default), false if not. + * @return True if Multiverse should adjust the spawn, false if not. */ - boolean getAutoHeal(); + boolean getAdjustSpawn(); /** * Sets whether or not Multiverse should auto-adjust the spawn for this world. @@ -499,11 +559,11 @@ public interface MultiverseWorld { void setAdjustSpawn(boolean adjust); /** - * Gets whether or not Multiverse should auto-adjust the spawn for this world. + * Gets whether or not Multiverse should auto-load this world. * - * @return True if Multiverse should adjust the spawn, false if not. + * @return True if Multiverse should auto-load this world. */ - boolean getAdjustSpawn(); + boolean getAutoLoad(); /** * Sets whether or not Multiverse should auto-load this world. @@ -515,11 +575,12 @@ public interface MultiverseWorld { void setAutoLoad(boolean autoLoad); /** - * Gets whether or not Multiverse should auto-load this world. + * Gets whether or not a player who dies in this world will respawn in their + * bed or follow the normal respawn pattern. * - * @return True if Multiverse should auto-load this world. + * @return True if players dying in this world should respawn at their bed. */ - boolean getAutoLoad(); + boolean getBedRespawn(); /** * Sets whether or not a player who dies in this world will respawn in their @@ -532,19 +593,10 @@ public interface MultiverseWorld { void setBedRespawn(boolean autoLoad); /** - * Gets whether or not a player who dies in this world will respawn in their - * bed or follow the normal respawn pattern. - * - * @return True if players dying in this world should respawn at their bed. + * Same as {@link #getTime()}, but returns a string. + * @return The time as a short string: 12:34pm */ - boolean getBedRespawn(); - - /** - * Gets all the names of all properties that can be SET. - * - * @return All property names, with alternating colors. - */ - String getAllPropertyNames(); + String getTime(); /** * Sets the current time in a world. @@ -559,22 +611,6 @@ public interface MultiverseWorld { */ boolean setTime(String timeAsString); - /** - * Same as {@link #getTime()}, but returns a string. - * @return The time as a short string: 12:34pm - */ - String getTime(); - - /** - * Gets the type of this world. As of 1.1-R1 this will be: - * FLAT or NORMAL - *

- * This is *not* the generator. - * - * @return The Type of this world. - */ - WorldType getWorldType(); - /** * Sets The types of portals that are allowed in this world. * @@ -588,4 +624,20 @@ public interface MultiverseWorld { * @return The type of portals that are allowed. */ AllowedPortalType getAllowedPortals(); + + // properties that are not "getter+setter" style + /** + * Gets a list of all the worlds that players CANNOT travel to from this world, + * regardless of their access permissions. + * + * @return A List of world names. + */ + List getWorldBlacklist(); + + /** + * Gets all the names of all properties that can be SET. + * + * @return All property names, with alternating colors. + */ + String getAllPropertyNames(); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java index 6290183a..55424a94 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java @@ -51,7 +51,7 @@ public class ConfigCommand extends MultiverseCommand { sender.sendMessage(message); return; } - if (!this.plugin.getMVConfig().setProperty(args.get(0).toLowerCase(), args.get(1))) { + if (!this.plugin.getMVConfig().setConfigProperty(args.get(0).toLowerCase(), args.get(1))) { sender.sendMessage(String.format("%sSetting '%s' to '%s' failed!", ChatColor.RED, args.get(0).toLowerCase(), args.get(1))); return; } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyAddCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyAddCommand.java index abd3e135..40425de4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyAddCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyAddCommand.java @@ -81,6 +81,7 @@ public class ModifyAddCommand extends MultiverseCommand { return; } + // TODO fix this if (world.addToVariable(property, value)) { sender.sendMessage(ChatColor.GREEN + "Success! " + ChatColor.AQUA + value + ChatColor.WHITE + " was " + ChatColor.GREEN + "added to " + ChatColor.GREEN + property); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyClearCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyClearCommand.java index 78075432..d30b66f8 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyClearCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyClearCommand.java @@ -75,6 +75,7 @@ public class ModifyClearCommand extends MultiverseCommand { sender.sendMessage("Please visit our Github Wiki for more information: http://goo.gl/cgB2B"); return; } + // TODO fix this if (world.clearList(property)) { sender.sendMessage(property + " was cleared. It contains 0 values now."); sender.sendMessage(ChatColor.GREEN + "Success! " + ChatColor.AQUA + property + ChatColor.WHITE + " was " diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyRemoveCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyRemoveCommand.java index 57b4a262..f61efeff 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyRemoveCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyRemoveCommand.java @@ -81,6 +81,7 @@ public class ModifyRemoveCommand extends MultiverseCommand { sender.sendMessage("Please visit our Github Wiki for more information: http://goo.gl/4W8cY"); return; } + // TODO fix this if (world.removeFromVariable(property, value)) { sender.sendMessage(ChatColor.GREEN + "Success! " + ChatColor.AQUA + value + ChatColor.WHITE + " was " + ChatColor.RED + "removed from " + ChatColor.GREEN + property); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifySetCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifySetCommand.java index 7c753ce4..5df8b93e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifySetCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifySetCommand.java @@ -102,22 +102,21 @@ public class ModifySetCommand extends MultiverseCommand { return; } - if ((property.equalsIgnoreCase("aliascolor") || property.equalsIgnoreCase("color")) && !world.isValidAliasColor(value)) { + if ((property.equalsIgnoreCase("aliascolor") || property.equalsIgnoreCase("color")) && !EnglishChatColor.isValidAliasColor(value)) { sender.sendMessage(value + " is not a valid color. Please pick one of the following:"); sender.sendMessage(EnglishChatColor.getAllColors()); return; } try { - if (world.setProperty(property, value, sender)) { + if (world.setPropertyValue(property, value)) { sender.sendMessage(ChatColor.GREEN + "Success!" + ChatColor.WHITE + " Property " + ChatColor.AQUA + property + ChatColor.WHITE + " was set to " + ChatColor.GREEN + value); } else { - sender.sendMessage(world.getProperty(property, Object.class).getHelp()); + sender.sendMessage(ChatColor.RED + world.getPropertyHelp(property)); } } catch (PropertyDoesNotExistException e) { sender.sendMessage(ChatColor.RED + "Sorry, You can't set: '" + ChatColor.GRAY + property + ChatColor.RED + "'"); - // TODO: Display the list - sender.sendMessage(ChatColor.GOLD + "For a full list of thingys, see our wiki."); + sender.sendMessage("Valid world-properties: " + world.getAllPropertyNames()); } } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/ActiveStringConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/ActiveStringConfigProperty.java deleted file mode 100644 index 078ba1b5..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/ActiveStringConfigProperty.java +++ /dev/null @@ -1,115 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2012. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -/** - * A {@link String} config-property that will NOT be saved to the config. - */ -public class ActiveStringConfigProperty implements MVActiveConfigProperty { - private String name; - private String value; - private String method; - private String help; - - public ActiveStringConfigProperty(String name, String defaultValue, String help) { - this.name = name; - this.help = help; - this.value = defaultValue; - this.parseValue(defaultValue); - } - - public ActiveStringConfigProperty(String name, String defaultValue, String help, String method) { - this(name, defaultValue, help); - this.method = method; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public String getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public String getMethod() { - return this.method; - } - - /** - * {@inheritDoc} - */ - @Override - public void setMethod(String methodName) { - this.method = methodName; - } - - /** - * {@inheritDoc} - */ - @Override - public Class getPropertyClass() { - return String.class; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - if (value == null) { - return false; - } - this.setValue(value); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return ""; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(String value) { - if (value == null) { - return false; - } - this.value = value; - return true; - } - - @Override - public String toString() { - return value; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/BooleanConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/BooleanConfigProperty.java deleted file mode 100644 index 375a7872..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/BooleanConfigProperty.java +++ /dev/null @@ -1,135 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link Boolean} config-property. - */ -public class BooleanConfigProperty implements MVActiveConfigProperty { - private String name; - private Boolean value; - private String configNode; - private ConfigurationSection section; - private String help; - private String method; - - public BooleanConfigProperty(ConfigurationSection section, String name, Boolean defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public BooleanConfigProperty(ConfigurationSection section, String name, Boolean defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.setValue(this.section.getBoolean(this.configNode, defaultValue)); - } - - public BooleanConfigProperty(ConfigurationSection section, String name, Boolean defaultValue, String configNode, String help, String method) { - this(section, name, defaultValue, configNode, help); - this.method = method; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(Boolean value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - if (value == null) { - return false; - } - if (value.toLowerCase().equals("true") || value.toLowerCase().equals("false")) { - this.setValue(Boolean.parseBoolean(value)); - return true; - } - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - @Override - public String toString() { - return value.toString(); - } - - /** - * Gets the method that will be executed. - * - * @return The name of the method in MVWorld to be called. - */ - @Override - public String getMethod() { - return this.method; - } - - /** - * Sets the method that will be executed. - * - * @param methodName The name of the method in MVWorld to be called. - */ - @Override - public void setMethod(String methodName) { - this.method = methodName; - } - - /** - * Returns the class of the object we're looking at. - * - * @return the class of the object we're looking at. - */ - @Override - public Class getPropertyClass() { - return Boolean.class; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/ColorConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/ColorConfigProperty.java deleted file mode 100644 index 1149b815..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/ColorConfigProperty.java +++ /dev/null @@ -1,98 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import com.onarandombox.MultiverseCore.enums.EnglishChatColor; -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link EnglishChatColor} config-property. - */ -public class ColorConfigProperty implements MVConfigProperty { - private String name; - private EnglishChatColor value; - private String configNode; - private ConfigurationSection section; - private String help; - - public ColorConfigProperty(ConfigurationSection section, String name, EnglishChatColor defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public ColorConfigProperty(ConfigurationSection section, String name, EnglishChatColor defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.parseValue(this.section.getString(this.configNode, defaultValue.toString())); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public EnglishChatColor getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(EnglishChatColor value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value.getText()); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - EnglishChatColor color = EnglishChatColor.fromString(value); - if (color == null) { - return false; - } - this.setValue(color); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - @Override - public String toString() { - return value.toString(); - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/ConfigPropertyFactory.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/ConfigPropertyFactory.java deleted file mode 100644 index cb409484..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/ConfigPropertyFactory.java +++ /dev/null @@ -1,306 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2012. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import com.onarandombox.MultiverseCore.enums.AllowedPortalType; -import com.onarandombox.MultiverseCore.enums.EnglishChatColor; -import org.bukkit.Difficulty; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.configuration.ConfigurationSection; - -/** A factory to create config properties for a given world. */ -public class ConfigPropertyFactory { - private ConfigurationSection section; - - public ConfigPropertyFactory(ConfigurationSection section) { - this.section = section; - } - - // Booleans - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public BooleanConfigProperty getNewProperty(String name, boolean defaultValue, String help) { - return new BooleanConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public BooleanConfigProperty getNewProperty(String name, boolean defaultValue, String node, String help) { - return new BooleanConfigProperty(this.section, name, defaultValue, node, help); - } - - /** - * Constructs a new ActiveBooleanConfigProperty - * - * This property will execute 'method' after it has been successfully set. - * - * @param name The name of this ConifgProperty - * @param defaultValue The default value. - * @param help What string is shown for help. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param method The method that should be executed. - * @return The ActiveStringConfigProperty - */ - public BooleanConfigProperty getNewProperty(String name, boolean defaultValue, String help, String node, String method) { - return new BooleanConfigProperty(this.section, name, defaultValue, help, node, method); - } - - // Integers - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public IntegerConfigProperty getNewProperty(String name, int defaultValue, String help) { - return new IntegerConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public IntegerConfigProperty getNewProperty(String name, int defaultValue, String node, String help) { - return new IntegerConfigProperty(this.section, name, defaultValue, node, help); - } - - // Doubles - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public DoubleConfigProperty getNewProperty(String name, double defaultValue, String help) { - return new DoubleConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public DoubleConfigProperty getNewProperty(String name, double defaultValue, String node, String help) { - return new DoubleConfigProperty(this.section, name, defaultValue, node, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @param method The name of the method that's used to set this property. - * @return The ConfigProperty. - */ - public DoubleConfigProperty getNewProperty(String name, double defaultValue, String node, String help, String method) { - return new DoubleConfigProperty(this.section, name, defaultValue, node, help, method); - } - - // Strings - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public StringConfigProperty getNewProperty(String name, String defaultValue, String help) { - return new StringConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public StringConfigProperty getNewProperty(String name, String defaultValue, String node, String help) { - return new StringConfigProperty(this.section, name, defaultValue, node, help); - } - - // Colors - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public ColorConfigProperty getNewProperty(String name, EnglishChatColor defaultValue, String help) { - return new ColorConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public ColorConfigProperty getNewProperty(String name, EnglishChatColor defaultValue, String node, String help) { - return new ColorConfigProperty(this.section, name, defaultValue, node, help); - } - - // Difficulty - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public DifficultyConfigProperty getNewProperty(String name, Difficulty defaultValue, String help) { - return new DifficultyConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public DifficultyConfigProperty getNewProperty(String name, Difficulty defaultValue, String node, String help) { - return new DifficultyConfigProperty(this.section, name, defaultValue, node, help); - } - - // GameMode - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public GameModeConfigProperty getNewProperty(String name, GameMode defaultValue, String help) { - return new GameModeConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public GameModeConfigProperty getNewProperty(String name, GameMode defaultValue, String node, String help) { - return new GameModeConfigProperty(this.section, name, defaultValue, node, help); - } - - // Location - /** - * Constructs a new LocationConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public LocationConfigProperty getNewProperty(String name, Location defaultValue, String help) { - return new LocationConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public LocationConfigProperty getNewProperty(String name, Location defaultValue, String node, String help) { - return new LocationConfigProperty(this.section, name, defaultValue, node, help); - } - - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param node The name of the configuration-node this ConfigProperty will be stored as. - * @param help The text that's displayed when a user failed to set the property. - * @param method The name of the method that's used to set this property. - * @return The ConfigProperty. - */ - public LocationConfigProperty getNewProperty(String name, Location defaultValue, String node, String help, String method) { - return new LocationConfigProperty(this.section, name, defaultValue, node, help, method); - } - - // GameMode - /** - * Constructs a new ConfigProperty. - * - * @param name The name of this ConfigProperty. - * @param defaultValue The default-value. - * @param help The text that's displayed when a user failed to set the property. - * @return The ConfigProperty. - */ - public PortalTypeConfigProperty getNewProperty(String name, AllowedPortalType defaultValue, String help) { - return new PortalTypeConfigProperty(this.section, name, defaultValue, help); - } - - /** - * Constructs a new ActiveStringConfigProperty - * - * This property will execute 'method' after it has been successfully set. - * This string will NOT be saved to the config file. - * - * @param name The name of this ConifgProperty - * @param defaultValue The default value. - * @param help What string is shown for help. - * @param method The method that should be executed. - * @param saveToConfig Should the variable save to the config? - * @return The ActiveStringConfigProperty - */ - public ActiveStringConfigProperty getNewProperty(String name, String defaultValue, String help, String method, boolean saveToConfig) { - return new ActiveStringConfigProperty(name, defaultValue, help, method); - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/DifficultyConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/DifficultyConfigProperty.java deleted file mode 100644 index 42b692c6..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/DifficultyConfigProperty.java +++ /dev/null @@ -1,129 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import org.bukkit.Difficulty; -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link Difficulty} config-property. - */ -public class DifficultyConfigProperty implements MVActiveConfigProperty { - private String name; - private Difficulty value; - private String configNode; - private ConfigurationSection section; - private String help; - - public DifficultyConfigProperty(ConfigurationSection section, String name, Difficulty defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public DifficultyConfigProperty(ConfigurationSection section, String name, Difficulty defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.parseValue(this.section.getString(this.configNode, defaultValue.toString())); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public Difficulty getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(Difficulty value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value.toString()); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - try { - return this.setValue(Difficulty.getByValue(Integer.parseInt(value))); - } catch (NumberFormatException nfe) { - try { - return this.setValue(Difficulty.valueOf(value.toUpperCase())); - } catch (Exception e) { - return false; - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - @Override - public String toString() { - return value.toString(); - } - - /** - * Gets the method that will be executed. - * - * @return The name of the method in MVWorld to be called. - */ - @Override - public String getMethod() { - return "setActualDifficulty"; - } - - /** - * Sets the method that will be executed. - * - * @param methodName The name of the method in MVWorld to be called. - */ - @Override - public void setMethod(String methodName) { - // Unused here. This will only ever be setDifficulty. - } - - /** - * {@inheritDoc} - */ - @Override - public Class getPropertyClass() { - return Difficulty.class; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/DoubleConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/DoubleConfigProperty.java deleted file mode 100644 index bd6af823..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/DoubleConfigProperty.java +++ /dev/null @@ -1,133 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link Double} config-property. - */ -public class DoubleConfigProperty implements MVActiveConfigProperty { - private String name; - private Double value; - private String configNode; - private ConfigurationSection section; - private String help; - private String method; - - public DoubleConfigProperty(ConfigurationSection section, String name, Double defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public DoubleConfigProperty(ConfigurationSection section, String name, Double defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.setValue(this.section.getDouble(this.configNode, defaultValue)); - } - - public DoubleConfigProperty(ConfigurationSection section, String name, Double defaultValue, String configNode, String help, String method) { - this(section, name, defaultValue, configNode, help); - this.method = method; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public Double getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(Double value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - try { - this.setValue(Double.parseDouble(value)); - return true; - } catch (NumberFormatException e) { - return false; - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - @Override - public String toString() { - return value.toString(); - } - - /** - * Gets the method that will be executed. - * - * @return The name of the method in MVWorld to be called. - */ - @Override - public String getMethod() { - return this.method; - } - - /** - * Sets the method that will be executed. - * - * @param methodName The name of the method in MVWorld to be called. - */ - @Override - public void setMethod(String methodName) { - this.method = methodName; - } - - /** - * Returns the class of the object we're looking at. - * - * @return the class of the object we're looking at. - */ - @Override - public Class getPropertyClass() { - return Double.class; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/GameModeConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/GameModeConfigProperty.java deleted file mode 100644 index 2812982c..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/GameModeConfigProperty.java +++ /dev/null @@ -1,129 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import org.bukkit.GameMode; -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link GameMode} config-property. - */ -public class GameModeConfigProperty implements MVActiveConfigProperty { - private String name; - private GameMode value; - private String configNode; - private ConfigurationSection section; - private String help; - - public GameModeConfigProperty(ConfigurationSection section, String name, GameMode defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public GameModeConfigProperty(ConfigurationSection section, String name, GameMode defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.parseValue(this.section.getString(this.configNode, defaultValue.toString())); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public GameMode getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(GameMode value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value.toString()); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - try { - return this.setValue(GameMode.getByValue(Integer.parseInt(value))); - } catch (NumberFormatException nfe) { - try { - return this.setValue(GameMode.valueOf(value.toUpperCase())); - } catch (Exception e) { - return false; - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - @Override - public String toString() { - return value.toString(); - } - - /** - * Gets the method that will be executed. - * - * @return The name of the method in MVWorld to be called. - */ - @Override - public String getMethod() { - return "setActualGameMode"; - } - - /** - * Sets the method that will be executed. - * - * @param methodName The name of the method in MVWorld to be called. - */ - @Override - public void setMethod(String methodName) { - // Not required. Gamemode will only ever be one. - } - - /** - * {@inheritDoc} - */ - @Override - public Class getPropertyClass() { - return GameMode.class; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/IntegerConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/IntegerConfigProperty.java deleted file mode 100644 index 27961a24..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/IntegerConfigProperty.java +++ /dev/null @@ -1,97 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link Integer} config-property. - */ -public class IntegerConfigProperty implements MVConfigProperty { - private String name; - private Integer value; - private String configNode; - private ConfigurationSection section; - private String help; - - public IntegerConfigProperty(ConfigurationSection section, String name, Integer defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public IntegerConfigProperty(ConfigurationSection section, String name, Integer defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.setValue(this.section.getInt(this.configNode, defaultValue)); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public Integer getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(Integer value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - try { - this.setValue(Integer.parseInt(value)); - return true; - } catch (NumberFormatException e) { - return false; - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - @Override - public String toString() { - return value.toString(); - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/LocationConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/LocationConfigProperty.java deleted file mode 100644 index 9a7096f7..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/LocationConfigProperty.java +++ /dev/null @@ -1,154 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import com.onarandombox.MultiverseCore.utils.LocationManipulation; -import org.bukkit.Location; -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link Location} config-property. - */ -public class LocationConfigProperty implements MVActiveConfigProperty { - private String name; - private Location value; - private String configNode; - private ConfigurationSection section; - private String help; - private String method; - - public LocationConfigProperty(ConfigurationSection section, String name, Location defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public LocationConfigProperty(ConfigurationSection section, String name, Location defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.setValue(this.getLocationFromConfig(defaultValue)); - } - - public LocationConfigProperty(ConfigurationSection section, String name, Location defaultValue, String configNode, String help, String method) { - this(section, name, defaultValue, configNode, help); - this.method = method; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public Location getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - // TODO: oh my god, what should we do here? - Location parsed = LocationManipulation.stringToLocation(value); - return this.setValue(parsed); - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(Location value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode + ".x", this.value.getX()); - this.section.set(configNode + ".y", this.value.getY()); - this.section.set(configNode + ".z", this.value.getZ()); - this.section.set(configNode + ".pitch", this.value.getPitch()); - this.section.set(configNode + ".yaw", this.value.getYaw()); - this.section.set(configNode + ".world", this.value.getWorld().getName()); - - return true; - } - - private Location getLocationFromConfig(Location defaultValue) { - double x = this.section.getDouble(this.configNode + ".x", defaultValue.getX()); - double y = this.section.getDouble(this.configNode + ".y", defaultValue.getY()); - double z = this.section.getDouble(this.configNode + ".z", defaultValue.getZ()); - double pitch = this.section.getDouble(this.configNode + ".pitch", defaultValue.getPitch()); - double yaw = this.section.getDouble(this.configNode + ".yaw", defaultValue.getYaw()); - String w = this.section.getString(this.configNode + ".world", defaultValue.getWorld().getName()); - Location found = LocationManipulation.stringToLocation(w + ":" + x + "," + y + "," + z + ":" + yaw + ":" + pitch); - // TODO: oh my god, what should we do here? - if (found != null) { - return found; - } - return defaultValue; - } - - @Override - public String toString() { - // TODO: oh my god, what should we do here? - return LocationManipulation.strCoordsRaw(this.value); - } - - /** - * Gets the method that will be executed. - * - * @return The name of the method in MVWorld to be called. - */ - @Override - public String getMethod() { - return this.method; - } - - /** - * Sets the method that will be executed. - * - * @param methodName The name of the method in MVWorld to be called. - */ - @Override - public void setMethod(String methodName) { - this.method = methodName; - } - - /** - * Returns the class of the object we're looking at. - * - * @return the class of the object we're looking at. - */ - @Override - public Class getPropertyClass() { - return Location.class; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/MVActiveConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/MVActiveConfigProperty.java index 08d071ed..403d0026 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/MVActiveConfigProperty.java +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/MVActiveConfigProperty.java @@ -10,8 +10,10 @@ package com.onarandombox.MultiverseCore.configuration; /** * An "active" {@link MVConfigProperty} that uses the specified method to be "actually" set. * @param The type of the config-property. + * @deprecated This is deprecated. * @see MVConfigProperty */ +@Deprecated public interface MVActiveConfigProperty extends MVConfigProperty { /** * Gets the method that will be executed. diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/MVConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/MVConfigProperty.java index ccb5924d..537a46b5 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/MVConfigProperty.java +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/MVConfigProperty.java @@ -11,7 +11,9 @@ package com.onarandombox.MultiverseCore.configuration; * A generic config-property. * * @param The type of the config-property. + * @deprecated This is deprecated. */ +@Deprecated public interface MVConfigProperty { /** * Gets the name of this property. diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/PortalTypeConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/PortalTypeConfigProperty.java deleted file mode 100644 index 685a8101..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/PortalTypeConfigProperty.java +++ /dev/null @@ -1,97 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2012. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import com.onarandombox.MultiverseCore.enums.AllowedPortalType; -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link AllowedPortalType} config-property. - */ -public class PortalTypeConfigProperty implements MVConfigProperty { - private String name; - private AllowedPortalType value; - private String configNode; - private ConfigurationSection section; - private String help; - - public PortalTypeConfigProperty(ConfigurationSection section, String name, AllowedPortalType defaultValue, String help) { - this(section, name, defaultValue, name, help); - } - - public PortalTypeConfigProperty(ConfigurationSection section, String name, AllowedPortalType defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.parseValue(this.section.getString(this.configNode, defaultValue.toString())); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public AllowedPortalType getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(AllowedPortalType value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value.toString()); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - try { - return this.setValue(AllowedPortalType.valueOf(value.toUpperCase())); - } catch (Exception e) { - return false; - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - @Override - public String toString() { - return value.toString(); - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnLocation.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnLocation.java new file mode 100644 index 00000000..a09391c1 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnLocation.java @@ -0,0 +1,98 @@ +package com.onarandombox.MultiverseCore.configuration; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.bukkit.configuration.serialization.SerializableAs; + +/** + * Just like a regular {@link Location}, however {@code world} is usually {@code null} + * or just a weak reference and it implements {@link ConfigurationSerializable}. + */ +@SerializableAs("MVSpawnLocation") +public class SpawnLocation extends Location implements ConfigurationSerializable { + private Reference worldRef; + + public SpawnLocation(double x, double y, double z) { + super(null, x, y, z); + } + + public SpawnLocation(double x, double y, double z, float yaw, float pitch) { + super(null, x, y, z, yaw, pitch); + } + + public SpawnLocation(Location loc) { + this(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + } + + /** + * {@inheritDoc} + */ + @Override + public World getWorld() { + return (this.worldRef != null) ? this.worldRef.get() : null; + } + + /** + * {@inheritDoc} + */ + @Override + public void setWorld(World world) { + this.worldRef = new WeakReference(world); + } + + /** + * {@inheritDoc} + */ + @Override + public Chunk getChunk() { + if ((this.worldRef != null) && (this.worldRef.get() != null)) + return this.worldRef.get().getChunkAt(this); + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public Block getBlock() { + if ((this.worldRef != null) && (this.worldRef.get() != null)) + return this.worldRef.get().getBlockAt(this); + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public Map serialize() { + Map serialized = new HashMap(5); // SUPPRESS CHECKSTYLE: MagicNumberCheck + serialized.put("x", this.getX()); + serialized.put("y", this.getY()); + serialized.put("z", this.getZ()); + serialized.put("pitch", this.getPitch()); + serialized.put("yaw", this.getYaw()); + return serialized; + } + + /** + * Let Bukkit be able to deserialize this. + * @param args The map. + * @return The deserialized object. + */ + public static SpawnLocation deserialize(Map args) { + double x = ((Number) args.get("x")).doubleValue(); + double y = ((Number) args.get("y")).doubleValue(); + double z = ((Number) args.get("z")).doubleValue(); + float pitch = ((Number) args.get("pitch")).floatValue(); + float yaw = ((Number) args.get("yaw")).floatValue(); + return new SpawnLocation(x, y, z, yaw, pitch); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnSettings.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnSettings.java new file mode 100644 index 00000000..04f2cb71 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/SpawnSettings.java @@ -0,0 +1,50 @@ +package com.onarandombox.MultiverseCore.configuration; + +import java.util.Map; + +import me.main__.util.SerializationConfig.Property; +import me.main__.util.SerializationConfig.SerializationConfig; + +import org.bukkit.configuration.serialization.SerializableAs; + +/** + * Spawning-Settings. + */ +@SerializableAs("MVSpawnSettings") +public class SpawnSettings extends SerializationConfig { + @Property + private SubSpawnSettings animals; + @Property + private SubSpawnSettings monsters; + + public SpawnSettings() { + super(); + } + + public SpawnSettings(Map values) { + super(values); + } + + /** + * {@inheritDoc} + */ + @Override + public void setDefaults() { + animals = new SubSpawnSettings(); + monsters = new SubSpawnSettings(); + } + + /** + * @return the animal-settings + */ + public SubSpawnSettings getAnimalSettings() { + return animals; + } + + /** + * @return the monster-settings + */ + public SubSpawnSettings getMonsterSettings() { + return monsters; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/StringConfigProperty.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/StringConfigProperty.java deleted file mode 100644 index 948034ce..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/StringConfigProperty.java +++ /dev/null @@ -1,96 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.configuration; - -import org.bukkit.configuration.ConfigurationSection; - -/** - * A {@link String} config-property. - */ -public class StringConfigProperty implements MVConfigProperty { - private String name; - private String value; - private String configNode; - private ConfigurationSection section; - private String help; - - public StringConfigProperty(ConfigurationSection section, String name, String defaultValue, String help) { - this(section, name, defaultValue, defaultValue, help); - } - - public StringConfigProperty(ConfigurationSection section, String name, String defaultValue, String configNode, String help) { - this.name = name; - this.configNode = configNode; - this.section = section; - this.help = help; - this.value = defaultValue; - this.parseValue(this.section.getString(this.configNode, defaultValue)); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return this.name; - } - - /** - * {@inheritDoc} - */ - @Override - public String getValue() { - return this.value; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean parseValue(String value) { - if (value == null) { - return false; - } - this.setValue(value); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public String getConfigNode() { - return this.configNode; - } - - /** - * {@inheritDoc} - */ - @Override - public String getHelp() { - return this.help; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setValue(String value) { - if (value == null) { - return false; - } - this.value = value; - this.section.set(configNode, this.value); - return true; - } - - @Override - public String toString() { - return value; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/SubSpawnSettings.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/SubSpawnSettings.java new file mode 100644 index 00000000..d66bd133 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/SubSpawnSettings.java @@ -0,0 +1,59 @@ +package com.onarandombox.MultiverseCore.configuration; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import me.main__.util.SerializationConfig.Property; +import me.main__.util.SerializationConfig.SerializationConfig; + +import org.bukkit.configuration.serialization.SerializableAs; + +/** + * SpawnSubSettings. + */ +@SerializableAs("MVSpawnSubSettings") +public class SubSpawnSettings extends SerializationConfig { + @Property + private boolean spawn; + @Property + private List exceptions; + + public SubSpawnSettings() { + super(); + } + + public SubSpawnSettings(Map values) { + super(values); + } + + /** + * {@inheritDoc} + */ + @Override + public void setDefaults() { + spawn = true; + exceptions = new ArrayList(); + } + + /** + * @return spawn + */ + public boolean doSpawn() { + return spawn; + } + + /** + * @param spawn The new value. + */ + public void setSpawn(boolean spawn) { + this.spawn = spawn; + } + + /** + * @return the exceptions + */ + public List getExceptions() { + return exceptions; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/WorldPropertyValidator.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/WorldPropertyValidator.java new file mode 100644 index 00000000..b051eabd --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/WorldPropertyValidator.java @@ -0,0 +1,27 @@ +package com.onarandombox.MultiverseCore.configuration; + +import org.bukkit.Bukkit; + +import com.onarandombox.MultiverseCore.MVWorld; +import com.onarandombox.MultiverseCore.event.MVWorldPropertyChangeEvent; + +import me.main__.util.SerializationConfig.ChangeDeniedException; +import me.main__.util.SerializationConfig.ObjectUsingValidator; + +/** + * Validates world-property-changes. + * @param The type of the property that should be validated. + */ +public class WorldPropertyValidator extends ObjectUsingValidator { + /** + * {@inheritDoc} + */ + @Override + public T validateChange(String property, T newValue, T oldValue, MVWorld object) throws ChangeDeniedException { + MVWorldPropertyChangeEvent event = new MVWorldPropertyChangeEvent(object, null, property, newValue); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + throw new ChangeDeniedException(); + return event.getTheNewValue(); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/enums/EnglishChatColor.java b/src/main/java/com/onarandombox/MultiverseCore/enums/EnglishChatColor.java index 4f3d015a..007f2024 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/enums/EnglishChatColor.java +++ b/src/main/java/com/onarandombox/MultiverseCore/enums/EnglishChatColor.java @@ -99,4 +99,13 @@ public enum EnglishChatColor { } return null; } + + /** + * Looks if the given-color name is a valid color. + * @param aliasColor A color-name. + * @return True if the name is a valid color, false if it isn't. + */ + public static boolean isValidAliasColor(String aliasColor) { + return (EnglishChatColor.fromString(aliasColor) != null); + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/event/MVWorldPropertyChangeEvent.java b/src/main/java/com/onarandombox/MultiverseCore/event/MVWorldPropertyChangeEvent.java index 1cdd6404..d85e104a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/event/MVWorldPropertyChangeEvent.java +++ b/src/main/java/com/onarandombox/MultiverseCore/event/MVWorldPropertyChangeEvent.java @@ -19,16 +19,18 @@ import org.bukkit.event.HandlerList; * If it is cancelled, no change will happen. *

* If you want to get the values of the world before the change, query the world. - * If you want to get the value being changed, use getProperty() + * To get the name of the property that was changed, use {@link #getPropertyName()}. + * To get the new value, use {@link #getTheNewValue()}. To change it, use {@link #setTheNewValue(Object)}. + * @param The type of the property that was set. */ -public class MVWorldPropertyChangeEvent extends Event implements Cancellable { +public class MVWorldPropertyChangeEvent extends Event implements Cancellable { private MultiverseWorld world; private CommandSender changer; private boolean isCancelled = false; - private String value; private String name; + private T value; - public MVWorldPropertyChangeEvent(MultiverseWorld world, CommandSender changer, String name, String value) { + public MVWorldPropertyChangeEvent(MultiverseWorld world, CommandSender changer, String name, T value) { this.world = world; this.changer = changer; this.name = name; @@ -64,16 +66,38 @@ public class MVWorldPropertyChangeEvent extends Event implements Cancellable { /** * Gets the new value. * @return The new value. + * @deprecated Use {@link #getTheNewValue()} instead. */ + @Deprecated public String getNewValue() { + return this.value.toString(); + } + + /** + * Gets the new value. + * @return The new value. + */ + public T getTheNewValue() { return this.value; } /** * Sets the new value. + *

+ * This method is only a stub, it'll always throw an {@link UnsupportedOperationException}! * @param value The new new value. + * @deprecated Use {@link #setTheNewValue(Object)} instead. */ + @Deprecated public void setNewValue(String value) { + throw new UnsupportedOperationException(); + } + + /** + * Sets the new value. + * @param value The new value. + */ + public void setTheNewValue(T value) { this.value = value; } @@ -88,6 +112,8 @@ public class MVWorldPropertyChangeEvent extends Event implements Cancellable { /** * Gets the person (or console) who was responsible for the change. + *

+ * This may be null! * * @return The person (or console) who was responsible for the change. */ diff --git a/src/main/java/com/onarandombox/MultiverseCore/exceptions/PropertyDoesNotExistException.java b/src/main/java/com/onarandombox/MultiverseCore/exceptions/PropertyDoesNotExistException.java index fc367342..95a24169 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/exceptions/PropertyDoesNotExistException.java +++ b/src/main/java/com/onarandombox/MultiverseCore/exceptions/PropertyDoesNotExistException.java @@ -14,4 +14,8 @@ public class PropertyDoesNotExistException extends Exception { public PropertyDoesNotExistException(String name) { super(name); } + + public PropertyDoesNotExistException(String name, Throwable cause) { + super(name, cause); + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 388a694d..840588ab 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -13,7 +13,6 @@ import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; import com.onarandombox.MultiverseCore.api.SafeTTeleporter; import com.onarandombox.MultiverseCore.api.WorldPurger; -import com.onarandombox.MultiverseCore.commands.EnvironmentCommand; import com.onarandombox.MultiverseCore.event.MVWorldDeleteEvent; import org.bukkit.World; import org.bukkit.World.Environment; @@ -44,16 +43,16 @@ import java.util.logging.Level; public class WorldManager implements MVWorldManager { private MultiverseCore plugin; private WorldPurger worldPurger; + private Map worldsFromTheConfig; private Map worlds; - private List unloadedWorlds; private FileConfiguration configWorlds = null; private Map defaultGens; private String firstSpawn; public WorldManager(MultiverseCore core) { this.plugin = core; + this.worldsFromTheConfig = new HashMap(); this.worlds = new HashMap(); - this.unloadedWorlds = new ArrayList(); this.worldPurger = new SimpleWorldPurger(plugin); } @@ -118,7 +117,10 @@ public class WorldManager implements MVWorldManager { c.generateStructures(generateStructures); } - World world; + // Important: doLoad() needs the MVWorld-object in worldsFromTheConfig + if (!worldsFromTheConfig.containsKey(name)) + worldsFromTheConfig.put(name, new MVWorld(useSpawnAdjust)); + StringBuilder builder = new StringBuilder(); builder.append("Loading World & Settings - '").append(name).append("'"); builder.append(" - Env: ").append(env); @@ -131,27 +133,12 @@ public class WorldManager implements MVWorldManager { } this.plugin.log(Level.INFO, builder.toString()); - try { - world = c.createWorld(); - } catch (Exception e) { - this.plugin.log(Level.SEVERE, "The world '" + name + "' could NOT be loaded because it contains errors!"); - this.plugin.log(Level.SEVERE, "Try using Chukster to repair your world! '" + name + "'"); - this.plugin.log(Level.SEVERE, "http://forums.bukkit.org/threads/admin-chunkster.8186/"); - return false; - } - - if (world == null) { + if (!doLoad(c)) { this.plugin.log(Level.SEVERE, "Failed to Create/Load the world '" + name + "'"); return false; } - MultiverseWorld mvworld = new MVWorld(world, this.configWorlds, this.plugin, - this.plugin.getServer().getWorld(name).getSeed(), generator, useSpawnAdjust); - this.worldPurger.purgeWorld(mvworld); - this.worlds.put(name, mvworld); - if (this.unloadedWorlds.contains(name)) { - this.unloadedWorlds.remove(name); - } + this.saveWorldsConfig(); return true; } @@ -185,9 +172,9 @@ public class WorldManager implements MVWorldManager { this.configWorlds.set("worlds." + name, null); this.saveWorldsConfig(); - // Remove it from the list of unloaded worlds. - if (this.unloadedWorlds.contains(name)) { - this.unloadedWorlds.remove(name); + // Remove it from the list of worlds. + if (this.worldsFromTheConfig.containsKey(name)) { + this.worldsFromTheConfig.remove(name); } return true; } else { @@ -236,15 +223,14 @@ public class WorldManager implements MVWorldManager { if (this.unloadWorldFromBukkit(name, true)) { this.worlds.remove(name); this.plugin.log(Level.INFO, "World '" + name + "' was unloaded from memory."); - this.unloadedWorlds.add(name); return true; } else { this.plugin.log(Level.WARNING, "World '" + name + "' could not be unloaded. Is it a default world?"); } } else if (this.plugin.getServer().getWorld(name) != null) { this.plugin.log(Level.WARNING, "Hmm Multiverse does not know about this world but it's loaded in memory."); - this.plugin.log(Level.WARNING, "To unload it using multiverse, use:"); - this.plugin.log(Level.WARNING, "/mv import " + name + " " + this.plugin.getServer().getWorld(name).getEnvironment().toString()); + this.plugin.log(Level.WARNING, "To let Multiverse know about it, use:"); + this.plugin.log(Level.WARNING, String.format("/mv import %s %s", name, this.plugin.getServer().getWorld(name).getEnvironment().toString())); } else { this.plugin.log(Level.INFO, "Multiverse does not know about " + name + " and it's not loaded by Bukkit."); } @@ -258,36 +244,48 @@ public class WorldManager implements MVWorldManager { public boolean loadWorld(String name) { // Check if the World is already loaded if (this.worlds.containsKey(name)) { - // Ensure it's not unloaded, since it IS loaded. - if (this.unloadedWorlds.contains(name)) { - this.unloadedWorlds.remove(name); - } return true; } - // Grab all the Worlds from the Config. - Set worldKeys = this.configWorlds.getConfigurationSection("worlds").getKeys(false); - - // Check that the list is not null and that the config contains the world - if ((worldKeys != null) && (worldKeys.contains(name))) { - // Grab the initial values from the config file. - String environment = this.configWorlds.getString("worlds." + name + ".environment", "NORMAL"); // Grab the Environment as a String. - String type = this.configWorlds.getString("worlds." + name + ".type", "NORMAL"); - String seedString = this.configWorlds.getString("worlds." + name + ".seed", ""); - String generatorString = this.configWorlds.getString("worlds." + name + ".generator"); - boolean generateStructures = this.configWorlds.getBoolean("worlds." + name + ".generatestructures", true); - - this.addWorld(name, EnvironmentCommand.getEnvFromString(environment), seedString, - EnvironmentCommand.getWorldTypeFromString(type), generateStructures, generatorString); - if (this.unloadedWorlds.contains(name)) { - this.unloadedWorlds.remove(name); - } - return true; + // Check that the world is in the config + if (worldsFromTheConfig.containsKey(name)) { + return doLoad(name); } else { return false; } } + private void brokenWorld(String name) { + this.plugin.log(Level.SEVERE, "The world '" + name + "' could NOT be loaded because it contains errors!"); + this.plugin.log(Level.SEVERE, "Try using Chukster to repair your world! '" + name + "'"); + this.plugin.log(Level.SEVERE, "http://forums.bukkit.org/threads/admin-chunkster.8186/"); + } + + private boolean doLoad(String name) { + return doLoad(WorldCreator.name(name)); + } + + private boolean doLoad(WorldCreator creator) { + String worldName = creator.name(); + if (!worldsFromTheConfig.containsKey(worldName)) + throw new IllegalArgumentException("That world doesn't exist!"); + if (worlds.containsKey(worldName)) + throw new IllegalArgumentException("That world is already loaded!"); + MVWorld mvworld = worldsFromTheConfig.get(worldName); + World cbworld; + try { + cbworld = WorldCreator.name(worldName).createWorld(); + } catch (Exception e) { + e.printStackTrace(); + brokenWorld(worldName); + return false; + } + mvworld.init(cbworld, plugin); + this.worldPurger.purgeWorld(mvworld); + this.worlds.put(worldName, mvworld); + return true; + } + /** * {@inheritDoc} */ @@ -459,18 +457,14 @@ public class WorldManager implements MVWorldManager { public void loadDefaultWorlds() { this.ensureConfigIsPrepared(); List myWorlds = this.plugin.getServer().getWorlds(); - Set worldStrings = this.configWorlds.getConfigurationSection("worlds").getKeys(false); for (World w : myWorlds) { String name = w.getName(); - if (!worldStrings.contains(name)) { + if (!worldsFromTheConfig.containsKey(name)) { + String generator = null; if (this.defaultGens.containsKey(name)) { - this.addWorld(name, w.getEnvironment(), w.getSeed() + "", w.getWorldType(), - w.canGenerateStructures(), this.defaultGens.get(name)); - } else { - this.addWorld(name, w.getEnvironment(), w.getSeed() + "", w.getWorldType(), - w.canGenerateStructures(), null); + generator = this.defaultGens.get(name); } - + this.addWorld(name, w.getEnvironment(), String.valueOf(w.getSeed()), w.getWorldType(), w.canGenerateStructures(), generator); } } } @@ -478,11 +472,6 @@ public class WorldManager implements MVWorldManager { private void ensureConfigIsPrepared() { if (this.configWorlds.getConfigurationSection("worlds") == null) { this.configWorlds.createSection("worlds"); - try { - this.configWorlds.save(new File(this.plugin.getDataFolder(), "worlds.yml")); - } catch (IOException e) { - this.plugin.log(Level.SEVERE, "Failed to save worlds.yml. Please check your file permissions."); - } } } @@ -495,13 +484,10 @@ public class WorldManager implements MVWorldManager { int count = 0; this.ensureConfigIsPrepared(); this.ensureSecondNamespaceIsPrepared(); - // Grab all the Worlds from the Config. - Set worldKeys = this.configWorlds.getConfigurationSection("worlds").getKeys(false); // Force the worlds to be loaded, ie don't just load new worlds. if (forceLoad) { // Remove all world permissions. - Permission allAccess = this.plugin.getServer().getPluginManager().getPermission("multiverse.access.*"); Permission allExempt = this.plugin.getServer().getPluginManager().getPermission("multiverse.exempt.*"); for (MultiverseWorld w : this.worlds.values()) { @@ -523,45 +509,19 @@ public class WorldManager implements MVWorldManager { this.worlds.clear(); } - // Check that the list is not null. - if (worldKeys != null) { - for (String worldKey : worldKeys) { - // Check if the World is already loaded within the Plugin. - if (this.worlds.containsKey(worldKey)) { - continue; - } + for (Map.Entry entry : worldsFromTheConfig.entrySet()) { + if (worlds.containsKey(entry.getKey())) + continue; + if (!entry.getValue().getAutoLoad()) + continue; - // If autoload was set to false, don't load this one. - if (!this.configWorlds.getBoolean("worlds." + worldKey + ".autoload", true)) { - if (!this.unloadedWorlds.contains(worldKey)) { - this.unloadedWorlds.add(worldKey); - } - continue; - } - // Grab the initial values from the config file. - String environment = this.configWorlds.getString("worlds." + worldKey + ".environment", "NORMAL"); - String type = this.configWorlds.getString("worlds." + worldKey + ".type", "NORMAL"); - String seedString = this.configWorlds.getString("worlds." + worldKey + ".seed", null); - boolean generateStructures = this.configWorlds.getBoolean("worlds." + worldKey + ".generatestructures", true); - if (seedString == null) { - seedString = this.configWorlds.getLong("worlds." + worldKey + ".seed") + ""; - } - - String generatorString = this.configWorlds.getString("worlds." + worldKey + ".generator"); - if (environment.equalsIgnoreCase("skylands")) { - this.plugin.log(Level.WARNING, "Found SKYLANDS world. Not importing automatically, as it won't work atm :("); - continue; - } - addWorld(worldKey, EnvironmentCommand.getEnvFromString(environment), seedString, - EnvironmentCommand.getWorldTypeFromString(type), generateStructures, generatorString); - - // Increment the world count + if (doLoad(entry.getKey())) count++; - } } // Simple Output to the Console to show how many Worlds were loaded. this.plugin.log(Level.INFO, count + " - World(s) loaded."); + this.saveWorldsConfig(); } private void ensureSecondNamespaceIsPrepared() { @@ -591,14 +551,21 @@ public class WorldManager implements MVWorldManager { } /** - * Load the config from a file. - * - * @param file The file to load. - * @return A loaded configuration. + * {@inheritDoc} */ @Override public FileConfiguration loadWorldConfig(File file) { this.configWorlds = YamlConfiguration.loadConfiguration(file); + this.ensureConfigIsPrepared(); + // load world-objects + Set worldKeys = this.configWorlds.getConfigurationSection("worlds").getKeys(false); + if (worldKeys != null) { + for (String key : worldKeys) { + if (this.configWorlds.get("worlds." + key) instanceof MVWorld) { + this.worldsFromTheConfig.put(key, (MVWorld) this.configWorlds.get("worlds." + key)); + } + } + } return this.configWorlds; } @@ -608,6 +575,9 @@ public class WorldManager implements MVWorldManager { @Override public boolean saveWorldsConfig() { try { + for (Map.Entry entry : worlds.entrySet()) { + this.configWorlds.set("worlds." + entry.getKey(), entry.getValue()); + } this.configWorlds.save(new File(this.plugin.getDataFolder(), "worlds.yml")); return true; } catch (IOException e) { @@ -629,7 +599,9 @@ public class WorldManager implements MVWorldManager { */ @Override public List getUnloadedWorlds() { - return this.unloadedWorlds; + List allNames = new ArrayList(this.worldsFromTheConfig.keySet()); + allNames.removeAll(worlds.keySet()); + return allNames; } /** diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java index 5dc074a6..4e4619a2 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java +++ b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java @@ -21,6 +21,7 @@ import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; @@ -45,6 +46,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.configuration.SpawnLocation; import com.onarandombox.MultiverseCore.test.utils.TestInstanceCreator; import com.onarandombox.MultiverseCore.utils.WorldManager; @@ -145,7 +147,7 @@ public class TestWorldProperties { assertTrue(mvWorld.isKeepingSpawnInMemory()); assertTrue(mvWorld.getBedRespawn()); assertTrue(mvWorld.getAutoLoad()); - assertEquals(new Location(mvWorld.getCBWorld(), 0, 64, 0), mvWorld.getSpawnLocation()); + assertEquals(new SpawnLocation(0, 64, 0), mvWorld.getSpawnLocation()); /* ****************************************** * * Call some events and verify behavior @@ -242,7 +244,7 @@ public class TestWorldProperties { mvWorld.setAutoLoad(false); assertEquals(false, mvWorld.getAutoLoad()); mvWorld.setSpawnLocation(new Location(mvWorld.getCBWorld(), 1, 1, 1)); - assertEquals(new Location(mvWorld.getCBWorld(), 1, 1, 1), mvWorld.getSpawnLocation()); + assertEquals(new SpawnLocation(1, 1, 1), mvWorld.getSpawnLocation()); /* ****************************************** * * Call some events and verify behavior @@ -279,7 +281,7 @@ public class TestWorldProperties { core.getPlayerListener().playerJoin(playerJoinEvent); verify(mockPlayer, never()).teleport(any(Location.class)); core.getPlayerListener().playerJoin(playerNewJoinEvent); - verify(mockNewPlayer).teleport(new Location(mvWorld.getCBWorld(), 1, 1, 1)); + verify(mockNewPlayer).teleport(new SpawnLocation(1, 1, 1)); // call player respawn events core.getPlayerListener().playerRespawn(playerRespawnBed); diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldStuff.java b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldStuff.java index fc63b0e6..790fa787 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldStuff.java +++ b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldStuff.java @@ -235,13 +235,13 @@ public class TestWorldStuff { // Now fail one. plugin.onCommand(mockCommandSender, mockCommand, "", new String[]{ "modify", "set", "mode", "fish", "world" }); try { - verify(mockCommandSender).sendMessage(mainWorld.getProperty("mode", Object.class).getHelp()); + verify(mockCommandSender).sendMessage(ChatColor.RED + mainWorld.getPropertyHelp("mode")); } catch (PropertyDoesNotExistException e) { fail("Mode property did not exist."); } plugin.onCommand(mockCommandSender, mockCommand, "", new String[]{ "modify", "set", "blah", "fish", "world" }); - verify(mockCommandSender).sendMessage(ChatColor.RED + "Sorry, You can't set: '"+ChatColor.GRAY+ "blah" + ChatColor.RED + "'"); + verify(mockCommandSender).sendMessage(ChatColor.RED + "Sorry, You can't set: '" + ChatColor.GRAY + "blah" + ChatColor.RED + "'"); } private void createInitialWorlds(Plugin plugin, Command command) { diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java b/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java index c0f22b03..2acc9f6b 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java +++ b/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.WeakHashMap; import org.bukkit.Location; import org.bukkit.Material; @@ -28,6 +29,9 @@ public class MockWorldFactory { private static final Map createdWorlds = new HashMap(); + private static final Map pvpStates = new WeakHashMap(); + private static final Map keepSpawnInMemoryStates = new WeakHashMap(); + private MockWorldFactory() { } @@ -38,10 +42,43 @@ public class MockWorldFactory { private static World basics(String world, World.Environment env, WorldType type) { World mockWorld = mock(World.class); when(mockWorld.getName()).thenReturn(world); + when(mockWorld.getPVP()).thenAnswer(new Answer() { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + World w = (World) invocation.getMock(); + if (!pvpStates.containsKey(w)) + pvpStates.put(w, true); // default value + return pvpStates.get(w); + } + }); + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + pvpStates.put((World) invocation.getMock(), (Boolean) invocation.getArguments()[0]); + return null; + } + }).when(mockWorld).setPVP(anyBoolean()); + when(mockWorld.getKeepSpawnInMemory()).thenAnswer(new Answer() { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + World w = (World) invocation.getMock(); + if (!keepSpawnInMemoryStates.containsKey(w)) + keepSpawnInMemoryStates.put(w, true); // default value + return keepSpawnInMemoryStates.get(w); + } + }); + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + keepSpawnInMemoryStates.put((World) invocation.getMock(), (Boolean) invocation.getArguments()[0]); + return null; + } + }).when(mockWorld).setKeepSpawnInMemory(anyBoolean()); when(mockWorld.getEnvironment()).thenReturn(env); when(mockWorld.getWorldType()).thenReturn(type); when(mockWorld.getSpawnLocation()).thenReturn(new Location(mockWorld, 0, 64, 0)); when(mockWorld.getWorldFolder()).thenAnswer(new Answer() { + @Override public File answer(InvocationOnMock invocation) throws Throwable { if (!(invocation.getMock() instanceof World)) return null; @@ -51,6 +88,7 @@ public class MockWorldFactory { } }); when(mockWorld.getBlockAt(any(Location.class))).thenAnswer(new Answer() { + @Override public Block answer(InvocationOnMock invocation) throws Throwable { Location loc; try { @@ -85,6 +123,7 @@ public class MockWorldFactory { when(mockWorld.getWorldType()).thenReturn(type); when(mockWorld.getSpawnLocation()).thenReturn(new Location(mockWorld, 0, 64, 0)); when(mockWorld.getWorldFolder()).thenAnswer(new Answer() { + @Override public File answer(InvocationOnMock invocation) throws Throwable { if (!(invocation.getMock() instanceof World)) return null; @@ -94,6 +133,7 @@ public class MockWorldFactory { } }); when(mockWorld.getBlockAt(any(Location.class))).thenAnswer(new Answer() { + @Override public Block answer(InvocationOnMock invocation) throws Throwable { Location loc; try { diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/utils/TestInstanceCreator.java b/src/test/java/com/onarandombox/MultiverseCore/test/utils/TestInstanceCreator.java index 1f93233c..c7b91c38 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/test/utils/TestInstanceCreator.java +++ b/src/test/java/com/onarandombox/MultiverseCore/test/utils/TestInstanceCreator.java @@ -103,6 +103,7 @@ public class TestInstanceCreator { // Give the server some worlds when(mockServer.getWorld(anyString())).thenAnswer(new Answer() { + @Override public World answer(InvocationOnMock invocation) throws Throwable { String arg; try { @@ -115,6 +116,7 @@ public class TestInstanceCreator { }); when(mockServer.getWorlds()).thenAnswer(new Answer>() { + @Override public List answer(InvocationOnMock invocation) throws Throwable { return MockWorldFactory.getWorlds(); } @@ -124,6 +126,7 @@ public class TestInstanceCreator { when(mockServer.createWorld(Matchers.isA(WorldCreator.class))).thenAnswer( new Answer() { + @Override public World answer(InvocationOnMock invocation) throws Throwable { WorldCreator arg; try { @@ -146,6 +149,7 @@ public class TestInstanceCreator { BukkitScheduler mockScheduler = mock(BukkitScheduler.class); when(mockScheduler.scheduleSyncDelayedTask(any(Plugin.class), any(Runnable.class), anyLong())). thenAnswer(new Answer() { + @Override public Integer answer(InvocationOnMock invocation) throws Throwable { Runnable arg; try { @@ -158,6 +162,7 @@ public class TestInstanceCreator { }}); when(mockScheduler.scheduleSyncDelayedTask(any(Plugin.class), any(Runnable.class))). thenAnswer(new Answer() { + @Override public Integer answer(InvocationOnMock invocation) throws Throwable { Runnable arg; try { @@ -204,6 +209,7 @@ public class TestInstanceCreator { commandSenderLogger.setParent(Util.logger); commandSender = mock(CommandSender.class); doAnswer(new Answer() { + @Override public Void answer(InvocationOnMock invocation) throws Throwable { commandSenderLogger.info(ChatColor.stripColor((String) invocation.getArguments()[0])); return null; From bbe134bd1a45ee9e7067066e402dab41fc1e025b Mon Sep 17 00:00:00 2001 From: "main()" Date: Sun, 4 Mar 2012 19:36:14 +0100 Subject: [PATCH 02/22] Dots in world-names are now possible! :D --- .../MultiverseCore/utils/WorldManager.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 840588ab..94d2087e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -18,6 +18,7 @@ import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.WorldCreator; import org.bukkit.WorldType; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -35,6 +36,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Stack; import java.util.logging.Level; /** @@ -470,6 +472,7 @@ public class WorldManager implements MVWorldManager { } private void ensureConfigIsPrepared() { + this.configWorlds.options().pathSeparator(SEPARATOR); if (this.configWorlds.getConfigurationSection("worlds") == null) { this.configWorlds.createSection("worlds"); } @@ -550,6 +553,8 @@ public class WorldManager implements MVWorldManager { return worldPurger; } + private static final char SEPARATOR = '\uF8FF'; + /** * {@inheritDoc} */ @@ -557,12 +562,26 @@ public class WorldManager implements MVWorldManager { public FileConfiguration loadWorldConfig(File file) { this.configWorlds = YamlConfiguration.loadConfiguration(file); this.ensureConfigIsPrepared(); + try { + this.configWorlds.save(new File(this.plugin.getDataFolder(), "worlds.yml")); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } // load world-objects - Set worldKeys = this.configWorlds.getConfigurationSection("worlds").getKeys(false); - if (worldKeys != null) { - for (String key : worldKeys) { - if (this.configWorlds.get("worlds." + key) instanceof MVWorld) { - this.worldsFromTheConfig.put(key, (MVWorld) this.configWorlds.get("worlds." + key)); + Stack worldKeys = new Stack(); + worldKeys.addAll(this.configWorlds.getConfigurationSection("worlds").getKeys(false)); + while (!worldKeys.isEmpty()) { + String key = worldKeys.pop(); + String path = "worlds" + SEPARATOR + key; + Object obj = this.configWorlds.get(path); + if ((obj != null) && (obj instanceof MVWorld)) { + this.worldsFromTheConfig.put(key.replaceAll(String.valueOf(SEPARATOR), "."), (MVWorld) obj); + } else if (this.configWorlds.isConfigurationSection(path)) { + ConfigurationSection section = this.configWorlds.getConfigurationSection(path); + Set subkeys = section.getKeys(false); + for (String subkey : subkeys) { + worldKeys.push(key + SEPARATOR + subkey); } } } @@ -575,8 +594,9 @@ public class WorldManager implements MVWorldManager { @Override public boolean saveWorldsConfig() { try { + this.configWorlds.options().pathSeparator(SEPARATOR); for (Map.Entry entry : worlds.entrySet()) { - this.configWorlds.set("worlds." + entry.getKey(), entry.getValue()); + this.configWorlds.set("worlds" + SEPARATOR + entry.getKey(), entry.getValue()); } this.configWorlds.save(new File(this.plugin.getDataFolder(), "worlds.yml")); return true; From 0efc0b965b7d4268a60a27d8d62cd275996e0240 Mon Sep 17 00:00:00 2001 From: "main()" Date: Sun, 4 Mar 2012 19:53:40 +0100 Subject: [PATCH 03/22] Fixed removeWorldFromConfig(String). --- .../onarandombox/MultiverseCore/utils/WorldManager.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 94d2087e..f832d48f 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -169,15 +169,11 @@ public class WorldManager implements MVWorldManager { if (!unloadWorld(name)) { return false; } - if (this.configWorlds.get("worlds." + name) != null) { + if (this.worldsFromTheConfig.containsKey(name)) { + this.worldsFromTheConfig.remove(name); this.plugin.log(Level.INFO, "World '" + name + "' was removed from config.yml"); - this.configWorlds.set("worlds." + name, null); this.saveWorldsConfig(); - // Remove it from the list of worlds. - if (this.worldsFromTheConfig.containsKey(name)) { - this.worldsFromTheConfig.remove(name); - } return true; } else { this.plugin.log(Level.INFO, "World '" + name + "' was already removed from config.yml"); From fd227960b9d94a4a61307c33dcc0f8a41fcbbdc1 Mon Sep 17 00:00:00 2001 From: "main()" Date: Sun, 4 Mar 2012 20:21:42 +0100 Subject: [PATCH 04/22] Now correctly saving worlds --- .../com/onarandombox/MultiverseCore/utils/WorldManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index f832d48f..1d0309ab 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -591,7 +591,8 @@ public class WorldManager implements MVWorldManager { public boolean saveWorldsConfig() { try { this.configWorlds.options().pathSeparator(SEPARATOR); - for (Map.Entry entry : worlds.entrySet()) { + this.configWorlds.set("worlds", null); + for (Map.Entry entry : worldsFromTheConfig.entrySet()) { this.configWorlds.set("worlds" + SEPARATOR + entry.getKey(), entry.getValue()); } this.configWorlds.save(new File(this.plugin.getDataFolder(), "worlds.yml")); From d1280a9031520feb0423fb2842e46c6c248eb71d Mon Sep 17 00:00:00 2001 From: "main()" Date: Wed, 7 Mar 2012 19:59:20 +0100 Subject: [PATCH 05/22] Some fixes + added tests. --- .../onarandombox/MultiverseCore/MVWorld.java | 8 ++ .../MultiverseCore/utils/WorldManager.java | 18 ++++- .../test/TestWorldProperties.java | 74 ++++++++++++++----- .../test/utils/MockWorldFactory.java | 18 +++++ 4 files changed, 97 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 7fc86550..0b81de2b 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -451,6 +451,14 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { } } + /** + * {@inheritDoc} + */ + @Override + public void copyValues(SerializationConfig other) { + super.copyValues(other); + } + /** * Sets the CB-World. *

diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 1d0309ab..a18a7735 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -567,12 +567,26 @@ public class WorldManager implements MVWorldManager { // load world-objects Stack worldKeys = new Stack(); worldKeys.addAll(this.configWorlds.getConfigurationSection("worlds").getKeys(false)); + Map newWorldsFromTheConfig = new HashMap(); while (!worldKeys.isEmpty()) { String key = worldKeys.pop(); String path = "worlds" + SEPARATOR + key; Object obj = this.configWorlds.get(path); if ((obj != null) && (obj instanceof MVWorld)) { - this.worldsFromTheConfig.put(key.replaceAll(String.valueOf(SEPARATOR), "."), (MVWorld) obj); + String worldName = key.replaceAll(String.valueOf(SEPARATOR), "."); + if (this.worldsFromTheConfig.containsKey(worldName)) { + // Object-Recycling :D + MVWorld oldMVWorld = (MVWorld) this.worlds.get(worldName); + oldMVWorld.copyValues((MVWorld) obj); + newWorldsFromTheConfig.put(worldName, oldMVWorld); + } else { + // we have to use a new one + World cbworld = this.plugin.getServer().getWorld(worldName); + MVWorld mvworld = (MVWorld) obj; + if (cbworld != null) + mvworld.init(cbworld, this.plugin); + newWorldsFromTheConfig.put(worldName, mvworld); + } } else if (this.configWorlds.isConfigurationSection(path)) { ConfigurationSection section = this.configWorlds.getConfigurationSection(path); Set subkeys = section.getKeys(false); @@ -581,6 +595,8 @@ public class WorldManager implements MVWorldManager { } } } + this.worldsFromTheConfig = newWorldsFromTheConfig; + this.worlds.keySet().retainAll(this.worldsFromTheConfig.keySet()); return this.configWorlds; } diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java index 4e4619a2..ea0d9d50 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java +++ b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldProperties.java @@ -12,15 +12,16 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; +import java.io.File; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.entity.HumanEntity; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityRegainHealthEvent; @@ -43,6 +44,7 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.onarandombox.MultiverseCore.MVWorld; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; @@ -91,7 +93,7 @@ public class TestWorldProperties { } @Test - public void test() { + public void test() throws Exception { // Initialize a fake command Command mockCommand = mock(Command.class); when(mockCommand.getName()).thenReturn("mv"); @@ -129,12 +131,9 @@ public class TestWorldProperties { assertEquals(mvWorld.getName(), mvWorld.getAlias()); assertEquals(ChatColor.WHITE, mvWorld.getColor()); assertTrue(mvWorld.isPVPEnabled()); - assertEquals((Object) 1D, (Object) mvWorld.getScaling()); // we're casting this to objects to use - // assertEquals(Object,Object) instead of assertEquals(double,double) + assertEquals(1D, mvWorld.getScaling(), 0); assertNull(mvWorld.getRespawnToWorld()); assertTrue(mvWorld.isWeatherEnabled()); - World cbWorld = mvWorld.getCBWorld(); - when(cbWorld.getDifficulty()).thenReturn(Difficulty.NORMAL); assertEquals(Difficulty.NORMAL, mvWorld.getDifficulty()); assertTrue(mvWorld.canAnimalsSpawn()); assertTrue(mvWorld.canMonstersSpawn()); @@ -201,24 +200,21 @@ public class TestWorldProperties { mvWorld.setAlias("alias"); assertEquals("alias", mvWorld.getAlias()); assertTrue(mvWorld.setColor("BLACK")); - ChatColor oldColor = mvWorld.getColor(); assertFalse(mvWorld.setColor("INVALID COLOR")); - assertEquals(oldColor, mvWorld.getColor()); - assertEquals(oldColor.toString() + "alias" + ChatColor.WHITE.toString(), mvWorld.getColoredWorldString()); + assertEquals(ChatColor.BLACK, mvWorld.getColor()); + assertEquals(ChatColor.BLACK.toString() + "alias" + ChatColor.WHITE.toString(), mvWorld.getColoredWorldString()); mvWorld.setPVPMode(false); assertEquals(false, mvWorld.isPVPEnabled()); assertTrue(mvWorld.setScaling(2D)); - assertEquals((Object) 2D, (Object) mvWorld.getScaling()); + assertEquals(2D, mvWorld.getScaling(), 0); assertFalse(mvWorld.setRespawnToWorld("INVALID WORLD")); assertTrue(mvWorld.setRespawnToWorld("world_nether")); assertSame(worldManager.getMVWorld("world_nether").getCBWorld(), mvWorld.getRespawnToWorld()); mvWorld.setEnableWeather(false); assertEquals(false, mvWorld.isWeatherEnabled()); - assertTrue(mvWorld.setDifficulty("PEACEFUL")); - Difficulty oldDifficulty = mvWorld.getDifficulty(); - assertFalse(mvWorld.setDifficulty("INVALID DIFFICULTY")); - assertEquals(oldDifficulty, mvWorld.getDifficulty()); + assertTrue(mvWorld.setDifficulty(Difficulty.PEACEFUL)); + assertEquals(Difficulty.PEACEFUL, mvWorld.getDifficulty()); mvWorld.setAllowAnimalSpawn(false); assertEquals(false, mvWorld.canAnimalsSpawn()); mvWorld.setAllowMonsterSpawn(false); @@ -226,17 +222,15 @@ public class TestWorldProperties { mvWorld.setCurrency(1); assertEquals(1, mvWorld.getCurrency()); mvWorld.setPrice(1D); - assertEquals((Object) 1D, (Object) mvWorld.getPrice()); + assertEquals(1D, mvWorld.getPrice(), 0); mvWorld.setHunger(false); assertEquals(false, mvWorld.getHunger()); mvWorld.setAutoHeal(false); assertEquals(false, mvWorld.getAutoHeal()); mvWorld.setAdjustSpawn(false); assertEquals(false, mvWorld.getAdjustSpawn()); - assertTrue(mvWorld.setGameMode("CREATIVE")); - GameMode oldGamemode = mvWorld.getGameMode(); - assertFalse(mvWorld.setGameMode("INVALID GAMEMODE")); - assertEquals(oldGamemode, mvWorld.getGameMode()); + assertTrue(mvWorld.setGameMode(GameMode.CREATIVE)); + assertEquals(GameMode.CREATIVE, mvWorld.getGameMode()); mvWorld.setKeepSpawnInMemory(false); assertEquals(false, mvWorld.isKeepingSpawnInMemory()); mvWorld.setBedRespawn(false); @@ -246,6 +240,7 @@ public class TestWorldProperties { mvWorld.setSpawnLocation(new Location(mvWorld.getCBWorld(), 1, 1, 1)); assertEquals(new SpawnLocation(1, 1, 1), mvWorld.getSpawnLocation()); + /* ****************************************** * * Call some events and verify behavior * ****************************************** */ @@ -276,6 +271,7 @@ public class TestWorldProperties { core.getMVConfig().setPrefixChat(false); core.getPlayerListener().playerChat(playerChatEvent); verify(playerChatEvent, times(1)).setFormat(anyString()); // only ONE TIME (not the 2nd time!) + mvWorld.setHidden(true); // reset hidden-state // call player join events core.getPlayerListener().playerJoin(playerJoinEvent); @@ -294,6 +290,44 @@ public class TestWorldProperties { core.getEntityListener().entityRegainHealth(entityRegainHealthEvent); // autoheal is off so something should happen verify(entityRegainHealthEvent).setCancelled(true); + + + /* ****************************************** * + * Test saving/loading + * ****************************************** */ + assertTrue(core.saveMVConfigs()); + // change a value here + FileConfiguration config = YamlConfiguration.loadConfiguration(new File(core.getDataFolder(), "worlds.yml")); + MVWorld worldObj = (MVWorld) config.get("worlds.world"); + assertTrue(worldObj.setColor("GREEN")); + config.set("worlds.world", worldObj); + config.save(new File(core.getDataFolder(), "worlds.yml")); + // load + core.loadConfigs(); + + mvWorld = worldManager.getMVWorld("world"); + assertEquals(true, mvWorld.isHidden()); + assertEquals("alias", mvWorld.getAlias()); + assertEquals(ChatColor.GREEN, mvWorld.getColor()); + assertEquals(ChatColor.GREEN.toString() + "alias" + ChatColor.WHITE.toString(), mvWorld.getColoredWorldString()); + assertEquals(false, mvWorld.isPVPEnabled()); + assertEquals(2D, mvWorld.getScaling(), 0); + assertSame(worldManager.getMVWorld("world_nether").getCBWorld(), + mvWorld.getRespawnToWorld()); + assertEquals(false, mvWorld.isWeatherEnabled()); + assertEquals(Difficulty.PEACEFUL, mvWorld.getDifficulty()); + assertEquals(false, mvWorld.canAnimalsSpawn()); + assertEquals(false, mvWorld.canMonstersSpawn()); + assertEquals(1, mvWorld.getCurrency()); + assertEquals(1D, mvWorld.getPrice(), 0); + assertEquals(false, mvWorld.getHunger()); + assertEquals(false, mvWorld.getAutoHeal()); + assertEquals(false, mvWorld.getAdjustSpawn()); + assertEquals(GameMode.CREATIVE, mvWorld.getGameMode()); + assertEquals(false, mvWorld.isKeepingSpawnInMemory()); + assertEquals(false, mvWorld.getBedRespawn()); + assertEquals(false, mvWorld.getAutoLoad()); + assertEquals(new SpawnLocation(1, 1, 1), mvWorld.getSpawnLocation()); } public void createEvents(MultiverseWorld mvWorld) { diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java b/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java index 2acc9f6b..5da50b98 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java +++ b/src/test/java/com/onarandombox/MultiverseCore/test/utils/MockWorldFactory.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.WeakHashMap; +import org.bukkit.Difficulty; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -31,6 +32,7 @@ public class MockWorldFactory { private static final Map pvpStates = new WeakHashMap(); private static final Map keepSpawnInMemoryStates = new WeakHashMap(); + private static final Map difficultyStates = new WeakHashMap(); private MockWorldFactory() { } @@ -74,6 +76,22 @@ public class MockWorldFactory { return null; } }).when(mockWorld).setKeepSpawnInMemory(anyBoolean()); + when(mockWorld.getDifficulty()).thenAnswer(new Answer() { + @Override + public Difficulty answer(InvocationOnMock invocation) throws Throwable { + World w = (World) invocation.getMock(); + if (!difficultyStates.containsKey(w)) + difficultyStates.put(w, Difficulty.NORMAL); // default value + return difficultyStates.get(w); + } + }); + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + difficultyStates.put((World) invocation.getMock(), (Difficulty) invocation.getArguments()[0]); + return null; + } + }).when(mockWorld).setDifficulty(any(Difficulty.class)); when(mockWorld.getEnvironment()).thenReturn(env); when(mockWorld.getWorldType()).thenReturn(type); when(mockWorld.getSpawnLocation()).thenReturn(new Location(mockWorld, 0, 64, 0)); From 98f5e1e4eec69e448cf9d9a2617240608475de4f Mon Sep 17 00:00:00 2001 From: "main()" Date: Sat, 10 Mar 2012 17:41:53 +0100 Subject: [PATCH 06/22] This IS fixed! --- .../onarandombox/MultiverseCore/test/TestWorldCreation.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldCreation.java b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldCreation.java index eb2e46c1..4bafc3eb 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldCreation.java +++ b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldCreation.java @@ -84,9 +84,6 @@ public class TestWorldCreation { assertNotNull(worldsSection); assertEquals(2, worldsSection.getKeys(false).size()); assertTrue(worldsSection.getKeys(false).contains("world2")); - // TODO: Uncomment once this is fixed!!! - //assertTrue(worldsSection.getKeys(false).contains("'fish.world'")); - - // Worlds with .s are a special case, verify that they work. + assertTrue(worldsSection.getKeys(false).contains("fish.world")); } } From d7a3e1839ed9a5ddb9761c5636709eff9ad3e429 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 12:23:04 +0200 Subject: [PATCH 07/22] Should fix environment, seed and generator-issues. --- .../onarandombox/MultiverseCore/MVWorld.java | 36 ++++++++++++++----- .../MultiverseCore/api/MultiverseWorld.java | 18 ++++++++-- .../MultiverseCore/utils/WorldManager.java | 15 +++++++- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 0b81de2b..6299e50a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -69,8 +69,6 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private MultiverseCore plugin; // Hold the Plugin Instance. private Reference world; // A reference to the World Instance. - private Environment environment; // Hold the Environment type EG Environment.NETHER / Environment.NORMAL - private long seed; // The world seed private String name; // The Worlds Name, EG its folder name. /** @@ -438,6 +436,12 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { return world.get().getTime(); } }; + @Property + private Environment environment; + @Property + private long seed; + @Property + private String generator; // End of properties // -------------------------------------------------------------- @@ -446,6 +450,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private Permission ignoreperm; public MVWorld(boolean fixSpawn) { + super(); if (!fixSpawn) { this.adjustSpawn = false; } @@ -570,6 +575,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.autoLoad = true; this.bedRespawn = true; this.worldBlacklist = new ArrayList(); + this.generator = null; } /** @@ -791,7 +797,6 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { */ @Override public Environment getEnvironment() { - // This variable is not settable in-game, therefore does not get a property. return this.environment; } @@ -800,16 +805,14 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { */ @Override public void setEnvironment(Environment environment) { - // This variable is not settable in-game, therefore does not get a property. - this.environment = environment; + this.setPropertyValueUnchecked("environment", environment); } /** * {@inheritDoc} */ @Override - public Long getSeed() { - // This variable is not settable in-game, therefore does not get a property. + public long getSeed() { return this.seed; } @@ -818,8 +821,23 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { */ @Override public void setSeed(long seed) { - // This variable is not settable in-game, therefore does not get a property. - this.seed = seed; + this.setPropertyValueUnchecked("seed", seed); + } + + /** + * {@inheritDoc} + */ + @Override + public String getGenerator() { + return this.generator; + } + + /** + * {@inheritDoc} + */ + @Override + public void setGenerator(String generator) { + this.setPropertyValueUnchecked("generator", generator); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java index dbd0f387..9fa29234 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java @@ -46,7 +46,7 @@ public interface MultiverseWorld { * Gets the type of this world. As of 1.2 this will be: * FLAT, NORMAL or VERSION_1_1 *

- * This is *not* the generator. + * This is not the generator. * * @return The Type of this world. */ @@ -104,7 +104,7 @@ public interface MultiverseWorld { * * @return The Long version of the seed. */ - Long getSeed(); + long getSeed(); /** * Sets the seed of this world. @@ -113,6 +113,20 @@ public interface MultiverseWorld { */ void setSeed(long seed); + /** + * Gets the generator of this world. + * + * @return The name of the generator. + */ + String getGenerator(); + + /** + * Sets the generator of this world. + * + * @param generator The new generator's name. + */ + void setGenerator(String generator); + /** * Gets the help-message for a property. * @param property The name of the property. diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 892acc9c..95852784 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -142,6 +142,9 @@ public class WorldManager implements MVWorldManager { return false; } + // set generator (special case because we can't read it from org.bukkit.World) + this.worlds.get(name).setGenerator(generator); + this.saveWorldsConfig(); return true; } @@ -262,7 +265,17 @@ public class WorldManager implements MVWorldManager { } private boolean doLoad(String name) { - return doLoad(WorldCreator.name(name)); + if (!worldsFromTheConfig.containsKey(name)) + throw new IllegalArgumentException("That world doesn't exist!"); + + MVWorld world = worldsFromTheConfig.get(name); + WorldCreator creator = WorldCreator.name(name); + + creator.environment(world.getEnvironment()).seed(world.getSeed()); + if (world.getGenerator() != null) + creator.generator(world.getGenerator()); + + return doLoad(creator); } private boolean doLoad(WorldCreator creator) { From 3a32857683f1afea37d9136539fa6d9029c3605f Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 12:42:01 +0200 Subject: [PATCH 08/22] MethodLength deserves only a warning and why should we count empty lines!? --- config/mv_checks.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/mv_checks.xml b/config/mv_checks.xml index 73be9841..54710f7b 100644 --- a/config/mv_checks.xml +++ b/config/mv_checks.xml @@ -76,7 +76,10 @@ - + + + + From 9868c66cdbf2d21a16386b5d821c2a91ff4183e3 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 12:42:48 +0200 Subject: [PATCH 09/22] Added migrators. Needs testing. --- .../onarandombox/MultiverseCore/MVWorld.java | 18 +- .../MultiverseCore/MultiverseCore.java | 181 ++++++++++++++++++ .../configuration/EntryFee.java | 66 +++++++ 3 files changed, 255 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 6299e50a..88cb5244 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -9,6 +9,7 @@ package com.onarandombox.MultiverseCore; import com.onarandombox.MultiverseCore.api.BlockSafety; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.configuration.EntryFee; import com.onarandombox.MultiverseCore.configuration.SpawnLocation; import com.onarandombox.MultiverseCore.configuration.SpawnSettings; import com.onarandombox.MultiverseCore.configuration.WorldPropertyValidator; @@ -371,10 +372,8 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { }; @Property(validator = SpawningPropertyValidator.class, description = "Sorry, 'animals' must either be: true or false.") private SpawnSettings spawning; - @Property(description = "Currency must be an integer between -1 and the highest Minecraft item ID.") - private int currency; - @Property(description = "Price must be a double value. ex: 1.2. Set to a negative value to give players money for entering this world.") - private double price; + @Property + private EntryFee entryfee; @Property(description = "Sorry, 'hunger' must either be: true or false.") private boolean hunger; @Property(description = "Sorry, 'autoheal' must either be: true or false.") @@ -564,8 +563,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.respawnWorld = new String(); this.allowWeather = true; this.spawning = new SpawnSettings(); - this.currency = -1; - this.price = 0D; + this.entryfee = new EntryFee(); this.hunger = true; this.autoHeal = true; this.adjustSpawn = true; @@ -1050,7 +1048,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { */ @Override public int getCurrency() { - return this.currency; + return this.entryfee.getCurrency(); } /** @@ -1058,7 +1056,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { */ @Override public void setCurrency(int currency) { - this.setPropertyValueUnchecked("currency", currency); + this.setPropertyValueUnchecked("entryfee.currency", currency); } /** @@ -1066,7 +1064,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { */ @Override public double getPrice() { - return this.price; + return this.entryfee.getAmount(); } /** @@ -1074,7 +1072,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { */ @Override public void setPrice(double price) { - this.setPropertyValueUnchecked("price", price); + this.setPropertyValueUnchecked("entryfee.amount", price); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index f0fb1d0d..946bbdf2 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -27,6 +27,7 @@ import com.onarandombox.MultiverseCore.destination.ExactDestination; import com.onarandombox.MultiverseCore.destination.PlayerDestination; import com.onarandombox.MultiverseCore.destination.WorldDestination; import com.onarandombox.MultiverseCore.event.MVVersionEvent; +import com.onarandombox.MultiverseCore.exceptions.PropertyDoesNotExistException; import com.onarandombox.MultiverseCore.listeners.MVEntityListener; import com.onarandombox.MultiverseCore.listeners.MVPlayerListener; import com.onarandombox.MultiverseCore.listeners.MVPluginListener; @@ -42,6 +43,7 @@ import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.configuration.Configuration; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -52,7 +54,9 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Random; @@ -299,6 +303,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { this.multiverseConfig.setDefaults(coreDefaults); this.multiverseConfig.options().copyDefaults(false); this.multiverseConfig.options().copyHeader(true); + + this.migrateWorldConfig(); this.worldManager.loadWorldConfig(new File(getDataFolder(), "worlds.yml")); MultiverseCoreConfiguration wantedConfig = null; @@ -373,6 +379,181 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { } } + /** + * Migrate the worlds.yml to SerializationConfig. + */ + private void migrateWorldConfig() { + FileConfiguration wconf = YamlConfiguration + .loadConfiguration(new File(getDataFolder(), "worlds.yml")); + Map values = wconf.getConfigurationSection("worlds").getValues(false); + + boolean wasChanged = false; + Map newValues = new LinkedHashMap(values.size()); + for (Map.Entry entry : values.entrySet()) { + if (entry.getValue() instanceof MVWorld) { + // fine + newValues.put(entry.getKey(), entry.getValue()); + } else if (entry.getValue() instanceof ConfigurationSection) { + // we have to migrate this + MVWorld world = new MVWorld(Collections.EMPTY_MAP); + ConfigurationSection section = (ConfigurationSection) entry.getValue(); + + // migrate animals and monsters + if (section.isConfigurationSection("animals")) { + ConfigurationSection animalSection = section.getConfigurationSection("animals"); + if (animalSection.contains("spawn")) { + if (animalSection.isBoolean("spawn")) + world.setAllowAnimalSpawn(animalSection.getBoolean("spawn")); + else + world.setAllowAnimalSpawn(Boolean.parseBoolean(animalSection.getString("spawn"))); + } + if (animalSection.isList("exceptions")) { + world.getAnimalList().clear(); + world.getAnimalList().addAll(animalSection.getStringList("exceptions")); + } + } + if (section.isConfigurationSection("monsters")) { + ConfigurationSection monsterSection = section.getConfigurationSection("monsters"); + if (monsterSection.contains("spawn")) { + if (monsterSection.isBoolean("spawn")) + world.setAllowMonsterSpawn(monsterSection.getBoolean("spawn")); + else + world.setAllowMonsterSpawn(Boolean.parseBoolean(monsterSection.getString("spawn"))); + } + if (monsterSection.isList("exceptions")) { + world.getMonsterList().clear(); + world.getMonsterList().addAll(monsterSection.getStringList("exceptions")); + } + } + + // migrate entryfee + if (section.isConfigurationSection("entryfee")) { + ConfigurationSection feeSection = section.getConfigurationSection("entryfee"); + if (feeSection.isInt("currency")) + world.setCurrency(feeSection.getInt("currency")); + + if (feeSection.isDouble("amount")) + world.setPrice(feeSection.getDouble("amount")); + else if (feeSection.isInt("amount")) + world.setPrice(feeSection.getInt("amount")); + } + + // migrate pvp + if (section.isBoolean("pvp")) { + world.setPVPMode(section.getBoolean("pvp")); + } + + // migrate alias + if (section.isConfigurationSection("alias")) { + ConfigurationSection aliasSection = section.getConfigurationSection("alias"); + if (aliasSection.isString("color")) + world.setColor(aliasSection.getString("color")); + if (aliasSection.isString("name")) + world.setAlias(aliasSection.getString("name")); + } + + // migrate worldblacklist + if (section.isList("worldblacklist")) { + world.getWorldBlacklist().clear(); + world.getWorldBlacklist().addAll(section.getStringList("worldblacklist")); + } + + // migrate scale + if (section.isDouble("scale")) { + world.setScaling(section.getDouble("scale")); + } + + // migrate gamemode + if (section.isString("gamemode")) { + try { + world.setPropertyValue("gamemode", section.getString("gamemode")); + } catch (PropertyDoesNotExistException e) { + throw new RuntimeException("Who forgot to update the migrator?", e); + } + } + + // migrate hunger + if (section.isBoolean("hunger")) { + world.setHunger(section.getBoolean("hunger")); + } + + // migrate hidden + if (section.isBoolean("hidden")) { + world.setHidden(section.getBoolean("hidden")); + } + + // migrate autoheal + if (section.isBoolean("autoheal")) { + world.setAutoHeal(section.getBoolean("autoheal")); + } + + // migrate portalform + if (section.isString("portalform")) { + try { + world.setPropertyValue("portalform", section.getString("portalform")); + } catch (PropertyDoesNotExistException e) { + throw new RuntimeException("Who forgot to update the migrator?", e); + } + } + + // migrate environment + if (section.isString("environment")) { + try { + world.setPropertyValue("environment", section.getString("environment")); + } catch (PropertyDoesNotExistException e) { + throw new RuntimeException("Who forgot to update the migrator?", e); + } + } + + // migrate generator + if (section.isString("generator")) { + world.setGenerator(section.getString("generator")); + } + + // migrate seed + if (section.isLong("seed")) { + world.setSeed(section.getLong("seed")); + } + + // migrate weather + if (section.isBoolean("weather")) { + world.setEnableWeather(section.getBoolean("weather")); + } + + // migrate adjustspawn + if (section.isBoolean("adjustspawn")) { + world.setAdjustSpawn(section.getBoolean("adjustspawn")); + } + + newValues.put(entry.getKey(), world); + wasChanged = true; + } else { + // huh? + this.log(Level.WARNING, "Removing unknown entry in the config: " + entry); + // just don't add to newValues + wasChanged = true; + } + } + + if (wasChanged) { + // clear config + wconf.set("worlds", null); + + // and rebuild it + ConfigurationSection rootSection = wconf.createSection("worlds"); + for (Map.Entry entry : newValues.entrySet()) { + rootSection.set(entry.getKey(), entry.getValue()); + } + + try { + wconf.save(new File(getDataFolder(), "worlds.yml")); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + /** * {@inheritDoc} */ diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java new file mode 100644 index 00000000..e754e682 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java @@ -0,0 +1,66 @@ +package com.onarandombox.MultiverseCore.configuration; + +import java.util.Map; + +import me.main__.util.SerializationConfig.Property; +import me.main__.util.SerializationConfig.SerializationConfig; + +import org.bukkit.configuration.serialization.SerializableAs; + +/** + * Entryfee-settings. + */ +@SerializableAs("MVEntryFee") +public class EntryFee extends SerializationConfig { + @Property + private double amount; + @Property + private int currency; + + public EntryFee() { + super(); + } + + public EntryFee(Map values) { + super(values); + } + + /** + * {@inheritDoc} + */ + @Override + protected void setDefaults() { + amount = 0D; + currency = -1; + } + + /** + * @return the amount + */ + public double getAmount() { + return amount; + } + + /** + * @return the currency + */ + public int getCurrency() { + return currency; + } + + /** + * Sets the amount. + * @param amount The new value. + */ + public void setAmount(double amount) { + this.amount = amount; + } + + /** + * Sets the currency. + * @param currency The new value. + */ + public void setCurrency(int currency) { + this.currency = currency; + } +} From 82cfbaba4eb20e3346d1e20730cab31597e13e56 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 12:48:45 +0200 Subject: [PATCH 10/22] Fixed NPE in migrateWorldConfigs() --- .../java/com/onarandombox/MultiverseCore/MultiverseCore.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 946bbdf2..4969fc1d 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -385,6 +385,10 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { private void migrateWorldConfig() { FileConfiguration wconf = YamlConfiguration .loadConfiguration(new File(getDataFolder(), "worlds.yml")); + + if (!wconf.isConfigurationSection("worlds")) // empty config + return; + Map values = wconf.getConfigurationSection("worlds").getValues(false); boolean wasChanged = false; From 5d9941d07380b0338820d7809f2a1774cbbbeec5 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 15:31:10 +0200 Subject: [PATCH 11/22] Why is 'null' deserialized to "null" instead of null!? --- .../com/onarandombox/MultiverseCore/utils/WorldManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 95852784..49756607 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -272,7 +272,7 @@ public class WorldManager implements MVWorldManager { WorldCreator creator = WorldCreator.name(name); creator.environment(world.getEnvironment()).seed(world.getSeed()); - if (world.getGenerator() != null) + if ((world.getGenerator() != null) && (!world.getGenerator().equals("null"))) creator.generator(world.getGenerator()); return doLoad(creator); From 0efb28be19dd24f1bc4a7ce72727aee16360eef8 Mon Sep 17 00:00:00 2001 From: Jeremy Wood Date: Tue, 1 May 2012 10:47:20 -0400 Subject: [PATCH 12/22] Properly close all input/output streams! --- .../MultiverseCore/utils/UpdateChecker.java | 11 ++++++++-- .../utils/webpaste/HttpAPIClient.java | 21 +++++++++++++------ .../utils/webpaste/PastebinPasteService.java | 20 ++++++++++++++---- .../utils/webpaste/PastiePasteService.java | 20 ++++++++++++++---- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/UpdateChecker.java b/src/main/java/com/onarandombox/MultiverseCore/utils/UpdateChecker.java index 683515b2..9c1555fc 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/UpdateChecker.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/UpdateChecker.java @@ -8,6 +8,7 @@ package com.onarandombox.MultiverseCore.utils; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; @@ -54,6 +55,7 @@ public class UpdateChecker { } public void checkUpdate() { + BufferedReader rd = null; try { URL url = new URL("http://bukkit.onarandombox.com/multiverse/version.php?n=" + URLEncoder.encode(this.name, "UTF-8") + "&v=" + this.cversion); URLConnection conn = url.openConnection(); @@ -65,7 +67,7 @@ public class UpdateChecker { return; } - BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); + rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; String version = null; @@ -76,7 +78,6 @@ public class UpdateChecker { } if (version == null) { - rd.close(); return; } @@ -92,6 +93,12 @@ public class UpdateChecker { rd.close(); } catch (Exception e) { // No need to alert the user of any error here... it's not important. + } finally { + if (rd != null) { + try { + rd.close(); + } catch (IOException ignore) { } + } } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/HttpAPIClient.java b/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/HttpAPIClient.java index 07bc0fb5..55d69c5c 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/HttpAPIClient.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/HttpAPIClient.java @@ -26,16 +26,25 @@ public abstract class HttpAPIClient { * @throws IOException When the I/O-operation failed. */ protected final String exec(Object... args) throws IOException { + URLConnection conn = new URL(String.format(this.urlFormat, args)).openConnection(); conn.connect(); - BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); - while (!reader.ready()); // wait until reader is ready, may not be necessary, SUPPRESS CHECKSTYLE: EmptyStatement - StringBuilder ret = new StringBuilder(); - while (reader.ready()) { - ret.append(reader.readLine()).append('\n'); + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + while (!reader.ready()); // wait until reader is ready, may not be necessary, SUPPRESS CHECKSTYLE: EmptyStatement + + while (reader.ready()) { + ret.append(reader.readLine()).append('\n'); + } + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException ignore) { } + } } - reader.close(); return ret.toString(); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastebinPasteService.java b/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastebinPasteService.java index 84e3acd5..8dce6b99 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastebinPasteService.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastebinPasteService.java @@ -1,6 +1,7 @@ package com.onarandombox.MultiverseCore.utils.webpaste; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; @@ -54,24 +55,35 @@ public class PastebinPasteService implements PasteService { */ @Override public String postData(String encodedData, URL url) throws PasteFailedException { + OutputStreamWriter wr = null; + BufferedReader rd = null; try { URLConnection conn = url.openConnection(); conn.setDoOutput(true); - OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); + wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(encodedData); wr.flush(); - BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); + rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; String pastebinUrl = ""; while ((line = rd.readLine()) != null) { pastebinUrl = line; } - wr.close(); - rd.close(); return pastebinUrl; } catch (Exception e) { throw new PasteFailedException(e); + } finally { + if (wr != null) { + try { + wr.close(); + } catch (IOException ignore) { } + } + if (rd != null) { + try { + rd.close(); + } catch (IOException ignore) { } + } } } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastiePasteService.java b/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastiePasteService.java index d912edc6..3cb0f169 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastiePasteService.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/webpaste/PastiePasteService.java @@ -1,6 +1,7 @@ package com.onarandombox.MultiverseCore.utils.webpaste; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; @@ -55,14 +56,16 @@ public class PastiePasteService implements PasteService { */ @Override public String postData(String encodedData, URL url) throws PasteFailedException { + OutputStreamWriter wr = null; + BufferedReader rd = null; try { URLConnection conn = url.openConnection(); conn.setDoOutput(true); - OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); + wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(encodedData); wr.flush(); - BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); + rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; String pastieUrl = ""; Pattern pastiePattern = this.getURLMatchingPattern(); @@ -73,11 +76,20 @@ public class PastiePasteService implements PasteService { pastieUrl = this.formatURL(pastieID); } } - wr.close(); - rd.close(); return pastieUrl; } catch (Exception e) { throw new PasteFailedException(e); + } finally { + if (wr != null) { + try { + wr.close(); + } catch (IOException ignore) { } + } + if (rd != null) { + try { + rd.close(); + } catch (IOException ignore) { } + } } } From 9b2dd0d6c95537f3e388b120fd0bbdd5211b0ae9 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 16:48:18 +0200 Subject: [PATCH 13/22] Forgot some values, fixed allowweather migration --- .../onarandombox/MultiverseCore/MVWorld.java | 8 +++-- .../MultiverseCore/MultiverseCore.java | 32 +++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 88cb5244..7a4deede 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -69,7 +69,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private MultiverseCore plugin; // Hold the Plugin Instance. - private Reference world; // A reference to the World Instance. + private Reference world = new WeakReference(null); // A reference to the World Instance. private String name; // The Worlds Name, EG its folder name. /** @@ -404,7 +404,9 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private VirtualProperty spawn = new VirtualProperty() { @Override public void set(Location newValue) { - world.get().setSpawnLocation(newValue.getBlockX(), newValue.getBlockY(), newValue.getBlockZ()); + if (getCBWorld() != null) + getCBWorld().setSpawnLocation(newValue.getBlockX(), newValue.getBlockY(), newValue.getBlockZ()); + spawnLocation = new SpawnLocation(newValue); } @@ -569,7 +571,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.adjustSpawn = true; this.portalForm = AllowedPortalType.ALL; this.gameMode = GameMode.SURVIVAL; - this.spawnLocation = (world != null) ? new SpawnLocation(world.get().getSpawnLocation()) : null; + this.spawnLocation = (world != null) ? new SpawnLocation(world.get().getSpawnLocation()) : new SpawnLocation(0, 0, 0); this.autoLoad = true; this.bedRespawn = true; this.worldBlacklist = new ArrayList(); diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 4969fc1d..7ad2af4d 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -520,8 +520,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { } // migrate weather - if (section.isBoolean("weather")) { - world.setEnableWeather(section.getBoolean("weather")); + if (section.isBoolean("allowweather")) { + world.setEnableWeather(section.getBoolean("allowweather")); } // migrate adjustspawn @@ -529,6 +529,34 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { world.setAdjustSpawn(section.getBoolean("adjustspawn")); } + // migrate autoload + if (section.isBoolean("autoload")) { + world.setAutoLoad(section.getBoolean("autoload")); + } + + // migrate bedrespawn + if (section.isBoolean("bedrespawn")) { + world.setBedRespawn(section.getBoolean("bedrespawn")); + } + + // migrate spawn + if (section.isConfigurationSection("spawn")) { + ConfigurationSection spawnSect = section.getConfigurationSection("spawn"); + Location spawnLoc = world.getSpawnLocation(); + if (spawnSect.isDouble("yaw")) + spawnLoc.setYaw((float) spawnSect.getDouble("yaw")); + if (spawnSect.isDouble("pitch")) + spawnLoc.setPitch((float) spawnSect.getDouble("pitch")); + if (spawnSect.isDouble("x")) + spawnLoc.setX(spawnSect.getDouble("x")); + if (spawnSect.isDouble("y")) + spawnLoc.setY(spawnSect.getDouble("y")); + if (spawnSect.isDouble("z")) + spawnLoc.setZ(spawnSect.getDouble("z")); + + world.setSpawnLocation(spawnLoc); + } + newValues.put(entry.getKey(), world); wasChanged = true; } else { From a4196a901a882ddd53ef0cea123e705e52296a51 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 17:00:05 +0200 Subject: [PATCH 14/22] Fixed spawn location loading --- .../onarandombox/MultiverseCore/MVWorld.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 7a4deede..ee3d7787 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -39,6 +39,7 @@ import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.entity.Player; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; +import org.bukkit.util.Vector; import java.lang.ref.Reference; import java.lang.ref.WeakReference; @@ -465,6 +466,36 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { super.copyValues(other); } + /** + * That's the spawn-location when the MVWorld-object wasn't property initialized. + */ + public static final SpawnLocation NULL_LOCATION = new SpawnLocation(0, -1, 0) { + @Override + public Location clone() { + throw new UnsupportedOperationException(); + }; + + @Override + public Map serialize() { + throw new UnsupportedOperationException(); + } + + @Override + public Vector toVector() { + throw new UnsupportedOperationException(); + } + + @Override + public int hashCode() { + return -1; + }; + + @Override + public String toString() { + return "NULL LOCATION"; + }; + }; + /** * Sets the CB-World. *

@@ -480,7 +511,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.environment = cbWorld.getEnvironment(); this.seed = cbWorld.getSeed(); this.name = cbWorld.getName(); - if (this.spawnLocation == null) + if (this.spawnLocation == NULL_LOCATION) this.spawnLocation = new SpawnLocation(readSpawnFromWorld(cbWorld)); this.initPerms(); @@ -571,7 +602,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.adjustSpawn = true; this.portalForm = AllowedPortalType.ALL; this.gameMode = GameMode.SURVIVAL; - this.spawnLocation = (world != null) ? new SpawnLocation(world.get().getSpawnLocation()) : new SpawnLocation(0, 0, 0); + this.spawnLocation = (world != null) ? new SpawnLocation(world.get().getSpawnLocation()) : NULL_LOCATION; this.autoLoad = true; this.bedRespawn = true; this.worldBlacklist = new ArrayList(); From 02347e05d8fbbe7b13e3380bf238c23749c2e1dd Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 17:43:05 +0200 Subject: [PATCH 15/22] Fixed UOE when temporarily saving the NullLocation to the config --- .../onarandombox/MultiverseCore/MVWorld.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index ee3d7787..82b4f359 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -466,10 +466,12 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { super.copyValues(other); } - /** - * That's the spawn-location when the MVWorld-object wasn't property initialized. - */ - public static final SpawnLocation NULL_LOCATION = new SpawnLocation(0, -1, 0) { + @SerializableAs("MVNullLocation (It's a bug if you see this in your config file)") + private static final class NullLocation extends SpawnLocation { + public NullLocation() { + super(0, -1, 0); + } + @Override public Location clone() { throw new UnsupportedOperationException(); @@ -477,7 +479,16 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { @Override public Map serialize() { - throw new UnsupportedOperationException(); + return Collections.EMPTY_MAP; + } + + /** + * Let Bukkit be able to deserialize this. + * @param args The map. + * @return The deserialized object. + */ + public static NullLocation deserialize(Map args) { + return new NullLocation(); } @Override @@ -494,7 +505,12 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { public String toString() { return "NULL LOCATION"; }; - }; + } + + /** + * That's the spawn-location when the MVWorld-object wasn't property initialized. + */ + public static final SpawnLocation NULL_LOCATION = new NullLocation(); /** * Sets the CB-World. From 9cc35d7b1210d3c0261cfa9abedb11fd907e8593 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 18:08:51 +0200 Subject: [PATCH 16/22] public --- src/main/java/com/onarandombox/MultiverseCore/MVWorld.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 82b4f359..6bc53a13 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -466,8 +466,11 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { super.copyValues(other); } + /** + * Null-location. + */ @SerializableAs("MVNullLocation (It's a bug if you see this in your config file)") - private static final class NullLocation extends SpawnLocation { + public static final class NullLocation extends SpawnLocation { public NullLocation() { super(0, -1, 0); } From f1779c9e686205c0dc7e0664ac390607cd732474 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 18:46:47 +0200 Subject: [PATCH 17/22] Shame on me. -.- --- .../com/onarandombox/MultiverseCore/utils/WorldManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 49756607..2d02dbc0 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -287,7 +287,7 @@ public class WorldManager implements MVWorldManager { MVWorld mvworld = worldsFromTheConfig.get(worldName); World cbworld; try { - cbworld = WorldCreator.name(worldName).createWorld(); + cbworld = creator.createWorld(); } catch (Exception e) { e.printStackTrace(); brokenWorld(worldName); From 6520a3193873e0e7e2692d816c2dbece77769b5e Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 18:52:05 +0200 Subject: [PATCH 18/22] Fixed spawnlocation migration --- .../java/com/onarandombox/MultiverseCore/MVWorld.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 6bc53a13..e8e2778f 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -510,11 +510,6 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { }; } - /** - * That's the spawn-location when the MVWorld-object wasn't property initialized. - */ - public static final SpawnLocation NULL_LOCATION = new NullLocation(); - /** * Sets the CB-World. *

@@ -530,7 +525,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.environment = cbWorld.getEnvironment(); this.seed = cbWorld.getSeed(); this.name = cbWorld.getName(); - if (this.spawnLocation == NULL_LOCATION) + if (this.spawnLocation instanceof NullLocation) this.spawnLocation = new SpawnLocation(readSpawnFromWorld(cbWorld)); this.initPerms(); @@ -621,7 +616,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.adjustSpawn = true; this.portalForm = AllowedPortalType.ALL; this.gameMode = GameMode.SURVIVAL; - this.spawnLocation = (world != null) ? new SpawnLocation(world.get().getSpawnLocation()) : NULL_LOCATION; + this.spawnLocation = (world != null) ? new SpawnLocation(world.get().getSpawnLocation()) : new NullLocation(); this.autoLoad = true; this.bedRespawn = true; this.worldBlacklist = new ArrayList(); From 9a3fde2f138e7a86e7fdfa71e4d307915bee4c53 Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 19:08:07 +0200 Subject: [PATCH 19/22] Saving keepSpawnInMemory to config file --- src/main/java/com/onarandombox/MultiverseCore/MVWorld.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index e8e2778f..7565bc28 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -386,16 +386,19 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { @Property(serializor = GameModePropertySerializor.class, validator = GameModePropertyValidator.class, description = "GameMode must be set as one of the following: survival creative") private GameMode gameMode; + @Property + private boolean keepSpawnLoaded; @Property(description = "Sorry, this must either be: true or false.") private VirtualProperty keepSpawnInMemory = new VirtualProperty() { @Override public void set(Boolean newValue) { world.get().setKeepSpawnInMemory(newValue); + keepSpawnLoaded = newValue; } @Override public Boolean get() { - return world.get().getKeepSpawnInMemory(); + return keepSpawnLoaded; } }; @Property @@ -621,6 +624,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.bedRespawn = true; this.worldBlacklist = new ArrayList(); this.generator = null; + this.keepSpawnLoaded = false; } /** From 96294c092cac54195a71f19eb96f20c6802cf07c Mon Sep 17 00:00:00 2001 From: "main()" Date: Tue, 1 May 2012 19:10:51 +0200 Subject: [PATCH 20/22] Wrong default value... --- src/main/java/com/onarandombox/MultiverseCore/MVWorld.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 7565bc28..782379b4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -624,7 +624,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.bedRespawn = true; this.worldBlacklist = new ArrayList(); this.generator = null; - this.keepSpawnLoaded = false; + this.keepSpawnLoaded = true; } /** From 48768b5d6c98fdd847ea2b136c78f1b3112ae856 Mon Sep 17 00:00:00 2001 From: "main()" Date: Wed, 2 May 2012 16:25:40 +0200 Subject: [PATCH 21/22] Now all properties are settable ingame. (bugfix) --- pom.xml | 2 +- .../onarandombox/MultiverseCore/MVWorld.java | 12 ++-- .../test/TestModifyCommand.java | 61 +++++++++++++++++++ 3 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/onarandombox/MultiverseCore/test/TestModifyCommand.java diff --git a/pom.xml b/pom.xml index 12779cc6..e1b9a1dd 100644 --- a/pom.xml +++ b/pom.xml @@ -198,7 +198,7 @@ me.main__.util SerializationConfig - 1.5 + 1.6 jar compile diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index 782379b4..cddc4238 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -341,7 +341,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private String alias; @Property(serializor = EnumPropertySerializor.class, description = "Sorry, 'color' must be a valid color-name.") private EnglishChatColor color; - @Property(description = "Sorry, 'pvp' must either be: true or false.") + @Property(description = "Sorry, 'pvp' must either be: true or false.", virtualType = Boolean.class) private VirtualProperty pvp = new VirtualProperty() { @Override public void set(Boolean newValue) { @@ -359,7 +359,8 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private String respawnWorld; @Property(validator = AllowWeatherPropertyValidator.class, description = "Sorry, this must either be: true or false.") private boolean allowWeather; - @Property(serializor = DifficultyPropertySerializor.class, description = "Difficulty must be set as one of the following: peaceful easy normal hard") + @Property(serializor = DifficultyPropertySerializor.class, virtualType = Difficulty.class, + description = "Difficulty must be set as one of the following: peaceful easy normal hard") private VirtualProperty difficulty = new VirtualProperty() { @Override public void set(Difficulty newValue) { @@ -388,7 +389,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private GameMode gameMode; @Property private boolean keepSpawnLoaded; - @Property(description = "Sorry, this must either be: true or false.") + @Property(description = "Sorry, this must either be: true or false.", virtualType = Boolean.class) private VirtualProperty keepSpawnInMemory = new VirtualProperty() { @Override public void set(Boolean newValue) { @@ -403,7 +404,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { }; @Property private SpawnLocation spawnLocation; - @Property(validator = SpawnLocationPropertyValidator.class, + @Property(validator = SpawnLocationPropertyValidator.class, virtualType = Location.class, description = "There is no help available for this variable. Go bug Rigby90 about it.") private VirtualProperty spawn = new VirtualProperty() { @Override @@ -429,7 +430,8 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { @Property private List worldBlacklist; @SuppressWarnings("unused") // it IS used! - @Property(serializor = TimePropertySerializor.class, description = "Set the time to whatever you want! (Will NOT freeze time)") + @Property(serializor = TimePropertySerializor.class, virtualType = Long.class, + description = "Set the time to whatever you want! (Will NOT freeze time)") private VirtualProperty time = new VirtualProperty() { @Override public void set(Long newValue) { diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/TestModifyCommand.java b/src/test/java/com/onarandombox/MultiverseCore/test/TestModifyCommand.java new file mode 100644 index 00000000..6eff3363 --- /dev/null +++ b/src/test/java/com/onarandombox/MultiverseCore/test/TestModifyCommand.java @@ -0,0 +1,61 @@ +package com.onarandombox.MultiverseCore.test; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import org.bukkit.Server; +import org.bukkit.World.Environment; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.PluginDescriptionFile; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.test.utils.TestInstanceCreator; + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class }) +public class TestModifyCommand { + TestInstanceCreator creator; + Server mockServer; + MultiverseCore core; + CommandSender mockCommandSender; + + @Before + public void setUp() throws Exception { + creator = new TestInstanceCreator(); + assertTrue(creator.setUp()); + mockServer = creator.getServer(); + mockCommandSender = creator.getCommandSender(); + core = creator.getCore(); + + // create world + assertTrue(core.getMVWorldManager().addWorld("world", Environment.NORMAL, null, null, null, null)); + } + + @After + public void tearDown() throws Exception { + creator.tearDown(); + } + + @Test + public void testSetHidden() { + Command cmd = mock(Command.class); + when(cmd.getName()).thenReturn("mv"); + + MultiverseWorld world = core.getMVWorldManager().getMVWorld("world"); + assertNotNull(world); + + assertFalse(world.isHidden()); // ensure it's not hidden now + assertTrue(core.onCommand(mockCommandSender, cmd, "", // run the command + new String[] { "modify", "set", "hidden", "true", "world" })); + assertTrue(world.isHidden()); // test if it worked + } +} From 21a3eeacc8a17f03e73450092d5dca6bc570de52 Mon Sep 17 00:00:00 2001 From: "main()" Date: Thu, 3 May 2012 16:20:59 +0200 Subject: [PATCH 22/22] That's the way it should be. --- .../onarandombox/MultiverseCore/MVWorld.java | 25 +++++++++++++------ .../MultiverseCore/utils/WorldManager.java | 3 +++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index cddc4238..2ca99b56 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -341,7 +341,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private String alias; @Property(serializor = EnumPropertySerializor.class, description = "Sorry, 'color' must be a valid color-name.") private EnglishChatColor color; - @Property(description = "Sorry, 'pvp' must either be: true or false.", virtualType = Boolean.class) + @Property(description = "Sorry, 'pvp' must either be: true or false.", virtualType = Boolean.class, persistVirtual = true) private VirtualProperty pvp = new VirtualProperty() { @Override public void set(Boolean newValue) { @@ -359,7 +359,7 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { private String respawnWorld; @Property(validator = AllowWeatherPropertyValidator.class, description = "Sorry, this must either be: true or false.") private boolean allowWeather; - @Property(serializor = DifficultyPropertySerializor.class, virtualType = Difficulty.class, + @Property(serializor = DifficultyPropertySerializor.class, virtualType = Difficulty.class, persistVirtual = true, description = "Difficulty must be set as one of the following: peaceful easy normal hard") private VirtualProperty difficulty = new VirtualProperty() { @Override @@ -387,19 +387,16 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { @Property(serializor = GameModePropertySerializor.class, validator = GameModePropertyValidator.class, description = "GameMode must be set as one of the following: survival creative") private GameMode gameMode; - @Property - private boolean keepSpawnLoaded; - @Property(description = "Sorry, this must either be: true or false.", virtualType = Boolean.class) + @Property(description = "Sorry, this must either be: true or false.", virtualType = Boolean.class, persistVirtual = true) private VirtualProperty keepSpawnInMemory = new VirtualProperty() { @Override public void set(Boolean newValue) { world.get().setKeepSpawnInMemory(newValue); - keepSpawnLoaded = newValue; } @Override public Boolean get() { - return keepSpawnLoaded; + return world.get().getKeepSpawnInMemory(); } }; @Property @@ -534,6 +531,19 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.spawnLocation = new SpawnLocation(readSpawnFromWorld(cbWorld)); this.initPerms(); + + this.flushPendingVPropChanges(); + } + + /** + * This prepares the MVWorld for unloading. + */ + public void tearDown() { + try { + this.buildVPropChanges(); + } catch (IllegalStateException e) { + // do nothing + } } /** @@ -626,7 +636,6 @@ public class MVWorld extends SerializationConfig implements MultiverseWorld { this.bedRespawn = true; this.worldBlacklist = new ArrayList(); this.generator = null; - this.keepSpawnLoaded = true; } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index 2d02dbc0..f8e018fb 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -226,6 +226,9 @@ public class WorldManager implements MVWorldManager { if (this.unloadWorldFromBukkit(name, true)) { this.worlds.remove(name); this.plugin.log(Level.INFO, "World '" + name + "' was unloaded from memory."); + + this.worldsFromTheConfig.get(name).tearDown(); + return true; } else { this.plugin.log(Level.WARNING, "World '" + name + "' could not be unloaded. Is it a default world?");