mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-29 16:46:45 +01:00
Hows this?
This commit is contained in:
parent
1cccdd9d4d
commit
5137b23357
@ -5,8 +5,7 @@ import java.util.Map;
|
||||
/**
|
||||
* Represents a source of configurable options and settings
|
||||
*/
|
||||
public interface Configuration extends ConfigurationSection
|
||||
{
|
||||
public interface Configuration extends ConfigurationSection {
|
||||
/**
|
||||
* Sets the default value of the given path as provided.
|
||||
* <p>
|
||||
@ -23,7 +22,7 @@ public interface Configuration extends ConfigurationSection
|
||||
*/
|
||||
@Override
|
||||
public void addDefault(final String path, final Object value);
|
||||
|
||||
|
||||
/**
|
||||
* Sets the default values of the given paths as provided.
|
||||
* <p>
|
||||
@ -35,7 +34,7 @@ public interface Configuration extends ConfigurationSection
|
||||
* @throws IllegalArgumentException Thrown if defaults is null.
|
||||
*/
|
||||
public void addDefaults(final Map<String, Object> defaults);
|
||||
|
||||
|
||||
/**
|
||||
* Sets the default values of the given paths as provided.
|
||||
* <p>
|
||||
@ -52,7 +51,7 @@ public interface Configuration extends ConfigurationSection
|
||||
* @throws IllegalArgumentException Thrown if defaults is null or this.
|
||||
*/
|
||||
public void addDefaults(final Configuration defaults);
|
||||
|
||||
|
||||
/**
|
||||
* Sets the source of all default values for this {@link Configuration}.
|
||||
* <p>
|
||||
@ -63,7 +62,7 @@ public interface Configuration extends ConfigurationSection
|
||||
* @throws IllegalArgumentException Thrown if defaults is null or this.
|
||||
*/
|
||||
public void setDefaults(final Configuration defaults);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the source {@link Configuration} for this configuration.
|
||||
* <p>
|
||||
@ -74,7 +73,7 @@ public interface Configuration extends ConfigurationSection
|
||||
* @return Configuration source for default values, or null if none exist.
|
||||
*/
|
||||
public Configuration getDefaults();
|
||||
|
||||
|
||||
/**
|
||||
* Gets the {@link ConfigurationOptions} for this {@link Configuration}.
|
||||
* <p>
|
||||
|
@ -4,27 +4,24 @@ package com.intellectualcrafters.configuration;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* Configuration}
|
||||
*/
|
||||
public class ConfigurationOptions
|
||||
{
|
||||
public class ConfigurationOptions {
|
||||
private char pathSeparator = '.';
|
||||
private boolean copyDefaults = false;
|
||||
private final Configuration configuration;
|
||||
|
||||
protected ConfigurationOptions(final Configuration configuration)
|
||||
{
|
||||
|
||||
protected ConfigurationOptions(final Configuration configuration) {
|
||||
this.configuration = configuration;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the {@link Configuration} that this object is responsible for.
|
||||
*
|
||||
* @return Parent configuration
|
||||
*/
|
||||
public Configuration configuration()
|
||||
{
|
||||
public Configuration configuration() {
|
||||
return configuration;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the char that will be used to separate {@link
|
||||
* ConfigurationSection}s
|
||||
@ -34,11 +31,10 @@ public class ConfigurationOptions
|
||||
*
|
||||
* @return Path separator
|
||||
*/
|
||||
public char pathSeparator()
|
||||
{
|
||||
public char pathSeparator() {
|
||||
return pathSeparator;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the char that will be used to separate {@link
|
||||
* ConfigurationSection}s
|
||||
@ -49,12 +45,11 @@ public class ConfigurationOptions
|
||||
* @param value Path separator
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public ConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
public ConfigurationOptions pathSeparator(final char value) {
|
||||
pathSeparator = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the {@link Configuration} should copy values from its default
|
||||
* {@link Configuration} directly.
|
||||
@ -69,11 +64,10 @@ public class ConfigurationOptions
|
||||
*
|
||||
* @return Whether or not defaults are directly copied
|
||||
*/
|
||||
public boolean copyDefaults()
|
||||
{
|
||||
public boolean copyDefaults() {
|
||||
return copyDefaults;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets if the {@link Configuration} should copy values from its default
|
||||
* {@link Configuration} directly.
|
||||
@ -89,8 +83,7 @@ public class ConfigurationOptions
|
||||
* @param value Whether or not defaults are directly copied
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public ConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
public ConfigurationOptions copyDefaults(final boolean value) {
|
||||
copyDefaults = value;
|
||||
return this;
|
||||
}
|
||||
|
@ -7,8 +7,7 @@ import java.util.Set;
|
||||
/**
|
||||
* Represents a section of a {@link Configuration}
|
||||
*/
|
||||
public interface ConfigurationSection
|
||||
{
|
||||
public interface ConfigurationSection {
|
||||
/**
|
||||
* Gets a set containing all keys in this section.
|
||||
* <p>
|
||||
@ -24,7 +23,7 @@ public interface ConfigurationSection
|
||||
* @return Set of keys contained within this ConfigurationSection.
|
||||
*/
|
||||
public Set<String> getKeys(final boolean deep);
|
||||
|
||||
|
||||
/**
|
||||
* Gets a Map containing all keys and their values for this section.
|
||||
* <p>
|
||||
@ -40,7 +39,7 @@ public interface ConfigurationSection
|
||||
* @return Map of keys and values of this section.
|
||||
*/
|
||||
public Map<String, Object> getValues(final boolean deep);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if this {@link ConfigurationSection} contains the given path.
|
||||
* <p>
|
||||
@ -53,7 +52,7 @@ public interface ConfigurationSection
|
||||
* @throws IllegalArgumentException Thrown when path is null.
|
||||
*/
|
||||
public boolean contains(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if this {@link ConfigurationSection} has a value set for the
|
||||
* given path.
|
||||
@ -67,7 +66,7 @@ public interface ConfigurationSection
|
||||
* @throws IllegalArgumentException Thrown when path is null.
|
||||
*/
|
||||
public boolean isSet(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the path of this {@link ConfigurationSection} from its root {@link
|
||||
* Configuration}
|
||||
@ -84,7 +83,7 @@ public interface ConfigurationSection
|
||||
* @return Path of this section relative to its root
|
||||
*/
|
||||
public String getCurrentPath();
|
||||
|
||||
|
||||
/**
|
||||
* Gets the name of this individual {@link ConfigurationSection}, in the
|
||||
* path.
|
||||
@ -95,7 +94,7 @@ public interface ConfigurationSection
|
||||
* @return Name of this section
|
||||
*/
|
||||
public String getName();
|
||||
|
||||
|
||||
/**
|
||||
* Gets the root {@link Configuration} that contains this {@link
|
||||
* ConfigurationSection}
|
||||
@ -109,7 +108,7 @@ public interface ConfigurationSection
|
||||
* @return Root configuration containing this section.
|
||||
*/
|
||||
public Configuration getRoot();
|
||||
|
||||
|
||||
/**
|
||||
* Gets the parent {@link ConfigurationSection} that directly contains
|
||||
* this {@link ConfigurationSection}.
|
||||
@ -122,7 +121,7 @@ public interface ConfigurationSection
|
||||
* @return Parent section containing this section.
|
||||
*/
|
||||
public ConfigurationSection getParent();
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested Object by path.
|
||||
* <p>
|
||||
@ -134,7 +133,7 @@ public interface ConfigurationSection
|
||||
* @return Requested Object.
|
||||
*/
|
||||
public Object get(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested Object by path, returning a default value if not
|
||||
* found.
|
||||
@ -148,7 +147,7 @@ public interface ConfigurationSection
|
||||
* @return Requested Object.
|
||||
*/
|
||||
public Object get(final String path, final Object def);
|
||||
|
||||
|
||||
/**
|
||||
* Sets the specified path to the given value.
|
||||
* <p>
|
||||
@ -164,7 +163,7 @@ public interface ConfigurationSection
|
||||
* @param value New value to set the path to.
|
||||
*/
|
||||
public void set(final String path, final Object value);
|
||||
|
||||
|
||||
/**
|
||||
* Creates an empty {@link ConfigurationSection} at the specified path.
|
||||
* <p>
|
||||
@ -176,7 +175,7 @@ public interface ConfigurationSection
|
||||
* @return Newly created section
|
||||
*/
|
||||
public ConfigurationSection createSection(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Creates a {@link ConfigurationSection} at the specified path, with
|
||||
* specified values.
|
||||
@ -190,7 +189,7 @@ public interface ConfigurationSection
|
||||
* @return Newly created section
|
||||
*/
|
||||
public ConfigurationSection createSection(final String path, final Map<?, ?> map);
|
||||
|
||||
|
||||
// Primitives
|
||||
/**
|
||||
* Gets the requested String by path.
|
||||
@ -203,7 +202,7 @@ public interface ConfigurationSection
|
||||
* @return Requested String.
|
||||
*/
|
||||
public String getString(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested String by path, returning a default value if not
|
||||
* found.
|
||||
@ -218,7 +217,7 @@ public interface ConfigurationSection
|
||||
* @return Requested String.
|
||||
*/
|
||||
public String getString(final String path, final String def);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified path is a String.
|
||||
* <p>
|
||||
@ -231,7 +230,7 @@ public interface ConfigurationSection
|
||||
* @return Whether or not the specified path is a String.
|
||||
*/
|
||||
public boolean isString(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested int by path.
|
||||
* <p>
|
||||
@ -243,7 +242,7 @@ public interface ConfigurationSection
|
||||
* @return Requested int.
|
||||
*/
|
||||
public int getInt(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested int by path, returning a default value if not found.
|
||||
* <p>
|
||||
@ -257,7 +256,7 @@ public interface ConfigurationSection
|
||||
* @return Requested int.
|
||||
*/
|
||||
public int getInt(final String path, final int def);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified path is an int.
|
||||
* <p>
|
||||
@ -270,7 +269,7 @@ public interface ConfigurationSection
|
||||
* @return Whether or not the specified path is an int.
|
||||
*/
|
||||
public boolean isInt(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested boolean by path.
|
||||
* <p>
|
||||
@ -282,7 +281,7 @@ public interface ConfigurationSection
|
||||
* @return Requested boolean.
|
||||
*/
|
||||
public boolean getBoolean(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested boolean by path, returning a default value if not
|
||||
* found.
|
||||
@ -297,7 +296,7 @@ public interface ConfigurationSection
|
||||
* @return Requested boolean.
|
||||
*/
|
||||
public boolean getBoolean(final String path, final boolean def);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified path is a boolean.
|
||||
* <p>
|
||||
@ -310,7 +309,7 @@ public interface ConfigurationSection
|
||||
* @return Whether or not the specified path is a boolean.
|
||||
*/
|
||||
public boolean isBoolean(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested double by path.
|
||||
* <p>
|
||||
@ -322,7 +321,7 @@ public interface ConfigurationSection
|
||||
* @return Requested double.
|
||||
*/
|
||||
public double getDouble(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested double by path, returning a default value if not
|
||||
* found.
|
||||
@ -337,7 +336,7 @@ public interface ConfigurationSection
|
||||
* @return Requested double.
|
||||
*/
|
||||
public double getDouble(final String path, final double def);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified path is a double.
|
||||
* <p>
|
||||
@ -350,7 +349,7 @@ public interface ConfigurationSection
|
||||
* @return Whether or not the specified path is a double.
|
||||
*/
|
||||
public boolean isDouble(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested long by path.
|
||||
* <p>
|
||||
@ -362,7 +361,7 @@ public interface ConfigurationSection
|
||||
* @return Requested long.
|
||||
*/
|
||||
public long getLong(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested long by path, returning a default value if not
|
||||
* found.
|
||||
@ -377,7 +376,7 @@ public interface ConfigurationSection
|
||||
* @return Requested long.
|
||||
*/
|
||||
public long getLong(final String path, final long def);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified path is a long.
|
||||
* <p>
|
||||
@ -390,7 +389,7 @@ public interface ConfigurationSection
|
||||
* @return Whether or not the specified path is a long.
|
||||
*/
|
||||
public boolean isLong(final String path);
|
||||
|
||||
|
||||
// Java
|
||||
/**
|
||||
* Gets the requested List by path.
|
||||
@ -403,7 +402,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List.
|
||||
*/
|
||||
public List<?> getList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List by path, returning a default value if not
|
||||
* found.
|
||||
@ -418,7 +417,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List.
|
||||
*/
|
||||
public List<?> getList(final String path, final List<?> def);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified path is a List.
|
||||
* <p>
|
||||
@ -431,7 +430,7 @@ public interface ConfigurationSection
|
||||
* @return Whether or not the specified path is a List.
|
||||
*/
|
||||
public boolean isList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of String by path.
|
||||
* <p>
|
||||
@ -446,7 +445,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of String.
|
||||
*/
|
||||
public List<String> getStringList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Integer by path.
|
||||
* <p>
|
||||
@ -461,7 +460,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Integer.
|
||||
*/
|
||||
public List<Integer> getIntegerList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Boolean by path.
|
||||
* <p>
|
||||
@ -476,7 +475,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Boolean.
|
||||
*/
|
||||
public List<Boolean> getBooleanList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Double by path.
|
||||
* <p>
|
||||
@ -491,7 +490,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Double.
|
||||
*/
|
||||
public List<Double> getDoubleList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Float by path.
|
||||
* <p>
|
||||
@ -506,7 +505,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Float.
|
||||
*/
|
||||
public List<Float> getFloatList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Long by path.
|
||||
* <p>
|
||||
@ -521,7 +520,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Long.
|
||||
*/
|
||||
public List<Long> getLongList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Byte by path.
|
||||
* <p>
|
||||
@ -536,7 +535,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Byte.
|
||||
*/
|
||||
public List<Byte> getByteList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Character by path.
|
||||
* <p>
|
||||
@ -551,7 +550,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Character.
|
||||
*/
|
||||
public List<Character> getCharacterList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Short by path.
|
||||
* <p>
|
||||
@ -566,7 +565,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Short.
|
||||
*/
|
||||
public List<Short> getShortList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested List of Maps by path.
|
||||
* <p>
|
||||
@ -581,7 +580,7 @@ public interface ConfigurationSection
|
||||
* @return Requested List of Maps.
|
||||
*/
|
||||
public List<Map<?, ?>> getMapList(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the requested ConfigurationSection by path.
|
||||
* <p>
|
||||
@ -594,7 +593,7 @@ public interface ConfigurationSection
|
||||
* @return Requested ConfigurationSection.
|
||||
*/
|
||||
public ConfigurationSection getConfigurationSection(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified path is a ConfigurationSection.
|
||||
* <p>
|
||||
@ -608,7 +607,7 @@ public interface ConfigurationSection
|
||||
* @return Whether or not the specified path is a ConfigurationSection.
|
||||
*/
|
||||
public boolean isConfigurationSection(final String path);
|
||||
|
||||
|
||||
/**
|
||||
* Gets the equivalent {@link ConfigurationSection} from the default
|
||||
* {@link Configuration} defined in {@link #getRoot()}.
|
||||
@ -620,7 +619,7 @@ public interface ConfigurationSection
|
||||
* @return Equivalent section in root configuration
|
||||
*/
|
||||
public ConfigurationSection getDefaultSection();
|
||||
|
||||
|
||||
/**
|
||||
* Sets the default value in the root at the given path as provided.
|
||||
* <p>
|
||||
|
@ -4,38 +4,34 @@ package com.intellectualcrafters.configuration;
|
||||
* Exception thrown when attempting to load an invalid {@link Configuration}
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class InvalidConfigurationException extends Exception
|
||||
{
|
||||
|
||||
public class InvalidConfigurationException extends Exception {
|
||||
|
||||
/**
|
||||
* Creates a new instance of InvalidConfigurationException without a
|
||||
* message or cause.
|
||||
*/
|
||||
public InvalidConfigurationException()
|
||||
{}
|
||||
|
||||
public InvalidConfigurationException() {}
|
||||
|
||||
/**
|
||||
* Constructs an instance of InvalidConfigurationException with the
|
||||
* specified message.
|
||||
*
|
||||
* @param msg The details of the exception.
|
||||
*/
|
||||
public InvalidConfigurationException(final String msg)
|
||||
{
|
||||
public InvalidConfigurationException(final String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructs an instance of InvalidConfigurationException with the
|
||||
* specified cause.
|
||||
*
|
||||
* @param cause The cause of the exception.
|
||||
*/
|
||||
public InvalidConfigurationException(final Throwable cause)
|
||||
{
|
||||
public InvalidConfigurationException(final Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructs an instance of InvalidConfigurationException with the
|
||||
* specified message and cause.
|
||||
@ -43,8 +39,7 @@ public class InvalidConfigurationException extends Exception
|
||||
* @param cause The cause of the exception.
|
||||
* @param msg The details of the exception.
|
||||
*/
|
||||
public InvalidConfigurationException(final String msg, final Throwable cause)
|
||||
{
|
||||
public InvalidConfigurationException(final String msg, final Throwable cause) {
|
||||
super(msg, cause);
|
||||
}
|
||||
}
|
||||
|
@ -7,17 +7,15 @@ import java.util.Map;
|
||||
* from any source, and stores all values in memory only.
|
||||
* This is useful for temporary Configurations for providing defaults.
|
||||
*/
|
||||
public class MemoryConfiguration extends MemorySection implements Configuration
|
||||
{
|
||||
public class MemoryConfiguration extends MemorySection implements Configuration {
|
||||
protected Configuration defaults;
|
||||
protected MemoryConfigurationOptions options;
|
||||
|
||||
|
||||
/**
|
||||
* Creates an empty {@link MemoryConfiguration} with no default values.
|
||||
*/
|
||||
public MemoryConfiguration()
|
||||
{}
|
||||
|
||||
public MemoryConfiguration() {}
|
||||
|
||||
/**
|
||||
* Creates an empty {@link MemoryConfiguration} using the specified {@link
|
||||
* Configuration} as a source for all default values.
|
||||
@ -25,70 +23,67 @@ public class MemoryConfiguration extends MemorySection implements Configuration
|
||||
* @param defaults Default value provider
|
||||
* @throws IllegalArgumentException Thrown if defaults is null
|
||||
*/
|
||||
public MemoryConfiguration(final Configuration defaults)
|
||||
{
|
||||
public MemoryConfiguration(final Configuration defaults) {
|
||||
this.defaults = defaults;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addDefault(final String path, final Object value)
|
||||
{
|
||||
if (path == null) { throw new NullPointerException("Path may not be null"); }
|
||||
if (defaults == null)
|
||||
{
|
||||
public void addDefault(final String path, final Object value) {
|
||||
if (path == null) {
|
||||
throw new NullPointerException("Path may not be null");
|
||||
}
|
||||
if (defaults == null) {
|
||||
defaults = new MemoryConfiguration();
|
||||
}
|
||||
|
||||
|
||||
defaults.set(path, value);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addDefaults(final Map<String, Object> defaults)
|
||||
{
|
||||
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
|
||||
|
||||
for (final Map.Entry<String, Object> entry : defaults.entrySet())
|
||||
{
|
||||
public void addDefaults(final Map<String, Object> defaults) {
|
||||
if (defaults == null) {
|
||||
throw new NullPointerException("Defaults may not be null");
|
||||
}
|
||||
|
||||
for (final Map.Entry<String, Object> entry : defaults.entrySet()) {
|
||||
addDefault(entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addDefaults(final Configuration defaults)
|
||||
{
|
||||
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
|
||||
|
||||
public void addDefaults(final Configuration defaults) {
|
||||
if (defaults == null) {
|
||||
throw new NullPointerException("Defaults may not be null");
|
||||
}
|
||||
|
||||
addDefaults(defaults.getValues(true));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setDefaults(final Configuration defaults)
|
||||
{
|
||||
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
|
||||
|
||||
public void setDefaults(final Configuration defaults) {
|
||||
if (defaults == null) {
|
||||
throw new NullPointerException("Defaults may not be null");
|
||||
}
|
||||
|
||||
this.defaults = defaults;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Configuration getDefaults()
|
||||
{
|
||||
public Configuration getDefaults() {
|
||||
return defaults;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ConfigurationSection getParent()
|
||||
{
|
||||
public ConfigurationSection getParent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MemoryConfigurationOptions options()
|
||||
{
|
||||
if (options == null)
|
||||
{
|
||||
public MemoryConfigurationOptions options() {
|
||||
if (options == null) {
|
||||
options = new MemoryConfigurationOptions(this);
|
||||
}
|
||||
|
||||
|
||||
return options;
|
||||
}
|
||||
}
|
||||
|
@ -4,29 +4,24 @@ package com.intellectualcrafters.configuration;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* MemoryConfiguration}
|
||||
*/
|
||||
public class MemoryConfigurationOptions extends ConfigurationOptions
|
||||
{
|
||||
protected MemoryConfigurationOptions(final MemoryConfiguration configuration)
|
||||
{
|
||||
public class MemoryConfigurationOptions extends ConfigurationOptions {
|
||||
protected MemoryConfigurationOptions(final MemoryConfiguration configuration) {
|
||||
super(configuration);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MemoryConfiguration configuration()
|
||||
{
|
||||
public MemoryConfiguration configuration() {
|
||||
return (MemoryConfiguration) super.configuration();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MemoryConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
public MemoryConfigurationOptions copyDefaults(final boolean value) {
|
||||
super.copyDefaults(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MemoryConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
public MemoryConfigurationOptions pathSeparator(final char value) {
|
||||
super.pathSeparator(value);
|
||||
return this;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -24,8 +24,7 @@ import com.intellectualcrafters.configuration.MemoryConfiguration;
|
||||
* This is a base class for all File based implementations of {@link
|
||||
* Configuration}
|
||||
*/
|
||||
public abstract class FileConfiguration extends MemoryConfiguration
|
||||
{
|
||||
public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
/**
|
||||
* This value specified that the system default encoding should be
|
||||
* completely ignored, as it cannot handle the ASCII character set, or it
|
||||
@ -50,8 +49,7 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
*/
|
||||
@Deprecated
|
||||
public static final boolean SYSTEM_UTF;
|
||||
static
|
||||
{
|
||||
static {
|
||||
final byte[] testBytes = Base64Coder.decode("ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4NCg==");
|
||||
final String testString = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\r\n";
|
||||
final Charset defaultCharset = Charset.defaultCharset();
|
||||
@ -61,26 +59,24 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
SYSTEM_UTF = trueUTF || UTF8_OVERRIDE;
|
||||
UTF_BIG = trueUTF && UTF8_OVERRIDE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an empty {@link FileConfiguration} with no default values.
|
||||
*/
|
||||
public FileConfiguration()
|
||||
{
|
||||
public FileConfiguration() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an empty {@link FileConfiguration} using the specified {@link
|
||||
* Configuration} as a source for all default values.
|
||||
*
|
||||
* @param defaults Default value provider
|
||||
*/
|
||||
public FileConfiguration(final Configuration defaults)
|
||||
{
|
||||
public FileConfiguration(final Configuration defaults) {
|
||||
super(defaults);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Saves this {@link FileConfiguration} to the specified location.
|
||||
* <p>
|
||||
@ -96,25 +92,23 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* any reason.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void save(final File file) throws IOException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
file.getParentFile().mkdirs();
|
||||
|
||||
final String data = saveToString();
|
||||
|
||||
final Writer writer = new OutputStreamWriter(new FileOutputStream(file), UTF8_OVERRIDE && !UTF_BIG ? StandardCharsets.UTF_8 : Charset.defaultCharset());
|
||||
|
||||
try
|
||||
{
|
||||
writer.write(data);
|
||||
public void save(final File file) throws IOException {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("File cannot be null");
|
||||
}
|
||||
finally
|
||||
{
|
||||
file.getParentFile().mkdirs();
|
||||
|
||||
final String data = saveToString();
|
||||
|
||||
final Writer writer = new OutputStreamWriter(new FileOutputStream(file), UTF8_OVERRIDE && !UTF_BIG ? StandardCharsets.UTF_8 : Charset.defaultCharset());
|
||||
|
||||
try {
|
||||
writer.write(data);
|
||||
} finally {
|
||||
writer.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Saves this {@link FileConfiguration} to the specified location.
|
||||
* <p>
|
||||
@ -130,20 +124,21 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* any reason.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void save(final String file) throws IOException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
public void save(final String file) throws IOException {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("File cannot be null");
|
||||
}
|
||||
|
||||
save(new File(file));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Saves this {@link FileConfiguration} to a string, and returns it.
|
||||
*
|
||||
* @return String containing this configuration.
|
||||
*/
|
||||
public abstract String saveToString();
|
||||
|
||||
|
||||
/**
|
||||
* Loads this {@link FileConfiguration} from the specified location.
|
||||
* <p>
|
||||
@ -166,15 +161,16 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* a valid Configuration.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void load(final File file) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
public void load(final File file) throws IOException, InvalidConfigurationException {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("File cannot be null");
|
||||
}
|
||||
|
||||
final FileInputStream stream = new FileInputStream(file);
|
||||
|
||||
|
||||
load(new InputStreamReader(stream, UTF8_OVERRIDE && !UTF_BIG ? StandardCharsets.UTF_8 : Charset.defaultCharset()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads this {@link FileConfiguration} from the specified stream.
|
||||
* <p>
|
||||
@ -194,13 +190,14 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* @see #load(Reader)
|
||||
*/
|
||||
@Deprecated
|
||||
public void load(final InputStream stream) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
if (stream == null) { throw new NullPointerException("Stream cannot be null"); }
|
||||
|
||||
public void load(final InputStream stream) throws IOException, InvalidConfigurationException {
|
||||
if (stream == null) {
|
||||
throw new NullPointerException("Stream cannot be null");
|
||||
}
|
||||
|
||||
load(new InputStreamReader(stream, UTF8_OVERRIDE ? StandardCharsets.UTF_8 : Charset.defaultCharset()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads this {@link FileConfiguration} from the specified reader.
|
||||
* <p>
|
||||
@ -214,30 +211,25 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* represent a valid Configuration
|
||||
* @throws IllegalArgumentException thrown when reader is null
|
||||
*/
|
||||
public void load(final Reader reader) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
public void load(final Reader reader) throws IOException, InvalidConfigurationException {
|
||||
final BufferedReader input = reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
|
||||
|
||||
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
try {
|
||||
String line;
|
||||
|
||||
while ((line = input.readLine()) != null)
|
||||
{
|
||||
|
||||
while ((line = input.readLine()) != null) {
|
||||
builder.append(line);
|
||||
builder.append('\n');
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
} finally {
|
||||
input.close();
|
||||
}
|
||||
|
||||
|
||||
loadFromString(builder.toString());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads this {@link FileConfiguration} from the specified location.
|
||||
* <p>
|
||||
@ -256,13 +248,14 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* a valid Configuration.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void load(final String file) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
public void load(final String file) throws IOException, InvalidConfigurationException {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("File cannot be null");
|
||||
}
|
||||
|
||||
load(new File(file));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads this {@link FileConfiguration} from the specified string, as
|
||||
* opposed to from file.
|
||||
@ -279,7 +272,7 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* @throws IllegalArgumentException Thrown if contents is null.
|
||||
*/
|
||||
public abstract void loadFromString(final String contents) throws InvalidConfigurationException;
|
||||
|
||||
|
||||
/**
|
||||
* Compiles the header for this {@link FileConfiguration} and returns the
|
||||
* result.
|
||||
@ -291,15 +284,13 @@ public abstract class FileConfiguration extends MemoryConfiguration
|
||||
* @return Compiled header
|
||||
*/
|
||||
protected abstract String buildHeader();
|
||||
|
||||
|
||||
@Override
|
||||
public FileConfigurationOptions options()
|
||||
{
|
||||
if (options == null)
|
||||
{
|
||||
public FileConfigurationOptions options() {
|
||||
if (options == null) {
|
||||
options = new FileConfigurationOptions(this);
|
||||
}
|
||||
|
||||
|
||||
return (FileConfigurationOptions) options;
|
||||
}
|
||||
}
|
||||
|
@ -7,36 +7,31 @@ import com.intellectualcrafters.configuration.MemoryConfigurationOptions;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* FileConfiguration}
|
||||
*/
|
||||
public class FileConfigurationOptions extends MemoryConfigurationOptions
|
||||
{
|
||||
public class FileConfigurationOptions extends MemoryConfigurationOptions {
|
||||
private String header = null;
|
||||
private boolean copyHeader = true;
|
||||
|
||||
protected FileConfigurationOptions(final MemoryConfiguration configuration)
|
||||
{
|
||||
|
||||
protected FileConfigurationOptions(final MemoryConfiguration configuration) {
|
||||
super(configuration);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public FileConfiguration configuration()
|
||||
{
|
||||
public FileConfiguration configuration() {
|
||||
return (FileConfiguration) super.configuration();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public FileConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
public FileConfigurationOptions copyDefaults(final boolean value) {
|
||||
super.copyDefaults(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public FileConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
public FileConfigurationOptions pathSeparator(final char value) {
|
||||
super.pathSeparator(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the header that will be applied to the top of the saved output.
|
||||
* <p>
|
||||
@ -51,11 +46,10 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions
|
||||
*
|
||||
* @return Header
|
||||
*/
|
||||
public String header()
|
||||
{
|
||||
public String header() {
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the header that will be applied to the top of the saved output.
|
||||
* <p>
|
||||
@ -71,12 +65,11 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions
|
||||
* @param value New header
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public FileConfigurationOptions header(final String value)
|
||||
{
|
||||
public FileConfigurationOptions header(final String value) {
|
||||
header = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets whether or not the header should be copied from a default source.
|
||||
* <p>
|
||||
@ -95,11 +88,10 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions
|
||||
*
|
||||
* @return Whether or not to copy the header
|
||||
*/
|
||||
public boolean copyHeader()
|
||||
{
|
||||
public boolean copyHeader() {
|
||||
return copyHeader;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets whether or not the header should be copied from a default source.
|
||||
* <p>
|
||||
@ -119,10 +111,9 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions
|
||||
* @param value Whether or not to copy the header
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public FileConfigurationOptions copyHeader(final boolean value)
|
||||
{
|
||||
public FileConfigurationOptions copyHeader(final boolean value) {
|
||||
copyHeader = value;
|
||||
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@ -22,170 +22,144 @@ import com.intellectualcrafters.plot.PS;
|
||||
* An implementation of {@link Configuration} which saves all files in Yaml.
|
||||
* Note that this implementation is not synchronized.
|
||||
*/
|
||||
public class YamlConfiguration extends FileConfiguration
|
||||
{
|
||||
public class YamlConfiguration extends FileConfiguration {
|
||||
protected static final String COMMENT_PREFIX = "# ";
|
||||
protected static final String BLANK_CONFIG = "{}\n";
|
||||
private final DumperOptions yamlOptions = new DumperOptions();
|
||||
private final Representer yamlRepresenter = new YamlRepresenter();
|
||||
private final Yaml yaml = new Yaml(new YamlConstructor(), yamlRepresenter, yamlOptions);
|
||||
|
||||
|
||||
@Override
|
||||
public String saveToString()
|
||||
{
|
||||
public String saveToString() {
|
||||
yamlOptions.setIndent(options().indent());
|
||||
yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||
yamlOptions.setAllowUnicode(SYSTEM_UTF);
|
||||
yamlRepresenter.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||
|
||||
|
||||
final String header = buildHeader();
|
||||
String dump = yaml.dump(getValues(false));
|
||||
|
||||
if (dump.equals(BLANK_CONFIG))
|
||||
{
|
||||
|
||||
if (dump.equals(BLANK_CONFIG)) {
|
||||
dump = "";
|
||||
}
|
||||
|
||||
|
||||
return header + dump;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void loadFromString(final String contents) throws InvalidConfigurationException
|
||||
{
|
||||
if (contents == null) { throw new NullPointerException("Contents cannot be null"); }
|
||||
|
||||
public void loadFromString(final String contents) throws InvalidConfigurationException {
|
||||
if (contents == null) {
|
||||
throw new NullPointerException("Contents cannot be null");
|
||||
}
|
||||
|
||||
Map<?, ?> input;
|
||||
try
|
||||
{
|
||||
try {
|
||||
input = (Map<?, ?>) yaml.load(contents);
|
||||
}
|
||||
catch (final YAMLException e)
|
||||
{
|
||||
} catch (final YAMLException e) {
|
||||
throw new InvalidConfigurationException(e);
|
||||
}
|
||||
catch (final ClassCastException e)
|
||||
{
|
||||
} catch (final ClassCastException e) {
|
||||
throw new InvalidConfigurationException("Top level is not a Map.");
|
||||
}
|
||||
|
||||
|
||||
final String header = parseHeader(contents);
|
||||
if (header.length() > 0)
|
||||
{
|
||||
if (header.length() > 0) {
|
||||
options().header(header);
|
||||
}
|
||||
|
||||
if (input != null)
|
||||
{
|
||||
|
||||
if (input != null) {
|
||||
convertMapsToSections(input, this);
|
||||
}
|
||||
}
|
||||
|
||||
protected void convertMapsToSections(final Map<?, ?> input, final ConfigurationSection section)
|
||||
{
|
||||
for (final Map.Entry<?, ?> entry : input.entrySet())
|
||||
{
|
||||
|
||||
protected void convertMapsToSections(final Map<?, ?> input, final ConfigurationSection section) {
|
||||
for (final Map.Entry<?, ?> entry : input.entrySet()) {
|
||||
final String key = entry.getKey().toString();
|
||||
final Object value = entry.getValue();
|
||||
|
||||
if (value instanceof Map)
|
||||
{
|
||||
|
||||
if (value instanceof Map) {
|
||||
convertMapsToSections((Map<?, ?>) value, section.createSection(key));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
section.set(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected String parseHeader(final String input)
|
||||
{
|
||||
|
||||
protected String parseHeader(final String input) {
|
||||
final String[] lines = input.split("\r?\n", -1);
|
||||
final StringBuilder result = new StringBuilder();
|
||||
boolean readingHeader = true;
|
||||
boolean foundHeader = false;
|
||||
|
||||
for (int i = 0; (i < lines.length) && (readingHeader); i++)
|
||||
{
|
||||
|
||||
for (int i = 0; (i < lines.length) && (readingHeader); i++) {
|
||||
final String line = lines[i];
|
||||
|
||||
if (line.startsWith(COMMENT_PREFIX))
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
|
||||
if (line.startsWith(COMMENT_PREFIX)) {
|
||||
if (i > 0) {
|
||||
result.append("\n");
|
||||
}
|
||||
|
||||
if (line.length() > COMMENT_PREFIX.length())
|
||||
{
|
||||
|
||||
if (line.length() > COMMENT_PREFIX.length()) {
|
||||
result.append(line.substring(COMMENT_PREFIX.length()));
|
||||
}
|
||||
|
||||
|
||||
foundHeader = true;
|
||||
}
|
||||
else if ((foundHeader) && (line.length() == 0))
|
||||
{
|
||||
} else if ((foundHeader) && (line.length() == 0)) {
|
||||
result.append("\n");
|
||||
}
|
||||
else if (foundHeader)
|
||||
{
|
||||
} else if (foundHeader) {
|
||||
readingHeader = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected String buildHeader()
|
||||
{
|
||||
protected String buildHeader() {
|
||||
final String header = options().header();
|
||||
|
||||
if (options().copyHeader())
|
||||
{
|
||||
|
||||
if (options().copyHeader()) {
|
||||
final Configuration def = getDefaults();
|
||||
|
||||
if ((def != null) && (def instanceof FileConfiguration))
|
||||
{
|
||||
|
||||
if ((def != null) && (def instanceof FileConfiguration)) {
|
||||
final FileConfiguration filedefaults = (FileConfiguration) def;
|
||||
final String defaultsHeader = filedefaults.buildHeader();
|
||||
|
||||
if ((defaultsHeader != null) && (defaultsHeader.length() > 0)) { return defaultsHeader; }
|
||||
|
||||
if ((defaultsHeader != null) && (defaultsHeader.length() > 0)) {
|
||||
return defaultsHeader;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (header == null) { return ""; }
|
||||
|
||||
|
||||
if (header == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
final String[] lines = header.split("\r?\n", -1);
|
||||
boolean startedHeader = false;
|
||||
|
||||
for (int i = lines.length - 1; i >= 0; i--)
|
||||
{
|
||||
|
||||
for (int i = lines.length - 1; i >= 0; i--) {
|
||||
builder.insert(0, "\n");
|
||||
|
||||
if ((startedHeader) || (lines[i].length() != 0))
|
||||
{
|
||||
|
||||
if ((startedHeader) || (lines[i].length() != 0)) {
|
||||
builder.insert(0, lines[i]);
|
||||
builder.insert(0, COMMENT_PREFIX);
|
||||
startedHeader = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions options()
|
||||
{
|
||||
if (options == null)
|
||||
{
|
||||
public YamlConfigurationOptions options() {
|
||||
if (options == null) {
|
||||
options = new YamlConfigurationOptions(this);
|
||||
}
|
||||
|
||||
|
||||
return (YamlConfigurationOptions) options;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link YamlConfiguration}, loading from the given file.
|
||||
* <p>
|
||||
@ -199,25 +173,21 @@ public class YamlConfiguration extends FileConfiguration
|
||||
* @return Resulting configuration
|
||||
* @throws IllegalArgumentException Thrown if file is null
|
||||
*/
|
||||
public static YamlConfiguration loadConfiguration(final File file)
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
final YamlConfiguration config = new YamlConfiguration();
|
||||
|
||||
try
|
||||
{
|
||||
config.load(file);
|
||||
public static YamlConfiguration loadConfiguration(final File file) {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("File cannot be null");
|
||||
}
|
||||
catch (final Exception ex)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
final YamlConfiguration config = new YamlConfiguration();
|
||||
|
||||
try {
|
||||
config.load(file);
|
||||
} catch (final Exception ex) {
|
||||
try {
|
||||
file.getAbsolutePath();
|
||||
File dest = new File(file.getAbsolutePath() + "_broken");
|
||||
int i = 0;
|
||||
while (dest.exists())
|
||||
{
|
||||
while (dest.exists()) {
|
||||
dest = new File(file.getAbsolutePath() + "_broken_" + i++);
|
||||
}
|
||||
Files.copy(file.toPath(), dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
@ -226,16 +196,14 @@ public class YamlConfiguration extends FileConfiguration
|
||||
PS.debug("&c============ Full stacktrace ============");
|
||||
ex.printStackTrace();
|
||||
PS.debug("&c=========================================");
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link YamlConfiguration}, loading from the given stream.
|
||||
* <p>
|
||||
@ -251,30 +219,26 @@ public class YamlConfiguration extends FileConfiguration
|
||||
* @see #loadConfiguration(Reader)
|
||||
*/
|
||||
@Deprecated
|
||||
public static YamlConfiguration loadConfiguration(final InputStream stream)
|
||||
{
|
||||
if (stream == null) { throw new NullPointerException("Stream cannot be null"); }
|
||||
|
||||
public static YamlConfiguration loadConfiguration(final InputStream stream) {
|
||||
if (stream == null) {
|
||||
throw new NullPointerException("Stream cannot be null");
|
||||
}
|
||||
|
||||
final YamlConfiguration config = new YamlConfiguration();
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
try {
|
||||
config.load(stream);
|
||||
}
|
||||
catch (final IOException ex)
|
||||
{
|
||||
} catch (final IOException ex) {
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
catch (final InvalidConfigurationException ex)
|
||||
{
|
||||
} catch (final InvalidConfigurationException ex) {
|
||||
ex.printStackTrace();
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
}
|
||||
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link YamlConfiguration}, loading from the given reader.
|
||||
* <p>
|
||||
@ -286,27 +250,23 @@ public class YamlConfiguration extends FileConfiguration
|
||||
* @return resulting configuration
|
||||
* @throws IllegalArgumentException Thrown if stream is null
|
||||
*/
|
||||
public static YamlConfiguration loadConfiguration(final Reader reader)
|
||||
{
|
||||
if (reader == null) { throw new NullPointerException("Reader cannot be null"); }
|
||||
|
||||
public static YamlConfiguration loadConfiguration(final Reader reader) {
|
||||
if (reader == null) {
|
||||
throw new NullPointerException("Reader cannot be null");
|
||||
}
|
||||
|
||||
final YamlConfiguration config = new YamlConfiguration();
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
try {
|
||||
config.load(reader);
|
||||
}
|
||||
catch (final IOException ex)
|
||||
{
|
||||
} catch (final IOException ex) {
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
ex.printStackTrace();
|
||||
} catch (final InvalidConfigurationException ex) {
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
catch (final InvalidConfigurationException ex)
|
||||
{
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
return config;
|
||||
}
|
||||
}
|
||||
|
@ -4,49 +4,42 @@ package com.intellectualcrafters.configuration.file;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* YamlConfiguration}
|
||||
*/
|
||||
public class YamlConfigurationOptions extends FileConfigurationOptions
|
||||
{
|
||||
public class YamlConfigurationOptions extends FileConfigurationOptions {
|
||||
private int indent = 2;
|
||||
|
||||
protected YamlConfigurationOptions(final YamlConfiguration configuration)
|
||||
{
|
||||
|
||||
protected YamlConfigurationOptions(final YamlConfiguration configuration) {
|
||||
super(configuration);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public YamlConfiguration configuration()
|
||||
{
|
||||
public YamlConfiguration configuration() {
|
||||
return (YamlConfiguration) super.configuration();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
public YamlConfigurationOptions copyDefaults(final boolean value) {
|
||||
super.copyDefaults(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
public YamlConfigurationOptions pathSeparator(final char value) {
|
||||
super.pathSeparator(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions header(final String value)
|
||||
{
|
||||
public YamlConfigurationOptions header(final String value) {
|
||||
super.header(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions copyHeader(final boolean value)
|
||||
{
|
||||
public YamlConfigurationOptions copyHeader(final boolean value) {
|
||||
super.copyHeader(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets how much spaces should be used to indent each line.
|
||||
* <p>
|
||||
@ -54,11 +47,10 @@ public class YamlConfigurationOptions extends FileConfigurationOptions
|
||||
*
|
||||
* @return How much to indent by
|
||||
*/
|
||||
public int indent()
|
||||
{
|
||||
public int indent() {
|
||||
return indent;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets how much spaces should be used to indent each line.
|
||||
* <p>
|
||||
@ -67,11 +59,14 @@ public class YamlConfigurationOptions extends FileConfigurationOptions
|
||||
* @param value New indent
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public YamlConfigurationOptions indent(final int value)
|
||||
{
|
||||
if (value < 2) { throw new IllegalArgumentException("Indent must be at least 2 characters"); }
|
||||
if (value > 9) { throw new IllegalArgumentException("Indent cannot be greater than 9 characters"); }
|
||||
|
||||
public YamlConfigurationOptions indent(final int value) {
|
||||
if (value < 2) {
|
||||
throw new IllegalArgumentException("Indent must be at least 2 characters");
|
||||
}
|
||||
if (value > 9) {
|
||||
throw new IllegalArgumentException("Indent cannot be greater than 9 characters");
|
||||
}
|
||||
|
||||
indent = value;
|
||||
return this;
|
||||
}
|
||||
|
@ -10,47 +10,39 @@ import org.yaml.snakeyaml.nodes.Tag;
|
||||
|
||||
import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization;
|
||||
|
||||
public class YamlConstructor extends SafeConstructor
|
||||
{
|
||||
|
||||
public YamlConstructor()
|
||||
{
|
||||
public class YamlConstructor extends SafeConstructor {
|
||||
|
||||
public YamlConstructor() {
|
||||
yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
|
||||
}
|
||||
|
||||
private class ConstructCustomObject extends ConstructYamlMap
|
||||
{
|
||||
|
||||
private class ConstructCustomObject extends ConstructYamlMap {
|
||||
@Override
|
||||
public Object construct(final Node node)
|
||||
{
|
||||
if (node.isTwoStepsConstruction()) { throw new YAMLException("Unexpected referential mapping structure. Node: " + node); }
|
||||
|
||||
public Object construct(final Node node) {
|
||||
if (node.isTwoStepsConstruction()) {
|
||||
throw new YAMLException("Unexpected referential mapping structure. Node: " + node);
|
||||
}
|
||||
|
||||
final Map<?, ?> raw = (Map<?, ?>) super.construct(node);
|
||||
|
||||
if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY))
|
||||
{
|
||||
|
||||
if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY)) {
|
||||
final Map<String, Object> typed = new LinkedHashMap<String, Object>(raw.size());
|
||||
for (final Map.Entry<?, ?> entry : raw.entrySet())
|
||||
{
|
||||
for (final Map.Entry<?, ?> entry : raw.entrySet()) {
|
||||
typed.put(entry.getKey().toString(), entry.getValue());
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
try {
|
||||
return ConfigurationSerialization.deserializeObject(typed);
|
||||
}
|
||||
catch (final IllegalArgumentException ex)
|
||||
{
|
||||
} catch (final IllegalArgumentException ex) {
|
||||
throw new YAMLException("Could not deserialize object", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return raw;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void construct2ndStep(final Node node, final Object object)
|
||||
{
|
||||
public void construct2ndStep(final Node node, final Object object) {
|
||||
throw new YAMLException("Unexpected referential mapping structure. Node: " + node);
|
||||
}
|
||||
}
|
||||
|
@ -10,34 +10,28 @@ import com.intellectualcrafters.configuration.ConfigurationSection;
|
||||
import com.intellectualcrafters.configuration.serialization.ConfigurationSerializable;
|
||||
import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization;
|
||||
|
||||
public class YamlRepresenter extends Representer
|
||||
{
|
||||
|
||||
public YamlRepresenter()
|
||||
{
|
||||
public class YamlRepresenter extends Representer {
|
||||
|
||||
public YamlRepresenter() {
|
||||
multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
|
||||
multiRepresenters.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
|
||||
}
|
||||
|
||||
private class RepresentConfigurationSection extends RepresentMap
|
||||
{
|
||||
|
||||
private class RepresentConfigurationSection extends RepresentMap {
|
||||
@Override
|
||||
public Node representData(final Object data)
|
||||
{
|
||||
public Node representData(final Object data) {
|
||||
return super.representData(((ConfigurationSection) data).getValues(false));
|
||||
}
|
||||
}
|
||||
|
||||
private class RepresentConfigurationSerializable extends RepresentMap
|
||||
{
|
||||
|
||||
private class RepresentConfigurationSerializable extends RepresentMap {
|
||||
@Override
|
||||
public Node representData(final Object data)
|
||||
{
|
||||
public Node representData(final Object data) {
|
||||
final ConfigurationSerializable serializable = (ConfigurationSerializable) data;
|
||||
final Map<String, Object> values = new LinkedHashMap<String, Object>();
|
||||
values.put(ConfigurationSerialization.SERIALIZED_TYPE_KEY, ConfigurationSerialization.getAlias(serializable.getClass()));
|
||||
values.putAll(serializable.serialize());
|
||||
|
||||
|
||||
return super.representData(values);
|
||||
}
|
||||
}
|
||||
|
@ -21,9 +21,8 @@ import java.util.Map;
|
||||
* @see DelegateDeserialization
|
||||
* @see SerializableAs
|
||||
*/
|
||||
public interface ConfigurationSerializable
|
||||
{
|
||||
|
||||
public interface ConfigurationSerializable {
|
||||
|
||||
/**
|
||||
* Creates a Map representation of this class.
|
||||
* <p>
|
||||
|
@ -14,137 +14,107 @@ import com.intellectualcrafters.configuration.Configuration;
|
||||
/**
|
||||
* Utility class for storing and retrieving classes for {@link Configuration}.
|
||||
*/
|
||||
public class ConfigurationSerialization
|
||||
{
|
||||
public class ConfigurationSerialization {
|
||||
public static final String SERIALIZED_TYPE_KEY = "==";
|
||||
private final Class<? extends ConfigurationSerializable> clazz;
|
||||
private static Map<String, Class<? extends ConfigurationSerializable>> aliases = new HashMap<String, Class<? extends ConfigurationSerializable>>();
|
||||
|
||||
protected ConfigurationSerialization(final Class<? extends ConfigurationSerializable> clazz)
|
||||
{
|
||||
|
||||
protected ConfigurationSerialization(final Class<? extends ConfigurationSerializable> clazz) {
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
protected Method getMethod(final String name, final boolean isStatic)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
protected Method getMethod(final String name, final boolean isStatic) {
|
||||
try {
|
||||
final Method method = clazz.getDeclaredMethod(name, Map.class);
|
||||
|
||||
if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) { return null; }
|
||||
if (Modifier.isStatic(method.getModifiers()) != isStatic) { return null; }
|
||||
|
||||
|
||||
if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) {
|
||||
return null;
|
||||
}
|
||||
if (Modifier.isStatic(method.getModifiers()) != isStatic) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return method;
|
||||
}
|
||||
catch (final NoSuchMethodException ex)
|
||||
{
|
||||
} catch (final NoSuchMethodException ex) {
|
||||
return null;
|
||||
}
|
||||
catch (final SecurityException ex)
|
||||
{
|
||||
} catch (final SecurityException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected Constructor<? extends ConfigurationSerializable> getConstructor()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
protected Constructor<? extends ConfigurationSerializable> getConstructor() {
|
||||
try {
|
||||
return clazz.getConstructor(Map.class);
|
||||
}
|
||||
catch (final NoSuchMethodException ex)
|
||||
{
|
||||
} catch (final NoSuchMethodException ex) {
|
||||
return null;
|
||||
}
|
||||
catch (final SecurityException ex)
|
||||
{
|
||||
} catch (final SecurityException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected ConfigurationSerializable deserializeViaMethod(final Method method, final Map<String, ?> args)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
protected ConfigurationSerializable deserializeViaMethod(final Method method, final Map<String, ?> args) {
|
||||
try {
|
||||
final ConfigurationSerializable result = (ConfigurationSerializable) method.invoke(null, args);
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
|
||||
if (result == null) {
|
||||
Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE,
|
||||
"Could not call method '" + method.toString() + "' of " + clazz + " for deserialization: method returned null");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
catch (final Throwable ex)
|
||||
{
|
||||
Logger.getLogger(ConfigurationSerialization.class.getName()).log(
|
||||
Level.SEVERE,
|
||||
"Could not call method '" + method.toString() + "' of " + clazz + " for deserialization",
|
||||
} catch (final Throwable ex) {
|
||||
Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, "Could not call method '" + method.toString() + "' of " + clazz + " for deserialization",
|
||||
ex instanceof InvocationTargetException ? ex.getCause() : ex);
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected ConfigurationSerializable deserializeViaCtor(final Constructor<? extends ConfigurationSerializable> ctor, final Map<String, ?> args)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
protected ConfigurationSerializable deserializeViaCtor(final Constructor<? extends ConfigurationSerializable> ctor, final Map<String, ?> args) {
|
||||
try {
|
||||
return ctor.newInstance(args);
|
||||
}
|
||||
catch (final Throwable ex)
|
||||
{
|
||||
Logger.getLogger(ConfigurationSerialization.class.getName()).log(
|
||||
Level.SEVERE,
|
||||
"Could not call constructor '" + ctor.toString() + "' of " + clazz + " for deserialization",
|
||||
} catch (final Throwable ex) {
|
||||
Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, "Could not call constructor '" + ctor.toString() + "' of " + clazz + " for deserialization",
|
||||
ex instanceof InvocationTargetException ? ex.getCause() : ex);
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public ConfigurationSerializable deserialize(final Map<String, ?> args)
|
||||
{
|
||||
if (args == null) { throw new NullPointerException("Args must not be null"); }
|
||||
|
||||
public ConfigurationSerializable deserialize(final Map<String, ?> args) {
|
||||
if (args == null) {
|
||||
throw new NullPointerException("Args must not be null");
|
||||
}
|
||||
ConfigurationSerializable result = null;
|
||||
Method method = null;
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
|
||||
if (result == null) {
|
||||
method = getMethod("deserialize", true);
|
||||
|
||||
if (method != null)
|
||||
{
|
||||
|
||||
if (method != null) {
|
||||
result = deserializeViaMethod(method, args);
|
||||
}
|
||||
}
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
|
||||
if (result == null) {
|
||||
method = getMethod("valueOf", true);
|
||||
|
||||
if (method != null)
|
||||
{
|
||||
|
||||
if (method != null) {
|
||||
result = deserializeViaMethod(method, args);
|
||||
}
|
||||
}
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
|
||||
if (result == null) {
|
||||
final Constructor<? extends ConfigurationSerializable> constructor = getConstructor();
|
||||
|
||||
if (constructor != null)
|
||||
{
|
||||
|
||||
if (constructor != null) {
|
||||
result = deserializeViaCtor(constructor, args);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to deserialize the given arguments into a new instance of the
|
||||
* given class.
|
||||
@ -160,11 +130,10 @@ public class ConfigurationSerialization
|
||||
* @param clazz Class to deserialize into
|
||||
* @return New instance of the specified class
|
||||
*/
|
||||
public static ConfigurationSerializable deserializeObject(final Map<String, ?> args, final Class<? extends ConfigurationSerializable> clazz)
|
||||
{
|
||||
public static ConfigurationSerializable deserializeObject(final Map<String, ?> args, final Class<? extends ConfigurationSerializable> clazz) {
|
||||
return new ConfigurationSerialization(clazz).deserialize(args);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to deserialize the given arguments into a new instance of the
|
||||
* given class.
|
||||
@ -179,51 +148,46 @@ public class ConfigurationSerialization
|
||||
* @param args Arguments for deserialization
|
||||
* @return New instance of the specified class
|
||||
*/
|
||||
public static ConfigurationSerializable deserializeObject(final Map<String, ?> args)
|
||||
{
|
||||
public static ConfigurationSerializable deserializeObject(final Map<String, ?> args) {
|
||||
Class<? extends ConfigurationSerializable> clazz = null;
|
||||
|
||||
if (args.containsKey(SERIALIZED_TYPE_KEY))
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
if (args.containsKey(SERIALIZED_TYPE_KEY)) {
|
||||
try {
|
||||
final String alias = (String) args.get(SERIALIZED_TYPE_KEY);
|
||||
|
||||
if (alias == null) { throw new IllegalArgumentException("Cannot have null alias"); }
|
||||
|
||||
if (alias == null) {
|
||||
throw new IllegalArgumentException("Cannot have null alias");
|
||||
}
|
||||
clazz = getClassByAlias(alias);
|
||||
if (clazz == null) { throw new IllegalArgumentException("Specified class does not exist ('" + alias + "')"); }
|
||||
}
|
||||
catch (final ClassCastException ex)
|
||||
{
|
||||
if (clazz == null) {
|
||||
throw new IllegalArgumentException("Specified class does not exist ('" + alias + "')");
|
||||
}
|
||||
} catch (final ClassCastException ex) {
|
||||
ex.fillInStackTrace();
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw new IllegalArgumentException("Args doesn't contain type key ('" + SERIALIZED_TYPE_KEY + "')");
|
||||
}
|
||||
|
||||
|
||||
return new ConfigurationSerialization(clazz).deserialize(args);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Registers the given {@link ConfigurationSerializable} class by its
|
||||
* alias
|
||||
*
|
||||
* @param clazz Class to register
|
||||
*/
|
||||
public static void registerClass(final Class<? extends ConfigurationSerializable> clazz)
|
||||
{
|
||||
public static void registerClass(final Class<? extends ConfigurationSerializable> clazz) {
|
||||
final DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
|
||||
|
||||
if (delegate == null)
|
||||
{
|
||||
|
||||
if (delegate == null) {
|
||||
registerClass(clazz, getAlias(clazz));
|
||||
registerClass(clazz, clazz.getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Registers the given alias to the specified {@link
|
||||
* ConfigurationSerializable} class
|
||||
@ -232,33 +196,29 @@ public class ConfigurationSerialization
|
||||
* @param alias Alias to register as
|
||||
* @see SerializableAs
|
||||
*/
|
||||
public static void registerClass(final Class<? extends ConfigurationSerializable> clazz, final String alias)
|
||||
{
|
||||
public static void registerClass(final Class<? extends ConfigurationSerializable> clazz, final String alias) {
|
||||
aliases.put(alias, clazz);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unregisters the specified alias to a {@link ConfigurationSerializable}
|
||||
*
|
||||
* @param alias Alias to unregister
|
||||
*/
|
||||
public static void unregisterClass(final String alias)
|
||||
{
|
||||
public static void unregisterClass(final String alias) {
|
||||
aliases.remove(alias);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unregisters any aliases for the specified {@link
|
||||
* ConfigurationSerializable} class
|
||||
*
|
||||
* @param clazz Class to unregister
|
||||
*/
|
||||
public static void unregisterClass(final Class<? extends ConfigurationSerializable> clazz)
|
||||
{
|
||||
while (aliases.values().remove(clazz))
|
||||
{}
|
||||
public static void unregisterClass(final Class<? extends ConfigurationSerializable> clazz) {
|
||||
while (aliases.values().remove(clazz)) {}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to get a registered {@link ConfigurationSerializable} class by
|
||||
* its alias
|
||||
@ -266,11 +226,10 @@ public class ConfigurationSerialization
|
||||
* @param alias Alias of the serializable
|
||||
* @return Registered class, or null if not found
|
||||
*/
|
||||
public static Class<? extends ConfigurationSerializable> getClassByAlias(final String alias)
|
||||
{
|
||||
public static Class<? extends ConfigurationSerializable> getClassByAlias(final String alias) {
|
||||
return aliases.get(alias);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the correct alias for the given {@link ConfigurationSerializable}
|
||||
* class
|
||||
@ -278,29 +237,25 @@ public class ConfigurationSerialization
|
||||
* @param clazz Class to get alias for
|
||||
* @return Alias to use for the class
|
||||
*/
|
||||
public static String getAlias(final Class<? extends ConfigurationSerializable> clazz)
|
||||
{
|
||||
public static String getAlias(final Class<? extends ConfigurationSerializable> clazz) {
|
||||
DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
|
||||
|
||||
if (delegate != null)
|
||||
{
|
||||
if ((delegate.value() == null) || (delegate.value() == clazz))
|
||||
{
|
||||
|
||||
if (delegate != null) {
|
||||
if ((delegate.value() == null) || (delegate.value() == clazz)) {
|
||||
delegate = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return getAlias(delegate.value());
|
||||
}
|
||||
}
|
||||
|
||||
if (delegate == null)
|
||||
{
|
||||
|
||||
if (delegate == null) {
|
||||
final SerializableAs alias = clazz.getAnnotation(SerializableAs.class);
|
||||
|
||||
if ((alias != null) && (alias.value() != null)) { return alias.value(); }
|
||||
|
||||
if ((alias != null) && (alias.value() != null)) {
|
||||
return alias.value();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return clazz.getName();
|
||||
}
|
||||
}
|
||||
|
@ -11,8 +11,7 @@ import java.lang.annotation.Target;
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface DelegateDeserialization
|
||||
{
|
||||
public @interface DelegateDeserialization {
|
||||
/**
|
||||
* Which class should be used as a delegate for this classes
|
||||
* deserialization
|
||||
|
@ -21,8 +21,7 @@ import java.lang.annotation.Target;
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface SerializableAs
|
||||
{
|
||||
public @interface SerializableAs {
|
||||
/**
|
||||
* This is the name your class will be stored and retrieved as.
|
||||
* <p>
|
||||
|
@ -3,56 +3,48 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Byte_Array} tag.
|
||||
*/
|
||||
public final class ByteArrayTag extends Tag
|
||||
{
|
||||
public final class ByteArrayTag extends Tag {
|
||||
private final byte[] value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ByteArrayTag(final byte[] value)
|
||||
{
|
||||
public ByteArrayTag(final byte[] value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ByteArrayTag(final String name, final byte[] value)
|
||||
{
|
||||
public ByteArrayTag(final String name, final byte[] value) {
|
||||
super(name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public byte[] getValue()
|
||||
{
|
||||
public byte[] getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final StringBuilder hex = new StringBuilder();
|
||||
for (final byte b : value)
|
||||
{
|
||||
for (final byte b : value) {
|
||||
final String hexDigits = Integer.toHexString(b).toUpperCase();
|
||||
if (hexDigits.length() == 1)
|
||||
{
|
||||
if (hexDigits.length() == 1) {
|
||||
hex.append("0");
|
||||
}
|
||||
hex.append(hexDigits).append(" ");
|
||||
}
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Byte_Array" + append + ": " + hex;
|
||||
|
@ -3,46 +3,40 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Byte} tag.
|
||||
*/
|
||||
public final class ByteTag extends Tag
|
||||
{
|
||||
public final class ByteTag extends Tag {
|
||||
private final byte value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ByteTag(final byte value)
|
||||
{
|
||||
public ByteTag(final byte value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ByteTag(final String name, final byte value)
|
||||
{
|
||||
public ByteTag(final String name, final byte value) {
|
||||
super(name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Byte getValue()
|
||||
{
|
||||
public Byte getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Byte" + append + ": " + value;
|
||||
|
@ -8,33 +8,30 @@ import java.util.Map;
|
||||
/**
|
||||
* The {@code TAG_Compound} tag.
|
||||
*/
|
||||
public final class CompoundTag extends Tag
|
||||
{
|
||||
public final class CompoundTag extends Tag {
|
||||
private final Map<String, Tag> value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public CompoundTag(final Map<String, Tag> value)
|
||||
{
|
||||
public CompoundTag(final Map<String, Tag> value) {
|
||||
super();
|
||||
this.value = Collections.unmodifiableMap(value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public CompoundTag(final String name, final Map<String, Tag> value)
|
||||
{
|
||||
public CompoundTag(final String name, final Map<String, Tag> value) {
|
||||
super(name);
|
||||
this.value = Collections.unmodifiableMap(value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether this compound tag contains the given key.
|
||||
*
|
||||
@ -42,17 +39,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return true if the tag contains the given key
|
||||
*/
|
||||
public boolean containsKey(final String key)
|
||||
{
|
||||
public boolean containsKey(final String key) {
|
||||
return value.containsKey(key);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Map<String, Tag> getValue()
|
||||
{
|
||||
public Map<String, Tag> getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return a new compound tag with the given values.
|
||||
*
|
||||
@ -60,21 +55,19 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return the new compound tag
|
||||
*/
|
||||
public CompoundTag setValue(final Map<String, Tag> value)
|
||||
{
|
||||
public CompoundTag setValue(final Map<String, Tag> value) {
|
||||
return new CompoundTag(getName(), value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a compound tag builder.
|
||||
*
|
||||
* @return the builder
|
||||
*/
|
||||
public CompoundTagBuilder createBuilder()
|
||||
{
|
||||
public CompoundTagBuilder createBuilder() {
|
||||
return new CompoundTagBuilder(new HashMap<String, Tag>(value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a byte array named with the given key. <p> If the key does not exist or its value is not a byte array
|
||||
* tag, then an empty byte array will be returned. </p>
|
||||
@ -83,19 +76,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a byte array
|
||||
*/
|
||||
public byte[] getByteArray(final String key)
|
||||
{
|
||||
public byte[] getByteArray(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteArrayTag)
|
||||
{
|
||||
if (tag instanceof ByteArrayTag) {
|
||||
return ((ByteArrayTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new byte[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a byte named with the given key. <p> If the key does not exist or its value is not a byte tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -104,19 +93,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a byte
|
||||
*/
|
||||
public byte getByte(final String key)
|
||||
{
|
||||
public byte getByte(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return (byte) 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a double named with the given key. <p> If the key does not exist or its value is not a double tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -125,19 +110,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double getDouble(final String key)
|
||||
{
|
||||
public double getDouble(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof DoubleTag)
|
||||
{
|
||||
if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a double named with the given key, even if it's another type of number. <p> If the key does not exist or
|
||||
* its value is not a number, then {@code 0} will be returned. </p>
|
||||
@ -146,39 +127,25 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double asDouble(final String key)
|
||||
{
|
||||
public double asDouble(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
} else if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
} else if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
} else if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
} else if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a float named with the given key. <p> If the key does not exist or its value is not a float tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -187,19 +154,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a float
|
||||
*/
|
||||
public float getFloat(final String key)
|
||||
{
|
||||
public float getFloat(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof FloatTag)
|
||||
{
|
||||
if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a {@code int[]} named with the given key. <p> If the key does not exist or its value is not an int array
|
||||
* tag, then an empty array will be returned. </p>
|
||||
@ -208,19 +171,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return an int array
|
||||
*/
|
||||
public int[] getIntArray(final String key)
|
||||
{
|
||||
public int[] getIntArray(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof IntArrayTag)
|
||||
{
|
||||
if (tag instanceof IntArrayTag) {
|
||||
return ((IntArrayTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new int[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get an int named with the given key. <p> If the key does not exist or its value is not an int tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -229,19 +188,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int getInt(final String key)
|
||||
{
|
||||
public int getInt(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof IntTag)
|
||||
{
|
||||
if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get an int named with the given key, even if it's another type of number. <p> If the key does not exist or
|
||||
* its value is not a number, then {@code 0} will be returned. </p>
|
||||
@ -250,39 +205,25 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int asInt(final String key)
|
||||
{
|
||||
public int asInt(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
} else if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
} else if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
} else if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue().intValue();
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
} else if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue().intValue();
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue().intValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a list of tags named with the given key. <p> If the key does not exist or its value is not a list tag,
|
||||
* then an empty list will be returned. </p>
|
||||
@ -291,19 +232,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a list of tags
|
||||
*/
|
||||
public List<Tag> getList(final String key)
|
||||
{
|
||||
public List<Tag> getList(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
if (tag instanceof ListTag) {
|
||||
return ((ListTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a {@code TagList} named with the given key. <p> If the key does not exist or its value is not a list
|
||||
* tag, then an empty tag list will be returned. </p>
|
||||
@ -312,19 +249,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a tag list instance
|
||||
*/
|
||||
public ListTag getListTag(final String key)
|
||||
{
|
||||
public ListTag getListTag(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
if (tag instanceof ListTag) {
|
||||
return (ListTag) tag;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new ListTag(key, StringTag.class, Collections.<Tag> emptyList());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a list of tags named with the given key. <p> If the key does not exist or its value is not a list tag,
|
||||
* then an empty list will be returned. If the given key references a list but the list of of a different type, then
|
||||
@ -337,27 +270,20 @@ public final class CompoundTag extends Tag
|
||||
* @return a list of tags
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Tag> List<T> getList(final String key, final Class<T> listType)
|
||||
{
|
||||
public <T extends Tag> List<T> getList(final String key, final Class<T> listType) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
if (tag instanceof ListTag) {
|
||||
final ListTag listTag = (ListTag) tag;
|
||||
if (listTag.getType().equals(listType))
|
||||
{
|
||||
if (listTag.getType().equals(listType)) {
|
||||
return (List<T>) listTag.getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a long named with the given key. <p> If the key does not exist or its value is not a long tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -366,19 +292,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long getLong(final String key)
|
||||
{
|
||||
public long getLong(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof LongTag)
|
||||
{
|
||||
if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a long named with the given key, even if it's another type of number. <p> If the key does not exist or
|
||||
* its value is not a number, then {@code 0} will be returned. </p>
|
||||
@ -387,39 +309,25 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long asLong(final String key)
|
||||
{
|
||||
public long asLong(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
} else if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
} else if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
} else if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
} else if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue().longValue();
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue().longValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a short named with the given key. <p> If the key does not exist or its value is not a short tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -428,19 +336,15 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a short
|
||||
*/
|
||||
public short getShort(final String key)
|
||||
{
|
||||
public short getShort(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ShortTag)
|
||||
{
|
||||
if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a string named with the given key. <p> If the key does not exist or its value is not a string tag, then
|
||||
* {@code ""} will be returned. </p>
|
||||
@ -449,32 +353,25 @@ public final class CompoundTag extends Tag
|
||||
*
|
||||
* @return a string
|
||||
*/
|
||||
public String getString(final String key)
|
||||
{
|
||||
public String getString(final String key) {
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof StringTag)
|
||||
{
|
||||
if (tag instanceof StringTag) {
|
||||
return ((StringTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
final StringBuilder bldr = new StringBuilder();
|
||||
bldr.append("TAG_Compound").append(append).append(": ").append(value.size()).append(" entries\r\n{\r\n");
|
||||
for (final Map.Entry<String, Tag> entry : value.entrySet())
|
||||
{
|
||||
for (final Map.Entry<String, Tag> entry : value.entrySet()) {
|
||||
bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")).append("\r\n");
|
||||
}
|
||||
bldr.append("}");
|
||||
|
@ -8,39 +8,35 @@ import java.util.Map;
|
||||
/**
|
||||
* Helps create compound tags.
|
||||
*/
|
||||
public class CompoundTagBuilder
|
||||
{
|
||||
public class CompoundTagBuilder {
|
||||
private final Map<String, Tag> entries;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new instance.
|
||||
*/
|
||||
CompoundTagBuilder()
|
||||
{
|
||||
CompoundTagBuilder() {
|
||||
entries = new HashMap<String, Tag>();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new instance and use the given map (which will be modified).
|
||||
*
|
||||
* @param value the value
|
||||
*/
|
||||
CompoundTagBuilder(final Map<String, Tag> value)
|
||||
{
|
||||
CompoundTagBuilder(final Map<String, Tag> value) {
|
||||
checkNotNull(value);
|
||||
entries = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new builder instance.
|
||||
*
|
||||
* @return a new builder
|
||||
*/
|
||||
public static CompoundTagBuilder create()
|
||||
{
|
||||
public static CompoundTagBuilder create() {
|
||||
return new CompoundTagBuilder();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and tag into the compound tag.
|
||||
*
|
||||
@ -49,14 +45,13 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder put(final String key, final Tag value)
|
||||
{
|
||||
public CompoundTagBuilder put(final String key, final Tag value) {
|
||||
checkNotNull(key);
|
||||
checkNotNull(value);
|
||||
entries.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code ByteArrayTag}.
|
||||
*
|
||||
@ -65,11 +60,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putByteArray(final String key, final byte[] value)
|
||||
{
|
||||
public CompoundTagBuilder putByteArray(final String key, final byte[] value) {
|
||||
return put(key, new ByteArrayTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code ByteTag}.
|
||||
*
|
||||
@ -78,11 +72,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putByte(final String key, final byte value)
|
||||
{
|
||||
public CompoundTagBuilder putByte(final String key, final byte value) {
|
||||
return put(key, new ByteTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code DoubleTag}.
|
||||
*
|
||||
@ -91,11 +84,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putDouble(final String key, final double value)
|
||||
{
|
||||
public CompoundTagBuilder putDouble(final String key, final double value) {
|
||||
return put(key, new DoubleTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code FloatTag}.
|
||||
*
|
||||
@ -104,11 +96,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putFloat(final String key, final float value)
|
||||
{
|
||||
public CompoundTagBuilder putFloat(final String key, final float value) {
|
||||
return put(key, new FloatTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code IntArrayTag}.
|
||||
*
|
||||
@ -117,11 +108,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putIntArray(final String key, final int[] value)
|
||||
{
|
||||
public CompoundTagBuilder putIntArray(final String key, final int[] value) {
|
||||
return put(key, new IntArrayTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as an {@code IntTag}.
|
||||
*
|
||||
@ -130,11 +120,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putInt(final String key, final int value)
|
||||
{
|
||||
public CompoundTagBuilder putInt(final String key, final int value) {
|
||||
return put(key, new IntTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code LongTag}.
|
||||
*
|
||||
@ -143,11 +132,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putLong(final String key, final long value)
|
||||
{
|
||||
public CompoundTagBuilder putLong(final String key, final long value) {
|
||||
return put(key, new LongTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code ShortTag}.
|
||||
*
|
||||
@ -156,11 +144,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putShort(final String key, final short value)
|
||||
{
|
||||
public CompoundTagBuilder putShort(final String key, final short value) {
|
||||
return put(key, new ShortTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put the given key and value into the compound tag as a {@code StringTag}.
|
||||
*
|
||||
@ -169,11 +156,10 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putString(final String key, final String value)
|
||||
{
|
||||
public CompoundTagBuilder putString(final String key, final String value) {
|
||||
return put(key, new StringTag(key, value));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put all the entries from the given map into this map.
|
||||
*
|
||||
@ -181,26 +167,23 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putAll(final Map<String, ? extends Tag> value)
|
||||
{
|
||||
public CompoundTagBuilder putAll(final Map<String, ? extends Tag> value) {
|
||||
checkNotNull(value);
|
||||
for (final Map.Entry<String, ? extends Tag> entry : value.entrySet())
|
||||
{
|
||||
for (final Map.Entry<String, ? extends Tag> entry : value.entrySet()) {
|
||||
put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build an unnamed compound tag with this builder's entries.
|
||||
*
|
||||
* @return the new compound tag
|
||||
*/
|
||||
public CompoundTag build()
|
||||
{
|
||||
public CompoundTag build() {
|
||||
return new CompoundTag(new HashMap<String, Tag>(entries));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build a new compound tag with this builder's entries.
|
||||
*
|
||||
@ -208,8 +191,7 @@ public class CompoundTagBuilder
|
||||
*
|
||||
* @return the created compound tag
|
||||
*/
|
||||
public CompoundTag build(final String name)
|
||||
{
|
||||
public CompoundTag build(final String name) {
|
||||
return new CompoundTag(name, new HashMap<String, Tag>(entries));
|
||||
}
|
||||
}
|
||||
|
@ -3,46 +3,40 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Double} tag.
|
||||
*/
|
||||
public final class DoubleTag extends Tag
|
||||
{
|
||||
public final class DoubleTag extends Tag {
|
||||
private final double value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public DoubleTag(final double value)
|
||||
{
|
||||
public DoubleTag(final double value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public DoubleTag(final String name, final double value)
|
||||
{
|
||||
public DoubleTag(final String name, final double value) {
|
||||
super(name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Double getValue()
|
||||
{
|
||||
public Double getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Double" + append + ": " + value;
|
||||
|
@ -3,25 +3,21 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_End} tag.
|
||||
*/
|
||||
public final class EndTag extends Tag
|
||||
{
|
||||
public final class EndTag extends Tag {
|
||||
/**
|
||||
* Creates the tag.
|
||||
*/
|
||||
public EndTag()
|
||||
{
|
||||
public EndTag() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Object getValue()
|
||||
{
|
||||
public Object getValue() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
return "TAG_End";
|
||||
}
|
||||
}
|
||||
|
@ -3,46 +3,40 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Float} tag.
|
||||
*/
|
||||
public final class FloatTag extends Tag
|
||||
{
|
||||
public final class FloatTag extends Tag {
|
||||
private final float value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public FloatTag(final float value)
|
||||
{
|
||||
public FloatTag(final float value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public FloatTag(final String name, final float value)
|
||||
{
|
||||
public FloatTag(final String name, final float value) {
|
||||
super(name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Float getValue()
|
||||
{
|
||||
public Float getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Float" + append + ": " + value;
|
||||
|
@ -5,58 +5,50 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||
/**
|
||||
* The {@code TAG_Int_Array} tag.
|
||||
*/
|
||||
public final class IntArrayTag extends Tag
|
||||
{
|
||||
public final class IntArrayTag extends Tag {
|
||||
private final int[] value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public IntArrayTag(final int[] value)
|
||||
{
|
||||
public IntArrayTag(final int[] value) {
|
||||
super();
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public IntArrayTag(final String name, final int[] value)
|
||||
{
|
||||
public IntArrayTag(final String name, final int[] value) {
|
||||
super(name);
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int[] getValue()
|
||||
{
|
||||
public int[] getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final StringBuilder hex = new StringBuilder();
|
||||
for (final int b : value)
|
||||
{
|
||||
for (final int b : value) {
|
||||
final String hexDigits = Integer.toHexString(b).toUpperCase();
|
||||
if (hexDigits.length() == 1)
|
||||
{
|
||||
if (hexDigits.length() == 1) {
|
||||
hex.append("0");
|
||||
}
|
||||
hex.append(hexDigits).append(" ");
|
||||
}
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Int_Array" + append + ": " + hex;
|
||||
|
@ -3,46 +3,40 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Int} tag.
|
||||
*/
|
||||
public final class IntTag extends Tag
|
||||
{
|
||||
public final class IntTag extends Tag {
|
||||
private final int value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public IntTag(final int value)
|
||||
{
|
||||
public IntTag(final int value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public IntTag(final String name, final int value)
|
||||
{
|
||||
public IntTag(final String name, final int value) {
|
||||
super(name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Integer getValue()
|
||||
{
|
||||
public Integer getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Int" + append + ": " + value;
|
||||
|
@ -9,25 +9,23 @@ import java.util.NoSuchElementException;
|
||||
/**
|
||||
* The {@code TAG_List} tag.
|
||||
*/
|
||||
public final class ListTag extends Tag
|
||||
{
|
||||
public final class ListTag extends Tag {
|
||||
private final Class<? extends Tag> type;
|
||||
private final List<Tag> value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param type the type of tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ListTag(final Class<? extends Tag> type, final List<? extends Tag> value)
|
||||
{
|
||||
public ListTag(final Class<? extends Tag> type, final List<? extends Tag> value) {
|
||||
super();
|
||||
checkNotNull(value);
|
||||
this.type = type;
|
||||
this.value = Collections.unmodifiableList(value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
@ -35,30 +33,27 @@ public final class ListTag extends Tag
|
||||
* @param type the type of tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ListTag(final String name, final Class<? extends Tag> type, final List<? extends Tag> value)
|
||||
{
|
||||
public ListTag(final String name, final Class<? extends Tag> type, final List<? extends Tag> value) {
|
||||
super(name);
|
||||
checkNotNull(value);
|
||||
this.type = type;
|
||||
this.value = Collections.unmodifiableList(value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the type of item in this list.
|
||||
*
|
||||
* @return The type of item in this list.
|
||||
*/
|
||||
public Class<? extends Tag> getType()
|
||||
{
|
||||
public Class<? extends Tag> getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<Tag> getValue()
|
||||
{
|
||||
public List<Tag> getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new list tag with this tag's name and type.
|
||||
*
|
||||
@ -66,11 +61,10 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a new list tag
|
||||
*/
|
||||
public ListTag setValue(final List<Tag> list)
|
||||
{
|
||||
public ListTag setValue(final List<Tag> list) {
|
||||
return new ListTag(getName(), getType(), list);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the tag if it exists at the given index.
|
||||
*
|
||||
@ -78,18 +72,14 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return the tag or null
|
||||
*/
|
||||
public Tag getIfExists(final int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
public Tag getIfExists(final int index) {
|
||||
try {
|
||||
return value.get(index);
|
||||
}
|
||||
catch (final NoSuchElementException e)
|
||||
{
|
||||
} catch (final NoSuchElementException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a byte array named with the given index. <p> If the index does not exist or its value is not a byte
|
||||
* array tag, then an empty byte array will be returned. </p>
|
||||
@ -98,19 +88,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a byte array
|
||||
*/
|
||||
public byte[] getByteArray(final int index)
|
||||
{
|
||||
public byte[] getByteArray(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteArrayTag)
|
||||
{
|
||||
if (tag instanceof ByteArrayTag) {
|
||||
return ((ByteArrayTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new byte[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a byte named with the given index. <p> If the index does not exist or its value is not a byte tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -119,19 +105,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a byte
|
||||
*/
|
||||
public byte getByte(final int index)
|
||||
{
|
||||
public byte getByte(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return (byte) 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a double named with the given index. <p> If the index does not exist or its value is not a double tag,
|
||||
* then {@code 0} will be returned. </p>
|
||||
@ -140,19 +122,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double getDouble(final int index)
|
||||
{
|
||||
public double getDouble(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof DoubleTag)
|
||||
{
|
||||
if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a double named with the given index, even if it's another type of number. <p> If the index does not
|
||||
* exist or its value is not a number, then {@code 0} will be returned. </p>
|
||||
@ -161,39 +139,25 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double asDouble(final int index)
|
||||
{
|
||||
public double asDouble(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
} else if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
} else if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
} else if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
} else if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a float named with the given index. <p> If the index does not exist or its value is not a float tag,
|
||||
* then {@code 0} will be returned. </p>
|
||||
@ -202,19 +166,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a float
|
||||
*/
|
||||
public float getFloat(final int index)
|
||||
{
|
||||
public float getFloat(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof FloatTag)
|
||||
{
|
||||
if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a {@code int[]} named with the given index. <p> If the index does not exist or its value is not an int
|
||||
* array tag, then an empty array will be returned. </p>
|
||||
@ -223,19 +183,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return an int array
|
||||
*/
|
||||
public int[] getIntArray(final int index)
|
||||
{
|
||||
public int[] getIntArray(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof IntArrayTag)
|
||||
{
|
||||
if (tag instanceof IntArrayTag) {
|
||||
return ((IntArrayTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new int[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get an int named with the given index. <p> If the index does not exist or its value is not an int tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -244,19 +200,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int getInt(final int index)
|
||||
{
|
||||
public int getInt(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof IntTag)
|
||||
{
|
||||
if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get an int named with the given index, even if it's another type of number. <p> If the index does not exist
|
||||
* or its value is not a number, then {@code 0} will be returned. </p>
|
||||
@ -265,39 +217,25 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int asInt(final int index)
|
||||
{
|
||||
public int asInt(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
} else if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
} else if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
} else if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue().intValue();
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
} else if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue().intValue();
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue().intValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a list of tags named with the given index. <p> If the index does not exist or its value is not a list
|
||||
* tag, then an empty list will be returned. </p>
|
||||
@ -306,19 +244,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a list of tags
|
||||
*/
|
||||
public List<Tag> getList(final int index)
|
||||
{
|
||||
public List<Tag> getList(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
if (tag instanceof ListTag) {
|
||||
return ((ListTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a {@code TagList} named with the given index. <p> If the index does not exist or its value is not a list
|
||||
* tag, then an empty tag list will be returned. </p>
|
||||
@ -327,19 +261,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a tag list instance
|
||||
*/
|
||||
public ListTag getListTag(final int index)
|
||||
{
|
||||
public ListTag getListTag(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
if (tag instanceof ListTag) {
|
||||
return (ListTag) tag;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new ListTag(StringTag.class, Collections.<Tag> emptyList());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a list of tags named with the given index. <p> If the index does not exist or its value is not a list
|
||||
* tag, then an empty list will be returned. If the given index references a list but the list of of a different
|
||||
@ -352,27 +282,20 @@ public final class ListTag extends Tag
|
||||
* @return a list of tags
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Tag> List<T> getList(final int index, final Class<T> listType)
|
||||
{
|
||||
public <T extends Tag> List<T> getList(final int index, final Class<T> listType) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
if (tag instanceof ListTag) {
|
||||
final ListTag listTag = (ListTag) tag;
|
||||
if (listTag.getType().equals(listType))
|
||||
{
|
||||
if (listTag.getType().equals(listType)) {
|
||||
return (List<T>) listTag.getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a long named with the given index. <p> If the index does not exist or its value is not a long tag, then
|
||||
* {@code 0} will be returned. </p>
|
||||
@ -381,19 +304,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long getLong(final int index)
|
||||
{
|
||||
public long getLong(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof LongTag)
|
||||
{
|
||||
if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a long named with the given index, even if it's another type of number. <p> If the index does not exist
|
||||
* or its value is not a number, then {@code 0} will be returned. </p>
|
||||
@ -402,39 +321,25 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long asLong(final int index)
|
||||
{
|
||||
public long asLong(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
if (tag instanceof ByteTag) {
|
||||
return ((ByteTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
} else if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
} else if (tag instanceof IntTag) {
|
||||
return ((IntTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
} else if (tag instanceof LongTag) {
|
||||
return ((LongTag) tag).getValue();
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
} else if (tag instanceof FloatTag) {
|
||||
return ((FloatTag) tag).getValue().longValue();
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
return ((DoubleTag) tag).getValue().longValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a short named with the given index. <p> If the index does not exist or its value is not a short tag,
|
||||
* then {@code 0} will be returned. </p>
|
||||
@ -443,19 +348,15 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a short
|
||||
*/
|
||||
public short getShort(final int index)
|
||||
{
|
||||
public short getShort(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ShortTag)
|
||||
{
|
||||
if (tag instanceof ShortTag) {
|
||||
return ((ShortTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a string named with the given index. <p> If the index does not exist or its value is not a string tag,
|
||||
* then {@code ""} will be returned. </p>
|
||||
@ -464,32 +365,25 @@ public final class ListTag extends Tag
|
||||
*
|
||||
* @return a string
|
||||
*/
|
||||
public String getString(final int index)
|
||||
{
|
||||
public String getString(final int index) {
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof StringTag)
|
||||
{
|
||||
if (tag instanceof StringTag) {
|
||||
return ((StringTag) tag).getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
final StringBuilder bldr = new StringBuilder();
|
||||
bldr.append("TAG_List").append(append).append(": ").append(value.size()).append(" entries of type ").append(NBTUtils.getTypeName(type)).append("\r\n{\r\n");
|
||||
for (final Tag t : value)
|
||||
{
|
||||
for (final Tag t : value) {
|
||||
bldr.append(" ").append(t.toString().replaceAll("\r\n", "\r\n ")).append("\r\n");
|
||||
}
|
||||
bldr.append("}");
|
||||
|
@ -10,23 +10,21 @@ import java.util.List;
|
||||
/**
|
||||
* Helps create list tags.
|
||||
*/
|
||||
public class ListTagBuilder
|
||||
{
|
||||
public class ListTagBuilder {
|
||||
private final Class<? extends Tag> type;
|
||||
private final List<Tag> entries;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new instance.
|
||||
*
|
||||
* @param type of tag contained in this list
|
||||
*/
|
||||
ListTagBuilder(final Class<? extends Tag> type)
|
||||
{
|
||||
ListTagBuilder(final Class<? extends Tag> type) {
|
||||
checkNotNull(type);
|
||||
this.type = type;
|
||||
entries = new ArrayList<Tag>();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new builder instance.
|
||||
*
|
||||
@ -34,11 +32,10 @@ public class ListTagBuilder
|
||||
*
|
||||
* @return a new builder
|
||||
*/
|
||||
public static ListTagBuilder create(final Class<? extends Tag> type)
|
||||
{
|
||||
public static ListTagBuilder create(final Class<? extends Tag> type) {
|
||||
return new ListTagBuilder(type);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new builder instance.
|
||||
*
|
||||
@ -48,20 +45,22 @@ public class ListTagBuilder
|
||||
* @return a new builder
|
||||
*/
|
||||
@SafeVarargs
|
||||
public static <T extends Tag> ListTagBuilder createWith(final T... entries)
|
||||
{
|
||||
public static <T extends Tag> ListTagBuilder createWith(final T... entries) {
|
||||
checkNotNull(entries);
|
||||
if (entries.length == 0) { throw new IllegalArgumentException("This method needs an array of at least one entry"); }
|
||||
if (entries.length == 0) {
|
||||
throw new IllegalArgumentException("This method needs an array of at least one entry");
|
||||
}
|
||||
final Class<? extends Tag> type = entries[0].getClass();
|
||||
for (int i = 1; i < entries.length; i++)
|
||||
{
|
||||
if (!type.isInstance(entries[i])) { throw new IllegalArgumentException("An array of different tag types was provided"); }
|
||||
for (int i = 1; i < entries.length; i++) {
|
||||
if (!type.isInstance(entries[i])) {
|
||||
throw new IllegalArgumentException("An array of different tag types was provided");
|
||||
}
|
||||
}
|
||||
final ListTagBuilder builder = new ListTagBuilder(type);
|
||||
builder.addAll(Arrays.asList(entries));
|
||||
return builder;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add the given tag.
|
||||
*
|
||||
@ -69,14 +68,15 @@ public class ListTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public ListTagBuilder add(final Tag value)
|
||||
{
|
||||
public ListTagBuilder add(final Tag value) {
|
||||
checkNotNull(value);
|
||||
if (!type.isInstance(value)) { throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + type.getCanonicalName()); }
|
||||
if (!type.isInstance(value)) {
|
||||
throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + type.getCanonicalName());
|
||||
}
|
||||
entries.add(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add all the tags in the given list.
|
||||
*
|
||||
@ -84,26 +84,23 @@ public class ListTagBuilder
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public ListTagBuilder addAll(final Collection<? extends Tag> value)
|
||||
{
|
||||
public ListTagBuilder addAll(final Collection<? extends Tag> value) {
|
||||
checkNotNull(value);
|
||||
for (final Tag v : value)
|
||||
{
|
||||
for (final Tag v : value) {
|
||||
add(v);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build an unnamed list tag with this builder's entries.
|
||||
*
|
||||
* @return the new list tag
|
||||
*/
|
||||
public ListTag build()
|
||||
{
|
||||
public ListTag build() {
|
||||
return new ListTag(type, new ArrayList<Tag>(entries));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build a new list tag with this builder's entries.
|
||||
*
|
||||
@ -111,8 +108,7 @@ public class ListTagBuilder
|
||||
*
|
||||
* @return the created list tag
|
||||
*/
|
||||
public ListTag build(final String name)
|
||||
{
|
||||
public ListTag build(final String name) {
|
||||
return new ListTag(name, type, new ArrayList<Tag>(entries));
|
||||
}
|
||||
}
|
||||
|
@ -3,46 +3,40 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Long} tag.
|
||||
*/
|
||||
public final class LongTag extends Tag
|
||||
{
|
||||
public final class LongTag extends Tag {
|
||||
private final long value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public LongTag(final long value)
|
||||
{
|
||||
public LongTag(final long value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public LongTag(final String name, final long value)
|
||||
{
|
||||
public LongTag(final String name, final long value) {
|
||||
super(name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Long getValue()
|
||||
{
|
||||
public Long getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Long" + append + ": " + value;
|
||||
|
@ -25,18 +25,16 @@ import java.nio.charset.Charset;
|
||||
/**
|
||||
* A class which holds constant values.
|
||||
*/
|
||||
public final class NBTConstants
|
||||
{
|
||||
public final class NBTConstants {
|
||||
public static final Charset CHARSET = Charset.forName("UTF-8");
|
||||
public static final int TYPE_END = 0, TYPE_BYTE = 1, TYPE_SHORT = 2, TYPE_INT = 3, TYPE_LONG = 4, TYPE_FLOAT = 5, TYPE_DOUBLE = 6, TYPE_BYTE_ARRAY = 7, TYPE_STRING = 8, TYPE_LIST = 9,
|
||||
TYPE_COMPOUND = 10, TYPE_INT_ARRAY = 11;
|
||||
|
||||
|
||||
/**
|
||||
* Default private constructor.
|
||||
*/
|
||||
private NBTConstants()
|
||||
{}
|
||||
|
||||
private NBTConstants() {}
|
||||
|
||||
/**
|
||||
* Convert a type ID to its corresponding {@link Tag} class.
|
||||
*
|
||||
@ -46,10 +44,8 @@ public final class NBTConstants
|
||||
*
|
||||
* @throws IllegalArgumentException thrown if the tag ID is not valid
|
||||
*/
|
||||
public static Class<? extends Tag> getClassFromType(final int id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
public static Class<? extends Tag> getClassFromType(final int id) {
|
||||
switch (id) {
|
||||
case TYPE_END:
|
||||
return EndTag.class;
|
||||
case TYPE_BYTE:
|
||||
|
@ -14,12 +14,11 @@ import java.util.Map;
|
||||
* subclasses of the {@code Tag} object. The NBT format was created by Markus Persson, and the specification
|
||||
* may be found at @linktourl http://www.minecraft.net/docs/NBT.txt"> http://www.minecraft.net/docs/NBT.txt.
|
||||
*/
|
||||
public final class NBTInputStream implements Closeable
|
||||
{
|
||||
public final class NBTInputStream implements Closeable {
|
||||
private final DataInputStream is;
|
||||
|
||||
|
||||
private int count;
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@code NBTInputStream}, which will source its data from the specified input stream.
|
||||
*
|
||||
@ -27,11 +26,10 @@ public final class NBTInputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs
|
||||
*/
|
||||
public NBTInputStream(final InputStream is) throws IOException
|
||||
{
|
||||
public NBTInputStream(final InputStream is) throws IOException {
|
||||
this.is = new DataInputStream(is);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads an NBT tag from the stream.
|
||||
*
|
||||
@ -39,11 +37,10 @@ public final class NBTInputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
public Tag readTag() throws IOException
|
||||
{
|
||||
public Tag readTag() throws IOException {
|
||||
return readTag(0, Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads an NBT tag from the stream.
|
||||
*
|
||||
@ -51,11 +48,10 @@ public final class NBTInputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
public Tag readTag(final int maxDepth) throws IOException
|
||||
{
|
||||
public Tag readTag(final int maxDepth) throws IOException {
|
||||
return readTag(0, maxDepth);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads an NBT from the stream.
|
||||
*
|
||||
@ -65,25 +61,23 @@ public final class NBTInputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private Tag readTag(final int depth, final int maxDepth) throws IOException
|
||||
{
|
||||
if ((count++) > maxDepth) { throw new IOException("Exceeds max depth: " + count); }
|
||||
private Tag readTag(final int depth, final int maxDepth) throws IOException {
|
||||
if ((count++) > maxDepth) {
|
||||
throw new IOException("Exceeds max depth: " + count);
|
||||
}
|
||||
final int type = is.readByte() & 0xFF;
|
||||
String name;
|
||||
if (type != NBTConstants.TYPE_END)
|
||||
{
|
||||
if (type != NBTConstants.TYPE_END) {
|
||||
final int nameLength = is.readShort() & 0xFFFF;
|
||||
final byte[] nameBytes = new byte[nameLength];
|
||||
is.readFully(nameBytes);
|
||||
name = new String(nameBytes, NBTConstants.CHARSET);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
name = "";
|
||||
}
|
||||
return readTagPayload(type, name, depth, maxDepth);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads the payload of a tag, given the name and type.
|
||||
*
|
||||
@ -95,19 +89,16 @@ public final class NBTInputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private Tag readTagPayload(final int type, final String name, final int depth, final int maxDepth) throws IOException
|
||||
{
|
||||
if ((count++) > maxDepth) { throw new IOException("Exceeds max depth: " + count); }
|
||||
private Tag readTagPayload(final int type, final String name, final int depth, final int maxDepth) throws IOException {
|
||||
if ((count++) > maxDepth) {
|
||||
throw new IOException("Exceeds max depth: " + count);
|
||||
}
|
||||
count++;
|
||||
switch (type)
|
||||
{
|
||||
switch (type) {
|
||||
case NBTConstants.TYPE_END:
|
||||
if (depth == 0)
|
||||
{
|
||||
if (depth == 0) {
|
||||
throw new IOException("TAG_End found without a TAG_Compound/TAG_List tag preceding it.");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new EndTag();
|
||||
}
|
||||
case NBTConstants.TYPE_BYTE:
|
||||
@ -124,54 +115,54 @@ public final class NBTInputStream implements Closeable
|
||||
return new DoubleTag(name, is.readDouble());
|
||||
case NBTConstants.TYPE_BYTE_ARRAY:
|
||||
int length = is.readInt();
|
||||
|
||||
|
||||
// Max depth
|
||||
if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count);
|
||||
//
|
||||
if ((count += length) > maxDepth) {
|
||||
throw new IOException("Exceeds max depth: " + count);
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
byte[] bytes = new byte[length];
|
||||
is.readFully(bytes);
|
||||
return new ByteArrayTag(name, bytes);
|
||||
case NBTConstants.TYPE_STRING:
|
||||
length = is.readShort();
|
||||
|
||||
|
||||
// Max depth
|
||||
if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count);
|
||||
//
|
||||
if ((count += length) > maxDepth) {
|
||||
throw new IOException("Exceeds max depth: " + count);
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
bytes = new byte[length];
|
||||
is.readFully(bytes);
|
||||
return new StringTag(name, new String(bytes, NBTConstants.CHARSET));
|
||||
case NBTConstants.TYPE_LIST:
|
||||
final int childType = is.readByte();
|
||||
length = is.readInt();
|
||||
|
||||
|
||||
// Max depth
|
||||
if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count);
|
||||
//
|
||||
if ((count += length) > maxDepth) {
|
||||
throw new IOException("Exceeds max depth: " + count);
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
final List<Tag> tagList = new ArrayList<Tag>();
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
for (int i = 0; i < length; ++i) {
|
||||
final Tag tag = readTagPayload(childType, "", depth + 1, maxDepth);
|
||||
if (tag instanceof EndTag) { throw new IOException("TAG_End not permitted in a list."); }
|
||||
if (tag instanceof EndTag) {
|
||||
throw new IOException("TAG_End not permitted in a list.");
|
||||
}
|
||||
tagList.add(tag);
|
||||
}
|
||||
return new ListTag(name, NBTUtils.getTypeClass(childType), tagList);
|
||||
case NBTConstants.TYPE_COMPOUND:
|
||||
final Map<String, Tag> tagMap = new HashMap<String, Tag>();
|
||||
while (true)
|
||||
{
|
||||
while (true) {
|
||||
final Tag tag = readTag(depth + 1, maxDepth);
|
||||
if (tag instanceof EndTag)
|
||||
{
|
||||
if (tag instanceof EndTag) {
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
tagMap.put(tag.getName(), tag);
|
||||
}
|
||||
}
|
||||
@ -179,11 +170,12 @@ public final class NBTInputStream implements Closeable
|
||||
case NBTConstants.TYPE_INT_ARRAY:
|
||||
length = is.readInt();
|
||||
// Max depth
|
||||
if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count); }
|
||||
if ((count += length) > maxDepth) {
|
||||
throw new IOException("Exceeds max depth: " + count);
|
||||
}
|
||||
//
|
||||
final int[] data = new int[length];
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
for (int i = 0; i < length; i++) {
|
||||
data[i] = is.readInt();
|
||||
}
|
||||
return new IntArrayTag(name, data);
|
||||
@ -191,10 +183,9 @@ public final class NBTInputStream implements Closeable
|
||||
throw new IOException("Invalid tag type: " + type + ".");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void close() throws IOException
|
||||
{
|
||||
public void close() throws IOException {
|
||||
is.close();
|
||||
}
|
||||
}
|
||||
|
@ -35,13 +35,12 @@ import java.util.List;
|
||||
*
|
||||
* @author Graham Edgecombe
|
||||
*/
|
||||
public final class NBTOutputStream implements Closeable
|
||||
{
|
||||
public final class NBTOutputStream implements Closeable {
|
||||
/**
|
||||
* The output stream.
|
||||
*/
|
||||
private final DataOutputStream os;
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new <code>NBTOutputStream</code>, which will write data to the specified underlying output stream.
|
||||
*
|
||||
@ -49,11 +48,10 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
public NBTOutputStream(final OutputStream os) throws IOException
|
||||
{
|
||||
public NBTOutputStream(final OutputStream os) throws IOException {
|
||||
this.os = new DataOutputStream(os);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a tag.
|
||||
*
|
||||
@ -61,18 +59,19 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
public void writeTag(final Tag tag) throws IOException
|
||||
{
|
||||
public void writeTag(final Tag tag) throws IOException {
|
||||
final int type = NBTUtils.getTypeCode(tag.getClass());
|
||||
final String name = tag.getName();
|
||||
final byte[] nameBytes = name.getBytes(NBTConstants.CHARSET);
|
||||
os.writeByte(type);
|
||||
os.writeShort(nameBytes.length);
|
||||
os.write(nameBytes);
|
||||
if (type == NBTConstants.TYPE_END) { throw new IOException("Named TAG_End not permitted."); }
|
||||
if (type == NBTConstants.TYPE_END) {
|
||||
throw new IOException("Named TAG_End not permitted.");
|
||||
}
|
||||
writeTagPayload(tag);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes tag payload.
|
||||
*
|
||||
@ -80,11 +79,9 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeTagPayload(final Tag tag) throws IOException
|
||||
{
|
||||
private void writeTagPayload(final Tag tag) throws IOException {
|
||||
final int type = NBTUtils.getTypeCode(tag.getClass());
|
||||
switch (type)
|
||||
{
|
||||
switch (type) {
|
||||
case NBTConstants.TYPE_END:
|
||||
writeEndTagPayload((EndTag) tag);
|
||||
break;
|
||||
@ -125,7 +122,7 @@ public final class NBTOutputStream implements Closeable
|
||||
throw new IOException("Invalid tag type: " + type + ".");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Byte</code> tag.
|
||||
*
|
||||
@ -133,11 +130,10 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeByteTagPayload(final ByteTag tag) throws IOException
|
||||
{
|
||||
private void writeByteTagPayload(final ByteTag tag) throws IOException {
|
||||
os.writeByte(tag.getValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Byte_Array</code> tag.
|
||||
*
|
||||
@ -145,13 +141,12 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeByteArrayTagPayload(final ByteArrayTag tag) throws IOException
|
||||
{
|
||||
private void writeByteArrayTagPayload(final ByteArrayTag tag) throws IOException {
|
||||
final byte[] bytes = tag.getValue();
|
||||
os.writeInt(bytes.length);
|
||||
os.write(bytes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Compound</code> tag.
|
||||
*
|
||||
@ -159,15 +154,13 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeCompoundTagPayload(final CompoundTag tag) throws IOException
|
||||
{
|
||||
for (final Tag childTag : tag.getValue().values())
|
||||
{
|
||||
private void writeCompoundTagPayload(final CompoundTag tag) throws IOException {
|
||||
for (final Tag childTag : tag.getValue().values()) {
|
||||
writeTag(childTag);
|
||||
}
|
||||
os.writeByte((byte) 0); // end tag - better way?
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_List</code> tag.
|
||||
*
|
||||
@ -175,19 +168,17 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeListTagPayload(final ListTag tag) throws IOException
|
||||
{
|
||||
private void writeListTagPayload(final ListTag tag) throws IOException {
|
||||
final Class<? extends Tag> clazz = tag.getType();
|
||||
final List<Tag> tags = tag.getValue();
|
||||
final int size = tags.size();
|
||||
os.writeByte(NBTUtils.getTypeCode(clazz));
|
||||
os.writeInt(size);
|
||||
for (final Tag tag1 : tags)
|
||||
{
|
||||
for (final Tag tag1 : tags) {
|
||||
writeTagPayload(tag1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_String</code> tag.
|
||||
*
|
||||
@ -195,13 +186,12 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeStringTagPayload(final StringTag tag) throws IOException
|
||||
{
|
||||
private void writeStringTagPayload(final StringTag tag) throws IOException {
|
||||
final byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET);
|
||||
os.writeShort(bytes.length);
|
||||
os.write(bytes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Double</code> tag.
|
||||
*
|
||||
@ -209,11 +199,10 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeDoubleTagPayload(final DoubleTag tag) throws IOException
|
||||
{
|
||||
private void writeDoubleTagPayload(final DoubleTag tag) throws IOException {
|
||||
os.writeDouble(tag.getValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Float</code> tag.
|
||||
*
|
||||
@ -221,11 +210,10 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeFloatTagPayload(final FloatTag tag) throws IOException
|
||||
{
|
||||
private void writeFloatTagPayload(final FloatTag tag) throws IOException {
|
||||
os.writeFloat(tag.getValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Long</code> tag.
|
||||
*
|
||||
@ -233,11 +221,10 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeLongTagPayload(final LongTag tag) throws IOException
|
||||
{
|
||||
private void writeLongTagPayload(final LongTag tag) throws IOException {
|
||||
os.writeLong(tag.getValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Int</code> tag.
|
||||
*
|
||||
@ -245,11 +232,10 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeIntTagPayload(final IntTag tag) throws IOException
|
||||
{
|
||||
private void writeIntTagPayload(final IntTag tag) throws IOException {
|
||||
os.writeInt(tag.getValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Short</code> tag.
|
||||
*
|
||||
@ -257,11 +243,10 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeShortTagPayload(final ShortTag tag) throws IOException
|
||||
{
|
||||
private void writeShortTagPayload(final ShortTag tag) throws IOException {
|
||||
os.writeShort(tag.getValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a <code>TAG_Empty</code> tag.
|
||||
*
|
||||
@ -269,33 +254,28 @@ public final class NBTOutputStream implements Closeable
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeEndTagPayload(final EndTag tag)
|
||||
{
|
||||
private void writeEndTagPayload(final EndTag tag) {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
private void writeIntArrayTagPayload(final IntArrayTag tag) throws IOException
|
||||
{
|
||||
|
||||
private void writeIntArrayTagPayload(final IntArrayTag tag) throws IOException {
|
||||
final int[] data = tag.getValue();
|
||||
os.writeInt(data.length);
|
||||
for (final int element : data)
|
||||
{
|
||||
for (final int element : data) {
|
||||
os.writeInt(element);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void close() throws IOException
|
||||
{
|
||||
public void close() throws IOException {
|
||||
os.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Flush output
|
||||
* @throws IOException
|
||||
*/
|
||||
public void flush() throws IOException
|
||||
{
|
||||
public void flush() throws IOException {
|
||||
os.flush();
|
||||
}
|
||||
}
|
||||
|
@ -5,14 +5,12 @@ import java.util.Map;
|
||||
/**
|
||||
* A class which contains NBT-related utility methods.
|
||||
*/
|
||||
public final class NBTUtils
|
||||
{
|
||||
public final class NBTUtils {
|
||||
/**
|
||||
* Default private constructor.
|
||||
*/
|
||||
private NBTUtils()
|
||||
{}
|
||||
|
||||
private NBTUtils() {}
|
||||
|
||||
/**
|
||||
* Gets the type name of a tag.
|
||||
*
|
||||
@ -20,62 +18,36 @@ public final class NBTUtils
|
||||
*
|
||||
* @return The type name.
|
||||
*/
|
||||
public static String getTypeName(final Class<? extends Tag> clazz)
|
||||
{
|
||||
if (clazz.equals(ByteArrayTag.class))
|
||||
{
|
||||
public static String getTypeName(final Class<? extends Tag> clazz) {
|
||||
if (clazz.equals(ByteArrayTag.class)) {
|
||||
return "TAG_Byte_Array";
|
||||
}
|
||||
else if (clazz.equals(ByteTag.class))
|
||||
{
|
||||
} else if (clazz.equals(ByteTag.class)) {
|
||||
return "TAG_Byte";
|
||||
}
|
||||
else if (clazz.equals(CompoundTag.class))
|
||||
{
|
||||
} else if (clazz.equals(CompoundTag.class)) {
|
||||
return "TAG_Compound";
|
||||
}
|
||||
else if (clazz.equals(DoubleTag.class))
|
||||
{
|
||||
} else if (clazz.equals(DoubleTag.class)) {
|
||||
return "TAG_Double";
|
||||
}
|
||||
else if (clazz.equals(EndTag.class))
|
||||
{
|
||||
} else if (clazz.equals(EndTag.class)) {
|
||||
return "TAG_End";
|
||||
}
|
||||
else if (clazz.equals(FloatTag.class))
|
||||
{
|
||||
} else if (clazz.equals(FloatTag.class)) {
|
||||
return "TAG_Float";
|
||||
}
|
||||
else if (clazz.equals(IntTag.class))
|
||||
{
|
||||
} else if (clazz.equals(IntTag.class)) {
|
||||
return "TAG_Int";
|
||||
}
|
||||
else if (clazz.equals(ListTag.class))
|
||||
{
|
||||
} else if (clazz.equals(ListTag.class)) {
|
||||
return "TAG_List";
|
||||
}
|
||||
else if (clazz.equals(LongTag.class))
|
||||
{
|
||||
} else if (clazz.equals(LongTag.class)) {
|
||||
return "TAG_Long";
|
||||
}
|
||||
else if (clazz.equals(ShortTag.class))
|
||||
{
|
||||
} else if (clazz.equals(ShortTag.class)) {
|
||||
return "TAG_Short";
|
||||
}
|
||||
else if (clazz.equals(StringTag.class))
|
||||
{
|
||||
} else if (clazz.equals(StringTag.class)) {
|
||||
return "TAG_String";
|
||||
}
|
||||
else if (clazz.equals(IntArrayTag.class))
|
||||
{
|
||||
} else if (clazz.equals(IntArrayTag.class)) {
|
||||
return "TAG_Int_Array";
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the type code of a tag class.
|
||||
*
|
||||
@ -85,62 +57,36 @@ public final class NBTUtils
|
||||
*
|
||||
* @throws IllegalArgumentException if the tag class is invalid.
|
||||
*/
|
||||
public static int getTypeCode(final Class<? extends Tag> clazz)
|
||||
{
|
||||
if (clazz.equals(ByteArrayTag.class))
|
||||
{
|
||||
public static int getTypeCode(final Class<? extends Tag> clazz) {
|
||||
if (clazz.equals(ByteArrayTag.class)) {
|
||||
return NBTConstants.TYPE_BYTE_ARRAY;
|
||||
}
|
||||
else if (clazz.equals(ByteTag.class))
|
||||
{
|
||||
} else if (clazz.equals(ByteTag.class)) {
|
||||
return NBTConstants.TYPE_BYTE;
|
||||
}
|
||||
else if (clazz.equals(CompoundTag.class))
|
||||
{
|
||||
} else if (clazz.equals(CompoundTag.class)) {
|
||||
return NBTConstants.TYPE_COMPOUND;
|
||||
}
|
||||
else if (clazz.equals(DoubleTag.class))
|
||||
{
|
||||
} else if (clazz.equals(DoubleTag.class)) {
|
||||
return NBTConstants.TYPE_DOUBLE;
|
||||
}
|
||||
else if (clazz.equals(EndTag.class))
|
||||
{
|
||||
} else if (clazz.equals(EndTag.class)) {
|
||||
return NBTConstants.TYPE_END;
|
||||
}
|
||||
else if (clazz.equals(FloatTag.class))
|
||||
{
|
||||
} else if (clazz.equals(FloatTag.class)) {
|
||||
return NBTConstants.TYPE_FLOAT;
|
||||
}
|
||||
else if (clazz.equals(IntTag.class))
|
||||
{
|
||||
} else if (clazz.equals(IntTag.class)) {
|
||||
return NBTConstants.TYPE_INT;
|
||||
}
|
||||
else if (clazz.equals(ListTag.class))
|
||||
{
|
||||
} else if (clazz.equals(ListTag.class)) {
|
||||
return NBTConstants.TYPE_LIST;
|
||||
}
|
||||
else if (clazz.equals(LongTag.class))
|
||||
{
|
||||
} else if (clazz.equals(LongTag.class)) {
|
||||
return NBTConstants.TYPE_LONG;
|
||||
}
|
||||
else if (clazz.equals(ShortTag.class))
|
||||
{
|
||||
} else if (clazz.equals(ShortTag.class)) {
|
||||
return NBTConstants.TYPE_SHORT;
|
||||
}
|
||||
else if (clazz.equals(StringTag.class))
|
||||
{
|
||||
} else if (clazz.equals(StringTag.class)) {
|
||||
return NBTConstants.TYPE_STRING;
|
||||
}
|
||||
else if (clazz.equals(IntArrayTag.class))
|
||||
{
|
||||
} else if (clazz.equals(IntArrayTag.class)) {
|
||||
return NBTConstants.TYPE_INT_ARRAY;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the class of a type of tag.
|
||||
*
|
||||
@ -150,10 +96,8 @@ public final class NBTUtils
|
||||
*
|
||||
* @throws IllegalArgumentException if the tag type is invalid.
|
||||
*/
|
||||
public static Class<? extends Tag> getTypeClass(final int type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
public static Class<? extends Tag> getTypeClass(final int type) {
|
||||
switch (type) {
|
||||
case NBTConstants.TYPE_END:
|
||||
return EndTag.class;
|
||||
case NBTConstants.TYPE_BYTE:
|
||||
@ -182,7 +126,7 @@ public final class NBTUtils
|
||||
throw new IllegalArgumentException("Invalid tag type : " + type + ".");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get child tag of a NBT structure.
|
||||
*
|
||||
@ -193,11 +137,14 @@ public final class NBTUtils
|
||||
*
|
||||
* @return child tag
|
||||
*/
|
||||
public static <T extends Tag> T getChildTag(final Map<String, Tag> items, final String key, final Class<T> expected) throws IllegalArgumentException
|
||||
{
|
||||
if (!items.containsKey(key)) { throw new IllegalArgumentException("Missing a \"" + key + "\" tag"); }
|
||||
public static <T extends Tag> T getChildTag(final Map<String, Tag> items, final String key, final Class<T> expected) throws IllegalArgumentException {
|
||||
if (!items.containsKey(key)) {
|
||||
throw new IllegalArgumentException("Missing a \"" + key + "\" tag");
|
||||
}
|
||||
final Tag tag = items.get(key);
|
||||
if (!expected.isInstance(tag)) { throw new IllegalArgumentException(key + " tag is not of tag type " + expected.getName()); }
|
||||
if (!expected.isInstance(tag)) {
|
||||
throw new IllegalArgumentException(key + " tag is not of tag type " + expected.getName());
|
||||
}
|
||||
return expected.cast(tag);
|
||||
}
|
||||
}
|
||||
|
@ -23,46 +23,40 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Short} tag.
|
||||
*/
|
||||
public final class ShortTag extends Tag
|
||||
{
|
||||
public final class ShortTag extends Tag {
|
||||
private final short value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ShortTag(final short value)
|
||||
{
|
||||
public ShortTag(final short value) {
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ShortTag(final String name, final short value)
|
||||
{
|
||||
public ShortTag(final String name, final short value) {
|
||||
super(name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Short getValue()
|
||||
{
|
||||
public Short getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Short" + append + ": " + value;
|
||||
|
@ -5,48 +5,42 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||
/**
|
||||
* The {@code TAG_String} tag.
|
||||
*/
|
||||
public final class StringTag extends Tag
|
||||
{
|
||||
public final class StringTag extends Tag {
|
||||
private final String value;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with an empty name.
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public StringTag(final String value)
|
||||
{
|
||||
public StringTag(final String value) {
|
||||
super();
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag.
|
||||
*
|
||||
* @param name the name of the tag
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public StringTag(final String name, final String value)
|
||||
{
|
||||
public StringTag(final String name, final String value) {
|
||||
super(name);
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getValue()
|
||||
{
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_String" + append + ": " + value;
|
||||
|
@ -23,42 +23,37 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* Represents a NBT tag.
|
||||
*/
|
||||
public abstract class Tag
|
||||
{
|
||||
public abstract class Tag {
|
||||
private final String name;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new tag with an empty name.
|
||||
*/
|
||||
Tag()
|
||||
{
|
||||
Tag() {
|
||||
this("");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the tag with the specified name.
|
||||
*
|
||||
* @param name the name
|
||||
*/
|
||||
Tag(String name)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
Tag(String name) {
|
||||
if (name == null) {
|
||||
name = "";
|
||||
}
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the name of this tag.
|
||||
*
|
||||
* @return the name of this tag
|
||||
*/
|
||||
public final String getName()
|
||||
{
|
||||
public final String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the value of this tag.
|
||||
*
|
||||
|
@ -17,8 +17,7 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class CDL
|
||||
{
|
||||
public class CDL {
|
||||
/**
|
||||
* Get the next value. The value can be wrapped in quotes. The value can be empty.
|
||||
*
|
||||
@ -28,32 +27,28 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException if the quoted string is badly formed.
|
||||
*/
|
||||
private static String getValue(final JSONTokener x) throws JSONException
|
||||
{
|
||||
private static String getValue(final JSONTokener x) throws JSONException {
|
||||
char c;
|
||||
char q;
|
||||
StringBuffer sb;
|
||||
do
|
||||
{
|
||||
do {
|
||||
c = x.next();
|
||||
}
|
||||
while ((c == ' ') || (c == '\t'));
|
||||
switch (c)
|
||||
{
|
||||
} while ((c == ' ') || (c == '\t'));
|
||||
switch (c) {
|
||||
case 0:
|
||||
return null;
|
||||
case '"':
|
||||
case '\'':
|
||||
q = c;
|
||||
sb = new StringBuffer();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = x.next();
|
||||
if (c == q)
|
||||
{
|
||||
if (c == q) {
|
||||
break;
|
||||
}
|
||||
if ((c == 0) || (c == '\n') || (c == '\r')) { throw x.syntaxError("Missing close quote '" + q + "'."); }
|
||||
if ((c == 0) || (c == '\n') || (c == '\r')) {
|
||||
throw x.syntaxError("Missing close quote '" + q + "'.");
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
return sb.toString();
|
||||
@ -65,7 +60,7 @@ public class CDL
|
||||
return x.nextTo(',');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a JSONArray of strings from a row of comma delimited values.
|
||||
*
|
||||
@ -75,31 +70,30 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray rowToJSONArray(final JSONTokener x) throws JSONException
|
||||
{
|
||||
public static JSONArray rowToJSONArray(final JSONTokener x) throws JSONException {
|
||||
final JSONArray ja = new JSONArray();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
final String value = getValue(x);
|
||||
char c = x.next();
|
||||
if ((value == null) || ((ja.length() == 0) && (value.length() == 0) && (c != ','))) { return null; }
|
||||
if ((value == null) || ((ja.length() == 0) && (value.length() == 0) && (c != ','))) {
|
||||
return null;
|
||||
}
|
||||
ja.put(value);
|
||||
for (;;)
|
||||
{
|
||||
if (c == ',')
|
||||
{
|
||||
for (;;) {
|
||||
if (c == ',') {
|
||||
break;
|
||||
}
|
||||
if (c != ' ')
|
||||
{
|
||||
if ((c == '\n') || (c == '\r') || (c == 0)) { return ja; }
|
||||
if (c != ' ') {
|
||||
if ((c == '\n') || (c == '\r') || (c == 0)) {
|
||||
return ja;
|
||||
}
|
||||
throw x.syntaxError("Bad character '" + c + "' (" + (int) c + ").");
|
||||
}
|
||||
c = x.next();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a JSONObject from a row of comma delimited text, using a parallel JSONArray of strings to provides the
|
||||
* names of the elements.
|
||||
@ -112,12 +106,11 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONObject rowToJSONObject(final JSONArray names, final JSONTokener x) throws JSONException
|
||||
{
|
||||
public static JSONObject rowToJSONObject(final JSONArray names, final JSONTokener x) throws JSONException {
|
||||
final JSONArray ja = rowToJSONArray(x);
|
||||
return ja != null ? ja.toJSONObject(names) : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a comma delimited text row from a JSONArray. Values containing the comma character will be quoted.
|
||||
* Troublesome characters may be removed.
|
||||
@ -126,35 +119,26 @@ public class CDL
|
||||
*
|
||||
* @return A string ending in NEWLINE.
|
||||
*/
|
||||
public static String rowToString(final JSONArray ja)
|
||||
{
|
||||
public static String rowToString(final JSONArray ja) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < ja.length(); i += 1)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
for (int i = 0; i < ja.length(); i += 1) {
|
||||
if (i > 0) {
|
||||
sb.append(',');
|
||||
}
|
||||
final Object object = ja.opt(i);
|
||||
if (object != null)
|
||||
{
|
||||
if (object != null) {
|
||||
final String string = object.toString();
|
||||
if ((string.length() > 0) && ((string.indexOf(',') >= 0) || (string.indexOf('\n') >= 0) || (string.indexOf('\r') >= 0) || (string.indexOf(0) >= 0) || (string.charAt(0) == '"')))
|
||||
{
|
||||
if ((string.length() > 0) && ((string.indexOf(',') >= 0) || (string.indexOf('\n') >= 0) || (string.indexOf('\r') >= 0) || (string.indexOf(0) >= 0) || (string.charAt(0) == '"'))) {
|
||||
sb.append('"');
|
||||
final int length = string.length();
|
||||
for (int j = 0; j < length; j += 1)
|
||||
{
|
||||
for (int j = 0; j < length; j += 1) {
|
||||
final char c = string.charAt(j);
|
||||
if ((c >= ' ') && (c != '"'))
|
||||
{
|
||||
if ((c >= ' ') && (c != '"')) {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
sb.append('"');
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append(string);
|
||||
}
|
||||
}
|
||||
@ -162,7 +146,7 @@ public class CDL
|
||||
sb.append('\n');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a JSONArray of JSONObjects from a comma delimited text string, using the first row as a source of names.
|
||||
*
|
||||
@ -172,11 +156,10 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray toJSONArray(final String string) throws JSONException
|
||||
{
|
||||
public static JSONArray toJSONArray(final String string) throws JSONException {
|
||||
return toJSONArray(new JSONTokener(string));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a JSONArray of JSONObjects from a comma delimited text string, using the first row as a source of names.
|
||||
*
|
||||
@ -186,11 +169,10 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray toJSONArray(final JSONTokener x) throws JSONException
|
||||
{
|
||||
public static JSONArray toJSONArray(final JSONTokener x) throws JSONException {
|
||||
return toJSONArray(rowToJSONArray(x), x);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a JSONArray of JSONObjects from a comma delimited text string using a supplied JSONArray as the source of
|
||||
* element names.
|
||||
@ -202,11 +184,10 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray toJSONArray(final JSONArray names, final String string) throws JSONException
|
||||
{
|
||||
public static JSONArray toJSONArray(final JSONArray names, final String string) throws JSONException {
|
||||
return toJSONArray(names, new JSONTokener(string));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a JSONArray of JSONObjects from a comma delimited text string using a supplied JSONArray as the source of
|
||||
* element names.
|
||||
@ -218,23 +199,24 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray toJSONArray(final JSONArray names, final JSONTokener x) throws JSONException
|
||||
{
|
||||
if ((names == null) || (names.length() == 0)) { return null; }
|
||||
public static JSONArray toJSONArray(final JSONArray names, final JSONTokener x) throws JSONException {
|
||||
if ((names == null) || (names.length() == 0)) {
|
||||
return null;
|
||||
}
|
||||
final JSONArray ja = new JSONArray();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
final JSONObject jo = rowToJSONObject(names, x);
|
||||
if (jo == null)
|
||||
{
|
||||
if (jo == null) {
|
||||
break;
|
||||
}
|
||||
ja.put(jo);
|
||||
}
|
||||
if (ja.length() == 0) { return null; }
|
||||
if (ja.length() == 0) {
|
||||
return null;
|
||||
}
|
||||
return ja;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a comma delimited text from a JSONArray of JSONObjects. The first row will be a list of names obtained by
|
||||
* inspecting the first JSONObject.
|
||||
@ -245,17 +227,17 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONArray ja) throws JSONException
|
||||
{
|
||||
public static String toString(final JSONArray ja) throws JSONException {
|
||||
final JSONObject jo = ja.optJSONObject(0);
|
||||
if (jo != null)
|
||||
{
|
||||
if (jo != null) {
|
||||
final JSONArray names = jo.names();
|
||||
if (names != null) { return rowToString(names) + toString(names, ja); }
|
||||
if (names != null) {
|
||||
return rowToString(names) + toString(names, ja);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a comma delimited text from a JSONArray of JSONObjects using a provided list of names. The list of names
|
||||
* is not included in the output.
|
||||
@ -267,15 +249,14 @@ public class CDL
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONArray names, final JSONArray ja) throws JSONException
|
||||
{
|
||||
if ((names == null) || (names.length() == 0)) { return null; }
|
||||
public static String toString(final JSONArray names, final JSONArray ja) throws JSONException {
|
||||
if ((names == null) || (names.length() == 0)) {
|
||||
return null;
|
||||
}
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < ja.length(); i += 1)
|
||||
{
|
||||
for (int i = 0; i < ja.length(); i += 1) {
|
||||
final JSONObject jo = ja.optJSONObject(i);
|
||||
if (jo != null)
|
||||
{
|
||||
if (jo != null) {
|
||||
sb.append(rowToString(jo.toJSONArray(names)));
|
||||
}
|
||||
}
|
||||
|
@ -27,8 +27,7 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class Cookie
|
||||
{
|
||||
public class Cookie {
|
||||
/**
|
||||
* Produce a copy of a string in which the characters '+', '%', '=', ';' and control characters are replaced with
|
||||
* "%hh". This is a gentle form of URL encoding, attempting to cause as little distortion to the string as possible.
|
||||
@ -40,29 +39,24 @@ public class Cookie
|
||||
*
|
||||
* @return The escaped result.
|
||||
*/
|
||||
public static String escape(final String string)
|
||||
{
|
||||
public static String escape(final String string) {
|
||||
char c;
|
||||
final String s = string.trim();
|
||||
final int length = s.length();
|
||||
final StringBuilder sb = new StringBuilder(length);
|
||||
for (int i = 0; i < length; i += 1)
|
||||
{
|
||||
for (int i = 0; i < length; i += 1) {
|
||||
c = s.charAt(i);
|
||||
if ((c < ' ') || (c == '+') || (c == '%') || (c == '=') || (c == ';'))
|
||||
{
|
||||
if ((c < ' ') || (c == '+') || (c == '%') || (c == '=') || (c == ';')) {
|
||||
sb.append('%');
|
||||
sb.append(Character.forDigit((char) ((c >>> 4) & 0x0f), 16));
|
||||
sb.append(Character.forDigit((char) (c & 0x0f), 16));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a cookie specification string into a JSONObject. The string will contain a name value pair separated by
|
||||
* '='. The name and the value will be unescaped, possibly converting '+' and '%' sequences. The cookie properties
|
||||
@ -77,8 +71,7 @@ public class Cookie
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException
|
||||
{
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException {
|
||||
String name;
|
||||
final JSONObject jo = new JSONObject();
|
||||
Object value;
|
||||
@ -87,22 +80,15 @@ public class Cookie
|
||||
x.next('=');
|
||||
jo.put("value", x.nextTo(';'));
|
||||
x.next();
|
||||
while (x.more())
|
||||
{
|
||||
while (x.more()) {
|
||||
name = unescape(x.nextTo("=;"));
|
||||
if (x.next() != '=')
|
||||
{
|
||||
if (name.equals("secure"))
|
||||
{
|
||||
if (x.next() != '=') {
|
||||
if (name.equals("secure")) {
|
||||
value = Boolean.TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw x.syntaxError("Missing '=' in cookie parameter.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
value = unescape(x.nextTo(';'));
|
||||
x.next();
|
||||
}
|
||||
@ -110,7 +96,7 @@ public class Cookie
|
||||
}
|
||||
return jo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a JSONObject into a cookie specification string. The JSONObject must contain "name" and "value" members.
|
||||
* If the JSONObject contains "expires", "domain", "path", or "secure" members, they will be appended to the cookie
|
||||
@ -122,34 +108,29 @@ public class Cookie
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONObject jo) throws JSONException
|
||||
{
|
||||
public static String toString(final JSONObject jo) throws JSONException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append(escape(jo.getString("name")));
|
||||
sb.append("=");
|
||||
sb.append(escape(jo.getString("value")));
|
||||
if (jo.has("expires"))
|
||||
{
|
||||
if (jo.has("expires")) {
|
||||
sb.append(";expires=");
|
||||
sb.append(jo.getString("expires"));
|
||||
}
|
||||
if (jo.has("domain"))
|
||||
{
|
||||
if (jo.has("domain")) {
|
||||
sb.append(";domain=");
|
||||
sb.append(escape(jo.getString("domain")));
|
||||
}
|
||||
if (jo.has("path"))
|
||||
{
|
||||
if (jo.has("path")) {
|
||||
sb.append(";path=");
|
||||
sb.append(escape(jo.getString("path")));
|
||||
}
|
||||
if (jo.optBoolean("secure"))
|
||||
{
|
||||
if (jo.optBoolean("secure")) {
|
||||
sb.append(";secure");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert <code>%</code><i>hh</i> sequences to single characters, and convert plus to space.
|
||||
*
|
||||
@ -158,23 +139,17 @@ public class Cookie
|
||||
*
|
||||
* @return The unescaped string.
|
||||
*/
|
||||
public static String unescape(final String string)
|
||||
{
|
||||
public static String unescape(final String string) {
|
||||
final int length = string.length();
|
||||
final StringBuilder sb = new StringBuilder(length);
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
for (int i = 0; i < length; ++i) {
|
||||
char c = string.charAt(i);
|
||||
if (c == '+')
|
||||
{
|
||||
if (c == '+') {
|
||||
c = ' ';
|
||||
}
|
||||
else if ((c == '%') && ((i + 2) < length))
|
||||
{
|
||||
} else if ((c == '%') && ((i + 2) < length)) {
|
||||
final int d = JSONTokener.dehexchar(string.charAt(i + 1));
|
||||
final int e = JSONTokener.dehexchar(string.charAt(i + 2));
|
||||
if ((d >= 0) && (e >= 0))
|
||||
{
|
||||
if ((d >= 0) && (e >= 0)) {
|
||||
c = (char) ((d * 16) + e);
|
||||
i += 2;
|
||||
}
|
||||
|
@ -8,8 +8,7 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class CookieList
|
||||
{
|
||||
public class CookieList {
|
||||
/**
|
||||
* Convert a cookie list into a JSONObject. A cookie list is a sequence of name/value pairs. The names are separated
|
||||
* from the values by '='. The pairs are separated by ';'. The names and the values will be unescaped, possibly
|
||||
@ -24,12 +23,10 @@ public class CookieList
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException
|
||||
{
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException {
|
||||
final JSONObject jo = new JSONObject();
|
||||
final JSONTokener x = new JSONTokener(string);
|
||||
while (x.more())
|
||||
{
|
||||
while (x.more()) {
|
||||
final String name = Cookie.unescape(x.nextTo('='));
|
||||
x.next('=');
|
||||
jo.put(name, Cookie.unescape(x.nextTo(';')));
|
||||
@ -37,7 +34,7 @@ public class CookieList
|
||||
}
|
||||
return jo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a JSONObject into a cookie list. A cookie list is a sequence of name/value pairs. The names are separated
|
||||
* from the values by '='. The pairs are separated by ';'. The characters '%', '+', '=', and ';' in the names and
|
||||
@ -49,19 +46,15 @@ public class CookieList
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONObject jo) throws JSONException
|
||||
{
|
||||
public static String toString(final JSONObject jo) throws JSONException {
|
||||
boolean b = false;
|
||||
final Iterator<String> keys = jo.keys();
|
||||
String string;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
while (keys.hasNext())
|
||||
{
|
||||
while (keys.hasNext()) {
|
||||
string = keys.next();
|
||||
if (!jo.isNull(string))
|
||||
{
|
||||
if (b)
|
||||
{
|
||||
if (!jo.isNull(string)) {
|
||||
if (b) {
|
||||
sb.append(';');
|
||||
}
|
||||
sb.append(Cookie.escape(string));
|
||||
|
@ -28,37 +28,31 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class HTTP
|
||||
{
|
||||
public class HTTP {
|
||||
/**
|
||||
* Carriage return/line feed.
|
||||
*/
|
||||
public static final String CRLF = "\r\n";
|
||||
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException
|
||||
{
|
||||
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException {
|
||||
final JSONObject jo = new JSONObject();
|
||||
final HTTPTokener x = new HTTPTokener(string);
|
||||
String token;
|
||||
token = x.nextToken();
|
||||
if (token.toUpperCase().startsWith("HTTP"))
|
||||
{
|
||||
if (token.toUpperCase().startsWith("HTTP")) {
|
||||
// Response
|
||||
jo.put("HTTP-Version", token);
|
||||
jo.put("Status-Code", x.nextToken());
|
||||
jo.put("Reason-Phrase", x.nextTo('\0'));
|
||||
x.next();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
// Request
|
||||
jo.put("Method", token);
|
||||
jo.put("Request-URI", x.nextToken());
|
||||
jo.put("HTTP-Version", x.nextToken());
|
||||
}
|
||||
// Fields
|
||||
while (x.more())
|
||||
{
|
||||
while (x.more()) {
|
||||
final String name = x.nextTo(':');
|
||||
x.next(':');
|
||||
jo.put(name, x.nextTo('\0'));
|
||||
@ -66,7 +60,7 @@ public class HTTP
|
||||
}
|
||||
return jo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a JSONObject into an HTTP header. A request header must contain
|
||||
*
|
||||
@ -98,21 +92,17 @@ public class HTTP
|
||||
*
|
||||
* @throws JSONException if the object does not contain enough information.
|
||||
*/
|
||||
public static String toString(final JSONObject jo) throws JSONException
|
||||
{
|
||||
public static String toString(final JSONObject jo) throws JSONException {
|
||||
final Iterator<String> keys = jo.keys();
|
||||
String string;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
if (jo.has("Status-Code") && jo.has("Reason-Phrase"))
|
||||
{
|
||||
if (jo.has("Status-Code") && jo.has("Reason-Phrase")) {
|
||||
sb.append(jo.getString("HTTP-Version"));
|
||||
sb.append(' ');
|
||||
sb.append(jo.getString("Status-Code"));
|
||||
sb.append(' ');
|
||||
sb.append(jo.getString("Reason-Phrase"));
|
||||
}
|
||||
else if (jo.has("Method") && jo.has("Request-URI"))
|
||||
{
|
||||
} else if (jo.has("Method") && jo.has("Request-URI")) {
|
||||
sb.append(jo.getString("Method"));
|
||||
sb.append(' ');
|
||||
sb.append('"');
|
||||
@ -120,17 +110,13 @@ public class HTTP
|
||||
sb.append('"');
|
||||
sb.append(' ');
|
||||
sb.append(jo.getString("HTTP-Version"));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw new JSONException("Not enough material for an HTTP header.");
|
||||
}
|
||||
sb.append(CRLF);
|
||||
while (keys.hasNext())
|
||||
{
|
||||
while (keys.hasNext()) {
|
||||
string = keys.next();
|
||||
if (!"HTTP-Version".equals(string) && !"Status-Code".equals(string) && !"Reason-Phrase".equals(string) && !"Method".equals(string) && !"Request-URI".equals(string) && !jo.isNull(string))
|
||||
{
|
||||
if (!"HTTP-Version".equals(string) && !"Status-Code".equals(string) && !"Reason-Phrase".equals(string) && !"Method".equals(string) && !"Request-URI".equals(string) && !jo.isNull(string)) {
|
||||
sb.append(string);
|
||||
sb.append(": ");
|
||||
sb.append(jo.getString(string));
|
||||
|
@ -6,18 +6,16 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class HTTPTokener extends JSONTokener
|
||||
{
|
||||
public class HTTPTokener extends JSONTokener {
|
||||
/**
|
||||
* Construct an HTTPTokener from a string.
|
||||
*
|
||||
* @param string A source string.
|
||||
*/
|
||||
public HTTPTokener(final String string)
|
||||
{
|
||||
public HTTPTokener(final String string) {
|
||||
super(string);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the next token or string. This is used in parsing HTTP headers.
|
||||
*
|
||||
@ -25,30 +23,30 @@ public class HTTPTokener extends JSONTokener
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public String nextToken() throws JSONException
|
||||
{
|
||||
public String nextToken() throws JSONException {
|
||||
char c;
|
||||
char q;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
do
|
||||
{
|
||||
do {
|
||||
c = next();
|
||||
}
|
||||
while (Character.isWhitespace(c));
|
||||
if ((c == '"') || (c == '\''))
|
||||
{
|
||||
} while (Character.isWhitespace(c));
|
||||
if ((c == '"') || (c == '\'')) {
|
||||
q = c;
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = next();
|
||||
if (c < ' ') { throw syntaxError("Unterminated string."); }
|
||||
if (c == q) { return sb.toString(); }
|
||||
if (c < ' ') {
|
||||
throw syntaxError("Unterminated string.");
|
||||
}
|
||||
if (c == q) {
|
||||
return sb.toString();
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
if ((c == 0) || Character.isWhitespace(c)) { return sb.toString(); }
|
||||
for (;;) {
|
||||
if ((c == 0) || Character.isWhitespace(c)) {
|
||||
return sb.toString();
|
||||
}
|
||||
sb.append(c);
|
||||
c = next();
|
||||
}
|
||||
|
@ -56,21 +56,19 @@ import java.util.Map;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONArray
|
||||
{
|
||||
public class JSONArray {
|
||||
/**
|
||||
* The arrayList where the JSONArray's properties are kept.
|
||||
*/
|
||||
private final ArrayList<Object> myArrayList;
|
||||
|
||||
|
||||
/**
|
||||
* Construct an empty JSONArray.
|
||||
*/
|
||||
public JSONArray()
|
||||
{
|
||||
public JSONArray() {
|
||||
myArrayList = new ArrayList<Object>();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct a JSONArray from a JSONTokener.
|
||||
*
|
||||
@ -78,29 +76,26 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If there is a syntax error.
|
||||
*/
|
||||
public JSONArray(final JSONTokener x) throws JSONException
|
||||
{
|
||||
public JSONArray(final JSONTokener x) throws JSONException {
|
||||
this();
|
||||
if (x.nextClean() != '[') { throw x.syntaxError("A JSONArray text must start with '['"); }
|
||||
if (x.nextClean() != ']')
|
||||
{
|
||||
if (x.nextClean() != '[') {
|
||||
throw x.syntaxError("A JSONArray text must start with '['");
|
||||
}
|
||||
if (x.nextClean() != ']') {
|
||||
x.back();
|
||||
for (;;)
|
||||
{
|
||||
if (x.nextClean() == ',')
|
||||
{
|
||||
for (;;) {
|
||||
if (x.nextClean() == ',') {
|
||||
x.back();
|
||||
myArrayList.add(JSONObject.NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
x.back();
|
||||
myArrayList.add(x.nextValue());
|
||||
}
|
||||
switch (x.nextClean())
|
||||
{
|
||||
switch (x.nextClean()) {
|
||||
case ',':
|
||||
if (x.nextClean() == ']') { return; }
|
||||
if (x.nextClean() == ']') {
|
||||
return;
|
||||
}
|
||||
x.back();
|
||||
break;
|
||||
case ']':
|
||||
@ -111,7 +106,7 @@ public class JSONArray
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct a JSONArray from a source JSON text.
|
||||
*
|
||||
@ -120,50 +115,41 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If there is a syntax error.
|
||||
*/
|
||||
public JSONArray(final String source) throws JSONException
|
||||
{
|
||||
public JSONArray(final String source) throws JSONException {
|
||||
this(new JSONTokener(source));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct a JSONArray from a Collection.
|
||||
*
|
||||
* @param collection A Collection.
|
||||
*/
|
||||
public JSONArray(final Collection<Object> collection)
|
||||
{
|
||||
public JSONArray(final Collection<Object> collection) {
|
||||
myArrayList = new ArrayList<Object>();
|
||||
if (collection != null)
|
||||
{
|
||||
for (final Object aCollection : collection)
|
||||
{
|
||||
if (collection != null) {
|
||||
for (final Object aCollection : collection) {
|
||||
myArrayList.add(JSONObject.wrap(aCollection));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct a JSONArray from an array
|
||||
*
|
||||
* @throws JSONException If not an array.
|
||||
*/
|
||||
public JSONArray(final Object array) throws JSONException
|
||||
{
|
||||
public JSONArray(final Object array) throws JSONException {
|
||||
this();
|
||||
if (array.getClass().isArray())
|
||||
{
|
||||
if (array.getClass().isArray()) {
|
||||
final int length = Array.getLength(array);
|
||||
for (int i = 0; i < length; i += 1)
|
||||
{
|
||||
for (int i = 0; i < length; i += 1) {
|
||||
this.put(JSONObject.wrap(Array.get(array, i)));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw new JSONException("JSONArray initial value should be a string or collection or array.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the object value associated with an index.
|
||||
*
|
||||
@ -173,13 +159,14 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If there is no value for the index.
|
||||
*/
|
||||
public Object get(final int index) throws JSONException
|
||||
{
|
||||
public Object get(final int index) throws JSONException {
|
||||
final Object object = opt(index);
|
||||
if (object == null) { throw new JSONException("JSONArray[" + index + "] not found."); }
|
||||
if (object == null) {
|
||||
throw new JSONException("JSONArray[" + index + "] not found.");
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the boolean value associated with an index. The string values "true" and "false" are converted to boolean.
|
||||
*
|
||||
@ -189,17 +176,16 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If there is no value for the index or if the value is not convertible to boolean.
|
||||
*/
|
||||
public boolean getBoolean(final int index) throws JSONException
|
||||
{
|
||||
public boolean getBoolean(final int index) throws JSONException {
|
||||
final Object object = get(index);
|
||||
if (object.equals(Boolean.FALSE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("false")))
|
||||
{
|
||||
if (object.equals(Boolean.FALSE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("false"))) {
|
||||
return false;
|
||||
} else if (object.equals(Boolean.TRUE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("true"))) {
|
||||
return true;
|
||||
}
|
||||
else if (object.equals(Boolean.TRUE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("true"))) { return true; }
|
||||
throw new JSONException("JSONArray[" + index + "] is not a boolean.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the double value associated with an index.
|
||||
*
|
||||
@ -209,19 +195,15 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the key is not found or if the value cannot be converted to a number.
|
||||
*/
|
||||
public double getDouble(final int index) throws JSONException
|
||||
{
|
||||
public double getDouble(final int index) throws JSONException {
|
||||
final Object object = get(index);
|
||||
try
|
||||
{
|
||||
try {
|
||||
return object instanceof Number ? ((Number) object).doubleValue() : Double.parseDouble((String) object);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
throw new JSONException("JSONArray[" + index + "] is not a number.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the int value associated with an index.
|
||||
*
|
||||
@ -231,19 +213,15 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the key is not found or if the value is not a number.
|
||||
*/
|
||||
public int getInt(final int index) throws JSONException
|
||||
{
|
||||
public int getInt(final int index) throws JSONException {
|
||||
final Object object = get(index);
|
||||
try
|
||||
{
|
||||
try {
|
||||
return object instanceof Number ? ((Number) object).intValue() : Integer.parseInt((String) object);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
throw new JSONException("JSONArray[" + index + "] is not a number.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the JSONArray associated with an index.
|
||||
*
|
||||
@ -253,13 +231,14 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If there is no value for the index. or if the value is not a JSONArray
|
||||
*/
|
||||
public JSONArray getJSONArray(final int index) throws JSONException
|
||||
{
|
||||
public JSONArray getJSONArray(final int index) throws JSONException {
|
||||
final Object object = get(index);
|
||||
if (object instanceof JSONArray) { return (JSONArray) object; }
|
||||
if (object instanceof JSONArray) {
|
||||
return (JSONArray) object;
|
||||
}
|
||||
throw new JSONException("JSONArray[" + index + "] is not a JSONArray.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the JSONObject associated with an index.
|
||||
*
|
||||
@ -269,13 +248,14 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If there is no value for the index or if the value is not a JSONObject
|
||||
*/
|
||||
public JSONObject getJSONObject(final int index) throws JSONException
|
||||
{
|
||||
public JSONObject getJSONObject(final int index) throws JSONException {
|
||||
final Object object = get(index);
|
||||
if (object instanceof JSONObject) { return (JSONObject) object; }
|
||||
if (object instanceof JSONObject) {
|
||||
return (JSONObject) object;
|
||||
}
|
||||
throw new JSONException("JSONArray[" + index + "] is not a JSONObject.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the long value associated with an index.
|
||||
*
|
||||
@ -285,19 +265,15 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the key is not found or if the value cannot be converted to a number.
|
||||
*/
|
||||
public long getLong(final int index) throws JSONException
|
||||
{
|
||||
public long getLong(final int index) throws JSONException {
|
||||
final Object object = get(index);
|
||||
try
|
||||
{
|
||||
try {
|
||||
return object instanceof Number ? ((Number) object).longValue() : Long.parseLong((String) object);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
throw new JSONException("JSONArray[" + index + "] is not a number.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the string associated with an index.
|
||||
*
|
||||
@ -307,13 +283,14 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If there is no string value for the index.
|
||||
*/
|
||||
public String getString(final int index) throws JSONException
|
||||
{
|
||||
public String getString(final int index) throws JSONException {
|
||||
final Object object = get(index);
|
||||
if (object instanceof String) { return (String) object; }
|
||||
if (object instanceof String) {
|
||||
return (String) object;
|
||||
}
|
||||
throw new JSONException("JSONArray[" + index + "] not a string.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine if the value is null.
|
||||
*
|
||||
@ -321,11 +298,10 @@ public class JSONArray
|
||||
*
|
||||
* @return true if the value at the index is null, or if there is no value.
|
||||
*/
|
||||
public boolean isNull(final int index)
|
||||
{
|
||||
public boolean isNull(final int index) {
|
||||
return JSONObject.NULL.equals(opt(index));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a string from the contents of this JSONArray. The <code>separator</code> string is inserted between each
|
||||
* element. Warning: This method assumes that the data structure is acyclical.
|
||||
@ -336,31 +312,27 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the array contains an invalid number.
|
||||
*/
|
||||
public String join(final String separator) throws JSONException
|
||||
{
|
||||
public String join(final String separator) throws JSONException {
|
||||
final int len = length();
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < len; i += 1)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
for (int i = 0; i < len; i += 1) {
|
||||
if (i > 0) {
|
||||
sb.append(separator);
|
||||
}
|
||||
sb.append(JSONObject.valueToString(myArrayList.get(i)));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the number of elements in the JSONArray, included nulls.
|
||||
*
|
||||
* @return The length (or size).
|
||||
*/
|
||||
public int length()
|
||||
{
|
||||
public int length() {
|
||||
return myArrayList.size();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional object value associated with an index.
|
||||
*
|
||||
@ -368,11 +340,10 @@ public class JSONArray
|
||||
*
|
||||
* @return An object value, or null if there is no object at that index.
|
||||
*/
|
||||
public Object opt(final int index)
|
||||
{
|
||||
public Object opt(final int index) {
|
||||
return ((index < 0) || (index >= length())) ? null : myArrayList.get(index);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional boolean value associated with an index. It returns false if there is no value at that index, or
|
||||
* if the value is not Boolean.TRUE or the String "true".
|
||||
@ -381,11 +352,10 @@ public class JSONArray
|
||||
*
|
||||
* @return The truth.
|
||||
*/
|
||||
public boolean optBoolean(final int index)
|
||||
{
|
||||
public boolean optBoolean(final int index) {
|
||||
return this.optBoolean(index, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional boolean value associated with an index. It returns the defaultValue if there is no value at that
|
||||
* index or if it is not a Boolean or the String "true" or "false" (case insensitive).
|
||||
@ -395,18 +365,14 @@ public class JSONArray
|
||||
*
|
||||
* @return The truth.
|
||||
*/
|
||||
public boolean optBoolean(final int index, final boolean defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
public boolean optBoolean(final int index, final boolean defaultValue) {
|
||||
try {
|
||||
return getBoolean(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional double value associated with an index. NaN is returned if there is no value for the index, or if
|
||||
* the value is not a number and cannot be converted to a number.
|
||||
@ -415,11 +381,10 @@ public class JSONArray
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public double optDouble(final int index)
|
||||
{
|
||||
public double optDouble(final int index) {
|
||||
return this.optDouble(index, Double.NaN);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional double value associated with an index. The defaultValue is returned if there is no value for the
|
||||
* index, or if the value is not a number and cannot be converted to a number.
|
||||
@ -429,18 +394,14 @@ public class JSONArray
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public double optDouble(final int index, final double defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
public double optDouble(final int index, final double defaultValue) {
|
||||
try {
|
||||
return getDouble(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional int value associated with an index. Zero is returned if there is no value for the index, or if
|
||||
* the value is not a number and cannot be converted to a number.
|
||||
@ -449,11 +410,10 @@ public class JSONArray
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public int optInt(final int index)
|
||||
{
|
||||
public int optInt(final int index) {
|
||||
return this.optInt(index, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional int value associated with an index. The defaultValue is returned if there is no value for the
|
||||
* index, or if the value is not a number and cannot be converted to a number.
|
||||
@ -463,18 +423,14 @@ public class JSONArray
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public int optInt(final int index, final int defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
public int optInt(final int index, final int defaultValue) {
|
||||
try {
|
||||
return getInt(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional JSONArray associated with an index.
|
||||
*
|
||||
@ -482,12 +438,11 @@ public class JSONArray
|
||||
*
|
||||
* @return A JSONArray value, or null if the index has no value, or if the value is not a JSONArray.
|
||||
*/
|
||||
public JSONArray optJSONArray(final int index)
|
||||
{
|
||||
public JSONArray optJSONArray(final int index) {
|
||||
final Object o = opt(index);
|
||||
return o instanceof JSONArray ? (JSONArray) o : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional JSONObject associated with an index. Null is returned if the key is not found, or null if the
|
||||
* index has no value, or if the value is not a JSONObject.
|
||||
@ -496,12 +451,11 @@ public class JSONArray
|
||||
*
|
||||
* @return A JSONObject value.
|
||||
*/
|
||||
public JSONObject optJSONObject(final int index)
|
||||
{
|
||||
public JSONObject optJSONObject(final int index) {
|
||||
final Object o = opt(index);
|
||||
return o instanceof JSONObject ? (JSONObject) o : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional long value associated with an index. Zero is returned if there is no value for the index, or if
|
||||
* the value is not a number and cannot be converted to a number.
|
||||
@ -510,11 +464,10 @@ public class JSONArray
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public long optLong(final int index)
|
||||
{
|
||||
public long optLong(final int index) {
|
||||
return this.optLong(index, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional long value associated with an index. The defaultValue is returned if there is no value for the
|
||||
* index, or if the value is not a number and cannot be converted to a number.
|
||||
@ -524,18 +477,14 @@ public class JSONArray
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public long optLong(final int index, final long defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
public long optLong(final int index, final long defaultValue) {
|
||||
try {
|
||||
return getLong(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional string value associated with an index. It returns an empty string if there is no value at that
|
||||
* index. If the value is not a string and is not null, then it is coverted to a string.
|
||||
@ -544,11 +493,10 @@ public class JSONArray
|
||||
*
|
||||
* @return A String value.
|
||||
*/
|
||||
public String optString(final int index)
|
||||
{
|
||||
public String optString(final int index) {
|
||||
return this.optString(index, "");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the optional string associated with an index. The defaultValue is returned if the key is not found.
|
||||
*
|
||||
@ -557,12 +505,11 @@ public class JSONArray
|
||||
*
|
||||
* @return A String value.
|
||||
*/
|
||||
public String optString(final int index, final String defaultValue)
|
||||
{
|
||||
public String optString(final int index, final String defaultValue) {
|
||||
final Object object = opt(index);
|
||||
return JSONObject.NULL.equals(object) ? defaultValue : object.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append a boolean value. This increases the array's length by one.
|
||||
*
|
||||
@ -570,12 +517,11 @@ public class JSONArray
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final boolean value)
|
||||
{
|
||||
public JSONArray put(final boolean value) {
|
||||
this.put(value ? Boolean.TRUE : Boolean.FALSE);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put a value in the JSONArray, where the value will be a JSONArray which is produced from a Collection.
|
||||
*
|
||||
@ -583,12 +529,11 @@ public class JSONArray
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final Collection<Object> value)
|
||||
{
|
||||
public JSONArray put(final Collection<Object> value) {
|
||||
this.put(new JSONArray(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append a double value. This increases the array's length by one.
|
||||
*
|
||||
@ -598,14 +543,13 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException if the value is not finite.
|
||||
*/
|
||||
public JSONArray put(final double value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final double value) throws JSONException {
|
||||
final Double d = value;
|
||||
JSONObject.testValidity(d);
|
||||
this.put(d);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append an int value. This increases the array's length by one.
|
||||
*
|
||||
@ -613,12 +557,11 @@ public class JSONArray
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final int value)
|
||||
{
|
||||
public JSONArray put(final int value) {
|
||||
this.put(new Integer(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append an long value. This increases the array's length by one.
|
||||
*
|
||||
@ -626,12 +569,11 @@ public class JSONArray
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final long value)
|
||||
{
|
||||
public JSONArray put(final long value) {
|
||||
this.put(new Long(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put a value in the JSONArray, where the value will be a JSONObject which is produced from a Map.
|
||||
*
|
||||
@ -639,12 +581,11 @@ public class JSONArray
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final Map<String, Object> value)
|
||||
{
|
||||
public JSONArray put(final Map<String, Object> value) {
|
||||
this.put(new JSONObject(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append an object value. This increases the array's length by one.
|
||||
*
|
||||
@ -653,12 +594,11 @@ public class JSONArray
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final Object value)
|
||||
{
|
||||
public JSONArray put(final Object value) {
|
||||
myArrayList.add(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put or replace a boolean value in the JSONArray. If the index is greater than the length of the JSONArray, then
|
||||
* null elements will be added as necessary to pad it out.
|
||||
@ -670,12 +610,11 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the index is negative.
|
||||
*/
|
||||
public JSONArray put(final int index, final boolean value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final int index, final boolean value) throws JSONException {
|
||||
this.put(index, value ? Boolean.TRUE : Boolean.FALSE);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put a value in the JSONArray, where the value will be a JSONArray which is produced from a Collection.
|
||||
*
|
||||
@ -686,12 +625,11 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the index is negative or if the value is not finite.
|
||||
*/
|
||||
public JSONArray put(final int index, final Collection<Object> value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final int index, final Collection<Object> value) throws JSONException {
|
||||
this.put(index, new JSONArray(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put or replace a double value. If the index is greater than the length of the JSONArray, then null elements will
|
||||
* be added as necessary to pad it out.
|
||||
@ -703,12 +641,11 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the index is negative or if the value is not finite.
|
||||
*/
|
||||
public JSONArray put(final int index, final double value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final int index, final double value) throws JSONException {
|
||||
this.put(index, new Double(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put or replace an int value. If the index is greater than the length of the JSONArray, then null elements will be
|
||||
* added as necessary to pad it out.
|
||||
@ -720,12 +657,11 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the index is negative.
|
||||
*/
|
||||
public JSONArray put(final int index, final int value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final int index, final int value) throws JSONException {
|
||||
this.put(index, new Integer(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put or replace a long value. If the index is greater than the length of the JSONArray, then null elements will be
|
||||
* added as necessary to pad it out.
|
||||
@ -737,12 +673,11 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the index is negative.
|
||||
*/
|
||||
public JSONArray put(final int index, final long value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final int index, final long value) throws JSONException {
|
||||
this.put(index, new Long(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put a value in the JSONArray, where the value will be a JSONObject that is produced from a Map.
|
||||
*
|
||||
@ -753,12 +688,11 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the index is negative or if the the value is an invalid number.
|
||||
*/
|
||||
public JSONArray put(final int index, final Map<String, Object> value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final int index, final Map<String, Object> value) throws JSONException {
|
||||
this.put(index, new JSONObject(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Put or replace an object value in the JSONArray. If the index is greater than the length of the JSONArray, then
|
||||
* null elements will be added as necessary to pad it out.
|
||||
@ -771,25 +705,22 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If the index is negative or if the the value is an invalid number.
|
||||
*/
|
||||
public JSONArray put(final int index, final Object value) throws JSONException
|
||||
{
|
||||
public JSONArray put(final int index, final Object value) throws JSONException {
|
||||
JSONObject.testValidity(value);
|
||||
if (index < 0) { throw new JSONException("JSONArray[" + index + "] not found."); }
|
||||
if (index < length())
|
||||
{
|
||||
myArrayList.set(index, value);
|
||||
if (index < 0) {
|
||||
throw new JSONException("JSONArray[" + index + "] not found.");
|
||||
}
|
||||
else
|
||||
{
|
||||
while (index != length())
|
||||
{
|
||||
if (index < length()) {
|
||||
myArrayList.set(index, value);
|
||||
} else {
|
||||
while (index != length()) {
|
||||
this.put(JSONObject.NULL);
|
||||
}
|
||||
this.put(value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove an index and close the hole.
|
||||
*
|
||||
@ -797,11 +728,10 @@ public class JSONArray
|
||||
*
|
||||
* @return The value that was associated with the index, or null if there was no value.
|
||||
*/
|
||||
public Object remove(final int index)
|
||||
{
|
||||
public Object remove(final int index) {
|
||||
return (index >= 0) && (index < length()) ? myArrayList.remove(index) : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine if two JSONArrays are similar. They must contain similar sequences.
|
||||
*
|
||||
@ -809,28 +739,32 @@ public class JSONArray
|
||||
*
|
||||
* @return true if they are equal
|
||||
*/
|
||||
public boolean similar(final Object other)
|
||||
{
|
||||
if (!(other instanceof JSONArray)) { return false; }
|
||||
public boolean similar(final Object other) {
|
||||
if (!(other instanceof JSONArray)) {
|
||||
return false;
|
||||
}
|
||||
final int len = length();
|
||||
if (len != ((JSONArray) other).length()) { return false; }
|
||||
for (int i = 0; i < len; i += 1)
|
||||
{
|
||||
if (len != ((JSONArray) other).length()) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < len; i += 1) {
|
||||
final Object valueThis = get(i);
|
||||
final Object valueOther = ((JSONArray) other).get(i);
|
||||
if (valueThis instanceof JSONObject)
|
||||
{
|
||||
if (!((JSONObject) valueThis).similar(valueOther)) { return false; }
|
||||
if (valueThis instanceof JSONObject) {
|
||||
if (!((JSONObject) valueThis).similar(valueOther)) {
|
||||
return false;
|
||||
}
|
||||
} else if (valueThis instanceof JSONArray) {
|
||||
if (!((JSONArray) valueThis).similar(valueOther)) {
|
||||
return false;
|
||||
}
|
||||
} else if (!valueThis.equals(valueOther)) {
|
||||
return false;
|
||||
}
|
||||
else if (valueThis instanceof JSONArray)
|
||||
{
|
||||
if (!((JSONArray) valueThis).similar(valueOther)) { return false; }
|
||||
}
|
||||
else if (!valueThis.equals(valueOther)) { return false; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a JSONObject by combining a JSONArray of names with the values of this JSONArray.
|
||||
*
|
||||
@ -840,17 +774,17 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException If any of the names are null.
|
||||
*/
|
||||
public JSONObject toJSONObject(final JSONArray names) throws JSONException
|
||||
{
|
||||
if ((names == null) || (names.length() == 0) || (length() == 0)) { return null; }
|
||||
public JSONObject toJSONObject(final JSONArray names) throws JSONException {
|
||||
if ((names == null) || (names.length() == 0) || (length() == 0)) {
|
||||
return null;
|
||||
}
|
||||
final JSONObject jo = new JSONObject();
|
||||
for (int i = 0; i < names.length(); i += 1)
|
||||
{
|
||||
for (int i = 0; i < names.length(); i += 1) {
|
||||
jo.put(names.getString(i), opt(i));
|
||||
}
|
||||
return jo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a JSON text of this JSONArray. For compactness, no unnecessary whitespace is added. If it is not possible to
|
||||
* produce a syntactically correct JSON text then null will be returned instead. This could occur if the array
|
||||
@ -861,18 +795,14 @@ public class JSONArray
|
||||
* @return a printable, displayable, transmittable representation of the array.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
try
|
||||
{
|
||||
public String toString() {
|
||||
try {
|
||||
return this.toString(0);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a prettyprinted JSON text of this JSONArray. Warning: This method assumes that the data structure is
|
||||
* acyclical.
|
||||
@ -885,15 +815,13 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public String toString(final int indentFactor) throws JSONException
|
||||
{
|
||||
public String toString(final int indentFactor) throws JSONException {
|
||||
final StringWriter sw = new StringWriter();
|
||||
synchronized (sw.getBuffer())
|
||||
{
|
||||
synchronized (sw.getBuffer()) {
|
||||
return this.write(sw, indentFactor, 0).toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Write the contents of the JSONArray as JSON text to a writer. For compactness, no whitespace is added.
|
||||
*
|
||||
@ -903,11 +831,10 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public Writer write(final Writer writer) throws JSONException
|
||||
{
|
||||
public Writer write(final Writer writer) throws JSONException {
|
||||
return this.write(writer, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Write the contents of the JSONArray as JSON text to a writer. For compactness, no whitespace is added.
|
||||
*
|
||||
@ -920,45 +847,34 @@ public class JSONArray
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
Writer write(final Writer writer, final int indentFactor, final int indent) throws JSONException
|
||||
{
|
||||
try
|
||||
{
|
||||
Writer write(final Writer writer, final int indentFactor, final int indent) throws JSONException {
|
||||
try {
|
||||
boolean commanate = false;
|
||||
final int length = length();
|
||||
writer.write('[');
|
||||
if (length == 1)
|
||||
{
|
||||
if (length == 1) {
|
||||
JSONObject.writeValue(writer, myArrayList.get(0), indentFactor, indent);
|
||||
}
|
||||
else if (length != 0)
|
||||
{
|
||||
} else if (length != 0) {
|
||||
final int newindent = indent + indentFactor;
|
||||
for (int i = 0; i < length; i += 1)
|
||||
{
|
||||
if (commanate)
|
||||
{
|
||||
for (int i = 0; i < length; i += 1) {
|
||||
if (commanate) {
|
||||
writer.write(',');
|
||||
}
|
||||
if (indentFactor > 0)
|
||||
{
|
||||
if (indentFactor > 0) {
|
||||
writer.write('\n');
|
||||
}
|
||||
JSONObject.indent(writer, newindent);
|
||||
JSONObject.writeValue(writer, myArrayList.get(i), indentFactor, newindent);
|
||||
commanate = true;
|
||||
}
|
||||
if (indentFactor > 0)
|
||||
{
|
||||
if (indentFactor > 0) {
|
||||
writer.write('\n');
|
||||
}
|
||||
JSONObject.indent(writer, indent);
|
||||
}
|
||||
writer.write(']');
|
||||
return writer;
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
} catch (final IOException e) {
|
||||
throw new JSONException(e);
|
||||
}
|
||||
}
|
||||
|
@ -6,40 +6,36 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONException extends RuntimeException
|
||||
{
|
||||
public class JSONException extends RuntimeException {
|
||||
private static final long serialVersionUID = 0;
|
||||
private Throwable cause;
|
||||
|
||||
|
||||
/**
|
||||
* Constructs a JSONException with an explanatory message.
|
||||
*
|
||||
* @param message Detail about the reason for the exception.
|
||||
*/
|
||||
public JSONException(final String message)
|
||||
{
|
||||
public JSONException(final String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructs a new JSONException with the specified cause.
|
||||
*
|
||||
* @param cause The cause.
|
||||
*/
|
||||
public JSONException(final Throwable cause)
|
||||
{
|
||||
public JSONException(final Throwable cause) {
|
||||
super(cause.getMessage());
|
||||
this.cause = cause;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the cause of this exception or null if the cause is nonexistent or unknown.
|
||||
*
|
||||
* @return the cause of this exception or null if the cause is nonexistent or unknown.
|
||||
*/
|
||||
@Override
|
||||
public Throwable getCause()
|
||||
{
|
||||
public Throwable getCause() {
|
||||
return cause;
|
||||
}
|
||||
}
|
||||
|
@ -9,8 +9,7 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONML
|
||||
{
|
||||
public class JSONML {
|
||||
/**
|
||||
* Parse XML values and store them in a JSONArray.
|
||||
*
|
||||
@ -22,8 +21,7 @@ public class JSONML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
private static Object parse(final XMLTokener x, final boolean arrayForm, final JSONArray ja) throws JSONException
|
||||
{
|
||||
private static Object parse(final XMLTokener x, final boolean arrayForm, final JSONArray ja) throws JSONException {
|
||||
String attribute;
|
||||
char c;
|
||||
String closeTag = null;
|
||||
@ -37,194 +35,155 @@ public class JSONML
|
||||
// <![ ... ]]>
|
||||
// <! ... >
|
||||
// <? ... ?>
|
||||
while (true)
|
||||
{
|
||||
if (!x.more()) { throw x.syntaxError("Bad XML"); }
|
||||
while (true) {
|
||||
if (!x.more()) {
|
||||
throw x.syntaxError("Bad XML");
|
||||
}
|
||||
token = x.nextContent();
|
||||
if (token == XML.LT)
|
||||
{
|
||||
if (token == XML.LT) {
|
||||
token = x.nextToken();
|
||||
if (token instanceof Character)
|
||||
{
|
||||
if (token == XML.SLASH)
|
||||
{
|
||||
if (token instanceof Character) {
|
||||
if (token == XML.SLASH) {
|
||||
// Close tag </
|
||||
token = x.nextToken();
|
||||
if (!(token instanceof String)) { throw new JSONException("Expected a closing name instead of '" + token + "'."); }
|
||||
if (x.nextToken() != XML.GT) { throw x.syntaxError("Misshaped close tag"); }
|
||||
if (!(token instanceof String)) {
|
||||
throw new JSONException("Expected a closing name instead of '" + token + "'.");
|
||||
}
|
||||
if (x.nextToken() != XML.GT) {
|
||||
throw x.syntaxError("Misshaped close tag");
|
||||
}
|
||||
return token;
|
||||
}
|
||||
else if (token == XML.BANG)
|
||||
{
|
||||
} else if (token == XML.BANG) {
|
||||
// <!
|
||||
c = x.next();
|
||||
if (c == '-')
|
||||
{
|
||||
if (x.next() == '-')
|
||||
{
|
||||
if (c == '-') {
|
||||
if (x.next() == '-') {
|
||||
x.skipPast("-->");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
x.back();
|
||||
}
|
||||
}
|
||||
else if (c == '[')
|
||||
{
|
||||
} else if (c == '[') {
|
||||
token = x.nextToken();
|
||||
if (token.equals("CDATA") && (x.next() == '['))
|
||||
{
|
||||
if (ja != null)
|
||||
{
|
||||
if (token.equals("CDATA") && (x.next() == '[')) {
|
||||
if (ja != null) {
|
||||
ja.put(x.nextCDATA());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw x.syntaxError("Expected 'CDATA['");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
i = 1;
|
||||
do
|
||||
{
|
||||
do {
|
||||
token = x.nextMeta();
|
||||
if (token == null)
|
||||
{
|
||||
if (token == null) {
|
||||
throw x.syntaxError("Missing '>' after '<!'.");
|
||||
}
|
||||
else if (token == XML.LT)
|
||||
{
|
||||
} else if (token == XML.LT) {
|
||||
i += 1;
|
||||
}
|
||||
else if (token == XML.GT)
|
||||
{
|
||||
} else if (token == XML.GT) {
|
||||
i -= 1;
|
||||
}
|
||||
}
|
||||
while (i > 0);
|
||||
} while (i > 0);
|
||||
}
|
||||
}
|
||||
else if (token == XML.QUEST)
|
||||
{
|
||||
} else if (token == XML.QUEST) {
|
||||
// <?
|
||||
x.skipPast("?>");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
// Open tag <
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(token instanceof String)) { throw x.syntaxError("Bad tagName '" + token + "'."); }
|
||||
} else {
|
||||
if (!(token instanceof String)) {
|
||||
throw x.syntaxError("Bad tagName '" + token + "'.");
|
||||
}
|
||||
tagName = (String) token;
|
||||
newja = new JSONArray();
|
||||
newjo = new JSONObject();
|
||||
if (arrayForm)
|
||||
{
|
||||
if (arrayForm) {
|
||||
newja.put(tagName);
|
||||
if (ja != null)
|
||||
{
|
||||
if (ja != null) {
|
||||
ja.put(newja);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
newjo.put("tagName", tagName);
|
||||
if (ja != null)
|
||||
{
|
||||
if (ja != null) {
|
||||
ja.put(newjo);
|
||||
}
|
||||
}
|
||||
token = null;
|
||||
for (;;)
|
||||
{
|
||||
if (token == null)
|
||||
{
|
||||
for (;;) {
|
||||
if (token == null) {
|
||||
token = x.nextToken();
|
||||
}
|
||||
if (token == null) { throw x.syntaxError("Misshaped tag"); }
|
||||
if (!(token instanceof String))
|
||||
{
|
||||
if (token == null) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
if (!(token instanceof String)) {
|
||||
break;
|
||||
}
|
||||
// attribute = value
|
||||
attribute = (String) token;
|
||||
if (!arrayForm && ("tagName".equals(attribute) || "childNode".equals(attribute))) { throw x.syntaxError("Reserved attribute."); }
|
||||
if (!arrayForm && ("tagName".equals(attribute) || "childNode".equals(attribute))) {
|
||||
throw x.syntaxError("Reserved attribute.");
|
||||
}
|
||||
token = x.nextToken();
|
||||
if (token == XML.EQ)
|
||||
{
|
||||
if (token == XML.EQ) {
|
||||
token = x.nextToken();
|
||||
if (!(token instanceof String)) { throw x.syntaxError("Missing value"); }
|
||||
if (!(token instanceof String)) {
|
||||
throw x.syntaxError("Missing value");
|
||||
}
|
||||
newjo.accumulate(attribute, XML.stringToValue((String) token));
|
||||
token = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
newjo.accumulate(attribute, "");
|
||||
}
|
||||
}
|
||||
if (arrayForm && (newjo.length() > 0))
|
||||
{
|
||||
if (arrayForm && (newjo.length() > 0)) {
|
||||
newja.put(newjo);
|
||||
}
|
||||
// Empty tag <.../>
|
||||
if (token == XML.SLASH)
|
||||
{
|
||||
if (x.nextToken() != XML.GT) { throw x.syntaxError("Misshaped tag"); }
|
||||
if (ja == null)
|
||||
{
|
||||
if (arrayForm)
|
||||
{
|
||||
if (token == XML.SLASH) {
|
||||
if (x.nextToken() != XML.GT) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
if (ja == null) {
|
||||
if (arrayForm) {
|
||||
return newja;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return newjo;
|
||||
}
|
||||
}
|
||||
// Content, between <...> and </...>
|
||||
}
|
||||
else
|
||||
{
|
||||
if (token != XML.GT) { throw x.syntaxError("Misshaped tag"); }
|
||||
} else {
|
||||
if (token != XML.GT) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
closeTag = (String) parse(x, arrayForm, newja);
|
||||
if (closeTag != null)
|
||||
{
|
||||
if (!closeTag.equals(tagName)) { throw x.syntaxError("Mismatched '" + tagName + "' and '" + closeTag + "'"); }
|
||||
if (closeTag != null) {
|
||||
if (!closeTag.equals(tagName)) {
|
||||
throw x.syntaxError("Mismatched '" + tagName + "' and '" + closeTag + "'");
|
||||
}
|
||||
tagName = null;
|
||||
if (!arrayForm && (newja.length() > 0))
|
||||
{
|
||||
if (!arrayForm && (newja.length() > 0)) {
|
||||
newjo.put("childNodes", newja);
|
||||
}
|
||||
if (ja == null)
|
||||
{
|
||||
if (arrayForm)
|
||||
{
|
||||
if (ja == null) {
|
||||
if (arrayForm) {
|
||||
return newja;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return newjo;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ja != null)
|
||||
{
|
||||
} else {
|
||||
if (ja != null) {
|
||||
ja.put(token instanceof String ? XML.stringToValue((String) token) : token);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a well-formed (but not necessarily valid) XML string into a JSONArray using the JsonML transform. Each
|
||||
* XML tag is represented as a JSONArray in which the first element is the tag name. If the tag has attributes, then
|
||||
@ -236,11 +195,10 @@ public class JSONML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray toJSONArray(final String string) throws JSONException
|
||||
{
|
||||
public static JSONArray toJSONArray(final String string) throws JSONException {
|
||||
return toJSONArray(new XMLTokener(string));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a well-formed (but not necessarily valid) XML string into a JSONArray using the JsonML transform. Each
|
||||
* XML tag is represented as a JSONArray in which the first element is the tag name. If the tag has attributes, then
|
||||
@ -254,11 +212,10 @@ public class JSONML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray toJSONArray(final XMLTokener x) throws JSONException
|
||||
{
|
||||
public static JSONArray toJSONArray(final XMLTokener x) throws JSONException {
|
||||
return (JSONArray) parse(x, true, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a well-formed (but not necessarily valid) XML string into a JSONObject using the JsonML transform. Each
|
||||
* XML tag is represented as a JSONObject with a "tagName" property. If the tag has attributes, then the attributes
|
||||
@ -273,11 +230,10 @@ public class JSONML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONObject toJSONObject(final XMLTokener x) throws JSONException
|
||||
{
|
||||
public static JSONObject toJSONObject(final XMLTokener x) throws JSONException {
|
||||
return (JSONObject) parse(x, false, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a well-formed (but not necessarily valid) XML string into a JSONObject using the JsonML transform. Each
|
||||
* XML tag is represented as a JSONObject with a "tagName" property. If the tag has attributes, then the attributes
|
||||
@ -292,11 +248,10 @@ public class JSONML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException
|
||||
{
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException {
|
||||
return toJSONObject(new XMLTokener(string));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reverse the JSONML transformation, making an XML text from a JSONArray.
|
||||
*
|
||||
@ -306,8 +261,7 @@ public class JSONML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONArray ja) throws JSONException
|
||||
{
|
||||
public static String toString(final JSONArray ja) throws JSONException {
|
||||
int i;
|
||||
JSONObject jo;
|
||||
String key;
|
||||
@ -324,19 +278,16 @@ public class JSONML
|
||||
sb.append('<');
|
||||
sb.append(tagName);
|
||||
object = ja.opt(1);
|
||||
if (object instanceof JSONObject)
|
||||
{
|
||||
if (object instanceof JSONObject) {
|
||||
i = 2;
|
||||
jo = (JSONObject) object;
|
||||
// Emit the attributes
|
||||
keys = jo.keys();
|
||||
while (keys.hasNext())
|
||||
{
|
||||
while (keys.hasNext()) {
|
||||
key = keys.next();
|
||||
XML.noSpace(key);
|
||||
value = jo.optString(key);
|
||||
if (value != null)
|
||||
{
|
||||
if (value != null) {
|
||||
sb.append(' ');
|
||||
sb.append(XML.escape(key));
|
||||
sb.append('=');
|
||||
@ -345,42 +296,29 @@ public class JSONML
|
||||
sb.append('"');
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
i = 1;
|
||||
}
|
||||
// Emit content in body
|
||||
length = ja.length();
|
||||
if (i >= length)
|
||||
{
|
||||
if (i >= length) {
|
||||
sb.append('/');
|
||||
sb.append('>');
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append('>');
|
||||
do
|
||||
{
|
||||
do {
|
||||
object = ja.get(i);
|
||||
i += 1;
|
||||
if (object != null)
|
||||
{
|
||||
if (object instanceof String)
|
||||
{
|
||||
if (object != null) {
|
||||
if (object instanceof String) {
|
||||
sb.append(XML.escape(object.toString()));
|
||||
}
|
||||
else if (object instanceof JSONObject)
|
||||
{
|
||||
} else if (object instanceof JSONObject) {
|
||||
sb.append(toString((JSONObject) object));
|
||||
}
|
||||
else if (object instanceof JSONArray)
|
||||
{
|
||||
} else if (object instanceof JSONArray) {
|
||||
sb.append(toString((JSONArray) object));
|
||||
}
|
||||
}
|
||||
}
|
||||
while (i < length);
|
||||
} while (i < length);
|
||||
sb.append('<');
|
||||
sb.append('/');
|
||||
sb.append(tagName);
|
||||
@ -388,7 +326,7 @@ public class JSONML
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reverse the JSONML transformation, making an XML text from a JSONObject. The JSONObject must contain a "tagName"
|
||||
* property. If it has children, then it must have a "childNodes" property containing an array of objects. The other
|
||||
@ -400,8 +338,7 @@ public class JSONML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONObject jo) throws JSONException
|
||||
{
|
||||
public static String toString(final JSONObject jo) throws JSONException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
int i;
|
||||
JSONArray ja;
|
||||
@ -413,22 +350,21 @@ public class JSONML
|
||||
String value;
|
||||
// Emit <tagName
|
||||
tagName = jo.optString("tagName");
|
||||
if (tagName == null) { return XML.escape(jo.toString()); }
|
||||
if (tagName == null) {
|
||||
return XML.escape(jo.toString());
|
||||
}
|
||||
XML.noSpace(tagName);
|
||||
tagName = XML.escape(tagName);
|
||||
sb.append('<');
|
||||
sb.append(tagName);
|
||||
// Emit the attributes
|
||||
keys = jo.keys();
|
||||
while (keys.hasNext())
|
||||
{
|
||||
while (keys.hasNext()) {
|
||||
key = keys.next();
|
||||
if (!"tagName".equals(key) && !"childNodes".equals(key))
|
||||
{
|
||||
if (!"tagName".equals(key) && !"childNodes".equals(key)) {
|
||||
XML.noSpace(key);
|
||||
value = jo.optString(key);
|
||||
if (value != null)
|
||||
{
|
||||
if (value != null) {
|
||||
sb.append(' ');
|
||||
sb.append(XML.escape(key));
|
||||
sb.append('=');
|
||||
@ -440,34 +376,22 @@ public class JSONML
|
||||
}
|
||||
// Emit content in body
|
||||
ja = jo.optJSONArray("childNodes");
|
||||
if (ja == null)
|
||||
{
|
||||
if (ja == null) {
|
||||
sb.append('/');
|
||||
sb.append('>');
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append('>');
|
||||
length = ja.length();
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
for (i = 0; i < length; i += 1) {
|
||||
object = ja.get(i);
|
||||
if (object != null)
|
||||
{
|
||||
if (object instanceof String)
|
||||
{
|
||||
if (object != null) {
|
||||
if (object instanceof String) {
|
||||
sb.append(XML.escape(object.toString()));
|
||||
}
|
||||
else if (object instanceof JSONObject)
|
||||
{
|
||||
} else if (object instanceof JSONObject) {
|
||||
sb.append(toString((JSONObject) object));
|
||||
}
|
||||
else if (object instanceof JSONArray)
|
||||
{
|
||||
} else if (object instanceof JSONArray) {
|
||||
sb.append(toString((JSONArray) object));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append(object.toString());
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -6,8 +6,7 @@ package com.intellectualcrafters.json;
|
||||
* <code>JSONWriter.value(</code>Object<code>)</code>. The <code>toJSONString</code> method will be used instead of the
|
||||
* default behavior of using the Object's <code>toString()</code> method and quoting the result.
|
||||
*/
|
||||
public interface JSONString
|
||||
{
|
||||
public interface JSONString {
|
||||
/**
|
||||
* The <code>toJSONString</code> method allows a class to produce its own JSON serialization.
|
||||
*
|
||||
|
@ -33,16 +33,14 @@ import java.io.StringWriter;
|
||||
* @author JSON.org
|
||||
* @version 2008-09-18
|
||||
*/
|
||||
public class JSONStringer extends JSONWriter
|
||||
{
|
||||
public class JSONStringer extends JSONWriter {
|
||||
/**
|
||||
* Make a fresh JSONStringer. It can be used to build one JSON text.
|
||||
*/
|
||||
public JSONStringer()
|
||||
{
|
||||
public JSONStringer() {
|
||||
super(new StringWriter());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the JSON text. This method is used to obtain the product of the JSONStringer instance. It will return
|
||||
* <code>null</code> if there was a problem in the construction of the JSON text (such as the calls to
|
||||
@ -51,8 +49,7 @@ public class JSONStringer extends JSONWriter
|
||||
* @return The JSON text.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
return mode == 'd' ? writer.toString() : null;
|
||||
}
|
||||
}
|
||||
|
@ -14,8 +14,7 @@ import java.io.StringReader;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONTokener
|
||||
{
|
||||
public class JSONTokener {
|
||||
private final Reader reader;
|
||||
private long character;
|
||||
private boolean eof;
|
||||
@ -23,14 +22,13 @@ public class JSONTokener
|
||||
private long line;
|
||||
private char previous;
|
||||
private boolean usePrevious;
|
||||
|
||||
|
||||
/**
|
||||
* Construct a JSONTokener from a Reader.
|
||||
*
|
||||
* @param reader A reader.
|
||||
*/
|
||||
public JSONTokener(final Reader reader)
|
||||
{
|
||||
public JSONTokener(final Reader reader) {
|
||||
this.reader = reader.markSupported() ? reader : new BufferedReader(reader);
|
||||
eof = false;
|
||||
usePrevious = false;
|
||||
@ -39,27 +37,25 @@ public class JSONTokener
|
||||
character = 1;
|
||||
line = 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct a JSONTokener from an InputStream.
|
||||
*
|
||||
* @param inputStream The source.
|
||||
*/
|
||||
public JSONTokener(final InputStream inputStream) throws JSONException
|
||||
{
|
||||
public JSONTokener(final InputStream inputStream) throws JSONException {
|
||||
this(new InputStreamReader(inputStream));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct a JSONTokener from a string.
|
||||
*
|
||||
* @param s A source string.
|
||||
*/
|
||||
public JSONTokener(final String s)
|
||||
{
|
||||
public JSONTokener(final String s) {
|
||||
this(new StringReader(s));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the hex value of a character (base16).
|
||||
*
|
||||
@ -67,93 +63,86 @@ public class JSONTokener
|
||||
*
|
||||
* @return An int between 0 and 15, or -1 if c was not a hex digit.
|
||||
*/
|
||||
public static int dehexchar(final char c)
|
||||
{
|
||||
if ((c >= '0') && (c <= '9')) { return c - '0'; }
|
||||
if ((c >= 'A') && (c <= 'F')) { return c - ('A' - 10); }
|
||||
if ((c >= 'a') && (c <= 'f')) { return c - ('a' - 10); }
|
||||
public static int dehexchar(final char c) {
|
||||
if ((c >= '0') && (c <= '9')) {
|
||||
return c - '0';
|
||||
}
|
||||
if ((c >= 'A') && (c <= 'F')) {
|
||||
return c - ('A' - 10);
|
||||
}
|
||||
if ((c >= 'a') && (c <= 'f')) {
|
||||
return c - ('a' - 10);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Back up one character. This provides a sort of lookahead capability, so that you can test for a digit or letter
|
||||
* before attempting to parse the next number or identifier.
|
||||
*/
|
||||
public void back() throws JSONException
|
||||
{
|
||||
if (usePrevious || (index <= 0)) { throw new JSONException("Stepping back two steps is not supported"); }
|
||||
public void back() throws JSONException {
|
||||
if (usePrevious || (index <= 0)) {
|
||||
throw new JSONException("Stepping back two steps is not supported");
|
||||
}
|
||||
index -= 1;
|
||||
character -= 1;
|
||||
usePrevious = true;
|
||||
eof = false;
|
||||
}
|
||||
|
||||
public boolean end()
|
||||
{
|
||||
|
||||
public boolean end() {
|
||||
return eof && !usePrevious;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine if the source string still contains characters that next() can consume.
|
||||
*
|
||||
* @return true if not yet at the end of the source.
|
||||
*/
|
||||
public boolean more() throws JSONException
|
||||
{
|
||||
public boolean more() throws JSONException {
|
||||
this.next();
|
||||
if (end()) { return false; }
|
||||
if (end()) {
|
||||
return false;
|
||||
}
|
||||
back();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the next character in the source string.
|
||||
*
|
||||
* @return The next character, or 0 if past the end of the source string.
|
||||
*/
|
||||
public char next() throws JSONException
|
||||
{
|
||||
public char next() throws JSONException {
|
||||
int c;
|
||||
if (usePrevious)
|
||||
{
|
||||
if (usePrevious) {
|
||||
usePrevious = false;
|
||||
c = previous;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
} else {
|
||||
try {
|
||||
c = reader.read();
|
||||
}
|
||||
catch (final IOException exception)
|
||||
{
|
||||
} catch (final IOException exception) {
|
||||
throw new JSONException(exception);
|
||||
}
|
||||
if (c <= 0)
|
||||
{ // End of stream
|
||||
if (c <= 0) { // End of stream
|
||||
eof = true;
|
||||
c = 0;
|
||||
}
|
||||
}
|
||||
index += 1;
|
||||
if (previous == '\r')
|
||||
{
|
||||
if (previous == '\r') {
|
||||
line += 1;
|
||||
character = c == '\n' ? 0 : 1;
|
||||
}
|
||||
else if (c == '\n')
|
||||
{
|
||||
} else if (c == '\n') {
|
||||
line += 1;
|
||||
character = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
character += 1;
|
||||
}
|
||||
previous = (char) c;
|
||||
return previous;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Consume the next character, and check that it matches a specified character.
|
||||
*
|
||||
@ -163,13 +152,14 @@ public class JSONTokener
|
||||
*
|
||||
* @throws JSONException if the character does not match.
|
||||
*/
|
||||
public char next(final char c) throws JSONException
|
||||
{
|
||||
public char next(final char c) throws JSONException {
|
||||
final char n = this.next();
|
||||
if (n != c) { throw syntaxError("Expected '" + c + "' and instead saw '" + n + "'"); }
|
||||
if (n != c) {
|
||||
throw syntaxError("Expected '" + c + "' and instead saw '" + n + "'");
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the next n characters.
|
||||
*
|
||||
@ -179,20 +169,22 @@ public class JSONTokener
|
||||
*
|
||||
* @throws JSONException Substring bounds error if there are not n characters remaining in the source string.
|
||||
*/
|
||||
public String next(final int n) throws JSONException
|
||||
{
|
||||
if (n == 0) { return ""; }
|
||||
public String next(final int n) throws JSONException {
|
||||
if (n == 0) {
|
||||
return "";
|
||||
}
|
||||
final char[] chars = new char[n];
|
||||
int pos = 0;
|
||||
while (pos < n)
|
||||
{
|
||||
while (pos < n) {
|
||||
chars[pos] = this.next();
|
||||
if (end()) { throw syntaxError("Substring bounds error"); }
|
||||
if (end()) {
|
||||
throw syntaxError("Substring bounds error");
|
||||
}
|
||||
pos += 1;
|
||||
}
|
||||
return new String(chars);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the next char in the string, skipping whitespace.
|
||||
*
|
||||
@ -200,15 +192,15 @@ public class JSONTokener
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public char nextClean() throws JSONException
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
public char nextClean() throws JSONException {
|
||||
for (;;) {
|
||||
final char c = this.next();
|
||||
if ((c == 0) || (c > ' ')) { return c; }
|
||||
if ((c == 0) || (c > ' ')) {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the characters up to the next close quote character. Backslash processing is done. The formal JSON format
|
||||
* does not allow strings in single quotes, but an implementation is allowed to accept them.
|
||||
@ -220,23 +212,19 @@ public class JSONTokener
|
||||
*
|
||||
* @throws JSONException Unterminated string.
|
||||
*/
|
||||
public String nextString(final char quote) throws JSONException
|
||||
{
|
||||
public String nextString(final char quote) throws JSONException {
|
||||
char c;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = this.next();
|
||||
switch (c)
|
||||
{
|
||||
switch (c) {
|
||||
case 0:
|
||||
case '\n':
|
||||
case '\r':
|
||||
throw syntaxError("Unterminated string");
|
||||
case '\\':
|
||||
c = this.next();
|
||||
switch (c)
|
||||
{
|
||||
switch (c) {
|
||||
case 'b':
|
||||
sb.append('\b');
|
||||
break;
|
||||
@ -266,12 +254,14 @@ public class JSONTokener
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (c == quote) { return sb.toString(); }
|
||||
if (c == quote) {
|
||||
return sb.toString();
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the text up but not including the specified character or the end of line, whichever comes first.
|
||||
*
|
||||
@ -279,16 +269,12 @@ public class JSONTokener
|
||||
*
|
||||
* @return A string.
|
||||
*/
|
||||
public String nextTo(final char delimiter) throws JSONException
|
||||
{
|
||||
public String nextTo(final char delimiter) throws JSONException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
final char c = this.next();
|
||||
if ((c == delimiter) || (c == 0) || (c == '\n') || (c == '\r'))
|
||||
{
|
||||
if (c != 0)
|
||||
{
|
||||
if ((c == delimiter) || (c == 0) || (c == '\n') || (c == '\r')) {
|
||||
if (c != 0) {
|
||||
back();
|
||||
}
|
||||
return sb.toString().trim();
|
||||
@ -296,7 +282,7 @@ public class JSONTokener
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the text up but not including one of the specified delimiter characters or the end of line, whichever comes
|
||||
* first.
|
||||
@ -305,17 +291,13 @@ public class JSONTokener
|
||||
*
|
||||
* @return A string, trimmed.
|
||||
*/
|
||||
public String nextTo(final String delimiters) throws JSONException
|
||||
{
|
||||
public String nextTo(final String delimiters) throws JSONException {
|
||||
char c;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = this.next();
|
||||
if ((delimiters.indexOf(c) >= 0) || (c == 0) || (c == '\n') || (c == '\r'))
|
||||
{
|
||||
if (c != 0)
|
||||
{
|
||||
if ((delimiters.indexOf(c) >= 0) || (c == 0) || (c == '\n') || (c == '\r')) {
|
||||
if (c != 0) {
|
||||
back();
|
||||
}
|
||||
return sb.toString().trim();
|
||||
@ -323,7 +305,7 @@ public class JSONTokener
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the next value. The value can be a Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
|
||||
* JSONObject.NULL object.
|
||||
@ -332,12 +314,10 @@ public class JSONTokener
|
||||
*
|
||||
* @throws JSONException If syntax error.
|
||||
*/
|
||||
public Object nextValue() throws JSONException
|
||||
{
|
||||
public Object nextValue() throws JSONException {
|
||||
char c = nextClean();
|
||||
String string;
|
||||
switch (c)
|
||||
{
|
||||
switch (c) {
|
||||
case '"':
|
||||
case '\'':
|
||||
return nextString(c);
|
||||
@ -356,17 +336,18 @@ public class JSONTokener
|
||||
* formatting character.
|
||||
*/
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
while ((c >= ' ') && (",:]}/\\\"[{;=#".indexOf(c) < 0))
|
||||
{
|
||||
while ((c >= ' ') && (",:]}/\\\"[{;=#".indexOf(c) < 0)) {
|
||||
sb.append(c);
|
||||
c = this.next();
|
||||
}
|
||||
back();
|
||||
string = sb.toString().trim();
|
||||
if ("".equals(string)) { throw syntaxError("Missing value"); }
|
||||
if ("".equals(string)) {
|
||||
throw syntaxError("Missing value");
|
||||
}
|
||||
return JSONObject.stringToValue(string);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Skip characters until the next character is the requested character. If the requested character is not found, no
|
||||
* characters are skipped.
|
||||
@ -375,37 +356,30 @@ public class JSONTokener
|
||||
*
|
||||
* @return The requested character, or zero if the requested character is not found.
|
||||
*/
|
||||
public char skipTo(final char to) throws JSONException
|
||||
{
|
||||
public char skipTo(final char to) throws JSONException {
|
||||
char c;
|
||||
try
|
||||
{
|
||||
try {
|
||||
final long startIndex = index;
|
||||
final long startCharacter = character;
|
||||
final long startLine = line;
|
||||
reader.mark(1000000);
|
||||
do
|
||||
{
|
||||
do {
|
||||
c = this.next();
|
||||
if (c == 0)
|
||||
{
|
||||
if (c == 0) {
|
||||
reader.reset();
|
||||
index = startIndex;
|
||||
character = startCharacter;
|
||||
line = startLine;
|
||||
return c;
|
||||
}
|
||||
}
|
||||
while (c != to);
|
||||
}
|
||||
catch (final IOException exception)
|
||||
{
|
||||
} while (c != to);
|
||||
} catch (final IOException exception) {
|
||||
throw new JSONException(exception);
|
||||
}
|
||||
back();
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a JSONException to signal a syntax error.
|
||||
*
|
||||
@ -413,19 +387,17 @@ public class JSONTokener
|
||||
*
|
||||
* @return A JSONException object, suitable for throwing
|
||||
*/
|
||||
public JSONException syntaxError(final String message)
|
||||
{
|
||||
public JSONException syntaxError(final String message) {
|
||||
return new JSONException(message + toString());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a printable string of this JSONTokener.
|
||||
*
|
||||
* @return " at {index} [character {character} line {line}]"
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
return " at " + index + " [character " + character + " line " + line + "]";
|
||||
}
|
||||
}
|
||||
|
@ -33,8 +33,7 @@ import java.io.Writer;
|
||||
* @author JSON.org
|
||||
* @version 2011-11-24
|
||||
*/
|
||||
public class JSONWriter
|
||||
{
|
||||
public class JSONWriter {
|
||||
private static final int maxdepth = 200;
|
||||
/**
|
||||
* The writer that will receive the output.
|
||||
@ -56,19 +55,18 @@ public class JSONWriter
|
||||
* The stack top index. A value of 0 indicates that the stack is empty.
|
||||
*/
|
||||
private int top;
|
||||
|
||||
|
||||
/**
|
||||
* Make a fresh JSONWriter. It can be used to build one JSON text.
|
||||
*/
|
||||
public JSONWriter(final Writer w)
|
||||
{
|
||||
public JSONWriter(final Writer w) {
|
||||
comma = false;
|
||||
mode = 'i';
|
||||
stack = new JSONObject[maxdepth];
|
||||
top = 0;
|
||||
writer = w;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append a value.
|
||||
*
|
||||
@ -78,25 +76,20 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If the value is out of sequence.
|
||||
*/
|
||||
private JSONWriter append(final String string) throws JSONException
|
||||
{
|
||||
if (string == null) { throw new JSONException("Null pointer"); }
|
||||
if ((mode == 'o') || (mode == 'a'))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (comma && (mode == 'a'))
|
||||
{
|
||||
private JSONWriter append(final String string) throws JSONException {
|
||||
if (string == null) {
|
||||
throw new JSONException("Null pointer");
|
||||
}
|
||||
if ((mode == 'o') || (mode == 'a')) {
|
||||
try {
|
||||
if (comma && (mode == 'a')) {
|
||||
writer.write(',');
|
||||
}
|
||||
writer.write(string);
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
} catch (final IOException e) {
|
||||
throw new JSONException(e);
|
||||
}
|
||||
if (mode == 'o')
|
||||
{
|
||||
if (mode == 'o') {
|
||||
mode = 'k';
|
||||
}
|
||||
comma = true;
|
||||
@ -104,7 +97,7 @@ public class JSONWriter
|
||||
}
|
||||
throw new JSONException("Value out of sequence.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Begin appending a new array. All values until the balancing <code>endArray</code> will be appended to this array.
|
||||
* The <code>endArray</code> method must be called to mark the array's end.
|
||||
@ -114,10 +107,8 @@ public class JSONWriter
|
||||
* @throws JSONException If the nesting is too deep, or if the object is started in the wrong place (for example as
|
||||
* a key or after the end of the outermost array or object).
|
||||
*/
|
||||
public JSONWriter array() throws JSONException
|
||||
{
|
||||
if ((mode == 'i') || (mode == 'o') || (mode == 'a'))
|
||||
{
|
||||
public JSONWriter array() throws JSONException {
|
||||
if ((mode == 'i') || (mode == 'o') || (mode == 'a')) {
|
||||
push(null);
|
||||
append("[");
|
||||
comma = false;
|
||||
@ -125,7 +116,7 @@ public class JSONWriter
|
||||
}
|
||||
throw new JSONException("Misplaced array.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* End something.
|
||||
*
|
||||
@ -136,22 +127,20 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If unbalanced.
|
||||
*/
|
||||
private JSONWriter end(final char mode, final char c) throws JSONException
|
||||
{
|
||||
if (this.mode != mode) { throw new JSONException(mode == 'a' ? "Misplaced endArray." : "Misplaced endObject."); }
|
||||
pop(mode);
|
||||
try
|
||||
{
|
||||
writer.write(c);
|
||||
private JSONWriter end(final char mode, final char c) throws JSONException {
|
||||
if (this.mode != mode) {
|
||||
throw new JSONException(mode == 'a' ? "Misplaced endArray." : "Misplaced endObject.");
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
pop(mode);
|
||||
try {
|
||||
writer.write(c);
|
||||
} catch (final IOException e) {
|
||||
throw new JSONException(e);
|
||||
}
|
||||
comma = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* End an array. This method most be called to balance calls to <code>array</code>.
|
||||
*
|
||||
@ -159,11 +148,10 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If incorrectly nested.
|
||||
*/
|
||||
public JSONWriter endArray() throws JSONException
|
||||
{
|
||||
public JSONWriter endArray() throws JSONException {
|
||||
return end('a', ']');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* End an object. This method most be called to balance calls to <code>object</code>.
|
||||
*
|
||||
@ -171,11 +159,10 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If incorrectly nested.
|
||||
*/
|
||||
public JSONWriter endObject() throws JSONException
|
||||
{
|
||||
public JSONWriter endObject() throws JSONException {
|
||||
return end('k', '}');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append a key. The key will be associated with the next value. In an object, every value must be preceded by a
|
||||
* key.
|
||||
@ -187,16 +174,14 @@ public class JSONWriter
|
||||
* @throws JSONException If the key is out of place. For example, keys do not belong in arrays or if the key is
|
||||
* null.
|
||||
*/
|
||||
public JSONWriter key(final String string) throws JSONException
|
||||
{
|
||||
if (string == null) { throw new JSONException("Null key."); }
|
||||
if (mode == 'k')
|
||||
{
|
||||
try
|
||||
{
|
||||
public JSONWriter key(final String string) throws JSONException {
|
||||
if (string == null) {
|
||||
throw new JSONException("Null key.");
|
||||
}
|
||||
if (mode == 'k') {
|
||||
try {
|
||||
stack[top - 1].putOnce(string, Boolean.TRUE);
|
||||
if (comma)
|
||||
{
|
||||
if (comma) {
|
||||
writer.write(',');
|
||||
}
|
||||
writer.write(JSONObject.quote(string));
|
||||
@ -204,15 +189,13 @@ public class JSONWriter
|
||||
comma = false;
|
||||
mode = 'o';
|
||||
return this;
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
} catch (final IOException e) {
|
||||
throw new JSONException(e);
|
||||
}
|
||||
}
|
||||
throw new JSONException("Misplaced key.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Begin appending a new object. All keys and values until the balancing <code>endObject</code> will be appended to
|
||||
* this object. The <code>endObject</code> method must be called to mark the object's end.
|
||||
@ -222,14 +205,11 @@ public class JSONWriter
|
||||
* @throws JSONException If the nesting is too deep, or if the object is started in the wrong place (for example as
|
||||
* a key or after the end of the outermost array or object).
|
||||
*/
|
||||
public JSONWriter object() throws JSONException
|
||||
{
|
||||
if (mode == 'i')
|
||||
{
|
||||
public JSONWriter object() throws JSONException {
|
||||
if (mode == 'i') {
|
||||
mode = 'o';
|
||||
}
|
||||
if ((mode == 'o') || (mode == 'a'))
|
||||
{
|
||||
if ((mode == 'o') || (mode == 'a')) {
|
||||
append("{");
|
||||
push(new JSONObject());
|
||||
comma = false;
|
||||
@ -237,7 +217,7 @@ public class JSONWriter
|
||||
}
|
||||
throw new JSONException("Misplaced object.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Pop an array or object scope.
|
||||
*
|
||||
@ -245,15 +225,18 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If nesting is wrong.
|
||||
*/
|
||||
private void pop(final char c) throws JSONException
|
||||
{
|
||||
if (top <= 0) { throw new JSONException("Nesting error."); }
|
||||
private void pop(final char c) throws JSONException {
|
||||
if (top <= 0) {
|
||||
throw new JSONException("Nesting error.");
|
||||
}
|
||||
final char m = stack[top - 1] == null ? 'a' : 'k';
|
||||
if (m != c) { throw new JSONException("Nesting error."); }
|
||||
if (m != c) {
|
||||
throw new JSONException("Nesting error.");
|
||||
}
|
||||
top -= 1;
|
||||
mode = top == 0 ? 'd' : stack[top - 1] == null ? 'a' : 'k';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Push an array or object scope.
|
||||
*
|
||||
@ -261,14 +244,15 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If nesting is too deep.
|
||||
*/
|
||||
private void push(final JSONObject jo) throws JSONException
|
||||
{
|
||||
if (top >= maxdepth) { throw new JSONException("Nesting too deep."); }
|
||||
private void push(final JSONObject jo) throws JSONException {
|
||||
if (top >= maxdepth) {
|
||||
throw new JSONException("Nesting too deep.");
|
||||
}
|
||||
stack[top] = jo;
|
||||
mode = jo == null ? 'a' : 'k';
|
||||
top += 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append either the value <code>true</code> or the value <code>false</code> .
|
||||
*
|
||||
@ -278,11 +262,10 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public JSONWriter value(final boolean b) throws JSONException
|
||||
{
|
||||
public JSONWriter value(final boolean b) throws JSONException {
|
||||
return append(b ? "true" : "false");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append a double value.
|
||||
*
|
||||
@ -292,11 +275,10 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If the number is not finite.
|
||||
*/
|
||||
public JSONWriter value(final double d) throws JSONException
|
||||
{
|
||||
public JSONWriter value(final double d) throws JSONException {
|
||||
return this.value(new Double(d));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append a long value.
|
||||
*
|
||||
@ -306,11 +288,10 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public JSONWriter value(final long l) throws JSONException
|
||||
{
|
||||
public JSONWriter value(final long l) throws JSONException {
|
||||
return append(Long.toString(l));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Append an object value.
|
||||
*
|
||||
@ -321,8 +302,7 @@ public class JSONWriter
|
||||
*
|
||||
* @throws JSONException If the value is out of sequence.
|
||||
*/
|
||||
public JSONWriter value(final Object object) throws JSONException
|
||||
{
|
||||
public JSONWriter value(final Object object) throws JSONException {
|
||||
return append(JSONObject.valueToString(object));
|
||||
}
|
||||
}
|
||||
|
@ -26,8 +26,7 @@ package com.intellectualcrafters.json;
|
||||
*
|
||||
* @version 2013-04-18
|
||||
*/
|
||||
public class Kim
|
||||
{
|
||||
public class Kim {
|
||||
/**
|
||||
* The number of bytes in the kim. The number of bytes can be as much as three times the number of characters.
|
||||
*/
|
||||
@ -44,7 +43,7 @@ public class Kim
|
||||
* The memoization of toString().
|
||||
*/
|
||||
private String string = null;
|
||||
|
||||
|
||||
/**
|
||||
* Make a kim from a portion of a byte array.
|
||||
*
|
||||
@ -52,8 +51,7 @@ public class Kim
|
||||
* @param from The index of the first byte.
|
||||
* @param thru The index of the last byte plus one.
|
||||
*/
|
||||
public Kim(final byte[] bytes, final int from, final int thru)
|
||||
{
|
||||
public Kim(final byte[] bytes, final int from, final int thru) {
|
||||
// As the bytes are copied into the new kim, a hashcode is computed
|
||||
// using a
|
||||
// modified Fletcher code.
|
||||
@ -61,11 +59,9 @@ public class Kim
|
||||
int value;
|
||||
hashcode = 0;
|
||||
length = thru - from;
|
||||
if (length > 0)
|
||||
{
|
||||
if (length > 0) {
|
||||
this.bytes = new byte[length];
|
||||
for (int at = 0; at < length; at += 1)
|
||||
{
|
||||
for (int at = 0; at < length; at += 1) {
|
||||
value = bytes[at + from] & 0xFF;
|
||||
sum += value;
|
||||
hashcode += sum;
|
||||
@ -74,18 +70,17 @@ public class Kim
|
||||
hashcode += sum << 16;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a kim from a byte array.
|
||||
*
|
||||
* @param bytes The byte array.
|
||||
* @param length The number of bytes.
|
||||
*/
|
||||
public Kim(final byte[] bytes, final int length)
|
||||
{
|
||||
public Kim(final byte[] bytes, final int length) {
|
||||
this(bytes, 0, length);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a new kim from a substring of an existing kim. The coordinates are in byte units, not character units.
|
||||
*
|
||||
@ -93,11 +88,10 @@ public class Kim
|
||||
* @param from The point at which to take bytes.
|
||||
* @param thru The point at which to stop taking bytes.
|
||||
*/
|
||||
public Kim(final Kim kim, final int from, final int thru)
|
||||
{
|
||||
public Kim(final Kim kim, final int from, final int thru) {
|
||||
this(kim.bytes, from, thru);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a kim from a string.
|
||||
*
|
||||
@ -105,33 +99,26 @@ public class Kim
|
||||
*
|
||||
* @throws JSONException if surrogate pair mismatch.
|
||||
*/
|
||||
public Kim(final String string) throws JSONException
|
||||
{
|
||||
public Kim(final String string) throws JSONException {
|
||||
final int stringLength = string.length();
|
||||
hashcode = 0;
|
||||
length = 0;
|
||||
// First pass: Determine the length of the kim, allowing for the UTF-16
|
||||
// to UTF-32 conversion, and then the UTF-32 to Kim conversion.
|
||||
if (stringLength > 0)
|
||||
{
|
||||
for (int i = 0; i < stringLength; i += 1)
|
||||
{
|
||||
if (stringLength > 0) {
|
||||
for (int i = 0; i < stringLength; i += 1) {
|
||||
final int c = string.charAt(i);
|
||||
if (c <= 0x7F)
|
||||
{
|
||||
if (c <= 0x7F) {
|
||||
length += 1;
|
||||
}
|
||||
else if (c <= 0x3FFF)
|
||||
{
|
||||
} else if (c <= 0x3FFF) {
|
||||
length += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((c >= 0xD800) && (c <= 0xDFFF))
|
||||
{
|
||||
} else {
|
||||
if ((c >= 0xD800) && (c <= 0xDFFF)) {
|
||||
i += 1;
|
||||
final int d = string.charAt(i);
|
||||
if ((c > 0xDBFF) || (d < 0xDC00) || (d > 0xDFFF)) { throw new JSONException("Bad UTF16"); }
|
||||
if ((c > 0xDBFF) || (d < 0xDC00) || (d > 0xDFFF)) {
|
||||
throw new JSONException("Bad UTF16");
|
||||
}
|
||||
}
|
||||
length += 3;
|
||||
}
|
||||
@ -143,18 +130,14 @@ public class Kim
|
||||
int at = 0;
|
||||
int b;
|
||||
int sum = 1;
|
||||
for (int i = 0; i < stringLength; i += 1)
|
||||
{
|
||||
for (int i = 0; i < stringLength; i += 1) {
|
||||
int character = string.charAt(i);
|
||||
if (character <= 0x7F)
|
||||
{
|
||||
if (character <= 0x7F) {
|
||||
bytes[at] = (byte) character;
|
||||
sum += character;
|
||||
hashcode += sum;
|
||||
at += 1;
|
||||
}
|
||||
else if (character <= 0x3FFF)
|
||||
{
|
||||
} else if (character <= 0x3FFF) {
|
||||
b = 0x80 | (character >>> 7);
|
||||
bytes[at] = (byte) b;
|
||||
sum += b;
|
||||
@ -165,11 +148,8 @@ public class Kim
|
||||
sum += b;
|
||||
hashcode += sum;
|
||||
at += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((character >= 0xD800) && (character <= 0xDBFF))
|
||||
{
|
||||
} else {
|
||||
if ((character >= 0xD800) && (character <= 0xDBFF)) {
|
||||
i += 1;
|
||||
character = (((character & 0x3FF) << 10) | (string.charAt(i) & 0x3FF)) + 65536;
|
||||
}
|
||||
@ -193,7 +173,7 @@ public class Kim
|
||||
hashcode += sum << 16;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the number of bytes needed to contain the character in Kim format.
|
||||
*
|
||||
@ -203,12 +183,13 @@ public class Kim
|
||||
*
|
||||
* @throws JSONException if the character is not representable in a kim.
|
||||
*/
|
||||
public static int characterSize(final int character) throws JSONException
|
||||
{
|
||||
if ((character < 0) || (character > 0x10FFFF)) { throw new JSONException("Bad character " + character); }
|
||||
public static int characterSize(final int character) throws JSONException {
|
||||
if ((character < 0) || (character > 0x10FFFF)) {
|
||||
throw new JSONException("Bad character " + character);
|
||||
}
|
||||
return character <= 0x7F ? 1 : character <= 0x3FFF ? 2 : 3;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the character at the specified index. The index refers to byte values and ranges from 0 to length - 1.
|
||||
* The index of the next character is at index + Kim.characterSize(kim.characterAt(index)).
|
||||
@ -218,26 +199,28 @@ public class Kim
|
||||
* @throws JSONException if at does not point to a valid character.
|
||||
* @return a Unicode character between 0 and 0x10FFFF.
|
||||
*/
|
||||
public int characterAt(final int at) throws JSONException
|
||||
{
|
||||
public int characterAt(final int at) throws JSONException {
|
||||
final int c = get(at);
|
||||
if ((c & 0x80) == 0) { return c; }
|
||||
if ((c & 0x80) == 0) {
|
||||
return c;
|
||||
}
|
||||
int character;
|
||||
final int c1 = get(at + 1);
|
||||
if ((c1 & 0x80) == 0)
|
||||
{
|
||||
if ((c1 & 0x80) == 0) {
|
||||
character = ((c & 0x7F) << 7) | c1;
|
||||
if (character > 0x7F) { return character; }
|
||||
}
|
||||
else
|
||||
{
|
||||
if (character > 0x7F) {
|
||||
return character;
|
||||
}
|
||||
} else {
|
||||
final int c2 = get(at + 2);
|
||||
character = ((c & 0x7F) << 14) | ((c1 & 0x7F) << 7) | c2;
|
||||
if (((c2 & 0x80) == 0) && (character > 0x3FFF) && (character <= 0x10FFFF) && ((character < 0xD800) || (character > 0xDFFF))) { return character; }
|
||||
if (((c2 & 0x80) == 0) && (character > 0x3FFF) && (character <= 0x10FFFF) && ((character < 0xD800) || (character > 0xDFFF))) {
|
||||
return character;
|
||||
}
|
||||
}
|
||||
throw new JSONException("Bad character at " + at);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Copy the contents of this kim to a byte array.
|
||||
*
|
||||
@ -246,12 +229,11 @@ public class Kim
|
||||
*
|
||||
* @return The position immediately after the copy.
|
||||
*/
|
||||
public int copy(final byte[] bytes, final int at)
|
||||
{
|
||||
public int copy(final byte[] bytes, final int at) {
|
||||
System.arraycopy(this.bytes, 0, bytes, at, length);
|
||||
return at + length;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Two kim objects containing exactly the same bytes in the same order are equal to each other.
|
||||
*
|
||||
@ -260,15 +242,20 @@ public class Kim
|
||||
* @return true if this and obj are both kim objects containing identical byte sequences.
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(final Object obj)
|
||||
{
|
||||
if (!(obj instanceof Kim)) { return false; }
|
||||
public boolean equals(final Object obj) {
|
||||
if (!(obj instanceof Kim)) {
|
||||
return false;
|
||||
}
|
||||
final Kim that = (Kim) obj;
|
||||
if (this == that) { return true; }
|
||||
if (hashcode != that.hashcode) { return false; }
|
||||
if (this == that) {
|
||||
return true;
|
||||
}
|
||||
if (hashcode != that.hashcode) {
|
||||
return false;
|
||||
}
|
||||
return java.util.Arrays.equals(bytes, that.bytes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a byte from a kim.
|
||||
*
|
||||
@ -278,21 +265,21 @@ public class Kim
|
||||
*
|
||||
* @throws JSONException if there is no byte at that position.
|
||||
*/
|
||||
public int get(final int at) throws JSONException
|
||||
{
|
||||
if ((at < 0) || (at > length)) { throw new JSONException("Bad character at " + at); }
|
||||
public int get(final int at) throws JSONException {
|
||||
if ((at < 0) || (at > length)) {
|
||||
throw new JSONException("Bad character at " + at);
|
||||
}
|
||||
return (bytes[at]) & 0xFF;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a hash code value for the kim.
|
||||
*/
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
public int hashCode() {
|
||||
return hashcode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a UTF-16 String from this kim. The number of codepoints in the string will not be greater than the number
|
||||
* of bytes in the kim, although it could be less.
|
||||
@ -302,23 +289,17 @@ public class Kim
|
||||
* @throws JSONException if the kim is not valid.
|
||||
*/
|
||||
@Override
|
||||
public String toString() throws JSONException
|
||||
{
|
||||
if (string == null)
|
||||
{
|
||||
public String toString() throws JSONException {
|
||||
if (string == null) {
|
||||
int c;
|
||||
int length = 0;
|
||||
final char chars[] = new char[this.length];
|
||||
for (int at = 0; at < this.length; at += characterSize(c))
|
||||
{
|
||||
for (int at = 0; at < this.length; at += characterSize(c)) {
|
||||
c = characterAt(at);
|
||||
if (c < 0x10000)
|
||||
{
|
||||
if (c < 0x10000) {
|
||||
chars[length] = (char) c;
|
||||
length += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
chars[length] = (char) (0xD800 | ((c - 0x10000) >>> 10));
|
||||
length += 1;
|
||||
chars[length] = (char) (0xDC00 | (c & 0x03FF));
|
||||
|
@ -30,8 +30,7 @@ import java.util.Properties;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class Property
|
||||
{
|
||||
public class Property {
|
||||
/**
|
||||
* Converts a property file object into a JSONObject. The property file object is a table of name value pairs.
|
||||
*
|
||||
@ -41,21 +40,18 @@ public class Property
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONObject toJSONObject(final java.util.Properties properties) throws JSONException
|
||||
{
|
||||
public static JSONObject toJSONObject(final java.util.Properties properties) throws JSONException {
|
||||
final JSONObject jo = new JSONObject();
|
||||
if ((properties != null) && !properties.isEmpty())
|
||||
{
|
||||
if ((properties != null) && !properties.isEmpty()) {
|
||||
final Enumeration enumProperties = properties.propertyNames();
|
||||
while (enumProperties.hasMoreElements())
|
||||
{
|
||||
while (enumProperties.hasMoreElements()) {
|
||||
final String name = (String) enumProperties.nextElement();
|
||||
jo.put(name, properties.getProperty(name));
|
||||
}
|
||||
}
|
||||
return jo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Converts the JSONObject into a property file object.
|
||||
*
|
||||
@ -65,14 +61,11 @@ public class Property
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static Properties toProperties(final JSONObject jo) throws JSONException
|
||||
{
|
||||
public static Properties toProperties(final JSONObject jo) throws JSONException {
|
||||
final Properties properties = new Properties();
|
||||
if (jo != null)
|
||||
{
|
||||
if (jo != null) {
|
||||
final Iterator<String> keys = jo.keys();
|
||||
while (keys.hasNext())
|
||||
{
|
||||
while (keys.hasNext()) {
|
||||
final String name = keys.next();
|
||||
properties.put(name, jo.getString(name));
|
||||
}
|
||||
|
@ -8,8 +8,7 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class XML
|
||||
{
|
||||
public class XML {
|
||||
public static final Character AMP = '&';
|
||||
public static final Character APOS = '\'';
|
||||
public static final Character BANG = '!';
|
||||
@ -19,15 +18,12 @@ public class XML
|
||||
public static final Character QUEST = '?';
|
||||
public static final Character QUOT = '"';
|
||||
public static final Character SLASH = '/';
|
||||
|
||||
public static String escape(final String string)
|
||||
{
|
||||
|
||||
public static String escape(final String string) {
|
||||
final StringBuilder sb = new StringBuilder(string.length());
|
||||
for (int i = 0, length = string.length(); i < length; i++)
|
||||
{
|
||||
for (int i = 0, length = string.length(); i < length; i++) {
|
||||
final char c = string.charAt(i);
|
||||
switch (c)
|
||||
{
|
||||
switch (c) {
|
||||
case '&':
|
||||
sb.append("&");
|
||||
break;
|
||||
@ -49,7 +45,7 @@ public class XML
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Throw an exception if the string contains whitespace. Whitespace is not allowed in tagNames and attributes.
|
||||
*
|
||||
@ -57,17 +53,19 @@ public class XML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static void noSpace(final String string) throws JSONException
|
||||
{
|
||||
public static void noSpace(final String string) throws JSONException {
|
||||
int i;
|
||||
final int length = string.length();
|
||||
if (length == 0) { throw new JSONException("Empty string."); }
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
if (Character.isWhitespace(string.charAt(i))) { throw new JSONException("'" + string + "' contains a space character."); }
|
||||
if (length == 0) {
|
||||
throw new JSONException("Empty string.");
|
||||
}
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (Character.isWhitespace(string.charAt(i))) {
|
||||
throw new JSONException("'" + string + "' contains a space character.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Scan the content following the named tag, attaching it to the context.
|
||||
*
|
||||
@ -79,8 +77,7 @@ public class XML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
private static boolean parse(final XMLTokener x, final JSONObject context, final String name) throws JSONException
|
||||
{
|
||||
private static boolean parse(final XMLTokener x, final JSONObject context, final String name) throws JSONException {
|
||||
char c;
|
||||
int i;
|
||||
JSONObject jsonobject = null;
|
||||
@ -98,28 +95,20 @@ public class XML
|
||||
// <<
|
||||
token = x.nextToken();
|
||||
// <!
|
||||
if (token == BANG)
|
||||
{
|
||||
if (token == BANG) {
|
||||
c = x.next();
|
||||
if (c == '-')
|
||||
{
|
||||
if (x.next() == '-')
|
||||
{
|
||||
if (c == '-') {
|
||||
if (x.next() == '-') {
|
||||
x.skipPast("-->");
|
||||
return false;
|
||||
}
|
||||
x.back();
|
||||
}
|
||||
else if (c == '[')
|
||||
{
|
||||
} else if (c == '[') {
|
||||
token = x.nextToken();
|
||||
if ("CDATA".equals(token))
|
||||
{
|
||||
if (x.next() == '[')
|
||||
{
|
||||
if ("CDATA".equals(token)) {
|
||||
if (x.next() == '[') {
|
||||
string = x.nextCDATA();
|
||||
if (string.length() > 0)
|
||||
{
|
||||
if (string.length() > 0) {
|
||||
context.accumulate("content", string);
|
||||
}
|
||||
return false;
|
||||
@ -128,136 +117,105 @@ public class XML
|
||||
throw x.syntaxError("Expected 'CDATA['");
|
||||
}
|
||||
i = 1;
|
||||
do
|
||||
{
|
||||
do {
|
||||
token = x.nextMeta();
|
||||
if (token == null)
|
||||
{
|
||||
if (token == null) {
|
||||
throw x.syntaxError("Missing '>' after '<!'.");
|
||||
}
|
||||
else if (token == LT)
|
||||
{
|
||||
} else if (token == LT) {
|
||||
i += 1;
|
||||
}
|
||||
else if (token == GT)
|
||||
{
|
||||
} else if (token == GT) {
|
||||
i -= 1;
|
||||
}
|
||||
}
|
||||
while (i > 0);
|
||||
} while (i > 0);
|
||||
return false;
|
||||
}
|
||||
else if (token == QUEST)
|
||||
{
|
||||
} else if (token == QUEST) {
|
||||
// <?
|
||||
x.skipPast("?>");
|
||||
return false;
|
||||
}
|
||||
else if (token == SLASH)
|
||||
{
|
||||
} else if (token == SLASH) {
|
||||
// Close tag </
|
||||
token = x.nextToken();
|
||||
if (name == null) { throw x.syntaxError("Mismatched close tag " + token); }
|
||||
if (!token.equals(name)) { throw x.syntaxError("Mismatched " + name + " and " + token); }
|
||||
if (x.nextToken() != GT) { throw x.syntaxError("Misshaped close tag"); }
|
||||
if (name == null) {
|
||||
throw x.syntaxError("Mismatched close tag " + token);
|
||||
}
|
||||
if (!token.equals(name)) {
|
||||
throw x.syntaxError("Mismatched " + name + " and " + token);
|
||||
}
|
||||
if (x.nextToken() != GT) {
|
||||
throw x.syntaxError("Misshaped close tag");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (token instanceof Character)
|
||||
{
|
||||
} else if (token instanceof Character) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
// Open tag <
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
tagName = (String) token;
|
||||
token = null;
|
||||
jsonobject = new JSONObject();
|
||||
for (;;)
|
||||
{
|
||||
if (token == null)
|
||||
{
|
||||
for (;;) {
|
||||
if (token == null) {
|
||||
token = x.nextToken();
|
||||
}
|
||||
// attribute = value
|
||||
if (token instanceof String)
|
||||
{
|
||||
if (token instanceof String) {
|
||||
string = (String) token;
|
||||
token = x.nextToken();
|
||||
if (token == EQ)
|
||||
{
|
||||
if (token == EQ) {
|
||||
token = x.nextToken();
|
||||
if (!(token instanceof String)) { throw x.syntaxError("Missing value"); }
|
||||
if (!(token instanceof String)) {
|
||||
throw x.syntaxError("Missing value");
|
||||
}
|
||||
jsonobject.accumulate(string, XML.stringToValue((String) token));
|
||||
token = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
jsonobject.accumulate(string, "");
|
||||
}
|
||||
// Empty tag <.../>
|
||||
}
|
||||
else if (token == SLASH)
|
||||
{
|
||||
if (x.nextToken() != GT) { throw x.syntaxError("Misshaped tag"); }
|
||||
if (jsonobject.length() > 0)
|
||||
{
|
||||
context.accumulate(tagName, jsonobject);
|
||||
} else if (token == SLASH) {
|
||||
if (x.nextToken() != GT) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (jsonobject.length() > 0) {
|
||||
context.accumulate(tagName, jsonobject);
|
||||
} else {
|
||||
context.accumulate(tagName, "");
|
||||
}
|
||||
return false;
|
||||
// Content, between <...> and </...>
|
||||
}
|
||||
else if (token == GT)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
} else if (token == GT) {
|
||||
for (;;) {
|
||||
token = x.nextContent();
|
||||
if (token == null)
|
||||
{
|
||||
if (tagName != null) { throw x.syntaxError("Unclosed tag " + tagName); }
|
||||
if (token == null) {
|
||||
if (tagName != null) {
|
||||
throw x.syntaxError("Unclosed tag " + tagName);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (token instanceof String)
|
||||
{
|
||||
} else if (token instanceof String) {
|
||||
string = (String) token;
|
||||
if (string.length() > 0)
|
||||
{
|
||||
if (string.length() > 0) {
|
||||
jsonobject.accumulate("content", XML.stringToValue(string));
|
||||
}
|
||||
// Nested element
|
||||
}
|
||||
else if (token == LT)
|
||||
{
|
||||
if (parse(x, jsonobject, tagName))
|
||||
{
|
||||
if (jsonobject.length() == 0)
|
||||
{
|
||||
} else if (token == LT) {
|
||||
if (parse(x, jsonobject, tagName)) {
|
||||
if (jsonobject.length() == 0) {
|
||||
context.accumulate(tagName, "");
|
||||
}
|
||||
else if ((jsonobject.length() == 1) && (jsonobject.opt("content") != null))
|
||||
{
|
||||
} else if ((jsonobject.length() == 1) && (jsonobject.opt("content") != null)) {
|
||||
context.accumulate(tagName, jsonobject.opt("content"));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
context.accumulate(tagName, jsonobject);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Try to convert a string into a number, boolean, or null. If the string can't be converted, return the string.
|
||||
* This is much less ambitious than JSONObject.stringToValue, especially because it does not attempt to convert plus
|
||||
@ -267,47 +225,47 @@ public class XML
|
||||
*
|
||||
* @return A simple JSON value.
|
||||
*/
|
||||
public static Object stringToValue(final String string)
|
||||
{
|
||||
if ("true".equalsIgnoreCase(string)) { return Boolean.TRUE; }
|
||||
if ("false".equalsIgnoreCase(string)) { return Boolean.FALSE; }
|
||||
if ("null".equalsIgnoreCase(string)) { return JSONObject.NULL; }
|
||||
public static Object stringToValue(final String string) {
|
||||
if ("true".equalsIgnoreCase(string)) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
if ("false".equalsIgnoreCase(string)) {
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
if ("null".equalsIgnoreCase(string)) {
|
||||
return JSONObject.NULL;
|
||||
}
|
||||
// If it might be a number, try converting it, first as a Long, and then
|
||||
// as a
|
||||
// Double. If that doesn't work, return the string.
|
||||
try
|
||||
{
|
||||
try {
|
||||
final char initial = string.charAt(0);
|
||||
if ((initial == '-') || ((initial >= '0') && (initial <= '9')))
|
||||
{
|
||||
if ((initial == '-') || ((initial >= '0') && (initial <= '9'))) {
|
||||
final Long value = new Long(string);
|
||||
if (value.toString().equals(string)) { return value; }
|
||||
if (value.toString().equals(string)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (final Exception ignore)
|
||||
{
|
||||
try
|
||||
{
|
||||
} catch (final Exception ignore) {
|
||||
try {
|
||||
final Double value = new Double(string);
|
||||
if (value.toString().equals(string)) { return value; }
|
||||
}
|
||||
catch (final Exception ignoreAlso)
|
||||
{}
|
||||
if (value.toString().equals(string)) {
|
||||
return value;
|
||||
}
|
||||
} catch (final Exception ignoreAlso) {}
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException
|
||||
{
|
||||
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException {
|
||||
final JSONObject jo = new JSONObject();
|
||||
final XMLTokener x = new XMLTokener(string);
|
||||
while (x.more() && x.skipPast("<"))
|
||||
{
|
||||
while (x.more() && x.skipPast("<")) {
|
||||
parse(x, jo, null);
|
||||
}
|
||||
return jo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a JSONObject into a well-formed, element-normal XML string.
|
||||
*
|
||||
@ -317,11 +275,10 @@ public class XML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final Object object) throws JSONException
|
||||
{
|
||||
public static String toString(final Object object) throws JSONException {
|
||||
return toString(object, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a JSONObject into a well-formed, element-normal XML string.
|
||||
*
|
||||
@ -332,8 +289,7 @@ public class XML
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(Object object, final String tagName) throws JSONException
|
||||
{
|
||||
public static String toString(Object object, final String tagName) throws JSONException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
int i;
|
||||
JSONArray ja;
|
||||
@ -343,11 +299,9 @@ public class XML
|
||||
int length;
|
||||
String string;
|
||||
Object value;
|
||||
if (object instanceof JSONObject)
|
||||
{
|
||||
if (object instanceof JSONObject) {
|
||||
// Emit <tagName>
|
||||
if (tagName != null)
|
||||
{
|
||||
if (tagName != null) {
|
||||
sb.append('<');
|
||||
sb.append(tagName);
|
||||
sb.append('>');
|
||||
@ -355,46 +309,34 @@ public class XML
|
||||
// Loop thru the keys.
|
||||
jo = (JSONObject) object;
|
||||
keys = jo.keys();
|
||||
while (keys.hasNext())
|
||||
{
|
||||
while (keys.hasNext()) {
|
||||
key = keys.next();
|
||||
value = jo.opt(key);
|
||||
if (value == null)
|
||||
{
|
||||
if (value == null) {
|
||||
value = "";
|
||||
}
|
||||
string = value instanceof String ? (String) value : null;
|
||||
// Emit content in body
|
||||
if ("content".equals(key))
|
||||
{
|
||||
if (value instanceof JSONArray)
|
||||
{
|
||||
if ("content".equals(key)) {
|
||||
if (value instanceof JSONArray) {
|
||||
ja = (JSONArray) value;
|
||||
length = ja.length();
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (i > 0) {
|
||||
sb.append('\n');
|
||||
}
|
||||
sb.append(escape(ja.get(i).toString()));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append(escape(value.toString()));
|
||||
}
|
||||
// Emit an array of similar keys
|
||||
}
|
||||
else if (value instanceof JSONArray)
|
||||
{
|
||||
} else if (value instanceof JSONArray) {
|
||||
ja = (JSONArray) value;
|
||||
length = ja.length();
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
for (i = 0; i < length; i += 1) {
|
||||
value = ja.get(i);
|
||||
if (value instanceof JSONArray)
|
||||
{
|
||||
if (value instanceof JSONArray) {
|
||||
sb.append('<');
|
||||
sb.append(key);
|
||||
sb.append('>');
|
||||
@ -402,27 +344,20 @@ public class XML
|
||||
sb.append("</");
|
||||
sb.append(key);
|
||||
sb.append('>');
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append(toString(value, key));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ("".equals(value))
|
||||
{
|
||||
} else if ("".equals(value)) {
|
||||
sb.append('<');
|
||||
sb.append(key);
|
||||
sb.append("/>");
|
||||
// Emit a new tag <k>
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append(toString(value, key));
|
||||
}
|
||||
}
|
||||
if (tagName != null)
|
||||
{
|
||||
if (tagName != null) {
|
||||
// Emit the </tagname> close tag
|
||||
sb.append("</");
|
||||
sb.append(tagName);
|
||||
@ -432,25 +367,18 @@ public class XML
|
||||
// XML does not have good support for arrays. If an array appears in
|
||||
// a place
|
||||
// where XML is lacking, synthesize an <array> element.
|
||||
}
|
||||
else
|
||||
{
|
||||
if (object.getClass().isArray())
|
||||
{
|
||||
} else {
|
||||
if (object.getClass().isArray()) {
|
||||
object = new JSONArray(object);
|
||||
}
|
||||
if (object instanceof JSONArray)
|
||||
{
|
||||
if (object instanceof JSONArray) {
|
||||
ja = (JSONArray) object;
|
||||
length = ja.length();
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
for (i = 0; i < length; i += 1) {
|
||||
sb.append(toString(ja.opt(i), tagName == null ? "array" : tagName));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
string = (object == null) ? "null" : escape(object.toString());
|
||||
return (tagName == null) ? "\"" + string + "\"" : (string.length() == 0) ? "<" + tagName + "/>" : "<" + tagName + ">" + string + "</" + tagName + ">";
|
||||
}
|
||||
|
@ -6,14 +6,12 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class XMLTokener extends JSONTokener
|
||||
{
|
||||
public class XMLTokener extends JSONTokener {
|
||||
/**
|
||||
* The table of entity values. It initially contains Character values for amp, apos, gt, lt, quot.
|
||||
*/
|
||||
public static final java.util.HashMap<String, Character> entity;
|
||||
static
|
||||
{
|
||||
static {
|
||||
entity = new java.util.HashMap<String, Character>(8);
|
||||
entity.put("amp", XML.AMP);
|
||||
entity.put("apos", XML.APOS);
|
||||
@ -21,17 +19,16 @@ public class XMLTokener extends JSONTokener
|
||||
entity.put("lt", XML.LT);
|
||||
entity.put("quot", XML.QUOT);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct an XMLTokener from a string.
|
||||
*
|
||||
* @param s A source string.
|
||||
*/
|
||||
public XMLTokener(final String s)
|
||||
{
|
||||
public XMLTokener(final String s) {
|
||||
super(s);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the text in the CDATA block.
|
||||
*
|
||||
@ -39,25 +36,24 @@ public class XMLTokener extends JSONTokener
|
||||
*
|
||||
* @throws JSONException If the <code>]]></code> is not found.
|
||||
*/
|
||||
public String nextCDATA() throws JSONException
|
||||
{
|
||||
public String nextCDATA() throws JSONException {
|
||||
char c;
|
||||
int i;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = next();
|
||||
if (end()) { throw syntaxError("Unclosed CDATA"); }
|
||||
if (end()) {
|
||||
throw syntaxError("Unclosed CDATA");
|
||||
}
|
||||
sb.append(c);
|
||||
i = sb.length() - 3;
|
||||
if ((i >= 0) && (sb.charAt(i) == ']') && (sb.charAt(i + 1) == ']') && (sb.charAt(i + 2) == '>'))
|
||||
{
|
||||
if ((i >= 0) && (sb.charAt(i) == ']') && (sb.charAt(i + 1) == ']') && (sb.charAt(i + 2) == '>')) {
|
||||
sb.setLength(i);
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the next XML outer token, trimming whitespace. There are two kinds of tokens: the '<' character which begins
|
||||
* a markup tag, and the content text between markup tags.
|
||||
@ -66,37 +62,33 @@ public class XMLTokener extends JSONTokener
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public Object nextContent() throws JSONException
|
||||
{
|
||||
public Object nextContent() throws JSONException {
|
||||
char c;
|
||||
StringBuilder sb;
|
||||
do
|
||||
{
|
||||
do {
|
||||
c = next();
|
||||
} while (Character.isWhitespace(c));
|
||||
if (c == 0) {
|
||||
return null;
|
||||
}
|
||||
if (c == '<') {
|
||||
return XML.LT;
|
||||
}
|
||||
while (Character.isWhitespace(c));
|
||||
if (c == 0) { return null; }
|
||||
if (c == '<') { return XML.LT; }
|
||||
sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
if ((c == '<') || (c == 0))
|
||||
{
|
||||
for (;;) {
|
||||
if ((c == '<') || (c == 0)) {
|
||||
back();
|
||||
return sb.toString().trim();
|
||||
}
|
||||
if (c == '&')
|
||||
{
|
||||
if (c == '&') {
|
||||
sb.append(nextEntity(c));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
c = next();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the next entity. These entities are translated to Characters: <code>& " > <
|
||||
* "</code>.
|
||||
@ -107,22 +99,15 @@ public class XMLTokener extends JSONTokener
|
||||
*
|
||||
* @throws JSONException If missing ';' in XML entity.
|
||||
*/
|
||||
public Object nextEntity(final char ampersand) throws JSONException
|
||||
{
|
||||
public Object nextEntity(final char ampersand) throws JSONException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
final char c = next();
|
||||
if (Character.isLetterOrDigit(c) || (c == '#'))
|
||||
{
|
||||
if (Character.isLetterOrDigit(c) || (c == '#')) {
|
||||
sb.append(Character.toLowerCase(c));
|
||||
}
|
||||
else if (c == ';')
|
||||
{
|
||||
} else if (c == ';') {
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
throw syntaxError("Missing ';' in XML entity: &" + sb);
|
||||
}
|
||||
}
|
||||
@ -130,7 +115,7 @@ public class XMLTokener extends JSONTokener
|
||||
final Object object = entity.get(string);
|
||||
return object != null ? object : ampersand + string + ";";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next XML meta token. This is used for skipping over <!...> and <?...?> structures.
|
||||
*
|
||||
@ -139,17 +124,13 @@ public class XMLTokener extends JSONTokener
|
||||
*
|
||||
* @throws JSONException If a string is not properly closed or if the XML is badly structured.
|
||||
*/
|
||||
public Object nextMeta() throws JSONException
|
||||
{
|
||||
public Object nextMeta() throws JSONException {
|
||||
char c;
|
||||
char q;
|
||||
do
|
||||
{
|
||||
do {
|
||||
c = next();
|
||||
}
|
||||
while (Character.isWhitespace(c));
|
||||
switch (c)
|
||||
{
|
||||
} while (Character.isWhitespace(c));
|
||||
switch (c) {
|
||||
case 0:
|
||||
throw syntaxError("Misshaped meta tag");
|
||||
case '<':
|
||||
@ -167,19 +148,22 @@ public class XMLTokener extends JSONTokener
|
||||
case '"':
|
||||
case '\'':
|
||||
q = c;
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = next();
|
||||
if (c == 0) { throw syntaxError("Unterminated string"); }
|
||||
if (c == q) { return Boolean.TRUE; }
|
||||
if (c == 0) {
|
||||
throw syntaxError("Unterminated string");
|
||||
}
|
||||
if (c == q) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
}
|
||||
default:
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = next();
|
||||
if (Character.isWhitespace(c)) { return Boolean.TRUE; }
|
||||
switch (c)
|
||||
{
|
||||
if (Character.isWhitespace(c)) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
switch (c) {
|
||||
case 0:
|
||||
case '<':
|
||||
case '>':
|
||||
@ -195,7 +179,7 @@ public class XMLTokener extends JSONTokener
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the next XML Token. These tokens are found inside of angle brackets. It may be one of these characters:
|
||||
* <code>/ >= ! ?</code> or it may be a string wrapped in single quotes or double quotes, or it may be a name.
|
||||
@ -204,18 +188,14 @@ public class XMLTokener extends JSONTokener
|
||||
*
|
||||
* @throws JSONException If the XML is not well formed.
|
||||
*/
|
||||
public Object nextToken() throws JSONException
|
||||
{
|
||||
public Object nextToken() throws JSONException {
|
||||
char c;
|
||||
char q;
|
||||
StringBuilder sb;
|
||||
do
|
||||
{
|
||||
do {
|
||||
c = next();
|
||||
}
|
||||
while (Character.isWhitespace(c));
|
||||
switch (c)
|
||||
{
|
||||
} while (Character.isWhitespace(c));
|
||||
switch (c) {
|
||||
case 0:
|
||||
throw syntaxError("Misshaped element");
|
||||
case '<':
|
||||
@ -235,30 +215,30 @@ public class XMLTokener extends JSONTokener
|
||||
case '\'':
|
||||
q = c;
|
||||
sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
c = next();
|
||||
if (c == 0) { throw syntaxError("Unterminated string"); }
|
||||
if (c == q) { return sb.toString(); }
|
||||
if (c == '&')
|
||||
{
|
||||
sb.append(nextEntity(c));
|
||||
if (c == 0) {
|
||||
throw syntaxError("Unterminated string");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (c == q) {
|
||||
return sb.toString();
|
||||
}
|
||||
if (c == '&') {
|
||||
sb.append(nextEntity(c));
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
default:
|
||||
// Name
|
||||
sb = new StringBuilder();
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
sb.append(c);
|
||||
c = next();
|
||||
if (Character.isWhitespace(c)) { return sb.toString(); }
|
||||
switch (c)
|
||||
{
|
||||
if (Character.isWhitespace(c)) {
|
||||
return sb.toString();
|
||||
}
|
||||
switch (c) {
|
||||
case 0:
|
||||
return sb.toString();
|
||||
case '>':
|
||||
@ -278,7 +258,7 @@ public class XMLTokener extends JSONTokener
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Skip characters until past the requested string. If it is not found, we are left at the end of the source with a
|
||||
* result of false.
|
||||
@ -287,8 +267,7 @@ public class XMLTokener extends JSONTokener
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public boolean skipPast(final String to) throws JSONException
|
||||
{
|
||||
public boolean skipPast(final String to) throws JSONException {
|
||||
boolean b;
|
||||
char c;
|
||||
int i;
|
||||
@ -300,44 +279,44 @@ public class XMLTokener extends JSONTokener
|
||||
* First fill the circle buffer with as many characters as are in the
|
||||
* to string. If we reach an early end, bail.
|
||||
*/
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
for (i = 0; i < length; i += 1) {
|
||||
c = next();
|
||||
if (c == 0) { return false; }
|
||||
if (c == 0) {
|
||||
return false;
|
||||
}
|
||||
circle[i] = c;
|
||||
}
|
||||
/* We will loop, possibly for all of the remaining characters. */
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
j = offset;
|
||||
b = true;
|
||||
/* Compare the circle buffer with the to string. */
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
if (circle[j] != to.charAt(i))
|
||||
{
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (circle[j] != to.charAt(i)) {
|
||||
b = false;
|
||||
break;
|
||||
}
|
||||
j += 1;
|
||||
if (j >= length)
|
||||
{
|
||||
if (j >= length) {
|
||||
j -= length;
|
||||
}
|
||||
}
|
||||
/* If we exit the loop with b intact, then victory is ours. */
|
||||
if (b) { return true; }
|
||||
if (b) {
|
||||
return true;
|
||||
}
|
||||
/* Get the next character. If there isn't one, then defeat is ours. */
|
||||
c = next();
|
||||
if (c == 0) { return false; }
|
||||
if (c == 0) {
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* Shove the character in the circle buffer and advance the
|
||||
* circle offset. The offset is mod n.
|
||||
*/
|
||||
circle[offset] = c;
|
||||
offset += 1;
|
||||
if (offset >= length)
|
||||
{
|
||||
if (offset >= length) {
|
||||
offset -= length;
|
||||
}
|
||||
}
|
||||
|
@ -17,21 +17,20 @@ import com.intellectualcrafters.plot.util.SetupUtils;
|
||||
import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandlerImplementation;
|
||||
|
||||
public interface IPlotMain
|
||||
{
|
||||
|
||||
public interface IPlotMain {
|
||||
|
||||
/**
|
||||
* Log a message to console
|
||||
* @param message
|
||||
*/
|
||||
void log(final String message);
|
||||
|
||||
|
||||
/**
|
||||
* Get the `PlotSquared` directory (e.g. /plugins/PlotSquared or /mods/PlotSquared)
|
||||
* @return
|
||||
*/
|
||||
File getDirectory();
|
||||
|
||||
|
||||
/**
|
||||
* Get the directory containing all the worlds
|
||||
* @return
|
||||
@ -44,161 +43,161 @@ public interface IPlotMain
|
||||
* @return
|
||||
*/
|
||||
PlotPlayer wrapPlayer(final Object obj);
|
||||
|
||||
|
||||
/**
|
||||
* Disable the implementation
|
||||
* - If a full disable isn't feasibly, just disable what it can
|
||||
*/
|
||||
void disable();
|
||||
|
||||
|
||||
/**
|
||||
* Get the version of the PlotSquared being used
|
||||
* @return
|
||||
*/
|
||||
int[] getPluginVersion();
|
||||
|
||||
|
||||
/**
|
||||
* Get the version of Minecraft that is running
|
||||
* (used to check what protocols and such are supported)
|
||||
* @return
|
||||
*/
|
||||
int[] getServerVersion();
|
||||
|
||||
|
||||
/**
|
||||
* Get the nms package prefix
|
||||
* @return
|
||||
*/
|
||||
String getNMSPackage();
|
||||
|
||||
|
||||
/**
|
||||
* Get the schematic handler
|
||||
* @return
|
||||
*/
|
||||
SchematicHandler initSchematicHandler();
|
||||
|
||||
|
||||
/**
|
||||
* Get the schematic handler
|
||||
* @return
|
||||
*/
|
||||
ChatManager initChatManager();
|
||||
|
||||
|
||||
/**
|
||||
* The task manager will run and manage minecraft tasks
|
||||
* @return
|
||||
*/
|
||||
TaskManager getTaskManager();
|
||||
|
||||
|
||||
/**
|
||||
* Run the task that will kill road mobs
|
||||
*/
|
||||
void runEntityTask();
|
||||
|
||||
|
||||
/**
|
||||
* Register the implementation specific commands
|
||||
*/
|
||||
void registerCommands();
|
||||
|
||||
|
||||
/**
|
||||
* Register the protection system (used to protect blocks and such)
|
||||
*/
|
||||
void registerPlayerEvents();
|
||||
|
||||
|
||||
/**
|
||||
* Register inventory related events (used for inventory guis)
|
||||
*/
|
||||
void registerInventoryEvents();
|
||||
|
||||
|
||||
/**
|
||||
* Register plot plus related events (whatever these are?)
|
||||
*/
|
||||
void registerPlotPlusEvents();
|
||||
|
||||
|
||||
/**
|
||||
* Register force field events (why is this a thing?)
|
||||
*/
|
||||
void registerForceFieldEvents();
|
||||
|
||||
|
||||
/**
|
||||
* Register the WorldEdit hook
|
||||
*/
|
||||
boolean initWorldEdit();
|
||||
|
||||
|
||||
/**
|
||||
* Register TNT related events (if TNT protection is enabled)
|
||||
*/
|
||||
void registerTNTListener();
|
||||
|
||||
|
||||
/**
|
||||
* Get the economy provider
|
||||
* @return
|
||||
*/
|
||||
EconHandler getEconomyHandler();
|
||||
|
||||
|
||||
/**
|
||||
* Get the block manager
|
||||
* @return
|
||||
*/
|
||||
BlockManager initBlockManager();
|
||||
|
||||
|
||||
/**
|
||||
* Get the EventUtil class
|
||||
* @return
|
||||
*/
|
||||
EventUtil initEventUtil();
|
||||
|
||||
|
||||
/**
|
||||
* Get the chunk manager
|
||||
* @return
|
||||
*/
|
||||
ChunkManager initChunkManager();
|
||||
|
||||
|
||||
/**
|
||||
* Get the setuputils class (used for world creation)
|
||||
* @return
|
||||
*/
|
||||
SetupUtils initSetupUtils();
|
||||
|
||||
|
||||
/**
|
||||
* Get HybridUtils class (common functions useful for hybrid world generation)
|
||||
* @return
|
||||
*/
|
||||
HybridUtils initHybridUtils();
|
||||
|
||||
|
||||
/**
|
||||
* Start the metrics task
|
||||
*/
|
||||
void startMetrics();
|
||||
|
||||
|
||||
/**
|
||||
* If a world is already loaded, set the generator (use NMS if required)
|
||||
* @param world
|
||||
*/
|
||||
void setGenerator(final String world);
|
||||
|
||||
|
||||
/**
|
||||
* Get the UUIDHandlerImplementation which will cache and provide UUIDs
|
||||
* @return
|
||||
*/
|
||||
UUIDHandlerImplementation initUUIDHandler();
|
||||
|
||||
|
||||
/**
|
||||
* Get the InventoryUtil class (used for implementation specific inventory guis)
|
||||
* @return
|
||||
*/
|
||||
InventoryUtil initInventoryUtil();
|
||||
|
||||
|
||||
/**
|
||||
* Run the converter for the implementation (not necessarily PlotMe, just any plugin that we can convert from)
|
||||
* @return
|
||||
*/
|
||||
boolean initPlotMeConverter();
|
||||
|
||||
|
||||
/**
|
||||
* Unregister a PlotPlayer from cache e.g. if they have logged off
|
||||
* @param player
|
||||
*/
|
||||
void unregister(final PlotPlayer player);
|
||||
|
||||
|
||||
/**
|
||||
* Get the generator wrapper for a world (world) and generator (name)
|
||||
* @param world
|
||||
@ -206,23 +205,23 @@ public interface IPlotMain
|
||||
* @return
|
||||
*/
|
||||
PlotGenerator<?> getGenerator(final String world, final String name);
|
||||
|
||||
|
||||
/**
|
||||
* Register the chunk processor which will clean out chunks that have too many blockstates or entities
|
||||
*/
|
||||
void registerChunkProcessor();
|
||||
|
||||
|
||||
/**
|
||||
* Register the world initialization events (used to keep track of worlds being generated)
|
||||
*/
|
||||
void registerWorldEvents();
|
||||
|
||||
|
||||
/**
|
||||
* Get the name of the server
|
||||
* @return
|
||||
*/
|
||||
String getServerName();
|
||||
|
||||
|
||||
/**
|
||||
* Get the class that will manage player titles
|
||||
* @return
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -61,9 +61,8 @@ import com.plotsquared.bukkit.util.BukkitUtil;
|
||||
*
|
||||
*/
|
||||
|
||||
public class PlotAPI
|
||||
{
|
||||
|
||||
public class PlotAPI {
|
||||
|
||||
/**
|
||||
* Permission that allows for admin access, this permission node will allow the player to use any part of the
|
||||
* plugin, without limitations.
|
||||
@ -71,14 +70,13 @@ public class PlotAPI
|
||||
*/
|
||||
@Deprecated
|
||||
public static final String ADMIN_PERMISSION = C.PERMISSION_ADMIN.s();
|
||||
|
||||
|
||||
/**
|
||||
* @deprecated Use new PlotAPI() instead
|
||||
*/
|
||||
@Deprecated
|
||||
public PlotAPI(final JavaPlugin plugin)
|
||||
{}
|
||||
|
||||
public PlotAPI(final JavaPlugin plugin) {}
|
||||
|
||||
/**
|
||||
* @param plugin Plugin used to access this method
|
||||
*
|
||||
@ -94,9 +92,8 @@ public class PlotAPI
|
||||
*
|
||||
*/
|
||||
@Deprecated
|
||||
public PlotAPI()
|
||||
{}
|
||||
|
||||
public PlotAPI() {}
|
||||
|
||||
/**
|
||||
* Get all plots
|
||||
*
|
||||
@ -104,11 +101,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.PS#getPlots()
|
||||
*/
|
||||
public Set<Plot> getAllPlots()
|
||||
{
|
||||
public Set<Plot> getAllPlots() {
|
||||
return PS.get().getPlots();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return all plots for a player
|
||||
*
|
||||
@ -116,11 +112,10 @@ public class PlotAPI
|
||||
*
|
||||
* @return all plots that a player owns
|
||||
*/
|
||||
public Set<Plot> getPlayerPlots(final Player player)
|
||||
{
|
||||
public Set<Plot> getPlayerPlots(final Player player) {
|
||||
return PS.get().getPlots(BukkitUtil.getPlayer(player));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a plot world
|
||||
*
|
||||
@ -131,31 +126,28 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.PS#addPlotWorld(String, com.intellectualcrafters.plot.object.PlotWorld,
|
||||
* com.intellectualcrafters.plot.object.PlotManager)
|
||||
*/
|
||||
public void addPlotWorld(final String world, final PlotWorld plotWorld, final PlotManager manager)
|
||||
{
|
||||
public void addPlotWorld(final String world, final PlotWorld plotWorld, final PlotManager manager) {
|
||||
PS.get().addPlotWorld(world, plotWorld, manager);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return main configuration
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.PS#config
|
||||
*/
|
||||
public YamlConfiguration getConfig()
|
||||
{
|
||||
public YamlConfiguration getConfig() {
|
||||
return PS.get().config;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return storage configuration
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.PS#storage
|
||||
*/
|
||||
public YamlConfiguration getStorage()
|
||||
{
|
||||
public YamlConfiguration getStorage() {
|
||||
return PS.get().storage;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the main class for this plugin <br> - Contains a lot of fields and methods - not very well organized <br>
|
||||
* Only use this if you really need it
|
||||
@ -164,11 +156,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.PS
|
||||
*/
|
||||
public PS getMain()
|
||||
{
|
||||
public PS getMain() {
|
||||
return PS.get();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ChunkManager class contains several useful methods<br>
|
||||
* - Chunk deletion<br>
|
||||
@ -181,11 +172,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.util.ChunkManager
|
||||
*/
|
||||
public ChunkManager getChunkManager()
|
||||
{
|
||||
public ChunkManager getChunkManager() {
|
||||
return ChunkManager.manager;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* BlockManager class contains useful methods relating to blocks.
|
||||
*
|
||||
@ -193,11 +183,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.util.BlockManager
|
||||
*/
|
||||
public BlockManager getBlockManager()
|
||||
{
|
||||
public BlockManager getBlockManager() {
|
||||
return BlockManager.manager;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* BukkitSetBlockManager class contains useful methods relating to bukkit blocks.
|
||||
*
|
||||
@ -205,11 +194,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.plotsquared.bukkit.util.BukkitSetBlockManager
|
||||
*/
|
||||
public BukkitSetBlockManager getBukkitBlockManager()
|
||||
{
|
||||
public BukkitSetBlockManager getBukkitBlockManager() {
|
||||
return BukkitSetBlockManager.setBlockManager;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* UUIDWrapper class has basic methods for getting UUIDS (it's recommended to use the UUIDHandler class instead)
|
||||
*
|
||||
@ -217,11 +205,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.uuid.UUIDWrapper
|
||||
*/
|
||||
public UUIDWrapper getUUIDWrapper()
|
||||
{
|
||||
public UUIDWrapper getUUIDWrapper() {
|
||||
return UUIDHandler.getUUIDWrapper();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Do not use this. Instead use FlagManager.[method] in your code.
|
||||
* - Flag related stuff
|
||||
@ -231,11 +218,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.flag.FlagManager
|
||||
*/
|
||||
@Deprecated
|
||||
public FlagManager getFlagManager()
|
||||
{
|
||||
public FlagManager getFlagManager() {
|
||||
return new FlagManager();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Do not use this. Instead use ClusterManager.[method] in your code.
|
||||
* - Plot cluster related stuff
|
||||
@ -245,11 +231,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.util.ClusterManager
|
||||
*/
|
||||
@Deprecated
|
||||
public ClusterManager getClusterManager()
|
||||
{
|
||||
public ClusterManager getClusterManager() {
|
||||
return new ClusterManager();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Do not use this. Instead use MainUtil.[method] in your code.
|
||||
* - Basic plot management stuff
|
||||
@ -259,11 +244,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.util.MainUtil
|
||||
*/
|
||||
@Deprecated
|
||||
public MainUtil getMainUtil()
|
||||
{
|
||||
public MainUtil getMainUtil() {
|
||||
return new MainUtil();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Do not use this. Instead use C.PERMISSION_[method] in your code.
|
||||
* - Basic permission management stuff
|
||||
@ -273,19 +257,16 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.util.Permissions
|
||||
*/
|
||||
@Deprecated
|
||||
public String[] getPermissions()
|
||||
{
|
||||
public String[] getPermissions() {
|
||||
final ArrayList<String> perms = new ArrayList<>();
|
||||
for (final C c : C.values())
|
||||
{
|
||||
if (c.getCat().equals("static.permissions"))
|
||||
{
|
||||
for (final C c : C.values()) {
|
||||
if (c.getCat().equals("static.permissions")) {
|
||||
perms.add(c.s());
|
||||
}
|
||||
}
|
||||
return perms.toArray(new String[0]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* SchematicHandler class contains methods related to pasting, reading and writing schematics
|
||||
*
|
||||
@ -293,11 +274,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.util.SchematicHandler
|
||||
*/
|
||||
public SchematicHandler getSchematicHandler()
|
||||
{
|
||||
public SchematicHandler getSchematicHandler() {
|
||||
return SchematicHandler.manager;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Use C.[caption] instead
|
||||
*
|
||||
@ -306,11 +286,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.config.C
|
||||
*/
|
||||
@Deprecated
|
||||
public C[] getCaptions()
|
||||
{
|
||||
public C[] getCaptions() {
|
||||
return C.values();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the plot manager for a world. - Most of these methods can be accessed through the MainUtil
|
||||
*
|
||||
@ -321,11 +300,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.object.PlotManager
|
||||
* @see PS#getPlotManager(String)
|
||||
*/
|
||||
public PlotManager getPlotManager(final World world)
|
||||
{
|
||||
public PlotManager getPlotManager(final World world) {
|
||||
return PS.get().getPlotManager(world.getName());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the plot manager for a world. - Contains useful low level methods for plot merging, clearing, and
|
||||
* tessellation
|
||||
@ -337,11 +315,10 @@ public class PlotAPI
|
||||
* @see PS#getPlotManager(String)
|
||||
* @see com.intellectualcrafters.plot.object.PlotManager
|
||||
*/
|
||||
public PlotManager getPlotManager(final String world)
|
||||
{
|
||||
public PlotManager getPlotManager(final String world) {
|
||||
return PS.get().getPlotManager(world);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the settings for a world (settings bundled in PlotWorld class) - You will need to downcast for the specific
|
||||
* settings a Generator has. e.g. DefaultPlotWorld class implements PlotWorld
|
||||
@ -353,11 +330,10 @@ public class PlotAPI
|
||||
* @see PS#getPlotWorld(String)
|
||||
* @see com.intellectualcrafters.plot.object.PlotWorld
|
||||
*/
|
||||
public PlotWorld getWorldSettings(final World world)
|
||||
{
|
||||
public PlotWorld getWorldSettings(final World world) {
|
||||
return PS.get().getPlotWorld(world.getName());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the settings for a world (settings bundled in PlotWorld class)
|
||||
*
|
||||
@ -368,11 +344,10 @@ public class PlotAPI
|
||||
* @see PS#getPlotWorld(String)
|
||||
* @see com.intellectualcrafters.plot.object.PlotWorld
|
||||
*/
|
||||
public PlotWorld getWorldSettings(final String world)
|
||||
{
|
||||
public PlotWorld getWorldSettings(final String world) {
|
||||
return PS.get().getPlotWorld(world);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send a message to a player.
|
||||
*
|
||||
@ -382,11 +357,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.util.MainUtil#sendMessage(PlotPlayer, C, String...)
|
||||
* com.intellectualcrafters.plot.config.C, String...)
|
||||
*/
|
||||
public void sendMessage(final Player player, final C c)
|
||||
{
|
||||
public void sendMessage(final Player player, final C c) {
|
||||
MainUtil.sendMessage(BukkitUtil.getPlayer(player), c);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send a message to a player. - Supports color codes
|
||||
*
|
||||
@ -395,11 +369,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.util.MainUtil#sendMessage(PlotPlayer, String)
|
||||
*/
|
||||
public void sendMessage(final Player player, final String string)
|
||||
{
|
||||
public void sendMessage(final Player player, final String string) {
|
||||
MainUtil.sendMessage(BukkitUtil.getPlayer(player), string);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send a message to the console. - Supports color codes
|
||||
*
|
||||
@ -407,11 +380,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see MainUtil#sendConsoleMessage(String)
|
||||
*/
|
||||
public void sendConsoleMessage(final String msg)
|
||||
{
|
||||
public void sendConsoleMessage(final String msg) {
|
||||
MainUtil.sendConsoleMessage(msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send a message to the console
|
||||
*
|
||||
@ -420,11 +392,10 @@ public class PlotAPI
|
||||
* @see #sendConsoleMessage(String)
|
||||
* @see com.intellectualcrafters.plot.config.C
|
||||
*/
|
||||
public void sendConsoleMessage(final C c)
|
||||
{
|
||||
public void sendConsoleMessage(final C c) {
|
||||
sendConsoleMessage(c.s());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register a flag for use in plots
|
||||
*
|
||||
@ -433,11 +404,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.flag.FlagManager#addFlag(com.intellectualcrafters.plot.flag.AbstractFlag)
|
||||
* @see com.intellectualcrafters.plot.flag.AbstractFlag
|
||||
*/
|
||||
public void addFlag(final AbstractFlag flag)
|
||||
{
|
||||
public void addFlag(final AbstractFlag flag) {
|
||||
FlagManager.addFlag(flag);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get all the currently registered flags
|
||||
*
|
||||
@ -446,11 +416,10 @@ public class PlotAPI
|
||||
* @see com.intellectualcrafters.plot.flag.FlagManager#getFlags()
|
||||
* @see com.intellectualcrafters.plot.flag.AbstractFlag
|
||||
*/
|
||||
public AbstractFlag[] getFlags()
|
||||
{
|
||||
public AbstractFlag[] getFlags() {
|
||||
return FlagManager.getFlags().toArray(new AbstractFlag[FlagManager.getFlags().size()]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a plot based on the ID
|
||||
*
|
||||
@ -463,11 +432,10 @@ public class PlotAPI
|
||||
* @see MainUtil#getPlot(String, com.intellectualcrafters.plot.object.PlotId)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Plot getPlot(final World world, final int x, final int z)
|
||||
{
|
||||
public Plot getPlot(final World world, final int x, final int z) {
|
||||
return MainUtil.getPlot(world.getName(), new PlotId(x, z));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a plot based on the location
|
||||
*
|
||||
@ -478,11 +446,10 @@ public class PlotAPI
|
||||
* @see MainUtil#getPlot(com.intellectualcrafters.plot.object.Location)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Plot getPlot(final Location l)
|
||||
{
|
||||
public Plot getPlot(final Location l) {
|
||||
return MainUtil.getPlot(BukkitUtil.getLocation(l));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a plot based on the player location
|
||||
*
|
||||
@ -493,11 +460,10 @@ public class PlotAPI
|
||||
* @see #getPlot(org.bukkit.Location)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Plot getPlot(final Player player)
|
||||
{
|
||||
public Plot getPlot(final Player player) {
|
||||
return this.getPlot(player.getLocation());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check whether or not a player has a plot
|
||||
*
|
||||
@ -507,11 +473,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see #getPlots(World, Player, boolean)
|
||||
*/
|
||||
public boolean hasPlot(final World world, final Player player)
|
||||
{
|
||||
public boolean hasPlot(final World world, final Player player) {
|
||||
return (getPlots(world, player, true) != null) && (getPlots(world, player, true).length > 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get all plots for the player
|
||||
*
|
||||
@ -520,29 +485,22 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Plot[] getPlots(final World world, final Player plr, final boolean just_owner)
|
||||
{
|
||||
public Plot[] getPlots(final World world, final Player plr, final boolean just_owner) {
|
||||
final ArrayList<Plot> pPlots = new ArrayList<>();
|
||||
for (final Plot plot : PS.get().getPlotsInWorld(world.getName()))
|
||||
{
|
||||
if (just_owner)
|
||||
{
|
||||
if ((plot.owner != null) && (plot.owner.equals(UUIDHandler.getUUID(BukkitUtil.getPlayer(plr)))))
|
||||
{
|
||||
for (final Plot plot : PS.get().getPlotsInWorld(world.getName())) {
|
||||
if (just_owner) {
|
||||
if ((plot.owner != null) && (plot.owner.equals(UUIDHandler.getUUID(BukkitUtil.getPlayer(plr))))) {
|
||||
pPlots.add(plot);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (plot.isAdded(UUIDHandler.getUUID(BukkitUtil.getPlayer(plr))))
|
||||
{
|
||||
} else {
|
||||
if (plot.isAdded(UUIDHandler.getUUID(BukkitUtil.getPlayer(plr)))) {
|
||||
pPlots.add(plot);
|
||||
}
|
||||
}
|
||||
}
|
||||
return pPlots.toArray(new Plot[pPlots.size()]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get all plots for the world
|
||||
*
|
||||
@ -553,12 +511,11 @@ public class PlotAPI
|
||||
* @see PS#getPlots(String)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Plot[] getPlots(final World world)
|
||||
{
|
||||
public Plot[] getPlots(final World world) {
|
||||
final Collection<Plot> plots = PS.get().getPlotsInWorld(world.getName());
|
||||
return plots.toArray(new Plot[plots.size()]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get all plot worlds
|
||||
*
|
||||
@ -566,12 +523,11 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.PS#getPlotWorlds()
|
||||
*/
|
||||
public String[] getPlotWorlds()
|
||||
{
|
||||
public String[] getPlotWorlds() {
|
||||
final Set<String> worlds = PS.get().getPlotWorlds();
|
||||
return worlds.toArray(new String[worlds.size()]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get if plot world
|
||||
*
|
||||
@ -581,11 +537,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.PS#isPlotWorld(String)
|
||||
*/
|
||||
public boolean isPlotWorld(final World world)
|
||||
{
|
||||
public boolean isPlotWorld(final World world) {
|
||||
return PS.get().isPlotWorld(world.getName());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get plot locations
|
||||
*
|
||||
@ -601,14 +556,13 @@ public class PlotAPI
|
||||
* com.intellectualcrafters.plot.object.Plot)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Location[] getLocations(final Plot p)
|
||||
{
|
||||
public Location[] getLocations(final Plot p) {
|
||||
return new Location[] {
|
||||
BukkitUtil.getLocation(MainUtil.getPlotBottomLoc(p.world, p.id)),
|
||||
BukkitUtil.getLocation(MainUtil.getPlotTopLoc(p.world, p.id)),
|
||||
BukkitUtil.getLocation(MainUtil.getPlotHome(p.world, p.id)) };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get home location
|
||||
*
|
||||
@ -620,11 +574,10 @@ public class PlotAPI
|
||||
* com.intellectualcrafters.plot.object.Plot)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Location getHomeLocation(final Plot p)
|
||||
{
|
||||
public Location getHomeLocation(final Plot p) {
|
||||
return BukkitUtil.getLocation(MainUtil.getPlotHome(p.world, p.id));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get Bottom Location (min, min, min)
|
||||
*
|
||||
@ -636,11 +589,10 @@ public class PlotAPI
|
||||
* com.intellectualcrafters.plot.object.PlotId)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Location getBottomLocation(final Plot p)
|
||||
{
|
||||
public Location getBottomLocation(final Plot p) {
|
||||
return BukkitUtil.getLocation(MainUtil.getPlotBottomLoc(p.world, p.id));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get Top Location (max, max, max)
|
||||
*
|
||||
@ -651,11 +603,10 @@ public class PlotAPI
|
||||
* @see MainUtil#getPlotTopLoc(String, com.intellectualcrafters.plot.object.PlotId)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Location getTopLocation(final Plot p)
|
||||
{
|
||||
public Location getTopLocation(final Plot p) {
|
||||
return BukkitUtil.getLocation(MainUtil.getPlotTopLoc(p.world, p.id));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check whether or not a player is in a plot
|
||||
*
|
||||
@ -665,11 +616,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.util.MainUtil#getPlot(com.intellectualcrafters.plot.object.Location)
|
||||
*/
|
||||
public boolean isInPlot(final Player player)
|
||||
{
|
||||
public boolean isInPlot(final Player player) {
|
||||
return MainUtil.getPlot(BukkitUtil.getLocation(player)) != null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register a subcommand
|
||||
*
|
||||
@ -677,18 +627,14 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.commands.SubCommand
|
||||
*/
|
||||
public void registerCommand(final SubCommand c)
|
||||
{
|
||||
if (c.getCommand() != null)
|
||||
{
|
||||
public void registerCommand(final SubCommand c) {
|
||||
if (c.getCommand() != null) {
|
||||
MainCommand.getInstance().addCommand(c);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainCommand.getInstance().createCommand(c);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the PlotSquared class
|
||||
*
|
||||
@ -696,11 +642,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.PS
|
||||
*/
|
||||
public PS getPlotSquared()
|
||||
{
|
||||
public PS getPlotSquared() {
|
||||
return PS.get();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the player plot count
|
||||
*
|
||||
@ -711,11 +656,10 @@ public class PlotAPI
|
||||
*
|
||||
* @see com.intellectualcrafters.plot.util.MainUtil#getPlayerPlotCount(String, PlotPlayer)
|
||||
*/
|
||||
public int getPlayerPlotCount(final World world, final Player player)
|
||||
{
|
||||
public int getPlayerPlotCount(final World world, final Player player) {
|
||||
return MainUtil.getPlayerPlotCount(world.getName(), BukkitUtil.getPlayer(player));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a collection containing the players plots
|
||||
*
|
||||
@ -728,11 +672,10 @@ public class PlotAPI
|
||||
* org.bukkit.entity.Player)
|
||||
* @see com.intellectualcrafters.plot.object.Plot
|
||||
*/
|
||||
public Set<Plot> getPlayerPlots(final World world, final Player player)
|
||||
{
|
||||
public Set<Plot> getPlayerPlots(final World world, final Player player) {
|
||||
return PS.get().getPlots(world.getName(), BukkitUtil.getPlayer(player));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the numbers of plots, which the player is able to build in
|
||||
*
|
||||
@ -741,12 +684,11 @@ public class PlotAPI
|
||||
* @return the number of allowed plots
|
||||
*
|
||||
*/
|
||||
public int getAllowedPlots(final Player player)
|
||||
{
|
||||
public int getAllowedPlots(final Player player) {
|
||||
final PlotPlayer pp = BukkitUtil.getPlayer(player);
|
||||
return MainUtil.getAllowedPlots(pp);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the PlotPlayer for a player<br>
|
||||
* - The PlotPlayer is usually cached and will provide useful functions relating to players
|
||||
@ -756,11 +698,10 @@ public class PlotAPI
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
public PlotPlayer wrapPlayer(final Player player)
|
||||
{
|
||||
public PlotPlayer wrapPlayer(final Player player) {
|
||||
return PlotPlayer.wrap(player);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the PlotPlayer for a UUID (Please note that PlotSquared can be configured to provide different UUIDs than bukkit)
|
||||
*
|
||||
@ -769,11 +710,10 @@ public class PlotAPI
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
public PlotPlayer wrapPlayer(final UUID uuid)
|
||||
{
|
||||
public PlotPlayer wrapPlayer(final UUID uuid) {
|
||||
return PlotPlayer.wrap(uuid);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the PlotPlayer for a username
|
||||
*
|
||||
@ -782,11 +722,10 @@ public class PlotAPI
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
public PlotPlayer wrapPlayer(final String player)
|
||||
{
|
||||
public PlotPlayer wrapPlayer(final String player) {
|
||||
return PlotPlayer.wrap(player);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the PlotPlayer for an offline player<br>
|
||||
* Note that this will work if the player is offline, however not all functionality will work
|
||||
@ -796,8 +735,7 @@ public class PlotAPI
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
public PlotPlayer wrapPlayer(final OfflinePlayer player)
|
||||
{
|
||||
public PlotPlayer wrapPlayer(final OfflinePlayer player) {
|
||||
return PlotPlayer.wrap(player);
|
||||
}
|
||||
}
|
||||
|
@ -43,71 +43,55 @@ usage = "/plot add <player>",
|
||||
category = CommandCategory.ACTIONS,
|
||||
permission = "plots.add",
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Add extends SubCommand
|
||||
{
|
||||
|
||||
public Add()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.PlayerName
|
||||
};
|
||||
public class Add extends SubCommand {
|
||||
|
||||
public Add() {
|
||||
requiredArguments = new Argument[] { Argument.PlayerName };
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.add"))
|
||||
{
|
||||
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.add")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return true;
|
||||
}
|
||||
UUID uuid;
|
||||
if (args[0].equalsIgnoreCase("*"))
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("*")) {
|
||||
uuid = DBFunc.everyone;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
// TODO have a runnable for fetch
|
||||
uuid = UUIDHandler.getUUID(args[0], null);
|
||||
}
|
||||
if (uuid == null)
|
||||
{
|
||||
if (uuid == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
if (plot.isOwner(uuid))
|
||||
{
|
||||
if (plot.isOwner(uuid)) {
|
||||
MainUtil.sendMessage(plr, C.ALREADY_OWNER);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (plot.getMembers().contains(uuid))
|
||||
{
|
||||
|
||||
if (plot.getMembers().contains(uuid)) {
|
||||
MainUtil.sendMessage(plr, C.ALREADY_ADDED);
|
||||
return false;
|
||||
}
|
||||
if (plot.removeTrusted(uuid))
|
||||
{
|
||||
if (plot.removeTrusted(uuid)) {
|
||||
plot.addMember(uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((plot.getMembers().size() + plot.getTrusted().size()) >= PS.get().getPlotWorld(plot.world).MAX_PLOT_MEMBERS)
|
||||
{
|
||||
} else {
|
||||
if ((plot.getMembers().size() + plot.getTrusted().size()) >= PS.get().getPlotWorld(plot.world).MAX_PLOT_MEMBERS) {
|
||||
MainUtil.sendMessage(plr, C.PLOT_MAX_MEMBERS);
|
||||
return false;
|
||||
}
|
||||
if (plot.getDenied().contains(uuid))
|
||||
{
|
||||
if (plot.getDenied().contains(uuid)) {
|
||||
plot.removeDenied(uuid);
|
||||
}
|
||||
plot.addMember(uuid);
|
||||
|
@ -42,89 +42,69 @@ requiredType = RequiredType.NONE,
|
||||
description = "Claim the nearest plot",
|
||||
aliases = { "a" },
|
||||
usage = "/plot auto")
|
||||
public class Auto extends SubCommand
|
||||
{
|
||||
|
||||
public static PlotId getNextPlot(final PlotId id, final int step)
|
||||
{
|
||||
public class Auto extends SubCommand {
|
||||
|
||||
public static PlotId getNextPlot(final PlotId id, final int step) {
|
||||
final int absX = Math.abs(id.x);
|
||||
final int absY = Math.abs(id.y);
|
||||
if (absX > absY)
|
||||
{
|
||||
if (id.x > 0)
|
||||
{
|
||||
if (absX > absY) {
|
||||
if (id.x > 0) {
|
||||
return new PlotId(id.x, id.y + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new PlotId(id.x, id.y - 1);
|
||||
}
|
||||
}
|
||||
else if (absY > absX)
|
||||
{
|
||||
if (id.y > 0)
|
||||
{
|
||||
} else if (absY > absX) {
|
||||
if (id.y > 0) {
|
||||
return new PlotId(id.x - 1, id.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return new PlotId(id.x + 1, id.y);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (id.x.equals(id.y) && (id.x > 0)) { return new PlotId(id.x, id.y + step); }
|
||||
if (id.x == absX) { return new PlotId(id.x, id.y + 1); }
|
||||
if (id.y == absY) { return new PlotId(id.x, id.y - 1); }
|
||||
} else {
|
||||
if (id.x.equals(id.y) && (id.x > 0)) {
|
||||
return new PlotId(id.x, id.y + step);
|
||||
}
|
||||
if (id.x == absX) {
|
||||
return new PlotId(id.x, id.y + 1);
|
||||
}
|
||||
if (id.y == absY) {
|
||||
return new PlotId(id.x, id.y - 1);
|
||||
}
|
||||
return new PlotId(id.x + 1, id.y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
String world;
|
||||
int size_x = 1;
|
||||
int size_z = 1;
|
||||
String schematic = "";
|
||||
if (PS.get().getPlotWorlds().size() == 1)
|
||||
{
|
||||
if (PS.get().getPlotWorlds().size() == 1) {
|
||||
world = PS.get().getPlotWorlds().iterator().next();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
world = plr.getLocation().getWorld();
|
||||
if (!PS.get().isPlotWorld(world))
|
||||
{
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (args.length > 0)
|
||||
{
|
||||
if (Permissions.hasPermission(plr, "plots.auto.mega"))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (args.length > 0) {
|
||||
if (Permissions.hasPermission(plr, "plots.auto.mega")) {
|
||||
try {
|
||||
final String[] split = args[0].split(",");
|
||||
size_x = Integer.parseInt(split[0]);
|
||||
size_z = Integer.parseInt(split[1]);
|
||||
if ((size_x < 1) || (size_z < 1))
|
||||
{
|
||||
if ((size_x < 1) || (size_z < 1)) {
|
||||
MainUtil.sendMessage(plr, "&cError: size<=0");
|
||||
}
|
||||
if ((size_x > 4) || (size_z > 4))
|
||||
{
|
||||
if ((size_x > 4) || (size_z > 4)) {
|
||||
MainUtil.sendMessage(plr, "&cError: size>4");
|
||||
}
|
||||
if (args.length > 1)
|
||||
{
|
||||
if (args.length > 1) {
|
||||
schematic = args[1];
|
||||
}
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
size_x = 1;
|
||||
size_z = 1;
|
||||
schematic = args[0];
|
||||
@ -132,42 +112,32 @@ public class Auto extends SubCommand
|
||||
// "&cError: Invalid size (X,Y)");
|
||||
// return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
schematic = args[0];
|
||||
// PlayerFunctions.sendMessage(plr, C.NO_PERMISSION);
|
||||
// return false;
|
||||
}
|
||||
}
|
||||
if ((size_x * size_z) > Settings.MAX_AUTO_SIZE)
|
||||
{
|
||||
if ((size_x * size_z) > Settings.MAX_AUTO_SIZE) {
|
||||
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS_NUM, Settings.MAX_AUTO_SIZE + "");
|
||||
return false;
|
||||
}
|
||||
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr);
|
||||
final int diff = currentPlots - MainUtil.getAllowedPlots(plr);
|
||||
if ((diff + (size_x * size_z)) > 0)
|
||||
{
|
||||
if (diff < 0)
|
||||
{
|
||||
if ((diff + (size_x * size_z)) > 0) {
|
||||
if (diff < 0) {
|
||||
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS_NUM, (-diff) + "");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
final PlotWorld pWorld = PS.get().getPlotWorld(world);
|
||||
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY)
|
||||
{
|
||||
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY) {
|
||||
double cost = pWorld.PLOT_PRICE;
|
||||
cost = (size_x * size_z) * cost;
|
||||
if (cost > 0d)
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < cost)
|
||||
{
|
||||
if (cost > 0d) {
|
||||
if (EconHandler.manager.getMoney(plr) < cost) {
|
||||
sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost);
|
||||
return true;
|
||||
}
|
||||
@ -175,16 +145,13 @@ public class Auto extends SubCommand
|
||||
sendMessage(plr, C.REMOVED_BALANCE, cost + "");
|
||||
}
|
||||
}
|
||||
if (!schematic.equals(""))
|
||||
{
|
||||
if (!schematic.equals("")) {
|
||||
// if (pWorld.SCHEMATIC_CLAIM_SPECIFY) {
|
||||
if (!pWorld.SCHEMATICS.contains(schematic.toLowerCase()))
|
||||
{
|
||||
if (!pWorld.SCHEMATICS.contains(schematic.toLowerCase())) {
|
||||
sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent: " + schematic);
|
||||
return true;
|
||||
}
|
||||
if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic"))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic")) {
|
||||
MainUtil.sendMessage(plr, C.NO_SCHEMATIC_PERMISSION, schematic);
|
||||
return true;
|
||||
}
|
||||
@ -192,15 +159,15 @@ public class Auto extends SubCommand
|
||||
}
|
||||
final String worldname = world;
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(worldname);
|
||||
if (plotworld.TYPE == 2)
|
||||
{
|
||||
if (plotworld.TYPE == 2) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(new Location(worldname, loc.getX(), loc.getY(), loc.getZ()));
|
||||
if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (plot == null) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
final PlotCluster cluster = plot.getCluster();
|
||||
// Must be standing in a cluster
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
@ -211,12 +178,10 @@ public class Auto extends SubCommand
|
||||
final int width = Math.max((top.x - bot.x) + 1, (top.y - bot.y) + 1);
|
||||
final int max = width * width;
|
||||
//
|
||||
for (int i = 0; i <= max; i++)
|
||||
{
|
||||
for (int i = 0; i <= max; i++) {
|
||||
final PlotId currentId = new PlotId(origin.x + id.x, origin.y + id.y);
|
||||
final Plot current = MainUtil.getPlot(worldname, currentId);
|
||||
if (MainUtil.canClaim(plr, current) && (current.getSettings().isMerged() == false) && cluster.equals(current.getCluster()))
|
||||
{
|
||||
if (MainUtil.canClaim(plr, current) && (current.getSettings().isMerged() == false) && cluster.equals(current.getCluster())) {
|
||||
Claim.claimPlot(plr, current, true, true);
|
||||
return true;
|
||||
}
|
||||
@ -227,50 +192,39 @@ public class Auto extends SubCommand
|
||||
return false;
|
||||
}
|
||||
boolean br = false;
|
||||
if ((size_x == 1) && (size_z == 1))
|
||||
{
|
||||
while (!br)
|
||||
{
|
||||
if ((size_x == 1) && (size_z == 1)) {
|
||||
while (!br) {
|
||||
final Plot plot = MainUtil.getPlot(worldname, getLastPlot(worldname));
|
||||
if (MainUtil.canClaim(plr, plot))
|
||||
{
|
||||
if (MainUtil.canClaim(plr, plot)) {
|
||||
Claim.claimPlot(plr, plot, true, true);
|
||||
br = true;
|
||||
}
|
||||
MainUtil.lastPlot.put(worldname, getNextPlot(getLastPlot(worldname), 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
boolean lastPlot = true;
|
||||
while (!br)
|
||||
{
|
||||
while (!br) {
|
||||
final PlotId start = getNextPlot(getLastPlot(worldname), 1);
|
||||
// Checking if the current set of plots is a viable option.
|
||||
MainUtil.lastPlot.put(worldname, start);
|
||||
if (lastPlot)
|
||||
{}
|
||||
if ((PS.get().getPlot(worldname, start) != null) && (PS.get().getPlot(worldname, start).owner != null))
|
||||
{
|
||||
if (lastPlot) {}
|
||||
if ((PS.get().getPlot(worldname, start) != null) && (PS.get().getPlot(worldname, start).owner != null)) {
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
lastPlot = false;
|
||||
}
|
||||
final PlotId end = new PlotId((start.x + size_x) - 1, (start.y + size_z) - 1);
|
||||
if (MainUtil.canClaim(plr, worldname, start, end))
|
||||
{
|
||||
for (int i = start.x; i <= end.x; i++)
|
||||
{
|
||||
for (int j = start.y; j <= end.y; j++)
|
||||
{
|
||||
if (MainUtil.canClaim(plr, worldname, start, end)) {
|
||||
for (int i = start.x; i <= end.x; i++) {
|
||||
for (int j = start.y; j <= end.y; j++) {
|
||||
final Plot plot = MainUtil.getPlot(worldname, new PlotId(i, j));
|
||||
final boolean teleport = ((i == end.x) && (j == end.y));
|
||||
Claim.claimPlot(plr, plot, teleport, true);
|
||||
}
|
||||
}
|
||||
if (!MainUtil.mergePlots(worldname, MainUtil.getPlotSelectionIds(start, end), true, true)) { return false; }
|
||||
if (!MainUtil.mergePlots(worldname, MainUtil.getPlotSelectionIds(start, end), true, true)) {
|
||||
return false;
|
||||
}
|
||||
br = true;
|
||||
}
|
||||
}
|
||||
@ -278,11 +232,9 @@ public class Auto extends SubCommand
|
||||
MainUtil.lastPlot.put(worldname, new PlotId(0, 0));
|
||||
return true;
|
||||
}
|
||||
|
||||
public PlotId getLastPlot(final String world)
|
||||
{
|
||||
if ((MainUtil.lastPlot == null) || !MainUtil.lastPlot.containsKey(world))
|
||||
{
|
||||
|
||||
public PlotId getLastPlot(final String world) {
|
||||
if ((MainUtil.lastPlot == null) || !MainUtil.lastPlot.containsKey(world)) {
|
||||
MainUtil.lastPlot.put(world, new PlotId(0, 0));
|
||||
}
|
||||
return MainUtil.lastPlot.get(world);
|
||||
|
@ -29,57 +29,44 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "bo3",
|
||||
aliases = { "bo2" },
|
||||
description = "Mark a plot as done",
|
||||
permission = "plots.bo3",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class BO3 extends SubCommand
|
||||
{
|
||||
|
||||
public void noArgs(final PlotPlayer plr)
|
||||
{
|
||||
@CommandDeclaration(command = "bo3", aliases = { "bo2" }, description = "Mark a plot as done", permission = "plots.bo3", category = CommandCategory.ACTIONS, requiredType = RequiredType.NONE)
|
||||
public class BO3 extends SubCommand {
|
||||
|
||||
public void noArgs(final PlotPlayer plr) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot bo3 export [category] [alias] [-r]");
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot bo3 import <file>");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.bo3"))
|
||||
{
|
||||
if ((plot == null) || !plot.hasOwner()) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.bo3")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (args.length == 0)
|
||||
{
|
||||
if (args.length == 0) {
|
||||
noArgs(plr);
|
||||
return false;
|
||||
}
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "output":
|
||||
case "save":
|
||||
case "export":
|
||||
{
|
||||
case "export": {
|
||||
return BO3Handler.saveBO3(plr, plot);
|
||||
}
|
||||
case "paste":
|
||||
case "load":
|
||||
case "import":
|
||||
case "input":
|
||||
{
|
||||
case "input": {
|
||||
// TODO NOT IMPLEMENTED YET
|
||||
MainUtil.sendMessage(plr, "NOT IMPLEMENTED YET!!!");
|
||||
return false;
|
||||
}
|
||||
default:
|
||||
{
|
||||
default: {
|
||||
noArgs(plr);
|
||||
return false;
|
||||
}
|
||||
|
@ -45,70 +45,74 @@ usage = "/plot buy",
|
||||
permission = "plots.buy",
|
||||
category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Buy extends SubCommand
|
||||
{
|
||||
|
||||
public class Buy extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
|
||||
if (EconHandler.manager == null) { return sendMessage(plr, C.ECON_DISABLED); }
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
|
||||
if (EconHandler.manager == null) {
|
||||
return sendMessage(plr, C.ECON_DISABLED);
|
||||
}
|
||||
final Location loc = plr.getLocation();
|
||||
final String world = loc.getWorld();
|
||||
if (!PS.get().isPlotWorld(world)) { return sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
Plot plot;
|
||||
if (args.length > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (args.length > 0) {
|
||||
try {
|
||||
final String[] split = args[0].split(";");
|
||||
final PlotId id = new PlotId(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
|
||||
plot = MainUtil.getPlot(world, id);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
return sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
plot = MainUtil.getPlot(loc);
|
||||
}
|
||||
if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (plot == null) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr);
|
||||
if (currentPlots >= MainUtil.getAllowedPlots(plr)) { return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); }
|
||||
if (!plot.hasOwner()) { return sendMessage(plr, C.PLOT_UNOWNED); }
|
||||
if (PlotHandler.isOwner(plot, plr.getUUID())) { return sendMessage(plr, C.CANNOT_BUY_OWN); }
|
||||
if (currentPlots >= MainUtil.getAllowedPlots(plr)) {
|
||||
return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
return sendMessage(plr, C.PLOT_UNOWNED);
|
||||
}
|
||||
if (PlotHandler.isOwner(plot, plr.getUUID())) {
|
||||
return sendMessage(plr, C.CANNOT_BUY_OWN);
|
||||
}
|
||||
final Flag flag = FlagManager.getPlotFlag(plot, "price");
|
||||
if (flag == null) { return sendMessage(plr, C.NOT_FOR_SALE); }
|
||||
if (flag == null) {
|
||||
return sendMessage(plr, C.NOT_FOR_SALE);
|
||||
}
|
||||
double initPrice = (double) flag.getValue();
|
||||
double price = initPrice;
|
||||
final PlotId id = plot.id;
|
||||
final PlotId id2 = MainUtil.getTopPlot(plot).id;
|
||||
final int size = MainUtil.getPlotSelectionIds(id, id2).size();
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (plotworld.USE_ECONOMY)
|
||||
{
|
||||
if (plotworld.USE_ECONOMY) {
|
||||
price += plotworld.PLOT_PRICE * size;
|
||||
initPrice += plotworld.SELL_PRICE * size;
|
||||
}
|
||||
if ((EconHandler.manager != null) && (price > 0d))
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < price) { return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + price); }
|
||||
if ((EconHandler.manager != null) && (price > 0d)) {
|
||||
if (EconHandler.manager.getMoney(plr) < price) {
|
||||
return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + price);
|
||||
}
|
||||
EconHandler.manager.withdrawMoney(plr, price);
|
||||
sendMessage(plr, C.REMOVED_BALANCE, price + "");
|
||||
EconHandler.manager.depositMoney(UUIDHandler.getUUIDWrapper().getOfflinePlayer(plot.owner), initPrice);
|
||||
final PlotPlayer owner = UUIDHandler.getPlayer(plot.owner);
|
||||
if (owner != null)
|
||||
{
|
||||
if (owner != null) {
|
||||
sendMessage(plr, C.PLOT_SOLD, plot.id + "", plr.getName(), initPrice + "");
|
||||
}
|
||||
FlagManager.removePlotFlag(plot, "price");
|
||||
}
|
||||
final Plot top = MainUtil.getTopPlot(plot);
|
||||
|
||||
for (final PlotId myId : MainUtil.getPlotSelectionIds(plot.id, top.id))
|
||||
{
|
||||
|
||||
for (final PlotId myId : MainUtil.getPlotSelectionIds(plot.id, top.id)) {
|
||||
final Plot myPlot = MainUtil.getPlot(plot.world, myId);
|
||||
myPlot.owner = plr.getUUID();
|
||||
DBFunc.setOwner(plot, myPlot.owner);
|
||||
|
@ -10,12 +10,10 @@ usage = "/plot chat [on|off]",
|
||||
permission = "plots.chat",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Chat extends SubCommand
|
||||
{
|
||||
|
||||
public class Chat extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, final String... args) {
|
||||
return MainCommand.onCommand(player, "plot", new String[] { "toggle", "chat" });
|
||||
}
|
||||
}
|
||||
|
@ -44,57 +44,44 @@ category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.claim",
|
||||
usage = "/plot claim")
|
||||
public class Claim extends SubCommand
|
||||
{
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final boolean auto)
|
||||
{
|
||||
public class Claim extends SubCommand {
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final boolean auto) {
|
||||
return claimPlot(player, plot, teleport, "", auto);
|
||||
}
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic, final boolean auto)
|
||||
{
|
||||
if (plot.hasOwner() || plot.getSettings().isMerged()) { return false; }
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic, final boolean auto) {
|
||||
if (plot.hasOwner() || plot.getSettings().isMerged()) {
|
||||
return false;
|
||||
}
|
||||
final boolean result = EventUtil.manager.callClaim(player, plot, false);
|
||||
if (result)
|
||||
{
|
||||
if (result) {
|
||||
MainUtil.createPlot(player.getUUID(), plot);
|
||||
MainUtil.setSign(player.getName(), plot);
|
||||
MainUtil.sendMessage(player, C.CLAIMED);
|
||||
final Location loc = player.getLocation();
|
||||
if (teleport)
|
||||
{
|
||||
if (teleport) {
|
||||
MainUtil.teleportPlayer(player, loc, plot);
|
||||
}
|
||||
final String world = plot.world;
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
final Plot plot2 = PS.get().getPlot(world, plot.id);
|
||||
if (plotworld.SCHEMATIC_ON_CLAIM)
|
||||
{
|
||||
if (plotworld.SCHEMATIC_ON_CLAIM) {
|
||||
Schematic sch;
|
||||
if (schematic.equals(""))
|
||||
{
|
||||
if (schematic.equals("")) {
|
||||
sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sch = SchematicHandler.manager.getSchematic(schematic);
|
||||
if (sch == null)
|
||||
{
|
||||
if (sch == null) {
|
||||
sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE);
|
||||
}
|
||||
}
|
||||
SchematicHandler.manager.paste(sch, plot2, 0, 0, new RunnableVal<Boolean>()
|
||||
{
|
||||
SchematicHandler.manager.paste(sch, plot2, 0, 0, new RunnableVal<Boolean>() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
public void run() {
|
||||
if (value) {
|
||||
MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_SUCCESS);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_FAILED);
|
||||
}
|
||||
}
|
||||
@ -104,40 +91,45 @@ public class Claim extends SubCommand
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
|
||||
String schematic = "";
|
||||
if (args.length >= 1)
|
||||
{
|
||||
if (args.length >= 1) {
|
||||
schematic = args[0];
|
||||
}
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (plot == null) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(loc.getWorld(), plr);
|
||||
if (currentPlots >= MainUtil.getAllowedPlots(plr)) { return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); }
|
||||
if (!MainUtil.canClaim(plr, plot)) { return sendMessage(plr, C.PLOT_IS_CLAIMED); }
|
||||
if (currentPlots >= MainUtil.getAllowedPlots(plr)) {
|
||||
return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS);
|
||||
}
|
||||
if (!MainUtil.canClaim(plr, plot)) {
|
||||
return sendMessage(plr, C.PLOT_IS_CLAIMED);
|
||||
}
|
||||
final PlotWorld world = PS.get().getPlotWorld(plot.world);
|
||||
if ((EconHandler.manager != null) && world.USE_ECONOMY)
|
||||
{
|
||||
if ((EconHandler.manager != null) && world.USE_ECONOMY) {
|
||||
final double cost = world.PLOT_PRICE;
|
||||
if (cost > 0d)
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < cost) { return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost); }
|
||||
if (cost > 0d) {
|
||||
if (EconHandler.manager.getMoney(plr) < cost) {
|
||||
return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost);
|
||||
}
|
||||
EconHandler.manager.withdrawMoney(plr, cost);
|
||||
sendMessage(plr, C.REMOVED_BALANCE, cost + "");
|
||||
}
|
||||
}
|
||||
if (!schematic.equals(""))
|
||||
{
|
||||
if (world.SCHEMATIC_CLAIM_SPECIFY)
|
||||
{
|
||||
if (!world.SCHEMATICS.contains(schematic.toLowerCase())) { return sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent: " + schematic); }
|
||||
if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic")) { return sendMessage(plr,
|
||||
C.NO_SCHEMATIC_PERMISSION, schematic); }
|
||||
if (!schematic.equals("")) {
|
||||
if (world.SCHEMATIC_CLAIM_SPECIFY) {
|
||||
if (!world.SCHEMATICS.contains(schematic.toLowerCase())) {
|
||||
return sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent: " + schematic);
|
||||
}
|
||||
if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic")) {
|
||||
return sendMessage(plr, C.NO_SCHEMATIC_PERMISSION, schematic);
|
||||
}
|
||||
}
|
||||
}
|
||||
return claimPlot(plr, plot, false, schematic, false) || sendMessage(plr, C.PLOT_NOT_CLAIMED);
|
||||
|
@ -37,106 +37,78 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "clear",
|
||||
description = "Clear a plot",
|
||||
permission = "plots.clear",
|
||||
category = CommandCategory.ACTIONS,
|
||||
usage = "/plot clear [id]")
|
||||
public class Clear extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "clear", description = "Clear a plot", permission = "plots.clear", category = CommandCategory.ACTIONS, usage = "/plot clear [id]")
|
||||
public class Clear extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot;
|
||||
if (args.length == 2)
|
||||
{
|
||||
if (args.length == 2) {
|
||||
final PlotId id = PlotId.fromString(args[0]);
|
||||
if (id == null)
|
||||
{
|
||||
if (args[1].equalsIgnoreCase("mine"))
|
||||
{
|
||||
if (id == null) {
|
||||
if (args[1].equalsIgnoreCase("mine")) {
|
||||
final Set<Plot> plots = PS.get().getPlots(plr);
|
||||
if (plots.size() == 0)
|
||||
{
|
||||
if (plots.size() == 0) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOTS);
|
||||
return false;
|
||||
}
|
||||
plot = plots.iterator().next();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
plot = MainUtil.getPlot(loc.getWorld(), id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
plot = MainUtil.getPlot(loc);
|
||||
}
|
||||
if (plot == null)
|
||||
{
|
||||
if (plot == null) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]");
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
// if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
|
||||
// return sendMessage(plr, C.UNLINK_REQUIRED);
|
||||
// }
|
||||
if (((plot == null) || !plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.clear")) { return sendMessage(plr, C.NO_PLOT_PERMS); }
|
||||
if (((plot == null) || !plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.clear")) {
|
||||
return sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
}
|
||||
assert plot != null;
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
if ((FlagManager.getPlotFlag(plot, "done") != null)
|
||||
&& (!Permissions.hasPermission(plr, "plots.continue") || (Settings.DONE_COUNTS_TOWARDS_LIMIT && (MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))))
|
||||
{
|
||||
&& (!Permissions.hasPermission(plr, "plots.continue") || (Settings.DONE_COUNTS_TOWARDS_LIMIT && (MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr))))) {
|
||||
MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE);
|
||||
return false;
|
||||
}
|
||||
final Runnable runnable = new Runnable()
|
||||
{
|
||||
final Runnable runnable = new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final long start = System.currentTimeMillis();
|
||||
final boolean result = MainUtil.clearAsPlayer(plot, plot.owner == null, new Runnable()
|
||||
{
|
||||
final boolean result = MainUtil.clearAsPlayer(plot, plot.owner == null, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
// If the state changes, then mark it as no longer done
|
||||
if (FlagManager.getPlotFlag(plot, "done") != null)
|
||||
{
|
||||
if (FlagManager.getPlotFlag(plot, "done") != null) {
|
||||
FlagManager.removePlotFlag(plot, "done");
|
||||
}
|
||||
if (FlagManager.getPlotFlag(plot, "analysis") != null)
|
||||
{
|
||||
if (FlagManager.getPlotFlag(plot, "analysis") != null) {
|
||||
FlagManager.removePlotFlag(plot, "analysis");
|
||||
}
|
||||
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
|
||||
}
|
||||
});
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
}
|
||||
}
|
||||
};
|
||||
if (Settings.CONFIRM_CLEAR && !(Permissions.hasPermission(plr, "plots.confirm.bypass")))
|
||||
{
|
||||
if (Settings.CONFIRM_CLEAR && !(Permissions.hasPermission(plr, "plots.confirm.bypass"))) {
|
||||
CmdConfirm.addPending(plr, "/plot clear " + plot.id, runnable);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
TaskManager.runTask(runnable);
|
||||
}
|
||||
return true;
|
||||
|
@ -59,71 +59,53 @@ category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.cluster",
|
||||
description = "Manage a plot cluster")
|
||||
public class Cluster extends SubCommand
|
||||
{
|
||||
|
||||
public class Cluster extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
|
||||
// list, create, delete, resize, invite, kick, leave, helpers, tp, sethome
|
||||
if (args.length == 0)
|
||||
{
|
||||
if (args.length == 0) {
|
||||
// return arguments
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_AVAILABLE_ARGS);
|
||||
return false;
|
||||
}
|
||||
final String sub = args[0].toLowerCase();
|
||||
switch (sub)
|
||||
{
|
||||
switch (sub) {
|
||||
case "l":
|
||||
case "list":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.list"))
|
||||
{
|
||||
case "list": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.list")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.list");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 1)
|
||||
{
|
||||
if (args.length != 1) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster list");
|
||||
return false;
|
||||
}
|
||||
final HashSet<PlotCluster> clusters = ClusterManager.getClusters(plr.getLocation().getWorld());
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_LIST_HEADING, clusters.size() + "");
|
||||
for (final PlotCluster cluster : clusters)
|
||||
{
|
||||
for (final PlotCluster cluster : clusters) {
|
||||
// Ignore unmanaged clusters
|
||||
final String name = "'" + cluster.getName() + "' : " + cluster.toString();
|
||||
if (UUIDHandler.getUUID(plr).equals(cluster.owner))
|
||||
{
|
||||
if (UUIDHandler.getUUID(plr).equals(cluster.owner)) {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&a" + name);
|
||||
}
|
||||
else if (cluster.helpers.contains(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
} else if (cluster.helpers.contains(UUIDHandler.getUUID(plr))) {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&3" + name);
|
||||
}
|
||||
else if (cluster.invited.contains(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
} else if (cluster.invited.contains(UUIDHandler.getUUID(plr))) {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&9" + name);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, cluster.toString());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case "c":
|
||||
case "create":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create"))
|
||||
{
|
||||
case "create": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 4)
|
||||
{
|
||||
if (args.length != 4) {
|
||||
final PlotId id = ClusterManager.estimatePlotId(plr.getLocation());
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster create <name> <id-bot> <id-top>");
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_CURRENT_PLOTID, "" + id);
|
||||
@ -132,23 +114,19 @@ public class Cluster extends SubCommand
|
||||
// check pos1 / pos2
|
||||
PlotId pos1 = MainUtil.parseId(args[2]);
|
||||
PlotId pos2 = MainUtil.parseId(args[3]);
|
||||
if ((pos1 == null) || (pos2 == null))
|
||||
{
|
||||
if ((pos1 == null) || (pos2 == null)) {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
return false;
|
||||
}
|
||||
// check if name is taken
|
||||
final String name = args[1];
|
||||
for (final PlotCluster cluster : ClusterManager.getClusters(plr.getLocation().getWorld()))
|
||||
{
|
||||
if (name.equals(cluster.getName()))
|
||||
{
|
||||
for (final PlotCluster cluster : ClusterManager.getClusters(plr.getLocation().getWorld())) {
|
||||
if (name.equals(cluster.getName())) {
|
||||
MainUtil.sendMessage(plr, C.ALIAS_IS_TAKEN);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if ((pos2.x < pos1.x) || (pos2.y < pos1.y))
|
||||
{
|
||||
if ((pos2.x < pos1.x) || (pos2.y < pos1.y)) {
|
||||
pos1 = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y));
|
||||
pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y));
|
||||
}
|
||||
@ -156,22 +134,17 @@ public class Cluster extends SubCommand
|
||||
final String world = plr.getLocation().getWorld();
|
||||
final PlotClusterId id = new PlotClusterId(pos1, pos2);
|
||||
final HashSet<PlotCluster> intersects = ClusterManager.getIntersects(world, id);
|
||||
if ((intersects.size() > 0))
|
||||
{
|
||||
if ((intersects.size() > 0)) {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_INTERSECTION, intersects.size() + "");
|
||||
return false;
|
||||
}
|
||||
// Check if it occupies existing plots
|
||||
final Set<Plot> plots = MainUtil.getPlotSelectionOwned(world, pos1, pos2);
|
||||
if (plots.size() > 0)
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create.other"))
|
||||
{
|
||||
if (plots.size() > 0) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create.other")) {
|
||||
final UUID uuid = plr.getUUID();
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
if (!plot.isOwner(uuid))
|
||||
{
|
||||
for (final Plot plot : plots) {
|
||||
if (!plot.isOwner(uuid)) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create.other");
|
||||
return false;
|
||||
}
|
||||
@ -181,41 +154,30 @@ public class Cluster extends SubCommand
|
||||
// Check allowed cluster size
|
||||
final PlotCluster cluster = new PlotCluster(world, pos1, pos2, UUIDHandler.getUUID(plr));
|
||||
int current;
|
||||
if (Settings.GLOBAL_LIMIT)
|
||||
{
|
||||
if (Settings.GLOBAL_LIMIT) {
|
||||
current = ClusterManager.getPlayerClusterCount(plr);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
current = ClusterManager.getPlayerClusterCount(world, plr);
|
||||
}
|
||||
final int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
|
||||
if ((current + cluster.getArea()) > allowed)
|
||||
{
|
||||
if ((current + cluster.getArea()) > allowed) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea()));
|
||||
return false;
|
||||
}
|
||||
// Set the generator (if applicable)
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (plotworld == null)
|
||||
{
|
||||
if (plotworld == null) {
|
||||
PS.get().config.createSection("worlds." + world);
|
||||
PS.get().loadWorld(world, PS.get().IMP.getGenerator(world, null));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
String gen_string = PS.get().config.getString("worlds." + world + "." + "generator.plugin");
|
||||
if (gen_string == null)
|
||||
{
|
||||
if (gen_string == null) {
|
||||
gen_string = "PlotSquared";
|
||||
}
|
||||
final PlotGenerator<?> wrapper = PS.get().IMP.getGenerator(world, gen_string);
|
||||
if (wrapper.isFull())
|
||||
{
|
||||
if (wrapper.isFull()) {
|
||||
wrapper.augment(cluster, plotworld);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ","));
|
||||
return false;
|
||||
}
|
||||
@ -237,20 +199,16 @@ public class Cluster extends SubCommand
|
||||
// create cluster
|
||||
cluster.settings.setAlias(name);
|
||||
DBFunc.createCluster(world, cluster);
|
||||
if (!ClusterManager.clusters.containsKey(world))
|
||||
{
|
||||
if (!ClusterManager.clusters.containsKey(world)) {
|
||||
ClusterManager.clusters.put(world, new HashSet<PlotCluster>());
|
||||
}
|
||||
ClusterManager.clusters.get(world).add(cluster);
|
||||
// Add any existing plots to the current cluster
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
if (plot.hasOwner())
|
||||
{
|
||||
for (final Plot plot : plots) {
|
||||
if (plot.hasOwner()) {
|
||||
final Flag flag = new Flag(FlagManager.getFlag("cluster"), cluster);
|
||||
FlagManager.addPlotFlag(plot, flag);
|
||||
if (!cluster.isAdded(plot.owner))
|
||||
{
|
||||
if (!cluster.isAdded(plot.owner)) {
|
||||
cluster.invited.add(plot.owner);
|
||||
DBFunc.setInvited(world, cluster, plot.owner);
|
||||
}
|
||||
@ -261,65 +219,50 @@ public class Cluster extends SubCommand
|
||||
}
|
||||
case "disband":
|
||||
case "del":
|
||||
case "delete":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete"))
|
||||
{
|
||||
case "delete": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete");
|
||||
return false;
|
||||
}
|
||||
if ((args.length != 1) && (args.length != 2))
|
||||
{
|
||||
if ((args.length != 1) && (args.length != 2)) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster delete [name]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2)
|
||||
{
|
||||
if (args.length == 2) {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete.other"))
|
||||
{
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete.other")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete.other");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(plr.getLocation().getWorld());
|
||||
if (plotworld.TYPE == 2)
|
||||
{
|
||||
if (plotworld.TYPE == 2) {
|
||||
final ArrayList<Plot> toRemove = new ArrayList<>();
|
||||
for (final Plot plot : PS.get().getPlotsInWorld(plr.getLocation().getWorld()))
|
||||
{
|
||||
for (final Plot plot : PS.get().getPlotsInWorld(plr.getLocation().getWorld())) {
|
||||
final PlotCluster other = ClusterManager.getCluster(plot);
|
||||
if (cluster.equals(other))
|
||||
{
|
||||
if (cluster.equals(other)) {
|
||||
toRemove.add(plot);
|
||||
}
|
||||
}
|
||||
for (final Plot plot : toRemove)
|
||||
{
|
||||
for (final Plot plot : toRemove) {
|
||||
plot.unclaim();
|
||||
}
|
||||
}
|
||||
DBFunc.delete(cluster);
|
||||
if (plotworld.TYPE == 2)
|
||||
{
|
||||
if (plotworld.TYPE == 2) {
|
||||
SetupUtils.manager.removePopulator(plr.getLocation().getWorld(), cluster);
|
||||
}
|
||||
ClusterManager.last = null;
|
||||
@ -329,28 +272,23 @@ public class Cluster extends SubCommand
|
||||
return true;
|
||||
}
|
||||
case "res":
|
||||
case "resize":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize"))
|
||||
{
|
||||
case "resize": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 3)
|
||||
{
|
||||
if (args.length != 3) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster resize <pos1> <pos2>");
|
||||
return false;
|
||||
}
|
||||
// check pos1 / pos2
|
||||
PlotId pos1 = MainUtil.parseId(args[1]);
|
||||
PlotId pos2 = MainUtil.parseId(args[2]);
|
||||
if ((pos1 == null) || (pos2 == null))
|
||||
{
|
||||
if ((pos1 == null) || (pos2 == null)) {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
return false;
|
||||
}
|
||||
if ((pos2.x < pos1.x) || (pos2.y < pos1.y))
|
||||
{
|
||||
if ((pos2.x < pos1.x) || (pos2.y < pos1.y)) {
|
||||
pos1 = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y));
|
||||
pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y));
|
||||
}
|
||||
@ -358,15 +296,12 @@ public class Cluster extends SubCommand
|
||||
final Location loc = plr.getLocation();
|
||||
final String world = loc.getWorld();
|
||||
final PlotCluster cluster = ClusterManager.getCluster(loc);
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.other"))
|
||||
{
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.other")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.other");
|
||||
return false;
|
||||
}
|
||||
@ -374,8 +309,7 @@ public class Cluster extends SubCommand
|
||||
//check if overlap
|
||||
final PlotClusterId id = new PlotClusterId(pos1, pos2);
|
||||
final HashSet<PlotCluster> intersects = ClusterManager.getIntersects(world, id);
|
||||
if (intersects.size() > 1)
|
||||
{
|
||||
if (intersects.size() > 1) {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_INTERSECTION, (intersects.size() - 1) + "");
|
||||
return false;
|
||||
}
|
||||
@ -384,46 +318,36 @@ public class Cluster extends SubCommand
|
||||
final HashSet<Plot> removed = ((HashSet<Plot>) existing.clone());
|
||||
removed.removeAll(newplots);
|
||||
// Check expand / shrink
|
||||
if (removed.size() > 0)
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.shrink"))
|
||||
{
|
||||
if (removed.size() > 0) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.shrink")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.shrink");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
newplots.removeAll(existing);
|
||||
if (newplots.size() > 0)
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.expand"))
|
||||
{
|
||||
if (newplots.size() > 0) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.expand")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.expand");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Check allowed cluster size
|
||||
int current;
|
||||
if (Settings.GLOBAL_LIMIT)
|
||||
{
|
||||
if (Settings.GLOBAL_LIMIT) {
|
||||
current = ClusterManager.getPlayerClusterCount(plr);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
current = ClusterManager.getPlayerClusterCount(world, plr);
|
||||
}
|
||||
current -= cluster.getArea() + (((1 + pos2.x) - pos1.x) * ((1 + pos2.y) - pos1.y));
|
||||
final int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
|
||||
if ((current + cluster.getArea()) > allowed)
|
||||
{
|
||||
if ((current + cluster.getArea()) > allowed) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea()));
|
||||
return false;
|
||||
}
|
||||
for (final Plot plot : removed)
|
||||
{
|
||||
for (final Plot plot : removed) {
|
||||
FlagManager.removePlotFlag(plot, "cluster");
|
||||
}
|
||||
for (final Plot plot : newplots)
|
||||
{
|
||||
for (final Plot plot : newplots) {
|
||||
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("cluster"), cluster));
|
||||
}
|
||||
// resize cluster
|
||||
@ -433,41 +357,31 @@ public class Cluster extends SubCommand
|
||||
}
|
||||
case "reg":
|
||||
case "regenerate":
|
||||
case "regen":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete"))
|
||||
{
|
||||
case "regen": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen");
|
||||
return false;
|
||||
}
|
||||
if ((args.length != 1) && (args.length != 2))
|
||||
{
|
||||
if ((args.length != 1) && (args.length != 2)) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster regen [name]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2)
|
||||
{
|
||||
if (args.length == 2) {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.regen.other"))
|
||||
{
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.regen.other")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen.other");
|
||||
return false;
|
||||
}
|
||||
@ -479,49 +393,40 @@ public class Cluster extends SubCommand
|
||||
}
|
||||
case "add":
|
||||
case "inv":
|
||||
case "invite":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite"))
|
||||
{
|
||||
case "invite": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2)
|
||||
{
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster invite <player>");
|
||||
return false;
|
||||
}
|
||||
// check if in cluster
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite.other"))
|
||||
{
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite.other")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite.other");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// check uuid
|
||||
final UUID uuid = UUIDHandler.getUUID(args[1], null);
|
||||
if (uuid == null)
|
||||
{
|
||||
if (uuid == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.isAdded(uuid))
|
||||
{
|
||||
if (!cluster.isAdded(uuid)) {
|
||||
// add the user if not added
|
||||
cluster.invited.add(uuid);
|
||||
final String world = plr.getLocation().getWorld();
|
||||
DBFunc.setInvited(world, cluster, uuid);
|
||||
final PlotPlayer player = UUIDHandler.getPlayer(uuid);
|
||||
if (player != null)
|
||||
{
|
||||
if (player != null) {
|
||||
MainUtil.sendMessage(player, C.CLUSTER_INVITED, cluster.getName());
|
||||
}
|
||||
}
|
||||
@ -530,62 +435,50 @@ public class Cluster extends SubCommand
|
||||
}
|
||||
case "k":
|
||||
case "remove":
|
||||
case "kick":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick"))
|
||||
{
|
||||
case "kick": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2)
|
||||
{
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster kick <player>");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick.other"))
|
||||
{
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick.other")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick.other");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// check uuid
|
||||
final UUID uuid = UUIDHandler.getUUID(args[1], null);
|
||||
if (uuid == null)
|
||||
{
|
||||
if (uuid == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[1]);
|
||||
return false;
|
||||
}
|
||||
// Can't kick if the player is yourself, the owner, or not added to the cluster
|
||||
if (uuid.equals(UUIDHandler.getUUID(plr)) || uuid.equals(cluster.owner) || !cluster.isAdded(uuid))
|
||||
{
|
||||
if (uuid.equals(UUIDHandler.getUUID(plr)) || uuid.equals(cluster.owner) || !cluster.isAdded(uuid)) {
|
||||
MainUtil.sendMessage(plr, C.CANNOT_KICK_PLAYER, cluster.getName());
|
||||
return false;
|
||||
}
|
||||
if (cluster.helpers.contains(uuid))
|
||||
{
|
||||
if (cluster.helpers.contains(uuid)) {
|
||||
cluster.helpers.remove(uuid);
|
||||
DBFunc.removeHelper(cluster, uuid);
|
||||
}
|
||||
cluster.invited.remove(uuid);
|
||||
DBFunc.removeInvited(cluster, uuid);
|
||||
final PlotPlayer player = UUIDHandler.getPlayer(uuid);
|
||||
if (player != null)
|
||||
{
|
||||
if (player != null) {
|
||||
MainUtil.sendMessage(player, C.CLUSTER_REMOVED, cluster.getName());
|
||||
}
|
||||
for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid)))
|
||||
{
|
||||
for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid))) {
|
||||
final PlotCluster current = ClusterManager.getCluster(plot);
|
||||
if ((current != null) && current.equals(cluster))
|
||||
{
|
||||
if ((current != null) && current.equals(cluster)) {
|
||||
plr.getLocation().getWorld();
|
||||
plot.unclaim();
|
||||
}
|
||||
@ -594,61 +487,48 @@ public class Cluster extends SubCommand
|
||||
return true;
|
||||
}
|
||||
case "quit":
|
||||
case "leave":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.leave"))
|
||||
{
|
||||
case "leave": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.leave")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.leave");
|
||||
return false;
|
||||
}
|
||||
if ((args.length != 1) && (args.length != 2))
|
||||
{
|
||||
if ((args.length != 1) && (args.length != 2)) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster leave [name]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2)
|
||||
{
|
||||
if (args.length == 2) {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
final UUID uuid = UUIDHandler.getUUID(plr);
|
||||
if (!cluster.isAdded(uuid))
|
||||
{
|
||||
if (!cluster.isAdded(uuid)) {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_NOT_ADDED);
|
||||
return false;
|
||||
}
|
||||
if (uuid.equals(cluster.owner))
|
||||
{
|
||||
if (uuid.equals(cluster.owner)) {
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_CANNOT_LEAVE);
|
||||
return false;
|
||||
}
|
||||
if (cluster.helpers.contains(uuid))
|
||||
{
|
||||
if (cluster.helpers.contains(uuid)) {
|
||||
cluster.helpers.remove(uuid);
|
||||
DBFunc.removeHelper(cluster, uuid);
|
||||
}
|
||||
cluster.invited.remove(uuid);
|
||||
DBFunc.removeInvited(cluster, uuid);
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_REMOVED, cluster.getName());
|
||||
for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid)))
|
||||
{
|
||||
for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid))) {
|
||||
final PlotCluster current = ClusterManager.getCluster(plot);
|
||||
if ((current != null) && current.equals(cluster))
|
||||
{
|
||||
if ((current != null) && current.equals(cluster)) {
|
||||
plr.getLocation().getWorld();
|
||||
plot.unclaim();
|
||||
}
|
||||
@ -657,38 +537,31 @@ public class Cluster extends SubCommand
|
||||
}
|
||||
case "admin":
|
||||
case "helper":
|
||||
case "helpers":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.helpers"))
|
||||
{
|
||||
case "helpers": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.helpers")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.helpers");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 3)
|
||||
{
|
||||
if (args.length != 3) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster helpers <add|remove> <player>");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
final UUID uuid = UUIDHandler.getUUID(args[2], null);
|
||||
if (uuid == null)
|
||||
{
|
||||
if (uuid == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]);
|
||||
return false;
|
||||
}
|
||||
if (args[1].toLowerCase().equals("add"))
|
||||
{
|
||||
if (args[1].toLowerCase().equals("add")) {
|
||||
cluster.helpers.add(uuid);
|
||||
DBFunc.setHelper(cluster, uuid);
|
||||
return MainUtil.sendMessage(plr, C.CLUSTER_ADDED_HELPER);
|
||||
}
|
||||
if (args[1].toLowerCase().equals("remove"))
|
||||
{
|
||||
if (args[1].toLowerCase().equals("remove")) {
|
||||
cluster.helpers.remove(uuid);
|
||||
DBFunc.removeHelper(cluster, uuid);
|
||||
return MainUtil.sendMessage(plr, C.CLUSTER_REMOVED_HELPER);
|
||||
@ -698,29 +571,23 @@ public class Cluster extends SubCommand
|
||||
}
|
||||
case "spawn":
|
||||
case "home":
|
||||
case "tp":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp"))
|
||||
{
|
||||
case "tp": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2)
|
||||
{
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster tp <name>");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
final UUID uuid = UUIDHandler.getUUID(plr);
|
||||
if (!cluster.isAdded(uuid))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp.other"))
|
||||
{
|
||||
if (!cluster.isAdded(uuid)) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp.other")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp.other");
|
||||
return false;
|
||||
}
|
||||
@ -731,41 +598,32 @@ public class Cluster extends SubCommand
|
||||
case "i":
|
||||
case "info":
|
||||
case "show":
|
||||
case "information":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.info"))
|
||||
{
|
||||
case "information": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.info")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.info");
|
||||
return false;
|
||||
}
|
||||
if ((args.length != 1) && (args.length != 2))
|
||||
{
|
||||
if ((args.length != 1) && (args.length != 2)) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster info [name]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2)
|
||||
{
|
||||
if (args.length == 2) {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
final String id = cluster.toString();
|
||||
String owner = UUIDHandler.getName(cluster.owner);
|
||||
if (owner == null)
|
||||
{
|
||||
if (owner == null) {
|
||||
owner = "unknown";
|
||||
}
|
||||
final String name = cluster.getName();
|
||||
@ -782,28 +640,22 @@ public class Cluster extends SubCommand
|
||||
}
|
||||
case "sh":
|
||||
case "setspawn":
|
||||
case "sethome":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome"))
|
||||
{
|
||||
case "sethome": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome");
|
||||
return false;
|
||||
}
|
||||
if ((args.length != 1) && (args.length != 2))
|
||||
{
|
||||
if ((args.length != 1) && (args.length != 2)) {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster sethome");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null)
|
||||
{
|
||||
if (cluster == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome.other"))
|
||||
{
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome.other")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome.other");
|
||||
return false;
|
||||
}
|
||||
|
@ -4,8 +4,7 @@ package com.intellectualcrafters.plot.commands;
|
||||
* CommandCategory
|
||||
*
|
||||
*/
|
||||
public enum CommandCategory
|
||||
{
|
||||
public enum CommandCategory {
|
||||
/**
|
||||
* Claiming Commands
|
||||
*
|
||||
@ -40,20 +39,18 @@ public enum CommandCategory
|
||||
* The category name (Readable)
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param name readable name
|
||||
*/
|
||||
CommandCategory(final String name)
|
||||
{
|
||||
CommandCategory(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
@ -27,28 +27,25 @@ import com.intellectualcrafters.plot.util.Permissions;
|
||||
* Created by Citymonstret on 2014-08-03.
|
||||
*
|
||||
*/
|
||||
public class CommandPermission
|
||||
{
|
||||
public class CommandPermission {
|
||||
/**
|
||||
* Permission Node
|
||||
*/
|
||||
public final String permission;
|
||||
|
||||
|
||||
/**
|
||||
* @param permission Command Permission
|
||||
*/
|
||||
public CommandPermission(final String permission)
|
||||
{
|
||||
public CommandPermission(final String permission) {
|
||||
this.permission = permission.toLowerCase();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param player Does the player have the permission?
|
||||
*
|
||||
* @return true of player has the required permission node
|
||||
*/
|
||||
public boolean hasPermission(final PlotPlayer player)
|
||||
{
|
||||
public boolean hasPermission(final PlotPlayer player) {
|
||||
return Permissions.hasPermission(player, permission);
|
||||
}
|
||||
}
|
||||
|
@ -35,27 +35,17 @@ import com.intellectualcrafters.plot.util.StringMan;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "comment",
|
||||
aliases = { "msg" },
|
||||
description = "Comment on a plot",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.comment")
|
||||
public class Comment extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "comment", aliases = { "msg" }, description = "Comment on a plot", category = CommandCategory.ACTIONS, requiredType = RequiredType.NONE, permission = "plots.comment")
|
||||
public class Comment extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String[] args)
|
||||
{
|
||||
if (args.length < 2)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, final String[] args) {
|
||||
if (args.length < 2) {
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
|
||||
return false;
|
||||
}
|
||||
final CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase());
|
||||
if (inbox == null)
|
||||
{
|
||||
if (inbox == null) {
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
|
||||
return false;
|
||||
}
|
||||
@ -63,39 +53,31 @@ public class Comment extends SubCommand
|
||||
final Location loc = player.getLocation();
|
||||
final PlotId id = PlotId.fromString(args[1]);
|
||||
int index;
|
||||
if (id != null)
|
||||
{
|
||||
if (args.length < 4)
|
||||
{
|
||||
if (id != null) {
|
||||
if (args.length < 4) {
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
|
||||
return false;
|
||||
}
|
||||
index = 2;
|
||||
plot = MainUtil.getPlot(loc.getWorld(), id);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
index = 1;
|
||||
plot = MainUtil.getPlot(loc);
|
||||
}
|
||||
if (!inbox.canWrite(plot, player))
|
||||
{
|
||||
if (!inbox.canWrite(plot, player)) {
|
||||
sendMessage(player, C.NO_PERM_INBOX, "");
|
||||
return false;
|
||||
}
|
||||
final String message = StringMan.join(Arrays.copyOfRange(args, index, args.length), " ");
|
||||
final PlotComment comment = new PlotComment(loc.getWorld(), id, message, player.getName(), inbox.toString(), System.currentTimeMillis());
|
||||
final boolean result = inbox.addComment(plot, comment);
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
sendMessage(player, C.NO_PLOT_INBOX, "");
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
|
||||
return false;
|
||||
}
|
||||
for (final PlotPlayer pp : UUIDHandler.getPlayers().values())
|
||||
{
|
||||
if (pp.getAttribute("chatspy"))
|
||||
{
|
||||
for (final PlotPlayer pp : UUIDHandler.getPlayers().values()) {
|
||||
if (pp.getAttribute("chatspy")) {
|
||||
MainUtil.sendMessage(pp, "/plot comment " + StringMan.join(args, " "));
|
||||
}
|
||||
}
|
||||
|
@ -35,52 +35,37 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.MathMan;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "condense",
|
||||
permission = "plots.admin",
|
||||
description = "Condense a plotworld",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE)
|
||||
public class Condense extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "condense", permission = "plots.admin", description = "Condense a plotworld", category = CommandCategory.DEBUG, requiredType = RequiredType.CONSOLE)
|
||||
public class Condense extends SubCommand {
|
||||
|
||||
public static boolean TASK = false;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
if ((args.length != 2) && (args.length != 3))
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
if ((args.length != 2) && (args.length != 3)) {
|
||||
MainUtil.sendMessage(plr, "/plot condense <world> <start|stop|info> [radius]");
|
||||
return false;
|
||||
}
|
||||
final String worldname = args[0];
|
||||
if (!BlockManager.manager.isWorld(worldname) || !PS.get().isPlotWorld(worldname))
|
||||
{
|
||||
if (!BlockManager.manager.isWorld(worldname) || !PS.get().isPlotWorld(worldname)) {
|
||||
MainUtil.sendMessage(plr, "INVALID WORLD");
|
||||
return false;
|
||||
}
|
||||
switch (args[1].toLowerCase())
|
||||
{
|
||||
case "start":
|
||||
{
|
||||
if (args.length == 2)
|
||||
{
|
||||
switch (args[1].toLowerCase()) {
|
||||
case "start": {
|
||||
if (args.length == 2) {
|
||||
MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>");
|
||||
return false;
|
||||
}
|
||||
if (TASK)
|
||||
{
|
||||
if (TASK) {
|
||||
MainUtil.sendMessage(plr, "TASK ALREADY STARTED");
|
||||
return false;
|
||||
}
|
||||
if (args.length == 2)
|
||||
{
|
||||
if (args.length == 2) {
|
||||
MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>");
|
||||
return false;
|
||||
}
|
||||
if (!MathMan.isInteger(args[2]))
|
||||
{
|
||||
if (!MathMan.isInteger(args[2])) {
|
||||
MainUtil.sendMessage(plr, "INVALID RADIUS");
|
||||
return false;
|
||||
}
|
||||
@ -88,76 +73,61 @@ public class Condense extends SubCommand
|
||||
final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname);
|
||||
final int size = plots.size();
|
||||
final int minimum_radius = (int) Math.ceil((Math.sqrt(size) / 2) + 1);
|
||||
if (radius < minimum_radius)
|
||||
{
|
||||
if (radius < minimum_radius) {
|
||||
MainUtil.sendMessage(plr, "RADIUS TOO SMALL");
|
||||
return false;
|
||||
}
|
||||
final List<PlotId> to_move = new ArrayList<>(getPlots(plots, radius));
|
||||
final List<PlotId> free = new ArrayList<>();
|
||||
PlotId start = new PlotId(0, 0);
|
||||
while ((start.x <= minimum_radius) && (start.y <= minimum_radius))
|
||||
{
|
||||
while ((start.x <= minimum_radius) && (start.y <= minimum_radius)) {
|
||||
final Plot plot = MainUtil.getPlot(worldname, start);
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
if (!plot.hasOwner()) {
|
||||
free.add(plot.id);
|
||||
}
|
||||
start = Auto.getNextPlot(start, 1);
|
||||
}
|
||||
if ((free.size() == 0) || (to_move.size() == 0))
|
||||
{
|
||||
if ((free.size() == 0) || (to_move.size() == 0)) {
|
||||
MainUtil.sendMessage(plr, "NO FREE PLOTS FOUND");
|
||||
return false;
|
||||
}
|
||||
MainUtil.move(MainUtil.getPlot(worldname, to_move.get(0)), MainUtil.getPlot(worldname, free.get(0)), new Runnable()
|
||||
{
|
||||
MainUtil.move(MainUtil.getPlot(worldname, to_move.get(0)), MainUtil.getPlot(worldname, free.get(0)), new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (!TASK)
|
||||
{
|
||||
public void run() {
|
||||
if (!TASK) {
|
||||
MainUtil.sendMessage(plr, "CONDENSE TASK CANCELLED");
|
||||
return;
|
||||
}
|
||||
to_move.remove(0);
|
||||
free.remove(0);
|
||||
int index = 0;
|
||||
for (final PlotId id : to_move)
|
||||
{
|
||||
for (final PlotId id : to_move) {
|
||||
final Plot plot = MainUtil.getPlot(worldname, id);
|
||||
if (plot.hasOwner())
|
||||
{
|
||||
if (plot.hasOwner()) {
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
for (int i = 0; i < index; i++)
|
||||
{
|
||||
for (int i = 0; i < index; i++) {
|
||||
to_move.remove(0);
|
||||
}
|
||||
index = 0;
|
||||
for (final PlotId id : free)
|
||||
{
|
||||
for (final PlotId id : free) {
|
||||
final Plot plot = MainUtil.getPlot(worldname, id);
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
if (!plot.hasOwner()) {
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
for (int i = 0; i < index; i++)
|
||||
{
|
||||
for (int i = 0; i < index; i++) {
|
||||
free.remove(0);
|
||||
}
|
||||
if (to_move.size() == 0)
|
||||
{
|
||||
if (to_move.size() == 0) {
|
||||
MainUtil.sendMessage(plr, "TASK COMPLETE. PLEASE VERIFY THAT NO NEW PLOTS HAVE BEEN CLAIMED DURING TASK.");
|
||||
TASK = false;
|
||||
return;
|
||||
}
|
||||
if (free.size() == 0)
|
||||
{
|
||||
if (free.size() == 0) {
|
||||
MainUtil.sendMessage(plr, "TASK FAILED. NO FREE PLOTS FOUND!");
|
||||
TASK = false;
|
||||
return;
|
||||
@ -170,10 +140,8 @@ public class Condense extends SubCommand
|
||||
MainUtil.sendMessage(plr, "TASK STARTED...");
|
||||
return true;
|
||||
}
|
||||
case "stop":
|
||||
{
|
||||
if (!TASK)
|
||||
{
|
||||
case "stop": {
|
||||
if (!TASK) {
|
||||
MainUtil.sendMessage(plr, "TASK ALREADY STOPPED");
|
||||
return false;
|
||||
}
|
||||
@ -181,15 +149,12 @@ public class Condense extends SubCommand
|
||||
MainUtil.sendMessage(plr, "TASK STOPPED");
|
||||
return true;
|
||||
}
|
||||
case "info":
|
||||
{
|
||||
if (args.length == 2)
|
||||
{
|
||||
case "info": {
|
||||
if (args.length == 2) {
|
||||
MainUtil.sendMessage(plr, "/plot condense " + worldname + " info <radius>");
|
||||
return false;
|
||||
}
|
||||
if (!MathMan.isInteger(args[2]))
|
||||
{
|
||||
if (!MathMan.isInteger(args[2])) {
|
||||
MainUtil.sendMessage(plr, "INVALID RADIUS");
|
||||
return false;
|
||||
}
|
||||
@ -197,8 +162,7 @@ public class Condense extends SubCommand
|
||||
final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname);
|
||||
final int size = plots.size();
|
||||
final int minimum_radius = (int) Math.ceil((Math.sqrt(size) / 2) + 1);
|
||||
if (radius < minimum_radius)
|
||||
{
|
||||
if (radius < minimum_radius) {
|
||||
MainUtil.sendMessage(plr, "RADIUS TOO SMALL");
|
||||
return false;
|
||||
}
|
||||
@ -218,14 +182,11 @@ public class Condense extends SubCommand
|
||||
MainUtil.sendMessage(plr, "/plot condense " + worldname + " <start|stop|info> [radius]");
|
||||
return false;
|
||||
}
|
||||
|
||||
public Set<PlotId> getPlots(final Collection<Plot> plots, final int radius)
|
||||
{
|
||||
|
||||
public Set<PlotId> getPlots(final Collection<Plot> plots, final int radius) {
|
||||
final HashSet<PlotId> outside = new HashSet<>();
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
if ((plot.id.x > radius) || (plot.id.x < -radius) || (plot.id.y > radius) || (plot.id.y < -radius))
|
||||
{
|
||||
for (final Plot plot : plots) {
|
||||
if ((plot.id.x > radius) || (plot.id.x < -radius) || (plot.id.y > radius) || (plot.id.y < -radius)) {
|
||||
outside.add(plot.id);
|
||||
}
|
||||
}
|
||||
|
@ -28,26 +28,18 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "confirm",
|
||||
permission = "plots.use",
|
||||
description = "Confirm an action",
|
||||
category = CommandCategory.ACTIONS)
|
||||
public class Confirm extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "confirm", permission = "plots.use", description = "Confirm an action", category = CommandCategory.ACTIONS)
|
||||
public class Confirm extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
final CmdInstance command = CmdConfirm.getPending(plr);
|
||||
if (command == null)
|
||||
{
|
||||
if (command == null) {
|
||||
MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
|
||||
return false;
|
||||
}
|
||||
CmdConfirm.removePending(plr);
|
||||
if ((System.currentTimeMillis() - command.timestamp) > 20000)
|
||||
{
|
||||
if ((System.currentTimeMillis() - command.timestamp) > 20000) {
|
||||
MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
|
||||
return false;
|
||||
}
|
||||
|
@ -36,32 +36,28 @@ description = "Continue a plot that was previously marked as done",
|
||||
permission = "plots.continue",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Continue extends SubCommand
|
||||
{
|
||||
|
||||
public class Continue extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.continue"))
|
||||
{
|
||||
if ((plot == null) || !plot.hasOwner()) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.continue")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (!plot.getSettings().flags.containsKey("done"))
|
||||
{
|
||||
if (!plot.getSettings().flags.containsKey("done")) {
|
||||
MainUtil.sendMessage(plr, C.DONE_NOT_DONE);
|
||||
return false;
|
||||
}
|
||||
if (Settings.DONE_COUNTS_TOWARDS_LIMIT && (MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))
|
||||
{
|
||||
if (Settings.DONE_COUNTS_TOWARDS_LIMIT && (MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr))) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.admin.command.continue");
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
|
@ -38,54 +38,43 @@ category = CommandCategory.ACTIONS,
|
||||
description = "Copy a plot",
|
||||
usage = "/plot copy <X;Z>",
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Copy extends SubCommand
|
||||
{
|
||||
|
||||
public Copy()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.PlotID
|
||||
};
|
||||
public class Copy extends SubCommand {
|
||||
|
||||
public Copy() {
|
||||
requiredArguments = new Argument[] { Argument.PlotID };
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot1 = MainUtil.getPlot(loc);
|
||||
if (plot1 == null) { return !MainUtil.sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot1.isAdded(plr.getUUID()) && !Permissions.hasPermission(plr, C.PERMISSION_ADMIN.s()))
|
||||
{
|
||||
if (plot1 == null) {
|
||||
return !MainUtil.sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot1.isAdded(plr.getUUID()) && !Permissions.hasPermission(plr, C.PERMISSION_ADMIN.s())) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
final String world = loc.getWorld();
|
||||
final PlotId plot2 = MainUtil.parseId(args[0]);
|
||||
if ((plot2 == null))
|
||||
{
|
||||
if ((plot2 == null)) {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot copy <X;Z>");
|
||||
return false;
|
||||
}
|
||||
if (plot1.id.equals(plot2))
|
||||
{
|
||||
if (plot1.id.equals(plot2)) {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot copy <X;Z>");
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.copy(world, plot1.id, plot2, new Runnable()
|
||||
{
|
||||
if (MainUtil.copy(world, plot1.id, plot2, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(plr, C.COPY_SUCCESS);
|
||||
}
|
||||
}))
|
||||
{
|
||||
})) {
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.REQUIRES_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
|
@ -38,16 +38,18 @@ requiredType = RequiredType.NONE,
|
||||
permission = "plots.createroadschematic",
|
||||
description = "Add a road schematic to your world using the roads around your current plot",
|
||||
usage = "/plot createroadschematic")
|
||||
public class CreateRoadSchematic extends SubCommand
|
||||
{
|
||||
|
||||
public class CreateRoadSchematic extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, final String... args) {
|
||||
final Location loc = player.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return sendMessage(player, C.NOT_IN_PLOT); }
|
||||
if (!(PS.get().getPlotWorld(loc.getWorld()) instanceof HybridPlotWorld)) { return sendMessage(player, C.NOT_IN_PLOT_WORLD); }
|
||||
if (plot == null) {
|
||||
return sendMessage(player, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!(PS.get().getPlotWorld(loc.getWorld()) instanceof HybridPlotWorld)) {
|
||||
return sendMessage(player, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
HybridUtils.manager.setupRoadSchematic(plot);
|
||||
MainUtil.sendMessage(player, "&6Saved new road schematic. To test the road, fly to a few other plots and use /plot debugroadregen");
|
||||
return true;
|
||||
|
@ -28,77 +28,57 @@ requiredType = RequiredType.CONSOLE,
|
||||
usage = "/plots database [world] <sqlite|mysql|import>"
|
||||
|
||||
)
|
||||
public class Database extends SubCommand
|
||||
{
|
||||
|
||||
public static void insertPlots(final SQLManager manager, final ArrayList<Plot> plots, final PlotPlayer player)
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
public class Database extends SubCommand {
|
||||
|
||||
public static void insertPlots(final SQLManager manager, final ArrayList<Plot> plots, final PlotPlayer player) {
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
public void run() {
|
||||
try {
|
||||
final ArrayList<Plot> ps = new ArrayList<>();
|
||||
for (final Plot p : plots)
|
||||
{
|
||||
for (final Plot p : plots) {
|
||||
ps.add(p);
|
||||
}
|
||||
MainUtil.sendMessage(player, "&6Starting...");
|
||||
manager.createPlotsAndData(ps, new Runnable()
|
||||
{
|
||||
manager.createPlotsAndData(ps, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(player, "&6Database conversion finished!");
|
||||
manager.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
MainUtil.sendMessage(player, "Failed to insert plot objects, see stacktrace for info");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, String[] args)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, String[] args) {
|
||||
if (args.length < 1) {
|
||||
MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql>");
|
||||
return false;
|
||||
}
|
||||
ArrayList<Plot> plots;
|
||||
if (PS.get().isPlotWorld(args[0]))
|
||||
{
|
||||
if (PS.get().isPlotWorld(args[0])) {
|
||||
plots = PS.get().sortPlotsByTemp(PS.get().getPlotsInWorld(args[0]));
|
||||
args = Arrays.copyOfRange(args, 1, args.length);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
plots = PS.get().sortPlotsByTemp(PS.get().getPlotsRaw());
|
||||
}
|
||||
if (args.length < 1)
|
||||
{
|
||||
if (args.length < 1) {
|
||||
MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql|import>");
|
||||
MainUtil.sendMessage(player, "[arg] indicates an optional argument");
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
try {
|
||||
com.intellectualcrafters.plot.database.Database implementation;
|
||||
String prefix = "";
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "import":
|
||||
{
|
||||
if (args.length < 2)
|
||||
{
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "import": {
|
||||
if (args.length < 2) {
|
||||
MainUtil.sendMessage(player, "/plot database import [sqlite file] [prefix]");
|
||||
return false;
|
||||
}
|
||||
@ -107,13 +87,10 @@ public class Database extends SubCommand
|
||||
final SQLManager manager = new SQLManager(implementation, (args.length == 3) ? args[2] : "", true);
|
||||
final ConcurrentHashMap<String, ConcurrentHashMap<PlotId, Plot>> map = manager.getPlots();
|
||||
plots = new ArrayList<Plot>();
|
||||
for (final Entry<String, ConcurrentHashMap<PlotId, Plot>> entry : map.entrySet())
|
||||
{
|
||||
for (final Entry<PlotId, Plot> entry2 : entry.getValue().entrySet())
|
||||
{
|
||||
for (final Entry<String, ConcurrentHashMap<PlotId, Plot>> entry : map.entrySet()) {
|
||||
for (final Entry<PlotId, Plot> entry2 : entry.getValue().entrySet()) {
|
||||
final Plot plot = entry2.getValue();
|
||||
if (PS.get().getPlot(plot.world, plot.id) != null)
|
||||
{
|
||||
if (PS.get().getPlot(plot.world, plot.id) != null) {
|
||||
MainUtil.sendMessage(player, "Skipping duplicate plot: " + plot + " | id=" + plot.temp);
|
||||
continue;
|
||||
}
|
||||
@ -121,44 +98,42 @@ public class Database extends SubCommand
|
||||
plots.add(entry2.getValue());
|
||||
}
|
||||
}
|
||||
DBFunc.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
DBFunc.createPlotsAndData(plots, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(player, "&6Database conversion finished!");
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case "mysql":
|
||||
if (args.length < 6) { return MainUtil.sendMessage(player, "/plot database mysql [host] [port] [username] [password] [database] {prefix}"); }
|
||||
if (args.length < 6) {
|
||||
return MainUtil.sendMessage(player, "/plot database mysql [host] [port] [username] [password] [database] {prefix}");
|
||||
}
|
||||
final String host = args[1];
|
||||
final String port = args[2];
|
||||
final String username = args[3];
|
||||
final String password = args[4];
|
||||
final String database = args[5];
|
||||
if (args.length > 6)
|
||||
{
|
||||
if (args.length > 6) {
|
||||
prefix = args[6];
|
||||
}
|
||||
implementation = new MySQL(host, port, database, username, password);
|
||||
break;
|
||||
case "sqlite":
|
||||
if (args.length < 2) { return MainUtil.sendMessage(player, "/plot database sqlite [file]"); }
|
||||
if (args.length < 2) {
|
||||
return MainUtil.sendMessage(player, "/plot database sqlite [file]");
|
||||
}
|
||||
implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db");
|
||||
break;
|
||||
default:
|
||||
return MainUtil.sendMessage(player, "/plot database [sqlite/mysql]");
|
||||
}
|
||||
try
|
||||
{
|
||||
try {
|
||||
final SQLManager manager = new SQLManager(implementation, prefix, true);
|
||||
insertPlots(manager, plots, player);
|
||||
return true;
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
MainUtil.sendMessage(player, "$1Failed to save plots, read stacktrace for info");
|
||||
MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ===");
|
||||
e.printStackTrace();
|
||||
@ -166,9 +141,7 @@ public class Database extends SubCommand
|
||||
MainUtil.sendMessage(player, "$1Please make sure you are using the correct arguments!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
MainUtil.sendMessage(player, "$1Failed to open connection, read stacktrace for info");
|
||||
MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ===");
|
||||
e.printStackTrace();
|
||||
|
@ -27,23 +27,14 @@ import com.intellectualcrafters.plot.util.Lag;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debug",
|
||||
category = CommandCategory.DEBUG,
|
||||
description = "Show debug information",
|
||||
usage = "/plot debug [msg]",
|
||||
permission = "plots.admin")
|
||||
public class Debug extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "debug", category = CommandCategory.DEBUG, description = "Show debug information", usage = "/plot debug [msg]", permission = "plots.admin")
|
||||
public class Debug extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
if ((args.length > 0) && args[0].equalsIgnoreCase("msg"))
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
if ((args.length > 0) && args[0].equalsIgnoreCase("msg")) {
|
||||
final StringBuilder msg = new StringBuilder();
|
||||
for (final C c : C.values())
|
||||
{
|
||||
for (final C c : C.values()) {
|
||||
msg.append(c.s()).append("\n");
|
||||
}
|
||||
MainUtil.sendMessage(plr, msg.toString());
|
||||
@ -59,8 +50,7 @@ public class Debug extends SubCommand
|
||||
}
|
||||
{
|
||||
final StringBuilder worlds = new StringBuilder("");
|
||||
for (final String world : PS.get().getPlotWorlds())
|
||||
{
|
||||
for (final String world : PS.get().getPlotWorlds()) {
|
||||
worlds.append(world).append(" ");
|
||||
}
|
||||
information.append(header);
|
||||
@ -80,14 +70,12 @@ public class Debug extends SubCommand
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private String getSection(final String line, final String val)
|
||||
{
|
||||
|
||||
private String getSection(final String line, final String val) {
|
||||
return line.replaceAll("%val%", val) + "\n";
|
||||
}
|
||||
|
||||
private String getLine(final String line, final String var, final Object val)
|
||||
{
|
||||
|
||||
private String getLine(final String line, final String var, final Object val) {
|
||||
return line.replaceAll("%var%", var).replaceAll("%val%", "" + val) + "\n";
|
||||
}
|
||||
}
|
||||
|
@ -15,26 +15,21 @@ usage = "/plot debugallowunsafe",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.debugallowunsafe")
|
||||
public class DebugAllowUnsafe extends SubCommand
|
||||
{
|
||||
|
||||
public class DebugAllowUnsafe extends SubCommand {
|
||||
|
||||
public static final List<UUID> unsafeAllowed = new ArrayList<>();
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
|
||||
if (unsafeAllowed.contains(plr.getUUID()))
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args) {
|
||||
|
||||
if (unsafeAllowed.contains(plr.getUUID())) {
|
||||
unsafeAllowed.remove(plr.getUUID());
|
||||
sendMessage(plr, C.DEBUGALLOWUNSAFE_OFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
unsafeAllowed.add(plr.getUUID());
|
||||
sendMessage(plr, C.DEBUGALLOWUNSAFE_ON);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -48,49 +48,44 @@ description = "If you accidentally delete your database, this command will attem
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
permission = "plots.debugclaimtest")
|
||||
public class DebugClaimTest extends SubCommand
|
||||
{
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport)
|
||||
{
|
||||
public class DebugClaimTest extends SubCommand {
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport) {
|
||||
return claimPlot(player, plot, teleport, "");
|
||||
}
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic)
|
||||
{
|
||||
|
||||
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic) {
|
||||
final boolean result = EventUtil.manager.callClaim(player, plot, false);
|
||||
if (result)
|
||||
{
|
||||
if (result) {
|
||||
MainUtil.createPlot(player.getUUID(), plot);
|
||||
MainUtil.setSign(player.getName(), plot);
|
||||
MainUtil.sendMessage(player, C.CLAIMED);
|
||||
if (teleport)
|
||||
{
|
||||
if (teleport) {
|
||||
MainUtil.teleportPlayer(player, player.getLocation(), plot);
|
||||
}
|
||||
}
|
||||
return !result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
if (args.length < 3) { return !MainUtil
|
||||
.sendMessage(
|
||||
null,
|
||||
"If you accidentally delete your database, this command will attempt to restore all plots based on the data from the plot signs. \n\n&cMissing world arg /plot debugclaimtest {world} {PlotId min} {PlotId max}"); }
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
if (args.length < 3) {
|
||||
return !MainUtil
|
||||
.sendMessage(
|
||||
null,
|
||||
"If you accidentally delete your database, this command will attempt to restore all plots based on the data from the plot signs. \n\n&cMissing world arg /plot debugclaimtest {world} {PlotId min} {PlotId max}");
|
||||
}
|
||||
final String world = args[0];
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) { return !MainUtil.sendMessage(null, "&cInvalid plot world!"); }
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) {
|
||||
return !MainUtil.sendMessage(null, "&cInvalid plot world!");
|
||||
}
|
||||
PlotId min, max;
|
||||
try
|
||||
{
|
||||
try {
|
||||
args[1].split(";");
|
||||
args[2].split(";");
|
||||
min = PlotId.fromString(args[1]);
|
||||
max = PlotId.fromString(args[2]);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
return !MainUtil.sendMessage(null,
|
||||
"&cInvalid min/max values. &7The values are to Plot IDs in the format &cX;Y &7where X;Y are the plot coords\nThe conversion will only check the plots in the selected area.");
|
||||
}
|
||||
@ -99,77 +94,59 @@ public class DebugClaimTest extends SubCommand
|
||||
final PlotManager manager = PS.get().getPlotManager(world);
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
final ArrayList<Plot> plots = new ArrayList<>();
|
||||
for (final PlotId id : MainUtil.getPlotSelectionIds(min, max))
|
||||
{
|
||||
for (final PlotId id : MainUtil.getPlotSelectionIds(min, max)) {
|
||||
final Plot plot = MainUtil.getPlot(world, id);
|
||||
if (PS.get().getPlot(world, plot.id) != null)
|
||||
{
|
||||
if (PS.get().getPlot(world, plot.id) != null) {
|
||||
MainUtil.sendMessage(null, " - &cDB Already contains: " + plot.id);
|
||||
continue;
|
||||
}
|
||||
final Location loc = manager.getSignLoc(plotworld, plot);
|
||||
final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4);
|
||||
final boolean result = ChunkManager.manager.loadChunk(world, chunk, false);
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
continue;
|
||||
}
|
||||
final String[] lines = BlockManager.manager.getSign(loc);
|
||||
if (lines != null)
|
||||
{
|
||||
if (lines != null) {
|
||||
String line = lines[2];
|
||||
if ((line != null) && (line.length() > 2))
|
||||
{
|
||||
if ((line != null) && (line.length() > 2)) {
|
||||
line = line.substring(2);
|
||||
final BiMap<StringWrapper, UUID> map = UUIDHandler.getUuidMap();
|
||||
UUID uuid = (map.get(new StringWrapper(line)));
|
||||
if (uuid == null)
|
||||
{
|
||||
for (final StringWrapper string : map.keySet())
|
||||
{
|
||||
if (string.value.toLowerCase().startsWith(line.toLowerCase()))
|
||||
{
|
||||
if (uuid == null) {
|
||||
for (final StringWrapper string : map.keySet()) {
|
||||
if (string.value.toLowerCase().startsWith(line.toLowerCase())) {
|
||||
uuid = map.get(string);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uuid == null)
|
||||
{
|
||||
if (uuid == null) {
|
||||
uuid = UUIDHandler.getUUID(line, null);
|
||||
}
|
||||
if (uuid != null)
|
||||
{
|
||||
if (uuid != null) {
|
||||
MainUtil.sendMessage(null, " - &aFound plot: " + plot.id + " : " + line);
|
||||
plot.owner = uuid;
|
||||
plots.add(plot);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(null, " - &cInvalid playername: " + plot.id + " : " + line);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (plots.size() > 0)
|
||||
{
|
||||
if (plots.size() > 0) {
|
||||
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Updating '" + plots.size() + "' plots!");
|
||||
DBFunc.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
DBFunc.createPlotsAndData(plots, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(null, "&6Database update finished!");
|
||||
}
|
||||
});
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
for (final Plot plot : plots) {
|
||||
PS.get().updatePlot(plot);
|
||||
}
|
||||
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Complete!");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(null, "No plots were found for the given search.");
|
||||
}
|
||||
return true;
|
||||
|
@ -32,35 +32,32 @@ import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugclear",
|
||||
aliases = { "fastclear" },
|
||||
description = "Clear a plot using a fast experiment algorithm",
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugClear extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "debugclear", aliases = { "fastclear" }, description = "Clear a plot using a fast experiment algorithm", category = CommandCategory.DEBUG)
|
||||
public class DebugClear extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if ((plot == null) || !(PS.get().getPlotWorld(loc.getWorld()) instanceof SquarePlotWorld)) { return sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) { return sendMessage(plr, C.UNLINK_REQUIRED); }
|
||||
if ((!plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.debugclear")) { return sendMessage(plr, C.NO_PLOT_PERMS); }
|
||||
if ((plot == null) || !(PS.get().getPlotWorld(loc.getWorld()) instanceof SquarePlotWorld)) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
|
||||
return sendMessage(plr, C.UNLINK_REQUIRED);
|
||||
}
|
||||
if ((!plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.debugclear")) {
|
||||
return sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
}
|
||||
final Location pos1 = MainUtil.getPlotBottomLoc(loc.getWorld(), plot.id).add(1, 0, 1);
|
||||
final Location pos2 = MainUtil.getPlotTopLoc(loc.getWorld(), plot.id);
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
MainUtil.runners.put(plot, 1);
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, new Runnable()
|
||||
{
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.runners.remove(plot);
|
||||
MainUtil.sendMessage(plr, "&aDone!");
|
||||
}
|
||||
|
@ -74,25 +74,16 @@ import com.plotsquared.bukkit.util.BukkitHybridUtils;
|
||||
import com.plotsquared.general.commands.Command;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugexec",
|
||||
permission = "plots.admin",
|
||||
description = "Mutli-purpose debug command",
|
||||
aliases = { "exec" },
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugExec extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "debugexec", permission = "plots.admin", description = "Mutli-purpose debug command", aliases = { "exec" }, category = CommandCategory.DEBUG)
|
||||
public class DebugExec extends SubCommand {
|
||||
|
||||
private ScriptEngine engine;
|
||||
private Bindings scope;
|
||||
|
||||
public DebugExec()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
public DebugExec() {
|
||||
try {
|
||||
final File file = new File(PS.get().IMP.getDirectory(), "scripts" + File.separator + "start.js");
|
||||
if (file.exists())
|
||||
{
|
||||
if (file.exists()) {
|
||||
init();
|
||||
final String script = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), "start.js"), StandardCharsets.UTF_8),
|
||||
System.getProperty("line.separator"));
|
||||
@ -100,39 +91,35 @@ public class DebugExec extends SubCommand
|
||||
scope.put("PlotPlayer", ConsolePlayer.getConsole());
|
||||
engine.eval(script, scope);
|
||||
}
|
||||
}
|
||||
catch (final Exception e)
|
||||
{}
|
||||
} catch (final Exception e) {}
|
||||
}
|
||||
|
||||
public ScriptEngine getEngine()
|
||||
{
|
||||
|
||||
public ScriptEngine getEngine() {
|
||||
return engine;
|
||||
}
|
||||
|
||||
public Bindings getScope()
|
||||
{
|
||||
|
||||
public Bindings getScope() {
|
||||
return scope;
|
||||
}
|
||||
|
||||
public void init()
|
||||
{
|
||||
if (engine != null) { return; }
|
||||
|
||||
public void init() {
|
||||
if (engine != null) {
|
||||
return;
|
||||
}
|
||||
engine = (new ScriptEngineManager(null)).getEngineByName("nashorn");
|
||||
if (engine == null)
|
||||
{
|
||||
if (engine == null) {
|
||||
engine = (new ScriptEngineManager(null)).getEngineByName("JavaScript");
|
||||
}
|
||||
final ScriptContext context = new SimpleScriptContext();
|
||||
scope = context.getBindings(ScriptContext.ENGINE_SCOPE);
|
||||
|
||||
|
||||
// stuff
|
||||
scope.put("MainUtil", new MainUtil());
|
||||
scope.put("Settings", new Settings());
|
||||
scope.put("StringMan", new StringMan());
|
||||
scope.put("MathMan", new MathMan());
|
||||
scope.put("FlagManager", new FlagManager());
|
||||
|
||||
|
||||
// Classes
|
||||
scope.put("Location", Location.class);
|
||||
scope.put("PlotBlock", PlotBlock.class);
|
||||
@ -140,7 +127,7 @@ public class DebugExec extends SubCommand
|
||||
scope.put("PlotId", PlotId.class);
|
||||
scope.put("Runnable", Runnable.class);
|
||||
scope.put("RunnableVal", RunnableVal.class);
|
||||
|
||||
|
||||
// Instances
|
||||
scope.put("PS", PS.get());
|
||||
scope.put("TaskManager", PS.get().TASK);
|
||||
@ -157,143 +144,110 @@ public class DebugExec extends SubCommand
|
||||
scope.put("HybridUtils", HybridUtils.manager);
|
||||
scope.put("IMP", PS.get().IMP);
|
||||
scope.put("MainCommand", MainCommand.getInstance());
|
||||
|
||||
|
||||
// enums
|
||||
for (final Enum<?> value : C.values())
|
||||
{
|
||||
for (final Enum<?> value : C.values()) {
|
||||
scope.put("C_" + value.name(), value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, final String... args) {
|
||||
final List<String> allowed_params = Arrays.asList("calibrate-analysis", "remove-flag", "stop-expire", "start-expire", "show-expired", "update-expired", "seen", "trim-check");
|
||||
if (args.length > 0)
|
||||
{
|
||||
if (args.length > 0) {
|
||||
final String arg = args[0].toLowerCase();
|
||||
String script;
|
||||
boolean async = false;
|
||||
switch (arg)
|
||||
{
|
||||
case "analyze":
|
||||
{
|
||||
switch (arg) {
|
||||
case "analyze": {
|
||||
final Plot plot = MainUtil.getPlot(player.getLocation());
|
||||
if (plot == null)
|
||||
{
|
||||
if (plot == null) {
|
||||
MainUtil.sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
final PlotAnalysis analysis = plot.getComplexity();
|
||||
if (analysis != null)
|
||||
{
|
||||
if (analysis != null) {
|
||||
final int complexity = analysis.getComplexity();
|
||||
MainUtil.sendMessage(player, "Changes: " + analysis.changes);
|
||||
MainUtil.sendMessage(player, "Complexity: " + complexity);
|
||||
return true;
|
||||
}
|
||||
MainUtil.sendMessage(player, "$1Starting task...");
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>()
|
||||
{
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(player, "$1Done: $2use $3/plot debugexec analyze$2 for more information");
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case "calibrate-analysis":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
case "calibrate-analysis": {
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec analyze <threshold>");
|
||||
MainUtil.sendMessage(player, "$1<threshold> $2= $1The percentage of plots you want to clear (100 clears 100% of plots so no point calibrating it)");
|
||||
return false;
|
||||
}
|
||||
double threshold;
|
||||
try
|
||||
{
|
||||
try {
|
||||
threshold = Integer.parseInt(args[1]) / 100d;
|
||||
}
|
||||
catch (final NumberFormatException e)
|
||||
{
|
||||
} catch (final NumberFormatException e) {
|
||||
MainUtil.sendMessage(player, "$2Invalid threshold: " + args[1]);
|
||||
MainUtil.sendMessage(player, "$1<threshold> $2= $1The percentage of plots you want to clear as a number between 0 - 100");
|
||||
return false;
|
||||
}
|
||||
PlotAnalysis.calcOptimalModifiers(new Runnable()
|
||||
{
|
||||
PlotAnalysis.calcOptimalModifiers(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(player, "$1Thank you for calibrating PlotSquared plot expiry");
|
||||
}
|
||||
}, threshold);
|
||||
return true;
|
||||
}
|
||||
case "stop-expire":
|
||||
{
|
||||
if (ExpireManager.task != -1)
|
||||
{
|
||||
case "stop-expire": {
|
||||
if (ExpireManager.task != -1) {
|
||||
PS.get().TASK.cancelTask(ExpireManager.task);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return MainUtil.sendMessage(player, "Task already halted");
|
||||
}
|
||||
ExpireManager.task = -1;
|
||||
return MainUtil.sendMessage(player, "Cancelled task.");
|
||||
}
|
||||
case "remove-flag":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
case "remove-flag": {
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec remove-flag <flag>");
|
||||
return false;
|
||||
}
|
||||
final String flag = args[1];
|
||||
for (final Plot plot : PS.get().getPlots())
|
||||
{
|
||||
if (FlagManager.getPlotFlag(plot, flag) != null)
|
||||
{
|
||||
for (final Plot plot : PS.get().getPlots()) {
|
||||
if (FlagManager.getPlotFlag(plot, flag) != null) {
|
||||
FlagManager.removePlotFlag(plot, flag);
|
||||
}
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Cleared flag: " + flag);
|
||||
}
|
||||
case "start-rgar":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
case "start-rgar": {
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(player, "&cInvalid syntax: /plot debugexec start-rgar <world>");
|
||||
return false;
|
||||
}
|
||||
boolean result;
|
||||
if (!PS.get().isPlotWorld(args[1]))
|
||||
{
|
||||
if (!PS.get().isPlotWorld(args[1])) {
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_PLOT_WORLD, args[1]);
|
||||
return false;
|
||||
}
|
||||
if (HybridUtils.regions != null)
|
||||
{
|
||||
if (HybridUtils.regions != null) {
|
||||
result = ((BukkitHybridUtils) (HybridUtils.manager)).scheduleRoadUpdate(args[1], HybridUtils.regions, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
result = HybridUtils.manager.scheduleRoadUpdate(args[1], 0);
|
||||
}
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(player, "&cCannot schedule mass schematic update! (Is one already in progress?)");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case "stop-rgar":
|
||||
{
|
||||
if (!HybridUtils.UPDATE)
|
||||
{
|
||||
case "stop-rgar": {
|
||||
if (!HybridUtils.UPDATE) {
|
||||
MainUtil.sendMessage(player, "&cTASK NOT RUNNING!");
|
||||
return false;
|
||||
}
|
||||
@ -301,53 +255,55 @@ public class DebugExec extends SubCommand
|
||||
MainUtil.sendMessage(player, "&cCancelling task... (please wait)");
|
||||
return true;
|
||||
}
|
||||
case "start-expire":
|
||||
{
|
||||
if (ExpireManager.task == -1)
|
||||
{
|
||||
case "start-expire": {
|
||||
if (ExpireManager.task == -1) {
|
||||
ExpireManager.runTask();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return MainUtil.sendMessage(player, "Plot expiry task already started");
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Started plot expiry task");
|
||||
}
|
||||
case "update-expired":
|
||||
{
|
||||
if (args.length > 1)
|
||||
{
|
||||
case "update-expired": {
|
||||
if (args.length > 1) {
|
||||
final String world = args[1];
|
||||
if (!BlockManager.manager.isWorld(world)) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
|
||||
if (!BlockManager.manager.isWorld(world)) {
|
||||
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
|
||||
}
|
||||
MainUtil.sendMessage(player, "Updating expired plot list");
|
||||
ExpireManager.updateExpired(args[1]);
|
||||
return true;
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Use /plot debugexec update-expired <world>");
|
||||
}
|
||||
case "show-expired":
|
||||
{
|
||||
if (args.length > 1)
|
||||
{
|
||||
case "show-expired": {
|
||||
if (args.length > 1) {
|
||||
final String world = args[1];
|
||||
if (!BlockManager.manager.isWorld(world)) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
|
||||
if (!ExpireManager.expiredPlots.containsKey(args[1])) { return MainUtil.sendMessage(player, "No task for world: " + args[1]); }
|
||||
if (!BlockManager.manager.isWorld(world)) {
|
||||
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
|
||||
}
|
||||
if (!ExpireManager.expiredPlots.containsKey(args[1])) {
|
||||
return MainUtil.sendMessage(player, "No task for world: " + args[1]);
|
||||
}
|
||||
MainUtil.sendMessage(player, "Expired plots (" + ExpireManager.expiredPlots.get(args[1]).size() + "):");
|
||||
for (final Plot plot : ExpireManager.expiredPlots.get(args[1]))
|
||||
{
|
||||
for (final Plot plot : ExpireManager.expiredPlots.get(args[1])) {
|
||||
MainUtil.sendMessage(player, " - " + plot.world + ";" + plot.id.x + ";" + plot.id.y + ";" + UUIDHandler.getName(plot.owner) + " : " + ExpireManager.dates.get(plot.owner));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Use /plot debugexec show-expired <world>");
|
||||
}
|
||||
case "seen":
|
||||
{
|
||||
if (args.length != 2) { return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>"); }
|
||||
case "seen": {
|
||||
if (args.length != 2) {
|
||||
return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>");
|
||||
}
|
||||
final UUID uuid = UUIDHandler.getUUID(args[1], null);
|
||||
if (uuid == null) { return MainUtil.sendMessage(player, "player not found: " + args[1]); }
|
||||
if (uuid == null) {
|
||||
return MainUtil.sendMessage(player, "player not found: " + args[1]);
|
||||
}
|
||||
final OfflinePlotPlayer op = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
|
||||
if ((op == null) || (op.getLastPlayed() == 0)) { return MainUtil.sendMessage(player, "player hasn't connected before: " + args[1]); }
|
||||
if ((op == null) || (op.getLastPlayed() == 0)) {
|
||||
return MainUtil.sendMessage(player, "player hasn't connected before: " + args[1]);
|
||||
}
|
||||
final Timestamp stamp = new Timestamp(op.getLastPlayed());
|
||||
final Date date = new Date(stamp.getTime());
|
||||
MainUtil.sendMessage(player, "PLAYER: " + args[1]);
|
||||
@ -357,40 +313,34 @@ public class DebugExec extends SubCommand
|
||||
MainUtil.sendMessage(player, "Local: " + date.toLocaleString());
|
||||
return true;
|
||||
}
|
||||
case "trim-check":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
case "trim-check": {
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(player, "Use /plot debugexec trim-check <world>");
|
||||
MainUtil.sendMessage(player, "&7 - Generates a list of regions to trim");
|
||||
return MainUtil.sendMessage(player, "&7 - Run after plot expiry has run");
|
||||
}
|
||||
final String world = args[1];
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(args[1])) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(args[1])) {
|
||||
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
|
||||
}
|
||||
final ArrayList<ChunkLoc> empty = new ArrayList<>();
|
||||
final boolean result = Trim.getTrimRegions(empty, world, new Runnable()
|
||||
{
|
||||
final boolean result = Trim.getTrimRegions(empty, world, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
Trim.sendMessage("Processing is complete! Here's how many chunks would be deleted:");
|
||||
Trim.sendMessage(" - MCA #: " + empty.size());
|
||||
Trim.sendMessage(" - CHUNKS: " + (empty.size() * 1024) + " (max)");
|
||||
Trim.sendMessage("Exporting log for manual approval...");
|
||||
final File file = new File(PS.get().IMP.getDirectory() + File.separator + "trim.txt");
|
||||
PrintWriter writer;
|
||||
try
|
||||
{
|
||||
try {
|
||||
writer = new PrintWriter(file);
|
||||
for (final ChunkLoc loc : empty)
|
||||
{
|
||||
for (final ChunkLoc loc : empty) {
|
||||
writer.println(world + "/region/r." + loc.x + "." + loc.z + ".mca");
|
||||
}
|
||||
writer.close();
|
||||
Trim.sendMessage("File saved to 'plugins/PlotSquared/trim.txt'");
|
||||
}
|
||||
catch (final FileNotFoundException e)
|
||||
{
|
||||
} catch (final FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Trim.sendMessage("File failed to save! :(");
|
||||
}
|
||||
@ -400,8 +350,7 @@ public class DebugExec extends SubCommand
|
||||
Trim.sendMessage(" - Add 31 to each number to get the end position");
|
||||
}
|
||||
});
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(player, "Trim task already started!");
|
||||
}
|
||||
return result;
|
||||
@ -409,31 +358,23 @@ public class DebugExec extends SubCommand
|
||||
case "h":
|
||||
case "he":
|
||||
case "?":
|
||||
case "help":
|
||||
{
|
||||
case "help": {
|
||||
MainUtil.sendMessage(player, "Possible sub commands: /plot debugexec <" + StringMan.join(allowed_params, "|") + ">");
|
||||
return false;
|
||||
}
|
||||
case "addcmd":
|
||||
{
|
||||
try
|
||||
{
|
||||
case "addcmd": {
|
||||
try {
|
||||
final String cmd = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), args[1]), StandardCharsets.UTF_8),
|
||||
System.getProperty("line.separator"));
|
||||
final Command<PlotPlayer> subcommand = new Command<PlotPlayer>(args[1].split("\\.")[0])
|
||||
{
|
||||
final Command<PlotPlayer> subcommand = new Command<PlotPlayer>(args[1].split("\\.")[0]) {
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
try {
|
||||
scope.put("PlotPlayer", plr);
|
||||
scope.put("args", args);
|
||||
engine.eval(cmd, scope);
|
||||
return true;
|
||||
}
|
||||
catch (final ScriptException e)
|
||||
{
|
||||
} catch (final ScriptException e) {
|
||||
e.printStackTrace();
|
||||
MainUtil.sendMessage(player, C.COMMAND_WENT_WRONG);
|
||||
return false;
|
||||
@ -442,87 +383,65 @@ public class DebugExec extends SubCommand
|
||||
};
|
||||
MainCommand.getInstance().addCommand(subcommand);
|
||||
return true;
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec addcmd <file>");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
case "runasync":
|
||||
{
|
||||
case "runasync": {
|
||||
async = true;
|
||||
}
|
||||
case "run":
|
||||
{
|
||||
try
|
||||
{
|
||||
case "run": {
|
||||
try {
|
||||
script = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), args[1]), StandardCharsets.UTF_8),
|
||||
System.getProperty("line.separator"));
|
||||
if (args.length > 2)
|
||||
{
|
||||
if (args.length > 2) {
|
||||
final HashMap<String, String> replacements = new HashMap<>();
|
||||
for (int i = 2; i < args.length; i++)
|
||||
{
|
||||
for (int i = 2; i < args.length; i++) {
|
||||
replacements.put("%s" + (i - 2), args[i]);
|
||||
}
|
||||
script = StringMan.replaceFromMap(script, replacements);
|
||||
}
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
default: {
|
||||
script = StringMan.join(args, " ");
|
||||
}
|
||||
}
|
||||
if (!ConsolePlayer.isConsole(player))
|
||||
{
|
||||
if (!ConsolePlayer.isConsole(player)) {
|
||||
MainUtil.sendMessage(player, C.NOT_CONSOLE);
|
||||
return false;
|
||||
}
|
||||
init();
|
||||
scope.put("PlotPlayer", player);
|
||||
PS.debug("> " + script);
|
||||
try
|
||||
{
|
||||
if (async)
|
||||
{
|
||||
try {
|
||||
if (async) {
|
||||
final String toExec = script;
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final long start = System.currentTimeMillis();
|
||||
try
|
||||
{
|
||||
try {
|
||||
engine.eval(toExec, scope);
|
||||
}
|
||||
catch (final ScriptException e)
|
||||
{
|
||||
} catch (final ScriptException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
PS.log("> " + (System.currentTimeMillis() - start) + "ms");
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
final long start = System.currentTimeMillis();
|
||||
engine.eval(script, scope);
|
||||
PS.log("> " + (System.currentTimeMillis() - start) + "ms");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (final ScriptException e)
|
||||
{
|
||||
} catch (final ScriptException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
@ -39,32 +39,28 @@ usage = "/plot fill",
|
||||
aliases = { "debugfill" },
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class DebugFill extends SubCommand
|
||||
{
|
||||
|
||||
public class DebugFill extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
if ((args.length != 1) || (!args[0].equalsIgnoreCase("outline") && !args[0].equalsIgnoreCase("all")))
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, final String... args) {
|
||||
if ((args.length != 1) || (!args[0].equalsIgnoreCase("outline") && !args[0].equalsIgnoreCase("all"))) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill <outline|all>");
|
||||
return true;
|
||||
}
|
||||
final Location loc = player.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return !sendMessage(player, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
if (plot == null) {
|
||||
return !sendMessage(player, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
MainUtil.sendMessage(player, C.PLOT_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.admin.command.fill"))
|
||||
{
|
||||
if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.admin.command.fill")) {
|
||||
MainUtil.sendMessage(player, C.NO_PLOT_PERMS);
|
||||
return true;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(player, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
@ -72,119 +68,87 @@ public class DebugFill extends SubCommand
|
||||
final Location top = MainUtil.getPlotTopLoc(plot.world, plot.id);
|
||||
MainUtil.sendMessage(player, "&cPreparing task");
|
||||
MainUtil.runners.put(plot, 1);
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
SetBlockQueue.addNotify(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
public void run() {
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(player, "&7 - Starting");
|
||||
if (args[0].equalsIgnoreCase("all"))
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("all")) {
|
||||
int height = 255;
|
||||
PlotBlock block = new PlotBlock((short) 7, (byte) 0);
|
||||
final PlotBlock air = new PlotBlock((short) 0, (byte) 0);
|
||||
if (args.length > 2)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (args.length > 2) {
|
||||
try {
|
||||
block = new PlotBlock(Short.parseShort(args[1]), (byte) 0);
|
||||
if (args.length == 3)
|
||||
{
|
||||
if (args.length == 3) {
|
||||
height = Integer.parseInt(args[2]);
|
||||
}
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill all <id> <height>");
|
||||
MainUtil.runners.remove(plot);
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (int y = 0; y <= height; y++)
|
||||
{
|
||||
for (int x = bottom.getX(); x <= top.getX(); x++)
|
||||
{
|
||||
for (int z = bottom.getZ(); z <= top.getZ(); z++)
|
||||
{
|
||||
for (int y = 0; y <= height; y++) {
|
||||
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
||||
for (int z = bottom.getZ(); z <= top.getZ(); z++) {
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, block);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int y = height + 1; y <= 255; y++)
|
||||
{
|
||||
for (int x = bottom.getX(); x <= top.getX(); x++)
|
||||
{
|
||||
for (int z = bottom.getZ(); z <= top.getZ(); z++)
|
||||
{
|
||||
for (int y = height + 1; y <= 255; y++) {
|
||||
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
||||
for (int z = bottom.getZ(); z <= top.getZ(); z++) {
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, air);
|
||||
}
|
||||
}
|
||||
}
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
SetBlockQueue.addNotify(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.runners.remove(plot);
|
||||
MainUtil.sendMessage(player, "&aFill task complete!");
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (args[0].equals("outline"))
|
||||
{
|
||||
} else if (args[0].equals("outline")) {
|
||||
int x, z;
|
||||
z = bottom.getZ();
|
||||
for (x = bottom.getX(); x <= (top.getX() - 1); x++)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
for (x = bottom.getX(); x <= (top.getX() - 1); x++) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
x = top.getX();
|
||||
for (z = bottom.getZ(); z <= (top.getZ() - 1); z++)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
for (z = bottom.getZ(); z <= (top.getZ() - 1); z++) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
z = top.getZ();
|
||||
for (x = top.getX(); x >= (bottom.getX() + 1); x--)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
for (x = top.getX(); x >= (bottom.getX() + 1); x--) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
x = bottom.getX();
|
||||
for (z = top.getZ(); z >= (bottom.getZ() + 1); z--)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
for (z = top.getZ(); z >= (bottom.getZ() + 1); z--) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
SetBlockQueue.addNotify(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(player, "&aWalls complete! The ceiling will take a while :(");
|
||||
bottom.setY(255);
|
||||
top.add(1, 0, 1);
|
||||
SetBlockQueue.setSlow(true);
|
||||
MainUtil.setSimpleCuboidAsync(plot.world, bottom, top, new PlotBlock((short) 7, (byte) 0));
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
SetBlockQueue.addNotify(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.runners.remove(plot);
|
||||
MainUtil.sendMessage(player, "&aFill task complete!");
|
||||
SetBlockQueue.setSlow(false);
|
||||
|
@ -43,41 +43,31 @@ permission = "plots.debugfixflags",
|
||||
description = "Attempt to fix all flags for a world",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugFixFlags extends SubCommand
|
||||
{
|
||||
|
||||
public DebugFixFlags()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.String
|
||||
};
|
||||
public class DebugFixFlags extends SubCommand {
|
||||
|
||||
public DebugFixFlags() {
|
||||
requiredArguments = new Argument[] { Argument.String };
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final String world = args[0];
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world))
|
||||
{
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_WORLD, args[0]);
|
||||
return false;
|
||||
}
|
||||
MainUtil.sendMessage(plr, "&8--- &6Starting task &8 ---");
|
||||
for (final Plot plot : PS.get().getPlotsInWorld(world))
|
||||
{
|
||||
for (final Plot plot : PS.get().getPlotsInWorld(world)) {
|
||||
final HashMap<String, Flag> flags = plot.getSettings().flags;
|
||||
final Iterator<Entry<String, Flag>> i = flags.entrySet().iterator();
|
||||
boolean changed = false;
|
||||
while (i.hasNext())
|
||||
{
|
||||
if (FlagManager.getFlag(i.next().getKey()) == null)
|
||||
{
|
||||
while (i.hasNext()) {
|
||||
if (FlagManager.getFlag(i.next().getKey()) == null) {
|
||||
changed = true;
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
if (changed)
|
||||
{
|
||||
if (changed) {
|
||||
DBFunc.setFlags(plot, plot.getSettings().flags.values());
|
||||
}
|
||||
}
|
||||
|
@ -34,20 +34,15 @@ description = "This debug command will force the reload of all plots in the DB",
|
||||
usage = "/plot debugloadtest",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE)
|
||||
public class DebugLoadTest extends SubCommand
|
||||
{
|
||||
|
||||
public class DebugLoadTest extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
try {
|
||||
final Field fPlots = PS.class.getDeclaredField("plots");
|
||||
fPlots.setAccessible(true);
|
||||
fPlots.set(null, DBFunc.getPlots());
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
PS.debug("&3===FAILED&3===");
|
||||
e.printStackTrace();
|
||||
PS.debug("&3===END OF STACKTRACE===");
|
||||
|
@ -21,27 +21,19 @@ usage = "/plot debugpaste",
|
||||
description = "Upload settings.yml & latest.log to hastebin",
|
||||
permission = "plots.debugpaste",
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugPaste extends SubCommand
|
||||
{
|
||||
|
||||
public class DebugPaste extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
public void run() {
|
||||
try {
|
||||
final String settingsYML = HastebinUtility.upload(PS.get().configFile);
|
||||
String latestLOG;
|
||||
try
|
||||
{
|
||||
try {
|
||||
latestLOG = HastebinUtility.upload(new File(BukkitMain.THIS.getDirectory(), "../../logs/latest.log"));
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
plr.sendMessage("&clatest.log is too big to be pasted, will ignore");
|
||||
latestLOG = "too big :(";
|
||||
}
|
||||
@ -54,8 +46,7 @@ public class DebugPaste extends SubCommand
|
||||
b.append("version.bukkit: '").append(Bukkit.getBukkitVersion()).append("'\n");
|
||||
b.append("online_mode: ").append(Bukkit.getServer().getOnlineMode()).append("\n");
|
||||
b.append("plugins:");
|
||||
for (final Plugin p : Bukkit.getPluginManager().getPlugins())
|
||||
{
|
||||
for (final Plugin p : Bukkit.getPluginManager().getPlugins()) {
|
||||
b.append("\n ").append(p.getName()).append(":\n ").append("version: '").append(p.getDescription().getVersion()).append("'").append("\n enabled: ").append(p.isEnabled());
|
||||
}
|
||||
b.append("\n\n# YAY! Now, let's see what we can find in your JVM\n");
|
||||
@ -70,12 +61,10 @@ public class DebugPaste extends SubCommand
|
||||
b.append("os.version: '").append(System.getProperty("os.version")).append("'\n\n");
|
||||
b.append("# Okay :D Great. You are now ready to create your bug report!");
|
||||
b.append("\n# You can do so at https://github.com/IntellectualSites/PlotSquared/issues");
|
||||
|
||||
|
||||
final String link = HastebinUtility.upload(b.toString());
|
||||
plr.sendMessage(C.DEBUG_REPORT_CREATED.s().replace("%url%", link));
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
@ -41,31 +41,25 @@ requiredType = RequiredType.NONE,
|
||||
description = "Regenerate all roads based on the road schematic",
|
||||
category = CommandCategory.DEBUG,
|
||||
permission = "plots.debugroadregen")
|
||||
public class DebugRoadRegen extends SubCommand
|
||||
{
|
||||
|
||||
public class DebugRoadRegen extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, final String... args) {
|
||||
final Location loc = player.getLocation();
|
||||
final String world = loc.getWorld();
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (!(plotworld instanceof HybridPlotWorld)) { return sendMessage(player, C.NOT_IN_PLOT_WORLD); }
|
||||
if (!(plotworld instanceof HybridPlotWorld)) {
|
||||
return sendMessage(player, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
final Plot plot = player.getCurrentPlot();
|
||||
if (plot == null)
|
||||
{
|
||||
if (plot == null) {
|
||||
final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4);
|
||||
int extend = 0;
|
||||
if (args.length == 1)
|
||||
{
|
||||
if (MathMan.isInteger(args[0]))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (args.length == 1) {
|
||||
if (MathMan.isInteger(args[0])) {
|
||||
try {
|
||||
extend = Integer.parseInt(args[0]);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
C.NOT_VALID_NUMBER.send(player, "(0, <EXTEND HEIGHT>)");
|
||||
return false;
|
||||
}
|
||||
@ -74,9 +68,7 @@ public class DebugRoadRegen extends SubCommand
|
||||
final boolean result = HybridUtils.manager.regenerateRoad(world, chunk, extend);
|
||||
MainUtil.sendMessage(player, "&6Regenerating chunk: " + chunk.x + "," + chunk.z + "\n&6 - Result: " + (result == true ? "&aSuccess" : "&cFailed"));
|
||||
MainUtil.sendMessage(player, "&cTo regenerate all roads: /plot regenallroads");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
final HybridPlotManager manager = (HybridPlotManager) PS.get().getPlotManager(world);
|
||||
manager.createRoadEast(plotworld, plot);
|
||||
manager.createRoadSouth(plotworld, plot);
|
||||
|
@ -36,20 +36,16 @@ category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
usage = "/plot debugsavetest",
|
||||
description = "This command will force the recreation of all plots in the DB")
|
||||
public class DebugSaveTest extends SubCommand
|
||||
{
|
||||
|
||||
public class DebugSaveTest extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final ArrayList<Plot> plots = new ArrayList<Plot>();
|
||||
plots.addAll(PS.get().getPlots());
|
||||
MainUtil.sendMessage(null, "&6Starting `DEBUGSAVETEST`");
|
||||
DBFunc.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
DBFunc.createPlotsAndData(plots, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(null, "&6Database sync finished!");
|
||||
}
|
||||
});
|
||||
|
@ -60,58 +60,44 @@ description = "Debug UUID conversion",
|
||||
usage = "/plot uuidconvert <lower|offline|online>",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugUUID extends SubCommand
|
||||
{
|
||||
|
||||
public DebugUUID()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.String
|
||||
};
|
||||
public class DebugUUID extends SubCommand {
|
||||
|
||||
public DebugUUID() {
|
||||
requiredArguments = new Argument[] { Argument.String };
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final PlotPlayer player = null;
|
||||
|
||||
|
||||
final UUIDWrapper currentUUIDWrapper = UUIDHandler.getUUIDWrapper();
|
||||
final UUIDWrapper newWrapper;
|
||||
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "lower":
|
||||
{
|
||||
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "lower": {
|
||||
newWrapper = new LowerOfflineUUIDWrapper();
|
||||
break;
|
||||
}
|
||||
case "offline":
|
||||
{
|
||||
case "offline": {
|
||||
newWrapper = new OfflineUUIDWrapper();
|
||||
break;
|
||||
}
|
||||
case "online":
|
||||
{
|
||||
case "online": {
|
||||
newWrapper = new DefaultUUIDWrapper();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
try
|
||||
{
|
||||
default: {
|
||||
try {
|
||||
final Class<?> clazz = Class.forName(args[0]);
|
||||
newWrapper = (UUIDWrapper) clazz.newInstance();
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot uuidconvert <lower|offline|online>");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((args.length != 2) || !args[1].equals("-o"))
|
||||
{
|
||||
|
||||
if ((args.length != 2) || !args[1].equals("-o")) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot uuidconvert " + args[0] + " - o");
|
||||
MainUtil.sendMessage(player, "&cBe aware of the following!");
|
||||
MainUtil.sendMessage(player, "&8 - &cUse the database command or another method to backup your plots beforehand");
|
||||
@ -122,294 +108,229 @@ public class DebugUUID extends SubCommand
|
||||
MainUtil.sendMessage(player, "&7Retype the command with the override parameter when ready :)");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (currentUUIDWrapper.getClass().getCanonicalName().equals(newWrapper.getClass().getCanonicalName()))
|
||||
{
|
||||
|
||||
if (currentUUIDWrapper.getClass().getCanonicalName().equals(newWrapper.getClass().getCanonicalName())) {
|
||||
MainUtil.sendMessage(player, "&cUUID mode already in use!");
|
||||
return false;
|
||||
}
|
||||
MainUtil.sendConsoleMessage("&6Beginning UUID mode conversion");
|
||||
MainUtil.sendConsoleMessage("&7 - Disconnecting players");
|
||||
for (final PlotPlayer pp : UUIDHandler.getPlayers().values())
|
||||
{
|
||||
for (final PlotPlayer pp : UUIDHandler.getPlayers().values()) {
|
||||
pp.kick("PlotSquared UUID conversion has been initiated. You may reconnect when finished.");
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Initializing map");
|
||||
|
||||
|
||||
final HashMap<UUID, UUID> uCMap = new HashMap<UUID, UUID>();
|
||||
final HashMap<UUID, UUID> uCReverse = new HashMap<UUID, UUID>();
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Collecting playerdata");
|
||||
|
||||
|
||||
final HashSet<String> worlds = new HashSet<>();
|
||||
worlds.add(Bukkit.getWorlds().get(0).getName());
|
||||
worlds.add("world");
|
||||
final HashSet<UUID> uuids = new HashSet<>();
|
||||
final HashSet<String> names = new HashSet<>();
|
||||
for (final String worldname : worlds)
|
||||
{
|
||||
for (final String worldname : worlds) {
|
||||
final File playerdataFolder = new File(worldname + File.separator + "playerdata");
|
||||
String[] dat = playerdataFolder.list(new FilenameFilter()
|
||||
{
|
||||
String[] dat = playerdataFolder.list(new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(final File f, final String s)
|
||||
{
|
||||
public boolean accept(final File f, final String s) {
|
||||
return s.endsWith(".dat");
|
||||
}
|
||||
});
|
||||
if (dat != null)
|
||||
{
|
||||
for (final String current : dat)
|
||||
{
|
||||
if (dat != null) {
|
||||
for (final String current : dat) {
|
||||
final String s = current.replaceAll(".dat$", "");
|
||||
try
|
||||
{
|
||||
try {
|
||||
final UUID uuid = UUID.fromString(s);
|
||||
uuids.add(uuid);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
MainUtil.sendMessage(plr, C.PREFIX.s() + "Invalid playerdata: " + current);
|
||||
}
|
||||
}
|
||||
}
|
||||
final File playersFolder = new File(worldname + File.separator + "players");
|
||||
dat = playersFolder.list(new FilenameFilter()
|
||||
{
|
||||
dat = playersFolder.list(new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(final File f, final String s)
|
||||
{
|
||||
public boolean accept(final File f, final String s) {
|
||||
return s.endsWith(".dat");
|
||||
}
|
||||
});
|
||||
if (dat != null)
|
||||
{
|
||||
for (final String current : dat)
|
||||
{
|
||||
if (dat != null) {
|
||||
for (final String current : dat) {
|
||||
names.add(current.replaceAll(".dat$", ""));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Populating map");
|
||||
UUID uuid2;
|
||||
final UUIDWrapper wrapper = new DefaultUUIDWrapper();
|
||||
for (UUID uuid : uuids)
|
||||
{
|
||||
try
|
||||
{
|
||||
for (UUID uuid : uuids) {
|
||||
try {
|
||||
final OfflinePlotPlayer op = wrapper.getOfflinePlayer(uuid);
|
||||
uuid = currentUUIDWrapper.getUUID(op);
|
||||
uuid2 = newWrapper.getUUID(op);
|
||||
if (!uuid.equals(uuid2) && !uCMap.containsKey(uuid) && !uCReverse.containsKey(uuid2))
|
||||
{
|
||||
if (!uuid.equals(uuid2) && !uCMap.containsKey(uuid) && !uCReverse.containsKey(uuid2)) {
|
||||
uCMap.put(uuid, uuid2);
|
||||
uCReverse.put(uuid2, uuid);
|
||||
}
|
||||
}
|
||||
catch (final Throwable e)
|
||||
{
|
||||
} catch (final Throwable e) {
|
||||
MainUtil.sendMessage(plr, C.PREFIX.s() + "&6Invalid playerdata: " + uuid.toString() + ".dat");
|
||||
}
|
||||
}
|
||||
for (final String name : names)
|
||||
{
|
||||
for (final String name : names) {
|
||||
final UUID uuid = currentUUIDWrapper.getUUID(name);
|
||||
uuid2 = newWrapper.getUUID(name);
|
||||
if (!uuid.equals(uuid2))
|
||||
{
|
||||
if (!uuid.equals(uuid2)) {
|
||||
uCMap.put(uuid, uuid2);
|
||||
uCReverse.put(uuid2, uuid);
|
||||
}
|
||||
}
|
||||
if (uCMap.size() == 0)
|
||||
{
|
||||
if (uCMap.size() == 0) {
|
||||
MainUtil.sendConsoleMessage("&c - Error! Attempting to repopulate");
|
||||
for (final OfflinePlotPlayer op : currentUUIDWrapper.getOfflinePlayers())
|
||||
{
|
||||
if (op.getLastPlayed() != 0)
|
||||
{
|
||||
for (final OfflinePlotPlayer op : currentUUIDWrapper.getOfflinePlayers()) {
|
||||
if (op.getLastPlayed() != 0) {
|
||||
// String name = op.getName();
|
||||
// StringWrapper wrap = new StringWrapper(name);
|
||||
final UUID uuid = currentUUIDWrapper.getUUID(op);
|
||||
uuid2 = newWrapper.getUUID(op);
|
||||
if (!uuid.equals(uuid2))
|
||||
{
|
||||
if (!uuid.equals(uuid2)) {
|
||||
uCMap.put(uuid, uuid2);
|
||||
uCReverse.put(uuid2, uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uCMap.size() == 0)
|
||||
{
|
||||
if (uCMap.size() == 0) {
|
||||
MainUtil.sendConsoleMessage("&cError. Failed to collect UUIDs!");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendConsoleMessage("&a - Successfully repopulated");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Replacing cache");
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
for (final Entry<UUID, UUID> entry : uCMap.entrySet())
|
||||
{
|
||||
public void run() {
|
||||
for (final Entry<UUID, UUID> entry : uCMap.entrySet()) {
|
||||
final String name = UUIDHandler.getName(entry.getKey());
|
||||
if (name != null)
|
||||
{
|
||||
if (name != null) {
|
||||
UUIDHandler.add(new StringWrapper(name), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Scanning for applicable files (uuids.txt)");
|
||||
|
||||
|
||||
final File file = new File(PS.get().IMP.getDirectory(), "uuids.txt");
|
||||
if (file.exists())
|
||||
{
|
||||
try
|
||||
{
|
||||
if (file.exists()) {
|
||||
try {
|
||||
final List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
|
||||
for (String line : lines)
|
||||
{
|
||||
try
|
||||
{
|
||||
for (String line : lines) {
|
||||
try {
|
||||
line = line.trim();
|
||||
if (line.length() == 0)
|
||||
{
|
||||
if (line.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
line = line.replaceAll("[\\|][0-9]+[\\|][0-9]+[\\|]", "");
|
||||
final String[] split = line.split("\\|");
|
||||
final String name = split[0];
|
||||
if ((name.length() == 0) || (name.length() > 16) || !StringMan.isAlphanumericUnd(name))
|
||||
{
|
||||
if ((name.length() == 0) || (name.length() > 16) || !StringMan.isAlphanumericUnd(name)) {
|
||||
continue;
|
||||
}
|
||||
final UUID old = currentUUIDWrapper.getUUID(name);
|
||||
if (old == null)
|
||||
{
|
||||
if (old == null) {
|
||||
continue;
|
||||
}
|
||||
final UUID now = newWrapper.getUUID(name);
|
||||
UUIDHandler.add(new StringWrapper(name), now);
|
||||
uCMap.put(old, now);
|
||||
uCReverse.put(now, old);
|
||||
}
|
||||
catch (final Exception e2)
|
||||
{
|
||||
} catch (final Exception e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Replacing wrapper");
|
||||
UUIDHandler.setUUIDWrapper(newWrapper);
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Updating plot objects");
|
||||
|
||||
for (final Plot plot : PS.get().getPlotsRaw())
|
||||
{
|
||||
|
||||
for (final Plot plot : PS.get().getPlotsRaw()) {
|
||||
final UUID value = uCMap.get(plot.owner);
|
||||
if (value != null)
|
||||
{
|
||||
if (value != null) {
|
||||
plot.owner = value;
|
||||
}
|
||||
plot.getTrusted().clear();
|
||||
plot.getMembers().clear();
|
||||
plot.getDenied().clear();
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Deleting database");
|
||||
final AbstractDB database = DBFunc.dbManager;
|
||||
final boolean result = database.deleteTables();
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Creating tables");
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
try {
|
||||
database.createTables();
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendConsoleMessage("&cConversion failed! Attempting recovery");
|
||||
for (final Plot plot : PS.get().getPlots())
|
||||
{
|
||||
for (final Plot plot : PS.get().getPlots()) {
|
||||
final UUID value = uCReverse.get(plot.owner);
|
||||
if (value != null)
|
||||
{
|
||||
if (value != null) {
|
||||
plot.owner = value;
|
||||
}
|
||||
}
|
||||
database.createPlotsAndData(new ArrayList<>(PS.get().getPlots()), new Runnable()
|
||||
{
|
||||
database.createPlotsAndData(new ArrayList<>(PS.get().getPlots()), new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(null, "&6Recovery was successful!");
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
if (newWrapper instanceof OfflineUUIDWrapper)
|
||||
{
|
||||
|
||||
if (newWrapper instanceof OfflineUUIDWrapper) {
|
||||
PS.get().config.set("UUID.force-lowercase", false);
|
||||
PS.get().config.set("UUID.offline", true);
|
||||
}
|
||||
else if (newWrapper instanceof LowerOfflineUUIDWrapper)
|
||||
{
|
||||
} else if (newWrapper instanceof LowerOfflineUUIDWrapper) {
|
||||
PS.get().config.set("UUID.force-lowercase", true);
|
||||
PS.get().config.set("UUID.offline", true);
|
||||
}
|
||||
else if (newWrapper instanceof DefaultUUIDWrapper)
|
||||
{
|
||||
} else if (newWrapper instanceof DefaultUUIDWrapper) {
|
||||
PS.get().config.set("UUID.force-lowercase", false);
|
||||
PS.get().config.set("UUID.offline", false);
|
||||
}
|
||||
try
|
||||
{
|
||||
try {
|
||||
PS.get().config.save(PS.get().configFile);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
MainUtil.sendConsoleMessage("Could not save configuration. It will need to be manuall set!");
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Populating tables");
|
||||
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final ArrayList<Plot> plots = new ArrayList<>(PS.get().getPlots());
|
||||
database.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
database.createPlotsAndData(plots, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendConsoleMessage("&aConversion complete!");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&aIt is now safe for players to join");
|
||||
MainUtil.sendConsoleMessage("&cConversion is still in progress, you will be notified when it is complete");
|
||||
}
|
||||
|
@ -43,66 +43,56 @@ usage = "/plot delete",
|
||||
aliases = { "dispose", "del" },
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Delete extends SubCommand
|
||||
{
|
||||
|
||||
public class Delete extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) { return !sendMessage(plr, C.UNLINK_REQUIRED); }
|
||||
if (((!plot.hasOwner() || !plot.isOwner(plr.getUUID()))) && !Permissions.hasPermission(plr, "plots.admin.command.delete")) { return !sendMessage(plr, C.NO_PLOT_PERMS); }
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
|
||||
return !sendMessage(plr, C.UNLINK_REQUIRED);
|
||||
}
|
||||
if (((!plot.hasOwner() || !plot.isOwner(plr.getUUID()))) && !Permissions.hasPermission(plr, "plots.admin.command.delete")) {
|
||||
return !sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
}
|
||||
final PlotWorld pWorld = PS.get().getPlotWorld(plot.world);
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
final Runnable runnable = new Runnable()
|
||||
{
|
||||
final Runnable runnable = new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY && plot.hasOwner() && plot.isOwner(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
public void run() {
|
||||
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY && plot.hasOwner() && plot.isOwner(UUIDHandler.getUUID(plr))) {
|
||||
final double c = pWorld.SELL_PRICE;
|
||||
if (c > 0d)
|
||||
{
|
||||
if (c > 0d) {
|
||||
EconHandler.manager.depositMoney(plr, c);
|
||||
sendMessage(plr, C.ADDED_BALANCE, c + "");
|
||||
}
|
||||
}
|
||||
if (plot.unclaim())
|
||||
{
|
||||
if (plot.unclaim()) {
|
||||
final long start = System.currentTimeMillis();
|
||||
final boolean result = MainUtil.clearAsPlayer(plot, true, new Runnable()
|
||||
{
|
||||
final boolean result = MainUtil.clearAsPlayer(plot, true, new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
|
||||
}
|
||||
});
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.UNCLAIM_FAILED);
|
||||
}
|
||||
}
|
||||
};
|
||||
if (Settings.CONFIRM_DELETE && !(Permissions.hasPermission(plr, "plots.confirm.bypass")))
|
||||
{
|
||||
if (Settings.CONFIRM_DELETE && !(Permissions.hasPermission(plr, "plots.confirm.bypass"))) {
|
||||
CmdConfirm.addPending(plr, "/plot delete " + plot.id, runnable);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
TaskManager.runTask(runnable);
|
||||
}
|
||||
return true;
|
||||
|
@ -36,69 +36,49 @@ import com.plotsquared.bukkit.uuid.SQLUUIDHandler;
|
||||
import com.plotsquared.general.commands.Argument;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "deny",
|
||||
aliases = { "d" },
|
||||
description = "Deny a user from a plot",
|
||||
usage = "/plot deny <player>",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Deny extends SubCommand
|
||||
{
|
||||
|
||||
public Deny()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.PlayerName
|
||||
};
|
||||
@CommandDeclaration(command = "deny", aliases = { "d" }, description = "Deny a user from a plot", usage = "/plot deny <player>", category = CommandCategory.ACTIONS, requiredType = RequiredType.NONE)
|
||||
public class Deny extends SubCommand {
|
||||
|
||||
public Deny() {
|
||||
requiredArguments = new Argument[] { Argument.PlayerName };
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((plot == null) || !plot.hasOwner())
|
||||
{
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((plot == null) || !plot.hasOwner()) {
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.deny"))
|
||||
{
|
||||
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.deny")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return true;
|
||||
}
|
||||
UUID uuid;
|
||||
if (args[0].equalsIgnoreCase("*"))
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("*")) {
|
||||
uuid = DBFunc.everyone;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
uuid = UUIDHandler.getUUID(args[0], null);
|
||||
}
|
||||
if (uuid == null)
|
||||
{
|
||||
if (UUIDHandler.implementation instanceof SQLUUIDHandler)
|
||||
{
|
||||
if (uuid == null) {
|
||||
if (UUIDHandler.implementation instanceof SQLUUIDHandler) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER_WAIT, args[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (plot.isOwner(uuid))
|
||||
{
|
||||
if (plot.isOwner(uuid)) {
|
||||
MainUtil.sendMessage(plr, C.ALREADY_OWNER);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (plot.getDenied().contains(uuid))
|
||||
{
|
||||
|
||||
if (plot.getDenied().contains(uuid)) {
|
||||
MainUtil.sendMessage(plr, C.ALREADY_ADDED);
|
||||
return false;
|
||||
}
|
||||
@ -107,18 +87,15 @@ public class Deny extends SubCommand
|
||||
plot.addDenied(uuid);
|
||||
EventUtil.manager.callDenied(plr, plot, uuid, true);
|
||||
MainUtil.sendMessage(plr, C.DENIED_ADDED);
|
||||
if (!uuid.equals(DBFunc.everyone))
|
||||
{
|
||||
if (!uuid.equals(DBFunc.everyone)) {
|
||||
handleKick(uuid, plot);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void handleKick(final UUID uuid, final Plot plot)
|
||||
{
|
||||
|
||||
private void handleKick(final UUID uuid, final Plot plot) {
|
||||
final PlotPlayer pp = UUIDHandler.getPlayer(uuid);
|
||||
if ((pp != null) && plot.equals(MainUtil.getPlot(pp.getLocation())))
|
||||
{
|
||||
if ((pp != null) && plot.equals(MainUtil.getPlot(pp.getLocation()))) {
|
||||
pp.teleport(BlockManager.manager.getSpawn(pp.getLocation().getWorld()));
|
||||
MainUtil.sendMessage(pp, C.YOU_GOT_DENIED);
|
||||
}
|
||||
|
@ -34,53 +34,39 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "done",
|
||||
aliases = { "submit" },
|
||||
description = "Mark a plot as done",
|
||||
permission = "plots.done",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Done extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "done", aliases = { "submit" }, description = "Mark a plot as done", permission = "plots.done", category = CommandCategory.ACTIONS, requiredType = RequiredType.NONE)
|
||||
public class Done extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.done"))
|
||||
{
|
||||
if ((plot == null) || !plot.hasOwner()) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.done")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (plot.getSettings().flags.containsKey("done"))
|
||||
{
|
||||
if (plot.getSettings().flags.containsKey("done")) {
|
||||
MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE);
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
MainUtil.runners.put(plot, 1);
|
||||
MainUtil.sendMessage(plr, C.GENERATING_LINK);
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>()
|
||||
{
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.runners.remove(plot);
|
||||
if ((value == null) || (value.getComplexity() >= Settings.CLEAR_THRESHOLD))
|
||||
{
|
||||
if ((value == null) || (value.getComplexity() >= Settings.CLEAR_THRESHOLD)) {
|
||||
final Flag flag = new Flag(FlagManager.getFlag("done"), (System.currentTimeMillis() / 1000));
|
||||
FlagManager.addPlotFlag(plot, flag);
|
||||
MainUtil.sendMessage(plr, C.DONE_SUCCESS);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.DONE_INSUFFICIENT_COMPLEXITY);
|
||||
}
|
||||
}
|
||||
|
@ -16,59 +16,46 @@ import com.intellectualcrafters.plot.util.SchematicHandler;
|
||||
import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "download",
|
||||
aliases = { "dl" },
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Download your plot",
|
||||
permission = "plots.download")
|
||||
public class Download extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "download", aliases = { "dl" }, category = CommandCategory.ACTIONS, requiredType = RequiredType.NONE, description = "Download your plot", permission = "plots.download")
|
||||
public class Download extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
if (!Settings.METRICS)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
if (!Settings.METRICS) {
|
||||
MainUtil.sendMessage(plr, "&cPlease enable metrics in order to use this command.\n&7 - Or host it yourself if you don't like the free service");
|
||||
return false;
|
||||
}
|
||||
final String world = plr.getLocation().getWorld();
|
||||
if (!PS.get().isPlotWorld(world)) { return !sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
final Plot plot = MainUtil.getPlot(plr.getLocation());
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
if ((!plot.isOwner(plr.getUUID()) || (Settings.DOWNLOAD_REQUIRES_DONE && (FlagManager.getPlotFlag(plot, "done") != null))) && !Permissions.hasPermission(plr, "plots.admin.command.download"))
|
||||
{
|
||||
if ((!plot.isOwner(plr.getUUID()) || (Settings.DOWNLOAD_REQUIRES_DONE && (FlagManager.getPlotFlag(plot, "done") != null))) && !Permissions.hasPermission(plr, "plots.admin.command.download")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
MainUtil.runners.put(plot, 1);
|
||||
MainUtil.sendMessage(plr, C.GENERATING_LINK);
|
||||
SchematicHandler.manager.getCompoundTag(plot.world, plot.id, new RunnableVal<CompoundTag>()
|
||||
{
|
||||
SchematicHandler.manager.getCompoundTag(plot.world, plot.id, new RunnableVal<CompoundTag>() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
public void run() {
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final URL url = SchematicHandler.manager.upload(value, null, null);
|
||||
if (url == null)
|
||||
{
|
||||
if (url == null) {
|
||||
MainUtil.sendMessage(plr, C.GENERATING_LINK_FAILED);
|
||||
MainUtil.runners.remove(plot);
|
||||
return;
|
||||
|
@ -46,19 +46,16 @@ description = "Manage plot flags",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.flag")
|
||||
public class FlagCmd extends SubCommand
|
||||
{
|
||||
|
||||
public class FlagCmd extends SubCommand {
|
||||
|
||||
@Override
|
||||
public String getUsage()
|
||||
{
|
||||
public String getUsage() {
|
||||
return super.getUsage().replaceAll("<flag>", StringMan.join(FlagManager.getFlags(), "|"));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer player, final String... args) {
|
||||
|
||||
/*
|
||||
* plot flag set fly true
|
||||
* plot flag remove fly
|
||||
@ -66,50 +63,40 @@ public class FlagCmd extends SubCommand
|
||||
* plot flag add use 2,4
|
||||
* plot flag list
|
||||
*/
|
||||
if (args.length == 0)
|
||||
{
|
||||
if (args.length == 0) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag <set|remove|add|list|info>");
|
||||
return false;
|
||||
}
|
||||
final Location loc = player.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null)
|
||||
{
|
||||
if (plot == null) {
|
||||
MainUtil.sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
if (!plot.hasOwner()) {
|
||||
sendMessage(player, C.PLOT_NOT_CLAIMED);
|
||||
return false;
|
||||
}
|
||||
if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.set.flag.other"))
|
||||
{
|
||||
if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.set.flag.other")) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag.other");
|
||||
return false;
|
||||
}
|
||||
if ((args.length > 1) && FlagManager.isReserved(args[1]))
|
||||
{
|
||||
if ((args.length > 1) && FlagManager.isReserved(args[1])) {
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
return false;
|
||||
}
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "info":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag"))
|
||||
{
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "info": {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag")) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.info");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2)
|
||||
{
|
||||
if (args.length != 2) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1]);
|
||||
if (af == null)
|
||||
{
|
||||
if (af == null) {
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>");
|
||||
return false;
|
||||
@ -122,92 +109,73 @@ public class FlagCmd extends SubCommand
|
||||
MainUtil.sendMessage(player, C.FLAG_DESC, af.getValueDesc());
|
||||
return true;
|
||||
}
|
||||
case "set":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag"))
|
||||
{
|
||||
case "set": {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag")) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag");
|
||||
return false;
|
||||
}
|
||||
if (args.length < 3)
|
||||
{
|
||||
if (args.length < 3) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag set <flag> <value>");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
|
||||
if (af == null)
|
||||
{
|
||||
if (af == null) {
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
return false;
|
||||
}
|
||||
final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ");
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase()))
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase())) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase());
|
||||
return false;
|
||||
}
|
||||
final Object parsed = af.parseValueRaw(value);
|
||||
if (parsed == null)
|
||||
{
|
||||
if (parsed == null) {
|
||||
MainUtil.sendMessage(player, "&c" + af.getValueDesc());
|
||||
return false;
|
||||
}
|
||||
final Flag flag = new Flag(FlagManager.getFlag(args[1].toLowerCase(), true), parsed);
|
||||
final boolean result = FlagManager.addPlotFlag(plot, flag);
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_ADDED);
|
||||
return false;
|
||||
}
|
||||
MainUtil.sendMessage(player, C.FLAG_ADDED);
|
||||
return true;
|
||||
}
|
||||
case "remove":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.flag.remove"))
|
||||
{
|
||||
case "remove": {
|
||||
if (!Permissions.hasPermission(player, "plots.flag.remove")) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.remove");
|
||||
return false;
|
||||
}
|
||||
if ((args.length != 2) && (args.length != 3))
|
||||
{
|
||||
if ((args.length != 2) && (args.length != 3)) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag remove <flag> [values]");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
|
||||
if (af == null)
|
||||
{
|
||||
if (af == null) {
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
return false;
|
||||
}
|
||||
final Flag flag = FlagManager.getPlotFlagAbs(plot, args[1].toLowerCase());
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase()))
|
||||
{
|
||||
for (final String entry : args[2].split(","))
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry))
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) {
|
||||
for (final String entry : args[2].split(",")) {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry)) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + entry);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (flag == null)
|
||||
{
|
||||
if (flag == null) {
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
if ((args.length == 3) && flag.getAbstractFlag().isList())
|
||||
{
|
||||
if ((args.length == 3) && flag.getAbstractFlag().isList()) {
|
||||
final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ");
|
||||
((FlagValue.ListValue) flag.getAbstractFlag().value).remove(flag.getValue(), value);
|
||||
DBFunc.setFlags(plot, plot.getSettings().flags.values());
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
final boolean result = FlagManager.removePlotFlag(plot, flag.getKey());
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_REMOVED);
|
||||
return false;
|
||||
}
|
||||
@ -215,30 +183,23 @@ public class FlagCmd extends SubCommand
|
||||
MainUtil.sendMessage(player, C.FLAG_REMOVED);
|
||||
return true;
|
||||
}
|
||||
case "add":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.flag.add"))
|
||||
{
|
||||
case "add": {
|
||||
if (!Permissions.hasPermission(player, "plots.flag.add")) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.add");
|
||||
return false;
|
||||
}
|
||||
if (args.length < 3)
|
||||
{
|
||||
if (args.length < 3) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag add <flag> <values>");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
|
||||
if (af == null)
|
||||
{
|
||||
if (af == null) {
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
return false;
|
||||
}
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase()))
|
||||
{
|
||||
for (final String entry : args[2].split(","))
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry))
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) {
|
||||
for (final String entry : args[2].split(",")) {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry)) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + entry);
|
||||
return false;
|
||||
}
|
||||
@ -246,23 +207,18 @@ public class FlagCmd extends SubCommand
|
||||
}
|
||||
final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ");
|
||||
final Object parsed = af.parseValueRaw(value);
|
||||
if (parsed == null)
|
||||
{
|
||||
if (parsed == null) {
|
||||
MainUtil.sendMessage(player, "&c" + af.getValueDesc());
|
||||
return false;
|
||||
}
|
||||
Flag flag = FlagManager.getPlotFlag(plot, args[1].toLowerCase());
|
||||
if ((flag == null) || !flag.getAbstractFlag().isList())
|
||||
{
|
||||
if ((flag == null) || !flag.getAbstractFlag().isList()) {
|
||||
flag = new Flag(FlagManager.getFlag(args[1].toLowerCase(), true), parsed);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
((FlagValue.ListValue) flag.getAbstractFlag().value).add(flag.getValue(), value);
|
||||
}
|
||||
final boolean result = FlagManager.addPlotFlag(plot, flag);
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_ADDED);
|
||||
return false;
|
||||
}
|
||||
@ -270,32 +226,26 @@ public class FlagCmd extends SubCommand
|
||||
MainUtil.sendMessage(player, C.FLAG_ADDED);
|
||||
return true;
|
||||
}
|
||||
case "list":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.flag.list"))
|
||||
{
|
||||
case "list": {
|
||||
if (!Permissions.hasPermission(player, "plots.flag.list")) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.list");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 1)
|
||||
{
|
||||
if (args.length != 1) {
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag list");
|
||||
return false;
|
||||
}
|
||||
final HashMap<String, ArrayList<String>> flags = new HashMap<>();
|
||||
for (final AbstractFlag af : FlagManager.getFlags())
|
||||
{
|
||||
for (final AbstractFlag af : FlagManager.getFlags()) {
|
||||
final String type = af.value.getClass().getSimpleName().replaceAll("Value", "");
|
||||
if (!flags.containsKey(type))
|
||||
{
|
||||
if (!flags.containsKey(type)) {
|
||||
flags.put(type, new ArrayList<String>());
|
||||
}
|
||||
flags.get(type).add(af.getKey());
|
||||
}
|
||||
String message = "";
|
||||
String prefix = "";
|
||||
for (final String flag : flags.keySet())
|
||||
{
|
||||
for (final String flag : flags.keySet()) {
|
||||
message += prefix + "&6" + flag + ": &7" + StringMan.join(flags.get(flag), ", ");
|
||||
prefix = "\n";
|
||||
}
|
||||
|
@ -13,10 +13,8 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.util.StringMan;
|
||||
import com.plotsquared.general.commands.Command;
|
||||
|
||||
public class GenerateDocs
|
||||
{
|
||||
public static void main(final String[] args)
|
||||
{
|
||||
public class GenerateDocs {
|
||||
public static void main(final String[] args) {
|
||||
MainCommand.getInstance().addCommand(new WE_Anywhere());
|
||||
MainCommand.getInstance().addCommand(new Cluster());
|
||||
final ArrayList<Command<PlotPlayer>> commands = MainCommand.getInstance().getCommands();
|
||||
@ -26,69 +24,60 @@ public class GenerateDocs
|
||||
log(" - Then do a pull request and it will be added to this page");
|
||||
log("");
|
||||
log("# Contents");
|
||||
for (final CommandCategory category : CommandCategory.values())
|
||||
{
|
||||
for (final CommandCategory category : CommandCategory.values()) {
|
||||
log("###### " + category.name());
|
||||
for (final Command<PlotPlayer> command : MainCommand.getCommands(category, null))
|
||||
{
|
||||
for (final Command<PlotPlayer> command : MainCommand.getCommands(category, null)) {
|
||||
log(" - [/plot " + command.getCommand() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getCommand() + ") ");
|
||||
}
|
||||
log("");
|
||||
}
|
||||
log("# Commands");
|
||||
for (final Command<PlotPlayer> command : commands)
|
||||
{
|
||||
for (final Command<PlotPlayer> command : commands) {
|
||||
printCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
public static void printCommand(final Command<PlotPlayer> command)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
public static void printCommand(final Command<PlotPlayer> command) {
|
||||
try {
|
||||
final String clazz = command.getClass().getSimpleName();
|
||||
final String name = command.getCommand();
|
||||
|
||||
|
||||
// Header
|
||||
final String source = "https://github.com/IntellectualSites/PlotSquared/tree/master/src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java";
|
||||
log("## [" + name.toUpperCase() + "](" + source + ") ");
|
||||
|
||||
|
||||
final File file = new File("src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java");
|
||||
final List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
|
||||
final List<String> perms = getPerms(name, lines);
|
||||
final String comment = getComments(lines);
|
||||
|
||||
|
||||
log("#### Description");
|
||||
log("`" + command.getDescription() + "`");
|
||||
if (comment.length() > 0)
|
||||
{
|
||||
if (comment.length() > 0) {
|
||||
log("##### Comments");
|
||||
log("``` java");
|
||||
log(comment);
|
||||
log("```");
|
||||
}
|
||||
|
||||
|
||||
log("#### Usage");
|
||||
log("`" + command.getUsage().replaceAll("\\{label\\}", "plot") + "`");
|
||||
|
||||
if (command.getRequiredType() != RequiredType.NONE)
|
||||
{
|
||||
|
||||
if (command.getRequiredType() != RequiredType.NONE) {
|
||||
log("#### Required callers");
|
||||
log("`" + command.getRequiredType().name() + "`");
|
||||
}
|
||||
|
||||
|
||||
final Set<String> aliases = command.getAliases();
|
||||
if (aliases.size() > 0)
|
||||
{
|
||||
if (aliases.size() > 0) {
|
||||
log("#### Aliases");
|
||||
log("`" + StringMan.getString(command.getAliases()) + "`");
|
||||
}
|
||||
|
||||
|
||||
log("#### Permissions");
|
||||
log("##### Primary");
|
||||
log(" - `" + command.getPermission() + "` ");
|
||||
if (perms.size() > 0)
|
||||
{
|
||||
if (perms.size() > 0) {
|
||||
log("");
|
||||
log("##### Other");
|
||||
log(" - `" + StringMan.join(perms, "`\n - `") + "`");
|
||||
@ -96,69 +85,53 @@ public class GenerateDocs
|
||||
log("");
|
||||
log("***");
|
||||
log("");
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static List<String> getPerms(final String cmd, final List<String> lines)
|
||||
{
|
||||
|
||||
public static List<String> getPerms(final String cmd, final List<String> lines) {
|
||||
final ArrayList<String> perms = new ArrayList<String>();
|
||||
final Pattern p = Pattern.compile("\"([^\"]*)\"");
|
||||
for (final String line : lines)
|
||||
{
|
||||
if (line.contains("Permissions.hasPermission("))
|
||||
{
|
||||
for (final String line : lines) {
|
||||
if (line.contains("Permissions.hasPermission(")) {
|
||||
final Matcher m = p.matcher(line);
|
||||
while (m.find())
|
||||
{
|
||||
while (m.find()) {
|
||||
String perm = m.group(1);
|
||||
if (perm.endsWith("."))
|
||||
{
|
||||
if (perm.endsWith(".")) {
|
||||
perm += "<arg>";
|
||||
}
|
||||
if (perm.startsWith("."))
|
||||
{
|
||||
if (perm.startsWith(".")) {
|
||||
perms.set(perms.size() - 1, perms.get(perms.size() - 1) + perm);
|
||||
}
|
||||
else if (perm.contains("."))
|
||||
{
|
||||
} else if (perm.contains(".")) {
|
||||
perms.add(perm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
switch (cmd.toLowerCase())
|
||||
{
|
||||
switch (cmd.toLowerCase()) {
|
||||
case "auto":
|
||||
case "claim":
|
||||
{
|
||||
case "claim": {
|
||||
perms.add("plots.plot.#");
|
||||
break;
|
||||
}
|
||||
}
|
||||
return perms;
|
||||
}
|
||||
|
||||
public static String getComments(final List<String> lines)
|
||||
{
|
||||
|
||||
public static String getComments(final List<String> lines) {
|
||||
final StringBuilder result = new StringBuilder();
|
||||
for (String line : lines)
|
||||
{
|
||||
for (String line : lines) {
|
||||
line = line.trim();
|
||||
if (line.startsWith("/** ") || line.startsWith("*/ ") || line.startsWith("* "))
|
||||
{
|
||||
if (line.startsWith("/** ") || line.startsWith("*/ ") || line.startsWith("* ")) {
|
||||
line = (line.replaceAll("/[*][*] ", "").replaceAll("[*]/ ", "").replaceAll("[*] ", "")).trim();
|
||||
result.append(line + "\n");
|
||||
}
|
||||
}
|
||||
return result.toString().trim();
|
||||
}
|
||||
|
||||
public static void log(final String s)
|
||||
{
|
||||
|
||||
public static void log(final String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
@ -3,17 +3,11 @@ package com.intellectualcrafters.plot.commands;
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "help",
|
||||
description = "Get this help menu",
|
||||
aliases = { "he" },
|
||||
category = CommandCategory.INFO)
|
||||
public class Help extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "help", description = "Get this help menu", aliases = { "he" }, category = CommandCategory.INFO)
|
||||
public class Help extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -31,63 +31,43 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "home",
|
||||
aliases = { "h" },
|
||||
description = "Go to your plot",
|
||||
usage = "/plot home [id|alias]",
|
||||
category = CommandCategory.TELEPORT,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Home extends SubCommand
|
||||
{
|
||||
|
||||
private Plot isAlias(final String a)
|
||||
{
|
||||
for (final Plot p : PS.get().getPlots())
|
||||
{
|
||||
if ((p.getSettings().getAlias().length() > 0) && p.getSettings().getAlias().equalsIgnoreCase(a)) { return p; }
|
||||
@CommandDeclaration(command = "home", aliases = { "h" }, description = "Go to your plot", usage = "/plot home [id|alias]", category = CommandCategory.TELEPORT, requiredType = RequiredType.NONE)
|
||||
public class Home extends SubCommand {
|
||||
|
||||
private Plot isAlias(final String a) {
|
||||
for (final Plot p : PS.get().getPlots()) {
|
||||
if ((p.getSettings().getAlias().length() > 0) && p.getSettings().getAlias().equalsIgnoreCase(a)) {
|
||||
return p;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, String[] args) {
|
||||
final Set<Plot> all = PS.get().getPlots(plr);
|
||||
final Iterator<Plot> iter = all.iterator();
|
||||
while (iter.hasNext())
|
||||
{
|
||||
if (!iter.next().isBasePlot())
|
||||
{
|
||||
while (iter.hasNext()) {
|
||||
if (!iter.next().isBasePlot()) {
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
final ArrayList<Plot> plots = PS.get().sortPlotsByTemp(all);
|
||||
if (plots.size() == 1)
|
||||
{
|
||||
if (plots.size() == 1) {
|
||||
MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(0));
|
||||
return true;
|
||||
}
|
||||
else if (plots.size() > 1)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
} else if (plots.size() > 1) {
|
||||
if (args.length < 1) {
|
||||
args = new String[] { "1" };
|
||||
}
|
||||
int id = 0;
|
||||
try
|
||||
{
|
||||
try {
|
||||
id = Integer.parseInt(args[0]);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
Plot temp;
|
||||
if ((temp = isAlias(args[0])) != null)
|
||||
{
|
||||
if (temp.hasOwner())
|
||||
{
|
||||
if (temp.isOwner(plr.getUUID()))
|
||||
{
|
||||
if ((temp = isAlias(args[0])) != null) {
|
||||
if (temp.hasOwner()) {
|
||||
if (temp.isOwner(plr.getUUID())) {
|
||||
MainUtil.teleportPlayer(plr, plr.getLocation(), temp);
|
||||
return true;
|
||||
}
|
||||
@ -98,23 +78,19 @@ public class Home extends SubCommand
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")");
|
||||
return true;
|
||||
}
|
||||
if ((id > (plots.size())) || (id < 1))
|
||||
{
|
||||
if ((id > (plots.size())) || (id < 1)) {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")");
|
||||
return false;
|
||||
}
|
||||
MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(id - 1));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.FOUND_NO_PLOTS);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public void teleportPlayer(final PlotPlayer player, final Plot plot)
|
||||
{
|
||||
|
||||
public void teleportPlayer(final PlotPlayer player, final Plot plot) {
|
||||
MainUtil.teleportPlayer(player, player.getLocation(), plot);
|
||||
}
|
||||
}
|
||||
|
@ -41,93 +41,70 @@ usage = "/plot inbox [inbox] [delete <index>|clear|page]",
|
||||
permission = "plots.inbox",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Inbox extends SubCommand
|
||||
{
|
||||
|
||||
public void displayComments(final PlotPlayer player, final List<PlotComment> oldComments, int page)
|
||||
{
|
||||
if ((oldComments == null) || (oldComments.size() == 0))
|
||||
{
|
||||
public class Inbox extends SubCommand {
|
||||
|
||||
public void displayComments(final PlotPlayer player, final List<PlotComment> oldComments, int page) {
|
||||
if ((oldComments == null) || (oldComments.size() == 0)) {
|
||||
MainUtil.sendMessage(player, C.INBOX_EMPTY);
|
||||
return;
|
||||
}
|
||||
final PlotComment[] comments = oldComments.toArray(new PlotComment[oldComments.size()]);
|
||||
if (page < 0)
|
||||
{
|
||||
if (page < 0) {
|
||||
page = 0;
|
||||
}
|
||||
// Get the total pages
|
||||
// int totalPages = ((int) Math.ceil(12 *
|
||||
final int totalPages = (int) Math.ceil(comments.length / 12);
|
||||
if (page > totalPages)
|
||||
{
|
||||
if (page > totalPages) {
|
||||
page = totalPages;
|
||||
}
|
||||
// Only display 12 per page
|
||||
int max = (page * 12) + 12;
|
||||
if (max > comments.length)
|
||||
{
|
||||
if (max > comments.length) {
|
||||
max = comments.length;
|
||||
}
|
||||
final StringBuilder string = new StringBuilder();
|
||||
string.append(StringMan.replaceAll(C.COMMENT_LIST_HEADER_PAGED.s(), "%amount%", comments.length, "%cur", page + 1, "%max", totalPages + 1, "%word", "all") + "\n");
|
||||
PlotComment c;
|
||||
// This might work xD
|
||||
for (int x = (page * 12); x < max; x++)
|
||||
{
|
||||
for (int x = (page * 12); x < max; x++) {
|
||||
c = comments[x];
|
||||
String color;
|
||||
if (player.getName().equals(c.senderName))
|
||||
{
|
||||
if (player.getName().equals(c.senderName)) {
|
||||
color = "&a";
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
color = "&7";
|
||||
}
|
||||
string.append("&8[&7#" + x + "&8][&7" + c.world + ";" + c.id + "&8][&6" + c.senderName + "&8]" + color + c.comment + "\n");
|
||||
}
|
||||
MainUtil.sendMessage(player, string.toString());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String[] args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer player, final String[] args) {
|
||||
|
||||
final Plot plot = MainUtil.getPlot(player.getLocation());
|
||||
if (args.length == 0)
|
||||
{
|
||||
if (args.length == 0) {
|
||||
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox [inbox] [delete <index>|clear|page]");
|
||||
for (final CommentInbox inbox : CommentManager.inboxes.values())
|
||||
{
|
||||
if (inbox.canRead(plot, player))
|
||||
{
|
||||
if (!inbox.getComments(plot, new RunnableVal()
|
||||
{
|
||||
for (final CommentInbox inbox : CommentManager.inboxes.values()) {
|
||||
if (inbox.canRead(plot, player)) {
|
||||
if (!inbox.getComments(plot, new RunnableVal() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (value != null)
|
||||
{
|
||||
public void run() {
|
||||
if (value != null) {
|
||||
int total = 0;
|
||||
int unread = 0;
|
||||
for (final PlotComment comment : (ArrayList<PlotComment>) value)
|
||||
{
|
||||
for (final PlotComment comment : (ArrayList<PlotComment>) value) {
|
||||
total++;
|
||||
if (comment.timestamp > CommentManager.getTimestamp(player, inbox.toString()))
|
||||
{
|
||||
if (comment.timestamp > CommentManager.getTimestamp(player, inbox.toString())) {
|
||||
unread++;
|
||||
}
|
||||
}
|
||||
if (total != 0)
|
||||
{
|
||||
if (total != 0) {
|
||||
String color;
|
||||
if (unread > 0)
|
||||
{
|
||||
if (unread > 0) {
|
||||
color = "&c";
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
color = "";
|
||||
}
|
||||
sendMessage(player, C.INBOX_ITEM, color + inbox.toString() + " (" + total + "/" + unread + ")");
|
||||
@ -136,8 +113,7 @@ public class Inbox extends SubCommand
|
||||
}
|
||||
sendMessage(player, C.INBOX_ITEM, inbox.toString());
|
||||
}
|
||||
}))
|
||||
{
|
||||
})) {
|
||||
sendMessage(player, C.INBOX_ITEM, inbox.toString());
|
||||
}
|
||||
}
|
||||
@ -145,52 +121,39 @@ public class Inbox extends SubCommand
|
||||
return false;
|
||||
}
|
||||
final CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase());
|
||||
if (inbox == null)
|
||||
{
|
||||
if (inbox == null) {
|
||||
sendMessage(player, C.INVALID_INBOX, StringMan.join(CommentManager.inboxes.keySet(), ", "));
|
||||
return false;
|
||||
}
|
||||
player.setMeta("inbox:" + inbox.toString(), System.currentTimeMillis());
|
||||
final int page;
|
||||
if (args.length > 1)
|
||||
{
|
||||
switch (args[1].toLowerCase())
|
||||
{
|
||||
case "delete":
|
||||
{
|
||||
if (!inbox.canModify(plot, player))
|
||||
{
|
||||
if (args.length > 1) {
|
||||
switch (args[1].toLowerCase()) {
|
||||
case "delete": {
|
||||
if (!inbox.canModify(plot, player)) {
|
||||
sendMessage(player, C.NO_PERM_INBOX_MODIFY);
|
||||
return false;
|
||||
}
|
||||
if (args.length != 3)
|
||||
{
|
||||
if (args.length != 3) {
|
||||
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>");
|
||||
}
|
||||
final int index;
|
||||
try
|
||||
{
|
||||
try {
|
||||
index = Integer.parseInt(args[2]);
|
||||
if (index < 1)
|
||||
{
|
||||
if (index < 1) {
|
||||
sendMessage(player, C.NOT_VALID_INBOX_INDEX, index + "");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (final NumberFormatException e)
|
||||
{
|
||||
} catch (final NumberFormatException e) {
|
||||
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!inbox.getComments(plot, new RunnableVal()
|
||||
{
|
||||
|
||||
if (!inbox.getComments(plot, new RunnableVal() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final List<PlotComment> comments = (List<PlotComment>) value;
|
||||
if (index > comments.size())
|
||||
{
|
||||
if (index > comments.size()) {
|
||||
sendMessage(player, C.NOT_VALID_INBOX_INDEX, index + "");
|
||||
}
|
||||
final PlotComment comment = comments.get(index - 1);
|
||||
@ -198,67 +161,50 @@ public class Inbox extends SubCommand
|
||||
plot.getSettings().removeComment(comment);
|
||||
MainUtil.sendMessage(player, C.COMMENT_REMOVED, comment.comment);
|
||||
}
|
||||
}))
|
||||
{
|
||||
})) {
|
||||
sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case "clear":
|
||||
{
|
||||
if (!inbox.canModify(plot, player))
|
||||
{
|
||||
case "clear": {
|
||||
if (!inbox.canModify(plot, player)) {
|
||||
sendMessage(player, C.NO_PERM_INBOX_MODIFY);
|
||||
}
|
||||
inbox.clearInbox(plot);
|
||||
final ArrayList<PlotComment> comments = plot.getSettings().getComments(inbox.toString());
|
||||
if (comments != null)
|
||||
{
|
||||
if (comments != null) {
|
||||
plot.getSettings().removeComments(comments);
|
||||
}
|
||||
MainUtil.sendMessage(player, C.COMMENT_REMOVED, "*");
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
{
|
||||
try
|
||||
{
|
||||
default: {
|
||||
try {
|
||||
page = Integer.parseInt(args[1]);
|
||||
}
|
||||
catch (final NumberFormatException e)
|
||||
{
|
||||
} catch (final NumberFormatException e) {
|
||||
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox [inbox] [delete <index>|clear|page]");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
page = 1;
|
||||
}
|
||||
if (!inbox.canRead(plot, player))
|
||||
{
|
||||
if (!inbox.canRead(plot, player)) {
|
||||
sendMessage(player, C.NO_PERM_INBOX);
|
||||
return false;
|
||||
}
|
||||
if (!inbox.getComments(plot, new RunnableVal()
|
||||
{
|
||||
if (!inbox.getComments(plot, new RunnableVal() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final List<PlotComment> comments = (List<PlotComment>) value;
|
||||
displayComments(player, comments, page);
|
||||
}
|
||||
}))
|
||||
{
|
||||
if (plot == null)
|
||||
{
|
||||
})) {
|
||||
if (plot == null) {
|
||||
sendMessage(player, C.NOT_IN_PLOT);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sendMessage(player, C.PLOT_UNOWNED);
|
||||
}
|
||||
return false;
|
||||
|
@ -43,57 +43,49 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "info",
|
||||
aliases = { "i" },
|
||||
description = "Display plot info",
|
||||
usage = "/plot info <id>",
|
||||
category = CommandCategory.INFO)
|
||||
public class Info extends SubCommand
|
||||
{
|
||||
|
||||
public static String getPlayerList(final Collection<UUID> uuids)
|
||||
{
|
||||
@CommandDeclaration(command = "info", aliases = { "i" }, description = "Display plot info", usage = "/plot info <id>", category = CommandCategory.INFO)
|
||||
public class Info extends SubCommand {
|
||||
|
||||
public static String getPlayerList(final Collection<UUID> uuids) {
|
||||
final ArrayList<UUID> l = new ArrayList<>(uuids);
|
||||
if ((l == null) || (l.size() < 1)) { return C.NONE.s(); }
|
||||
if ((l == null) || (l.size() < 1)) {
|
||||
return C.NONE.s();
|
||||
}
|
||||
final String c = C.PLOT_USER_LIST.s();
|
||||
final StringBuilder list = new StringBuilder();
|
||||
for (int x = 0; x < l.size(); x++)
|
||||
{
|
||||
if ((x + 1) == l.size())
|
||||
{
|
||||
for (int x = 0; x < l.size(); x++) {
|
||||
if ((x + 1) == l.size()) {
|
||||
list.append(c.replace("%user%", getPlayerName(l.get(x))).replace(",", ""));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
list.append(c.replace("%user%", getPlayerName(l.get(x))));
|
||||
}
|
||||
}
|
||||
return list.toString();
|
||||
}
|
||||
|
||||
public static String getPlayerName(final UUID uuid)
|
||||
{
|
||||
if (uuid == null) { return C.UNKNOWN.s(); }
|
||||
if (uuid.equals(DBFunc.everyone) || uuid.toString().equalsIgnoreCase(DBFunc.everyone.toString())) { return "everyone"; }
|
||||
|
||||
public static String getPlayerName(final UUID uuid) {
|
||||
if (uuid == null) {
|
||||
return C.UNKNOWN.s();
|
||||
}
|
||||
if (uuid.equals(DBFunc.everyone) || uuid.toString().equalsIgnoreCase(DBFunc.everyone.toString())) {
|
||||
return "everyone";
|
||||
}
|
||||
final String name = UUIDHandler.getName(uuid);
|
||||
if (name == null) { return "unknown"; }
|
||||
if (name == null) {
|
||||
return "unknown";
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer player, String[] args) {
|
||||
String arg = null;
|
||||
Plot plot;
|
||||
if (args.length > 0)
|
||||
{
|
||||
if (args.length > 0) {
|
||||
arg = args[0] + "";
|
||||
}
|
||||
if (arg != null)
|
||||
{
|
||||
switch (arg)
|
||||
{
|
||||
if (arg != null) {
|
||||
switch (arg) {
|
||||
case "trusted":
|
||||
case "alias":
|
||||
case "inv":
|
||||
@ -109,48 +101,34 @@ public class Info extends SubCommand
|
||||
break;
|
||||
default:
|
||||
plot = MainUtil.getPlotFromString(player, arg, false);
|
||||
if (args.length == 2)
|
||||
{
|
||||
if (args.length == 2) {
|
||||
arg = args[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
arg = null;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
plot = MainUtil.getPlotFromString(player, null, false);
|
||||
}
|
||||
if ((plot == null) && (arg != null))
|
||||
{
|
||||
if ((plot == null) && (arg != null)) {
|
||||
plot = MainUtil.getPlotFromString(player, null, false);
|
||||
}
|
||||
if (plot == null)
|
||||
{
|
||||
if (plot == null) {
|
||||
MainUtil.sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
if (arg != null)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
if (arg != null) {
|
||||
if (args.length == 1) {
|
||||
args = new String[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
args = new String[] { args[1] };
|
||||
}
|
||||
}
|
||||
if ((args.length == 1) && args[0].equalsIgnoreCase("inv"))
|
||||
{
|
||||
final PlotInventory inv = new PlotInventory(player)
|
||||
{
|
||||
if ((args.length == 1) && args[0].equalsIgnoreCase("inv")) {
|
||||
final PlotInventory inv = new PlotInventory(player) {
|
||||
@Override
|
||||
public boolean onClick(final int index)
|
||||
{
|
||||
public boolean onClick(final int index) {
|
||||
// TODO InfoInventory not implemented yet!!!!!!!!
|
||||
// See plot rating or musicsubcommand on examples
|
||||
return false;
|
||||
@ -159,12 +137,12 @@ public class Info extends SubCommand
|
||||
final UUID uuid = player.getUUID();
|
||||
final String name = MainUtil.getName(plot.owner);
|
||||
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cPlot Info", new String[] {
|
||||
"&cID: &6" + plot.getId().toString(),
|
||||
"&cOwner: &6" + name,
|
||||
"&cAlias: &6" + plot.getSettings().getAlias(),
|
||||
"&cBiome: &6" + plot.getBiome().toString().replaceAll("_", "").toLowerCase(),
|
||||
"&cCan Build: &6" + plot.isAdded(uuid),
|
||||
"&cIs Denied: &6" + plot.isDenied(uuid) }));
|
||||
"&cID: &6" + plot.getId().toString(),
|
||||
"&cOwner: &6" + name,
|
||||
"&cAlias: &6" + plot.getSettings().getAlias(),
|
||||
"&cBiome: &6" + plot.getBiome().toString().replaceAll("_", "").toLowerCase(),
|
||||
"&cCan Build: &6" + plot.isAdded(uuid),
|
||||
"&cIs Denied: &6" + plot.isDenied(uuid) }));
|
||||
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cTrusted", new String[] { "&cAmount: &6" + plot.getTrusted().size(), "&8Click to view a list of the trusted users" }));
|
||||
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cMembers", new String[] { "&cAmount: &6" + plot.getMembers().size(), "&8Click to view a list of plot members" }));
|
||||
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cDenied", new String[] { "&cDenied", "&cAmount: &6" + plot.getDenied().size(), "&8Click to view a list of denied players" }));
|
||||
@ -181,33 +159,26 @@ public class Info extends SubCommand
|
||||
trustedEveryone = (plot.getMembers() != null) && plot.getMembers().contains(DBFunc.everyone);
|
||||
}
|
||||
// Unclaimed?
|
||||
if (!hasOwner && !containsEveryone && !trustedEveryone)
|
||||
{
|
||||
if (!hasOwner && !containsEveryone && !trustedEveryone) {
|
||||
MainUtil.sendMessage(player, C.PLOT_INFO_UNCLAIMED, (plot.id.x + ";" + plot.id.y));
|
||||
return true;
|
||||
}
|
||||
String info = C.PLOT_INFO.s();
|
||||
if (arg != null)
|
||||
{
|
||||
if (arg != null) {
|
||||
info = getCaption(arg);
|
||||
if (info == null)
|
||||
{
|
||||
if (info == null) {
|
||||
MainUtil.sendMessage(player, "&6Categories&7: &amembers&7, &aalias&7, &abiome&7, &adenied&7, &aflags&7, &aid&7, &asize&7, &atrusted&7, &aowner&7, &arating");
|
||||
return false;
|
||||
}
|
||||
formatAndSend(info, plot.world, plot, player, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
formatAndSend(info, plot.world, plot, player, false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private String getCaption(final String string)
|
||||
{
|
||||
switch (string)
|
||||
{
|
||||
|
||||
private String getCaption(final String string) {
|
||||
switch (string) {
|
||||
case "trusted":
|
||||
return C.PLOT_INFO_TRUSTED.s();
|
||||
case "alias":
|
||||
@ -232,9 +203,8 @@ public class Info extends SubCommand
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void formatAndSend(String info, final String world, final Plot plot, final PlotPlayer player, final boolean full)
|
||||
{
|
||||
|
||||
private void formatAndSend(String info, final String world, final Plot plot, final PlotPlayer player, final boolean full) {
|
||||
final PlotId id = plot.id;
|
||||
final PlotId id2 = MainUtil.getTopPlot(plot).id;
|
||||
final int num = MainUtil.getPlotSelectionIds(id, id2).size();
|
||||
@ -245,18 +215,18 @@ public class Info extends SubCommand
|
||||
final String trusted = getPlayerList(plot.getTrusted());
|
||||
final String members = getPlayerList(plot.getMembers());
|
||||
final String denied = getPlayerList(plot.getDenied());
|
||||
|
||||
|
||||
final Flag descriptionFlag = FlagManager.getPlotFlag(plot, "description");
|
||||
final String description = descriptionFlag == null ? C.NONE.s() : descriptionFlag.getValueString();
|
||||
|
||||
|
||||
final String flags = StringMan.replaceFromMap(
|
||||
"$2"
|
||||
+ (StringMan.join(FlagManager.getPlotFlags(plot.world, plot.getSettings(), true).values(), "").length() > 0 ? StringMan.join(FlagManager.getPlotFlags(plot.world, plot.getSettings(), true)
|
||||
.values(), "$1, $2") : C.NONE.s()), C.replacements);
|
||||
final boolean build = plot.isAdded(player.getUUID());
|
||||
|
||||
|
||||
final String owner = plot.owner == null ? "unowned" : getPlayerList(plot.getOwners());
|
||||
|
||||
|
||||
info = info.replaceAll("%alias%", alias);
|
||||
info = info.replaceAll("%id%", id.toString());
|
||||
info = info.replaceAll("%id2%", id2.toString());
|
||||
@ -271,34 +241,26 @@ public class Info extends SubCommand
|
||||
info = info.replaceAll("%flags%", Matcher.quoteReplacement(flags));
|
||||
info = info.replaceAll("%build%", build + "");
|
||||
info = info.replaceAll("%desc%", "No description set.");
|
||||
if (info.contains("%rating%"))
|
||||
{
|
||||
if (info.contains("%rating%")) {
|
||||
final String newInfo = info;
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
int max = 10;
|
||||
if ((Settings.RATING_CATEGORIES != null) && (Settings.RATING_CATEGORIES.size() > 0))
|
||||
{
|
||||
if ((Settings.RATING_CATEGORIES != null) && (Settings.RATING_CATEGORIES.size() > 0)) {
|
||||
max = 8;
|
||||
}
|
||||
String info;
|
||||
if (full && (Settings.RATING_CATEGORIES != null) && (Settings.RATING_CATEGORIES.size() > 1))
|
||||
{
|
||||
if (full && (Settings.RATING_CATEGORIES != null) && (Settings.RATING_CATEGORIES.size() > 1)) {
|
||||
String rating = "";
|
||||
String prefix = "";
|
||||
final double[] ratings = MainUtil.getAverageRatings(plot);
|
||||
for (int i = 0; i < ratings.length; i++)
|
||||
{
|
||||
for (int i = 0; i < ratings.length; i++) {
|
||||
rating += prefix + Settings.RATING_CATEGORIES.get(i) + "=" + String.format("%.1f", ratings[i]);
|
||||
prefix = ",";
|
||||
}
|
||||
info = newInfo.replaceAll("%rating%", rating);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
info = newInfo.replaceAll("%rating%", String.format("%.1f", MainUtil.getAverageRating(plot)) + "/" + max);
|
||||
}
|
||||
MainUtil.sendMessage(player, C.PLOT_INFO_HEADER);
|
||||
|
@ -30,42 +30,32 @@ import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "kick",
|
||||
aliases = { "k" },
|
||||
description = "Kick a player from your plot",
|
||||
permission = "plots.kick",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Kick extends SubCommand
|
||||
{
|
||||
|
||||
@CommandDeclaration(command = "kick", aliases = { "k" }, description = "Kick a player from your plot", permission = "plots.kick", category = CommandCategory.ACTIONS, requiredType = RequiredType.NONE)
|
||||
public class Kick extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((plot == null) || ((!plot.hasOwner() || !plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.kick")))
|
||||
{
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((plot == null) || ((!plot.hasOwner() || !plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.kick"))) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (args.length != 1)
|
||||
{
|
||||
if (args.length != 1) {
|
||||
MainUtil.sendMessage(plr, "&c/plot kick <player>");
|
||||
return false;
|
||||
}
|
||||
final PlotPlayer player = UUIDHandler.getPlayer(args[0]);
|
||||
if (player == null)
|
||||
{
|
||||
if (player == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
final Location otherLoc = player.getLocation();
|
||||
if (!plr.getLocation().getWorld().equals(otherLoc.getWorld()) || !plot.equals(MainUtil.getPlot(otherLoc)))
|
||||
{
|
||||
if (!plr.getLocation().getWorld().equals(otherLoc.getWorld()) || !plot.equals(MainUtil.getPlot(otherLoc))) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
|
@ -36,34 +36,27 @@ description = "Set or increment player plot claim limits",
|
||||
aliases = { "setlimit" },
|
||||
usage = "/plot limit <player> <expression>",
|
||||
category = CommandCategory.DEBUG)
|
||||
public class Limit extends SubCommand
|
||||
{
|
||||
|
||||
public Limit()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.String,
|
||||
Argument.String
|
||||
};
|
||||
public class Limit extends SubCommand {
|
||||
|
||||
public Limit() {
|
||||
requiredArguments = new Argument[] { Argument.String, Argument.String };
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
final UUID uuid = UUIDHandler.getUUID(args[0], null);
|
||||
if (uuid == null)
|
||||
{
|
||||
if (uuid == null) {
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
|
||||
|
||||
|
||||
// get current plot limit
|
||||
// increase
|
||||
|
||||
|
||||
// EconHandler.manager.setPermission(op, perm, value);
|
||||
plr.sendMessage("TODO");
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -26,99 +26,80 @@ requiredType = RequiredType.NONE,
|
||||
description = "Load your plot",
|
||||
permission = "plots.load",
|
||||
usage = "/plot restore")
|
||||
public class Load extends SubCommand
|
||||
{
|
||||
|
||||
public class Load extends SubCommand {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
if (!Settings.METRICS)
|
||||
{
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
if (!Settings.METRICS) {
|
||||
MainUtil.sendMessage(plr, "&cPlease enable metrics in order to use this command.\n&7 - Or host it yourself if you don't like the free service");
|
||||
return false;
|
||||
}
|
||||
final String world = plr.getLocation().getWorld();
|
||||
if (!PS.get().isPlotWorld(world)) { return !sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
final Plot plot = MainUtil.getPlot(plr.getLocation());
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.load"))
|
||||
{
|
||||
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.load")) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (args.length != 0)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
|
||||
if (args.length != 0) {
|
||||
if (args.length == 1) {
|
||||
// TODO load save here
|
||||
final List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
|
||||
if (schematics == null)
|
||||
{
|
||||
if (schematics == null) {
|
||||
// No schematics found:
|
||||
MainUtil.sendMessage(plr, C.LOAD_NULL);
|
||||
return false;
|
||||
}
|
||||
String schem;
|
||||
try
|
||||
{
|
||||
try {
|
||||
schem = schematics.get(Integer.parseInt(args[0]) - 1);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
// use /plot load <index>
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + schematics.size() + ")");
|
||||
return false;
|
||||
}
|
||||
final URL url;
|
||||
try
|
||||
{
|
||||
try {
|
||||
url = new URL(Settings.WEB_URL + "saves/" + plr.getUUID() + "/" + schem + ".schematic");
|
||||
}
|
||||
catch (final MalformedURLException e)
|
||||
{
|
||||
} catch (final MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
MainUtil.sendMessage(plr, C.LOAD_FAILED);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
MainUtil.runners.put(plot, 1);
|
||||
MainUtil.sendMessage(plr, C.GENERATING_COMPONENT);
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final Schematic schematic = SchematicHandler.manager.getSchematic(url);
|
||||
if (schematic == null)
|
||||
{
|
||||
if (schematic == null) {
|
||||
MainUtil.runners.remove(plot);
|
||||
sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent or not in gzip format");
|
||||
return;
|
||||
}
|
||||
SchematicHandler.manager.paste(schematic, plot, 0, 0, new RunnableVal<Boolean>()
|
||||
{
|
||||
SchematicHandler.manager.paste(schematic, plot, 0, 0, new RunnableVal<Boolean>() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
MainUtil.runners.remove(plot);
|
||||
if (value)
|
||||
{
|
||||
if (value) {
|
||||
sendMessage(plr, C.SCHEMATIC_PASTE_SUCCESS);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
sendMessage(plr, C.SCHEMATIC_PASTE_FAILED);
|
||||
}
|
||||
}
|
||||
@ -131,22 +112,18 @@ public class Load extends SubCommand
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot load <index>");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// list schematics
|
||||
|
||||
|
||||
final List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
|
||||
if (schematics == null)
|
||||
{
|
||||
if (schematics == null) {
|
||||
MainUtil.runners.put(plot, 1);
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final List<String> schematics = SchematicHandler.manager.getSaves(plr.getUUID());
|
||||
MainUtil.runners.remove(plot);
|
||||
if ((schematics == null) || (schematics.size() == 0))
|
||||
{
|
||||
if ((schematics == null) || (schematics.size() == 0)) {
|
||||
MainUtil.sendMessage(plr, C.LOAD_FAILED);
|
||||
return;
|
||||
}
|
||||
@ -154,25 +131,19 @@ public class Load extends SubCommand
|
||||
displaySaves(plr, 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
displaySaves(plr, 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void displaySaves(final PlotPlayer player, final int page)
|
||||
{
|
||||
|
||||
public void displaySaves(final PlotPlayer player, final int page) {
|
||||
final List<String> schematics = (List<String>) player.getMeta("plot_schematics");
|
||||
for (int i = 0; i < Math.min(schematics.size(), 32); i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
for (int i = 0; i < Math.min(schematics.size(), 32); i++) {
|
||||
try {
|
||||
final String schem = schematics.get(i);
|
||||
final String[] split = schem.split("_");
|
||||
if (split.length != 6)
|
||||
{
|
||||
if (split.length != 6) {
|
||||
continue;
|
||||
}
|
||||
final String time = secToTime((System.currentTimeMillis() / 1000) - (Long.parseLong(split[0])));
|
||||
@ -181,64 +152,52 @@ public class Load extends SubCommand
|
||||
final String size = split[4];
|
||||
final String server = split[5].replaceAll(".schematic", "");
|
||||
String color;
|
||||
if (PS.get().IMP.getServerName().replaceAll("[^A-Za-z0-9]", "").equals(server))
|
||||
{
|
||||
if (PS.get().IMP.getServerName().replaceAll("[^A-Za-z0-9]", "").equals(server)) {
|
||||
color = "$4";
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
color = "$1";
|
||||
}
|
||||
MainUtil.sendMessage(player, "$3[$2" + (i + 1) + "$3] " + color + time + "$3 | " + color + world + ";" + id + "$3 | " + color + size + "x" + size);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
MainUtil.sendMessage(player, C.LOAD_LIST);
|
||||
}
|
||||
|
||||
public String secToTime(long time)
|
||||
{
|
||||
|
||||
public String secToTime(long time) {
|
||||
final StringBuilder toreturn = new StringBuilder();
|
||||
int years = 0;
|
||||
int weeks = 0;
|
||||
int days = 0;
|
||||
int hours = 0;
|
||||
int minutes = 0;
|
||||
if (time >= 33868800)
|
||||
{
|
||||
if (time >= 33868800) {
|
||||
years = (int) (time / 33868800);
|
||||
time -= years * 33868800;
|
||||
toreturn.append(years + "y ");
|
||||
}
|
||||
if (time >= 604800)
|
||||
{
|
||||
if (time >= 604800) {
|
||||
weeks = (int) (time / 604800);
|
||||
time -= weeks * 604800;
|
||||
toreturn.append(weeks + "w ");
|
||||
}
|
||||
if (time >= 86400)
|
||||
{
|
||||
if (time >= 86400) {
|
||||
days = (int) (time / 86400);
|
||||
time -= days * 86400;
|
||||
toreturn.append(days + "d ");
|
||||
}
|
||||
if (time >= 3600)
|
||||
{
|
||||
if (time >= 3600) {
|
||||
hours = (int) (time / 3600);
|
||||
time -= hours * 3600;
|
||||
toreturn.append(hours + "h ");
|
||||
}
|
||||
if (time >= 60)
|
||||
{
|
||||
if (time >= 60) {
|
||||
minutes = (int) (time / 60);
|
||||
time -= minutes * 60;
|
||||
toreturn.append(minutes + "m ");
|
||||
}
|
||||
if (toreturn.equals("") || (time > 0))
|
||||
{
|
||||
if (toreturn.equals("") || (time > 0)) {
|
||||
toreturn.append((time) + "s ");
|
||||
}
|
||||
return toreturn.toString().trim();
|
||||
|
@ -48,22 +48,18 @@ import com.plotsquared.general.commands.CommandManager;
|
||||
* PlotSquared command class
|
||||
*
|
||||
*/
|
||||
public class MainCommand extends CommandManager<PlotPlayer>
|
||||
{
|
||||
|
||||
public class MainCommand extends CommandManager<PlotPlayer> {
|
||||
|
||||
private static MainCommand instance;
|
||||
|
||||
public static MainCommand getInstance()
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
|
||||
public static MainCommand getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new MainCommand();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
private MainCommand()
|
||||
{
|
||||
|
||||
private MainCommand() {
|
||||
super(null, new ArrayList<Command<PlotPlayer>>());
|
||||
instance = this;
|
||||
createCommand(new Buy());
|
||||
@ -133,54 +129,44 @@ public class MainCommand extends CommandManager<PlotPlayer>
|
||||
createCommand(new Done());
|
||||
createCommand(new Continue());
|
||||
createCommand(new BO3());
|
||||
if (Settings.ENABLE_CLUSTERS)
|
||||
{
|
||||
if (Settings.ENABLE_CLUSTERS) {
|
||||
MainCommand.getInstance().addCommand(new Cluster());
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean no_permission(final PlotPlayer player, final String permission)
|
||||
{
|
||||
|
||||
public static boolean no_permission(final PlotPlayer player, final String permission) {
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, permission);
|
||||
return false;
|
||||
}
|
||||
|
||||
public static List<Command<PlotPlayer>> getCommandAndAliases(final CommandCategory category, final PlotPlayer player)
|
||||
{
|
||||
|
||||
public static List<Command<PlotPlayer>> getCommandAndAliases(final CommandCategory category, final PlotPlayer player) {
|
||||
final List<Command<PlotPlayer>> commands = new ArrayList<>();
|
||||
for (final Command<PlotPlayer> command : getInstance().getCommands())
|
||||
{
|
||||
if ((category != null) && !command.getCategory().equals(category))
|
||||
{
|
||||
for (final Command<PlotPlayer> command : getInstance().getCommands()) {
|
||||
if ((category != null) && !command.getCategory().equals(category)) {
|
||||
continue;
|
||||
}
|
||||
if ((player != null) && !Permissions.hasPermission(player, command.getPermission()))
|
||||
{
|
||||
if ((player != null) && !Permissions.hasPermission(player, command.getPermission())) {
|
||||
continue;
|
||||
}
|
||||
commands.add(command);
|
||||
}
|
||||
return commands;
|
||||
}
|
||||
|
||||
public static List<Command<PlotPlayer>> getCommands(final CommandCategory category, final PlotPlayer player)
|
||||
{
|
||||
|
||||
public static List<Command<PlotPlayer>> getCommands(final CommandCategory category, final PlotPlayer player) {
|
||||
final List<Command<PlotPlayer>> commands = new ArrayList<>();
|
||||
for (final Command<PlotPlayer> command : new HashSet<>(getInstance().getCommands()))
|
||||
{
|
||||
if ((category != null) && !command.getCategory().equals(category))
|
||||
{
|
||||
for (final Command<PlotPlayer> command : new HashSet<>(getInstance().getCommands())) {
|
||||
if ((category != null) && !command.getCategory().equals(category)) {
|
||||
continue;
|
||||
}
|
||||
if ((player != null) && !Permissions.hasPermission(player, command.getPermission()))
|
||||
{
|
||||
if ((player != null) && !Permissions.hasPermission(player, command.getPermission())) {
|
||||
continue;
|
||||
}
|
||||
commands.add(command);
|
||||
}
|
||||
return commands;
|
||||
}
|
||||
|
||||
|
||||
//// public static List<String> helpMenu(final PlotPlayer player, final CommandCategory category, int page) {
|
||||
// List<Command<PlotPlayer>> commands;
|
||||
// // commands = getCommands(category, player);
|
||||
@ -222,38 +208,28 @@ public class MainCommand extends CommandManager<PlotPlayer>
|
||||
// return help;
|
||||
// }
|
||||
//
|
||||
public static void displayHelp(final PlotPlayer player, String cat, int page, final String label)
|
||||
{
|
||||
public static void displayHelp(final PlotPlayer player, String cat, int page, final String label) {
|
||||
CommandCategory catEnum = null;
|
||||
if (cat != null)
|
||||
{
|
||||
if (StringMan.isEqualIgnoreCase(cat, "all"))
|
||||
{
|
||||
if (cat != null) {
|
||||
if (StringMan.isEqualIgnoreCase(cat, "all")) {
|
||||
catEnum = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (final CommandCategory c : CommandCategory.values())
|
||||
{
|
||||
if (StringMan.isEqualIgnoreCaseToAny(cat, c.name(), c.toString()))
|
||||
{
|
||||
} else {
|
||||
for (final CommandCategory c : CommandCategory.values()) {
|
||||
if (StringMan.isEqualIgnoreCaseToAny(cat, c.name(), c.toString())) {
|
||||
catEnum = c;
|
||||
cat = c.name();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (catEnum == null)
|
||||
{
|
||||
if (catEnum == null) {
|
||||
cat = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((cat == null) && (page == 0))
|
||||
{
|
||||
if ((cat == null) && (page == 0)) {
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
builder.append(C.HELP_HEADER.s());
|
||||
for (final CommandCategory c : CommandCategory.values())
|
||||
{
|
||||
for (final CommandCategory c : CommandCategory.values()) {
|
||||
builder.append("\n" + StringMan.replaceAll(C.HELP_INFO_ITEM.s(), "%category%", c.toString().toLowerCase(), "%category_desc%", c.toString()));
|
||||
}
|
||||
builder.append("\n").append(C.HELP_INFO_ITEM.s().replaceAll("%category%", "all").replaceAll("%category_desc%", "Display all commands"));
|
||||
@ -262,224 +238,157 @@ public class MainCommand extends CommandManager<PlotPlayer>
|
||||
return;
|
||||
}
|
||||
page--;
|
||||
new HelpMenu(player)
|
||||
.setCategory(catEnum)
|
||||
.getCommands()
|
||||
.generateMaxPages()
|
||||
.generatePage(page, label)
|
||||
.render();
|
||||
new HelpMenu(player).setCategory(catEnum).getCommands().generateMaxPages().generatePage(page, label).render();
|
||||
}
|
||||
|
||||
public static boolean onCommand(final PlotPlayer player, final String cmd, String... args)
|
||||
{
|
||||
|
||||
public static boolean onCommand(final PlotPlayer player, final String cmd, String... args) {
|
||||
int help_index = -1;
|
||||
String category = null;
|
||||
if (args.length == 0)
|
||||
{
|
||||
if (args.length == 0) {
|
||||
help_index = 0;
|
||||
}
|
||||
else if (StringMan.isEqualIgnoreCaseToAny(args[0], "he", "help", "?"))
|
||||
{
|
||||
} else if (StringMan.isEqualIgnoreCaseToAny(args[0], "he", "help", "?")) {
|
||||
help_index = 0;
|
||||
switch (args.length)
|
||||
{
|
||||
case 3:
|
||||
{
|
||||
switch (args.length) {
|
||||
case 3: {
|
||||
category = args[1];
|
||||
if (MathMan.isInteger(args[2]))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (MathMan.isInteger(args[2])) {
|
||||
try {
|
||||
help_index = Integer.parseInt(args[2]);
|
||||
}
|
||||
catch (final NumberFormatException e)
|
||||
{
|
||||
} catch (final NumberFormatException e) {
|
||||
help_index = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (MathMan.isInteger(args[1]))
|
||||
{
|
||||
case 2: {
|
||||
if (MathMan.isInteger(args[1])) {
|
||||
category = null;
|
||||
try
|
||||
{
|
||||
try {
|
||||
help_index = Integer.parseInt(args[1]);
|
||||
}
|
||||
catch (final NumberFormatException e)
|
||||
{
|
||||
} catch (final NumberFormatException e) {
|
||||
help_index = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
help_index = 1;
|
||||
category = args[1];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((args.length == 1) && MathMan.isInteger(args[args.length - 1]))
|
||||
{
|
||||
try
|
||||
{
|
||||
} else if ((args.length == 1) && MathMan.isInteger(args[args.length - 1])) {
|
||||
try {
|
||||
help_index = Integer.parseInt(args[args.length - 1]);
|
||||
}
|
||||
catch (final NumberFormatException e)
|
||||
{}
|
||||
}
|
||||
else if (ConsolePlayer.isConsole(player) && (args.length >= 2))
|
||||
{
|
||||
} catch (final NumberFormatException e) {}
|
||||
} else if (ConsolePlayer.isConsole(player) && (args.length >= 2)) {
|
||||
final String[] split = args[0].split(";");
|
||||
String world;
|
||||
PlotId id;
|
||||
if (split.length == 2)
|
||||
{
|
||||
if (split.length == 2) {
|
||||
world = player.getLocation().getWorld();
|
||||
id = PlotId.fromString(split[0] + ";" + split[1]);
|
||||
}
|
||||
else if (split.length == 3)
|
||||
{
|
||||
} else if (split.length == 3) {
|
||||
world = split[0];
|
||||
id = PlotId.fromString(split[1] + ";" + split[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
id = null;
|
||||
world = null;
|
||||
}
|
||||
if ((id != null) && PS.get().isPlotWorld(world))
|
||||
{
|
||||
if ((id != null) && PS.get().isPlotWorld(world)) {
|
||||
final Plot plot = MainUtil.getPlot(world, id);
|
||||
if (plot != null)
|
||||
{
|
||||
if (plot != null) {
|
||||
player.teleport(MainUtil.getPlotCenter(plot));
|
||||
args = Arrays.copyOfRange(args, 1, args.length);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if (help_index != -1)
|
||||
{
|
||||
if (help_index != -1) {
|
||||
displayHelp(player, category, help_index, cmd);
|
||||
return true;
|
||||
}
|
||||
final StringBuilder builder = new StringBuilder(cmd).append(" ");
|
||||
final Iterator<String> iterator = Arrays.asList(args).iterator();
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
while (iterator.hasNext()) {
|
||||
builder.append(iterator.next());
|
||||
if (iterator.hasNext())
|
||||
{
|
||||
if (iterator.hasNext()) {
|
||||
builder.append(" ");
|
||||
}
|
||||
}
|
||||
getInstance().handle(player, builder.toString());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int handle(final PlotPlayer plr, final String input)
|
||||
{
|
||||
public int handle(final PlotPlayer plr, final String input) {
|
||||
final String[] parts = input.split(" ");
|
||||
String[] args;
|
||||
String label;
|
||||
if (parts.length == 1)
|
||||
{
|
||||
if (parts.length == 1) {
|
||||
label = null;
|
||||
args = new String[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
label = parts[1];
|
||||
args = new String[parts.length - 2];
|
||||
System.arraycopy(parts, 2, args, 0, args.length);
|
||||
}
|
||||
Command<PlotPlayer> cmd;
|
||||
if (label != null)
|
||||
{
|
||||
if (label != null) {
|
||||
cmd = getInstance().commands.get(label);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cmd = null;
|
||||
}
|
||||
if (cmd == null)
|
||||
{
|
||||
if (cmd == null) {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_SUBCOMMAND);
|
||||
{
|
||||
final List<Command<PlotPlayer>> cmds = getCommands(null, plr);
|
||||
if ((label == null) || (cmds.size() == 0))
|
||||
{
|
||||
if ((label == null) || (cmds.size() == 0)) {
|
||||
MainUtil.sendMessage(plr, C.DID_YOU_MEAN, "/plot help");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
final HashSet<String> setargs = new HashSet<>(args.length + 1);
|
||||
for (final String arg : args)
|
||||
{
|
||||
for (final String arg : args) {
|
||||
setargs.add(arg.toLowerCase());
|
||||
}
|
||||
setargs.add(label.toLowerCase());
|
||||
final String[] allargs = setargs.toArray(new String[setargs.size()]);
|
||||
int best = 0;
|
||||
for (final Command<PlotPlayer> current : cmds)
|
||||
{
|
||||
if (current.getUsage() != null)
|
||||
{
|
||||
for (final Command<PlotPlayer> current : cmds) {
|
||||
if (current.getUsage() != null) {
|
||||
int count = 0;
|
||||
for (final String word : new HashSet<String>(Arrays.asList((current.getUsage() + " " + current.getPermission() + " " + current.getCategory().name()).toLowerCase()
|
||||
.replaceAll("\\||\\>|\\<|\\[|\\]|\\{|\\}|\\_|\\/", " ").trim().replaceAll("\\s+", " ").split(" "))))
|
||||
{
|
||||
for (int i = 0; i < allargs.length; i++)
|
||||
{
|
||||
.replaceAll("\\||\\>|\\<|\\[|\\]|\\{|\\}|\\_|\\/", " ").trim().replaceAll("\\s+", " ").split(" ")))) {
|
||||
for (int i = 0; i < allargs.length; i++) {
|
||||
final String arg = allargs[i];
|
||||
if ((best - count - ((allargs.length - i) * 3)) >= 0)
|
||||
{
|
||||
if ((best - count - ((allargs.length - i) * 3)) >= 0) {
|
||||
continue;
|
||||
}
|
||||
if (StringMan.isEqual(arg, word))
|
||||
{
|
||||
if (StringMan.isEqual(arg, word)) {
|
||||
count += 3;
|
||||
}
|
||||
else if ((word.length() > arg.length()) && word.contains(arg))
|
||||
{
|
||||
} else if ((word.length() > arg.length()) && word.contains(arg)) {
|
||||
count += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (final String word : new HashSet<String>(Arrays.asList((current.getDescription()).toLowerCase().replaceAll("\\||\\>|\\<|\\[|\\]|\\{|\\}|\\_|\\/", " ").trim()
|
||||
.replaceAll("\\s+", " ").split(" "))))
|
||||
{
|
||||
for (int i = 0; i < allargs.length; i++)
|
||||
{
|
||||
.replaceAll("\\s+", " ").split(" ")))) {
|
||||
for (int i = 0; i < allargs.length; i++) {
|
||||
final String arg = allargs[i];
|
||||
if ((best - count - ((allargs.length - i) * 2)) >= 0)
|
||||
{
|
||||
if ((best - count - ((allargs.length - i) * 2)) >= 0) {
|
||||
continue;
|
||||
}
|
||||
if (StringMan.isEqual(arg, word))
|
||||
{
|
||||
if (StringMan.isEqual(arg, word)) {
|
||||
count += 2;
|
||||
}
|
||||
else if ((word.length() > arg.length()) && word.contains(arg))
|
||||
{
|
||||
} else if ((word.length() > arg.length()) && word.contains(arg)) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (count > best)
|
||||
{
|
||||
if (count > best) {
|
||||
best = count;
|
||||
cmd = current;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cmd == null)
|
||||
{
|
||||
if (cmd == null) {
|
||||
cmd = new StringComparison<>(label, getCommandAndAliases(null, plr)).getMatchObject();
|
||||
}
|
||||
MainUtil.sendMessage(plr, C.DID_YOU_MEAN, cmd.getUsage().replaceAll("\\{label\\}", parts[0]));
|
||||
@ -487,53 +396,39 @@ public class MainCommand extends CommandManager<PlotPlayer>
|
||||
}
|
||||
return CommandHandlingOutput.NOT_FOUND;
|
||||
}
|
||||
if (!cmd.getRequiredType().allows(plr))
|
||||
{
|
||||
if (ConsolePlayer.isConsole(plr))
|
||||
{
|
||||
if (!cmd.getRequiredType().allows(plr)) {
|
||||
if (ConsolePlayer.isConsole(plr)) {
|
||||
MainUtil.sendMessage(plr, C.IS_CONSOLE);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
MainUtil.sendMessage(plr, C.NOT_CONSOLE);
|
||||
}
|
||||
return CommandHandlingOutput.CALLER_OF_WRONG_TYPE;
|
||||
}
|
||||
if (!Permissions.hasPermission(plr, cmd.getPermission()))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, cmd.getPermission())) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, cmd.getPermission());
|
||||
return CommandHandlingOutput.NOT_PERMITTED;
|
||||
}
|
||||
final Argument<?>[] requiredArguments = cmd.getRequiredArguments();
|
||||
if ((requiredArguments != null) && (requiredArguments.length > 0))
|
||||
{
|
||||
if ((requiredArguments != null) && (requiredArguments.length > 0)) {
|
||||
boolean success = true;
|
||||
if (args.length < requiredArguments.length)
|
||||
{
|
||||
if (args.length < requiredArguments.length) {
|
||||
success = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < requiredArguments.length; i++)
|
||||
{
|
||||
if (requiredArguments[i].parse(args[i]) == null)
|
||||
{
|
||||
} else {
|
||||
for (int i = 0; i < requiredArguments.length; i++) {
|
||||
if (requiredArguments[i].parse(args[i]) == null) {
|
||||
success = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!success)
|
||||
{
|
||||
if (!success) {
|
||||
C.COMMAND_SYNTAX.send(plr, cmd.getUsage());
|
||||
return CommandHandlingOutput.WRONG_USAGE;
|
||||
}
|
||||
}
|
||||
try
|
||||
{
|
||||
try {
|
||||
final boolean result = cmd.onCommand(plr, args);
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
cmd.getUsage();
|
||||
// Unecessary!
|
||||
// if (usage != null && !usage.isEmpty()) {
|
||||
@ -541,9 +436,7 @@ public class MainCommand extends CommandManager<PlotPlayer>
|
||||
// }
|
||||
return CommandHandlingOutput.WRONG_USAGE;
|
||||
}
|
||||
}
|
||||
catch (final Throwable t)
|
||||
{
|
||||
} catch (final Throwable t) {
|
||||
t.printStackTrace();
|
||||
return CommandHandlingOutput.ERROR;
|
||||
}
|
||||
|
@ -49,17 +49,14 @@ permission = "plots.merge",
|
||||
usage = "/plot merge [direction]",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Merge extends SubCommand
|
||||
{
|
||||
public class Merge extends SubCommand {
|
||||
public final static String[] values = new String[] { "north", "east", "south", "west" };
|
||||
public final static String[] aliases = new String[] { "n", "e", "s", "w" };
|
||||
|
||||
public static String direction(float yaw)
|
||||
{
|
||||
|
||||
public static String direction(float yaw) {
|
||||
yaw = yaw / 90;
|
||||
final int i = Math.round(yaw);
|
||||
switch (i)
|
||||
{
|
||||
switch (i) {
|
||||
case -4:
|
||||
case 0:
|
||||
case 4:
|
||||
@ -77,30 +74,27 @@ public class Merge extends SubCommand
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
final Location loc = plr.getLocationFull();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((plot == null) || !plot.hasOwner())
|
||||
{
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((plot == null) || !plot.hasOwner()) {
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
final boolean admin = Permissions.hasPermission(plr, "plots.admin.command.merge");
|
||||
if (!plot.isOwner(plr.getUUID()) && !admin)
|
||||
{
|
||||
if (!plot.isOwner(plr.getUUID()) && !admin) {
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
int direction = -1;
|
||||
if (args.length == 0)
|
||||
{
|
||||
switch (direction(plr.getLocationFull().getYaw()))
|
||||
{
|
||||
if (args.length == 0) {
|
||||
switch (direction(plr.getLocationFull().getYaw())) {
|
||||
case "NORTH":
|
||||
direction = 0;
|
||||
break;
|
||||
@ -114,26 +108,20 @@ public class Merge extends SubCommand
|
||||
direction = 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("all"))
|
||||
{
|
||||
} else {
|
||||
if (args[0].equalsIgnoreCase("all")) {
|
||||
plot.autoMerge((args.length != 2) || !args[1].equalsIgnoreCase("false"));
|
||||
MainUtil.sendMessage(plr, C.SUCCESS_MERGE);
|
||||
return true;
|
||||
}
|
||||
for (int i = 0; i < values.length; i++)
|
||||
{
|
||||
if (args[0].equalsIgnoreCase(values[i]) || args[0].equalsIgnoreCase(aliases[i]))
|
||||
{
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
if (args[0].equalsIgnoreCase(values[i]) || args[0].equalsIgnoreCase(aliases[i])) {
|
||||
direction = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (direction == -1)
|
||||
{
|
||||
if (direction == -1) {
|
||||
MainUtil.sendMessage(plr, C.SUBCOMMAND_SET_OPTIONS_HEADER.s() + StringMan.join(values, C.BLOCK_LIST_SEPARATER.s()));
|
||||
MainUtil.sendMessage(plr, C.DIRECTION.s().replaceAll("%dir%", direction(loc.getYaw())));
|
||||
return false;
|
||||
@ -142,8 +130,7 @@ public class Merge extends SubCommand
|
||||
PlotId top = MainUtil.getTopPlot(plot).id;
|
||||
ArrayList<PlotId> selPlots;
|
||||
final String world = loc.getWorld();
|
||||
switch (direction)
|
||||
{
|
||||
switch (direction) {
|
||||
case 0: // north = -y
|
||||
selPlots = MainUtil.getMaxPlotSelectionIds(world, new PlotId(bot.x, bot.y - 1), new PlotId(top.x, top.y));
|
||||
break;
|
||||
@ -160,8 +147,7 @@ public class Merge extends SubCommand
|
||||
return false;
|
||||
}
|
||||
final int size = selPlots.size();
|
||||
if (Permissions.hasPermissionRange(plr, "plots.merge", Settings.MAX_PLOTS) < size)
|
||||
{
|
||||
if (Permissions.hasPermissionRange(plr, "plots.merge", Settings.MAX_PLOTS) < size) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.merge." + size);
|
||||
return false;
|
||||
}
|
||||
@ -178,22 +164,18 @@ public class Merge extends SubCommand
|
||||
final HashSet<UUID> multiUUID = new HashSet<UUID>();
|
||||
final HashSet<PlotId> multiPlots = new HashSet<>();
|
||||
final UUID u1 = plot.owner;
|
||||
for (final PlotId myid : plots)
|
||||
{
|
||||
for (final PlotId myid : plots) {
|
||||
final Plot myplot = PS.get().getPlot(world, myid);
|
||||
if ((myplot == null) || (myplot.owner == null))
|
||||
{
|
||||
if ((myplot == null) || (myplot.owner == null)) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERM_MERGE.s().replaceAll("%plot%", myid.toString()));
|
||||
return false;
|
||||
}
|
||||
final UUID u2 = myplot.owner;
|
||||
if (u2.equals(u1))
|
||||
{
|
||||
if (u2.equals(u1)) {
|
||||
continue;
|
||||
}
|
||||
final PlotPlayer p2 = UUIDHandler.getPlayer(u2);
|
||||
if (p2 == null)
|
||||
{
|
||||
if (p2 == null) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERM_MERGE.s().replaceAll("%plot%", myid.toString()));
|
||||
return false;
|
||||
}
|
||||
@ -201,40 +183,30 @@ public class Merge extends SubCommand
|
||||
multiPlots.add(myid);
|
||||
multiUUID.add(u2);
|
||||
}
|
||||
if (multiMerge)
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, C.PERMISSION_MERGE_OTHER))
|
||||
{
|
||||
if (multiMerge) {
|
||||
if (!Permissions.hasPermission(plr, C.PERMISSION_MERGE_OTHER)) {
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, C.PERMISSION_MERGE_OTHER.s());
|
||||
return false;
|
||||
}
|
||||
for (final UUID uuid : multiUUID)
|
||||
{
|
||||
for (final UUID uuid : multiUUID) {
|
||||
final PlotPlayer accepter = UUIDHandler.getPlayer(uuid);
|
||||
CmdConfirm.addPending(accepter, C.MERGE_REQUEST_CONFIRM.s().replaceAll("%s", plr.getName()), new Runnable()
|
||||
{
|
||||
CmdConfirm.addPending(accepter, C.MERGE_REQUEST_CONFIRM.s().replaceAll("%s", plr.getName()), new Runnable() {
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
public void run() {
|
||||
final PlotPlayer accepter = UUIDHandler.getPlayer(uuid);
|
||||
multiUUID.remove(uuid);
|
||||
if (multiUUID.size() == 0)
|
||||
{
|
||||
if (multiUUID.size() == 0) {
|
||||
final PlotPlayer pp = UUIDHandler.getPlayer(u1);
|
||||
if (pp == null)
|
||||
{
|
||||
if (pp == null) {
|
||||
sendMessage(accepter, C.MERGE_NOT_VALID);
|
||||
return;
|
||||
}
|
||||
final PlotWorld plotWorld = PS.get().getPlotWorld(world);
|
||||
if ((EconHandler.manager != null) && plotWorld.USE_ECONOMY)
|
||||
{
|
||||
if ((EconHandler.manager != null) && plotWorld.USE_ECONOMY) {
|
||||
double cost = plotWorld.MERGE_PRICE;
|
||||
cost = plots.size() * cost;
|
||||
if (cost > 0d)
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < cost)
|
||||
{
|
||||
if (cost > 0d) {
|
||||
if (EconHandler.manager.getMoney(plr) < cost) {
|
||||
sendMessage(plr, C.CANNOT_AFFORD_MERGE, cost + "");
|
||||
return;
|
||||
}
|
||||
@ -243,8 +215,7 @@ public class Merge extends SubCommand
|
||||
}
|
||||
}
|
||||
final boolean result = EventUtil.manager.callMerge(world, plot, plots);
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(plr, "&cMerge has been cancelled");
|
||||
return;
|
||||
}
|
||||
@ -260,14 +231,11 @@ public class Merge extends SubCommand
|
||||
return true;
|
||||
}
|
||||
final PlotWorld plotWorld = PS.get().getPlotWorld(world);
|
||||
if ((EconHandler.manager != null) && plotWorld.USE_ECONOMY)
|
||||
{
|
||||
if ((EconHandler.manager != null) && plotWorld.USE_ECONOMY) {
|
||||
double cost = plotWorld.MERGE_PRICE;
|
||||
cost = plots.size() * cost;
|
||||
if (cost > 0d)
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < cost)
|
||||
{
|
||||
if (cost > 0d) {
|
||||
if (EconHandler.manager.getMoney(plr) < cost) {
|
||||
sendMessage(plr, C.CANNOT_AFFORD_MERGE, cost + "");
|
||||
return false;
|
||||
}
|
||||
@ -276,8 +244,7 @@ public class Merge extends SubCommand
|
||||
}
|
||||
}
|
||||
final boolean result = EventUtil.manager.callMerge(world, plot, plots);
|
||||
if (!result)
|
||||
{
|
||||
if (!result) {
|
||||
MainUtil.sendMessage(plr, "&cMerge has been cancelled");
|
||||
return false;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user