Pull changes from master.

This commit is contained in:
Eric Stokes 2011-12-02 18:19:26 -07:00
parent 22a7c5ae94
commit abb58b0563
43 changed files with 429 additions and 332 deletions

50
pom.xml
View File

@ -13,8 +13,8 @@
<repositories>
<repository>
<id>OnARandomBox</id>
<url>http://repo.onarandombox.com/artifactory/repo</url>
<id>pneumaticsystem</id>
<url>http://pneumaticsystem.com:25578/nexus/content/groups/public</url>
</repository>
</repositories>
@ -31,9 +31,25 @@
<ciManagement>
<system>jenkins</system>
<url>http://ci.onarandombox.com</url>
<url>http://pneumaticsystem.com:25579</url>
</ciManagement>
<!-- Profiles are used to detect whether this is a local or Jenkins build
and adjust the build number accordingly -->
<profiles>
<profile>
<id>jenkins</id>
<activation>
<property>
<name>env.BUILD_NUMBER</name>
</property>
</activation>
<properties>
<project.build.number>${env.BUILD_NUMBER}</project.build.number>
</properties>
</profile>
</profiles>
<build>
<defaultGoal>clean package</defaultGoal>
<plugins>
@ -109,6 +125,26 @@
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<configuration>
<parallel>methods</parallel>
<threadCount>10</threadCount>
<excludes>
<exclude>**/TestCommandSender.java</exclude>
<exclude>**/TestInstanceCreator.java</exclude>
</excludes>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.11</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
@ -187,10 +223,9 @@
<!-- End of Economy Dependencies -->
<!-- Start of Test Dependencies -->
<dependency>
<groupId>org.junit</groupId>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
@ -219,11 +254,6 @@
<version>3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
</dependency>
<!-- End of Test Dependencies -->
</dependencies>
</project>

View File

@ -45,7 +45,7 @@ public class MVWorld implements MultiverseWorld {
private String name; // The Worlds Name, EG its folder name.
private Map<String, List<String>> masterList;
private Map<String, MVConfigProperty> propertyList;
private Map<String, MVConfigProperty<?>> propertyList;
private String generator;
private Permission permission;
@ -82,7 +82,7 @@ public class MVWorld implements MultiverseWorld {
// Start NEW config awesomeness.
ConfigPropertyFactory fac = new ConfigPropertyFactory(this.worldSection);
this.propertyList = new HashMap<String, MVConfigProperty>();
this.propertyList = new HashMap<String, MVConfigProperty<?>>();
// The format of these are either:
// getNewProperty(name, defaultValue, helpText)
// or
@ -109,7 +109,7 @@ public class MVWorld implements MultiverseWorld {
this.propertyList.put("spawn", fac.getNewProperty("spawn", this.world.getSpawnLocation(), "There is no help available for this variable. Go bug Rigby90 about it."));
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?"));
((LocationConfigProperty) this.getKnownProperty("spawn")).setValue(this.readSpawnFromConfig(this.getCBWorld()));
this.getKnownProperty("spawn", Location.class).setValue(this.readSpawnFromConfig(this.getCBWorld()));
// Set aliases
@ -144,28 +144,28 @@ public class MVWorld implements MultiverseWorld {
public void changeActiveEffects() {
// Disable any current weather
if (!(Boolean) this.getKnownProperty("weather").getValue()) {
if (!this.getKnownProperty("weather", Boolean.class).getValue()) {
this.getCBWorld().setStorm(false);
this.getCBWorld().setThundering(false);
}
// Set the spawn location
Location spawnLocation = ((LocationConfigProperty) this.getKnownProperty("spawn")).getValue();
Location spawnLocation = this.getKnownProperty("spawn", Location.class).getValue();
this.getCBWorld().setSpawnLocation(spawnLocation.getBlockX(), spawnLocation.getBlockY(), spawnLocation.getBlockZ());
// Syncronize all Mob settings
this.syncMobs();
// Ensure the memory setting is correct
this.world.setKeepSpawnInMemory(((BooleanConfigProperty) this.getKnownProperty("memory")).getValue());
this.world.setKeepSpawnInMemory(this.getKnownProperty("memory", Boolean.class).getValue());
// Set the PVP mode
this.world.setPVP(((BooleanConfigProperty) this.getKnownProperty("pvp")).getValue());
this.world.setPVP(this.getKnownProperty("pvp", Boolean.class).getValue());
// Ensure the scale is above 0
if (((DoubleConfigProperty) this.getKnownProperty("scale")).getValue() <= 0) {
if (this.getKnownProperty("scale", Double.class).getValue() <= 0) {
// Disallow negative or 0 scalings.
((DoubleConfigProperty) this.getKnownProperty("scale")).setValue(1.0);
this.getKnownProperty("scale", Double.class).setValue(1.0);
this.plugin.log(Level.WARNING, "Someone tried to set a scale <= 0, defaulting to 1.");
}
@ -173,13 +173,13 @@ public class MVWorld implements MultiverseWorld {
// TODO: Move this to a per world gamemode
if (MultiverseCore.EnforceGameModes) {
for (Player p : this.plugin.getServer().getWorld(this.getName()).getPlayers()) {
this.plugin.log(Level.FINER, "Setting " + p.getName() + "'s GameMode to " + this.getKnownProperty("mode").getValue().toString());
this.plugin.log(Level.FINER, "Setting " + p.getName() + "'s GameMode to " + this.getKnownProperty("mode", GameMode.class).getValue().toString());
this.plugin.getPlayerListener().handleGameMode(p, this);
}
}
// Set the difficulty
this.getCBWorld().setDifficulty(((DifficultyConfigProperty) this.getKnownProperty("diff")).getValue());
this.getCBWorld().setDifficulty(this.getKnownProperty("diff", Difficulty.class).getValue());
}
private double getDefaultScale(Environment environment) {
@ -216,8 +216,8 @@ public class MVWorld implements MultiverseWorld {
}
public String getColoredWorldString() {
EnglishChatColor worldColor = ((ColorConfigProperty) this.getKnownProperty("color")).getValue();
String alias = ((StringConfigProperty) this.getKnownProperty("alias")).getValue();
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;
@ -271,9 +271,10 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean addToVariable(String property, String value) {
property = property.toLowerCase();
if (this.masterList.keySet().contains(property)) {
if (property.equalsIgnoreCase("animals") || property.equalsIgnoreCase("monsters")) {
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();
@ -289,15 +290,16 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean removeFromVariable(String property, String value) {
property = property.toLowerCase();
if (this.masterList.keySet().contains(property)) {
if (property.equalsIgnoreCase("animals") || property.equalsIgnoreCase("monsters")) {
if (property.equals("animals") || property.equals("monsters")) {
this.masterList.get(property).remove(value.toUpperCase());
this.worldSection.set("" + property.toLowerCase() + ".exceptions", this.masterList.get(property));
this.worldSection.set(property + ".exceptions", this.masterList.get(property));
this.syncMobs();
} else {
this.masterList.get(property).remove(value);
this.worldSection.set("" + property.toLowerCase(), this.masterList.get(property));
this.worldSection.set(property, this.masterList.get(property));
}
saveConfig();
return true;
@ -308,12 +310,12 @@ public class MVWorld implements MultiverseWorld {
private void syncMobs() {
if (this.getAnimalList().isEmpty()) {
this.world.setSpawnFlags(this.world.getAllowMonsters(), ((BooleanConfigProperty) this.getKnownProperty("animals")).getValue());
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(((BooleanConfigProperty) this.getKnownProperty("monsters")).getValue(), this.world.getAllowAnimals());
this.world.setSpawnFlags(this.getKnownProperty("monsters", Boolean.class).getValue(), this.world.getAllowAnimals());
} else {
this.world.setSpawnFlags(true, this.world.getAllowAnimals());
}
@ -322,30 +324,41 @@ public class MVWorld implements MultiverseWorld {
@Override
public void setKeepSpawnInMemory(boolean value) {
((BooleanConfigProperty) this.getKnownProperty("memory")).setValue(value);
this.getKnownProperty("memory", Boolean.class).setValue(value);
saveConfig();
}
// TODO: Provide better feedback
@Override
public boolean setProperty(String name, String value, CommandSender sender) throws PropertyDoesNotExistException {
if (this.setKnownProperty(name, value, sender) || this.setKnownProperty(this.propertyAliases.get(name), value, sender)) {
return true;
}
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);
}
@Override
public String getPropertyValue(String name) throws PropertyDoesNotExistException {
if (this.propertyList.containsKey(name)) {
return this.getKnownProperty(name).toString();
return this.getKnownProperty(name, Object.class).toString();
}
throw new PropertyDoesNotExistException(name);
}
@Override
public MVConfigProperty getProperty(String name) throws PropertyDoesNotExistException {
MVConfigProperty p = this.getKnownProperty(name);
@Deprecated
public MVConfigProperty<?> getProperty(String property) throws PropertyDoesNotExistException {
return getProperty(property, Object.class);
}
@Override
public <T> MVConfigProperty<T> getProperty(String name, Class<T> expected) throws PropertyDoesNotExistException {
MVConfigProperty<T> p = this.getKnownProperty(name, expected);
if (p == null) {
throw new PropertyDoesNotExistException(name);
}
@ -356,14 +369,19 @@ public class MVWorld implements MultiverseWorld {
* 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.
*/
private MVConfigProperty getKnownProperty(String name) {
@SuppressWarnings("unchecked")
private <T> MVConfigProperty<T> getKnownProperty(String name, Class<T> expected) {
try {
if (this.propertyList.containsKey(name)) {
return this.propertyList.get(name);
return (MVConfigProperty<T>) 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 this.propertyList.get(this.propertyAliases.get(name));
return (MVConfigProperty<T>) this.propertyList.get(this.propertyAliases.get(name));
}
} catch (ClassCastException e) {
}
return null;
}
@ -377,9 +395,9 @@ public class MVWorld implements MultiverseWorld {
* @return True if the property was saved, false if not.
*/
private boolean setKnownProperty(String name, String value, CommandSender sender) {
MVConfigProperty property;
MVConfigProperty<?> property;
if (this.propertyList.containsKey(name)) {
property = this.getKnownProperty(name);
property = this.getKnownProperty(name, Object.class);
} else if (this.propertyAliases.containsKey(name)) {
return this.setKnownProperty(this.propertyAliases.get(name), value, sender);
} else {
@ -434,7 +452,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public String getAlias() {
String alias = ((StringConfigProperty) this.getKnownProperty("alias")).getValue();
String alias = this.getKnownProperty("alias", String.class).getValue();
if (alias == null || alias.length() == 0) {
return this.name;
}
@ -449,7 +467,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean canAnimalsSpawn() {
return ((BooleanConfigProperty) this.getKnownProperty("animals")).getValue();
return this.getKnownProperty("animals", Boolean.class).getValue();
}
@Override
@ -464,7 +482,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean canMonstersSpawn() {
return ((BooleanConfigProperty) this.getKnownProperty("monsters")).getValue();
return this.getKnownProperty("monsters", Boolean.class).getValue();
}
@Override
@ -479,7 +497,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean isPVPEnabled() {
return ((BooleanConfigProperty) this.getKnownProperty("pvp")).getValue();
return this.getKnownProperty("pvp", Boolean.class).getValue();
}
@Override
@ -489,7 +507,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean isHidden() {
return ((BooleanConfigProperty) this.getKnownProperty("hidden")).getValue();
return this.getKnownProperty("hidden", Boolean.class).getValue();
}
@Override
@ -503,7 +521,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public double getScaling() {
return ((DoubleConfigProperty) this.getKnownProperty("scale")).getValue();
return this.getKnownProperty("scale", Double.class).getValue();
}
@Override
@ -522,7 +540,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public ChatColor getColor() {
return ((ColorConfigProperty) this.getKnownProperty("color")).getValue().getColor();
return this.getKnownProperty("color", EnglishChatColor.class).getValue().getColor();
}
public boolean clearList(String property) {
@ -543,7 +561,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public World getRespawnToWorld() {
return (this.plugin.getServer().getWorld(((StringConfigProperty) this.getKnownProperty("respawn")).getValue()));
return (this.plugin.getServer().getWorld(this.getKnownProperty("respawn", String.class).getValue()));
}
@Override
@ -558,7 +576,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public int getCurrency() {
return ((IntegerConfigProperty) this.getKnownProperty("curr")).getValue();
return this.getKnownProperty("curr", Integer.class).getValue();
}
@Override
@ -568,7 +586,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public double getPrice() {
return ((DoubleConfigProperty) this.getKnownProperty("price")).getValue();
return this.getKnownProperty("price", Double.class).getValue();
}
@Override
@ -599,7 +617,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public GameMode getGameMode() {
return ((GameModeConfigProperty) this.getKnownProperty("mode")).getValue();
return this.getKnownProperty("mode", GameMode.class).getValue();
}
@Override
@ -609,12 +627,12 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean isWeatherEnabled() {
return ((BooleanConfigProperty) this.getKnownProperty("weather")).getValue();
return this.getKnownProperty("weather", Boolean.class).getValue();
}
@Override
public boolean isKeepingSpawnInMemory() {
return ((BooleanConfigProperty) this.getKnownProperty("memory")).getValue();
return this.getKnownProperty("memory", Boolean.class).getValue();
}
@Override
@ -624,13 +642,13 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean getHunger() {
return ((BooleanConfigProperty) this.getKnownProperty("hunger")).getValue();
return this.getKnownProperty("hunger", Boolean.class).getValue();
}
@Override
public void setSpawnLocation(Location l) {
this.getCBWorld().setSpawnLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ());
((LocationConfigProperty) this.getKnownProperty("spawn")).setValue(l);
this.getKnownProperty("spawn", Location.class).setValue(l);
this.saveConfig();
}
@ -654,6 +672,7 @@ public class MVWorld implements MultiverseWorld {
}
// 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: " + LocationManipulation.strCoordsRaw(spawnLocation));
Location newSpawn = teleporter.getSafeLocation(spawnLocation, 16, 16);
// I think we could also do this, as I think this is what Notch does.
// Not sure how it will work in the nether...
@ -682,7 +701,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public Location getSpawnLocation() {
return ((LocationConfigProperty) this.getKnownProperty("spawn")).getValue();
return this.getKnownProperty("spawn", Location.class).getValue();
}
@Override
@ -697,7 +716,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean getAutoHeal() {
return ((BooleanConfigProperty) this.getKnownProperty("autoheal")).getValue();
return this.getKnownProperty("autoheal", Boolean.class).getValue();
}
@Override
@ -712,7 +731,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean getAdjustSpawn() {
return ((BooleanConfigProperty) this.getKnownProperty("adjustspawn")).getValue();
return this.getKnownProperty("adjustspawn", Boolean.class).getValue();
}
@Override
@ -722,7 +741,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean getAutoLoad() {
return ((BooleanConfigProperty) this.getKnownProperty("autoload")).getValue();
return this.getKnownProperty("autoload", Boolean.class).getValue();
}
@Override
@ -732,7 +751,7 @@ public class MVWorld implements MultiverseWorld {
@Override
public boolean getBedRespawn() {
return ((BooleanConfigProperty) this.getKnownProperty("bedrespawn")).getValue();
return this.getKnownProperty("bedrespawn", Boolean.class).getValue();
}
@Override

View File

@ -19,7 +19,9 @@ import com.onarandombox.MultiverseCore.listeners.MVEntityListener;
import com.onarandombox.MultiverseCore.listeners.MVPlayerListener;
import com.onarandombox.MultiverseCore.listeners.MVPluginListener;
import com.onarandombox.MultiverseCore.listeners.MVWeatherListener;
import com.onarandombox.MultiverseCore.localization.*;
import com.onarandombox.MultiverseCore.localization.MessageProvider;
import com.onarandombox.MultiverseCore.localization.MessageProviding;
import com.onarandombox.MultiverseCore.localization.SimpleMessageProvider;
import com.onarandombox.MultiverseCore.utils.*;
import com.pneumaticraft.commandhandler.CommandHandler;
import org.bukkit.ChatColor;
@ -36,7 +38,8 @@ import org.bukkit.event.Event.Priority;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.*;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -55,8 +58,9 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
/**
* This method is used to find out who is teleporting a player.
* @param playerName
* @return
*
* @param playerName The teleported player.
* @return The player that teleported the other one.
*/
public static String getPlayerTeleporter(String playerName) {
if (teleportQueue.containsKey(playerName)) {
@ -201,7 +205,12 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
this.log(Level.SEVERE, "Your configs were not loaded. Very little will function in Multiverse.");
}
this.anchorManager.loadAnchors();
try {
this.messageProvider.setLocale(new Locale(multiverseConfig.getString("locale", "en")));
} catch (IllegalArgumentException e) {
this.log(Level.SEVERE, e.getMessage());
this.getServer().getPluginManager().disablePlugin(this);
}
}
private boolean validateAllpay() {
@ -218,6 +227,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
return false;
}
} catch (Throwable t) {
//TODO: Deal with this. It's bad.
}
log.info(tag + " - Version " + this.getDescription().getVersion() + " was NOT ENABLED!!!");
log.info(tag + " A plugin that has loaded before " + this.getDescription().getName() + " has an incompatible version of AllPay!");
@ -240,6 +250,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
return false;
}
} catch (Throwable t) {
//TODO: Deal with this. It's bad.
}
log.info(tag + " - Version " + this.getDescription().getVersion() + " was NOT ENABLED!!!");
log.info(tag + " A plugin that has loaded before " + this.getDescription().getName() + " has an incompatible version of CommandHandler (an internal library)!");
@ -374,9 +385,9 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
}
/**
* Grab and return the Teleport class.
* Grab and return the {@link SafeTTeleporter}.
*
* @return
* @return The {@link SafeTTeleporter}.
*/
public SafeTTeleporter getTeleporter() {
return new SafeTTeleporter(this);
@ -409,8 +420,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
* Print messages to the server Log as well as to our DebugLog. 'debugLog' is used to seperate Heroes information
* from the Servers Log Output.
*
* @param level
* @param msg
* @param level The Log-{@link Level}
* @param msg The message
*/
public void log(Level level, String msg) {
staticLog(level, msg);
@ -436,8 +447,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
* Print messages to the Debug Log, if the servers in Debug Mode then we also wan't to print the messages to the
* standard Server Console.
*
* @param level
* @param msg
* @param level The Log-{@link Level}
* @param msg The message
*/
public static void staticDebugLog(Level level, String msg) {
log.log(level, "[MVCore-Debug] " + msg);
@ -447,7 +458,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
/**
* Parse the Authors Array into a readable String with ',' and 'and'.
*
* @return
* @return The readable authors-{@link String}
*/
private String getAuthors() {
String authors = "";
@ -480,9 +491,6 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
/**
* This code should get moved somewhere more appropriate, but for now, it's here.
*
* @param env
* @return
*/
public Environment getEnvFromString(String env) {
// Don't reference the enum directly as there aren't that many, and we can be more forgiving to users this way
@ -517,7 +525,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, Messag
/**
* Returns the number of plugins that have specifically hooked into core.
*
* @return
* @return The number if plugins that have hooked into core.
*/
public int getPluginCount() {
return this.pluginCount;

View File

@ -16,7 +16,7 @@ import org.bukkit.entity.Player;
/**
* Multiverse 2 Core API
* <p/>
* <p>
* This API contains a bunch of useful things you can get out of Multiverse in general!
*/
public interface Core {

View File

@ -21,7 +21,7 @@ import org.bukkit.util.Vector;
public interface MVDestination {
/**
* Returns the identifier or prefix that is required for this destination.
* <p/>
* <p>
* Portals have a prefix of "p" for example and OpenWarp (third party plugin) uses "ow". This is derived from a
* hash and cannot have duplicate values. Read that as your plugin cannot use 'p' because it's already used.
* Please check the wiki when adding a custom destination!
@ -32,7 +32,7 @@ public interface MVDestination {
/**
* Allows you to determine if a Destination is valid for the type it thinks it is.
* <p/>
* <p>
* An example of this would be the exact destination. A valid string would be: e:0,0,0 where an invalid one would
* be e:1:2:3. The first string would return true the second would return false. This is simply a convenience
* method
@ -48,11 +48,11 @@ public interface MVDestination {
/**
* Returns the location a specific entity will spawn at.
* <p/>
* <p>
* To just retrieve the location as it is stored you can just pass null, but be warned some destinations may return
* null back to you if you do this. It is always safer to pass an actual entity. This is used so things like
* minecarts can be teleported.
* <p/>
* <p>
* Do not forget to use {@link #getVelocity()} as destinations can use this too!
*
* @param entity The entity to be teleported.
@ -63,7 +63,7 @@ public interface MVDestination {
/**
* Returns the velocity vector for this destination.
* <p/>
* <p>
* Plugins wishing to fully support MVDestinations MUST implement this.
*
* @return A vector representing the speed/direction the player should travel when arriving
@ -72,7 +72,7 @@ public interface MVDestination {
/**
* Sets the destination string.
* <p/>
* <p>
* This should be used when you want to tell this destination object about a change in where it should take people.
* The destination param should be match the result from {@link #getIdentifier()}. A valid example would be that if
* {@link #getIdentifier()} returned "ow" our destination string could be "ow:TownCenter" but could not be
@ -85,7 +85,7 @@ public interface MVDestination {
/**
* Returns true if the destination is valid and players will be taken to it.
* <p/>
* <p>
* Even if destinations are in the correct format (p:MyPortal) MyPortal may not exist, and therefore this would
* return false.
*
@ -95,7 +95,7 @@ public interface MVDestination {
/**
* Gives you a general friendly description of the type of destination.
* <p/>
* <p>
* For example, the PlayerDestination sets this to "Player". You can use this to show where a player will be taken.
*
* @return A friendly string description of the type of destination.
@ -104,7 +104,7 @@ public interface MVDestination {
/**
* Gives you a specific name of the destination.
* <p/>
* <p>
* For example, the PlayerDestination sets this to The Player's Name.
*
* @return A friendly string stating the name of the destination.
@ -114,7 +114,7 @@ public interface MVDestination {
/**
* Returns a string that can easily be saved in the config that contains all the details needed to rebuild this
* destination.
* <p/>
* <p>
* ex: e:0,0,0:50:50
*
* @return The savable config string.
@ -123,9 +123,9 @@ public interface MVDestination {
/**
* Returns the permissions string required to go here.
* <p/>
* <p>
* ex: multiverse.access.world
* <p/>
* <p>
* NOTE: This is NOT the permission to use the teleport command.
*
* @return the permissions string required to go here.
@ -134,7 +134,7 @@ public interface MVDestination {
/**
* Should the Multiverse SafeTeleporter be used?
* <p/>
* <p>
* If not, MV will blindly take people to the location specified.
*
* @return True if the SafeTeleporter will be used, false if not.

View File

@ -19,7 +19,7 @@ import java.util.List;
/**
* Multiverse 2 World Manager API
* <p/>
* <p>
* This API contains all of the world managing
* functions that your heart desires!
*/
@ -142,7 +142,7 @@ public interface MVWorldManager {
/**
* Loads the Worlds & Settings for any worlds that bukkit loaded before us.
* <p/>
* <p>
* This way people will _always_ have some worlds in the list.
*/
public void loadDefaultWorlds();

View File

@ -17,7 +17,7 @@ import java.util.List;
/**
* The API for a Multiverse Handled World.
* <p/>
* <p>
* Currently INCOMPLETE
*/
public interface MultiverseWorld {
@ -48,8 +48,10 @@ public interface MultiverseWorld {
* @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
*/
public MVConfigProperty getProperty(String property) throws PropertyDoesNotExistException;
@Deprecated
public MVConfigProperty<?> getProperty(String property) throws PropertyDoesNotExistException;
/**
* Gets the string representation of a property.
@ -61,6 +63,17 @@ public interface MultiverseWorld {
*/
public 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.
* @return A valid MVWorldProperty.
* @throws PropertyDoesNotExistException Thrown if the property was not found in the world.
*/
public <T> MVConfigProperty<T> getProperty(String property, Class<T> expected) throws PropertyDoesNotExistException;
/**
* Removes all values from the given property. The property must be a {@link com.onarandombox.MultiverseCore.enums.AddProperties}.
*
@ -97,7 +110,7 @@ public interface MultiverseWorld {
/**
* Sets the environment of a world.
* <p/>
* <p>
* Note: This will ONLY take effect once the world is unloaded/reloaded.
*
* @param environment A {@link org.bukkit.World.Environment}.
@ -127,7 +140,7 @@ public interface MultiverseWorld {
/**
* Gets the alias of this world.
* <p/>
* <p>
* This alias allows users to have a world named "world" but show up in the list as "FernIsland"
*
* @return The alias of the world as a String.
@ -472,7 +485,7 @@ public interface MultiverseWorld {
/**
* Sets whether or not Multiverse should auto-load this world.
* <p/>
* <p>
* True is default.
*
* @param autoLoad True if multiverse should autoload this world the spawn, false if not.
@ -489,7 +502,7 @@ public interface MultiverseWorld {
/**
* Sets whether or not a player who dies in this world will respawn in their
* bed or follow the normal respawn pattern.
* <p/>
* <p>
* True is default.
*
* @param autoLoad True if players dying in this world respawn at their bed.

View File

@ -9,7 +9,6 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.utils.WorldManager;
import com.pneumaticraft.commandhandler.CommandHandler;
import org.bukkit.ChatColor;
import org.bukkit.World.Environment;
@ -47,7 +46,7 @@ public class CreateCommand extends MultiverseCommand {
return;
}
String worldName = args.get(0);
File worldFile = new File(this.plugin.getServerFolder(), worldName);
File worldFile = new File(this.plugin.getServer().getWorldContainer(), worldName);
String env = args.get(1);
String seed = CommandHandler.getFlag("-s", args);
String generator = CommandHandler.getFlag("-g", args);

View File

@ -106,7 +106,7 @@ public class ImportCommand extends MultiverseCommand {
this.showHelp(sender);
return;
}
File worldFile = new File(this.plugin.getServerFolder(), worldName);
File worldFile = new File(this.plugin.getServer().getWorldContainer(), worldName);
if (this.worldManager.isMVWorld(worldName) && worldFile.exists()) {
sender.sendMessage(ChatColor.RED + "Multiverse already knows about this world!");
return;

View File

@ -9,7 +9,8 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.pneumaticraft.commandhandler.Command;
import com.onarandombox.MultiverseCore.localization.MessageProvider;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import org.bukkit.ChatColor;
import org.bukkit.World.Environment;
import org.bukkit.command.CommandSender;
@ -21,15 +22,18 @@ import java.util.List;
public class ListCommand extends PaginatedCoreCommand<String> {
private MessageProvider provider;
public ListCommand(MultiverseCore plugin) {
super(plugin);
this.setName("World Listing");
provider = plugin.getMessageProvider();
this.setName(provider.getMessage(MultiverseMessage.LIST_NAME));
this.setCommandUsage("/mv list");
this.setArgRange(0, 2);
this.addKey("mvlist");
this.addKey("mvl");
this.addKey("mv list");
this.setPermission("multiverse.core.list.worlds", "Displays a listing of all worlds that you can enter.", PermissionDefault.OP);
this.setPermission("multiverse.core.list.worlds", provider.getMessage(MultiverseMessage.LIST_DESC), PermissionDefault.OP);
this.setItemsPerPage(8);
}
@ -62,7 +66,7 @@ public class ListCommand extends PaginatedCoreCommand<String> {
}
for (String name : this.plugin.getMVWorldManager().getUnloadedWorlds()) {
if (p == null || this.plugin.getMVPerms().hasPermission(p, "multiverse.access." + name, true)) {
worldList.add(ChatColor.GRAY + name + " - UNLOADED");
worldList.add(ChatColor.GRAY + name + " - " + provider.getMessage(MultiverseMessage.GENERIC_UNLOADED));
}
}
return worldList;
@ -87,7 +91,7 @@ public class ListCommand extends PaginatedCoreCommand<String> {
@Override
public void runCommand(CommandSender sender, List<String> args) {
sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ Multiverse World List ]====");
sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ " + this.provider.getMessage(MultiverseMessage.LIST_TITLE) + " ]====");
Player p = null;
if (sender instanceof Player) {
p = (Player) sender;
@ -100,7 +104,7 @@ public class ListCommand extends PaginatedCoreCommand<String> {
if (filterObject.getFilter().length() > 0) {
availableWorlds = this.getFilteredItems(availableWorlds, filterObject.getFilter());
if (availableWorlds.size() == 0) {
sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE + "No worlds matched your filter: " + ChatColor.AQUA + filterObject.getFilter());
sender.sendMessage(ChatColor.RED + provider.getMessage(MultiverseMessage.GENERIC_SORRY) + " " + ChatColor.WHITE + provider.getMessage(MultiverseMessage.LIST_NO_MATCH) + " " + ChatColor.AQUA + filterObject.getFilter());
return;
}
}
@ -118,7 +122,7 @@ public class ListCommand extends PaginatedCoreCommand<String> {
filterObject.setPage(totalPages);
}
sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages);
sender.sendMessage(ChatColor.AQUA + " " + provider.getMessage(MultiverseMessage.GENERIC_PAGE) + " " + filterObject.getPage() + " " + provider.getMessage(MultiverseMessage.GENERIC_OF) + " " + totalPages);
this.showPage(filterObject.getPage(), sender, availableWorlds);
}

View File

@ -11,7 +11,6 @@ import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.enums.Action;
import com.onarandombox.MultiverseCore.utils.WorldManager;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

View File

@ -12,7 +12,6 @@ import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.enums.EnglishChatColor;
import com.onarandombox.MultiverseCore.exceptions.PropertyDoesNotExistException;
import com.onarandombox.MultiverseCore.utils.WorldManager;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -108,7 +107,7 @@ public class ModifySetCommand extends MultiverseCommand {
if (world.setProperty(property, value, sender)) {
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).getHelp());
sender.sendMessage(world.getProperty(property, Object.class).getHelp());
}
} catch (PropertyDoesNotExistException e) {
sender.sendMessage(ChatColor.RED + "Sorry, You can't set: '" + ChatColor.GRAY + property + ChatColor.RED + "'");

View File

@ -10,7 +10,6 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.utils.WorldManager;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -92,7 +91,7 @@ public class WhoCommand extends MultiverseCommand {
result = "Empty";
} else {
for (Player player : players) {
result += player.getDisplayName() + " ";
result += player.getDisplayName() + " " + ChatColor.WHITE;
}
}

View File

@ -17,11 +17,7 @@ public class BooleanConfigProperty implements MVConfigProperty<Boolean> {
private String help;
public BooleanConfigProperty(ConfigurationSection section, String name, Boolean defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.setValue(this.section.getBoolean(this.configNode, defaultValue));
this(section, name, defaultValue, name, help);
}
public BooleanConfigProperty(ConfigurationSection section, String name, Boolean defaultValue, String configNode, String help) {
@ -29,6 +25,7 @@ public class BooleanConfigProperty implements MVConfigProperty<Boolean> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.value = defaultValue;
this.setValue(this.section.getBoolean(this.configNode, defaultValue));
}

View File

@ -18,11 +18,7 @@ public class ColorConfigProperty implements MVConfigProperty<EnglishChatColor> {
private String help;
public ColorConfigProperty(ConfigurationSection section, String name, EnglishChatColor defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.parseValue(this.section.getString(this.configNode, defaultValue.toString()));
this(section, name, defaultValue, name, help);
}
public ColorConfigProperty(ConfigurationSection section, String name, EnglishChatColor defaultValue, String configNode, String help) {
@ -30,6 +26,7 @@ public class ColorConfigProperty implements MVConfigProperty<EnglishChatColor> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.value = defaultValue;
this.parseValue(this.section.getString(this.configNode, defaultValue.toString()));
}

View File

@ -18,11 +18,7 @@ public class DifficultyConfigProperty implements MVConfigProperty<Difficulty> {
private String help;
public DifficultyConfigProperty(ConfigurationSection section, String name, Difficulty defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.parseValue(this.section.getString(this.configNode, defaultValue.toString()));
this(section, name, defaultValue, name, help);
}
public DifficultyConfigProperty(ConfigurationSection section, String name, Difficulty defaultValue, String configNode, String help) {
@ -30,6 +26,7 @@ public class DifficultyConfigProperty implements MVConfigProperty<Difficulty> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.value = defaultValue;
this.parseValue(this.section.getString(this.configNode, defaultValue.toString()));
}

View File

@ -17,11 +17,7 @@ public class DoubleConfigProperty implements MVConfigProperty<Double> {
private String help;
public DoubleConfigProperty(ConfigurationSection section, String name, Double defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.setValue(this.section.getDouble(this.configNode, defaultValue));
this(section, name, defaultValue, name, help);
}
public DoubleConfigProperty(ConfigurationSection section, String name, Double defaultValue, String configNode, String help) {
@ -29,6 +25,7 @@ public class DoubleConfigProperty implements MVConfigProperty<Double> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.value = defaultValue;
this.setValue(this.section.getDouble(this.configNode, defaultValue));
}

View File

@ -18,11 +18,7 @@ public class GameModeConfigProperty implements MVConfigProperty<GameMode> {
private String help;
public GameModeConfigProperty(ConfigurationSection section, String name, GameMode defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.parseValue(this.section.getString(this.configNode, defaultValue.toString()));
this(section, name, defaultValue, name, help);
}
public GameModeConfigProperty(ConfigurationSection section, String name, GameMode defaultValue, String configNode, String help) {
@ -30,6 +26,7 @@ public class GameModeConfigProperty implements MVConfigProperty<GameMode> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.value = defaultValue;
this.parseValue(this.section.getString(this.configNode, defaultValue.toString()));
}

View File

@ -17,11 +17,7 @@ public class IntegerConfigProperty implements MVConfigProperty<Integer> {
private String help;
public IntegerConfigProperty(ConfigurationSection section, String name, Integer defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.setValue(this.section.getInt(this.configNode, defaultValue));
this(section, name, defaultValue, name, help);
}
public IntegerConfigProperty(ConfigurationSection section, String name, Integer defaultValue, String configNode, String help) {
@ -29,6 +25,7 @@ public class IntegerConfigProperty implements MVConfigProperty<Integer> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.value = defaultValue;
this.setValue(this.section.getInt(this.configNode, defaultValue));
}

View File

@ -19,11 +19,7 @@ public class LocationConfigProperty implements MVConfigProperty<Location> {
private String help;
public LocationConfigProperty(ConfigurationSection section, String name, Location defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.setValue(this.getLocationFromConfig(this.configNode, defaultValue));
this(section, name, defaultValue, name, help);
}
public LocationConfigProperty(ConfigurationSection section, String name, Location defaultValue, String configNode, String help) {
@ -31,7 +27,8 @@ public class LocationConfigProperty implements MVConfigProperty<Location> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.setValue(this.getLocationFromConfig(this.configNode, defaultValue));
this.value = defaultValue;
this.setValue(this.getLocationFromConfig(defaultValue));
}
@Override
@ -46,7 +43,7 @@ public class LocationConfigProperty implements MVConfigProperty<Location> {
@Override
public boolean parseValue(String value) {
Location parsed = LocationManipulation.getLocationFromString(value);
Location parsed = LocationManipulation.stringToLocation(value);
return this.setValue(parsed);
}
@ -77,17 +74,18 @@ public class LocationConfigProperty implements MVConfigProperty<Location> {
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(String node, Location defaultValue) {
double x = this.section.getDouble(configNode + ".x", defaultValue.getX());
double y = this.section.getDouble(configNode + ".y", defaultValue.getY());
double z = this.section.getDouble(configNode + ".z", defaultValue.getZ());
double p = this.section.getDouble(configNode + ".pitch", defaultValue.getPitch());
double yaw = this.section.getDouble(configNode + ".yaw", defaultValue.getYaw());
String w = this.section.getString(configNode + ".world", defaultValue.getWorld().getName());
Location found = LocationManipulation.getLocationFromString(w + ":" + x + "," + y + "," + z + ":" + p + ":" + yaw);
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);
if (found != null) {
return found;
}

View File

@ -17,6 +17,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
@SuppressWarnings("deprecation")
public abstract class MVConfigMigrator {
public List<String> createdDefaults = new ArrayList<String>();

View File

@ -17,11 +17,7 @@ public class StringConfigProperty implements MVConfigProperty<String> {
private String help;
public StringConfigProperty(ConfigurationSection section, String name, String defaultValue, String help) {
this.name = name;
this.configNode = name;
this.section = section;
this.help = help;
this.parseValue(this.section.getString(this.configNode, defaultValue));
this(section, name, defaultValue, defaultValue, help);
}
public StringConfigProperty(ConfigurationSection section, String name, String defaultValue, String configNode, String help) {
@ -29,6 +25,7 @@ public class StringConfigProperty implements MVConfigProperty<String> {
this.configNode = configNode;
this.section = section;
this.help = help;
this.value = defaultValue;
this.parseValue(this.section.getString(this.configNode, defaultValue));
}

View File

@ -53,9 +53,9 @@ public class MVTeleportEvent extends Event implements Cancellable {
}
/**
* Returns the player who requested the Teleport
* Gets the {@link CommandSender} who requested the Teleport
*
* @return
* @return The {@link CommandSender} who requested the Teleport
*/
public CommandSender getTeleporter() {
return this.teleporter;

View File

@ -14,9 +14,9 @@ import org.bukkit.event.Event;
/**
* This event is fired *before* the property is actually changed.
* <p/>
* <p>
* If it is cancled, no change will happen.
* <p/>
* <p>
* 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()
*/

View File

@ -11,9 +11,6 @@ import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.utils.PermissionTools;
import com.onarandombox.MultiverseCore.utils.SafeTTeleporter;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.*;
import org.bukkit.event.entity.*;

View File

@ -173,10 +173,7 @@ public class MVPlayerListener extends PlayerListener {
// TODO: Fix this. Currently, we only check for PORTAL blocks. I'll have to figure out what
// TODO: we want to do here.
if (newloc != null) {
System.out.println("Found a new location!");
event.setFrom(newloc);
} else {
System.out.println("Did NOT find a new location!");
}
}
// Wait for the adjust, then return!

View File

@ -4,7 +4,15 @@ package com.onarandombox.MultiverseCore.localization;
* An enum containing all messages/strings used by Multiverse.
*/
public enum MultiverseMessage {
TEST_STRING("a test-string from the enum");
TEST_STRING("a test-string from the enum"),
LIST_NAME("World Listing"),
LIST_TITLE("Multiverse World List"),
LIST_DESC("Displays a listing of all worlds that you can enter."),
LIST_NO_MATCH("No worlds matched your filter:"),
GENERIC_SORRY("Sorry..."),
GENERIC_OF("of"),
GENERIC_PAGE("Page"),
GENERIC_UNLOADED("UNLOADED");
private final String def;

View File

@ -143,7 +143,6 @@ public class SimpleMessageProvider implements LazyLocaleMessageProvider {
public void setLocale(Locale locale) {
if (locale == null)
throw new IllegalArgumentException("Can't set locale to null!");
try {
maybeLoadLocale(locale);
} catch (LocalizationLoadingException e) {

View File

@ -42,7 +42,7 @@ public class AnchorManager {
Set<String> anchorKeys = anchors.getKeys(false);
for (String key : anchorKeys) {
//world:x,y,z:pitch:yaw
Location anchorLocation = LocationManipulation.getLocationFromString(anchors.getString(key, ""));
Location anchorLocation = LocationManipulation.stringToLocation(anchors.getString(key, ""));
if (anchorLocation != null) {
MultiverseCore.staticLog(Level.INFO, "Loading anchor: '" + key + "'...");
this.anchors.put(key, anchorLocation);
@ -77,7 +77,7 @@ public class AnchorManager {
}
public boolean saveAnchorLocation(String anchor, String location) {
Location parsed = LocationManipulation.getLocationFromString(location);
Location parsed = LocationManipulation.stringToLocation(location);
return parsed != null && this.saveAnchorLocation(anchor, parsed);
}

View File

@ -43,10 +43,11 @@ public class BlockSafety {
}
/**
* This function checks whether the block at the coordinates given is safe or not by checking for Laval/Fire/Air
* This function checks whether the block at the coordinates given is safe or not by checking for Lava/Fire/Air
* etc. This also ensures there is enough space for a player to spawn!
*
* @return
* @param l The {@link Location}
* @return Whether the player can spawn safely at the given {@link Location}
*/
public boolean playerCanSpawnHereSafely(Location l) {
World world = l.getWorld();
@ -107,9 +108,6 @@ public class BlockSafety {
/**
* If someone has a better way of this... Please either tell us, or submit a pull request!
*
* @param type
* @return
*/
private boolean isSolidBlock(Material type) {
switch (type) {
@ -196,10 +194,10 @@ public class BlockSafety {
}
/**
* Checks recursively below location L for 2 blocks of water
* Checks recursively below a {@link Location} for 2 blocks of water
*
* @param l
* @return
* @param l The {@link Location}
* @return Whether there are 2 blocks of water
*/
public boolean hasTwoBlocksofWaterBelow(Location l) {
if (l.getBlockY() < 0) {

View File

@ -15,6 +15,7 @@ import org.bukkit.entity.Vehicle;
import org.bukkit.util.Vector;
import java.text.DecimalFormat;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
@ -35,51 +36,80 @@ public class LocationManipulation {
/**
* Convert a Location into a Colon separated string to allow us to store it in text.
* world:x,y,z:pitch:yaw
* <p>
* WORLD:X,Y,Z:yaw:pitch
* <p>
* The corresponding String2Loc function is {@link #stringToLocation}
*
* @param location
* @return
* @param location The Location to save.
* @return The location as a string in this format: WORLD:x,y,z:yaw:pitch
*/
public static String locationToString(Location location) {
if (location == null) {
return "";
}
StringBuilder l = new StringBuilder();
l.append(location.getWorld().getName() + ":");
l.append(location.getBlockX() + ",");
l.append(location.getBlockY() + ",");
l.append(location.getBlockZ() + ":");
l.append(location.getYaw() + ":");
l.append(location.getPitch());
return l.toString();
Formatter formatter = new Formatter(l);
formatter.format("%s:%.2f,%.2f,%.2f:%.2f:%.2f", location.getWorld().getName(), location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
return formatter.toString();
}
/**
* Convert a String to a Location.
* Returns a new location from a given string. The format is as follows:
* <p>
* WORLD:X,Y,Z:yaw:pitch
* <p>
* The corresponding Location2String function is {@link #stringToLocation}
*
* @param world
* @param xStr
* @param yStr
* @param zStr
* @param yawStr
* @param pitchStr
* @return
* @param locationString The location represented as a string (WORLD:X,Y,Z:yaw:pitch)
* @return A new location defined by the string or null if the string was invalid.
*/
public Location stringToLocation(World world, String xStr, String yStr, String zStr, String yawStr, String pitchStr) {
double x = Double.parseDouble(xStr);
double y = Double.parseDouble(yStr);
double z = Double.parseDouble(zStr);
float yaw = Float.valueOf(yawStr);
float pitch = Float.valueOf(pitchStr);
public static Location stringToLocation(String locationString) {
//format:
//world:x,y,z:pitch:yaw
if (locationString == null) {
return null;
}
return new Location(world, x, y, z, yaw, pitch);
// Split the whole string, format is:
// {'world', 'x,y,z'[, 'pitch', 'yaw']}
String[] split = locationString.split(":");
if (split.length < 2 || split.length > 4) {
return null;
}
// Split the xyz string, format is:
// {'x', 'y', 'z'}
String[] xyzsplit = split[1].split(",");
if (xyzsplit.length != 3) {
return null;
}
// Verify the world is valid
World w = Bukkit.getWorld(split[0]);
if (w == null) {
return null;
}
try {
float pitch = 0;
float yaw = 0;
if (split.length >= 3) {
yaw = (float) Double.parseDouble(split[2]);
}
if (split.length == 4) {
pitch = (float) Double.parseDouble(split[3]);
}
return new Location(w, Double.parseDouble(xyzsplit[0]), Double.parseDouble(xyzsplit[1]), Double.parseDouble(xyzsplit[2]), yaw, pitch);
} catch (NumberFormatException e) {
return null;
}
}
/**
* Returns a colored string with the coords
*
* @param l
* @return
* @param l The {@link Location}
* @return The {@link String}
*/
public static String strCoords(Location l) {
String result = "";
@ -97,8 +127,8 @@ public class LocationManipulation {
/**
* Converts a location to a printable readable formatted string including pitch/yaw
*
* @param l
* @return
* @param l The {@link Location}
* @return The {@link String}
*/
public static String strCoordsRaw(Location l) {
String result = "";
@ -116,8 +146,8 @@ public class LocationManipulation {
/**
* Return the NESW Direction a Location is facing.
*
* @param location
* @return
* @param location The {@link Location}
* @return The NESW Direction
*/
public static String getDirection(Location location) {
double r = (location.getYaw() % 360) + 180;
@ -146,10 +176,10 @@ public class LocationManipulation {
}
/**
* Returns the float yaw position for the given cardianl direction
* Returns the float yaw position for the given cardinal direction
*
* @param orientation
* @return
* @param orientation The cardinal direction
* @return The yaw
*/
public static float getYaw(String orientation) {
if (orientation == null) {
@ -164,8 +194,8 @@ public class LocationManipulation {
/**
* Returns a speed float from a given vector.
*
* @param v
* @return
* @param v The {@link Vector}
* @return The speed
*/
public static float getSpeed(Vector v) {
return (float) Math.sqrt(v.getX() * v.getX() + v.getZ() * v.getZ());
@ -177,9 +207,9 @@ public class LocationManipulation {
/**
* Returns a translated vector from the given direction
*
* @param v
* @param direction
* @return
* @param v The old {@link Vector}
* @param direction The new direction
* @return The translated {@link Vector}
*/
public static Vector getTranslatedVector(Vector v, String direction) {
if (direction == null) {
@ -209,10 +239,10 @@ public class LocationManipulation {
}
/**
* Returns the next Location that an entity is traveling at
* Returns the next Location that a {@link Vehicle} is traveling at
*
* @param v
* @return
* @param v The {@link Vehicle}
* @return The {@link Location}
*/
public static Location getNextBlock(Vehicle v) {
Vector vector = v.getVelocity();
@ -221,43 +251,4 @@ public class LocationManipulation {
int z = vector.getZ() < 0 ? vector.getZ() == 0 ? 0 : -1 : 1;
return location.add(x, 0, z);
}
public static Location getLocationFromString(String value) {
//format:
//world:x,y,z:pitch:yaw
if (value == null) {
return null;
}
// Split the whole string, format is:
// {'world', 'x,y,z'[, 'pitch', 'yaw']}
String[] split = value.split(":");
if (split.length < 2 || split.length > 4) {
return null;
}
// Split the xyz string, format is:
// {'x', 'y', 'z'}
String[] xyzsplit = split[1].split(",");
if (xyzsplit.length != 3) {
return null;
}
// Verify the world is valid
World w = Bukkit.getWorld(split[0]);
if (w == null) {
return null;
}
try {
if (split.length == 2) {
return new Location(w, Double.parseDouble(xyzsplit[0]), Double.parseDouble(xyzsplit[1]), Double.parseDouble(xyzsplit[2]));
}
if (split.length == 3) {
return new Location(w, Double.parseDouble(xyzsplit[0]), Double.parseDouble(xyzsplit[1]), Double.parseDouble(xyzsplit[2]), (float) Double.parseDouble(split[2]), (float) 0.0);
}
return new Location(w, Double.parseDouble(xyzsplit[0]), Double.parseDouble(xyzsplit[1]), Double.parseDouble(xyzsplit[2]), (float) Double.parseDouble(split[2]), (float) Double.parseDouble(split[3]));
} catch (NumberFormatException e) {
return null;
}
}
}

View File

@ -39,9 +39,9 @@ public class MVPermissions implements PermissionsInterface {
/**
* Check if a Player can teleport to the Destination world from there current world.
*
* @param p The player to check.
* @param w
* @return
* @param p The {@link Player} to check.
* @param w The {@link MultiverseWorld} the player wants to teleport to.
* @return Whether the player can teleport to the given {@link MultiverseWorld}.
*/
public boolean canTravelFromWorld(Player p, MultiverseWorld w) {
List<String> blackList = w.getWorldBlacklist();
@ -72,9 +72,9 @@ public class MVPermissions implements PermissionsInterface {
/**
* Check if the Player has the permissions to enter this world.
*
* @param p
* @param w
* @return
* @param p The {@link Player} player that wants to enter
* @param w The {@link MultiverseWorld} he wants to enter
* @return Whether he has the permission to enter the world
*/
public boolean canEnterWorld(Player p, MultiverseWorld w) {
// If we're not enforcing access, anyone can enter.
@ -285,9 +285,6 @@ public class MVPermissions implements PermissionsInterface {
/**
* If the given permission was 'multiverse.core.tp.self', this would return 'multiverse.core.tp.*'.
*
* @param seperated
* @return
*/
private String getParentPerm(String[] seperated) {
if (seperated.length == 1) {

View File

@ -35,8 +35,6 @@ public class MVPlayerSession {
/**
* Grab whether the cooldown on Portal use has expired or not.
*
* @return
*/
public boolean getTeleportable() {
Long time = (new Date()).getTime();

View File

@ -106,7 +106,7 @@ public class PermissionTools {
/**
* Checks to see if player can go to a world given their current status.
* <p/>
* <p>
* The return is a little backwards, and will return a value safe for event.setCancelled.
*
* @param fromWorld The MultiverseWorld they are in.

View File

@ -85,11 +85,10 @@ public class UpdateChecker {
}
/**
* Convert the given Version String to a Normalised Version String so we can compare it.
* Convert the given Version String to a Normalized Version String so we can compare it.
*
* @param version
*
* @return
* @param version The version string
* @return The normalized version string
*/
public static String normalisedVersion(String version) {
return normalisedVersion(version, ".", 4);

View File

@ -8,7 +8,6 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PastebinPasteService implements PasteService {

View File

@ -1 +1,17 @@
TEST_STRING: a test-string from the resource
# Generic Strings
GENERIC_SORRY: Sorry...
GENERIC_PAGE: Page
GENERIC_OF: of
GENERIC_UNLOADED: UNLOADED
# Commands
# List Command
LIST_NAME: World Listing
LIST_DESC: Displays a listing of all worlds that you can enter.
LIST_TITLE: Multiverse World List
LIST_NO_MATCH: No worlds matched your filter:

View File

@ -1,3 +1,10 @@
/******************************************************************************
* 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.test;
import static org.junit.Assert.*;

View File

@ -7,15 +7,13 @@
package com.onarandombox.MultiverseCore.test;
import static junit.framework.Assert.*;
import static org.mockito.Mockito.*;
import java.io.File;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Server;
import org.bukkit.WorldCreator;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.exceptions.PropertyDoesNotExistException;
import com.onarandombox.MultiverseCore.test.utils.TestInstanceCreator;
import com.onarandombox.MultiverseCore.test.utils.WorldCreatorMatcher;
import com.onarandombox.MultiverseCore.utils.WorldManager;
import org.bukkit.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.Permission;
@ -30,18 +28,18 @@ import org.mockito.internal.verification.VerificationModeFactory;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.test.utils.TestInstanceCreator;
import com.onarandombox.MultiverseCore.test.utils.WorldCreatorMatcher;
import com.onarandombox.MultiverseCore.utils.WorldManager;
import java.io.File;
import static junit.framework.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ PluginManager.class, MultiverseCore.class, Permission.class, Bukkit.class, WorldManager.class })
public class TestWorldStuff {
TestInstanceCreator creator;
Server mockServer;
CommandSender mockCommandSender;
private TestInstanceCreator creator;
private Server mockServer;
private CommandSender mockCommandSender;
@Before
public void setUp() throws Exception {
@ -123,7 +121,7 @@ public class TestWorldStuff {
assertEquals(2, creator.getCore().getMVWorldManager().getMVWorlds().size());
// Import the third world.
String[] skyArgs = new String[] { "import", "world_skylands", "end" };
String[] skyArgs = new String[]{ "import", "world_the_end", "end" };
plugin.onCommand(mockCommandSender, mockCommand, "", skyArgs);
// We should now have 2 worlds imported!
@ -132,7 +130,7 @@ public class TestWorldStuff {
// Verify that the commandSender has been called 3 times.
verify(mockCommandSender).sendMessage("Starting import of world 'world'...");
verify(mockCommandSender).sendMessage("Starting import of world 'world_nether'...");
verify(mockCommandSender).sendMessage("Starting import of world 'world_skylands'...");
verify(mockCommandSender).sendMessage("Starting import of world 'world_the_end'...");
verify(mockCommandSender, VerificationModeFactory.times(3)).sendMessage("Complete!");
}
@ -168,4 +166,56 @@ public class TestWorldStuff {
WorldCreatorMatcher matcher = new WorldCreatorMatcher(new WorldCreator("newworld"));
verify(mockServer).createWorld(Matchers.argThat(matcher));
}
@Test
public void testModifyGameMode() {
// Pull a core instance from the server.
Plugin plugin = mockServer.getPluginManager().getPlugin("Multiverse-Core");
Command mockCommand = mock(Command.class);
when(mockCommand.getName()).thenReturn("mv");
// Ensure that there are no worlds imported. This is a fresh setup.
assertEquals(0, creator.getCore().getMVWorldManager().getMVWorlds().size());
this.createInitialWorlds(plugin, mockCommand);
// Ensure that the default worlds have been created.
assertEquals(3, creator.getCore().getMVWorldManager().getMVWorlds().size());
MultiverseWorld mainWorld = creator.getCore().getMVWorldManager().getMVWorld("world");
// Ensure that the default mode was normal.
assertEquals(GameMode.SURVIVAL, mainWorld.getGameMode());
// Set the mode to creative in world.
plugin.onCommand(mockCommandSender, mockCommand, "", new String[]{ "modify", "set", "mode", "creative", "world" });
verify(mockCommandSender).sendMessage(ChatColor.GREEN + "Success!" + ChatColor.WHITE + " Property " + ChatColor.AQUA + "mode" + ChatColor.WHITE + " was set to " + ChatColor.GREEN + "creative");
// Ensure the world is now a creative world
assertEquals(GameMode.CREATIVE, mainWorld.getGameMode());
// More tests, with alternate syntax.
plugin.onCommand(mockCommandSender, mockCommand, "", new String[]{ "modify", "set", "gamemode", "0", "world" });
verify(mockCommandSender).sendMessage(ChatColor.GREEN + "Success!" + ChatColor.WHITE + " Property " + ChatColor.AQUA + "gamemode" + ChatColor.WHITE + " was set to " + ChatColor.GREEN + "0");
assertEquals(GameMode.SURVIVAL, mainWorld.getGameMode());
// Now fail one.
plugin.onCommand(mockCommandSender, mockCommand, "", new String[]{ "modify", "set", "mode", "fish", "world" });
try {
verify(mockCommandSender).sendMessage(mainWorld.getProperty("mode", Object.class).getHelp());
} 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 + "'");
}
private void createInitialWorlds(Plugin plugin, Command command) {
plugin.onCommand(mockCommandSender, command, "", new String[]{ "import", "world", "normal" });
plugin.onCommand(mockCommandSender, command, "", new String[]{ "import", "world_nether", "nether" });
plugin.onCommand(mockCommandSender, command, "", new String[]{ "import", "world_the_end", "end" });
verify(mockCommandSender).sendMessage("Starting import of world 'world'...");
verify(mockCommandSender).sendMessage("Starting import of world 'world_nether'...");
verify(mockCommandSender).sendMessage("Starting import of world 'world_the_end'...");
verify(mockCommandSender, times(3)).sendMessage("Complete!");
}
}

View File

@ -263,7 +263,7 @@ public class MockBlock implements Block{
/**
* Captures the current state of this block. You may then cast that state
* into any accepted type, such as Furnace or Sign.
* <p/>
* <p>
* The returned object will never be updated, and you are not guaranteed that
* (for example) a sign is still a sign after you capture its state.
*
@ -352,7 +352,7 @@ public class MockBlock implements Block{
/**
* Checks if this block is empty.
* <p/>
* <p>
* A block is considered empty when {@link #getType()} returns {@link org.bukkit.Material#AIR}.
*
* @return true if this block is empty
@ -364,7 +364,7 @@ public class MockBlock implements Block{
/**
* Checks if this block is liquid.
* <p/>
* <p>
* A block is considered liquid when {@link #getType()} returns {@link org.bukkit.Material#WATER}, {@link
* org.bukkit.Material#STATIONARY_WATER}, {@link org.bukkit.Material#LAVA} or {@link
* org.bukkit.Material#STATIONARY_LAVA}.

View File

@ -7,9 +7,6 @@
package com.onarandombox.MultiverseCore.test.utils;
import java.util.Set;
import java.util.logging.Logger;
import org.bukkit.ChatColor;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
@ -18,6 +15,9 @@ import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin;
import java.util.Set;
import java.util.logging.Logger;
public class TestCommandSender implements CommandSender {
private Server server;
@ -67,7 +67,6 @@ public class TestCommandSender implements CommandSender {
* Checks if this object contains an override for the specified permission, by fully qualified name
*
* @param name Name of the permission
*
* @return true if the permission is set, otherwise false
*/
@Override
@ -79,7 +78,6 @@ public class TestCommandSender implements CommandSender {
* Checks if this object contains an override for the specified {@link org.bukkit.permissions.Permission}
*
* @param perm Permission to check
*
* @return true if the permission is set, otherwise false
*/
@Override
@ -89,11 +87,10 @@ public class TestCommandSender implements CommandSender {
/**
* Gets the value of the specified permission, if set.
* <p/>
* <p>
* If a permission override is not set on this object, the default value of the permission will be returned.
*
* @param name Name of the permission
*
* @return Value of the permission
*/
@Override
@ -103,11 +100,10 @@ public class TestCommandSender implements CommandSender {
/**
* Gets the value of the specified permission, if set.
* <p/>
* <p>
* If a permission override is not set on this object, the default value of the permission will be returned
*
* @param perm Permission to get
*
* @return Value of the permission
*/
@Override
@ -121,7 +117,6 @@ public class TestCommandSender implements CommandSender {
* @param plugin Plugin responsible for this attachment, may not be null or disabled
* @param name Name of the permission to attach
* @param value Value of the permission
*
* @return The PermissionAttachment that was just created
*/
@Override
@ -133,7 +128,6 @@ public class TestCommandSender implements CommandSender {
* Adds a new empty {@link org.bukkit.permissions.PermissionAttachment} to this object
*
* @param plugin Plugin responsible for this attachment, may not be null or disabled
*
* @return The PermissionAttachment that was just created
*/
@Override
@ -149,7 +143,6 @@ public class TestCommandSender implements CommandSender {
* @param name Name of the permission to attach
* @param value Value of the permission
* @param ticks Amount of ticks to automatically remove this attachment after
*
* @return The PermissionAttachment that was just created
*/
@Override
@ -162,7 +155,6 @@ public class TestCommandSender implements CommandSender {
*
* @param plugin Plugin responsible for this attachment, may not be null or disabled
* @param ticks Amount of ticks to automatically remove this attachment after
*
* @return The PermissionAttachment that was just created
*/
@Override
@ -174,7 +166,6 @@ public class TestCommandSender implements CommandSender {
* Removes the given {@link org.bukkit.permissions.PermissionAttachment} from this object
*
* @param attachment Attachment to remove
*
* @throws IllegalArgumentException Thrown when the specified attachment isn't part of this object
*/
@Override
@ -183,7 +174,7 @@ public class TestCommandSender implements CommandSender {
/**
* Recalculates the permissions for this object, if the attachments have changed values.
* <p/>
* <p>
* This should very rarely need to be called from a plugin.
*/
@Override

View File

@ -46,6 +46,7 @@ public class TestInstanceCreator {
public static final File pluginDirectory = new File("bin/test/server/plugins/coretest");
public static final File serverDirectory = new File("bin/test/server");
public static final File worldsDirectory = new File("bin/test/server");
public boolean setUp() {
try {
@ -81,7 +82,7 @@ public class TestInstanceCreator {
File worldNetherFile = new File(core.getServerFolder(), "world_nether");
Util.log("Creating world-folder: " + worldNetherFile.getAbsolutePath());
worldNetherFile.mkdirs();
File worldSkylandsFile = new File(core.getServerFolder(), "world_skylands");
File worldSkylandsFile = new File(core.getServerFolder(), "world_the_end");
Util.log("Creating world-folder: " + worldSkylandsFile.getAbsolutePath());
worldSkylandsFile.mkdirs();
@ -90,6 +91,7 @@ public class TestInstanceCreator {
when(mockServer.getName()).thenReturn("TestBukkit");
Logger.getLogger("Minecraft").setParent(Util.logger);
when(mockServer.getLogger()).thenReturn(Util.logger);
when(mockServer.getWorldContainer()).thenReturn(worldsDirectory);
// Give the server some worlds
when(mockServer.getWorld(anyString())).thenAnswer(new Answer<World>() {

View File

@ -42,10 +42,10 @@ public class WorldCreatorMatcher extends ArgumentMatcher<WorldCreator> {
Util.log("Checking Environments...");
return false;
} else if (careAboutSeeds && ((WorldCreator) creator).seed() != this.worldCreator.seed()) {
System.out.print("Checking Seeds...");
Util.log("Checking Seeds...");
return false;
} else if (careAboutGenerators && !((WorldCreator) creator).generator().equals(this.worldCreator.generator())) {
System.out.print("Checking Gens...");
Util.log("Checking Gens...");
return false;
}
Util.log("Creators matched!!!");