More cleaning

This commit is contained in:
MattBDev 2016-03-23 13:09:13 -04:00
parent 9e2c6f2182
commit bb4700aa5a
54 changed files with 1831 additions and 1933 deletions

View File

@ -148,6 +148,7 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
Bukkit.getServer().getConsoleSender().sendMessage(message); Bukkit.getServer().getConsoleSender().sendMessage(message);
return; return;
} catch (Throwable ignored) { } catch (Throwable ignored) {
//ignored
} }
} }
System.out.println(ConsoleColors.fromString(message)); System.out.println(ConsoleColors.fromString(message));
@ -345,7 +346,7 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
} }
@Override @Override
final public ChunkGenerator getDefaultWorldGenerator(String world, String id) { public final ChunkGenerator getDefaultWorldGenerator(String world, String id) {
HybridGen result = new HybridGen(); HybridGen result = new HybridGen();
if (!PS.get().setupPlotWorld(world, id, result)) { if (!PS.get().setupPlotWorld(world, id, result)) {
return null; return null;
@ -590,14 +591,11 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
// create world // create world
ConfigurationSection worldConfig = PS.get().config.getConfigurationSection("worlds." + worldName); ConfigurationSection worldConfig = PS.get().config.getConfigurationSection("worlds." + worldName);
String manager = worldConfig.getString("generator.plugin", "PlotSquared"); String manager = worldConfig.getString("generator.plugin", "PlotSquared");
String generator = worldConfig.getString("generator.init", manager);
int type = worldConfig.getInt("generator.type");
int terrain = worldConfig.getInt("generator.terrain");
SetupObject setup = new SetupObject(); SetupObject setup = new SetupObject();
setup.plotManager = manager; setup.plotManager = manager;
setup.setupGenerator = generator; setup.setupGenerator = worldConfig.getString("generator.init", manager);
setup.type = type; setup.type = worldConfig.getInt("generator.type");
setup.terrain = terrain; setup.terrain = worldConfig.getInt("generator.terrain");
setup.step = new ConfigurationNode[0]; setup.step = new ConfigurationNode[0];
setup.world = worldName; setup.world = worldName;
SetupUtils.manager.setupWorld(setup); SetupUtils.manager.setupWorld(setup);

View File

@ -18,7 +18,7 @@ import java.util.Collection;
*/ */
public final class ArrayWrapper<E> { public final class ArrayWrapper<E> {
private E[] _array; private E[] array;
/** /**
* Creates an array wrapper with some elements. * Creates an array wrapper with some elements.
@ -64,7 +64,7 @@ public final class ArrayWrapper<E> {
* @return The array wrapped by this instance. * @return The array wrapped by this instance.
*/ */
public E[] getArray() { public E[] getArray() {
return this._array; return this.array;
} }
/** /**
@ -73,7 +73,7 @@ public final class ArrayWrapper<E> {
*/ */
public void setArray(E[] array) { public void setArray(E[] array) {
Validate.notNull(array, "The array must not be null."); Validate.notNull(array, "The array must not be null.");
this._array = array; this.array = array;
} }
/** /**
@ -86,7 +86,7 @@ public final class ArrayWrapper<E> {
if (!(other instanceof ArrayWrapper)) { if (!(other instanceof ArrayWrapper)) {
return false; return false;
} }
return Arrays.equals(this._array, ((ArrayWrapper) other)._array); return Arrays.equals(this.array, ((ArrayWrapper) other).array);
} }
/** /**
@ -96,6 +96,6 @@ public final class ArrayWrapper<E> {
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
return Arrays.hashCode(this._array); return Arrays.hashCode(this.array);
} }
} }

View File

@ -41,12 +41,12 @@ import java.util.logging.Level;
* provided by the vanilla Minecraft <a href="http://minecraft.gamepedia.com/Tellraw#Raw_JSON_Text">JSON message formatter</a>. * provided by the vanilla Minecraft <a href="http://minecraft.gamepedia.com/Tellraw#Raw_JSON_Text">JSON message formatter</a>.
* This class allows plugins to emulate the functionality of the vanilla Minecraft * This class allows plugins to emulate the functionality of the vanilla Minecraft
* <a href="http://minecraft.gamepedia.com/Commands#tellraw">tellraw command</a>. * <a href="http://minecraft.gamepedia.com/Commands#tellraw">tellraw command</a>.
* <p> * <p> This class follows the builder pattern, allowing for method chaining.
* This class follows the builder pattern, allowing for method chaining. * It is set up such that invocations of property-setting methods will affect
* It is set up such that invocations of property-setting methods will affect the current editing component, * the current editing component, and a call to {@link #then(String)} or
* and a call to {@link #then(String)} or {@link #text(TextualComponent)} will append a new editing component to the end of the message, * {@link #text(TextualComponent)} will append a new editing component to the
* optionally initializing it with text. Further property-setting method calls will affect that editing component. * end of the message, optionally initializing it with text. Further
* </p> * property-setting method calls will affect that editing component.</p>
*/ */
public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<MessagePart>, ConfigurationSerializable { public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<MessagePart>, ConfigurationSerializable {

View File

@ -39,7 +39,7 @@ public final class Reflection {
* This is needed to bypass the JAR package name changing on each update. * This is needed to bypass the JAR package name changing on each update.
* @return The version string of the OBC and NMS packages, <em>including the trailing dot</em>. * @return The version string of the OBC and NMS packages, <em>including the trailing dot</em>.
*/ */
public synchronized static String getVersion() { public static synchronized String getVersion() {
return PS.get().IMP.getNMSPackage(); return PS.get().IMP.getNMSPackage();
} }
@ -50,7 +50,7 @@ public final class Reflection {
* @param className The name of the class, excluding the package, within NMS. * @param className The name of the class, excluding the package, within NMS.
* @return The class instance representing the specified NMS class, or {@code null} if it could not be loaded. * @return The class instance representing the specified NMS class, or {@code null} if it could not be loaded.
*/ */
public synchronized static Class<?> getNMSClass(String className) { public static synchronized Class<?> getNMSClass(String className) {
if (_loadedNMSClasses.containsKey(className)) { if (_loadedNMSClasses.containsKey(className)) {
return _loadedNMSClasses.get(className); return _loadedNMSClasses.get(className);
} }
@ -76,7 +76,7 @@ public final class Reflection {
* .CraftItemStack}. * .CraftItemStack}.
* @return The class instance representing the specified OBC class, or {@code null} if it could not be loaded. * @return The class instance representing the specified OBC class, or {@code null} if it could not be loaded.
*/ */
public synchronized static Class<?> getOBCClass(String className) { public static synchronized Class<?> getOBCClass(String className) {
if (_loadedOBCClasses.containsKey(className)) { if (_loadedOBCClasses.containsKey(className)) {
return _loadedOBCClasses.get(className); return _loadedOBCClasses.get(className);
} }

View File

@ -178,25 +178,23 @@ public class ClassicPlotMeConnector extends APlotMeConnector {
if (denied == null) { if (denied == null) {
if ("*".equals(name)) { if ("*".equals(name)) {
denied = DBFunc.everyone; denied = DBFunc.everyone;
} else { } else if (DBFunc.hasColumn(resultSet, "playerid")) {
if (DBFunc.hasColumn(resultSet, "playerid")) { try {
try { byte[] bytes = resultSet.getBytes("playerid");
byte[] bytes = resultSet.getBytes("playerid"); if (bytes != null) {
if (bytes != null) { try {
try { ByteBuffer bb = ByteBuffer.wrap(bytes);
ByteBuffer bb = ByteBuffer.wrap(bytes); long high = bb.getLong();
long high = bb.getLong(); long low = bb.getLong();
long low = bb.getLong(); denied = new UUID(high, low);
denied = new UUID(high, low); } catch (Exception e) {
} catch (Exception e) { e.printStackTrace();
e.printStackTrace(); denied = UUID.nameUUIDFromBytes(bytes);
denied = UUID.nameUUIDFromBytes(bytes);
}
UUIDHandler.add(new StringWrapper(name), denied);
} }
} catch (SQLException e) { UUIDHandler.add(new StringWrapper(name), denied);
e.printStackTrace();
} }
} catch (SQLException e) {
e.printStackTrace();
} }
} }
if (denied == null) { if (denied == null) {

View File

@ -35,10 +35,10 @@ import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
import org.bukkit.command.CommandException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@ -51,60 +51,56 @@ import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
/**
* Created 2014-08-17 for PlotSquared
*
*/
public class LikePlotMeConverter { public class LikePlotMeConverter {
private final String plugin; private final String plugin;
/** /**
* Constructor * Constructor.
* *
* @param plugin Plugin Used to run the converter * @param plugin Plugin Used to run the converter
*/ */
public LikePlotMeConverter(final String plugin) { public LikePlotMeConverter(String plugin) {
this.plugin = plugin; this.plugin = plugin;
} }
public static String getWorld(final String world) { public static String getWorld(String world) {
for (final World newworld : Bukkit.getWorlds()) { for (World newworld : Bukkit.getWorlds()) {
if (newworld.getName().equalsIgnoreCase(world)) { if (newworld.getName().equalsIgnoreCase(world)) {
return newworld.getName(); return newworld.getName();
} }
} }
return world; return world;
} }
private void sendMessage(final String message) { private void sendMessage(String message) {
PS.debug("&3PlotMe&8->&3PlotSquared&8: &7" + message); PS.debug("&3PlotMe&8->&3PlotSquared&8: &7" + message);
} }
public String getPlotMePath() { public String getPlotMePath() {
return new File(".").getAbsolutePath() + File.separator + "plugins" + File.separator + plugin + File.separator; return new File(".").getAbsolutePath() + File.separator + "plugins" + File.separator + this.plugin + File.separator;
} }
public String getAthionPlotsPath() { public String getAthionPlotsPath() {
return new File(".").getAbsolutePath() + File.separator + "plugins" + File.separator + plugin + File.separator; return new File(".").getAbsolutePath() + File.separator + "plugins" + File.separator + this.plugin + File.separator;
} }
public FileConfiguration getPlotMeConfig(final String dataFolder) { public FileConfiguration getPlotMeConfig(String dataFolder) {
final File plotMeFile = new File(dataFolder + "config.yml"); File plotMeFile = new File(dataFolder + "config.yml");
if (!plotMeFile.exists()) { if (!plotMeFile.exists()) {
return null; return null;
} }
return YamlConfiguration.loadConfiguration(plotMeFile); return YamlConfiguration.loadConfiguration(plotMeFile);
} }
public Set<String> getPlotMeWorlds(final FileConfiguration plotConfig) { public Set<String> getPlotMeWorlds(FileConfiguration plotConfig) {
return plotConfig.getConfigurationSection("worlds").getKeys(false); return plotConfig.getConfigurationSection("worlds").getKeys(false);
} }
public void mergeWorldYml(final String plugin, FileConfiguration plotConfig) { public void mergeWorldYml(String plugin, FileConfiguration plotConfig) {
try { try {
File genConfig = new File("plugins" + File.separator + plugin + File.separator + "PlotMe-DefaultGenerator" + File.separator + "config.yml"); File genConfig =
new File("plugins" + File.separator + plugin + File.separator + "PlotMe-DefaultGenerator" + File.separator + "config.yml");
if (genConfig.exists()) { if (genConfig.exists()) {
YamlConfiguration yml = YamlConfiguration.loadConfiguration(genConfig); YamlConfiguration yml = YamlConfiguration.loadConfiguration(genConfig);
for (String key : yml.getKeys(true)) { for (String key : yml.getKeys(true)) {
@ -116,36 +112,35 @@ public class LikePlotMeConverter {
} }
} }
} }
} } catch (Exception e) {
catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
public void updateWorldYml(final String plugin, final String location) { public void updateWorldYml(String plugin, String location) {
try { try {
final Path path = Paths.get(location); Path path = Paths.get(location);
final File file = new File(location); File file = new File(location);
if (!file.exists()) { if (!file.exists()) {
return; return;
} }
final Charset charset = StandardCharsets.UTF_8; String content = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("PlotMe-DefaultGenerator", "PlotSquared"); content = content.replaceAll("PlotMe-DefaultGenerator", "PlotSquared");
content = content.replaceAll(plugin, "PlotSquared"); content = content.replaceAll(plugin, "PlotSquared");
Files.write(path, content.getBytes(charset)); Files.write(path, content.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) { } catch (IOException ignored) {
//ignored
} }
} }
public boolean run(final APlotMeConnector connector) { public boolean run(APlotMeConnector connector) {
try { try {
final String dataFolder = getPlotMePath(); String dataFolder = getPlotMePath();
final FileConfiguration plotConfig = getPlotMeConfig(dataFolder); FileConfiguration plotConfig = getPlotMeConfig(dataFolder);
if (plotConfig == null) { if (plotConfig == null) {
return false; return false;
} }
String version = plotConfig.getString("Version"); String version = plotConfig.getString("Version");
if (version == null) { if (version == null) {
version = plotConfig.getString("version"); version = plotConfig.getString("version");
@ -153,66 +148,67 @@ public class LikePlotMeConverter {
if (!connector.accepts(version)) { if (!connector.accepts(version)) {
return false; return false;
} }
PS.debug("&3Using connector: " + connector.getClass().getCanonicalName()); PS.debug("&3Using connector: " + connector.getClass().getCanonicalName());
final Connection connection = connector.getPlotMeConnection(plugin, plotConfig, dataFolder); Connection connection = connector.getPlotMeConnection(this.plugin, plotConfig, dataFolder);
if (!connector.isValidConnection(connection)) { if (!connector.isValidConnection(connection)) {
sendMessage("Cannot connect to PlotMe DB. Conversion process will not continue"); sendMessage("Cannot connect to PlotMe DB. Conversion process will not continue");
return false; return false;
} }
sendMessage(plugin + " conversion has started. To disable this, please set 'plotme-convert.enabled' to false in the 'settings.yml'");
mergeWorldYml(plugin, plotConfig);
sendMessage("Connecting to " + plugin + " DB");
final ArrayList<Plot> createdPlots = new ArrayList<>(); sendMessage(this.plugin + " conversion has started. To disable this, please set 'plotme-convert.enabled' to false in the 'settings.yml'");
mergeWorldYml(this.plugin, plotConfig);
sendMessage("Connecting to " + this.plugin + " DB");
ArrayList<Plot> createdPlots = new ArrayList<>();
sendMessage("Collecting plot data"); sendMessage("Collecting plot data");
final String dbPrefix = plugin.toLowerCase(); String dbPrefix = this.plugin.toLowerCase();
sendMessage(" - " + dbPrefix + "Plots"); sendMessage(" - " + dbPrefix + "Plots");
final Set<String> worlds = getPlotMeWorlds(plotConfig); final Set<String> worlds = getPlotMeWorlds(plotConfig);
if (Settings.CONVERT_PLOTME) { if (Settings.CONVERT_PLOTME) {
sendMessage("Updating bukkit.yml"); sendMessage("Updating bukkit.yml");
updateWorldYml(plugin, "bukkit.yml"); updateWorldYml(this.plugin, "bukkit.yml");
updateWorldYml(plugin, "plugins/Multiverse-Core/worlds.yml"); updateWorldYml(this.plugin, "plugins/Multiverse-Core/worlds.yml");
for (final String world : plotConfig.getConfigurationSection("worlds").getKeys(false)) { for (String world : plotConfig.getConfigurationSection("worlds").getKeys(false)) {
sendMessage("Copying config for: " + world); sendMessage("Copying config for: " + world);
try { try {
final String actualWorldName = getWorld(world); String actualWorldName = getWorld(world);
connector.copyConfig(plotConfig, world, actualWorldName); connector.copyConfig(plotConfig, world, actualWorldName);
PS.get().config.save(PS.get().configFile); PS.get().config.save(PS.get().configFile);
} catch (final Exception e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
sendMessage("&c-- &lFailed to save configuration for world '" + world + "'\nThis will need to be done using the setup command, or manually"); sendMessage("&c-- &lFailed to save configuration for world '" + world
+ "'\nThis will need to be done using the setup command, or manually");
} }
} }
} }
final HashMap<String, HashMap<PlotId, Plot>> plots = connector.getPlotMePlots(connection); HashMap<String, HashMap<PlotId, Plot>> plots = connector.getPlotMePlots(connection);
int plotCount = 0; int plotCount = 0;
for (final Entry<String, HashMap<PlotId, Plot>> entry : plots.entrySet()) { for (Entry<String, HashMap<PlotId, Plot>> entry : plots.entrySet()) {
plotCount += entry.getValue().size(); plotCount += entry.getValue().size();
} }
if (!Settings.CONVERT_PLOTME) { if (!Settings.CONVERT_PLOTME) {
return false; return false;
} }
sendMessage(" - " + dbPrefix + "Allowed"); sendMessage(" - " + dbPrefix + "Allowed");
sendMessage("Collected " + plotCount + " plots from PlotMe"); sendMessage("Collected " + plotCount + " plots from PlotMe");
final File PLOTME_DG_FILE = new File(dataFolder + File.separator + "PlotMe-DefaultGenerator" + File.separator + "config.yml"); File plotmeDgFile = new File(dataFolder + File.separator + "PlotMe-DefaultGenerator" + File.separator + "config.yml");
if (PLOTME_DG_FILE.exists()) { if (plotmeDgFile.exists()) {
final YamlConfiguration PLOTME_DG_YML = YamlConfiguration.loadConfiguration(PLOTME_DG_FILE); YamlConfiguration plotmeDgYml = YamlConfiguration.loadConfiguration(plotmeDgFile);
try { try {
for (final String world : plots.keySet()) { for (String world : plots.keySet()) {
final String actualWorldName = getWorld(world); String actualWorldName = getWorld(world);
final String plotMeWorldName = world.toLowerCase(); String plotMeWorldName = world.toLowerCase();
Integer pathwidth = PLOTME_DG_YML.getInt("worlds." + plotMeWorldName + ".PathWidth"); // Integer pathwidth = plotmeDgYml.getInt("worlds." + plotMeWorldName + ".PathWidth"); //
/* /*
* TODO: dead code * TODO: dead code
* *
@ -222,29 +218,29 @@ public class LikePlotMeConverter {
*/ */
PS.get().config.set("worlds." + world + ".road.width", pathwidth); PS.get().config.set("worlds." + world + ".road.width", pathwidth);
Integer pathheight = PLOTME_DG_YML.getInt("worlds." + plotMeWorldName + ".RoadHeight"); // Integer pathheight = plotmeDgYml.getInt("worlds." + plotMeWorldName + ".RoadHeight"); //
if (pathheight == 0) { if (pathheight == 0) {
pathheight = 64; pathheight = 64;
} }
PS.get().config.set("worlds." + world + ".road.height", pathheight); PS.get().config.set("worlds." + world + ".road.height", pathheight);
PS.get().config.set("worlds." + world + ".wall.height", pathheight); PS.get().config.set("worlds." + world + ".wall.height", pathheight);
PS.get().config.set("worlds." + world + ".plot.height", pathheight); PS.get().config.set("worlds." + world + ".plot.height", pathheight);
Integer plotsize = PLOTME_DG_YML.getInt("worlds." + plotMeWorldName + ".PlotSize"); // Integer plotsize = plotmeDgYml.getInt("worlds." + plotMeWorldName + ".PlotSize"); //
if (plotsize == 0) { if (plotsize == 0) {
plotsize = 32; plotsize = 32;
} }
PS.get().config.set("worlds." + world + ".plot.size", plotsize); PS.get().config.set("worlds." + world + ".plot.size", plotsize);
String wallblock = PLOTME_DG_YML.getString("worlds." + plotMeWorldName + ".WallBlock", "44"); // String wallblock = plotmeDgYml.getString("worlds." + plotMeWorldName + ".WallBlock", "44"); //
PS.get().config.set("worlds." + world + ".wall.block", wallblock); PS.get().config.set("worlds." + world + ".wall.block", wallblock);
String floor = PLOTME_DG_YML.getString("worlds." + plotMeWorldName + ".PlotFloorBlock", "2"); // String floor = plotmeDgYml.getString("worlds." + plotMeWorldName + ".PlotFloorBlock", "2"); //
PS.get().config.set("worlds." + world + ".plot.floor", Collections.singletonList(floor)); PS.get().config.set("worlds." + world + ".plot.floor", Collections.singletonList(floor));
String filling = PLOTME_DG_YML.getString("worlds." + plotMeWorldName + ".FillBlock", "3"); // String filling = plotmeDgYml.getString("worlds." + plotMeWorldName + ".FillBlock", "3"); //
PS.get().config.set("worlds." + world + ".plot.filling", Collections.singletonList(filling)); PS.get().config.set("worlds." + world + ".plot.filling", Collections.singletonList(filling));
String road = PLOTME_DG_YML.getString("worlds." + plotMeWorldName + ".RoadMainBlock", "5"); String road = plotmeDgYml.getString("worlds." + plotMeWorldName + ".RoadMainBlock", "5");
PS.get().config.set("worlds." + world + ".road.block", road); PS.get().config.set("worlds." + world + ".road.block", road);
Integer height = PLOTME_DG_YML.getInt("worlds." + plotMeWorldName + ".RoadHeight"); // Integer height = plotmeDgYml.getInt("worlds." + plotMeWorldName + ".RoadHeight"); //
if (height == 0) { if (height == 0) {
height = PLOTME_DG_YML.getInt("worlds." + plotMeWorldName + ".GroundHeight"); // height = plotmeDgYml.getInt("worlds." + plotMeWorldName + ".GroundHeight"); //
if (height == 0) { if (height == 0) {
height = 64; height = 64;
} }
@ -254,7 +250,8 @@ public class LikePlotMeConverter {
PS.get().config.set("worlds." + actualWorldName + ".wall.height", height); PS.get().config.set("worlds." + actualWorldName + ".wall.height", height);
PS.get().config.save(PS.get().configFile); PS.get().config.save(PS.get().configFile);
} }
} catch (IOException e) { } catch (IOException ignored) {
//ignored
} }
} }
for (Entry<String, HashMap<PlotId, Plot>> entry : plots.entrySet()) { for (Entry<String, HashMap<PlotId, Plot>> entry : plots.entrySet()) {
@ -270,7 +267,8 @@ public class LikePlotMeConverter {
} }
} }
if (duplicate > 0) { if (duplicate > 0) {
PS.debug("&c[WARNING] Found " + duplicate + " duplicate plots already in DB for world: '" + world + "'. Have you run the converter already?"); PS.debug("&c[WARNING] Found " + duplicate + " duplicate plots already in DB for world: '" + world
+ "'. Have you run the converter already?");
} }
} else { } else {
if (PS.get().plots_tmp != null) { if (PS.get().plots_tmp != null) {
@ -284,7 +282,8 @@ public class LikePlotMeConverter {
} }
} }
if (duplicate > 0) { if (duplicate > 0) {
PS.debug("&c[WARNING] Found " + duplicate + " duplicate plots already in DB for world: '" + world + "'. Have you run the converter already?"); PS.debug("&c[WARNING] Found " + duplicate + " duplicate plots already in DB for world: '" + world
+ "'. Have you run the converter already?");
} }
continue; continue;
} }
@ -315,57 +314,61 @@ public class LikePlotMeConverter {
sendMessage("Saving configuration..."); sendMessage("Saving configuration...");
try { try {
PS.get().config.save(PS.get().configFile); PS.get().config.save(PS.get().configFile);
} catch (final IOException e) { } catch (IOException e) {
sendMessage(" - &cFailed to save configuration."); sendMessage(" - &cFailed to save configuration.");
} }
TaskManager.runTask(new Runnable() { TaskManager.runTask(new Runnable() {
@Override @Override
public void run() { public void run() {
try { try {
boolean MV = false; boolean mv = false;
boolean MW = false; boolean mw = false;
if ((Bukkit.getPluginManager().getPlugin("Multiverse-Core") != null) && Bukkit.getPluginManager().getPlugin("Multiverse-Core").isEnabled()) { if ((Bukkit.getPluginManager().getPlugin("Multiverse-Core") != null) && Bukkit.getPluginManager().getPlugin("Multiverse-Core")
MV = true; .isEnabled()) {
} else if ((Bukkit.getPluginManager().getPlugin("MultiWorld") != null) && Bukkit.getPluginManager().getPlugin("MultiWorld").isEnabled()) { mv = true;
MW = true; } else if ((Bukkit.getPluginManager().getPlugin("MultiWorld") != null) && Bukkit.getPluginManager().getPlugin("MultiWorld")
.isEnabled()) {
mw = true;
} }
for (final String worldname : worlds) { for (String worldname : worlds) {
final World world = Bukkit.getWorld(getWorld(worldname)); World world = Bukkit.getWorld(getWorld(worldname));
if (world == null) { if (world == null) {
sendMessage("&cInvalid world in PlotMe configuration: " + worldname); sendMessage("&cInvalid world in PlotMe configuration: " + worldname);
} }
final String actualWorldName = world.getName(); String actualWorldName = world.getName();
sendMessage("Reloading generator for world: '" + actualWorldName + "'..."); sendMessage("Reloading generator for world: '" + actualWorldName + "'...");
PS.get().removePlotAreas(actualWorldName); PS.get().removePlotAreas(actualWorldName);
if (MV) { if (mv) {
// unload world with MV // unload world with MV
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mv unload " + actualWorldName); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mv unload " + actualWorldName);
try { try {
Thread.sleep(1000); Thread.sleep(1000);
} catch (final InterruptedException ex) { } catch (InterruptedException ex) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
// load world with MV // load world with MV
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mv import " + actualWorldName + " normal -g PlotSquared"); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(),
} else if (MW) { "mv import " + actualWorldName + " normal -g PlotSquared");
} else if (mw) {
// unload world with MW // unload world with MW
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw unload " + actualWorldName); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw unload " + actualWorldName);
try { try {
Thread.sleep(1000); Thread.sleep(1000);
} catch (final InterruptedException ex) { } catch (InterruptedException ex) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
// load world with MW // load world with MW
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw create " + actualWorldName + " plugin:PlotSquared"); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(),
"mw create " + actualWorldName + " plugin:PlotSquared");
} else { } else {
// Load using Bukkit API // Load using Bukkit API
// - User must set generator manually // - User must set generator manually
Bukkit.getServer().unloadWorld(world, true); Bukkit.getServer().unloadWorld(world, true);
final World myworld = WorldCreator.name(actualWorldName).generator(new BukkitPlotGenerator(new HybridGen())).createWorld(); World myworld = WorldCreator.name(actualWorldName).generator(new BukkitPlotGenerator(new HybridGen())).createWorld();
myworld.save(); myworld.save();
} }
} }
} catch (final Exception e) { } catch (CommandException e) {
e.printStackTrace(); e.printStackTrace();
} }
if (done.get()) { if (done.get()) {
@ -381,13 +384,13 @@ public class LikePlotMeConverter {
} }
} }
}); });
} catch (final Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
PS.debug("&/end/"); PS.debug("&/end/");
} }
return true; return true;
} }
public void done() { public void done() {
PS.get().setPlots(DBFunc.getPlots()); PS.get().setPlots(DBFunc.getPlots());
} }

View File

@ -23,39 +23,42 @@ import java.util.Map.Entry;
import java.util.UUID; import java.util.UUID;
public class PlotMeConnector_017 extends APlotMeConnector { public class PlotMeConnector_017 extends APlotMeConnector {
private String plugin; private String plugin;
@Override @Override
public Connection getPlotMeConnection(final String plugin, final FileConfiguration plotConfig, final String dataFolder) { public Connection getPlotMeConnection(String plugin, FileConfiguration plotConfig, String dataFolder) {
this.plugin = plugin.toLowerCase(); this.plugin = plugin.toLowerCase();
try { try {
if (plotConfig.getBoolean("usemySQL")) { if (plotConfig.getBoolean("usemySQL")) {
final String user = plotConfig.getString("mySQLuname"); String user = plotConfig.getString("mySQLuname");
final String password = plotConfig.getString("mySQLpass"); String password = plotConfig.getString("mySQLpass");
final String con = plotConfig.getString("mySQLconn"); String con = plotConfig.getString("mySQLconn");
return DriverManager.getConnection(con, user, password); return DriverManager.getConnection(con, user, password);
} else { } else {
final File file = new File(dataFolder + File.separator + "plotmecore.db"); File file = new File(dataFolder + File.separator + "plotmecore.db");
if (file.exists()) { if (file.exists()) {
return new SQLite(dataFolder + File.separator + "plotmecore.db").openConnection(); return new SQLite(dataFolder + File.separator + "plotmecore.db").openConnection();
} }
return new SQLite(dataFolder + File.separator + "plots.db").openConnection(); return new SQLite(dataFolder + File.separator + "plots.db").openConnection();
} }
} catch (SQLException | ClassNotFoundException e) {} } catch (SQLException | ClassNotFoundException ignored) {
//ignored
}
return null; return null;
} }
@Override @Override
public HashMap<String, HashMap<PlotId, Plot>> getPlotMePlots(final Connection connection) throws SQLException { public HashMap<String, HashMap<PlotId, Plot>> getPlotMePlots(Connection connection) throws SQLException {
ResultSet r; ResultSet resultSet;
PreparedStatement stmt; PreparedStatement statement;
final HashMap<String, Integer> plotWidth = new HashMap<>(); HashMap<String, Integer> plotWidth = new HashMap<>();
final HashMap<String, Integer> roadWidth = new HashMap<>(); HashMap<String, Integer> roadWidth = new HashMap<>();
final HashMap<Integer, Plot> plots = new HashMap<>(); HashMap<Integer, Plot> plots = new HashMap<>();
final HashMap<String, HashMap<PlotId, boolean[]>> merges = new HashMap<>(); HashMap<String, HashMap<PlotId, boolean[]>> merges = new HashMap<>();
try { try {
stmt = connection.prepareStatement("SELECT * FROM `" + plugin + "core_plots`"); statement = connection.prepareStatement("SELECT * FROM `" + this.plugin + "core_plots`");
r = stmt.executeQuery(); resultSet = statement.executeQuery();
} catch (SQLException e) { } catch (SQLException e) {
PS.debug("========= Table does not exist ========="); PS.debug("========= Table does not exist =========");
e.printStackTrace(); e.printStackTrace();
@ -64,29 +67,29 @@ public class PlotMeConnector_017 extends APlotMeConnector {
PS.debug("&8 - &7Please correct this, or if you are unsure, the most common is 0.16.3"); PS.debug("&8 - &7Please correct this, or if you are unsure, the most common is 0.16.3");
return null; return null;
} }
final boolean checkUUID = DBFunc.hasColumn(r, "ownerID"); boolean checkUUID = DBFunc.hasColumn(resultSet, "ownerID");
final boolean merge = !plugin.equals("plotme") && Settings.CONVERT_PLOTME; boolean merge = !this.plugin.equals("plotme") && Settings.CONVERT_PLOTME;
while (r.next()) { while (resultSet.next()) {
final int key = r.getInt("plot_id"); int key = resultSet.getInt("plot_id");
final PlotId id = new PlotId(r.getInt("plotX"), r.getInt("plotZ")); PlotId id = new PlotId(resultSet.getInt("plotX"), resultSet.getInt("plotZ"));
final String name = r.getString("owner"); String name = resultSet.getString("owner");
final String world = LikePlotMeConverter.getWorld(r.getString("world")); String world = LikePlotMeConverter.getWorld(resultSet.getString("world"));
if (!plots.containsKey(world) && merge) { if (!plots.containsKey(world) && merge) {
final int plot = PS.get().config.getInt("worlds." + world + ".plot.size"); int plot = PS.get().config.getInt("worlds." + world + ".plot.size");
final int path = PS.get().config.getInt("worlds." + world + ".road.width"); int path = PS.get().config.getInt("worlds." + world + ".road.width");
plotWidth.put(world, plot); plotWidth.put(world, plot);
roadWidth.put(world, path); roadWidth.put(world, path);
merges.put(world, new HashMap<PlotId, boolean[]>()); merges.put(world, new HashMap<PlotId, boolean[]>());
} }
if (merge) { if (merge) {
final int tx = r.getInt("topX"); int tx = resultSet.getInt("topX");
final int tz = r.getInt("topZ"); int tz = resultSet.getInt("topZ");
final int bx = r.getInt("bottomX") - 1; int bx = resultSet.getInt("bottomX") - 1;
final int bz = r.getInt("bottomZ") - 1; int bz = resultSet.getInt("bottomZ") - 1;
final int path = roadWidth.get(world); int path = roadWidth.get(world);
final int plot = plotWidth.get(world); int plot = plotWidth.get(world);
final Location top = getPlotTopLocAbs(path, plot, id); Location top = getPlotTopLocAbs(path, plot, id);
final Location bot = getPlotBottomLocAbs(path, plot, id); Location bot = getPlotBottomLocAbs(path, plot, id);
if (tx > top.getX()) { if (tx > top.getX()) {
setMerged(merges, world, id, 1); setMerged(merges, world, id, 1);
} }
@ -107,12 +110,12 @@ public class PlotMeConnector_017 extends APlotMeConnector {
} else { } else {
if (checkUUID) { if (checkUUID) {
try { try {
final byte[] bytes = r.getBytes("ownerid"); byte[] bytes = resultSet.getBytes("ownerid");
if (bytes != null) { if (bytes != null) {
owner = UUID.nameUUIDFromBytes(bytes); owner = UUID.nameUUIDFromBytes(bytes);
UUIDHandler.add(new StringWrapper(name), owner); UUIDHandler.add(new StringWrapper(name), owner);
} }
} catch (final Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -124,60 +127,60 @@ public class PlotMeConnector_017 extends APlotMeConnector {
} else { } else {
UUIDHandler.add(new StringWrapper(name), owner); UUIDHandler.add(new StringWrapper(name), owner);
} }
final Plot plot = new Plot(PlotArea.createGeneric(world), id, owner); Plot plot = new Plot(PlotArea.createGeneric(world), id, owner);
plots.put(key, plot); plots.put(key, plot);
} }
for (final Entry<Integer, Plot> entry : plots.entrySet()) { for (Entry<Integer, Plot> entry : plots.entrySet()) {
final Plot plot = entry.getValue(); Plot plot = entry.getValue();
final HashMap<PlotId, boolean[]> mergeMap = merges.get(plot.getArea().worldname); HashMap<PlotId, boolean[]> mergeMap = merges.get(plot.getArea().worldname);
if (mergeMap != null) { if (mergeMap != null) {
if (mergeMap.containsKey(plot.getId())) { if (mergeMap.containsKey(plot.getId())) {
plot.setMerged(mergeMap.get(plot.getId())); plot.setMerged(mergeMap.get(plot.getId()));
} }
} }
} }
r.close(); resultSet.close();
stmt.close(); statement.close();
try { try {
PS.log(" - " + plugin + "core_denied"); PS.log(" - " + this.plugin + "core_denied");
stmt = connection.prepareStatement("SELECT * FROM `" + plugin + "core_denied`"); statement = connection.prepareStatement("SELECT * FROM `" + this.plugin + "core_denied`");
r = stmt.executeQuery(); resultSet = statement.executeQuery();
while (r.next()) { while (resultSet.next()) {
final int key = r.getInt("plot_id"); int key = resultSet.getInt("plot_id");
final Plot plot = plots.get(key); Plot plot = plots.get(key);
if (plot == null) { if (plot == null) {
PS.log("&6Denied (" + key + ") references deleted plot; ignoring entry."); PS.log("&6Denied (" + key + ") references deleted plot; ignoring entry.");
continue; continue;
} }
final UUID denied = UUID.fromString(r.getString("player")); UUID denied = UUID.fromString(resultSet.getString("player"));
plot.getDenied().add(denied); plot.getDenied().add(denied);
} }
PS.log(" - " + plugin + "core_allowed"); PS.log(" - " + this.plugin + "core_allowed");
stmt = connection.prepareStatement("SELECT * FROM `" + plugin + "core_allowed`"); statement = connection.prepareStatement("SELECT * FROM `" + this.plugin + "core_allowed`");
r = stmt.executeQuery(); resultSet = statement.executeQuery();
while (r.next()) { while (resultSet.next()) {
final int key = r.getInt("plot_id"); int key = resultSet.getInt("plot_id");
final Plot plot = plots.get(key); Plot plot = plots.get(key);
if (plot == null) { if (plot == null) {
PS.log("&6Allowed (" + key + ") references deleted plot; ignoring entry."); PS.log("&6Allowed (" + key + ") references deleted plot; ignoring entry.");
continue; continue;
} }
final UUID allowed = UUID.fromString(r.getString("player")); UUID allowed = UUID.fromString(resultSet.getString("player"));
plot.getTrusted().add(allowed); plot.getTrusted().add(allowed);
} }
r.close(); resultSet.close();
stmt.close(); statement.close();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
final HashMap<String, HashMap<PlotId, Plot>> processed = new HashMap<>(); HashMap<String, HashMap<PlotId, Plot>> processed = new HashMap<>();
for (final Entry<Integer, Plot> entry : plots.entrySet()) { for (Entry<Integer, Plot> entry : plots.entrySet()) {
final Plot plot = entry.getValue(); Plot plot = entry.getValue();
HashMap<PlotId, Plot> map = processed.get(plot.getArea().worldname); HashMap<PlotId, Plot> map = processed.get(plot.getArea().worldname);
if (map == null) { if (map == null) {
map = new HashMap<>(); map = new HashMap<>();
@ -187,9 +190,9 @@ public class PlotMeConnector_017 extends APlotMeConnector {
} }
return processed; return processed;
} }
@Override @Override
public boolean accepts(final String version) { public boolean accepts(String version) {
if (version == null) { if (version == null) {
return false; return false;
} }

View File

@ -29,17 +29,20 @@ import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
public class WEListener implements Listener { public class WEListener implements Listener {
public final HashSet<String> rad1 = new HashSet<>(Arrays.asList("forestgen", "pumpkins", "drain", "fixwater", "fixlava", "replacenear", "snow", "thaw", "ex", "butcher", "size")); public final HashSet<String> rad1 = new HashSet<>(
Arrays.asList("forestgen", "pumpkins", "drain", "fixwater", "fixlava", "replacenear", "snow", "thaw", "ex", "butcher", "size"));
public final HashSet<String> rad2 = new HashSet<>(Arrays.asList("fill", "fillr", "removenear", "remove")); public final HashSet<String> rad2 = new HashSet<>(Arrays.asList("fill", "fillr", "removenear", "remove"));
public final HashSet<String> rad2_1 = new HashSet<>(Arrays.asList("hcyl", "cyl")); public final HashSet<String> rad2_1 = new HashSet<>(Arrays.asList("hcyl", "cyl"));
public final HashSet<String> rad2_2 = new HashSet<>(Arrays.asList("sphere", "pyramid")); public final HashSet<String> rad2_2 = new HashSet<>(Arrays.asList("sphere", "pyramid"));
public final HashSet<String> rad2_3 = new HashSet<>(Collections.singletonList("brush smooth")); public final HashSet<String> rad2_3 = new HashSet<>(Collections.singletonList("brush smooth"));
public final HashSet<String> rad3_1 = new HashSet<>(Collections.singletonList("brush gravity")); public final HashSet<String> rad3_1 = new HashSet<>(Collections.singletonList("brush gravity"));
public final HashSet<String> rad3_2 = new HashSet<>(Arrays.asList("brush sphere", "brush cylinder")); public final HashSet<String> rad3_2 = new HashSet<>(Arrays.asList("brush sphere", "brush cylinder"));
public final HashSet<String> region = new HashSet<>(Arrays.asList("move", "set", "replace", "overlay", "walls", "outline", "deform", "hollow", "smooth", "naturalize", "paste", "count", "distr", public final HashSet<String> region = new HashSet<>(
"regen", "copy", "cut", "green", "setbiome")); Arrays.asList("move", "set", "replace", "overlay", "walls", "outline", "deform", "hollow", "smooth", "naturalize", "paste", "count",
"distr",
"regen", "copy", "cut", "green", "setbiome"));
public final HashSet<String> regionExtend = new HashSet<>(Collections.singletonList("stack")); public final HashSet<String> regionExtend = new HashSet<>(Collections.singletonList("stack"));
public final HashSet<String> restricted = new HashSet<>(Collections.singletonList("up")); public final HashSet<String> restricted = new HashSet<>(Collections.singletonList("up"));
public final HashSet<String> other = new HashSet<>(Arrays.asList("undo", "redo")); public final HashSet<String> other = new HashSet<>(Arrays.asList("undo", "redo"));
@ -152,7 +155,7 @@ public class WEListener implements Listener {
} }
return true; return true;
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public boolean onPlayerCommand(PlayerCommandPreprocessEvent e) { public boolean onPlayerCommand(PlayerCommandPreprocessEvent e) {
WorldEditPlugin worldedit = BukkitMain.worldEdit; WorldEditPlugin worldedit = BukkitMain.worldEdit;
@ -229,7 +232,8 @@ public class WEListener implements Listener {
if (split.length == 4) { if (split.length == 4) {
int iterations = getInt(split[3]); int iterations = getInt(split[3]);
if (iterations > maxIterations) { if (iterations > maxIterations) {
MainUtil.sendMessage(pp, C.WORLDEDIT_ITERATIONS.s().replaceAll("%current%", iterations + "").replaceAll("%max%", maxIterations + "")); MainUtil.sendMessage(pp,
C.WORLDEDIT_ITERATIONS.s().replaceAll("%current%", iterations + "").replaceAll("%max%", maxIterations + ""));
e.setCancelled(true); e.setCancelled(true);
if (Permissions.hasPermission(pp, "plots.worldedit.bypass")) { if (Permissions.hasPermission(pp, "plots.worldedit.bypass")) {
MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASS); MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASS);

View File

@ -6,32 +6,34 @@ import org.bukkit.OfflinePlayer;
import java.util.UUID; import java.util.UUID;
public class BukkitOfflinePlayer implements OfflinePlotPlayer { public class BukkitOfflinePlayer implements OfflinePlotPlayer {
public final OfflinePlayer player; public final OfflinePlayer player;
/** /**
* Please do not use this method. Instead use BukkitUtil.getPlayer(Player), as it caches player objects. * <p>Please do not use this method. Instead use BukkitUtil.getPlayer(Player),
* as it caches player objects.</p>
*
* @param player * @param player
*/ */
public BukkitOfflinePlayer(OfflinePlayer player) { public BukkitOfflinePlayer(OfflinePlayer player) {
this.player = player; this.player = player;
} }
@Override @Override
public UUID getUUID() { public UUID getUUID() {
return this.player.getUniqueId(); return this.player.getUniqueId();
} }
@Override @Override
public long getLastPlayed() { public long getLastPlayed() {
return this.player.getLastPlayed(); return this.player.getLastPlayed();
} }
@Override @Override
public boolean isOnline() { public boolean isOnline() {
return this.player.isOnline(); return this.player.isOnline();
} }
@Override @Override
public String getName() { public String getName() {
return this.player.getName(); return this.player.getName();

View File

@ -28,7 +28,8 @@ public class BukkitPlayer extends PlotPlayer {
private long last = 0; private long last = 0;
/** /**
* Please do not use this method. Instead use BukkitUtil.getPlayer(Player), as it caches player objects. * <p>Please do not use this method. Instead use BukkitUtil.getPlayer(Player),
* as it caches player objects.</p>
* @param player * @param player
*/ */
public BukkitPlayer(Player player) { public BukkitPlayer(Player player) {
@ -140,13 +141,16 @@ public class BukkitPlayer extends PlotPlayer {
switch (weather) { switch (weather) {
case CLEAR: case CLEAR:
this.player.setPlayerWeather(WeatherType.CLEAR); this.player.setPlayerWeather(WeatherType.CLEAR);
return; break;
case RAIN: case RAIN:
this.player.setPlayerWeather(WeatherType.DOWNFALL); this.player.setPlayerWeather(WeatherType.DOWNFALL);
return; break;
case RESET: case RESET:
this.player.resetPlayerWeather(); this.player.resetPlayerWeather();
return; break;
default:
this.player.resetPlayerWeather();
break;
} }
} }
@ -161,8 +165,9 @@ public class BukkitPlayer extends PlotPlayer {
return PlotGameMode.SPECTATOR; return PlotGameMode.SPECTATOR;
case SURVIVAL: case SURVIVAL:
return PlotGameMode.SURVIVAL; return PlotGameMode.SURVIVAL;
default:
return PlotGameMode.SURVIVAL;
} }
return null;
} }
@Override @Override
@ -170,16 +175,19 @@ public class BukkitPlayer extends PlotPlayer {
switch (gameMode) { switch (gameMode) {
case ADVENTURE: case ADVENTURE:
this.player.setGameMode(GameMode.ADVENTURE); this.player.setGameMode(GameMode.ADVENTURE);
return; break;
case CREATIVE: case CREATIVE:
this.player.setGameMode(GameMode.CREATIVE); this.player.setGameMode(GameMode.CREATIVE);
return; break;
case SPECTATOR: case SPECTATOR:
this.player.setGameMode(GameMode.SPECTATOR); this.player.setGameMode(GameMode.SPECTATOR);
return; break;
case SURVIVAL: case SURVIVAL:
this.player.setGameMode(GameMode.SURVIVAL); this.player.setGameMode(GameMode.SURVIVAL);
return; break;
default:
this.player.setGameMode(GameMode.SURVIVAL);
break;
} }
} }

View File

@ -1,12 +1,13 @@
package com.plotsquared.bukkit.object.entity; package com.plotsquared.bukkit.object.entity;
public class ArmorStandStats { public class ArmorStandStats {
public float[] head = new float[3];
public float[] body = new float[3]; public final float[] head = new float[3];
public float[] leftLeg = new float[3]; public final float[] body = new float[3];
public float[] rightLeg = new float[3]; public final float[] leftLeg = new float[3];
public float[] leftArm = new float[3]; public final float[] rightLeg = new float[3];
public float[] rightArm = new float[3]; public final float[] leftArm = new float[3];
public final float[] rightArm = new float[3];
public boolean arms; public boolean arms;
public boolean noplate; public boolean noplate;
public boolean nogravity; public boolean nogravity;

View File

@ -1,16 +1,5 @@
package com.plotsquared.bukkit.object.schematic; package com.plotsquared.bukkit.object.schematic;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import com.intellectualcrafters.jnbt.ByteTag; import com.intellectualcrafters.jnbt.ByteTag;
import com.intellectualcrafters.jnbt.CompoundTag; import com.intellectualcrafters.jnbt.CompoundTag;
import com.intellectualcrafters.jnbt.ListTag; import com.intellectualcrafters.jnbt.ListTag;
@ -20,32 +9,42 @@ import com.intellectualcrafters.plot.object.schematic.ItemType;
import com.intellectualcrafters.plot.object.schematic.PlotItem; import com.intellectualcrafters.plot.object.schematic.PlotItem;
import com.intellectualcrafters.plot.util.MathMan; import com.intellectualcrafters.plot.util.MathMan;
import com.intellectualcrafters.plot.util.SchematicHandler.Schematic; import com.intellectualcrafters.plot.util.SchematicHandler.Schematic;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class StateWrapper { public class StateWrapper {
public BlockState state = null; public BlockState state = null;
public CompoundTag tag = null; public CompoundTag tag = null;
public StateWrapper(final BlockState state) { public StateWrapper(BlockState state) {
this.state = state; this.state = state;
} }
public StateWrapper(final CompoundTag tag) { public StateWrapper(CompoundTag tag) {
this.tag = tag; this.tag = tag;
} }
public boolean restoreTag(final short x, final short y, final short z, final Schematic schematic) { public boolean restoreTag(short x, short y, short z, Schematic schematic) {
if (tag == null) { if (this.tag == null) {
return false; return false;
} }
final List<Tag> itemsTag = tag.getListTag("Items").getValue(); List<Tag> itemsTag = this.tag.getListTag("Items").getValue();
final int length = itemsTag.size(); int length = itemsTag.size();
final short[] ids = new short[length]; short[] ids = new short[length];
final byte[] datas = new byte[length]; byte[] datas = new byte[length];
final byte[] amounts = new byte[length]; byte[] amounts = new byte[length];
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
final Tag itemTag = itemsTag.get(i); Tag itemTag = itemsTag.get(i);
final CompoundTag itemComp = (CompoundTag) itemTag; CompoundTag itemComp = (CompoundTag) itemTag;
short id = itemComp.getShort("id"); short id = itemComp.getShort("id");
String idStr = itemComp.getString("id"); String idStr = itemComp.getString("id");
if (idStr != null && !MathMan.isInteger(idStr)) { if (idStr != null && !MathMan.isInteger(idStr)) {
@ -61,30 +60,30 @@ public class StateWrapper {
} }
return true; return true;
} }
public CompoundTag getTag() { public CompoundTag getTag() {
if (tag != null) { if (this.tag != null) {
return tag; return this.tag;
} }
if (state instanceof InventoryHolder) { if (this.state instanceof InventoryHolder) {
final InventoryHolder inv = (InventoryHolder) state; InventoryHolder inv = (InventoryHolder) this.state;
final ItemStack[] contents = inv.getInventory().getContents(); ItemStack[] contents = inv.getInventory().getContents();
final Map<String, Tag> values = new HashMap<>(); Map<String, Tag> values = new HashMap<>();
values.put("Items", new ListTag("Items", CompoundTag.class, serializeInventory(contents))); values.put("Items", new ListTag("Items", CompoundTag.class, serializeInventory(contents)));
return new CompoundTag(values); return new CompoundTag(values);
} }
return null; return null;
} }
public String getId() { public String getId() {
return "Chest"; return "Chest";
} }
public List<CompoundTag> serializeInventory(final ItemStack[] items) { public List<CompoundTag> serializeInventory(ItemStack[] items) {
final List<CompoundTag> tags = new ArrayList<>(); List<CompoundTag> tags = new ArrayList<>();
for (int i = 0; i < items.length; ++i) { for (int i = 0; i < items.length; ++i) {
if (items[i] != null) { if (items[i] != null) {
final Map<String, Tag> tagData = serializeItem(items[i]); Map<String, Tag> tagData = serializeItem(items[i]);
tagData.put("Slot", new ByteTag("Slot", (byte) i)); tagData.put("Slot", new ByteTag("Slot", (byte) i));
tags.add(new CompoundTag(tagData)); tags.add(new CompoundTag(tagData));
} }
@ -103,21 +102,21 @@ public class StateWrapper {
return data; return data;
} }
*/ */
public Map<String, Tag> serializeItem(final ItemStack item) { public Map<String, Tag> serializeItem(ItemStack item) {
final Map<String, Tag> data = new HashMap<>(); Map<String, Tag> data = new HashMap<>();
data.put("id", new ShortTag("id", (short) item.getTypeId())); data.put("id", new ShortTag("id", (short) item.getTypeId()));
data.put("Damage", new ShortTag("Damage", item.getDurability())); data.put("Damage", new ShortTag("Damage", item.getDurability()));
data.put("Count", new ByteTag("Count", (byte) item.getAmount())); data.put("Count", new ByteTag("Count", (byte) item.getAmount()));
if (!item.getEnchantments().isEmpty()) { if (!item.getEnchantments().isEmpty()) {
final List<CompoundTag> enchantmentList = new ArrayList<>(); List<CompoundTag> enchantmentList = new ArrayList<>();
for (final Entry<Enchantment, Integer> entry : item.getEnchantments().entrySet()) { for (Entry<Enchantment, Integer> entry : item.getEnchantments().entrySet()) {
final Map<String, Tag> enchantment = new HashMap<>(); Map<String, Tag> enchantment = new HashMap<>();
enchantment.put("id", new ShortTag("id", (short) entry.getKey().getId())); enchantment.put("id", new ShortTag("id", (short) entry.getKey().getId()));
enchantment.put("lvl", new ShortTag("lvl", entry.getValue().shortValue())); enchantment.put("lvl", new ShortTag("lvl", entry.getValue().shortValue()));
enchantmentList.add(new CompoundTag(enchantment)); enchantmentList.add(new CompoundTag(enchantment));
} }
final Map<String, Tag> auxData = new HashMap<>(); Map<String, Tag> auxData = new HashMap<>();
auxData.put("ench", new ListTag("ench", CompoundTag.class, enchantmentList)); auxData.put("ench", new ListTag("ench", CompoundTag.class, enchantmentList));
data.put("tag", new CompoundTag("tag", auxData)); data.put("tag", new CompoundTag("tag", auxData));
} }

View File

@ -13,7 +13,6 @@ import java.util.Map;
/** /**
* [ PlotSquared DefaultTitleManager by Maxim Van de Wynckel ] * [ PlotSquared DefaultTitleManager by Maxim Van de Wynckel ]
* *
* @version 1.1.0
* @author Maxim Van de Wynckel * @author Maxim Van de Wynckel
* *
*/ */
@ -46,7 +45,7 @@ public class DefaultTitleManager {
* Title * Title
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager(final String title) throws ClassNotFoundException { public DefaultTitleManager(String title) throws ClassNotFoundException {
this.title = title; this.title = title;
loadClasses(); loadClasses();
} }
@ -60,48 +59,42 @@ public class DefaultTitleManager {
* Subtitle text * Subtitle text
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager(final String title, final String subtitle) throws ClassNotFoundException { public DefaultTitleManager(String title, String subtitle) throws ClassNotFoundException {
this.title = title; this.title = title;
this.subtitle = subtitle; this.subtitle = subtitle;
loadClasses(); loadClasses();
} }
/** /**
* Copy 1.8 title * Copy 1.8 title.
* *
* @param title * @param title Title
* Title
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager(final DefaultTitleManager title) throws ClassNotFoundException { public DefaultTitleManager(DefaultTitleManager title) throws ClassNotFoundException {
// Copy title // Copy title
this.title = title.title; this.title = title.title;
subtitle = title.subtitle; this.subtitle = title.subtitle;
titleColor = title.titleColor; this.titleColor = title.titleColor;
subtitleColor = title.subtitleColor; this.subtitleColor = title.subtitleColor;
fadeInTime = title.fadeInTime; this.fadeInTime = title.fadeInTime;
fadeOutTime = title.fadeOutTime; this.fadeOutTime = title.fadeOutTime;
stayTime = title.stayTime; this.stayTime = title.stayTime;
ticks = title.ticks; this.ticks = title.ticks;
loadClasses(); loadClasses();
} }
/** /**
* Create a new 1.8 title * Create a new 1.8 title.
* *
* @param title * @param title Title text
* Title text * @param subtitle Subtitle text
* @param subtitle * @param fadeInTime Fade in time
* Subtitle text * @param stayTime Stay on screen time
* @param fadeInTime * @param fadeOutTime Fade out time
* Fade in time
* @param stayTime
* Stay on screen time
* @param fadeOutTime
* Fade out time
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager(final String title, final String subtitle, final int fadeInTime, final int stayTime, final int fadeOutTime) public DefaultTitleManager(String title, String subtitle, int fadeInTime, int stayTime, int fadeOutTime)
throws ClassNotFoundException { throws ClassNotFoundException {
this.title = title; this.title = title;
this.subtitle = subtitle; this.subtitle = subtitle;
@ -111,7 +104,7 @@ public class DefaultTitleManager {
loadClasses(); loadClasses();
} }
private static boolean equalsTypeArray(final Class<?>[] a, final Class<?>[] o) { private static boolean equalsTypeArray(Class<?>[] a, Class<?>[] o) {
if (a.length != o.length) { if (a.length != o.length) {
return false; return false;
} }
@ -128,10 +121,10 @@ public class DefaultTitleManager {
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
private void loadClasses() throws ClassNotFoundException { private void loadClasses() throws ClassNotFoundException {
packetTitle = getNMSClass("PacketPlayOutTitle"); this.packetTitle = getNMSClass("PacketPlayOutTitle");
packetActions = getNMSClass("EnumTitleAction"); this.packetActions = getNMSClass("EnumTitleAction");
chatBaseComponent = getNMSClass("IChatBaseComponent"); this.chatBaseComponent = getNMSClass("IChatBaseComponent");
nmsChatSerializer = getNMSClass("ChatSerializer"); this.nmsChatSerializer = getNMSClass("ChatSerializer");
} }
/** /**
@ -140,7 +133,7 @@ public class DefaultTitleManager {
* @return Title text * @return Title text
*/ */
public String getTitle() { public String getTitle() {
return title; return this.title;
} }
/** /**
@ -149,7 +142,7 @@ public class DefaultTitleManager {
* @param title * @param title
* Title * Title
*/ */
public void setTitle(final String title) { public void setTitle(String title) {
this.title = title; this.title = title;
} }
@ -159,190 +152,172 @@ public class DefaultTitleManager {
* @return Subtitle text * @return Subtitle text
*/ */
public String getSubtitle() { public String getSubtitle() {
return subtitle; return this.subtitle;
} }
/** /**
* Set subtitle text * Set subtitle text.
* *
* @param subtitle * @param subtitle Subtitle text
* Subtitle text
*/ */
public void setSubtitle(final String subtitle) { public void setSubtitle(String subtitle) {
this.subtitle = subtitle; this.subtitle = subtitle;
} }
/** /**
* Set the title color * Set the title color.
* *
* @param color * @param color Chat color
* Chat color
*/ */
public void setTitleColor(final ChatColor color) { public void setTitleColor(ChatColor color) {
titleColor = color; this.titleColor = color;
} }
/** /**
* Set the subtitle color * Set the subtitle color.
* *
* @param color * @param color Chat color
* Chat color
*/ */
public void setSubtitleColor(final ChatColor color) { public void setSubtitleColor(ChatColor color) {
subtitleColor = color; this.subtitleColor = color;
} }
/** /**
* Set title fade in time * Set title fade in time.
* *
* @param time * @param time Time
* Time
*/ */
public void setFadeInTime(final int time) { public void setFadeInTime(int time) {
fadeInTime = time; this.fadeInTime = time;
} }
/** /**
* Set title fade out time * Set title fade out time.
* *
* @param time * @param time Time
* Time
*/ */
public void setFadeOutTime(final int time) { public void setFadeOutTime(int time) {
fadeOutTime = time; this.fadeOutTime = time;
} }
/** /**
* Set title stay time * Set title stay time.
* *
* @param time * @param time Time
* Time
*/ */
public void setStayTime(final int time) { public void setStayTime(int time) {
stayTime = time; this.stayTime = time;
} }
/** /**
* Set timings to ticks * Set timings to ticks.
*/ */
public void setTimingsToTicks() { public void setTimingsToTicks() {
ticks = true; this.ticks = true;
} }
/** /**
* Set timings to seconds * Set timings to seconds.
*/ */
public void setTimingsToSeconds() { public void setTimingsToSeconds() {
ticks = false; this.ticks = false;
} }
/** /**
* Send the title to a player * Send the title to a player.
* *
* @param player * @param player Player
* Player * @throws Exception
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/ */
public void send(final Player player) public void send(Player player) throws Exception {
throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, if (this.packetTitle != null) {
SecurityException {
if (packetTitle != null) {
// First reset previous settings // First reset previous settings
resetTitle(player); resetTitle(player);
// Send timings first // Send timings first
final Object handle = getHandle(player); Object handle = getHandle(player);
final Object connection = getField(handle.getClass(), "playerConnection").get(handle); Object connection = getField(handle.getClass(), "playerConnection").get(handle);
final Object[] actions = packetActions.getEnumConstants(); Object[] actions = this.packetActions.getEnumConstants();
final Method sendPacket = getMethod(connection.getClass(), "sendPacket"); Method sendPacket = getMethod(connection.getClass(), "sendPacket");
Object packet = packetTitle.getConstructor(packetActions, chatBaseComponent, Integer.TYPE, Integer.TYPE, Integer.TYPE) Object packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent, Integer.TYPE, Integer.TYPE, Integer.TYPE)
.newInstance(actions[2], null, fadeInTime * (ticks ? 1 : 20), .newInstance(actions[2], null, this.fadeInTime * (this.ticks ? 1 : 20),
stayTime * (ticks ? 1 : 20), fadeOutTime * (ticks ? 1 : 20)); this.stayTime * (this.ticks ? 1 : 20), this.fadeOutTime * (this.ticks ? 1 : 20));
// Send if set // Send if set
if (fadeInTime != -1 && fadeOutTime != -1 && stayTime != -1) { if (this.fadeInTime != -1 && this.fadeOutTime != -1 && this.stayTime != -1) {
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
// Send title // Send title
Object serialized = getMethod(nmsChatSerializer, "a", String.class).invoke(null, Object serialized = getMethod(this.nmsChatSerializer, "a", String.class).invoke(null,
"{text:\"" + ChatColor.translateAlternateColorCodes('&', title) + "\",color:" + titleColor.name().toLowerCase() + "}"); "{text:\"" + ChatColor.translateAlternateColorCodes('&', this.title) + "\",color:" + this.titleColor.name().toLowerCase() + "}");
packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[0], serialized); packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[0], serialized);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
if (!subtitle.isEmpty()) { if (!this.subtitle.isEmpty()) {
// Send subtitle if present // Send subtitle if present
serialized = getMethod(nmsChatSerializer, "a", String.class).invoke(null, serialized = getMethod(this.nmsChatSerializer, "a", String.class).invoke(null,
"{text:\"" + ChatColor.translateAlternateColorCodes('&', subtitle) + "\",color:" + subtitleColor.name().toLowerCase() + "}"); "{text:\"" + ChatColor.translateAlternateColorCodes('&', this.subtitle) + "\",color:" + this.subtitleColor.name()
packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[1], serialized); .toLowerCase() + "}");
packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[1], serialized);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
} }
} }
/** /**
* Broadcast the title to all players * Broadcast the title to all players.
* @throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, *
SecurityException * @throws Exception
*/ */
public void broadcast() public void broadcast() throws Exception {
throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, for (Player p : Bukkit.getOnlinePlayers()) {
SecurityException {
for (final Player p : Bukkit.getOnlinePlayers()) {
send(p); send(p);
} }
} }
/** /**
* Clear the title * Clear the title.
* *
* @param player * @param player Player
* Player * @throws Exception
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/ */
public void clearTitle(final Player player) public void clearTitle(Player player) throws Exception {
throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException,
SecurityException {
// Send timings first // Send timings first
final Object handle = getHandle(player); Object handle = getHandle(player);
final Object connection = getField(handle.getClass(), "playerConnection").get(handle); Object connection = getField(handle.getClass(), "playerConnection").get(handle);
final Object[] actions = packetActions.getEnumConstants(); Object[] actions = this.packetActions.getEnumConstants();
final Method sendPacket = getMethod(connection.getClass(), "sendPacket"); Method sendPacket = getMethod(connection.getClass(), "sendPacket");
final Object packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[3], null); Object packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[3], null);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
/** /**
* Reset the title settings * Reset the title settings.
* *
* @param player * @param player Player
* Player * @throws Exception
*/ */
public void resetTitle(final Player player) public void resetTitle(Player player) throws Exception {
throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException,
SecurityException {
// Send timings first // Send timings first
final Object handle = getHandle(player); Object handle = getHandle(player);
final Object connection = getField(handle.getClass(), "playerConnection").get(handle); Object connection = getField(handle.getClass(), "playerConnection").get(handle);
final Object[] actions = packetActions.getEnumConstants(); Object[] actions = this.packetActions.getEnumConstants();
final Method sendPacket = getMethod(connection.getClass(), "sendPacket"); Method sendPacket = getMethod(connection.getClass(), "sendPacket");
final Object packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[4], null); Object packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[4], null);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
private Class<?> getPrimitiveType(final Class<?> clazz) { private Class<?> getPrimitiveType(Class<?> clazz) {
return CORRESPONDING_TYPES.containsKey(clazz) ? CORRESPONDING_TYPES.get(clazz) : clazz; return CORRESPONDING_TYPES.containsKey(clazz) ? CORRESPONDING_TYPES.get(clazz) : clazz;
} }
private Class<?>[] toPrimitiveTypeArray(final Class<?>[] classes) { private Class<?>[] toPrimitiveTypeArray(Class<?>[] classes) {
final int a = classes != null ? classes.length : 0; int a = classes != null ? classes.length : 0;
final Class<?>[] types = new Class<?>[a]; Class<?>[] types = new Class<?>[a];
for (int i = 0; i < a; i++) { for (int i = 0; i < a; i++) {
types[i] = getPrimitiveType(classes[i]); types[i] = getPrimitiveType(classes[i]);
} }
return types; return types;
} }
private Object getHandle(final Object obj) { private Object getHandle(Object obj) {
try { try {
return getMethod("getHandle", obj.getClass()).invoke(obj); return getMethod("getHandle", obj.getClass()).invoke(obj);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
@ -357,10 +332,10 @@ public class DefaultTitleManager {
} }
} }
private Method getMethod(final String name, final Class<?> clazz, final Class<?>... paramTypes) { private Method getMethod(String name, Class<?> clazz, Class<?>... paramTypes) {
final Class<?>[] t = toPrimitiveTypeArray(paramTypes); Class<?>[] t = toPrimitiveTypeArray(paramTypes);
for (final Method m : clazz.getMethods()) { for (Method m : clazz.getMethods()) {
final Class<?>[] types = toPrimitiveTypeArray(m.getParameterTypes()); Class<?>[] types = toPrimitiveTypeArray(m.getParameterTypes());
if (m.getName().equals(name) && equalsTypeArray(types, t)) { if (m.getName().equals(name) && equalsTypeArray(types, t)) {
return m; return m;
} }
@ -369,18 +344,18 @@ public class DefaultTitleManager {
} }
private String getVersion() { private String getVersion() {
final String name = Bukkit.getServer().getClass().getPackage().getName(); String name = Bukkit.getServer().getClass().getPackage().getName();
return name.substring(name.lastIndexOf('.') + 1) + "."; return name.substring(name.lastIndexOf('.') + 1) + ".";
} }
private Class<?> getNMSClass(final String className) throws ClassNotFoundException { private Class<?> getNMSClass(String className) throws ClassNotFoundException {
final String fullName = "net.minecraft.server." + getVersion() + className; String fullName = "net.minecraft.server." + getVersion() + className;
return Class.forName(fullName); return Class.forName(fullName);
} }
private Field getField(final Class<?> clazz, final String name) { private Field getField(Class<?> clazz, String name) {
try { try {
final Field field = clazz.getDeclaredField(name); Field field = clazz.getDeclaredField(name);
field.setAccessible(true); field.setAccessible(true);
return field; return field;
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
@ -392,8 +367,8 @@ public class DefaultTitleManager {
} }
} }
private Method getMethod(final Class<?> clazz, final String name, final Class<?>... args) { private Method getMethod(Class<?> clazz, String name, Class<?>... args) {
for (final Method m : clazz.getMethods()) { for (Method m : clazz.getMethods()) {
if (m.getName().equals(name) && (args.length == 0 || ClassListEqual(args, m.getParameterTypes()))) { if (m.getName().equals(name) && (args.length == 0 || ClassListEqual(args, m.getParameterTypes()))) {
m.setAccessible(true); m.setAccessible(true);
return m; return m;
@ -402,7 +377,7 @@ public class DefaultTitleManager {
return null; return null;
} }
private boolean ClassListEqual(final Class<?>[] l1, final Class<?>[] l2) { private boolean ClassListEqual(Class<?>[] l1, Class<?>[] l2) {
if (l1.length != l2.length) { if (l1.length != l2.length) {
return false; return false;
} }

View File

@ -18,6 +18,8 @@ import java.util.Map;
* *
*/ */
public class DefaultTitleManager_183 { public class DefaultTitleManager_183 {
private static final Map<Class<?>, Class<?>> CORRESPONDING_TYPES = new HashMap<>();
/* Title packet */ /* Title packet */
private Class<?> packetTitle; private Class<?> packetTitle;
/* Title packet actions ENUM */ /* Title packet actions ENUM */
@ -36,8 +38,7 @@ public class DefaultTitleManager_183 {
private int stayTime = -1; private int stayTime = -1;
private int fadeOutTime = -1; private int fadeOutTime = -1;
private boolean ticks = false; private boolean ticks = false;
private static final Map<Class<?>, Class<?>> CORRESPONDING_TYPES = new HashMap<>();
/** /**
* Create a new 1.8 title * Create a new 1.8 title
* *
@ -45,11 +46,11 @@ public class DefaultTitleManager_183 {
* Title * Title
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager_183(final String title) throws ClassNotFoundException { public DefaultTitleManager_183(String title) throws ClassNotFoundException {
this.title = title; this.title = title;
loadClasses(); loadClasses();
} }
/** /**
* Create a new 1.8 title * Create a new 1.8 title
* *
@ -59,12 +60,12 @@ public class DefaultTitleManager_183 {
* Subtitle text * Subtitle text
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager_183(final String title, final String subtitle) throws ClassNotFoundException { public DefaultTitleManager_183(String title, String subtitle) throws ClassNotFoundException {
this.title = title; this.title = title;
this.subtitle = subtitle; this.subtitle = subtitle;
loadClasses(); loadClasses();
} }
/** /**
* Copy 1.8 title * Copy 1.8 title
* *
@ -72,19 +73,19 @@ public class DefaultTitleManager_183 {
* Title * Title
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager_183(final DefaultTitleManager_183 title) throws ClassNotFoundException { public DefaultTitleManager_183(DefaultTitleManager_183 title) throws ClassNotFoundException {
// Copy title // Copy title
this.title = title.title; this.title = title.title;
subtitle = title.subtitle; this.subtitle = title.subtitle;
titleColor = title.titleColor; this.titleColor = title.titleColor;
subtitleColor = title.subtitleColor; this.subtitleColor = title.subtitleColor;
fadeInTime = title.fadeInTime; this.fadeInTime = title.fadeInTime;
fadeOutTime = title.fadeOutTime; this.fadeOutTime = title.fadeOutTime;
stayTime = title.stayTime; this.stayTime = title.stayTime;
ticks = title.ticks; this.ticks = title.ticks;
loadClasses(); loadClasses();
} }
/** /**
* Create a new 1.8 title * Create a new 1.8 title
* *
@ -100,7 +101,7 @@ public class DefaultTitleManager_183 {
* Fade out time * Fade out time
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
public DefaultTitleManager_183(final String title, final String subtitle, final int fadeInTime, final int stayTime, final int fadeOutTime) throws ClassNotFoundException { public DefaultTitleManager_183(String title, String subtitle, int fadeInTime, int stayTime, int fadeOutTime) throws ClassNotFoundException {
this.title = title; this.title = title;
this.subtitle = subtitle; this.subtitle = subtitle;
this.fadeInTime = fadeInTime; this.fadeInTime = fadeInTime;
@ -108,121 +109,133 @@ public class DefaultTitleManager_183 {
this.fadeOutTime = fadeOutTime; this.fadeOutTime = fadeOutTime;
loadClasses(); loadClasses();
} }
private static boolean equalsTypeArray(Class<?>[] a, Class<?>[] o) {
if (a.length != o.length) {
return false;
}
for (int i = 0; i < a.length; i++) {
if (!a[i].equals(o[i]) && !a[i].isAssignableFrom(o[i])) {
return false;
}
}
return true;
}
/** /**
* Load spigot and NMS classes * Load spigot and NMS classes
* @throws ClassNotFoundException * @throws ClassNotFoundException
*/ */
private void loadClasses() throws ClassNotFoundException { private void loadClasses() throws ClassNotFoundException {
packetTitle = getNMSClass("PacketPlayOutTitle"); this.packetTitle = getNMSClass("PacketPlayOutTitle");
chatBaseComponent = getNMSClass("IChatBaseComponent"); this.chatBaseComponent = getNMSClass("IChatBaseComponent");
packetActions = getNMSClass("PacketPlayOutTitle$EnumTitleAction"); this.packetActions = getNMSClass("PacketPlayOutTitle$EnumTitleAction");
nmsChatSerializer = getNMSClass("IChatBaseComponent$ChatSerializer"); this.nmsChatSerializer = getNMSClass("IChatBaseComponent$ChatSerializer");
} }
/**
* Set title text
*
* @param title
* Title
*/
public void setTitle(final String title) {
this.title = title;
}
/** /**
* Get title text * Get title text
* *
* @return Title text * @return Title text
*/ */
public String getTitle() { public String getTitle() {
return title; return this.title;
} }
/** /**
* Set subtitle text * Set title text
* *
* @param subtitle * @param title
* Subtitle text * Title
*/ */
public void setSubtitle(final String subtitle) { public void setTitle(String title) {
this.subtitle = subtitle; this.title = title;
} }
/** /**
* Get subtitle text * Get subtitle text
* *
* @return Subtitle text * @return Subtitle text
*/ */
public String getSubtitle() { public String getSubtitle() {
return subtitle; return this.subtitle;
} }
/**
* Set subtitle text
*
* @param subtitle
* Subtitle text
*/
public void setSubtitle(String subtitle) {
this.subtitle = subtitle;
}
/** /**
* Set the title color * Set the title color
* *
* @param color * @param color
* Chat color * Chat color
*/ */
public void setTitleColor(final ChatColor color) { public void setTitleColor(ChatColor color) {
titleColor = color; this.titleColor = color;
} }
/** /**
* Set the subtitle color * Set the subtitle color
* *
* @param color * @param color
* Chat color * Chat color
*/ */
public void setSubtitleColor(final ChatColor color) { public void setSubtitleColor(ChatColor color) {
subtitleColor = color; this.subtitleColor = color;
} }
/** /**
* Set title fade in time * Set title fade in time
* *
* @param time * @param time
* Time * Time
*/ */
public void setFadeInTime(final int time) { public void setFadeInTime(int time) {
fadeInTime = time; this.fadeInTime = time;
} }
/** /**
* Set title fade out time * Set title fade out time
* *
* @param time * @param time
* Time * Time
*/ */
public void setFadeOutTime(final int time) { public void setFadeOutTime(int time) {
fadeOutTime = time; this.fadeOutTime = time;
} }
/** /**
* Set title stay time * Set title stay time
* *
* @param time * @param time
* Time * Time
*/ */
public void setStayTime(final int time) { public void setStayTime(int time) {
stayTime = time; this.stayTime = time;
} }
/** /**
* Set timings to ticks * Set timings to ticks
*/ */
public void setTimingsToTicks() { public void setTimingsToTicks() {
ticks = true; this.ticks = true;
} }
/** /**
* Set timings to seconds * Set timings to seconds
*/ */
public void setTimingsToSeconds() { public void setTimingsToSeconds() {
ticks = false; this.ticks = false;
} }
/** /**
* Send the title to a player * Send the title to a player
* *
@ -232,46 +245,54 @@ public class DefaultTitleManager_183 {
* @throws IllegalArgumentException * @throws IllegalArgumentException
* @throws IllegalAccessException * @throws IllegalAccessException
*/ */
public void send(final Player player) throws Exception { public void send(Player player) throws Exception {
if (packetTitle != null) { if (this.packetTitle != null) {
// First reset previous settings // First reset previous settings
resetTitle(player); resetTitle(player);
// Send timings first // Send timings first
final Object handle = getHandle(player); Object handle = getHandle(player);
final Object connection = getField(handle.getClass(), "playerConnection").get(handle); Object connection = getField(handle.getClass(), "playerConnection").get(handle);
final Object[] actions = packetActions.getEnumConstants(); Object[] actions = this.packetActions.getEnumConstants();
final Method sendPacket = getMethod(connection.getClass(), "sendPacket"); Method sendPacket = getMethod(connection.getClass(), "sendPacket");
Object packet = packetTitle.getConstructor(packetActions, chatBaseComponent, Integer.TYPE, Integer.TYPE, Integer.TYPE).newInstance(actions[2], null, fadeInTime * (ticks ? 1 : 20), Object packet = this.packetTitle
stayTime * (ticks ? 1 : 20), fadeOutTime * (ticks ? 1 : 20)); .getConstructor(this.packetActions, this.chatBaseComponent, Integer.TYPE, Integer.TYPE, Integer.TYPE)
.newInstance(actions[2], null,
this.fadeInTime * (
this.ticks ? 1 : 20),
this.stayTime * (this.ticks ? 1 : 20), this.fadeOutTime * (this.ticks ? 1 : 20));
// Send if set // Send if set
if ((fadeInTime != -1) && (fadeOutTime != -1) && (stayTime != -1)) { if ((this.fadeInTime != -1) && (this.fadeOutTime != -1) && (this.stayTime != -1)) {
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
// Send title // Send title
Object serialized = getMethod(nmsChatSerializer, "a", String.class).invoke(null, Object serialized = getMethod(this.nmsChatSerializer, "a", String.class).invoke(null,
"{text:\"" + ChatColor.translateAlternateColorCodes('&', title) + "\",color:" + titleColor.name().toLowerCase() + "}"); "{text:\"" + ChatColor.translateAlternateColorCodes('&', this.title) + "\",color:" + this.titleColor.name().toLowerCase() + "}");
packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[0], serialized); packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[0], serialized);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
if (!subtitle.isEmpty()) { if (!this.subtitle.isEmpty()) {
// Send subtitle if present // Send subtitle if present
serialized = getMethod(nmsChatSerializer, "a", String.class).invoke(null, serialized = getMethod(this.nmsChatSerializer, "a", String.class).invoke(null,
"{text:\"" + ChatColor.translateAlternateColorCodes('&', subtitle) + "\",color:" + subtitleColor.name().toLowerCase() + "}"); "{text:\"" + ChatColor.translateAlternateColorCodes('&', this.subtitle) + "\",color:" + this.subtitleColor.name()
packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[1], serialized); .toLowerCase() + "}");
packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[1], serialized);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
} }
} }
/** /**
* Broadcast the title to all players * Broadcast the title to all players
* @throws Exception * @throws Exception
*/ */
public void broadcast() throws Exception { public void broadcast() throws Exception {
for (final Player p : Bukkit.getOnlinePlayers()) { for (Player p : Bukkit.getOnlinePlayers()) {
send(p); send(p);
} }
} }
/** /**
* Clear the title * Clear the title
* *
@ -280,16 +301,16 @@ public class DefaultTitleManager_183 {
* @throws IllegalAccessException * @throws IllegalAccessException
* @throws IllegalArgumentException * @throws IllegalArgumentException
*/ */
public void clearTitle(final Player player) throws Exception { public void clearTitle(Player player) throws Exception {
// Send timings first // Send timings first
final Object handle = getHandle(player); Object handle = getHandle(player);
final Object connection = getField(handle.getClass(), "playerConnection").get(handle); Object connection = getField(handle.getClass(), "playerConnection").get(handle);
final Object[] actions = packetActions.getEnumConstants(); Object[] actions = this.packetActions.getEnumConstants();
final Method sendPacket = getMethod(connection.getClass(), "sendPacket"); Method sendPacket = getMethod(connection.getClass(), "sendPacket");
final Object packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[3], null); Object packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[3], null);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
/** /**
* Reset the title settings * Reset the title settings
* *
@ -302,85 +323,73 @@ public class DefaultTitleManager_183 {
* @throws IllegalAccessException * @throws IllegalAccessException
* @throws InstantiationException * @throws InstantiationException
*/ */
public void resetTitle(final Player player) throws Exception { public void resetTitle(Player player) throws Exception {
// Send timings first // Send timings first
final Object handle = getHandle(player); Object handle = getHandle(player);
final Object connection = getField(handle.getClass(), "playerConnection").get(handle); Object connection = getField(handle.getClass(), "playerConnection").get(handle);
final Object[] actions = packetActions.getEnumConstants(); Object[] actions = this.packetActions.getEnumConstants();
final Method sendPacket = getMethod(connection.getClass(), "sendPacket"); Method sendPacket = getMethod(connection.getClass(), "sendPacket");
final Object packet = packetTitle.getConstructor(packetActions, chatBaseComponent).newInstance(actions[4], null); Object packet = this.packetTitle.getConstructor(this.packetActions, this.chatBaseComponent).newInstance(actions[4], null);
sendPacket.invoke(connection, packet); sendPacket.invoke(connection, packet);
} }
private Class<?> getPrimitiveType(final Class<?> clazz) { private Class<?> getPrimitiveType(Class<?> clazz) {
return CORRESPONDING_TYPES.containsKey(clazz) ? CORRESPONDING_TYPES.get(clazz) : clazz; return CORRESPONDING_TYPES.containsKey(clazz) ? CORRESPONDING_TYPES.get(clazz) : clazz;
} }
private Class<?>[] toPrimitiveTypeArray(final Class<?>[] classes) { private Class<?>[] toPrimitiveTypeArray(Class<?>[] classes) {
final int a = classes != null ? classes.length : 0; int a = classes != null ? classes.length : 0;
final Class<?>[] types = new Class<?>[a]; Class<?>[] types = new Class<?>[a];
for (int i = 0; i < a; i++) { for (int i = 0; i < a; i++) {
types[i] = getPrimitiveType(classes[i]); types[i] = getPrimitiveType(classes[i]);
} }
return types; return types;
} }
private static boolean equalsTypeArray(final Class<?>[] a, final Class<?>[] o) { private Object getHandle(Object obj) {
if (a.length != o.length) {
return false;
}
for (int i = 0; i < a.length; i++) {
if (!a[i].equals(o[i]) && !a[i].isAssignableFrom(o[i])) {
return false;
}
}
return true;
}
private Object getHandle(final Object obj) {
try { try {
return getMethod("getHandle", obj.getClass()).invoke(obj); return getMethod("getHandle", obj.getClass()).invoke(obj);
} catch (final Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
} }
private Method getMethod(final String name, final Class<?> clazz, final Class<?>... paramTypes) { private Method getMethod(String name, Class<?> clazz, Class<?>... paramTypes) {
final Class<?>[] t = toPrimitiveTypeArray(paramTypes); Class<?>[] t = toPrimitiveTypeArray(paramTypes);
for (final Method m : clazz.getMethods()) { for (Method m : clazz.getMethods()) {
final Class<?>[] types = toPrimitiveTypeArray(m.getParameterTypes()); Class<?>[] types = toPrimitiveTypeArray(m.getParameterTypes());
if (m.getName().equals(name) && equalsTypeArray(types, t)) { if (m.getName().equals(name) && equalsTypeArray(types, t)) {
return m; return m;
} }
} }
return null; return null;
} }
private String getVersion() { private String getVersion() {
final String name = Bukkit.getServer().getClass().getPackage().getName(); String name = Bukkit.getServer().getClass().getPackage().getName();
final String version = name.substring(name.lastIndexOf('.') + 1) + "."; String version = name.substring(name.lastIndexOf('.') + 1) + ".";
return version; return version;
} }
private Class<?> getNMSClass(final String className) throws ClassNotFoundException { private Class<?> getNMSClass(String className) throws ClassNotFoundException {
final String fullName = "net.minecraft.server." + getVersion() + className; String fullName = "net.minecraft.server." + getVersion() + className;
return Class.forName(fullName); return Class.forName(fullName);
} }
private Field getField(final Class<?> clazz, final String name) { private Field getField(Class<?> clazz, String name) {
try { try {
final Field field = clazz.getDeclaredField(name); Field field = clazz.getDeclaredField(name);
field.setAccessible(true); field.setAccessible(true);
return field; return field;
} catch (final Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
} }
private Method getMethod(final Class<?> clazz, final String name, final Class<?>... args) { private Method getMethod(Class<?> clazz, String name, Class<?>... args) {
for (final Method m : clazz.getMethods()) { for (Method m : clazz.getMethods()) {
if (m.getName().equals(name) && ((args.length == 0) || ClassListEqual(args, m.getParameterTypes()))) { if (m.getName().equals(name) && ((args.length == 0) || ClassListEqual(args, m.getParameterTypes()))) {
m.setAccessible(true); m.setAccessible(true);
return m; return m;
@ -388,8 +397,8 @@ public class DefaultTitleManager_183 {
} }
return null; return null;
} }
private boolean ClassListEqual(final Class<?>[] l1, final Class<?>[] l2) { private boolean ClassListEqual(Class<?>[] l1, Class<?>[] l2) {
if (l1.length != l2.length) { if (l1.length != l2.length) {
return false; return false;
} }

View File

@ -360,10 +360,8 @@ public class BukkitChunkManager extends ChunkManager {
blockLocShortEntry.getKey().z + zOffset)); blockLocShortEntry.getKey().z + zOffset));
} }
} catch (Exception e) { } catch (Exception e) {
PS.debug("&c[WARN] Plot clear failed to restore brewing stand cooking (e): " + (blockLocShortEntry.getKey().x + xOffset) + "," + PS.debug("&c[WARN] Plot clear failed to restore brewing stand cooking (e): " + (blockLocShortEntry.getKey().x + xOffset) + ","
blockLocShortEntry + blockLocShortEntry.getKey().y + "," + (blockLocShortEntry.getKey().z + zOffset));
.getKey().y + "," + (
blockLocShortEntry.getKey().z + zOffset));
} }
} }
for (Entry<BlockLoc, EntityType> blockLocEntityTypeEntry : spawnerData.entrySet()) { for (Entry<BlockLoc, EntityType> blockLocEntityTypeEntry : spawnerData.entrySet()) {
@ -382,8 +380,8 @@ public class BukkitChunkManager extends ChunkManager {
blockLocEntityTypeEntry.getKey().z + zOffset)); blockLocEntityTypeEntry.getKey().z + zOffset));
} }
} catch (Exception e) { } catch (Exception e) {
PS.debug("&c[WARN] Plot clear failed to restore spawner type (e): " + (blockLocEntityTypeEntry.getKey().x + xOffset) + "," + PS.debug("&c[WARN] Plot clear failed to restore spawner type (e): " + (blockLocEntityTypeEntry.getKey().x + xOffset) + ","
blockLocEntityTypeEntry.getKey().y + "," + (blockLocEntityTypeEntry.getKey().z + zOffset)); + blockLocEntityTypeEntry.getKey().y + "," + (blockLocEntityTypeEntry.getKey().z + zOffset));
} }
} }
for (Entry<BlockLoc, String> blockLocStringEntry : cmdData.entrySet()) { for (Entry<BlockLoc, String> blockLocStringEntry : cmdData.entrySet()) {
@ -490,8 +488,7 @@ public class BukkitChunkManager extends ChunkManager {
} }
} }
public static void saveBlocks(World world, int maxY, int x, int z, int offsetX, int offsetZ, public static void saveBlocks(World world, int maxY, int x, int z, int offsetX, int offsetZ, boolean storeNormal) {
boolean storeNormal) {
maxY = Math.min(255, maxY); maxY = Math.min(255, maxY);
PlotBlock[] ids; PlotBlock[] ids;
if (storeNormal) { if (storeNormal) {

View File

@ -19,11 +19,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
/**
* Created 2015-02-20 for PlotSquared
*
*/
public class BukkitCommand implements CommandExecutor, TabCompleter { public class BukkitCommand implements CommandExecutor, TabCompleter {
public BukkitCommand() { public BukkitCommand() {

View File

@ -75,15 +75,6 @@ public class BukkitEconHandler extends EconHandler {
this.econ.depositPlayer(((BukkitOfflinePlayer) player).player, amount); this.econ.depositPlayer(((BukkitOfflinePlayer) player).player, amount);
} }
@Override
public void setPermission(String world, String player, String perm, boolean value) {
if (value) {
this.perms.playerAdd(world, player, perm);
} else {
this.perms.playerRemove(world, player, perm);
}
}
@Override @Override
public boolean hasPermission(String world, String player, String perm) { public boolean hasPermission(String world, String player, String perm) {
return this.perms.playerHas(world, Bukkit.getOfflinePlayer(player), perm); return this.perms.playerHas(world, Bukkit.getOfflinePlayer(player), perm);

View File

@ -87,7 +87,7 @@ public class Metrics {
*/ */
private volatile BukkitTask task = null; private volatile BukkitTask task = null;
public Metrics(Plugin plugin) throws IOException { public Metrics(Plugin plugin) {
if (plugin == null) { if (plugin == null) {
throw new IllegalArgumentException("Plugin cannot be null"); throw new IllegalArgumentException("Plugin cannot be null");
} }
@ -280,7 +280,7 @@ public class Metrics {
* *
* @throws java.io.IOException * @throws java.io.IOException
*/ */
public void enable() throws IOException { public void enable() {
// Enable Task, if it is not running // Enable Task, if it is not running
if (this.task == null) { if (this.task == null) {
start(); start();
@ -290,9 +290,8 @@ public class Metrics {
/** /**
* Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task. * Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task.
* *
* @throws java.io.IOException
*/ */
public void disable() throws IOException { public void disable() {
// Disable Task, if it is running // Disable Task, if it is running
if (this.task != null) { if (this.task != null) {
this.task.cancel(); this.task.cancel();
@ -301,7 +300,8 @@ public class Metrics {
} }
/** /**
* Gets the File object of the config file that should be used to store data such as the GUID and opt-out status * Gets the File object of the config file that should be used to store
* data such as the GUID and opt-out status.
* *
* @return the File object for the config file * @return the File object for the config file
*/ */
@ -318,7 +318,7 @@ public class Metrics {
} }
/** /**
* Generic method that posts a plugin to the metrics website * Generic method that posts a plugin to the metrics website.
*/ */
private void postPlugin(boolean isPing) throws IOException { private void postPlugin(boolean isPing) throws IOException {
// Server software specific section // Server software specific section

View File

@ -48,7 +48,7 @@ public class FastChunk_1_8_3 extends PlotChunk<Chunk> {
} }
/** /**
* Get the number of block changes in a specified section * Get the number of block changes in a specified section.
* @param i * @param i
* @return * @return
*/ */
@ -95,7 +95,7 @@ public class FastChunk_1_8_3 extends PlotChunk<Chunk> {
} }
/** /**
* Get the raw data for a section * Get the raw data for a section.
* @param i * @param i
* @return * @return
*/ */

View File

@ -48,7 +48,7 @@ public class FastChunk_1_9 extends PlotChunk<Chunk> {
} }
/** /**
* Get the number of block changes in a specified section * Get the number of block changes in a specified section.
* @param i * @param i
* @return * @return
*/ */
@ -65,7 +65,7 @@ public class FastChunk_1_9 extends PlotChunk<Chunk> {
} }
/** /**
* Get the number of block changes in a specified section * Get the number of block changes in a specified section.
* @param i * @param i
* @return * @return
*/ */
@ -95,7 +95,7 @@ public class FastChunk_1_9 extends PlotChunk<Chunk> {
} }
/** /**
* Get the raw data for a section * Get the raw data for a section.
* @param i * @param i
* @return * @return
*/ */

View File

@ -39,7 +39,7 @@ public class FastQueue_1_7 extends SlowQueue {
private final HashMap<ChunkWrapper, Chunk> toUpdate = new HashMap<>(); private final HashMap<ChunkWrapper, Chunk> toUpdate = new HashMap<>();
public FastQueue_1_7() throws NoSuchMethodException, RuntimeException { public FastQueue_1_7() throws RuntimeException {
this.methodGetHandle = this.classCraftWorld.getMethod("getHandle"); this.methodGetHandle = this.classCraftWorld.getMethod("getHandle");
this.methodGetChunkAt = this.classWorld.getMethod("getChunkAt", int.class, int.class); this.methodGetChunkAt = this.classWorld.getMethod("getChunkAt", int.class, int.class);
this.methodA = this.classChunk.getMethod("a", int.class, int.class, int.class, this.classBlock, int.class); this.methodA = this.classChunk.getMethod("a", int.class, int.class, int.class, this.classBlock, int.class);

View File

@ -42,7 +42,7 @@ public class FastQueue_1_8 extends SlowQueue {
private final RefConstructor constructorBlockPosition; private final RefConstructor constructorBlockPosition;
private final SendChunk chunksender; private final SendChunk chunksender;
public FastQueue_1_8() throws NoSuchMethodException, RuntimeException { public FastQueue_1_8() throws RuntimeException {
this.methodInitLighting = this.classChunk.getMethod("initLighting"); this.methodInitLighting = this.classChunk.getMethod("initLighting");
this.constructorBlockPosition = this.classBlockPosition.getConstructor(int.class, int.class, int.class); this.constructorBlockPosition = this.classBlockPosition.getConstructor(int.class, int.class, int.class);
this.methodGetByCombinedId = this.classBlock.getMethod("getByCombinedId", int.class); this.methodGetByCombinedId = this.classBlock.getMethod("getByCombinedId", int.class);

View File

@ -48,7 +48,7 @@ public class FastQueue_1_8_3 extends SlowQueue {
private final RefField fieldWorld; private final RefField fieldWorld;
private final RefMethod methodGetIdArray; private final RefMethod methodGetIdArray;
public FastQueue_1_8_3() throws NoSuchMethodException, RuntimeException { public FastQueue_1_8_3() throws RuntimeException {
RefClass classCraftChunk = getRefClass("{cb}.CraftChunk"); RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle"); this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
RefClass classChunk = getRefClass("{nms}.Chunk"); RefClass classChunk = getRefClass("{nms}.Chunk");

View File

@ -8,6 +8,7 @@ import java.util.Set;
* Represents a section of a {@link Configuration} * Represents a section of a {@link Configuration}
*/ */
public interface ConfigurationSection { public interface ConfigurationSection {
/** /**
* Gets a set containing all keys in this section. * Gets a set containing all keys in this section.
* <p> * <p>
@ -22,8 +23,8 @@ public interface ConfigurationSection {
* list. * list.
* @return Set of keys contained within this ConfigurationSection. * @return Set of keys contained within this ConfigurationSection.
*/ */
Set<String> getKeys(final boolean deep); Set<String> getKeys(boolean deep);
/** /**
* Gets a Map containing all keys and their values for this section. * Gets a Map containing all keys and their values for this section.
* <p> * <p>
@ -38,8 +39,8 @@ public interface ConfigurationSection {
* list. * list.
* @return Map of keys and values of this section. * @return Map of keys and values of this section.
*/ */
Map<String, Object> getValues(final boolean deep); Map<String, Object> getValues(boolean deep);
/** /**
* Checks if this {@link ConfigurationSection} contains the given path. * Checks if this {@link ConfigurationSection} contains the given path.
* <p> * <p>
@ -51,8 +52,8 @@ public interface ConfigurationSection {
* default or being set. * default or being set.
* @throws IllegalArgumentException Thrown when path is null. * @throws IllegalArgumentException Thrown when path is null.
*/ */
boolean contains(final String path); boolean contains(String path);
/** /**
* Checks if this {@link ConfigurationSection} has a value set for the * Checks if this {@link ConfigurationSection} has a value set for the
* given path. * given path.
@ -65,8 +66,8 @@ public interface ConfigurationSection {
* having a default. * having a default.
* @throws IllegalArgumentException Thrown when path is null. * @throws IllegalArgumentException Thrown when path is null.
*/ */
boolean isSet(final String path); boolean isSet(String path);
/** /**
* Gets the path of this {@link ConfigurationSection} from its root {@link * Gets the path of this {@link ConfigurationSection} from its root {@link
* Configuration} * Configuration}
@ -83,7 +84,7 @@ public interface ConfigurationSection {
* @return Path of this section relative to its root * @return Path of this section relative to its root
*/ */
String getCurrentPath(); String getCurrentPath();
/** /**
* Gets the name of this individual {@link ConfigurationSection}, in the * Gets the name of this individual {@link ConfigurationSection}, in the
* path. * path.
@ -94,7 +95,7 @@ public interface ConfigurationSection {
* @return Name of this section * @return Name of this section
*/ */
String getName(); String getName();
/** /**
* Gets the root {@link Configuration} that contains this {@link * Gets the root {@link Configuration} that contains this {@link
* ConfigurationSection} * ConfigurationSection}
@ -108,7 +109,7 @@ public interface ConfigurationSection {
* @return Root configuration containing this section. * @return Root configuration containing this section.
*/ */
Configuration getRoot(); Configuration getRoot();
/** /**
* Gets the parent {@link ConfigurationSection} that directly contains * Gets the parent {@link ConfigurationSection} that directly contains
* this {@link ConfigurationSection}. * this {@link ConfigurationSection}.
@ -121,7 +122,7 @@ public interface ConfigurationSection {
* @return Parent section containing this section. * @return Parent section containing this section.
*/ */
ConfigurationSection getParent(); ConfigurationSection getParent();
/** /**
* Gets the requested Object by path. * Gets the requested Object by path.
* <p> * <p>
@ -132,8 +133,8 @@ public interface ConfigurationSection {
* @param path Path of the Object to get. * @param path Path of the Object to get.
* @return Requested Object. * @return Requested Object.
*/ */
Object get(final String path); Object get(String path);
/** /**
* Gets the requested Object by path, returning a default value if not * Gets the requested Object by path, returning a default value if not
* found. * found.
@ -146,8 +147,8 @@ public interface ConfigurationSection {
* @param def The default value to return if the path is not found. * @param def The default value to return if the path is not found.
* @return Requested Object. * @return Requested Object.
*/ */
Object get(final String path, final Object def); Object get(String path, Object def);
/** /**
* Sets the specified path to the given value. * Sets the specified path to the given value.
* <p> * <p>
@ -162,8 +163,8 @@ public interface ConfigurationSection {
* @param path Path of the object to set. * @param path Path of the object to set.
* @param value New value to set the path to. * @param value New value to set the path to.
*/ */
void set(final String path, final Object value); void set(String path, Object value);
/** /**
* Creates an empty {@link ConfigurationSection} at the specified path. * Creates an empty {@link ConfigurationSection} at the specified path.
* <p> * <p>
@ -174,8 +175,8 @@ public interface ConfigurationSection {
* @param path Path to create the section at. * @param path Path to create the section at.
* @return Newly created section * @return Newly created section
*/ */
ConfigurationSection createSection(final String path); ConfigurationSection createSection(String path);
/** /**
* Creates a {@link ConfigurationSection} at the specified path, with * Creates a {@link ConfigurationSection} at the specified path, with
* specified values. * specified values.
@ -188,9 +189,10 @@ public interface ConfigurationSection {
* @param map The values to used. * @param map The values to used.
* @return Newly created section * @return Newly created section
*/ */
ConfigurationSection createSection(final String path, final Map<?, ?> map); ConfigurationSection createSection(String path, Map<?, ?> map);
// Primitives // Primitives
/** /**
* Gets the requested String by path. * Gets the requested String by path.
* <p> * <p>
@ -201,8 +203,8 @@ public interface ConfigurationSection {
* @param path Path of the String to get. * @param path Path of the String to get.
* @return Requested String. * @return Requested String.
*/ */
String getString(final String path); String getString(String path);
/** /**
* Gets the requested String by path, returning a default value if not * Gets the requested String by path, returning a default value if not
* found. * found.
@ -216,60 +218,60 @@ public interface ConfigurationSection {
* not a String. * not a String.
* @return Requested String. * @return Requested String.
*/ */
String getString(final String path, final String def); String getString(String path, String def);
/** /**
* Checks if the specified path is a String. * Checks if the specified path is a String.
* <p> *
* If the path exists but is not a String, this will return false. If the * <p> If the path exists but is not a String, this will return false. If the
* path does not exist, this will return false. If the path does not exist * path does not exist, this will return false. If the path does not exist
* but a default value has been specified, this will check if that default * but a default value has been specified, this will check if that default
* value is a String and return appropriately. * value is a String and return appropriately.</p>
* *
* @param path Path of the String to check. * @param path Path of the String to check.
* @return Whether or not the specified path is a String. * @return Whether or not the specified path is a String.
*/ */
boolean isString(final String path); boolean isString(String path);
/** /**
* Gets the requested int by path. * Gets the requested int by path.
* <p> *
* If the int does not exist but a default value has been specified, this * <p>If the int does not exist but a default value has been specified, this
* will return the default value. If the int does not exist and no default * will return the default value. If the int does not exist and no default
* value was specified, this will return 0. * value was specified, this will return 0.</p>
* *
* @param path Path of the int to get. * @param path Path of the int to get.
* @return Requested int. * @return Requested int.
*/ */
int getInt(final String path); int getInt(String path);
/** /**
* Gets the requested int by path, returning a default value if not found. * Gets the requested int by path, returning a default value if not found.
* <p> *
* If the int does not exist then the specified default value will * <p>If the int does not exist then the specified default value will
* returned regardless of if a default has been identified in the root * returned regardless of if a default has been identified in the root
* {@link Configuration}. * {@link Configuration}.</p>
* *
* @param path Path of the int to get. * @param path Path of the int to get.
* @param def The default value to return if the path is not found or is * @param def The default value to return if the path is not found or is
* not an int. * not an int.
* @return Requested int. * @return Requested int.
*/ */
int getInt(final String path, final int def); int getInt(String path, int def);
/** /**
* Checks if the specified path is an int. * Checks if the specified path is an int.
* <p> *
* If the path exists but is not a int, this will return false. If the * <p>If the path exists but is not a int, this will return false. If the
* path does not exist, this will return false. If the path does not exist * path does not exist, this will return false. If the path does not exist
* but a default value has been specified, this will check if that default * but a default value has been specified, this will check if that default
* value is a int and return appropriately. * value is a int and return appropriately.</p>
* *
* @param path Path of the int to check. * @param path Path of the int to check.
* @return Whether or not the specified path is an int. * @return Whether or not the specified path is an int.
*/ */
boolean isInt(final String path); boolean isInt(String path);
/** /**
* Gets the requested boolean by path. * Gets the requested boolean by path.
* <p> * <p>
@ -280,8 +282,8 @@ public interface ConfigurationSection {
* @param path Path of the boolean to get. * @param path Path of the boolean to get.
* @return Requested boolean. * @return Requested boolean.
*/ */
boolean getBoolean(final String path); boolean getBoolean(String path);
/** /**
* Gets the requested boolean by path, returning a default value if not * Gets the requested boolean by path, returning a default value if not
* found. * found.
@ -295,8 +297,8 @@ public interface ConfigurationSection {
* not a boolean. * not a boolean.
* @return Requested boolean. * @return Requested boolean.
*/ */
boolean getBoolean(final String path, final boolean def); boolean getBoolean(String path, boolean def);
/** /**
* Checks if the specified path is a boolean. * Checks if the specified path is a boolean.
* <p> * <p>
@ -308,8 +310,8 @@ public interface ConfigurationSection {
* @param path Path of the boolean to check. * @param path Path of the boolean to check.
* @return Whether or not the specified path is a boolean. * @return Whether or not the specified path is a boolean.
*/ */
boolean isBoolean(final String path); boolean isBoolean(String path);
/** /**
* Gets the requested double by path. * Gets the requested double by path.
* <p> * <p>
@ -320,8 +322,8 @@ public interface ConfigurationSection {
* @param path Path of the double to get. * @param path Path of the double to get.
* @return Requested double. * @return Requested double.
*/ */
double getDouble(final String path); double getDouble(String path);
/** /**
* Gets the requested double by path, returning a default value if not * Gets the requested double by path, returning a default value if not
* found. * found.
@ -335,8 +337,8 @@ public interface ConfigurationSection {
* not a double. * not a double.
* @return Requested double. * @return Requested double.
*/ */
double getDouble(final String path, final double def); double getDouble(String path, double def);
/** /**
* Checks if the specified path is a double. * Checks if the specified path is a double.
* <p> * <p>
@ -348,8 +350,8 @@ public interface ConfigurationSection {
* @param path Path of the double to check. * @param path Path of the double to check.
* @return Whether or not the specified path is a double. * @return Whether or not the specified path is a double.
*/ */
boolean isDouble(final String path); boolean isDouble(String path);
/** /**
* Gets the requested long by path. * Gets the requested long by path.
* <p> * <p>
@ -360,8 +362,8 @@ public interface ConfigurationSection {
* @param path Path of the long to get. * @param path Path of the long to get.
* @return Requested long. * @return Requested long.
*/ */
long getLong(final String path); long getLong(String path);
/** /**
* Gets the requested long by path, returning a default value if not * Gets the requested long by path, returning a default value if not
* found. * found.
@ -375,8 +377,8 @@ public interface ConfigurationSection {
* not a long. * not a long.
* @return Requested long. * @return Requested long.
*/ */
long getLong(final String path, final long def); long getLong(String path, long def);
/** /**
* Checks if the specified path is a long. * Checks if the specified path is a long.
* <p> * <p>
@ -388,9 +390,10 @@ public interface ConfigurationSection {
* @param path Path of the long to check. * @param path Path of the long to check.
* @return Whether or not the specified path is a long. * @return Whether or not the specified path is a long.
*/ */
boolean isLong(final String path); boolean isLong(String path);
// Java // Java
/** /**
* Gets the requested List by path. * Gets the requested List by path.
* <p> * <p>
@ -401,8 +404,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List. * @return Requested List.
*/ */
List<?> getList(final String path); List<?> getList(String path);
/** /**
* Gets the requested List by path, returning a default value if not * Gets the requested List by path, returning a default value if not
* found. * found.
@ -416,8 +419,8 @@ public interface ConfigurationSection {
* not a List. * not a List.
* @return Requested List. * @return Requested List.
*/ */
List<?> getList(final String path, final List<?> def); List<?> getList(String path, List<?> def);
/** /**
* Checks if the specified path is a List. * Checks if the specified path is a List.
* <p> * <p>
@ -429,8 +432,8 @@ public interface ConfigurationSection {
* @param path Path of the List to check. * @param path Path of the List to check.
* @return Whether or not the specified path is a List. * @return Whether or not the specified path is a List.
*/ */
boolean isList(final String path); boolean isList(String path);
/** /**
* Gets the requested List of String by path. * Gets the requested List of String by path.
* <p> * <p>
@ -444,8 +447,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of String. * @return Requested List of String.
*/ */
List<String> getStringList(final String path); List<String> getStringList(String path);
/** /**
* Gets the requested List of Integer by path. * Gets the requested List of Integer by path.
* <p> * <p>
@ -459,8 +462,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Integer. * @return Requested List of Integer.
*/ */
List<Integer> getIntegerList(final String path); List<Integer> getIntegerList(String path);
/** /**
* Gets the requested List of Boolean by path. * Gets the requested List of Boolean by path.
* <p> * <p>
@ -474,8 +477,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Boolean. * @return Requested List of Boolean.
*/ */
List<Boolean> getBooleanList(final String path); List<Boolean> getBooleanList(String path);
/** /**
* Gets the requested List of Double by path. * Gets the requested List of Double by path.
* <p> * <p>
@ -489,8 +492,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Double. * @return Requested List of Double.
*/ */
List<Double> getDoubleList(final String path); List<Double> getDoubleList(String path);
/** /**
* Gets the requested List of Float by path. * Gets the requested List of Float by path.
* <p> * <p>
@ -504,8 +507,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Float. * @return Requested List of Float.
*/ */
List<Float> getFloatList(final String path); List<Float> getFloatList(String path);
/** /**
* Gets the requested List of Long by path. * Gets the requested List of Long by path.
* <p> * <p>
@ -519,8 +522,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Long. * @return Requested List of Long.
*/ */
List<Long> getLongList(final String path); List<Long> getLongList(String path);
/** /**
* Gets the requested List of Byte by path. * Gets the requested List of Byte by path.
* <p> * <p>
@ -534,8 +537,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Byte. * @return Requested List of Byte.
*/ */
List<Byte> getByteList(final String path); List<Byte> getByteList(String path);
/** /**
* Gets the requested List of Character by path. * Gets the requested List of Character by path.
* <p> * <p>
@ -549,8 +552,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Character. * @return Requested List of Character.
*/ */
List<Character> getCharacterList(final String path); List<Character> getCharacterList(String path);
/** /**
* Gets the requested List of Short by path. * Gets the requested List of Short by path.
* <p> * <p>
@ -564,8 +567,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Short. * @return Requested List of Short.
*/ */
List<Short> getShortList(final String path); List<Short> getShortList(String path);
/** /**
* Gets the requested List of Maps by path. * Gets the requested List of Maps by path.
* <p> * <p>
@ -579,8 +582,8 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Maps. * @return Requested List of Maps.
*/ */
List<Map<?, ?>> getMapList(final String path); List<Map<?, ?>> getMapList(String path);
/** /**
* Gets the requested ConfigurationSection by path. * Gets the requested ConfigurationSection by path.
* <p> * <p>
@ -592,8 +595,8 @@ public interface ConfigurationSection {
* @param path Path of the ConfigurationSection to get. * @param path Path of the ConfigurationSection to get.
* @return Requested ConfigurationSection. * @return Requested ConfigurationSection.
*/ */
ConfigurationSection getConfigurationSection(final String path); ConfigurationSection getConfigurationSection(String path);
/** /**
* Checks if the specified path is a ConfigurationSection. * Checks if the specified path is a ConfigurationSection.
* <p> * <p>
@ -606,8 +609,8 @@ public interface ConfigurationSection {
* @param path Path of the ConfigurationSection to check. * @param path Path of the ConfigurationSection to check.
* @return Whether or not the specified path is a ConfigurationSection. * @return Whether or not the specified path is a ConfigurationSection.
*/ */
boolean isConfigurationSection(final String path); boolean isConfigurationSection(String path);
/** /**
* Gets the equivalent {@link ConfigurationSection} from the default * Gets the equivalent {@link ConfigurationSection} from the default
* {@link Configuration} defined in {@link #getRoot()}. * {@link Configuration} defined in {@link #getRoot()}.
@ -619,7 +622,7 @@ public interface ConfigurationSection {
* @return Equivalent section in root configuration * @return Equivalent section in root configuration
*/ */
ConfigurationSection getDefaultSection(); ConfigurationSection getDefaultSection();
/** /**
* Sets the default value in the root at the given path as provided. * Sets the default value in the root at the given path as provided.
* <p> * <p>
@ -638,5 +641,5 @@ public interface ConfigurationSection {
* @param value Value to set the default to. * @param value Value to set the default to.
* @throws IllegalArgumentException Thrown if path is null. * @throws IllegalArgumentException Thrown if path is null.
*/ */
void addDefault(final String path, final Object value); void addDefault(String path, Object value);
} }

View File

@ -11,6 +11,7 @@ import java.util.Set;
* A type of {@link ConfigurationSection} that is stored in memory. * A type of {@link ConfigurationSection} that is stored in memory.
*/ */
public class MemorySection implements ConfigurationSection { public class MemorySection implements ConfigurationSection {
protected final Map<String, Object> map = new LinkedHashMap<>(); protected final Map<String, Object> map = new LinkedHashMap<>();
private final Configuration root; private final Configuration root;
private final ConfigurationSection parent; private final ConfigurationSection parent;
@ -32,10 +33,10 @@ public class MemorySection implements ConfigurationSection {
throw new IllegalStateException("Cannot construct a root MemorySection when not a Configuration"); throw new IllegalStateException("Cannot construct a root MemorySection when not a Configuration");
} }
path = ""; this.path = "";
fullPath = ""; this.fullPath = "";
parent = null; this.parent = null;
root = (Configuration) this; this.root = (Configuration) this;
} }
/** /**
@ -47,7 +48,7 @@ public class MemorySection implements ConfigurationSection {
* @throws IllegalArgumentException Thrown is parent or path is null, or * @throws IllegalArgumentException Thrown is parent or path is null, or
* if parent contains no root Configuration. * if parent contains no root Configuration.
*/ */
protected MemorySection(final ConfigurationSection parent, final String path) { protected MemorySection(ConfigurationSection parent, String path) {
if (parent == null) { if (parent == null) {
throw new NullPointerException("Parent may not be null"); throw new NullPointerException("Parent may not be null");
} }
@ -57,16 +58,16 @@ public class MemorySection implements ConfigurationSection {
this.path = path; this.path = path;
this.parent = parent; this.parent = parent;
root = parent.getRoot(); this.root = parent.getRoot();
if (root == null) { if (this.root == null) {
throw new NullPointerException("Path may not be orphaned"); throw new NullPointerException("Path may not be orphaned");
} }
fullPath = createPath(parent, path); this.fullPath = createPath(parent, path);
} }
public static double toDouble(final Object obj, final double def) { public static double toDouble(Object obj, double def) {
if (obj instanceof Number) { if (obj instanceof Number) {
return ((Number) obj).doubleValue(); return ((Number) obj).doubleValue();
} }
@ -76,15 +77,15 @@ public class MemorySection implements ConfigurationSection {
} catch (NumberFormatException ignored) { } catch (NumberFormatException ignored) {
} }
} else if (obj instanceof List) { } else if (obj instanceof List) {
final List<?> val = (List<?>) obj; List<?> val = (List<?>) obj;
if (!val.isEmpty()) { if (!val.isEmpty()) {
return toDouble(val.get(0), def); return toDouble(val.get(0), def);
} }
} }
return def; return def;
} }
public static int toInt(final Object obj, final int def) { public static int toInt(Object obj, int def) {
if (obj instanceof Number) { if (obj instanceof Number) {
return ((Number) obj).intValue(); return ((Number) obj).intValue();
} }
@ -94,15 +95,15 @@ public class MemorySection implements ConfigurationSection {
} catch (NumberFormatException ignored) { } catch (NumberFormatException ignored) {
} }
} else if (obj instanceof List) { } else if (obj instanceof List) {
final List<?> val = (List<?>) obj; List<?> val = (List<?>) obj;
if (!val.isEmpty()) { if (!val.isEmpty()) {
return toInt(val.get(0), def); return toInt(val.get(0), def);
} }
} }
return def; return def;
} }
public static long toLong(final Object obj, final long def) { public static long toLong(Object obj, long def) {
if (obj instanceof Number) { if (obj instanceof Number) {
return ((Number) obj).longValue(); return ((Number) obj).longValue();
} }
@ -112,14 +113,14 @@ public class MemorySection implements ConfigurationSection {
} catch (NumberFormatException ignored) { } catch (NumberFormatException ignored) {
} }
} else if (obj instanceof List) { } else if (obj instanceof List) {
final List<?> val = (List<?>) obj; List<?> val = (List<?>) obj;
if (!val.isEmpty()) { if (!val.isEmpty()) {
return toLong(val.get(0), def); return toLong(val.get(0), def);
} }
} }
return def; return def;
} }
/** /**
* Creates a full path to the given {@link ConfigurationSection} from its * Creates a full path to the given {@link ConfigurationSection} from its
* root {@link Configuration}. * root {@link Configuration}.
@ -131,10 +132,10 @@ public class MemorySection implements ConfigurationSection {
* @param key Name of the specified section. * @param key Name of the specified section.
* @return Full path of the section from its root. * @return Full path of the section from its root.
*/ */
public static String createPath(final ConfigurationSection section, final String key) { public static String createPath(ConfigurationSection section, String key) {
return createPath(section, key, (section == null) ? null : section.getRoot()); return createPath(section, key, (section == null) ? null : section.getRoot());
} }
/** /**
* Creates a relative path to the given {@link ConfigurationSection} from * Creates a relative path to the given {@link ConfigurationSection} from
* the given relative section. * the given relative section.
@ -147,17 +148,17 @@ public class MemorySection implements ConfigurationSection {
* @param relativeTo Section to create the path relative to. * @param relativeTo Section to create the path relative to.
* @return Full path of the section from its root. * @return Full path of the section from its root.
*/ */
public static String createPath(final ConfigurationSection section, final String key, final ConfigurationSection relativeTo) { public static String createPath(ConfigurationSection section, String key, ConfigurationSection relativeTo) {
if (section == null) { if (section == null) {
throw new NullPointerException("Cannot create path without a section"); throw new NullPointerException("Cannot create path without a section");
} }
final Configuration root = section.getRoot(); Configuration root = section.getRoot();
if (root == null) { if (root == null) {
throw new IllegalStateException("Cannot create path without a root"); throw new IllegalStateException("Cannot create path without a root");
} }
final char separator = root.options().pathSeparator(); char separator = root.options().pathSeparator();
final StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
for (ConfigurationSection parent = section; (parent != null) && (parent != relativeTo); parent = parent.getParent()) { for (ConfigurationSection parent = section; (parent != null) && (parent != relativeTo); parent = parent.getParent()) {
if (builder.length() > 0) { if (builder.length() > 0) {
builder.insert(0, separator); builder.insert(0, separator);
@ -176,14 +177,14 @@ public class MemorySection implements ConfigurationSection {
return builder.toString(); return builder.toString();
} }
@Override
public Set<String> getKeys(final boolean deep) {
final Set<String> result = new LinkedHashSet<>();
final Configuration root = getRoot(); @Override
public Set<String> getKeys(boolean deep) {
Set<String> result = new LinkedHashSet<>();
Configuration root = getRoot();
if ((root != null) && root.options().copyDefaults()) { if ((root != null) && root.options().copyDefaults()) {
final ConfigurationSection defaults = getDefaultSection(); ConfigurationSection defaults = getDefaultSection();
if (defaults != null) { if (defaults != null) {
result.addAll(defaults.getKeys(deep)); result.addAll(defaults.getKeys(deep));
@ -194,14 +195,14 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override
public Map<String, Object> getValues(final boolean deep) {
final Map<String, Object> result = new LinkedHashMap<>();
final Configuration root = getRoot(); @Override
public Map<String, Object> getValues(boolean deep) {
Map<String, Object> result = new LinkedHashMap<>();
Configuration root = getRoot();
if ((root != null) && root.options().copyDefaults()) { if ((root != null) && root.options().copyDefaults()) {
final ConfigurationSection defaults = getDefaultSection(); ConfigurationSection defaults = getDefaultSection();
if (defaults != null) { if (defaults != null) {
result.putAll(defaults.getValues(deep)); result.putAll(defaults.getValues(deep));
@ -212,15 +213,15 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public boolean contains(final String path) { public boolean contains(String path) {
return get(path) != null; return get(path) != null;
} }
@Override @Override
public boolean isSet(final String path) { public boolean isSet(String path) {
final Configuration root = getRoot(); Configuration root = getRoot();
if (root == null) { if (root == null) {
return false; return false;
} }
@ -229,34 +230,34 @@ public class MemorySection implements ConfigurationSection {
} }
return get(path, null) != null; return get(path, null) != null;
} }
@Override @Override
public String getCurrentPath() { public String getCurrentPath() {
return fullPath; return this.fullPath;
} }
@Override @Override
public String getName() { public String getName() {
return path; return this.path;
} }
@Override @Override
public Configuration getRoot() { public Configuration getRoot() {
return root; return this.root;
} }
@Override @Override
public ConfigurationSection getParent() { public ConfigurationSection getParent() {
return parent; return this.parent;
} }
@Override @Override
public void addDefault(final String path, final Object value) { public void addDefault(String path, Object value) {
if (path == null) { if (path == null) {
throw new NullPointerException("Path cannot be null"); throw new NullPointerException("Path cannot be null");
} }
final Configuration root = getRoot(); Configuration root = getRoot();
if (root == null) { if (root == null) {
throw new IllegalStateException("Cannot add default without root"); throw new IllegalStateException("Cannot add default without root");
} }
@ -265,11 +266,11 @@ public class MemorySection implements ConfigurationSection {
} }
root.addDefault(createPath(this, path), value); root.addDefault(createPath(this, path), value);
} }
@Override @Override
public ConfigurationSection getDefaultSection() { public ConfigurationSection getDefaultSection() {
final Configuration root = getRoot(); Configuration root = getRoot();
final Configuration defaults = root == null ? null : root.getDefaults(); Configuration defaults = root == null ? null : root.getDefaults();
if (defaults != null) { if (defaults != null) {
if (defaults.isConfigurationSection(getCurrentPath())) { if (defaults.isConfigurationSection(getCurrentPath())) {
@ -279,26 +280,26 @@ public class MemorySection implements ConfigurationSection {
return null; return null;
} }
@Override @Override
public void set(final String path, final Object value) { public void set(String path, Object value) {
if (path == null) { if (path == null) {
throw new NullPointerException("Cannot set to an empty path"); throw new NullPointerException("Cannot set to an empty path");
} }
final Configuration root = getRoot(); Configuration root = getRoot();
if (root == null) { if (root == null) {
throw new IllegalStateException("Cannot use section without a root"); throw new IllegalStateException("Cannot use section without a root");
} }
final char separator = root.options().pathSeparator(); char separator = root.options().pathSeparator();
// i1 is the leading (higher) index // i1 is the leading (higher) index
// i2 is the trailing (lower) index // i2 is the trailing (lower) index
int i1 = -1, i2; int i1 = -1, i2;
ConfigurationSection section = this; ConfigurationSection section = this;
while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) {
final String node = path.substring(i2, i1); String node = path.substring(i2, i1);
final ConfigurationSection subSection = section.getConfigurationSection(node); ConfigurationSection subSection = section.getConfigurationSection(node);
if (subSection == null) { if (subSection == null) {
section = section.createSection(node); section = section.createSection(node);
} else { } else {
@ -306,25 +307,25 @@ public class MemorySection implements ConfigurationSection {
} }
} }
final String key = path.substring(i2); String key = path.substring(i2);
if (section == this) { if (section == this) {
if (value == null) { if (value == null) {
map.remove(key); this.map.remove(key);
} else { } else {
map.put(key, value); this.map.put(key, value);
} }
} else { } else {
section.set(key, value); section.set(key, value);
} }
} }
@Override @Override
public Object get(final String path) { public Object get(String path) {
return get(path, getDefault(path)); return get(path, getDefault(path));
} }
@Override @Override
public Object get(final String path, final Object def) { public Object get(String path, Object def) {
if (path == null) { if (path == null) {
throw new NullPointerException("Path cannot be null"); throw new NullPointerException("Path cannot be null");
} }
@ -333,15 +334,16 @@ public class MemorySection implements ConfigurationSection {
return this; return this;
} }
final Configuration root = getRoot(); Configuration root = getRoot();
if (root == null) { if (root == null) {
throw new IllegalStateException("Cannot access section without a root"); throw new IllegalStateException("Cannot access section without a root");
} }
final char separator = root.options().pathSeparator(); char separator = root.options().pathSeparator();
// i1 is the leading (higher) index // i1 is the leading (higher) index
// i2 is the trailing (lower) index // i2 is the trailing (lower) index
int i1 = -1, i2; int i1 = -1;
int i2;
ConfigurationSection section = this; ConfigurationSection section = this;
while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) {
section = section.getConfigurationSection(path.substring(i2, i1)); section = section.getConfigurationSection(path.substring(i2, i1));
@ -350,32 +352,36 @@ public class MemorySection implements ConfigurationSection {
} }
} }
final String key = path.substring(i2); String key = path.substring(i2);
if (section == this) { if (section == this) {
final Object result = map.get(key); Object result = this.map.get(key);
return (result == null) ? def : result; if (result == null) {
return def;
} else {
return result;
}
} }
return section.get(key, def); return section.get(key, def);
} }
@Override @Override
public ConfigurationSection createSection(final String path) { public ConfigurationSection createSection(String path) {
if (path == null) { if (path == null) {
throw new NullPointerException("Cannot create section at empty path"); throw new NullPointerException("Cannot create section at empty path");
} }
final Configuration root = getRoot(); Configuration root = getRoot();
if (root == null) { if (root == null) {
throw new IllegalStateException("Cannot create section without a root"); throw new IllegalStateException("Cannot create section without a root");
} }
final char separator = root.options().pathSeparator(); char separator = root.options().pathSeparator();
// i1 is the leading (higher) index // i1 is the leading (higher) index
// i2 is the trailing (lower) index // i2 is the trailing (lower) index
int i1 = -1, i2; int i1 = -1, i2;
ConfigurationSection section = this; ConfigurationSection section = this;
while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) {
final String node = path.substring(i2, i1); String node = path.substring(i2, i1);
final ConfigurationSection subSection = section.getConfigurationSection(node); ConfigurationSection subSection = section.getConfigurationSection(node);
if (subSection == null) { if (subSection == null) {
section = section.createSection(node); section = section.createSection(node);
} else { } else {
@ -383,20 +389,20 @@ public class MemorySection implements ConfigurationSection {
} }
} }
final String key = path.substring(i2); String key = path.substring(i2);
if (section == this) { if (section == this) {
final ConfigurationSection result = new MemorySection(this, key); ConfigurationSection result = new MemorySection(this, key);
map.put(key, result); this.map.put(key, result);
return result; return result;
} }
return section.createSection(key); return section.createSection(key);
} }
@Override
public ConfigurationSection createSection(final String path, final Map<?, ?> map) {
final ConfigurationSection section = createSection(path);
for (final Map.Entry<?, ?> entry : map.entrySet()) { @Override
public ConfigurationSection createSection(String path, Map<?, ?> map) {
ConfigurationSection section = createSection(path);
for (Map.Entry<?, ?> entry : map.entrySet()) {
if (entry.getValue() instanceof Map) { if (entry.getValue() instanceof Map) {
section.createSection(entry.getKey().toString(), (Map<?, ?>) entry.getValue()); section.createSection(entry.getKey().toString(), (Map<?, ?>) entry.getValue());
} else { } else {
@ -406,128 +412,140 @@ public class MemorySection implements ConfigurationSection {
return section; return section;
} }
// Primitives // Primitives
@Override @Override
public String getString(final String path) { public String getString(String path) {
final Object def = getDefault(path); Object def = getDefault(path);
return getString(path, def != null ? def.toString() : null); return getString(path, def != null ? def.toString() : null);
} }
@Override @Override
public String getString(final String path, final String def) { public String getString(String path, String def) {
final Object val = get(path, def); Object val = get(path, def);
return (val != null) ? val.toString() : def; if (val != null) {
return val.toString();
} else {
return def;
}
} }
@Override @Override
public boolean isString(final String path) { public boolean isString(String path) {
final Object val = get(path); Object val = get(path);
return val instanceof String; return val instanceof String;
} }
@Override @Override
public int getInt(final String path) { public int getInt(String path) {
final Object def = getDefault(path); Object def = getDefault(path);
return getInt(path, toInt(def, 0)); return getInt(path, toInt(def, 0));
} }
@Override @Override
public int getInt(final String path, final int def) { public int getInt(String path, int def) {
final Object val = get(path, def); Object val = get(path, def);
return toInt(val, def); return toInt(val, def);
} }
@Override @Override
public boolean isInt(final String path) { public boolean isInt(String path) {
final Object val = get(path); Object val = get(path);
return val instanceof Integer; return val instanceof Integer;
} }
@Override @Override
public boolean getBoolean(final String path) { public boolean getBoolean(String path) {
final Object def = getDefault(path); Object def = getDefault(path);
return getBoolean(path, (def instanceof Boolean) ? (Boolean) def : false); if (def instanceof Boolean) {
return getBoolean(path, (Boolean) def);
} else {
return getBoolean(path, false);
}
} }
@Override @Override
public boolean getBoolean(final String path, final boolean def) { public boolean getBoolean(String path, boolean def) {
final Object val = get(path, def); Object val = get(path, def);
return (val instanceof Boolean) ? (Boolean) val : def; if (val instanceof Boolean) {
return (Boolean) val;
} else {
return def;
}
} }
@Override @Override
public boolean isBoolean(final String path) { public boolean isBoolean(String path) {
final Object val = get(path); Object val = get(path);
return val instanceof Boolean; return val instanceof Boolean;
} }
@Override @Override
public double getDouble(final String path) { public double getDouble(String path) {
final Object def = getDefault(path); Object def = getDefault(path);
return getDouble(path, toDouble(def, 0)); return getDouble(path, toDouble(def, 0));
} }
@Override @Override
public double getDouble(final String path, final double def) { public double getDouble(String path, double def) {
final Object val = get(path, def); Object val = get(path, def);
return toDouble(val, def); return toDouble(val, def);
} }
@Override @Override
public boolean isDouble(final String path) { public boolean isDouble(String path) {
final Object val = get(path); Object val = get(path);
return val instanceof Double; return val instanceof Double;
} }
@Override @Override
public long getLong(final String path) { public long getLong(String path) {
final Object def = getDefault(path); Object def = getDefault(path);
return getLong(path, toLong(def, 0)); return getLong(path, toLong(def, 0));
} }
@Override @Override
public long getLong(final String path, final long def) { public long getLong(String path, long def) {
final Object val = get(path, def); Object val = get(path, def);
return toLong(val, def); return toLong(val, def);
} }
@Override @Override
public boolean isLong(final String path) { public boolean isLong(String path) {
final Object val = get(path); Object val = get(path);
return val instanceof Long; return val instanceof Long;
} }
// Java // Java
@Override @Override
public List<?> getList(final String path) { public List<?> getList(String path) {
final Object def = getDefault(path); Object def = getDefault(path);
return getList(path, (def instanceof List) ? (List<?>) def : null); return getList(path, def instanceof List ? (List<?>) def : null);
} }
@Override @Override
public List<?> getList(final String path, final List<?> def) { public List<?> getList(String path, List<?> def) {
final Object val = get(path, def); Object val = get(path, def);
return (List<?>) ((val instanceof List) ? val : def); return (List<?>) ((val instanceof List) ? val : def);
} }
@Override @Override
public boolean isList(final String path) { public boolean isList(String path) {
final Object val = get(path); Object val = get(path);
return val instanceof List; return val instanceof List;
} }
@Override @Override
public List<String> getStringList(final String path) { public List<String> getStringList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<String> result = new ArrayList<>(); List<String> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if ((object instanceof String) || isPrimitiveWrapper(object)) { if ((object instanceof String) || isPrimitiveWrapper(object)) {
result.add(String.valueOf(object)); result.add(String.valueOf(object));
} }
@ -535,18 +553,18 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Integer> getIntegerList(final String path) { public List<Integer> getIntegerList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Integer> result = new ArrayList<>(); List<Integer> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Integer) { if (object instanceof Integer) {
result.add((Integer) object); result.add((Integer) object);
} else if (object instanceof String) { } else if (object instanceof String) {
@ -563,18 +581,18 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Boolean> getBooleanList(final String path) { public List<Boolean> getBooleanList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Boolean> result = new ArrayList<>(); List<Boolean> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Boolean) { if (object instanceof Boolean) {
result.add((Boolean) object); result.add((Boolean) object);
} else if (object instanceof String) { } else if (object instanceof String) {
@ -588,18 +606,18 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Double> getDoubleList(final String path) { public List<Double> getDoubleList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Double> result = new ArrayList<>(); List<Double> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Double) { if (object instanceof Double) {
result.add((Double) object); result.add((Double) object);
} else if (object instanceof String) { } else if (object instanceof String) {
@ -616,18 +634,18 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Float> getFloatList(final String path) { public List<Float> getFloatList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Float> result = new ArrayList<>(); List<Float> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Float) { if (object instanceof Float) {
result.add((Float) object); result.add((Float) object);
} else if (object instanceof String) { } else if (object instanceof String) {
@ -644,18 +662,18 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Long> getLongList(final String path) { public List<Long> getLongList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Long> result = new ArrayList<>(); List<Long> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Long) { if (object instanceof Long) {
result.add((Long) object); result.add((Long) object);
} else if (object instanceof String) { } else if (object instanceof String) {
@ -672,18 +690,18 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Byte> getByteList(final String path) { public List<Byte> getByteList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Byte> result = new ArrayList<>(); List<Byte> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Byte) { if (object instanceof Byte) {
result.add((Byte) object); result.add((Byte) object);
} else if (object instanceof String) { } else if (object instanceof String) {
@ -700,22 +718,22 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Character> getCharacterList(final String path) { public List<Character> getCharacterList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Character> result = new ArrayList<>(); List<Character> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Character) { if (object instanceof Character) {
result.add((Character) object); result.add((Character) object);
} else if (object instanceof String) { } else if (object instanceof String) {
final String str = (String) object; String str = (String) object;
if (str.length() == 1) { if (str.length() == 1) {
result.add(str.charAt(0)); result.add(str.charAt(0));
@ -727,18 +745,18 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Short> getShortList(final String path) { public List<Short> getShortList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
if (list == null) { if (list == null) {
return new ArrayList<>(0); return new ArrayList<>(0);
} }
final List<Short> result = new ArrayList<>(); List<Short> result = new ArrayList<>();
for (final Object object : list) { for (Object object : list) {
if (object instanceof Short) { if (object instanceof Short) {
result.add((Short) object); result.add((Short) object);
} else if (object instanceof String) { } else if (object instanceof String) {
@ -755,17 +773,17 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public List<Map<?, ?>> getMapList(final String path) { public List<Map<?, ?>> getMapList(String path) {
final List<?> list = getList(path); List<?> list = getList(path);
final List<Map<?, ?>> result = new ArrayList<>(); List<Map<?, ?>> result = new ArrayList<>();
if (list == null) { if (list == null) {
return result; return result;
} }
for (final Object object : list) { for (Object object : list) {
if (object instanceof Map) { if (object instanceof Map) {
result.add((Map<?, ?>) object); result.add((Map<?, ?>) object);
} }
@ -773,9 +791,9 @@ public class MemorySection implements ConfigurationSection {
return result; return result;
} }
@Override @Override
public ConfigurationSection getConfigurationSection(final String path) { public ConfigurationSection getConfigurationSection(String path) {
Object val = get(path, null); Object val = get(path, null);
if (val != null) { if (val != null) {
return (val instanceof ConfigurationSection) ? (ConfigurationSection) val : null; return (val instanceof ConfigurationSection) ? (ConfigurationSection) val : null;
@ -784,60 +802,60 @@ public class MemorySection implements ConfigurationSection {
val = get(path, getDefault(path)); val = get(path, getDefault(path));
return (val instanceof ConfigurationSection) ? createSection(path) : null; return (val instanceof ConfigurationSection) ? createSection(path) : null;
} }
@Override @Override
public boolean isConfigurationSection(final String path) { public boolean isConfigurationSection(String path) {
final Object val = get(path); Object val = get(path);
return val instanceof ConfigurationSection; return val instanceof ConfigurationSection;
} }
protected boolean isPrimitiveWrapper(final Object input) { protected boolean isPrimitiveWrapper(Object input) {
return (input instanceof Integer) return (input instanceof Integer)
|| (input instanceof Boolean) || (input instanceof Boolean)
|| (input instanceof Character) || (input instanceof Character)
|| (input instanceof Byte) || (input instanceof Byte)
|| (input instanceof Short) || (input instanceof Short)
|| (input instanceof Double) || (input instanceof Double)
|| (input instanceof Long) || (input instanceof Long)
|| (input instanceof Float); || (input instanceof Float);
} }
protected Object getDefault(final String path) { protected Object getDefault(String path) {
if (path == null) { if (path == null) {
throw new NullPointerException("Path may not be null"); throw new NullPointerException("Path may not be null");
} }
final Configuration root = getRoot(); Configuration root = getRoot();
final Configuration defaults = root == null ? null : root.getDefaults(); Configuration defaults = root == null ? null : root.getDefaults();
return (defaults == null) ? null : defaults.get(createPath(this, path)); return (defaults == null) ? null : defaults.get(createPath(this, path));
} }
protected void mapChildrenKeys(final Set<String> output, final ConfigurationSection section, final boolean deep) {
if (section instanceof MemorySection) {
final MemorySection sec = (MemorySection) section;
for (final Map.Entry<String, Object> entry : sec.map.entrySet()) { protected void mapChildrenKeys(Set<String> output, ConfigurationSection section, boolean deep) {
if (section instanceof MemorySection) {
MemorySection sec = (MemorySection) section;
for (Map.Entry<String, Object> entry : sec.map.entrySet()) {
output.add(createPath(section, entry.getKey(), this)); output.add(createPath(section, entry.getKey(), this));
if (deep && (entry.getValue() instanceof ConfigurationSection)) { if (deep && (entry.getValue() instanceof ConfigurationSection)) {
final ConfigurationSection subsection = (ConfigurationSection) entry.getValue(); ConfigurationSection subsection = (ConfigurationSection) entry.getValue();
mapChildrenKeys(output, subsection, deep); mapChildrenKeys(output, subsection, deep);
} }
} }
} else { } else {
final Set<String> keys = section.getKeys(deep); Set<String> keys = section.getKeys(deep);
for (final String key : keys) { for (String key : keys) {
output.add(createPath(section, key, this)); output.add(createPath(section, key, this));
} }
} }
} }
protected void mapChildrenValues(final Map<String, Object> output, final ConfigurationSection section, final boolean deep) {
if (section instanceof MemorySection) {
final MemorySection sec = (MemorySection) section;
for (final Map.Entry<String, Object> entry : sec.map.entrySet()) { protected void mapChildrenValues(Map<String, Object> output, ConfigurationSection section, boolean deep) {
if (section instanceof MemorySection) {
MemorySection sec = (MemorySection) section;
for (Map.Entry<String, Object> entry : sec.map.entrySet()) {
output.put(createPath(section, entry.getKey(), this), entry.getValue()); output.put(createPath(section, entry.getKey(), this), entry.getValue());
if (entry.getValue() instanceof ConfigurationSection) { if (entry.getValue() instanceof ConfigurationSection) {
@ -847,17 +865,17 @@ public class MemorySection implements ConfigurationSection {
} }
} }
} else { } else {
final Map<String, Object> values = section.getValues(deep); Map<String, Object> values = section.getValues(deep);
for (final Map.Entry<String, Object> entry : values.entrySet()) { for (Map.Entry<String, Object> entry : values.entrySet()) {
output.put(createPath(section, entry.getKey(), this), entry.getValue()); output.put(createPath(section, entry.getKey(), this), entry.getValue());
} }
} }
} }
@Override @Override
public String toString() { public String toString() {
final Configuration root = getRoot(); Configuration root = getRoot();
return getClass().getSimpleName() + "[path='" + getCurrentPath() + "', root='" + (root == null ? null : root.getClass().getSimpleName()) + return getClass().getSimpleName() + "[path='" + getCurrentPath() + "', root='" + (root == null ? null : root.getClass().getSimpleName()) +
"']"; "']";
} }

View File

@ -15,73 +15,224 @@ import java.util.logging.Logger;
* Utility class for storing and retrieving classes for {@link Configuration}. * Utility class for storing and retrieving classes for {@link Configuration}.
*/ */
public class ConfigurationSerialization { public class ConfigurationSerialization {
public static final String SERIALIZED_TYPE_KEY = "=="; public static final String SERIALIZED_TYPE_KEY = "==";
private static final Map<String, Class<? extends ConfigurationSerializable>> aliases =
new HashMap<String, Class<? extends ConfigurationSerializable>>();
private final Class<? extends ConfigurationSerializable> clazz; private final Class<? extends ConfigurationSerializable> clazz;
private static Map<String, Class<? extends ConfigurationSerializable>> aliases = new HashMap<String, Class<? extends ConfigurationSerializable>>();
protected ConfigurationSerialization(Class<? extends ConfigurationSerializable> clazz) {
protected ConfigurationSerialization(final Class<? extends ConfigurationSerializable> clazz) {
this.clazz = clazz; this.clazz = clazz;
} }
protected Method getMethod(final String name, final boolean isStatic) { /**
* Attempts to deserialize the given arguments into a new instance of the
* given class.
*
* <p>The class must implement {@link ConfigurationSerializable}, including
* the extra methods as specified in the javadoc of
* ConfigurationSerializable.</p>
*
* <p>If a new instance could not be made, an example being the class not
* fully implementing the interface, null will be returned.</p>
*
* @param args Arguments for deserialization
* @param clazz Class to deserialize into
* @return New instance of the specified class
*/
public static ConfigurationSerializable deserializeObject(Map<String, ?> args, Class<? extends ConfigurationSerializable> clazz) {
return new ConfigurationSerialization(clazz).deserialize(args);
}
/**
* Attempts to deserialize the given arguments into a new instance of the
*
* given class.
* <p>
* The class must implement {@link ConfigurationSerializable}, including
* the extra methods as specified in the javadoc of
* ConfigurationSerializable.</p>
*
* <p>
* If a new instance could not be made, an example being the class not
* fully implementing the interface, null will be returned.</p>
*
* @param args Arguments for deserialization
* @return New instance of the specified class
*/
public static ConfigurationSerializable deserializeObject(Map<String, ?> args) {
Class<? extends ConfigurationSerializable> clazz = null;
if (args.containsKey(SERIALIZED_TYPE_KEY)) {
try {
String alias = (String) args.get(SERIALIZED_TYPE_KEY);
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 (ClassCastException ex) {
ex.fillInStackTrace();
throw ex;
}
} 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(Class<? extends ConfigurationSerializable> clazz) {
DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
if (delegate == null) {
registerClass(clazz, getAlias(clazz));
registerClass(clazz, clazz.getName());
}
}
/**
* Registers the given alias to the specified {@link
* ConfigurationSerializable} class.
*
* @param clazz Class to register
* @param alias Alias to register as
* @see SerializableAs
*/
public static void registerClass(Class<? extends ConfigurationSerializable> clazz, String alias) {
aliases.put(alias, clazz);
}
/**
* Unregisters the specified alias to a {@link ConfigurationSerializable}
*
* @param alias Alias to unregister
*/
public static void unregisterClass(String alias) {
aliases.remove(alias);
}
/**
* Unregisters any aliases for the specified {@link
* ConfigurationSerializable} class.
*
* @param clazz Class to unregister
*/
public static void unregisterClass(Class<? extends ConfigurationSerializable> clazz) {
while (aliases.values().remove(clazz)) {
}
}
/**
* Attempts to get a registered {@link ConfigurationSerializable} class by
* its alias.
*
* @param alias Alias of the serializable
* @return Registered class, or null if not found
*/
public static Class<? extends ConfigurationSerializable> getClassByAlias(String alias) {
return aliases.get(alias);
}
/**
* Gets the correct alias for the given {@link ConfigurationSerializable}
* class.
*
* @param clazz Class to get alias for
* @return Alias to use for the class
*/
public static String getAlias(Class<? extends ConfigurationSerializable> clazz) {
DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
if (delegate != null) {
if ((delegate.value() == null) || (delegate.value() == clazz)) {
delegate = null;
} else {
return getAlias(delegate.value());
}
}
SerializableAs alias = clazz.getAnnotation(SerializableAs.class);
if (alias != null) {
return alias.value();
}
return clazz.getName();
}
protected Method getMethod(String name, boolean isStatic) {
try { try {
final Method method = clazz.getDeclaredMethod(name, Map.class); Method method = this.clazz.getDeclaredMethod(name, Map.class);
if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) { if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) {
return null; return null;
} }
if (Modifier.isStatic(method.getModifiers()) != isStatic) { if (Modifier.isStatic(method.getModifiers()) != isStatic) {
return null; return null;
} }
return method; return method;
} catch (final NoSuchMethodException ex) { } catch (NoSuchMethodException ex) {
return null; return null;
} catch (final SecurityException ex) { } catch (SecurityException ex) {
return null; return null;
} }
} }
protected Constructor<? extends ConfigurationSerializable> getConstructor() { protected Constructor<? extends ConfigurationSerializable> getConstructor() {
try { try {
return clazz.getConstructor(Map.class); return this.clazz.getConstructor(Map.class);
} catch (final NoSuchMethodException ex) { } catch (NoSuchMethodException ex) {
return null; return null;
} catch (final SecurityException ex) { } catch (SecurityException ex) {
return null; return null;
} }
} }
protected ConfigurationSerializable deserializeViaMethod(final Method method, final Map<String, ?> args) { protected ConfigurationSerializable deserializeViaMethod(Method method, Map<String, ?> args) {
try { try {
final ConfigurationSerializable result = (ConfigurationSerializable) method.invoke(null, args); ConfigurationSerializable result = (ConfigurationSerializable) method.invoke(null, args);
if (result == null) { if (result == null) {
Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE,
"Could not call method '" + method.toString() + "' of " + clazz + " for deserialization: method returned null"); "Could not call method '" + method.toString() + "' of " + this.clazz + " for deserialization: method returned null");
} else { } else {
return result; return result;
} }
} catch (final Throwable ex) { } catch (Throwable ex) {
Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, "Could not call method '" + method.toString() + "' of " + clazz + " for deserialization", Logger.getLogger(ConfigurationSerialization.class.getName())
ex instanceof InvocationTargetException ? ex.getCause() : ex); .log(Level.SEVERE, "Could not call method '" + method.toString() + "' of " + this.clazz
+ " for deserialization",
ex instanceof InvocationTargetException ? ex.getCause() : ex);
} }
return null; return null;
} }
protected ConfigurationSerializable deserializeViaCtor(final Constructor<? extends ConfigurationSerializable> ctor, final Map<String, ?> args) { protected ConfigurationSerializable deserializeViaCtor(Constructor<? extends ConfigurationSerializable> ctor, Map<String, ?> args) {
try { try {
return ctor.newInstance(args); return ctor.newInstance(args);
} catch (final Throwable ex) { } catch (Throwable ex) {
Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, "Could not call constructor '" + ctor.toString() + "' of " + clazz + " for deserialization", Logger.getLogger(ConfigurationSerialization.class.getName())
ex instanceof InvocationTargetException ? ex.getCause() : ex); .log(Level.SEVERE, "Could not call constructor '" + ctor.toString() + "' of " + this.clazz
+ " for deserialization",
ex instanceof InvocationTargetException ? ex.getCause() : ex);
} }
return null; return null;
} }
public ConfigurationSerializable deserialize(final Map<String, ?> args) { public ConfigurationSerializable deserialize(Map<String, ?> args) {
if (args == null) { if (args == null) {
throw new NullPointerException("Args must not be null"); throw new NullPointerException("Args must not be null");
} }
@ -94,162 +245,20 @@ public class ConfigurationSerialization {
if (result == null) { if (result == null) {
method = getMethod("valueOf", true); method = getMethod("valueOf", true);
if (method != null) { if (method != null) {
result = deserializeViaMethod(method, args); result = deserializeViaMethod(method, args);
} }
} }
if (result == null) { if (result == null) {
final Constructor<? extends ConfigurationSerializable> constructor = getConstructor(); Constructor<? extends ConfigurationSerializable> constructor = getConstructor();
if (constructor != null) { if (constructor != null) {
result = deserializeViaCtor(constructor, args); result = deserializeViaCtor(constructor, args);
} }
} }
return result; return result;
} }
/**
* Attempts to deserialize the given arguments into a new instance of the
* given class.
* <p>
* The class must implement {@link ConfigurationSerializable}, including
* the extra methods as specified in the javadoc of
* ConfigurationSerializable.
* <p>
* If a new instance could not be made, an example being the class not
* fully implementing the interface, null will be returned.
*
* @param args Arguments for deserialization
* @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) {
return new ConfigurationSerialization(clazz).deserialize(args);
}
/**
* Attempts to deserialize the given arguments into a new instance of the
* given class.
* <p>
* The class must implement {@link ConfigurationSerializable}, including
* the extra methods as specified in the javadoc of
* ConfigurationSerializable.
* <p>
* If a new instance could not be made, an example being the class not
* fully implementing the interface, null will be returned.
*
* @param args Arguments for deserialization
* @return New instance of the specified class
*/
public static ConfigurationSerializable deserializeObject(final Map<String, ?> args) {
Class<? extends ConfigurationSerializable> clazz = null;
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");
}
clazz = getClassByAlias(alias);
if (clazz == null) {
throw new IllegalArgumentException("Specified class does not exist ('" + alias + "')");
}
} catch (final ClassCastException ex) {
ex.fillInStackTrace();
throw ex;
}
} 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) {
final DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
if (delegate == null) {
registerClass(clazz, getAlias(clazz));
registerClass(clazz, clazz.getName());
}
}
/**
* Registers the given alias to the specified {@link
* ConfigurationSerializable} class
*
* @param clazz Class to register
* @param alias Alias to register as
* @see SerializableAs
*/
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) {
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)) {}
}
/**
* Attempts to get a registered {@link ConfigurationSerializable} class by
* its alias
*
* @param alias Alias of the serializable
* @return Registered class, or null if not found
*/
public static Class<? extends ConfigurationSerializable> getClassByAlias(final String alias) {
return aliases.get(alias);
}
/**
* Gets the correct alias for the given {@link ConfigurationSerializable}
* class
*
* @param clazz Class to get alias for
* @return Alias to use for the class
*/
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)) {
delegate = null;
} else {
return getAlias(delegate.value());
}
}
final SerializableAs alias = clazz.getAnnotation(SerializableAs.class);
if (alias != null) {
return alias.value();
}
return clazz.getName();
}
} }

View File

@ -9,29 +9,30 @@ import java.util.Map;
* The {@code TAG_Compound} tag. * The {@code TAG_Compound} tag.
*/ */
public final class CompoundTag extends Tag { public final class CompoundTag extends Tag {
private Map<String, Tag> value; private Map<String, Tag> value;
/** /**
* Creates the tag with an empty name. * Creates the tag with an empty name.
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public CompoundTag(final Map<String, Tag> value) { public CompoundTag(Map<String, Tag> value) {
super(); super();
this.value = Collections.unmodifiableMap(value); this.value = Collections.unmodifiableMap(value);
} }
/** /**
* Creates the tag. * Creates the tag.
* *
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public CompoundTag(final String name, final Map<String, Tag> value) { public CompoundTag(String name, Map<String, Tag> value) {
super(name); super(name);
this.value = Collections.unmodifiableMap(value); this.value = Collections.unmodifiableMap(value);
} }
/** /**
* Returns whether this compound tag contains the given key. * Returns whether this compound tag contains the given key.
* *
@ -39,15 +40,15 @@ public final class CompoundTag extends Tag {
* *
* @return true if the tag contains the given key * @return true if the tag contains the given key
*/ */
public boolean containsKey(final String key) { public boolean containsKey(String key) {
return value.containsKey(key); return this.value.containsKey(key);
} }
@Override @Override
public Map<String, Tag> getValue() { public Map<String, Tag> getValue() {
return value; return this.value;
} }
/** /**
* Return a new compound tag with the given values. * Return a new compound tag with the given values.
* *
@ -55,42 +56,43 @@ public final class CompoundTag extends Tag {
* *
* @return the new compound tag * @return the new compound tag
*/ */
public CompoundTag setValue(final Map<String, Tag> value) { public CompoundTag setValue(Map<String, Tag> value) {
if (value == null) { if (value == null) {
this.value = Collections.unmodifiableMap(new HashMap<String, Tag>()); this.value = Collections.unmodifiableMap(new HashMap<String, Tag>());
} } else {
else {
this.value = Collections.unmodifiableMap(value); this.value = Collections.unmodifiableMap(value);
} }
return this; return this;
} }
/** /**
* Create a compound tag builder. * Create a compound tag builder.
* *
* @return the builder * @return the builder
*/ */
public CompoundTagBuilder createBuilder() { public CompoundTagBuilder createBuilder() {
return new CompoundTagBuilder(new HashMap<String, Tag>(value)); return new CompoundTagBuilder(new HashMap<String, Tag>(this.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 * 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> * tag, then an empty byte array will be returned. </p>
* *
* @param key the key * @param key the key
* *
* @return a byte array * @return a byte array
*/ */
public byte[] getByteArray(final String key) { public byte[] getByteArray(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ByteArrayTag) { if (tag instanceof ByteArrayTag) {
return ((ByteArrayTag) tag).getValue(); return ((ByteArrayTag) tag).getValue();
} else { } else {
return new byte[0]; 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 * 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> * {@code 0} will be returned. </p>
@ -99,15 +101,15 @@ public final class CompoundTag extends Tag {
* *
* @return a byte * @return a byte
*/ */
public byte getByte(final String key) { public byte getByte(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag) {
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else { } else {
return (byte) 0; 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 * 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> * {@code 0} will be returned. </p>
@ -116,15 +118,15 @@ public final class CompoundTag extends Tag {
* *
* @return a double * @return a double
*/ */
public double getDouble(final String key) { public double getDouble(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof DoubleTag) { if (tag instanceof DoubleTag) {
return ((DoubleTag) tag).getValue(); return ((DoubleTag) tag).getValue();
} else { } else {
return 0; 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 * 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> * its value is not a number, then {@code 0} will be returned. </p>
@ -133,8 +135,8 @@ public final class CompoundTag extends Tag {
* *
* @return a double * @return a double
*/ */
public double asDouble(final String key) { public double asDouble(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag) {
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { } else if (tag instanceof ShortTag) {
@ -151,7 +153,7 @@ public final class CompoundTag extends Tag {
return 0; 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 * 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> * {@code 0} will be returned. </p>
@ -160,15 +162,15 @@ public final class CompoundTag extends Tag {
* *
* @return a float * @return a float
*/ */
public float getFloat(final String key) { public float getFloat(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof FloatTag) { if (tag instanceof FloatTag) {
return ((FloatTag) tag).getValue(); return ((FloatTag) tag).getValue();
} else { } else {
return 0; 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 * 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> * tag, then an empty array will be returned. </p>
@ -177,15 +179,15 @@ public final class CompoundTag extends Tag {
* *
* @return an int array * @return an int array
*/ */
public int[] getIntArray(final String key) { public int[] getIntArray(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof IntArrayTag) { if (tag instanceof IntArrayTag) {
return ((IntArrayTag) tag).getValue(); return ((IntArrayTag) tag).getValue();
} else { } else {
return new int[0]; 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 * 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> * {@code 0} will be returned. </p>
@ -194,15 +196,15 @@ public final class CompoundTag extends Tag {
* *
* @return an int * @return an int
*/ */
public int getInt(final String key) { public int getInt(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof IntTag) { if (tag instanceof IntTag) {
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else { } else {
return 0; 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 * 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> * its value is not a number, then {@code 0} will be returned. </p>
@ -211,8 +213,8 @@ public final class CompoundTag extends Tag {
* *
* @return an int * @return an int
*/ */
public int asInt(final String key) { public int asInt(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag) {
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { } else if (tag instanceof ShortTag) {
@ -229,7 +231,7 @@ public final class CompoundTag extends Tag {
return 0; 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, * 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> * then an empty list will be returned. </p>
@ -238,15 +240,15 @@ public final class CompoundTag extends Tag {
* *
* @return a list of tags * @return a list of tags
*/ */
public List<Tag> getList(final String key) { public List<Tag> getList(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ListTag) { if (tag instanceof ListTag) {
return ((ListTag) tag).getValue(); return ((ListTag) tag).getValue();
} else { } else {
return Collections.emptyList(); 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 * 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> * tag, then an empty tag list will be returned. </p>
@ -255,15 +257,15 @@ public final class CompoundTag extends Tag {
* *
* @return a tag list instance * @return a tag list instance
*/ */
public ListTag getListTag(final String key) { public ListTag getListTag(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ListTag) { if (tag instanceof ListTag) {
return (ListTag) tag; return (ListTag) tag;
} else { } else {
return new ListTag(key, StringTag.class, Collections.<Tag> emptyList()); 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, * 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 * then an empty list will be returned. If the given key references a list but the list of of a different type, then
@ -276,10 +278,10 @@ public final class CompoundTag extends Tag {
* @return a list of tags * @return a list of tags
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T extends Tag> List<T> getList(final String key, final Class<T> listType) { public <T extends Tag> List<T> getList(String key, Class<T> listType) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ListTag) { if (tag instanceof ListTag) {
final ListTag listTag = (ListTag) tag; ListTag listTag = (ListTag) tag;
if (listTag.getType().equals(listType)) { if (listTag.getType().equals(listType)) {
return (List<T>) listTag.getValue(); return (List<T>) listTag.getValue();
} else { } else {
@ -289,7 +291,7 @@ public final class CompoundTag extends Tag {
return Collections.emptyList(); 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 * 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> * {@code 0} will be returned. </p>
@ -298,15 +300,15 @@ public final class CompoundTag extends Tag {
* *
* @return a long * @return a long
*/ */
public long getLong(final String key) { public long getLong(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof LongTag) { if (tag instanceof LongTag) {
return ((LongTag) tag).getValue(); return ((LongTag) tag).getValue();
} else { } else {
return 0L; 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 * 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> * its value is not a number, then {@code 0} will be returned. </p>
@ -315,8 +317,8 @@ public final class CompoundTag extends Tag {
* *
* @return a long * @return a long
*/ */
public long asLong(final String key) { public long asLong(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag) {
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { } else if (tag instanceof ShortTag) {
@ -333,7 +335,7 @@ public final class CompoundTag extends Tag {
return 0L; 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 * 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> * {@code 0} will be returned. </p>
@ -342,15 +344,15 @@ public final class CompoundTag extends Tag {
* *
* @return a short * @return a short
*/ */
public short getShort(final String key) { public short getShort(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof ShortTag) { if (tag instanceof ShortTag) {
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else { } else {
return 0; 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 * 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> * {@code ""} will be returned. </p>
@ -359,25 +361,25 @@ public final class CompoundTag extends Tag {
* *
* @return a string * @return a string
*/ */
public String getString(final String key) { public String getString(String key) {
final Tag tag = value.get(key); Tag tag = this.value.get(key);
if (tag instanceof StringTag) { if (tag instanceof StringTag) {
return ((StringTag) tag).getValue(); return ((StringTag) tag).getValue();
} else { } else {
return ""; return "";
} }
} }
@Override @Override
public String toString() { public String toString() {
final String name = getName(); String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals("")) {
append = "(\"" + getName() + "\")"; append = "(\"" + getName() + "\")";
} }
final StringBuilder bldr = new StringBuilder(); StringBuilder bldr = new StringBuilder();
bldr.append("TAG_Compound").append(append).append(": ").append(value.size()).append(" entries\r\n{\r\n"); bldr.append("TAG_Compound").append(append).append(": ").append(this.value.size()).append(" entries\r\n{\r\n");
for (final Map.Entry<String, Tag> entry : value.entrySet()) { for (Map.Entry<String, Tag> entry : this.value.entrySet()) {
bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")).append("\r\n");
} }
bldr.append("}"); bldr.append("}");

View File

@ -18,6 +18,7 @@ package com.intellectualcrafters.json;
* @version 2014-05-03 * @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. * Get the next value. The value can be wrapped in quotes. The value can be empty.
* *
@ -27,7 +28,7 @@ public class CDL {
* *
* @throws JSONException if the quoted string is badly formed. * @throws JSONException if the quoted string is badly formed.
*/ */
private static String getValue(final JSONTokener x) throws JSONException { private static String getValue(JSONTokener x) throws JSONException {
char c; char c;
char q; char q;
StringBuffer sb; StringBuffer sb;
@ -41,7 +42,7 @@ public class CDL {
case '\'': case '\'':
q = c; q = c;
sb = new StringBuffer(); sb = new StringBuffer();
for (;;) { for (; ; ) {
c = x.next(); c = x.next();
if (c == q) { if (c == q) {
break; break;
@ -60,7 +61,7 @@ public class CDL {
return x.nextTo(','); return x.nextTo(',');
} }
} }
/** /**
* Produce a JSONArray of strings from a row of comma delimited values. * Produce a JSONArray of strings from a row of comma delimited values.
* *
@ -70,16 +71,16 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray rowToJSONArray(final JSONTokener x) throws JSONException { public static JSONArray rowToJSONArray(JSONTokener x) throws JSONException {
final JSONArray ja = new JSONArray(); JSONArray ja = new JSONArray();
for (;;) { for (; ; ) {
final String value = getValue(x); String value = getValue(x);
char c = x.next(); char c = x.next();
if ((value == null) || ((ja.length() == 0) && (value.isEmpty()) && (c != ','))) { if ((value == null) || ((ja.length() == 0) && value.isEmpty() && (c != ','))) {
return null; return null;
} }
ja.put(value); ja.put(value);
for (;;) { for (; ; ) {
if (c == ',') { if (c == ',') {
break; break;
} }
@ -93,7 +94,7 @@ public class CDL {
} }
} }
} }
/** /**
* Produce a JSONObject from a row of comma delimited text, using a parallel JSONArray of strings to provides the * Produce a JSONObject from a row of comma delimited text, using a parallel JSONArray of strings to provides the
* names of the elements. * names of the elements.
@ -106,11 +107,11 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONObject rowToJSONObject(final JSONArray names, final JSONTokener x) throws JSONException { public static JSONObject rowToJSONObject(JSONArray names, JSONTokener x) throws JSONException {
final JSONArray ja = rowToJSONArray(x); JSONArray ja = rowToJSONArray(x);
return ja != null ? ja.toJSONObject(names) : null; return ja != null ? ja.toJSONObject(names) : null;
} }
/** /**
* Produce a comma delimited text row from a JSONArray. Values containing the comma character will be quoted. * Produce a comma delimited text row from a JSONArray. Values containing the comma character will be quoted.
* Troublesome characters may be removed. * Troublesome characters may be removed.
@ -119,21 +120,21 @@ public class CDL {
* *
* @return A string ending in NEWLINE. * @return A string ending in NEWLINE.
*/ */
public static String rowToString(final JSONArray ja) { public static String rowToString(JSONArray ja) {
final StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (int i = 0; i < ja.length(); i += 1) { for (int i = 0; i < ja.length(); i += 1) {
if (i > 0) { if (i > 0) {
sb.append(','); sb.append(',');
} }
final Object object = ja.opt(i); Object object = ja.opt(i);
if (object != null) { if (object != null) {
final String string = object.toString(); String string = object.toString();
if ((!string.isEmpty()) && ((string.indexOf(',') >= 0) || (string.indexOf('\n') >= 0) || (string.indexOf('\r') >= 0) || ( if (!string.isEmpty() && ((string.indexOf(',') >= 0) || (string.indexOf('\n') >= 0) || (string.indexOf('\r') >= 0) || (
string.indexOf(0) >= 0) || (string.charAt(0) == '"'))) { string.indexOf(0) >= 0) || (string.charAt(0) == '"'))) {
sb.append('"'); sb.append('"');
final int length = string.length(); 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); char c = string.charAt(j);
if ((c >= ' ') && (c != '"')) { if ((c >= ' ') && (c != '"')) {
sb.append(c); sb.append(c);
} }
@ -147,7 +148,7 @@ public class CDL {
sb.append('\n'); sb.append('\n');
return sb.toString(); return sb.toString();
} }
/** /**
* Produce a JSONArray of JSONObjects from a comma delimited text string, using the first row as a source of names. * Produce a JSONArray of JSONObjects from a comma delimited text string, using the first row as a source of names.
* *
@ -157,10 +158,10 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final String string) throws JSONException { public static JSONArray toJSONArray(String string) throws JSONException {
return toJSONArray(new JSONTokener(string)); 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. * Produce a JSONArray of JSONObjects from a comma delimited text string, using the first row as a source of names.
* *
@ -170,10 +171,10 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final JSONTokener x) throws JSONException { public static JSONArray toJSONArray(JSONTokener x) throws JSONException {
return toJSONArray(rowToJSONArray(x), x); return toJSONArray(rowToJSONArray(x), x);
} }
/** /**
* Produce a JSONArray of JSONObjects from a comma delimited text string using a supplied JSONArray as the source of * Produce a JSONArray of JSONObjects from a comma delimited text string using a supplied JSONArray as the source of
* element names. * element names.
@ -185,10 +186,10 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final JSONArray names, final String string) throws JSONException { public static JSONArray toJSONArray(JSONArray names, String string) throws JSONException {
return toJSONArray(names, new JSONTokener(string)); 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 * Produce a JSONArray of JSONObjects from a comma delimited text string using a supplied JSONArray as the source of
* element names. * element names.
@ -200,13 +201,13 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final JSONArray names, final JSONTokener x) throws JSONException { public static JSONArray toJSONArray(JSONArray names, JSONTokener x) throws JSONException {
if ((names == null) || (names.length() == 0)) { if ((names == null) || (names.length() == 0)) {
return null; return null;
} }
final JSONArray ja = new JSONArray(); JSONArray ja = new JSONArray();
for (;;) { for (; ; ) {
final JSONObject jo = rowToJSONObject(names, x); JSONObject jo = rowToJSONObject(names, x);
if (jo == null) { if (jo == null) {
break; break;
} }
@ -217,7 +218,7 @@ public class CDL {
} }
return ja; return ja;
} }
/** /**
* Produce a comma delimited text from a JSONArray of JSONObjects. The first row will be a list of names obtained by * 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. * inspecting the first JSONObject.
@ -228,17 +229,17 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONArray ja) throws JSONException { public static String toString(JSONArray ja) throws JSONException {
final JSONObject jo = ja.optJSONObject(0); JSONObject jo = ja.optJSONObject(0);
if (jo != null) { if (jo != null) {
final JSONArray names = jo.names(); JSONArray names = jo.names();
if (names != null) { if (names != null) {
return rowToString(names) + toString(names, ja); return rowToString(names) + toString(names, ja);
} }
} }
return null; return null;
} }
/** /**
* Produce a comma delimited text from a JSONArray of JSONObjects using a provided list of names. The list of names * 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. * is not included in the output.
@ -250,13 +251,13 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONArray names, final JSONArray ja) throws JSONException { public static String toString(JSONArray names, JSONArray ja) throws JSONException {
if ((names == null) || (names.length() == 0)) { if ((names == null) || (names.length() == 0)) {
return null; return null;
} }
final StringBuilder sb = new StringBuilder(); 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); JSONObject jo = ja.optJSONObject(i);
if (jo != null) { if (jo != null) {
sb.append(rowToString(jo.toJSONArray(names))); sb.append(rowToString(jo.toJSONArray(names)));
} }

View File

@ -2443,7 +2443,8 @@ public class PS {
} }
/** /**
* Get a list of PlotArea objects * Get a list of PlotArea objects.
* @param world
* @return Collection of PlotArea objects * @return Collection of PlotArea objects
*/ */
public Set<PlotArea> getPlotAreas(String world) { public Set<PlotArea> getPlotAreas(String world) {

View File

@ -68,7 +68,7 @@ public class Load extends SubCommand {
String schem; String schem;
try { try {
schem = schematics.get(Integer.parseInt(args[0]) - 1); schem = schematics.get(Integer.parseInt(args[0]) - 1);
} catch (Exception e) { } catch (NumberFormatException e) {
// use /plot load <index> // use /plot load <index>
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + schematics.size() + ")"); MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + schematics.size() + ")");
return false; return false;

View File

@ -64,11 +64,11 @@ public class Visit extends SubCommand {
@Override @Override
public boolean onCommand(PlotPlayer player, String[] args) { public boolean onCommand(PlotPlayer player, String[] args) {
int page = Integer.MIN_VALUE;
Collection<Plot> unsorted = null;
if (args.length == 1 && args[0].contains(":")) { if (args.length == 1 && args[0].contains(":")) {
args = args[0].split(":"); args = args[0].split(":");
} }
int page = Integer.MIN_VALUE;
Collection<Plot> unsorted = null;
switch (args.length) { switch (args.length) {
case 2: { case 2: {
if (!MathMan.isInteger(args[1])) { if (!MathMan.isInteger(args[1])) {

View File

@ -32,90 +32,90 @@ import java.util.ArrayList;
*/ */
public class Configuration { public class Configuration {
public static final SettingValue<String> STRING = new SettingValue<String>("STRING") { public static final SettingValue<String> STRING = new SettingValue<String>("STRING") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
return true; return true;
} }
@Override @Override
public String parseString(final String string) { public String parseString(String string) {
return string; return string;
} }
}; };
public static final SettingValue<String[]> STRINGLIST = new SettingValue<String[]>("STRINGLIST") { public static final SettingValue<String[]> STRINGLIST = new SettingValue<String[]>("STRINGLIST") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
return true; return true;
} }
@Override @Override
public String[] parseString(final String string) { public String[] parseString(String string) {
return string.split(","); return string.split(",");
} }
}; };
public static final SettingValue<Integer> INTEGER = new SettingValue<Integer>("INTEGER") { public static final SettingValue<Integer> INTEGER = new SettingValue<Integer>("INTEGER") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
try { try {
Integer.parseInt(string); Integer.parseInt(string);
return true; return true;
} catch (final Exception e) { } catch (Exception e) {
return false; return false;
} }
} }
@Override @Override
public Integer parseString(final String string) { public Integer parseString(String string) {
return Integer.parseInt(string); return Integer.parseInt(string);
} }
}; };
public static final SettingValue<Boolean> BOOLEAN = new SettingValue<Boolean>("BOOLEAN") { public static final SettingValue<Boolean> BOOLEAN = new SettingValue<Boolean>("BOOLEAN") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
try { try {
Boolean.parseBoolean(string); Boolean.parseBoolean(string);
return true; return true;
} catch (final Exception e) { } catch (Exception e) {
return false; return false;
} }
} }
@Override @Override
public Boolean parseString(final String string) { public Boolean parseString(String string) {
return Boolean.parseBoolean(string); return Boolean.parseBoolean(string);
} }
}; };
public static final SettingValue<Double> DOUBLE = new SettingValue<Double>("DOUBLE") { public static final SettingValue<Double> DOUBLE = new SettingValue<Double>("DOUBLE") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
try { try {
Double.parseDouble(string); Double.parseDouble(string);
return true; return true;
} catch (final Exception e) { } catch (Exception e) {
return false; return false;
} }
} }
@Override @Override
public Double parseString(final String string) { public Double parseString(String string) {
return Double.parseDouble(string); return Double.parseDouble(string);
} }
}; };
public static final SettingValue<String> BIOME = new SettingValue<String>("BIOME") { public static final SettingValue<String> BIOME = new SettingValue<String>("BIOME") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
try { try {
final int biome = WorldUtil.IMP.getBiomeFromString(string.toUpperCase()); int biome = WorldUtil.IMP.getBiomeFromString(string.toUpperCase());
return biome != -1; return biome != -1;
} catch (final Exception e) { } catch (Exception e) {
return false; return false;
} }
} }
@Override @Override
public String parseString(final String string) { public String parseString(String string) {
if (validateValue(string)) { if (validateValue(string)) {
return string.toUpperCase(); return string.toUpperCase();
} }
@ -124,14 +124,14 @@ public class Configuration {
}; };
public static final SettingValue<PlotBlock> BLOCK = new SettingValue<PlotBlock>("BLOCK") { public static final SettingValue<PlotBlock> BLOCK = new SettingValue<PlotBlock>("BLOCK") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
final StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(string); StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(string);
return !(value == null || value.match > 1); return !(value == null || value.match > 1);
} }
@Override @Override
public PlotBlock parseString(final String string) { public PlotBlock parseString(String string) {
final StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(string); StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(string);
if (value == null || value.match > 1) { if (value == null || value.match > 1) {
return null; return null;
} }
@ -140,15 +140,15 @@ public class Configuration {
}; };
public static final SettingValue<PlotBlock[]> BLOCKLIST = new SettingValue<PlotBlock[]>("BLOCKLIST") { public static final SettingValue<PlotBlock[]> BLOCKLIST = new SettingValue<PlotBlock[]>("BLOCKLIST") {
@Override @Override
public boolean validateValue(final String string) { public boolean validateValue(String string) {
try { try {
for (String block : string.split(",")) { for (String block : string.split(",")) {
if (block.contains("%")) { if (block.contains("%")) {
final String[] split = block.split("%"); String[] split = block.split("%");
Integer.parseInt(split[0]); Integer.parseInt(split[0]);
block = split[1]; block = split[1];
} }
final StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(block); StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(block);
if (value == null || value.match > 1) { if (value == null || value.match > 1) {
return false; return false;
} }
@ -158,20 +158,20 @@ public class Configuration {
return false; return false;
} }
} }
@Override @Override
public PlotBlock[] parseString(final String string) { public PlotBlock[] parseString(String string) {
final String[] blocks = string.split(","); String[] blocks = string.split(",");
final ArrayList<PlotBlock> parsedvalues = new ArrayList<>(); ArrayList<PlotBlock> parsedvalues = new ArrayList<>();
final PlotBlock[] values = new PlotBlock[blocks.length]; PlotBlock[] values = new PlotBlock[blocks.length];
final int[] counts = new int[blocks.length]; int[] counts = new int[blocks.length];
int min = 100; int min = 100;
for (int i = 0; i < blocks.length; i++) { for (int i = 0; i < blocks.length; i++) {
try { try {
if (blocks[i].contains("%")) { if (blocks[i].contains("%")) {
final String[] split = blocks[i].split("%"); String[] split = blocks[i].split("%");
blocks[i] = split[1]; blocks[i] = split[1];
final int value = Integer.parseInt(split[0]); int value = Integer.parseInt(split[0]);
counts[i] = value; counts[i] = value;
if (value < min) { if (value < min) {
min = value; min = value;
@ -182,16 +182,16 @@ public class Configuration {
min = 1; min = 1;
} }
} }
final StringComparison<PlotBlock>.ComparisonResult result = WorldUtil.IMP.getClosestBlock(blocks[i]); StringComparison<PlotBlock>.ComparisonResult result = WorldUtil.IMP.getClosestBlock(blocks[i]);
if (result != null && result.match < 2) { if (result != null && result.match < 2) {
values[i] = result.best; values[i] = result.best;
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
} }
} }
final int gcd = gcd(counts); int gcd = gcd(counts);
for (int i = 0; i < counts.length; i++) { for (int i = 0; i < counts.length; i++) {
final int num = counts[i]; int num = counts[i];
for (int j = 0; j < num / gcd; j++) { for (int j = 0; j < num / gcd; j++) {
parsedvalues.add(values[i]); parsedvalues.add(values[i]);
} }
@ -199,38 +199,39 @@ public class Configuration {
return parsedvalues.toArray(new PlotBlock[parsedvalues.size()]); return parsedvalues.toArray(new PlotBlock[parsedvalues.size()]);
} }
}; };
public static int gcd(final int a, final int b) { public static int gcd(int a, int b) {
if (b == 0) { if (b == 0) {
return a; return a;
} }
return gcd(b, a % b); return gcd(b, a % b);
} }
private static int gcd(final int[] a) { private static int gcd(int[] a) {
int result = a[0]; int result = a[0];
for (int i = 1; i < a.length; i++) { for (int i = 1; i < a.length; i++) {
result = gcd(result, a[i]); result = gcd(result, a[i]);
} }
return result; return result;
} }
/** /**
* Create your own SettingValue object to make the management of plotworld configuration easier * Create your own SettingValue object to make the management of plotworld configuration easier
*/ */
public static abstract class SettingValue<T> { public static abstract class SettingValue<T> {
private final String type; private final String type;
public SettingValue(final String type) { public SettingValue(String type) {
this.type = type; this.type = type;
} }
public String getType() { public String getType() {
return this.type; return this.type;
} }
public abstract T parseString(final String string); public abstract T parseString(String string);
public abstract boolean validateValue(final String string); public abstract boolean validateValue(String string);
} }
} }

View File

@ -61,7 +61,7 @@ public abstract class Database {
public abstract Connection getConnection(); public abstract Connection getConnection();
/** /**
* Closes the connection with the database * Closes the connection with the database.
* *
* @return true if successful * @return true if successful
* *
@ -70,7 +70,8 @@ public abstract class Database {
public abstract boolean closeConnection() throws SQLException; public abstract boolean closeConnection() throws SQLException;
/** /**
* Executes a SQL Query<br> If the connection is closed, it will be opened * Executes a SQL Query.
* If the connection is closed, it will be opened.
* *
* @param query Query to be run * @param query Query to be run
* *
@ -79,7 +80,7 @@ public abstract class Database {
* @throws SQLException If the query cannot be executed * @throws SQLException If the query cannot be executed
* @throws ClassNotFoundException If the driver cannot be found; see {@link #openConnection()} * @throws ClassNotFoundException If the driver cannot be found; see {@link #openConnection()}
*/ */
public abstract ResultSet querySQL(final String query) throws SQLException, ClassNotFoundException; public abstract ResultSet querySQL(String query) throws SQLException, ClassNotFoundException;
/** /**
* Executes an Update SQL Query<br> See {@link java.sql.Statement#executeUpdate(String)}<br> If the connection is * Executes an Update SQL Query<br> See {@link java.sql.Statement#executeUpdate(String)}<br> If the connection is
@ -92,5 +93,5 @@ public abstract class Database {
* @throws SQLException If the query cannot be executed * @throws SQLException If the query cannot be executed
* @throws ClassNotFoundException If the driver cannot be found; see {@link #openConnection()} * @throws ClassNotFoundException If the driver cannot be found; see {@link #openConnection()}
*/ */
public abstract int updateSQL(final String query) throws SQLException, ClassNotFoundException; public abstract int updateSQL(String query) throws SQLException, ClassNotFoundException;
} }

View File

@ -31,6 +31,7 @@ import com.intellectualcrafters.plot.object.PlotSettings;
import com.intellectualcrafters.plot.object.RunnableVal; import com.intellectualcrafters.plot.object.RunnableVal;
import com.intellectualcrafters.plot.util.EventUtil; import com.intellectualcrafters.plot.util.EventUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
@ -53,7 +54,7 @@ public class FlagManager {
* Reserve a flag so that it cannot be set by players * Reserve a flag so that it cannot be set by players
* @param flag * @param flag
*/ */
public static void reserveFlag(final String flag) { public static void reserveFlag(String flag) {
reserved.add(flag); reserved.add(flag);
} }
@ -62,7 +63,7 @@ public class FlagManager {
* @param flag * @param flag
* @return * @return
*/ */
public static boolean isReserved(final String flag) { public static boolean isReserved(String flag) {
return reserved.contains(flag); return reserved.contains(flag);
} }
@ -78,7 +79,7 @@ public class FlagManager {
* Unreserve a flag * Unreserve a flag
* @param flag * @param flag
*/ */
public static void unreserveFlag(final String flag) { public static void unreserveFlag(String flag) {
reserved.remove(flag); reserved.remove(flag);
} }
@ -89,16 +90,16 @@ public class FlagManager {
* *
* @return boolean success * @return boolean success
*/ */
public static boolean addFlag(final AbstractFlag af) { public static boolean addFlag(AbstractFlag af) {
return addFlag(af, false); return addFlag(af, false);
} }
public static boolean addFlag(final AbstractFlag af, final boolean reserved) { public static boolean addFlag(final AbstractFlag af, boolean reserved) {
PS.debug(C.PREFIX + "&8 - Adding flag: &7" + af); PS.debug(C.PREFIX + "&8 - Adding flag: &7" + af);
PS.get().foreachPlotArea(new RunnableVal<PlotArea>() { PS.get().foreachPlotArea(new RunnableVal<PlotArea>() {
@Override @Override
public void run(PlotArea value) { public void run(PlotArea value) {
final Flag flag = value.DEFAULT_FLAGS.get(af.getKey()); Flag flag = value.DEFAULT_FLAGS.get(af.getKey());
if (flag != null) { if (flag != null) {
flag.setKey(af); flag.setKey(af);
} }
@ -107,7 +108,7 @@ public class FlagManager {
PS.get().foreachPlotRaw(new RunnableVal<Plot>() { PS.get().foreachPlotRaw(new RunnableVal<Plot>() {
@Override @Override
public void run(Plot value) { public void run(Plot value) {
final Flag flag = value.getFlags().get(af.getKey()); Flag flag = value.getFlags().get(af.getKey());
if (flag != null) { if (flag != null) {
flag.setKey(af); flag.setKey(af);
} }
@ -124,9 +125,9 @@ public class FlagManager {
} }
public static String toString(Collection<Flag> flags) { public static String toString(Collection<Flag> flags) {
final StringBuilder flag_string = new StringBuilder(); StringBuilder flag_string = new StringBuilder();
int i = 0; int i = 0;
for (final Flag flag : flags) { for (Flag flag : flags) {
if (i != 0) { if (i != 0) {
flag_string.append(","); flag_string.append(",");
} }
@ -136,7 +137,7 @@ public class FlagManager {
return flag_string.toString(); return flag_string.toString();
} }
public static Flag getSettingFlag(final PlotArea area, final PlotSettings settings, final String id) { public static Flag getSettingFlag(PlotArea area, PlotSettings settings, String id) {
Flag flag; Flag flag;
if (settings.flags.isEmpty() || (flag = settings.flags.get(id)) == null) { if (settings.flags.isEmpty() || (flag = settings.flags.get(id)) == null) {
if (area == null) { if (area == null) {
@ -150,12 +151,12 @@ public class FlagManager {
return flag; return flag;
} }
public static boolean isBooleanFlag(final Plot plot, final String key, final boolean defaultValue) { public static boolean isBooleanFlag(Plot plot, String key, boolean defaultValue) {
final Flag flag = FlagManager.getPlotFlagRaw(plot, key); Flag flag = FlagManager.getPlotFlagRaw(plot, key);
if (flag == null) { if (flag == null) {
return defaultValue; return defaultValue;
} }
final Object value = flag.getValue(); Object value = flag.getValue();
if (value instanceof Boolean) { if (value instanceof Boolean) {
return (boolean) value; return (boolean) value;
} }
@ -168,7 +169,7 @@ public class FlagManager {
* @param flag * @param flag
* @return Flag * @return Flag
*/ */
public static Flag getPlotFlag(final Plot plot, final String flag) { public static Flag getPlotFlag(Plot plot, String flag) {
Flag result = getPlotFlagRaw(plot, flag); Flag result = getPlotFlagRaw(plot, flag);
return result == null ? null : (Flag) result.clone(); return result == null ? null : (Flag) result.clone();
} }
@ -181,26 +182,26 @@ public class FlagManager {
* @param flag * @param flag
* @return * @return
*/ */
public static Flag getPlotFlagRaw(final Plot plot, final String flag) { public static Flag getPlotFlagRaw(Plot plot, String flag) {
if (plot.owner == null) { if (plot.owner == null) {
return null; return null;
} }
return getSettingFlag(plot.getArea(), plot.getSettings(), flag); return getSettingFlag(plot.getArea(), plot.getSettings(), flag);
} }
public static boolean isPlotFlagTrue(final Plot plot, final String strFlag) { public static boolean isPlotFlagTrue(Plot plot, String strFlag) {
if (plot.owner == null) { if (plot.owner == null) {
return false; return false;
} }
final Flag flag = getPlotFlagRaw(plot, strFlag); Flag flag = getPlotFlagRaw(plot, strFlag);
return !(flag == null || !((Boolean) flag.getValue())); return !(flag == null || !((Boolean) flag.getValue()));
} }
public static boolean isPlotFlagFalse(final Plot plot, final String strFlag) { public static boolean isPlotFlagFalse(Plot plot, String strFlag) {
if (plot.owner == null) { if (plot.owner == null) {
return false; return false;
} }
final Flag flag = getPlotFlagRaw(plot, strFlag); Flag flag = getPlotFlagRaw(plot, strFlag);
if (flag == null || (Boolean) flag.getValue()) { if (flag == null || (Boolean) flag.getValue()) {
return false; return false;
} }
@ -213,11 +214,11 @@ public class FlagManager {
* @param flag * @param flag
* @return Flag * @return Flag
*/ */
public static Flag getPlotFlagAbs(final Plot plot, final String flag) { public static Flag getPlotFlagAbs(Plot plot, String flag) {
return getSettingFlagAbs(plot.getSettings(), flag); return getSettingFlagAbs(plot.getSettings(), flag);
} }
public static Flag getSettingFlagAbs(final PlotSettings settings, final String flag) { public static Flag getSettingFlagAbs(PlotSettings settings, String flag) {
if (settings.flags.isEmpty()) { if (settings.flags.isEmpty()) {
return null; return null;
} }
@ -229,8 +230,8 @@ public class FlagManager {
* @param origin * @param origin
* @param flag * @param flag
*/ */
public static boolean addPlotFlag(final Plot origin, final Flag flag) { public static boolean addPlotFlag(Plot origin, Flag flag) {
final boolean result = EventUtil.manager.callFlagAdd(flag, origin); boolean result = EventUtil.manager.callFlagAdd(flag, origin);
if (!result) { if (!result) {
return false; return false;
} }
@ -242,8 +243,8 @@ public class FlagManager {
return true; return true;
} }
public static boolean addPlotFlagAbs(final Plot plot, final Flag flag) { public static boolean addPlotFlagAbs(Plot plot, Flag flag) {
final boolean result = EventUtil.manager.callFlagAdd(flag, plot); boolean result = EventUtil.manager.callFlagAdd(flag, plot);
if (!result) { if (!result) {
return false; return false;
} }
@ -251,7 +252,7 @@ public class FlagManager {
return true; return true;
} }
public static boolean addClusterFlag(final PlotCluster cluster, final Flag flag) { public static boolean addClusterFlag(PlotCluster cluster, Flag flag) {
getSettingFlag(cluster.area, cluster.settings, flag.getKey()); getSettingFlag(cluster.area, cluster.settings, flag.getKey());
cluster.settings.flags.put(flag.getKey(), flag); cluster.settings.flags.put(flag.getKey(), flag);
DBFunc.setFlags(cluster, cluster.settings.flags.values()); DBFunc.setFlags(cluster, cluster.settings.flags.values());
@ -263,20 +264,20 @@ public class FlagManager {
* @param plot * @param plot
* @return set of flags * @return set of flags
*/ */
public static HashMap<String, Flag> getPlotFlags(final Plot plot) { public static HashMap<String, Flag> getPlotFlags(Plot plot) {
if (!plot.hasOwner()) { if (!plot.hasOwner()) {
return null; return null;
} }
return getSettingFlags(plot.getArea(), plot.getSettings()); return getSettingFlags(plot.getArea(), plot.getSettings());
} }
public static HashMap<String, Flag> getPlotFlags(PlotArea area, final PlotSettings settings, final boolean ignorePluginflags) { public static HashMap<String, Flag> getPlotFlags(PlotArea area, PlotSettings settings, boolean ignorePluginflags) {
final HashMap<String, Flag> flags = new HashMap<>(); HashMap<String, Flag> flags = new HashMap<>();
if (area != null && !area.DEFAULT_FLAGS.isEmpty()) { if (area != null && !area.DEFAULT_FLAGS.isEmpty()) {
flags.putAll(area.DEFAULT_FLAGS); flags.putAll(area.DEFAULT_FLAGS);
} }
if (ignorePluginflags) { if (ignorePluginflags) {
for (final Map.Entry<String, Flag> flag : settings.flags.entrySet()) { for (Map.Entry<String, Flag> flag : settings.flags.entrySet()) {
if (isReserved(flag.getValue().getAbstractFlag().getKey())) { if (isReserved(flag.getValue().getAbstractFlag().getKey())) {
continue; continue;
} }
@ -289,16 +290,16 @@ public class FlagManager {
return flags; return flags;
} }
public static HashMap<String, Flag> getSettingFlags(PlotArea area, final PlotSettings settings) { public static HashMap<String, Flag> getSettingFlags(PlotArea area, PlotSettings settings) {
return getPlotFlags(area, settings, false); return getPlotFlags(area, settings, false);
} }
public static boolean removePlotFlag(final Plot plot, final String id) { public static boolean removePlotFlag(Plot plot, String id) {
final Flag flag = plot.getFlags().remove(id); Flag flag = plot.getFlags().remove(id);
if (flag == null) { if (flag == null) {
return false; return false;
} }
final boolean result = EventUtil.manager.callFlagRemove(flag, plot); boolean result = EventUtil.manager.callFlagRemove(flag, plot);
if (!result) { if (!result) {
plot.getFlags().put(id, flag); plot.getFlags().put(id, flag);
return false; return false;
@ -308,12 +309,12 @@ public class FlagManager {
return true; return true;
} }
public static boolean removeClusterFlag(final PlotCluster cluster, final String id) { public static boolean removeClusterFlag(PlotCluster cluster, String id) {
final Flag flag = cluster.settings.flags.remove(id); Flag flag = cluster.settings.flags.remove(id);
if (flag == null) { if (flag == null) {
return false; return false;
} }
final boolean result = EventUtil.manager.callFlagRemove(flag, cluster); boolean result = EventUtil.manager.callFlagRemove(flag, cluster);
if (!result) { if (!result) {
cluster.settings.flags.put(id, flag); cluster.settings.flags.put(id, flag);
return false; return false;
@ -322,11 +323,11 @@ public class FlagManager {
return true; return true;
} }
public static void setPlotFlags(final Plot origin, final Set<Flag> flags) { public static void setPlotFlags(Plot origin, Set<Flag> flags) {
for (Plot plot : origin.getConnectedPlots()) { for (Plot plot : origin.getConnectedPlots()) {
if (flags != null && !flags.isEmpty()) { if (flags != null && !flags.isEmpty()) {
plot.getFlags().clear(); plot.getFlags().clear();
for (final Flag flag : flags) { for (Flag flag : flags) {
plot.getFlags().put(flag.getKey(), flag); plot.getFlags().put(flag.getKey(), flag);
} }
} else if (plot.getFlags().isEmpty()) { } else if (plot.getFlags().isEmpty()) {
@ -339,10 +340,10 @@ public class FlagManager {
} }
} }
public static void setClusterFlags(final PlotCluster cluster, final Set<Flag> flags) { public static void setClusterFlags(PlotCluster cluster, Set<Flag> flags) {
if (flags != null && !flags.isEmpty()) { if (flags != null && !flags.isEmpty()) {
cluster.settings.flags.clear(); cluster.settings.flags.clear();
for (final Flag flag : flags) { for (Flag flag : flags) {
cluster.settings.flags.put(flag.getKey(), flag); cluster.settings.flags.put(flag.getKey(), flag);
} }
} else if (cluster.settings.flags.isEmpty()) { } else if (cluster.settings.flags.isEmpty()) {
@ -353,10 +354,10 @@ public class FlagManager {
DBFunc.setFlags(cluster, cluster.settings.flags.values()); DBFunc.setFlags(cluster, cluster.settings.flags.values());
} }
public static Flag[] removeFlag(final Flag[] flags, final String r) { public static Flag[] removeFlag(Flag[] flags, String r) {
final Flag[] f = new Flag[flags.length - 1]; Flag[] f = new Flag[flags.length - 1];
int index = 0; int index = 0;
for (final Flag flag : flags) { for (Flag flag : flags) {
if (!flag.getKey().equals(r)) { if (!flag.getKey().equals(r)) {
f[index++] = flag; f[index++] = flag;
} }
@ -364,9 +365,9 @@ public class FlagManager {
return f; return f;
} }
public static Set<Flag> removeFlag(final Set<Flag> flags, final String r) { public static Set<Flag> removeFlag(Set<Flag> flags, String r) {
final HashSet<Flag> newflags = new HashSet<>(); HashSet<Flag> newflags = new HashSet<>();
for (final Flag flag : flags) { for (Flag flag : flags) {
if (!flag.getKey().equalsIgnoreCase(r)) { if (!flag.getKey().equalsIgnoreCase(r)) {
newflags.add(flag); newflags.add(flag);
} }
@ -390,9 +391,9 @@ public class FlagManager {
* *
* @return List (AbstractFlag) * @return List (AbstractFlag)
*/ */
public static List<AbstractFlag> getFlags(final PlotPlayer player) { public static List<AbstractFlag> getFlags(PlotPlayer player) {
final List<AbstractFlag> returnFlags = new ArrayList<>(); List<AbstractFlag> returnFlags = new ArrayList<>();
for (final AbstractFlag flag : flags) { for (AbstractFlag flag : flags) {
if (Permissions.hasPermission(player, "plots.set.flag." + flag.getKey().toLowerCase())) { if (Permissions.hasPermission(player, "plots.set.flag." + flag.getKey().toLowerCase())) {
returnFlags.add(flag); returnFlags.add(flag);
} }
@ -407,8 +408,8 @@ public class FlagManager {
* *
* @return AbstractFlag * @return AbstractFlag
*/ */
public static AbstractFlag getFlag(final String string) { public static AbstractFlag getFlag(String string) {
for (final AbstractFlag flag : flags) { for (AbstractFlag flag : flags) {
if (flag.getKey().equalsIgnoreCase(string)) { if (flag.getKey().equalsIgnoreCase(string)) {
return flag; return flag;
} }
@ -424,7 +425,7 @@ public class FlagManager {
* *
* @return AbstractFlag * @return AbstractFlag
*/ */
public static AbstractFlag getFlag(final String string, final boolean create) { public static AbstractFlag getFlag(String string, boolean create) {
if (getFlag(string) == null && create) { if (getFlag(string) == null && create) {
return new AbstractFlag(string); return new AbstractFlag(string);
} }
@ -438,14 +439,14 @@ public class FlagManager {
* *
* @return boolean Result of operation * @return boolean Result of operation
*/ */
public static boolean removeFlag(final AbstractFlag flag) { public static boolean removeFlag(AbstractFlag flag) {
return flags.remove(flag); return flags.remove(flag);
} }
public static HashMap<String, Flag> parseFlags(final List<String> flagstrings) { public static HashMap<String, Flag> parseFlags(List<String> flagstrings) {
final HashMap<String, Flag> map = new HashMap<>(); HashMap<String, Flag> map = new HashMap<>();
for (final String key : flagstrings) { for (String key : flagstrings) {
final String[] split; String[] split;
if (key.contains(";")) { if (key.contains(";")) {
split = key.split(";"); split = key.split(";");
} else { } else {

View File

@ -1,56 +1,61 @@
package com.intellectualcrafters.plot.flag; package com.intellectualcrafters.plot.flag;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import com.intellectualcrafters.plot.object.PlotBlock; import com.intellectualcrafters.plot.object.PlotBlock;
import com.intellectualcrafters.plot.util.StringComparison; import com.intellectualcrafters.plot.util.StringComparison;
import com.intellectualcrafters.plot.util.StringMan; import com.intellectualcrafters.plot.util.StringMan;
import com.intellectualcrafters.plot.util.WorldUtil; import com.intellectualcrafters.plot.util.WorldUtil;
/** import java.util.ArrayList;
* Created 2014-11-17 for PlotSquared import java.util.Arrays;
* import java.util.HashSet;
*/ import java.util.List;
public abstract class FlagValue<T> { public abstract class FlagValue<T> {
private final Class<T> clazz; private final Class<T> clazz;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public FlagValue() { public FlagValue() {
this.clazz = (Class<T>) getClass(); this.clazz = (Class<T>) getClass();
} }
public FlagValue(final Class<T> clazz) { public FlagValue(Class<T> clazz) {
if (clazz == null) { if (clazz == null) {
throw new NullPointerException(); throw new NullPointerException();
} }
this.clazz = clazz; this.clazz = clazz;
} }
public boolean validValue(final Object value) { public boolean validValue(Object value) {
return (value != null) && (value.getClass() == this.clazz); return (value != null) && (value.getClass() == this.clazz);
} }
public String toString(final Object t) { public String toString(Object t) {
return t.toString(); return t.toString();
} }
public abstract T getValue(final Object t); public abstract T getValue(Object t);
public abstract T parse(final String t); public abstract T parse(String t);
public abstract String getDescription(); public abstract String getDescription();
public interface ListValue extends Cloneable {
void add(Object t, String value);
void remove(Object t, String value);
}
public static class BooleanValue extends FlagValue<Boolean> { public static class BooleanValue extends FlagValue<Boolean> {
@Override @Override
public Boolean getValue(final Object t) { public Boolean getValue(Object t) {
return (Boolean) t; return (Boolean) t;
} }
@Override @Override
public Boolean parse(final String t) { public Boolean parse(String t) {
switch (t.toLowerCase()) { switch (t.toLowerCase()) {
case "1": case "1":
case "yes": case "yes":
@ -69,202 +74,210 @@ public abstract class FlagValue<T> {
} }
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a boolean (true|false)"; return "Flag value must be a boolean (true|false)";
} }
} }
public static class IntegerValue extends FlagValue<Integer> { public static class IntegerValue extends FlagValue<Integer> {
@Override @Override
public Integer getValue(final Object t) { public Integer getValue(Object t) {
return (Integer) t; return (Integer) t;
} }
@Override @Override
public Integer parse(final String t) { public Integer parse(String t) {
try { try {
return Integer.parseInt(t); return Integer.parseInt(t);
} catch (final IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a whole number"; return "Flag value must be a whole number";
} }
} }
public static class IntervalValue extends FlagValue<Integer[]> { public static class IntervalValue extends FlagValue<Integer[]> {
@Override @Override
public String toString(final Object t) { public String toString(Object t) {
final Integer[] value = ((Integer[]) t); Integer[] value = (Integer[]) t;
return value[0] + " " + value[1]; return value[0] + " " + value[1];
} }
@Override @Override
public Integer[] getValue(final Object t) { public Integer[] getValue(Object t) {
return (Integer[]) t; return (Integer[]) t;
} }
@Override @Override
public Integer[] parse(final String t) { public Integer[] parse(String t) {
int seconds; int seconds;
int amount; int amount;
final String[] values = t.split(" "); String[] values = t.split(" ");
if (values.length < 2) { if (values.length < 2) {
seconds = 1; seconds = 1;
try { try {
amount = Integer.parseInt(values[0]); amount = Integer.parseInt(values[0]);
} catch (final Exception e) { } catch (Exception e) {
return null; return null;
} }
} else { } else {
try { try {
amount = Integer.parseInt(values[0]); amount = Integer.parseInt(values[0]);
seconds = Integer.parseInt(values[1]); seconds = Integer.parseInt(values[1]);
} catch (final Exception e) { } catch (Exception e) {
return null; return null;
} }
} }
return new Integer[] { amount, seconds }; return new Integer[]{amount, seconds};
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Value(s) must be numeric. /plot set flag <flag> <interval> [amount]"; return "Value(s) must be numeric. /plot set flag <flag> <interval> [amount]";
} }
} }
public static class UnsignedIntegerValue extends FlagValue<Integer> { public static class UnsignedIntegerValue extends FlagValue<Integer> {
@Override @Override
public Integer getValue(final Object t) { public Integer getValue(Object t) {
return (Integer) t; return (Integer) t;
} }
@Override @Override
public Integer parse(final String t) { public Integer parse(String t) {
try { try {
final int value = Integer.parseInt(t); int value = Integer.parseInt(t);
if (value < 0) { if (value < 0) {
return null; return null;
} }
return value; return value;
} catch (final IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a positive whole number (includes 0)"; return "Flag value must be a positive whole number (includes 0)";
} }
} }
public static class DoubleValue extends FlagValue<Double> { public static class DoubleValue extends FlagValue<Double> {
@Override @Override
public Double getValue(final Object t) { public Double getValue(Object t) {
return (Double) t; return (Double) t;
} }
@Override @Override
public Double parse(final String t) { public Double parse(String t) {
try { try {
return Double.parseDouble(t); return Double.parseDouble(t);
} catch (final IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a number (negative decimals are allowed)"; return "Flag value must be a number (negative decimals are allowed)";
} }
} }
public static class LongValue extends FlagValue<Long> { public static class LongValue extends FlagValue<Long> {
@Override @Override
public Long getValue(final Object t) { public Long getValue(Object t) {
return (Long) t; return (Long) t;
} }
@Override @Override
public Long parse(final String t) { public Long parse(String t) {
try { try {
return Long.parseLong(t); return Long.parseLong(t);
} catch (final IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a whole number (large numbers allowed)"; return "Flag value must be a whole number (large numbers allowed)";
} }
} }
public static class UnsignedLongValue extends FlagValue<Long> { public static class UnsignedLongValue extends FlagValue<Long> {
@Override @Override
public Long getValue(final Object t) { public Long getValue(Object t) {
return (Long) t; return (Long) t;
} }
@Override @Override
public Long parse(final String t) { public Long parse(String t) {
try { try {
final long value = Long.parseLong(t); long value = Long.parseLong(t);
if (value < 0) { if (value < 0) {
return null; return null;
} }
return value; return value;
} catch (final IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a positive whole number (large numbers allowed)"; return "Flag value must be a positive whole number (large numbers allowed)";
} }
} }
public static class UnsignedDoubleValue extends FlagValue<Double> { public static class UnsignedDoubleValue extends FlagValue<Double> {
@Override @Override
public Double getValue(final Object t) { public Double getValue(Object t) {
return (Double) t; return (Double) t;
} }
@Override @Override
public Double parse(final String t) { public Double parse(String t) {
try { try {
final double value = Double.parseDouble(t); double value = Double.parseDouble(t);
if (value < 0) { if (value < 0) {
return null; return null;
} }
return value; return value;
} catch (final IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a positive number (decimals allowed)"; return "Flag value must be a positive number (decimals allowed)";
} }
} }
public static class PlotBlockValue extends FlagValue<PlotBlock> { public static class PlotBlockValue extends FlagValue<PlotBlock> {
@Override @Override
public PlotBlock getValue(final Object t) { public PlotBlock getValue(Object t) {
return (PlotBlock) t; return (PlotBlock) t;
} }
@Override @Override
public PlotBlock parse(final String t) { public PlotBlock parse(String t) {
try { try {
final String[] split = t.split(":"); String[] split = t.split(":");
byte data; byte data;
if (split.length == 2) { if (split.length == 2) {
if ("*".equals(split[1])) { if ("*".equals(split[1])) {
@ -275,49 +288,44 @@ public abstract class FlagValue<T> {
} else { } else {
data = -1; data = -1;
} }
final short id = Short.parseShort(split[0]); short id = Short.parseShort(split[0]);
return new PlotBlock(id, data); return new PlotBlock(id, data);
} catch (final Exception e) { } catch (Exception e) {
final StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(t); StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(t);
if ((value == null) || (value.match > 1)) { if ((value == null) || (value.match > 1)) {
return null; return null;
} }
return value.best; return value.best;
} }
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a number (negative decimals are allowed)"; return "Flag value must be a number (negative decimals are allowed)";
} }
} }
public interface ListValue extends Cloneable {
void add(final Object t, final String value);
void remove(final Object t, final String value);
}
public static class PlotBlockListValue extends FlagValue<HashSet<PlotBlock>> implements ListValue { public static class PlotBlockListValue extends FlagValue<HashSet<PlotBlock>> implements ListValue {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public String toString(final Object t) { public String toString(Object t) {
return StringMan.join((HashSet<PlotBlock>) t, ","); return StringMan.join((HashSet<PlotBlock>) t, ",");
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public HashSet<PlotBlock> getValue(final Object t) { public HashSet<PlotBlock> getValue(Object t) {
return (HashSet<PlotBlock>) t; return (HashSet<PlotBlock>) t;
} }
@Override @Override
public HashSet<PlotBlock> parse(final String t) { public HashSet<PlotBlock> parse(String t) {
final HashSet<PlotBlock> list = new HashSet<PlotBlock>(); HashSet<PlotBlock> list = new HashSet<PlotBlock>();
for (final String item : t.split(",")) { for (String item : t.split(",")) {
PlotBlock block; PlotBlock block;
try { try {
final String[] split = item.split(":"); String[] split = item.split(":");
byte data; byte data;
if (split.length == 2) { if (split.length == 2) {
if ("*".equals(split[1])) { if ("*".equals(split[1])) {
@ -328,10 +336,10 @@ public abstract class FlagValue<T> {
} else { } else {
data = -1; data = -1;
} }
final short id = Short.parseShort(split[0]); short id = Short.parseShort(split[0]);
block = new PlotBlock(id, data); block = new PlotBlock(id, data);
} catch (Exception e) { } catch (Exception e) {
final StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(t); StringComparison<PlotBlock>.ComparisonResult value = WorldUtil.IMP.getClosestBlock(t);
if ((value == null) || (value.match > 1)) { if ((value == null) || (value.match > 1)) {
continue; continue;
} }
@ -341,172 +349,187 @@ public abstract class FlagValue<T> {
} }
return list; return list;
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a block list"; return "Flag value must be a block list";
} }
@Override @Override
public void add(final Object t, final String value) { public void add(Object t, String value) {
try { try {
((HashSet<PlotBlock>) t).addAll(parse(value)); ((HashSet<PlotBlock>) t).addAll(parse(value));
} catch (final Exception e) {} } catch (Exception ignored) {
//ignored
}
} }
@Override @Override
public void remove(final Object t, final String value) { public void remove(Object t, String value) {
try { try {
for (final PlotBlock item : parse(value)) { for (PlotBlock item : parse(value)) {
((HashSet<PlotBlock>) t).remove(item); ((HashSet<PlotBlock>) t).remove(item);
} }
} catch (final Exception e) {} } catch (Exception ignored) {
//ignored
}
} }
} }
public static class IntegerListValue extends FlagValue<List<Integer>> implements ListValue { public static class IntegerListValue extends FlagValue<List<Integer>> implements ListValue {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public String toString(final Object t) { public String toString(Object t) {
return StringMan.join((List<Integer>) t, ","); return StringMan.join((List<Integer>) t, ",");
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public List<Integer> getValue(final Object t) { public List<Integer> getValue(Object t) {
return (List<Integer>) t; return (List<Integer>) t;
} }
@Override @Override
public List<Integer> parse(final String t) { public List<Integer> parse(String t) {
final String[] split = (t.split(",")); String[] split = t.split(",");
final ArrayList<Integer> numbers = new ArrayList<Integer>(); ArrayList<Integer> numbers = new ArrayList<Integer>();
for (final String element : split) { for (String element : split) {
numbers.add(Integer.parseInt(element)); numbers.add(Integer.parseInt(element));
} }
return numbers; return numbers;
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a integer list"; return "Flag value must be a integer list";
} }
@Override @Override
public void add(final Object t, final String value) { public void add(Object t, String value) {
try { try {
((List<Integer>) t).addAll(parse(value)); ((List<Integer>) t).addAll(parse(value));
} catch (final Exception e) {} } catch (Exception ignored) {
//ignored
}
} }
@Override @Override
public void remove(final Object t, final String value) { public void remove(Object t, String value) {
try { try {
for (final Integer item : parse(value)) { for (Integer item : parse(value)) {
((List<Integer>) t).remove(item); ((List<Integer>) t).remove(item);
} }
} catch (final Exception e) {} } catch (Exception ignored) {
//ignored
}
} }
} }
@SuppressWarnings("ALL") @SuppressWarnings("ALL")
public static class StringListValue extends FlagValue<List<String>> implements ListValue { public static class StringListValue extends FlagValue<List<String>> implements ListValue {
@Override @Override
public String toString(final Object t) { public String toString(final Object t) {
return StringMan.join((List<String>) t, ","); return StringMan.join((List<String>) t, ",");
} }
@Override @Override
public List<String> getValue(final Object t) { public List<String> getValue(final Object t) {
return (List<String>) t; return (List<String>) t;
} }
@Override @Override
public List<String> parse(final String t) { public List<String> parse(final String t) {
return Arrays.asList(t.split(",")); return Arrays.asList(t.split(","));
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a string list"; return "Flag value must be a string list";
} }
@Override @Override
public void add(final Object t, final String value) { public void add(final Object t, final String value) {
try { try {
((List<String>) t).addAll(parse(value)); ((List<String>) t).addAll(parse(value));
} catch (final Exception ignored) {} } catch (final Exception ignored) {
}
} }
@Override @Override
public void remove(final Object t, final String value) { public void remove(final Object t, final String value) {
try { try {
for (final String item : parse(value)) { for (final String item : parse(value)) {
((List<String>) t).remove(item); ((List<String>) t).remove(item);
} }
} catch (final Exception e) {} } catch (final Exception e) {
}
} }
} }
public static class DoubleListValue extends FlagValue<List<Double>> implements ListValue { public static class DoubleListValue extends FlagValue<List<Double>> implements ListValue {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public String toString(final Object t) { public String toString(Object t) {
return StringMan.join((List<Double>) t, ","); return StringMan.join((List<Double>) t, ",");
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public List<Double> getValue(final Object t) { public List<Double> getValue(Object t) {
return (List<Double>) t; return (List<Double>) t;
} }
@Override @Override
public List<Double> parse(final String t) { public List<Double> parse(String t) {
final String[] split = (t.split(",")); String[] split = t.split(",");
final ArrayList<Double> numbers = new ArrayList<Double>(); ArrayList<Double> numbers = new ArrayList<Double>();
for (final String element : split) { for (String element : split) {
numbers.add(Double.parseDouble(element)); numbers.add(Double.parseDouble(element));
} }
return numbers; return numbers;
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be a integer list"; return "Flag value must be a integer list";
} }
@Override @Override
public void add(final Object t, final String value) { public void add(Object t, String value) {
try { try {
((List<Double>) t).addAll(parse(value)); ((List<Double>) t).addAll(parse(value));
} catch (final Exception e) {} } catch (Exception e) {
}
} }
@Override @Override
public void remove(final Object t, final String value) { public void remove(Object t, String value) {
try { try {
for (final Double item : parse(value)) { for (Double item : parse(value)) {
((List<Double>) t).remove(item); ((List<Double>) t).remove(item);
} }
} catch (final Exception e) {} } catch (Exception e) {
}
} }
} }
public static class StringValue extends FlagValue<String> { public static class StringValue extends FlagValue<String> {
@Override @Override
public String parse(final String s) { public String parse(String s) {
return s; return s;
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Flag value must be alphanumeric. Some special characters are allowed."; return "Flag value must be alphanumeric. Some special characters are allowed.";
} }
@Override @Override
public String getValue(final Object t) { public String getValue(Object t) {
return t.toString(); return t.toString();
} }
} }

View File

@ -42,7 +42,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
public boolean ROAD_SCHEMATIC_ENABLED; public boolean ROAD_SCHEMATIC_ENABLED;
public short SCHEMATIC_HEIGHT; public short SCHEMATIC_HEIGHT;
public boolean PLOT_SCHEMATIC = false; public boolean PLOT_SCHEMATIC = false;
public short REQUIRED_CHANGES = 0;
public short PATH_WIDTH_LOWER; public short PATH_WIDTH_LOWER;
public short PATH_WIDTH_UPPER; public short PATH_WIDTH_UPPER;
public HashMap<Integer, HashMap<Integer, PlotBlock>> G_SCH; public HashMap<Integer, HashMap<Integer, PlotBlock>> G_SCH;

View File

@ -1,27 +1,29 @@
package com.intellectualcrafters.plot.object; package com.intellectualcrafters.plot.object;
public class BlockLoc { public class BlockLoc {
public int x;
public int y; public final int x;
public int z; public final int y;
public final int z;
public float yaw, pitch;
public final float yaw;
public BlockLoc(final int x, final int y, final int z, final float yaw, final float pitch) { public final float pitch;
public BlockLoc(int x, int y, int z, float yaw, float pitch) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
this.yaw = yaw; this.yaw = yaw;
this.pitch = pitch; this.pitch = pitch;
} }
public BlockLoc(final int x, final int y, final int z) { public BlockLoc(int x, int y, int z) {
this(x, y, z, 0f, 0f); this(x, y, z, 0f, 0f);
} }
public static BlockLoc fromString(final String string) { public static BlockLoc fromString(String string) {
final String[] parts = string.split(","); String[] parts = string.split(",");
float yaw, pitch; float yaw, pitch;
if (parts.length == 3) { if (parts.length == 3) {
@ -34,44 +36,44 @@ public class BlockLoc {
} else { } else {
return new BlockLoc(0, 0, 0); return new BlockLoc(0, 0, 0);
} }
final int x = Integer.parseInt(parts[0]); int x = Integer.parseInt(parts[0]);
final int y = Integer.parseInt(parts[1]); int y = Integer.parseInt(parts[1]);
final int z = Integer.parseInt(parts[2]); int z = Integer.parseInt(parts[2]);
return new BlockLoc(x, y, z, yaw, pitch); return new BlockLoc(x, y, z, yaw, pitch);
} }
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; int prime = 31;
int result = 1; int result = 1;
result = prime * result + x; result = prime * result + this.x;
result = prime * result + y; result = prime * result + this.y;
result = prime * result + z; result = prime * result + this.z;
return result; return result;
} }
@Override @Override
public boolean equals(final Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
return true; return true;
} }
if (obj == null) { if (obj == null) {
return x == 0 && y == 0 && z == 0; return this.x == 0 && this.y == 0 && this.z == 0;
} }
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) {
return false; return false;
} }
final BlockLoc other = (BlockLoc) obj; BlockLoc other = (BlockLoc) obj;
return x == other.x && y == other.y && z == other.z; return this.x == other.x && this.y == other.y && this.z == other.z;
} }
@Override @Override
public String toString() { public String toString() {
if (x == 0 && y == 0 && z == 0) { if (this.x == 0 && this.y == 0 && this.z == 0) {
return ""; return "";
} }
return x + "," + y + "," + z + "," + yaw + "," + pitch; return this.x + "," + this.y + "," + this.z + "," + this.yaw + "," + this.pitch;
} }
} }

View File

@ -1,67 +0,0 @@
////////////////////////////////////////////////////////////////////////////////////////////////////
// PlotSquared - A plot manager and world generator for the Bukkit API /
// Copyright (c) 2014 IntellectualSites/IntellectualCrafters /
// /
// This program is free software; you can redistribute it and/or modify /
// it under the terms of the GNU General Public License as published by /
// the Free Software Foundation; either version 3 of the License, or /
// (at your option) any later version. /
// /
// This program is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /
// GNU General Public License for more details. /
// /
// You should have received a copy of the GNU General Public License /
// along with this program; if not, write to the Free Software Foundation, /
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA /
// /
// You can contact us via: support@intellectualsites.com /
////////////////////////////////////////////////////////////////////////////////////////////////////
package com.intellectualcrafters.plot.object;
/**
* Wrapper class for blocks, using pure data rather than the object.
*
* Useful for NMS
*
*/
public class BlockWrapper {
/**
* X Coordinate
*/
public final int x;
/**
* Y Coordinate
*/
public final int y;
/**
* Z Coordinate
*/
public final int z;
/**
* Block ID
*/
public final int id;
/**
* Block Data Value
*/
public final byte data;
/**
* Constructor
*
* @param x X Loc Value
* @param y Y Loc Value
* @param z Z Loc Value
* @param id Material ID
* @param data Data Value
*/
public BlockWrapper(final int x, final int y, final int z, final short id, final byte data) {
this.x = x;
this.y = y;
this.z = z;
this.id = id;
this.data = data;
}
}

View File

@ -2,8 +2,8 @@ package com.intellectualcrafters.plot.object;
public class FileBytes { public class FileBytes {
public String path; public final String path;
public byte[] data; public final byte[] data;
public FileBytes(String path, byte[] data) { public FileBytes(String path, byte[] data) {
this.path = path; this.path = path;

View File

@ -419,19 +419,19 @@ public class Plot {
} }
/** /**
* Should the player be denied from entering? * Should the player be denied from entering.
* *
* @param uuid * @param uuid
* *
* @return boolean false if the player is allowed to enter * @return boolean false if the player is allowed to enter
*/ */
public boolean isDenied(UUID uuid) { public boolean isDenied(UUID uuid) {
return this.denied != null && (this.denied.contains(DBFunc.everyone) && !this.isAdded(uuid) || return this.denied != null && (this.denied.contains(DBFunc.everyone) && !this.isAdded(uuid)
!this.isAdded(uuid) && this.denied.contains(uuid)); || !this.isAdded(uuid) && this.denied.contains(uuid));
} }
/** /**
* Get the plot ID * Get the {@link PlotId}.
*/ */
public PlotId getId() { public PlotId getId() {
return this.id; return this.id;

View File

@ -518,12 +518,11 @@ public class PlotAnalysis {
bucket[i] = new ArrayList<Integer>(); bucket[i] = new ArrayList<Integer>();
} }
boolean maxLength = false; boolean maxLength = false;
int tmp;
int placement = 1; int placement = 1;
while (!maxLength) { while (!maxLength) {
maxLength = true; maxLength = true;
for (Integer i : input) { for (Integer i : input) {
tmp = i / placement; int tmp = i / placement;
bucket[tmp % SIZE].add(i); bucket[tmp % SIZE].add(i);
if (maxLength && tmp > 0) { if (maxLength && tmp > 0) {
maxLength = false; maxLength = false;

View File

@ -397,7 +397,7 @@ public abstract class PlotArea {
public abstract ConfigurationNode[] getSettingNodes(); public abstract ConfigurationNode[] getSettingNodes();
/** /**
* Get the Plot at a location * Get the Plot at a location.
* @param location * @param location
* @return Plot * @return Plot
*/ */
@ -410,7 +410,7 @@ public abstract class PlotArea {
} }
/** /**
* Get the base plot at a location * Get the base plot at a location.
* @param location * @param location
* @return base Plot * @return base Plot
*/ */
@ -423,7 +423,7 @@ public abstract class PlotArea {
} }
/** /**
* Get the base owned plot at a location * Get the base owned plot at a location.
* @param location * @param location
* @return base Plot or null * @return base Plot or null
*/ */
@ -437,7 +437,7 @@ public abstract class PlotArea {
} }
/** /**
* Get the owned plot at a location * Get the owned plot at a location.
* @param location * @param location
* @return Plot or null * @return Plot or null
*/ */
@ -450,7 +450,7 @@ public abstract class PlotArea {
} }
/** /**
* Get the owned Plot at a PlotId * Get the owned Plot at a PlotId.
* @param id * @param id
* @return Plot or null * @return Plot or null
*/ */

View File

@ -1,49 +1,45 @@
package com.intellectualcrafters.plot.object.comment; package com.intellectualcrafters.plot.object.comment;
import java.util.List;
import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.DBFunc;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotHandler;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.RunnableVal; import com.intellectualcrafters.plot.object.RunnableVal;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.TaskManager; import com.intellectualcrafters.plot.util.TaskManager;
import java.util.List;
public class InboxReport extends CommentInbox { public class InboxReport extends CommentInbox {
@Override @Override
public boolean canRead(final Plot plot, final PlotPlayer player) { public boolean canRead(Plot plot, PlotPlayer player) {
if (plot == null) { if (plot == null) {
return Permissions.hasPermission(player, "plots.inbox.read." + toString()); return Permissions.hasPermission(player, "plots.inbox.read." + toString());
} }
return (Permissions.hasPermission(player, "plots.inbox.read." + toString()) && (plot.isOwner(player.getUUID()) || Permissions.hasPermission(player, "plots.inbox.read." return Permissions.hasPermission(player, "plots.inbox.read." + toString()) && (plot.isOwner(player.getUUID()) || Permissions
+ toString() .hasPermission(player, "plots.inbox.read." + toString() + ".other"));
+ ".other")));
} }
@Override @Override
public boolean canWrite(final Plot plot, final PlotPlayer player) { public boolean canWrite(Plot plot, PlotPlayer player) {
if (plot == null) { if (plot == null) {
return Permissions.hasPermission(player, "plots.inbox.write." + toString()); return Permissions.hasPermission(player, "plots.inbox.write." + toString());
} }
return (Permissions.hasPermission(player, "plots.inbox.write." + toString()) && (plot.isOwner(player.getUUID()) || Permissions.hasPermission(player, "plots.inbox.write." return Permissions.hasPermission(player, "plots.inbox.write." + toString()) && (plot.isOwner(player.getUUID()) || Permissions
+ toString() .hasPermission(player, "plots.inbox.write." + toString() + ".other"));
+ ".other")));
} }
@Override @Override
public boolean canModify(final Plot plot, final PlotPlayer player) { public boolean canModify(Plot plot, PlotPlayer player) {
if (plot == null) { if (plot == null) {
return Permissions.hasPermission(player, "plots.inbox.modify." + toString()); return Permissions.hasPermission(player, "plots.inbox.modify." + toString());
} }
return (Permissions.hasPermission(player, "plots.inbox.modify." + toString()) && (plot.isOwner(player.getUUID()) || Permissions.hasPermission(player, "plots.inbox.modify." return Permissions.hasPermission(player, "plots.inbox.modify." + toString()) && (plot.isOwner(player.getUUID()) || Permissions
+ toString() .hasPermission(player, "plots.inbox.modify." + toString() + ".other"));
+ ".other")));
} }
@Override @Override
public boolean getComments(final Plot plot, final RunnableVal whenDone) { public boolean getComments(Plot plot, final RunnableVal whenDone) {
DBFunc.getComments(null, toString(), new RunnableVal<List<PlotComment>>() { DBFunc.getComments(null, toString(), new RunnableVal<List<PlotComment>>() {
@Override @Override
public void run(List<PlotComment> value) { public void run(List<PlotComment> value) {
@ -53,32 +49,32 @@ public class InboxReport extends CommentInbox {
}); });
return true; return true;
} }
@Override @Override
public boolean addComment(final Plot plot, final PlotComment comment) { public boolean addComment(Plot plot, PlotComment comment) {
if ((plot == null) || (plot.owner == null)) { if ((plot == null) || (plot.owner == null)) {
return false; return false;
} }
DBFunc.setComment(plot, comment); DBFunc.setComment(plot, comment);
return true; return true;
} }
@Override @Override
public String toString() { public String toString() {
return "report"; return "report";
} }
@Override @Override
public boolean removeComment(final Plot plot, final PlotComment comment) { public boolean removeComment(Plot plot, PlotComment comment) {
if ((plot == null) || (plot.owner == null)) { if (plot == null || plot.owner == null) {
return false; return false;
} }
DBFunc.removeComment(plot, comment); DBFunc.removeComment(plot, comment);
return false; return false;
} }
@Override @Override
public boolean clearInbox(final Plot plot) { public boolean clearInbox(Plot plot) {
if ((plot == null) || (plot.owner == null)) { if ((plot == null) || (plot.owner == null)) {
return false; return false;
} }

View File

@ -33,7 +33,7 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
public class BO3Handler { public class BO3Handler {
/** /**
* @see #saveBO3(PlotPlayer, Plot, RunnableVal) * @see #saveBO3(PlotPlayer, Plot, RunnableVal)
* @param plot * @param plot
@ -60,7 +60,7 @@ public class BO3Handler {
} }
return false; return false;
} }
/** /**
* Save a plot as a BO3 file<br> * Save a plot as a BO3 file<br>
* - Use null for the player object if no player is applicable * - Use null for the player object if no player is applicable
@ -88,7 +88,7 @@ public class BO3Handler {
int cz = (bot.getZ() + top.getZ()) / 2; int cz = (bot.getZ() + top.getZ()) / 2;
HashMap<ChunkLoc, BO3> map = new HashMap<>(); HashMap<ChunkLoc, BO3> map = new HashMap<>();
HashSet<RegionWrapper> regions = plot.getRegions(); HashSet<RegionWrapper> regions = plot.getRegions();
ArrayList<ChunkLoc> chunks = new ArrayList<>(); ArrayList<ChunkLoc> chunks = new ArrayList<>();
for (RegionWrapper region : regions) { for (RegionWrapper region : regions) {
@ -148,7 +148,7 @@ public class BO3Handler {
} }
} }
} }
if (!content) { if (!content) {
MainUtil.sendMessage(plr, "No content found!"); MainUtil.sendMessage(plr, "No content found!");
return false; return false;
@ -177,7 +177,8 @@ public class BO3Handler {
} }
} }
if (parentLoc == null) { if (parentLoc == null) {
MainUtil.sendMessage(plr, "Exporting BO3 cancelled due to detached chunk: " + chunk + " - Make sure you only have one object per plot"); MainUtil.sendMessage(plr,
"Exporting BO3 cancelled due to detached chunk: " + chunk + " - Make sure you only have one object per plot");
return false; return false;
} }
} }
@ -187,7 +188,7 @@ public class BO3Handler {
for (Entry<ChunkLoc, BO3> entry : map.entrySet()) { for (Entry<ChunkLoc, BO3> entry : map.entrySet()) {
saveTask.run(entry.getValue()); saveTask.run(entry.getValue());
} }
MainUtil.sendMessage(plr, "BO3 exporting was successful!"); MainUtil.sendMessage(plr, "BO3 exporting was successful!");
return true; return true;
} }
@ -211,8 +212,7 @@ public class BO3Handler {
} }
} }
}); });
} } catch (IOException e) {
catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
whenDone.run(); whenDone.run();
return; return;
@ -239,7 +239,7 @@ public class BO3Handler {
String result = StringMan String result = StringMan
.replaceAll(line, "%owner%", MainUtil.getName(plot.owner), "%alias%", plot.toString(), "%blocks%", bo3.getBlocks(), "%branches%", .replaceAll(line, "%owner%", MainUtil.getName(plot.owner), "%alias%", plot.toString(), "%blocks%", bo3.getBlocks(), "%branches%",
bo3.getChildren(), bo3.getChildren(),
"%flags%", StringMan.join(FlagManager.getPlotFlags(plot).values(), ",")); "%flags%", StringMan.join(FlagManager.getPlotFlags(plot).values(), ","));
if (!StringMan.isEqual(result, line)) { if (!StringMan.isEqual(result, line)) {
lines.set(i, result); lines.set(i, result);
} }

View File

@ -5,21 +5,22 @@ import com.intellectualcrafters.plot.object.CmdInstance;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
public class CmdConfirm { public class CmdConfirm {
public static CmdInstance getPending(final PlotPlayer player) {
public static CmdInstance getPending(PlotPlayer player) {
return player.getMeta("cmdConfirm"); return player.getMeta("cmdConfirm");
} }
public static void removePending(final PlotPlayer player) { public static void removePending(PlotPlayer player) {
player.deleteMeta("cmdConfirm"); player.deleteMeta("cmdConfirm");
} }
public static void addPending(final PlotPlayer player, final String commandStr, final Runnable runnable) { public static void addPending(final PlotPlayer player, String commandStr, final Runnable runnable) {
removePending(player); removePending(player);
MainUtil.sendMessage(player, C.REQUIRES_CONFIRM, commandStr); MainUtil.sendMessage(player, C.REQUIRES_CONFIRM, commandStr);
TaskManager.runTaskLater(new Runnable() { TaskManager.runTaskLater(new Runnable() {
@Override @Override
public void run() { public void run() {
final CmdInstance cmd = new CmdInstance(runnable); CmdInstance cmd = new CmdInstance(runnable);
player.setMeta("cmdConfirm", cmd); player.setMeta("cmdConfirm", cmd);
} }
}, 1); }, 1);

View File

@ -17,8 +17,9 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public class CommentManager { public class CommentManager {
public static HashMap<String, CommentInbox> inboxes = new HashMap<>(); public static HashMap<String, CommentInbox> inboxes = new HashMap<>();
public static void sendTitle(final PlotPlayer player, final Plot plot) { public static void sendTitle(final PlotPlayer player, final Plot plot) {
if (!Settings.COMMENT_NOTIFICATIONS) { if (!Settings.COMMENT_NOTIFICATIONS) {
return; return;
@ -29,7 +30,7 @@ public class CommentManager {
TaskManager.runTaskLaterAsync(new Runnable() { TaskManager.runTaskLaterAsync(new Runnable() {
@Override @Override
public void run() { public void run() {
final Collection<CommentInbox> boxes = CommentManager.inboxes.values(); Collection<CommentInbox> boxes = CommentManager.inboxes.values();
final AtomicInteger count = new AtomicInteger(0); final AtomicInteger count = new AtomicInteger(0);
final AtomicInteger size = new AtomicInteger(boxes.size()); final AtomicInteger size = new AtomicInteger(boxes.size());
for (final CommentInbox inbox : inboxes.values()) { for (final CommentInbox inbox : inboxes.values()) {
@ -39,7 +40,7 @@ public class CommentManager {
int total; int total;
if (value != null) { if (value != null) {
int num = 0; int num = 0;
for (final PlotComment comment : value) { for (PlotComment comment : value) {
if (comment.timestamp > getTimestamp(player, inbox.toString())) { if (comment.timestamp > getTimestamp(player, inbox.toString())) {
num++; num++;
} }
@ -57,19 +58,15 @@ public class CommentManager {
} }
}, 20); }, 20);
} }
public static long getTimestamp(final PlotPlayer player, final String inbox) { public static long getTimestamp(PlotPlayer player, String inbox) {
final Object meta = player.getMeta("inbox:" + inbox); return player.getMeta("inbox:" + inbox, player.getPreviousLogin());
if (meta == null) {
return player.getPreviousLogin();
}
return (Long) meta;
} }
public static void addInbox(final CommentInbox inbox) { public static void addInbox(CommentInbox inbox) {
inboxes.put(inbox.toString().toLowerCase(), inbox); inboxes.put(inbox.toString().toLowerCase(), inbox);
} }
public static void registerDefaultInboxes() { public static void registerDefaultInboxes() {
addInbox(new InboxReport()); addInbox(new InboxReport());
addInbox(new InboxPublic()); addInbox(new InboxPublic());

View File

@ -5,32 +5,27 @@ import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
public abstract class EconHandler { public abstract class EconHandler {
public static EconHandler manager; public static EconHandler manager;
public double getMoney(final PlotPlayer player) { public double getMoney(PlotPlayer player) {
if (ConsolePlayer.isConsole(player)) { if (ConsolePlayer.isConsole(player)) {
return Double.MAX_VALUE; return Double.MAX_VALUE;
} }
return getBalance(player); return getBalance(player);
} }
public abstract double getBalance(PlotPlayer player); public abstract double getBalance(PlotPlayer player);
public abstract void withdrawMoney(final PlotPlayer player, final double amount); public abstract void withdrawMoney(PlotPlayer player, double amount);
public abstract void depositMoney(final PlotPlayer player, final double amount); public abstract void depositMoney(PlotPlayer player, double amount);
public abstract void depositMoney(final OfflinePlotPlayer player, final double amount); public abstract void depositMoney(OfflinePlotPlayer player, double amount);
public void setPermission(final String player, final String perm, final boolean value) { public abstract boolean hasPermission(String world, String player, String perm);
setPermission(null, player, perm, value);
} public boolean hasPermission(String player, String perm) {
public abstract void setPermission(final String world, final String player, final String perm, final boolean value);
public abstract boolean hasPermission(final String world, final String player, final String perm);
public boolean hasPermission(final String player, final String perm) {
return hasPermission(null, player, perm); return hasPermission(null, player, perm);
} }
} }

View File

@ -40,19 +40,21 @@ public class ExpireManager {
} }
public void handleEntry(PlotPlayer pp, Plot plot) { public void handleEntry(PlotPlayer pp, Plot plot) {
if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear") && plotsToDelete.contains(plot) && !isExpired(plot)) { if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")
&& plotsToDelete.contains(plot) && !isExpired(plot)) {
plotsToDelete.remove(plot); plotsToDelete.remove(plot);
confirmExpiry(pp); confirmExpiry(pp);
} }
} }
public long getTimestamp(UUID uuid) { public long getTimestamp(UUID uuid) {
Long value = dates_cache.get(uuid); Long value = this.dates_cache.get(uuid);
return value == null ? 0 : value; return value == null ? 0 : value;
} }
public void confirmExpiry(final PlotPlayer pp) { public void confirmExpiry(final PlotPlayer pp) {
if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")) { if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp
.hasPermission("plots.admin.command.autoclear")) {
final int num = plotsToDelete.size(); final int num = plotsToDelete.size();
for (final Plot current : plotsToDelete) { for (final Plot current : plotsToDelete) {
if (isExpired(current)) { if (isExpired(current)) {
@ -82,10 +84,10 @@ public class ExpireManager {
public boolean cancelTask() { public boolean cancelTask() {
if (running != 2) { if (this.running != 2) {
return false; return false;
} }
running = 1; this.running = 1;
return true; return true;
} }
@ -110,26 +112,26 @@ public class ExpireManager {
} }
}); });
} }
public boolean runTask(final RunnableVal2<Plot, Runnable> expiredTask) { public boolean runTask(final RunnableVal2<Plot, Runnable> expiredTask) {
if (running != 0) { if (this.running != 0) {
return false; return false;
} }
running = 2; this.running = 2;
final Set<Plot> plots = PS.get().getPlots(); final Set<Plot> plots = PS.get().getPlots();
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable() {
@Override @Override
public void run() { public void run() {
if (running != 2) { if (ExpireManager.this.running != 2) {
running = 0; ExpireManager.this.running = 0;
return; return;
} }
final Runnable task = this; final Runnable task = this;
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
Iterator<Plot> iter = plots.iterator(); Iterator<Plot> iter = plots.iterator();
while (iter.hasNext() && System.currentTimeMillis() - start < 2) { while (iter.hasNext() && System.currentTimeMillis() - start < 2) {
if (running != 2) { if (ExpireManager.this.running != 2) {
running = 0; ExpireManager.this.running = 0;
return; return;
} }
final Plot plot = iter.next(); final Plot plot = iter.next();
@ -139,7 +141,7 @@ public class ExpireManager {
} }
PlotArea area = plot.getArea(); PlotArea area = plot.getArea();
if ((Settings.CLEAR_THRESHOLD != -1) && (area.TYPE == 0)) { if ((Settings.CLEAR_THRESHOLD != -1) && (area.TYPE == 0)) {
final PlotAnalysis analysis = plot.getComplexity(); PlotAnalysis analysis = plot.getComplexity();
if (analysis != null) { if (analysis != null) {
if (analysis.getComplexity() > Settings.CLEAR_THRESHOLD) { if (analysis.getComplexity() > Settings.CLEAR_THRESHOLD) {
PS.debug("$2[&5Expire&dManager$2] &bSkipping modified: " + plot); PS.debug("$2[&5Expire&dManager$2] &bSkipping modified: " + plot);
@ -150,7 +152,8 @@ public class ExpireManager {
@Override @Override
public void run(PlotAnalysis changed) { public void run(PlotAnalysis changed) {
if ((changed.changes != 0) && (changed.getComplexity() > Settings.CLEAR_THRESHOLD)) { if ((changed.changes != 0) && (changed.getComplexity() > Settings.CLEAR_THRESHOLD)) {
PS.debug("$2[&5Expire&dManager$2] &bIgnoring modified plot: " + plot + " : " + changed.getComplexity() + " - " + changed.changes); PS.debug("$2[&5Expire&dManager$2] &bIgnoring modified plot: " + plot + " : " + changed.getComplexity() + " - "
+ changed.changes);
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("analysis"), changed.asList())); FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("analysis"), changed.asList()));
TaskManager.runTaskLaterAsync(task, Settings.CLEAR_INTERVAL * 20); TaskManager.runTaskLaterAsync(task, Settings.CLEAR_INTERVAL * 20);
} else { } else {
@ -169,12 +172,12 @@ public class ExpireManager {
return; return;
} }
if (plots.isEmpty()) { if (plots.isEmpty()) {
running = 3; ExpireManager.this.running = 3;
TaskManager.runTaskLater(new Runnable() { TaskManager.runTaskLater(new Runnable() {
@Override @Override
public void run() { public void run() {
if (running == 3) { if (ExpireManager.this.running == 3) {
running = 2; ExpireManager.this.running = 2;
runTask(expiredTask); runTask(expiredTask);
} }
} }
@ -188,7 +191,7 @@ public class ExpireManager {
} }
public void storeDate(UUID uuid, long time) { public void storeDate(UUID uuid, long time) {
dates_cache.put(uuid, time); this.dates_cache.put(uuid, time);
} }
public HashSet<Plot> getPendingExpired() { public HashSet<Plot> getPendingExpired() {
@ -199,22 +202,22 @@ public class ExpireManager {
if (plot.isMerged()) { if (plot.isMerged()) {
plot.unlinkPlot(true, false); plot.unlinkPlot(true, false);
} }
for (final UUID helper : plot.getTrusted()) { for (UUID helper : plot.getTrusted()) {
final PlotPlayer player = UUIDHandler.getPlayer(helper); PlotPlayer player = UUIDHandler.getPlayer(helper);
if (player != null) { if (player != null) {
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.toString()); MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.toString());
} }
} }
for (final UUID helper : plot.getMembers()) { for (UUID helper : plot.getMembers()) {
final PlotPlayer player = UUIDHandler.getPlayer(helper); PlotPlayer player = UUIDHandler.getPlayer(helper);
if (player != null) { if (player != null) {
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.toString()); MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.toString());
} }
} }
plot.deletePlot(whenDone); plot.deletePlot(whenDone);
final PlotAnalysis changed = plot.getComplexity(); PlotAnalysis changed = plot.getComplexity();
final int complexity = changed == null ? 0 : changed.getComplexity(); int complexity = changed == null ? 0 : changed.getComplexity();
final int modified = changed == null ? 0 : changed.changes; int modified = changed == null ? 0 : changed.changes;
PS.debug("$2[&5Expire&dManager$2] &cDeleted expired plot: " + plot + " : " + complexity + " - " + modified); PS.debug("$2[&5Expire&dManager$2] &cDeleted expired plot: " + plot + " : " + complexity + " - " + modified);
PS.debug("$4 - Area: " + plot.getArea()); PS.debug("$4 - Area: " + plot.getArea());
if (plot.hasOwner()) { if (plot.hasOwner()) {
@ -223,14 +226,14 @@ public class ExpireManager {
PS.debug("$4 - Owner: Unowned"); PS.debug("$4 - Owner: Unowned");
} }
} }
public boolean isExpired(final UUID uuid) { public boolean isExpired(UUID uuid) {
if (UUIDHandler.getPlayer(uuid) != null) { if (UUIDHandler.getPlayer(uuid) != null) {
return false; return false;
} }
final String name = UUIDHandler.getName(uuid); String name = UUIDHandler.getName(uuid);
if (name != null) { if (name != null) {
Long last = dates_cache.get(uuid); Long last = this.dates_cache.get(uuid);
if (last == null) { if (last == null) {
OfflinePlotPlayer opp; OfflinePlotPlayer opp;
if (Settings.TWIN_MODE_UUID) { if (Settings.TWIN_MODE_UUID) {
@ -239,7 +242,7 @@ public class ExpireManager {
opp = UUIDHandler.getUUIDWrapper().getOfflinePlayer(name); opp = UUIDHandler.getUUIDWrapper().getOfflinePlayer(name);
} }
if ((last = opp.getLastPlayed()) != 0) { if ((last = opp.getLastPlayed()) != 0) {
dates_cache.put(uuid, last); this.dates_cache.put(uuid, last);
} else { } else {
return false; return false;
} }
@ -247,15 +250,15 @@ public class ExpireManager {
if (last == 0) { if (last == 0) {
return false; return false;
} }
final long compared = System.currentTimeMillis() - last; long compared = System.currentTimeMillis() - last;
if (compared >= TimeUnit.DAYS.toMillis(Settings.AUTO_CLEAR_DAYS)) { if (compared >= TimeUnit.DAYS.toMillis(Settings.AUTO_CLEAR_DAYS)) {
return true; return true;
} }
} }
return false; return false;
} }
public boolean isExpired(final Plot plot) { public boolean isExpired(Plot plot) {
if (!plot.hasOwner() || DBFunc.everyone.equals(plot.owner) || UUIDHandler.getPlayer(plot.owner) != null || plot.getRunning() > 0) { if (!plot.hasOwner() || DBFunc.everyone.equals(plot.owner) || UUIDHandler.getPlayer(plot.owner) != null || plot.getRunning() > 0) {
return false; return false;
} }
@ -274,7 +277,7 @@ public class ExpireManager {
return false; return false;
} }
} }
for (final UUID owner : plot.getOwners()) { for (UUID owner : plot.getOwners()) {
if (!isExpired(owner)) { if (!isExpired(owner)) {
return false; return false;
} }

View File

@ -162,7 +162,7 @@ public class MainUtil {
con.setDoOutput(true); con.setDoOutput(true);
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
try (OutputStream output = con.getOutputStream(); try (OutputStream output = con.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8), true)) { PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8), true)) {
String CRLF = "\r\n"; String CRLF = "\r\n";
writer.append("--" + boundary).append(CRLF); writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF); writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF);
@ -180,22 +180,22 @@ public class MainUtil {
writer.append(CRLF).flush(); writer.append(CRLF).flush();
writer.append("--" + boundary + "--").append(CRLF).flush(); writer.append("--" + boundary + "--").append(CRLF).flush();
} }
// try (Reader response = new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8)) { // try (Reader response = new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8)) {
// final char[] buffer = new char[256]; // final char[] buffer = new char[256];
// final StringBuilder result = new StringBuilder(); // final StringBuilder result = new StringBuilder();
// while (true) { // while (true) {
// final int r = response.read(buffer); // final int r = response.read(buffer);
// if (r < 0) { // if (r < 0) {
// break; // break;
// } // }
// result.append(buffer, 0, r); // result.append(buffer, 0, r);
// } // }
// if (!result.toString().startsWith("Success")) { // if (!result.toString().startsWith("Success")) {
// PS.debug(result); // PS.debug(result);
// } // }
// } catch (IOException e) { // } catch (IOException e) {
// e.printStackTrace(); // e.printStackTrace();
// } // }
int responseCode = ((HttpURLConnection) con).getResponseCode(); int responseCode = ((HttpURLConnection) con).getResponseCode();
if (responseCode == 200) { if (responseCode == 200) {
whenDone.value = url; whenDone.value = url;
@ -272,7 +272,7 @@ public class MainUtil {
case "second": case "second":
case "secs": case "secs":
case "sec": case "sec":
case "s":{ case "s": {
time += nums; time += nums;
} }
} }
@ -366,7 +366,7 @@ public class MainUtil {
min.setZ(pos1.getZ()); min.setZ(pos1.getZ());
} }
} }
return new Location[] { min, max }; return new Location[]{min, max};
} }
/** /**
@ -529,30 +529,6 @@ public class MainUtil {
return new File(base, path); return new File(base, path);
} }
/**
* Set a cuboid in the world to a set of blocks.
* @param world
* @param pos1
* @param pos2
* @param blocks If multiple blocks are provided, the result will be a random mix
*/
public static void setCuboid(String world, Location pos1, Location pos2, PlotBlock[] blocks) {
if (blocks.length == 1) {
setSimpleCuboid(world, pos1, pos2, blocks[0]);
return;
}
for (int y = pos1.getY(); y <= pos2.getY(); y++) {
for (int x = pos1.getX(); x <= pos2.getX(); x++) {
for (int z = pos1.getZ(); z <= pos2.getZ(); z++) {
int i = PseudoRandom.random.random(blocks.length);
PlotBlock block = blocks[i];
SetQueue.IMP.setBlock(world, x, y, z, block);
}
}
}
while (SetQueue.IMP.forceChunkSet());
}
/** /**
* Set a cuboid asynchronously to a set of blocks * Set a cuboid asynchronously to a set of blocks
* @param world * @param world
@ -577,25 +553,7 @@ public class MainUtil {
} }
/** /**
* Set a cuboid to a block * Set a cuboid asynchronously to a block.
* @param world
* @param pos1
* @param pos2
* @param newblock
*/
public static void setSimpleCuboid(String world, Location pos1, Location pos2, PlotBlock newblock) {
for (int y = pos1.getY(); y <= pos2.getY(); y++) {
for (int x = pos1.getX(); x <= pos2.getX(); x++) {
for (int z = pos1.getZ(); z <= pos2.getZ(); z++) {
SetQueue.IMP.setBlock(world, x, y, z, newblock);
}
}
}
while (SetQueue.IMP.forceChunkSet());
}
/**
* Set a cuboid asynchronously to a block
* @param world * @param world
* @param pos1 * @param pos1
* @param pos2 * @param pos2
@ -612,7 +570,7 @@ public class MainUtil {
} }
/** /**
* Synchronously set the biome in a selection * Synchronously set the biome in a selection.
* @param world * @param world
* @param p1x * @param p1x
* @param p1z * @param p1z
@ -626,7 +584,7 @@ public class MainUtil {
} }
/** /**
* Get the highest block at a location * Get the highest block at a location.
* @param world * @param world
* @param x * @param x
* @param z * @param z
@ -662,7 +620,7 @@ public class MainUtil {
} }
/** /**
* Send a message to a player * Send a message to a player.
* @param plr Can be null to represent console, or use ConsolePlayer.getConsole() * @param plr Can be null to represent console, or use ConsolePlayer.getConsole()
* @param msg * @param msg
* @param prefix If the message should be prefixed with the configured prefix * @param prefix If the message should be prefixed with the configured prefix
@ -680,7 +638,7 @@ public class MainUtil {
} }
/** /**
* Send a message to the player * Send a message to the player.
* *
* @param plr Player to receive message * @param plr Player to receive message
* @param c Caption to send * @param c Caption to send

View File

@ -25,8 +25,7 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
/** /**
* String comparison library * String comparison library.
*
*/ */
public class StringComparison<T> { public class StringComparison<T> {
@ -40,37 +39,19 @@ public class StringComparison<T> {
* @param input Input Base Value * @param input Input Base Value
* @param objects Objects to compare * @param objects Objects to compare
*/ */
public StringComparison(final String input, final T[] objects) { public StringComparison(String input, T[] objects) {
init(input, objects); init(input, objects);
} }
public StringComparison(final String input, final Collection<T> objects) { public StringComparison(String input, Collection<T> objects) {
init(input, (T[]) objects.toArray()); init(input, (T[]) objects.toArray());
} }
/** /**
* You should call init(...) when you are ready to get a String comparison value * You should call init(...) when you are ready to get a String comparison value.
*/ */
public StringComparison() {} public StringComparison() {}
public void init(String input, final T[] objects) {
int c;
this.bestMatch = objects[0];
this.bestMatchObject = objects[0];
input = input.toLowerCase();
for (final T o : objects) {
if ((c = compare(input, getString(o).toLowerCase())) < this.match) {
this.match = c;
this.bestMatch = o;
this.bestMatchObject = o;
}
}
}
public String getString(final T o) {
return o.toString();
}
/** /**
* Compare two strings * Compare two strings
* *
@ -79,10 +60,10 @@ public class StringComparison<T> {
* *
* @return match * @return match
*/ */
public static int compare(final String s1, final String s2) { public static int compare(String s1, String s2) {
int distance = StringMan.getLevenshteinDistance(s1, s2); int distance = StringMan.getLevenshteinDistance(s1, s2);
if (s2.contains(s1)) { if (s2.contains(s1)) {
distance -= (Math.min(s1.length(), s2.length())); distance -= Math.min(s1.length(), s2.length());
} }
if (s2.startsWith(s1)) { if (s2.startsWith(s1)) {
distance -= 4; distance -= 4;
@ -97,11 +78,11 @@ public class StringComparison<T> {
* *
* @return ArrayList * @return ArrayList
*/ */
public static ArrayList<String> wLetterPair(final String s) { public static ArrayList<String> wLetterPair(String s) {
final ArrayList<String> aPairs = new ArrayList<>(); ArrayList<String> aPairs = new ArrayList<>();
final String[] wo = s.split("\\s"); String[] wo = s.split("\\s");
for (final String aWo : wo) { for (String aWo : wo) {
final String[] po = sLetterPair(aWo); String[] po = sLetterPair(aWo);
Collections.addAll(aPairs, po); Collections.addAll(aPairs, po);
} }
return aPairs; return aPairs;
@ -114,14 +95,32 @@ public class StringComparison<T> {
* *
* @return Array * @return Array
*/ */
public static String[] sLetterPair(final String s) { public static String[] sLetterPair(String s) {
final int numPair = s.length() - 1; int numPair = s.length() - 1;
final String[] p = new String[numPair]; String[] p = new String[numPair];
for (int i = 0; i < numPair; i++) { for (int i = 0; i < numPair; i++) {
p[i] = s.substring(i, i + 2); p[i] = s.substring(i, i + 2);
} }
return p; return p;
} }
public void init(String input, T[] objects) {
int c;
this.bestMatch = objects[0];
this.bestMatchObject = objects[0];
input = input.toLowerCase();
for (T o : objects) {
if ((c = compare(input, getString(o).toLowerCase())) < this.match) {
this.match = c;
this.bestMatch = o;
this.bestMatchObject = o;
}
}
}
public String getString(T o) {
return o.toString();
}
/** /**
* Get the object * Get the object
@ -163,7 +162,7 @@ public class StringComparison<T> {
* @param match Match value * @param match Match value
* @param best Best Match * @param best Best Match
*/ */
public ComparisonResult(final double match, final T best) { public ComparisonResult(double match, T best) {
this.match = match; this.match = match;
this.best = best; this.best = best;
} }

View File

@ -63,10 +63,10 @@ public abstract class WorldUtil {
@Override @Override
public void run(OutputStream output) { public void run(OutputStream output) {
try (final ZipOutputStream zos = new ZipOutputStream(output)) { try (final ZipOutputStream zos = new ZipOutputStream(output)) {
byte[] buffer = new byte[1024];
File dat = getDat(plot.getArea().worldname); File dat = getDat(plot.getArea().worldname);
Location spawn = getSpawn(plot.getArea().worldname); Location spawn = getSpawn(plot.getArea().worldname);
setSpawn(home); setSpawn(home);
byte[] buffer = new byte[1024];
if (dat != null) { if (dat != null) {
ZipEntry ze = new ZipEntry("world" + File.separator + dat.getName()); ZipEntry ze = new ZipEntry("world" + File.separator + dat.getName());
zos.putNextEntry(ze); zos.putNextEntry(ze);

View File

@ -1,29 +0,0 @@
package com.plotsquared.listener;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
public class HeightLimitExtent extends AbstractDelegateExtent {
private final int max;
private final int min;
public HeightLimitExtent(final int min, final int max, final Extent child) {
super(child);
this.min = min;
this.max = max;
}
@Override
public boolean setBlock(final Vector location, final BaseBlock block) throws WorldEditException {
final int y = location.getBlockY();
if ((y < min) || (y > max)) {
return false;
}
return super.setBlock(location, block);
}
}

View File

@ -6,8 +6,20 @@ import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.flag.Flag; import com.intellectualcrafters.plot.flag.Flag;
import com.intellectualcrafters.plot.flag.FlagManager; import com.intellectualcrafters.plot.flag.FlagManager;
import com.intellectualcrafters.plot.object.*; import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.util.*; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotArea;
import com.intellectualcrafters.plot.object.PlotBlock;
import com.intellectualcrafters.plot.object.PlotId;
import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.StringWrapper;
import com.intellectualcrafters.plot.util.EventUtil;
import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.MathMan;
import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.StringMan;
import com.intellectualcrafters.plot.util.TaskManager;
import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.listener.PlotListener; import com.plotsquared.listener.PlotListener;
import com.plotsquared.sponge.SpongeMain; import com.plotsquared.sponge.SpongeMain;
import com.plotsquared.sponge.object.SpongePlayer; import com.plotsquared.sponge.object.SpongePlayer;
@ -41,8 +53,13 @@ import org.spongepowered.api.event.world.ExplosionEvent.Detonate;
import org.spongepowered.api.text.Text; import org.spongepowered.api.text.Text;
import org.spongepowered.api.world.World; import org.spongepowered.api.world.World;
import java.util.*; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate; import java.util.function.Predicate;
@ -74,7 +91,7 @@ public class MainListener {
*/ */
@Listener @Listener
public void onCommand(final SendCommandEvent event) { public void onCommand(SendCommandEvent event) {
switch (event.getCommand().toLowerCase()) { switch (event.getCommand().toLowerCase()) {
case "plotme": { case "plotme": {
Player source = SpongeUtil.getCause(event.getCause(), Player.class); Player source = SpongeUtil.getCause(event.getCause(), Player.class);
@ -84,7 +101,7 @@ public class MainListener {
if (Settings.USE_PLOTME_ALIAS) { if (Settings.USE_PLOTME_ALIAS) {
SpongeMain.THIS.getGame().getCommandManager().process(source, ("plots " + event.getArguments()).trim()); SpongeMain.THIS.getGame().getCommandManager().process(source, ("plots " + event.getArguments()).trim());
} else { } else {
source.sendMessage(SpongeUtil.getText(C.NOT_USING_PLOTME)); source.sendMessage(SpongeUtil.getText(C.NOT_USING_PLOTME.s()));
} }
event.setCancelled(true); event.setCancelled(true);
} }
@ -92,34 +109,34 @@ public class MainListener {
} }
@Listener @Listener
public void onChat(final MessageEvent event) { public void onChat(MessageEvent event) {
// TODO // TODO
Player player = SpongeUtil.getCause(event.getCause(), Player.class); Player player = SpongeUtil.getCause(event.getCause(), Player.class);
if (player == null) { if (player == null) {
return; return;
} }
final String world = player.getWorld().getName(); String world = player.getWorld().getName();
if (!PS.get().hasPlotArea(world)) { if (!PS.get().hasPlotArea(world)) {
return; return;
} }
final PlotArea plotworld = PS.get().getPlotAreaByString(world); PlotArea plotworld = PS.get().getPlotAreaByString(world);
final PlotPlayer plr = SpongeUtil.getPlayer(player); PlotPlayer plr = SpongeUtil.getPlayer(player);
if (!plotworld.PLOT_CHAT && ((plr.getMeta("chat") == null) || !(Boolean) plr.getMeta("chat"))) { if (!plotworld.PLOT_CHAT && ((plr.getMeta("chat") == null) || !(Boolean) plr.getMeta("chat"))) {
return; return;
} }
final Location loc = SpongeUtil.getLocation(player); Location loc = SpongeUtil.getLocation(player);
final Plot plot = loc.getPlot(); Plot plot = loc.getPlot();
if (plot == null) { if (plot == null) {
return; return;
} }
final Text message = event.getMessage(); Text message = event.getMessage();
// TODO use display name rather than username // TODO use display name rather than username
// - Getting displayname currently causes NPE, so wait until sponge fixes that // - Getting displayname currently causes NPE, so wait until sponge fixes that
final String sender = player.getName(); String sender = player.getName();
final PlotId id = plot.getId(); PlotId id = plot.getId();
final String newMessage = StringMan.replaceAll(C.PLOT_CHAT_FORMAT.s(), "%plot_id%", id.x + ";" + id.y, "%sender%", sender); String newMessage = StringMan.replaceAll(C.PLOT_CHAT_FORMAT.s(), "%plot_id%", id.x + ";" + id.y, "%sender%", sender);
// String forcedMessage = StringMan.replaceAll(C.PLOT_CHAT_FORCED.s(), "%plot_id%", id.x + ";" + id.y, "%sender%", sender); // String forcedMessage = StringMan.replaceAll(C.PLOT_CHAT_FORCED.s(), "%plot_id%", id.x + ";" + id.y, "%sender%", sender);
for (Entry<String, PlotPlayer> entry : UUIDHandler.getPlayers().entrySet()) { for (Entry<String, PlotPlayer> entry : UUIDHandler.getPlayers().entrySet()) {
PlotPlayer user = entry.getValue(); PlotPlayer user = entry.getValue();
@ -132,10 +149,10 @@ public class MainListener {
} else { } else {
continue; continue;
} }
final String[] split = (toSend + " ").split("%msg%"); String[] split = (toSend + " ").split("%msg%");
final List<Text> components = new ArrayList<>(); List<Text> components = new ArrayList<>();
Text prefix = null; Text prefix = null;
for (final String part : split) { for (String part : split) {
if (prefix != null) { if (prefix != null) {
components.add(prefix); components.add(prefix);
} else { } else {
@ -149,14 +166,14 @@ public class MainListener {
} }
@Listener @Listener
public void onBreedEntity(final BreedEntityEvent.Breed event) { public void onBreedEntity(BreedEntityEvent.Breed event) {
final Location loc = SpongeUtil.getLocation(event.getTargetEntity()); Location loc = SpongeUtil.getLocation(event.getTargetEntity());
final String world = loc.getWorld(); String world = loc.getWorld();
final PlotArea plotworld = PS.get().getPlotAreaByString(world); PlotArea plotworld = PS.get().getPlotAreaByString(world);
if (plotworld == null) { if (plotworld == null) {
return; return;
} }
final Plot plot = loc.getPlot(); Plot plot = loc.getPlot();
if (plot == null) { if (plot == null) {
if (loc.isPlotRoad()) { if (loc.isPlotRoad()) {
event.setCancelled(true); event.setCancelled(true);
@ -170,7 +187,7 @@ public class MainListener {
public void onSpawnEntity(SpawnEntityEvent event) throws Exception { public void onSpawnEntity(SpawnEntityEvent event) throws Exception {
World world = event.getTargetWorld(); World world = event.getTargetWorld();
final PlotArea plotworld = PS.get().getPlotAreaByString(world.getName()); PlotArea plotworld = PS.get().getPlotAreaByString(world.getName());
if (plotworld == null) { if (plotworld == null) {
return; return;
} }
@ -178,13 +195,10 @@ public class MainListener {
if (entity instanceof Player) { if (entity instanceof Player) {
return true; return true;
} }
final Location loc = SpongeUtil.getLocation(entity); Location loc = SpongeUtil.getLocation(entity);
final Plot plot = loc.getPlot(); Plot plot = loc.getPlot();
if (plot == null) { if (plot == null) {
if (loc.isPlotRoad()) { return !loc.isPlotRoad();
return false;
}
return true;
} }
// Player player = this.<Player> getCause(event.getCause()); // Player player = this.<Player> getCause(event.getCause());
// TODO selectively cancel depending on spawn reason // TODO selectively cancel depending on spawn reason
@ -195,19 +209,16 @@ public class MainListener {
// } // }
if (entity.getType() == EntityTypes.ITEM) { if (entity.getType() == EntityTypes.ITEM) {
if (FlagManager.isPlotFlagFalse(plot, "item-drop")) { return !FlagManager.isPlotFlagFalse(plot, "item-drop");
return false;
}
return true;
} }
int[] mobs = null; int[] mobs = null;
if (entity instanceof Living) { if (entity instanceof Living) {
if (!plotworld.MOB_SPAWNING) { if (!plotworld.MOB_SPAWNING) {
return false; return false;
} }
final Flag mobCap = FlagManager.getPlotFlagRaw(plot, "mob-cap"); Flag mobCap = FlagManager.getPlotFlagRaw(plot, "mob-cap");
if (mobCap != null) { if (mobCap != null) {
final Integer cap = (Integer) mobCap.getValue(); Integer cap = (Integer) mobCap.getValue();
if (cap == 0) { if (cap == 0) {
return false; return false;
} }
@ -217,9 +228,9 @@ public class MainListener {
} }
} }
if ((entity instanceof Ambient) || (entity instanceof Animal)) { if ((entity instanceof Ambient) || (entity instanceof Animal)) {
final Flag animalFlag = FlagManager.getPlotFlagRaw(plot, "animal-cap"); Flag animalFlag = FlagManager.getPlotFlagRaw(plot, "animal-cap");
if (animalFlag != null) { if (animalFlag != null) {
final int cap = ((Integer) animalFlag.getValue()); int cap = (Integer) animalFlag.getValue();
if (cap == 0) { if (cap == 0) {
return false; return false;
} }
@ -232,9 +243,9 @@ public class MainListener {
} }
} }
if (entity instanceof Monster) { if (entity instanceof Monster) {
final Flag monsterFlag = FlagManager.getPlotFlagRaw(plot, "hostile-cap"); Flag monsterFlag = FlagManager.getPlotFlagRaw(plot, "hostile-cap");
if (monsterFlag != null) { if (monsterFlag != null) {
final int cap = ((Integer) monsterFlag.getValue()); int cap = (Integer) monsterFlag.getValue();
if (cap == 0) { if (cap == 0) {
return false; return false;
} }
@ -249,9 +260,9 @@ public class MainListener {
return true; return true;
} }
if ((entity instanceof Minecart) || (entity instanceof Boat)) { if ((entity instanceof Minecart) || (entity instanceof Boat)) {
final Flag vehicleFlag = FlagManager.getPlotFlagRaw(plot, "vehicle-cap"); Flag vehicleFlag = FlagManager.getPlotFlagRaw(plot, "vehicle-cap");
if (vehicleFlag != null) { if (vehicleFlag != null) {
final int cap = ((Integer) vehicleFlag.getValue()); int cap = (Integer) vehicleFlag.getValue();
if (cap == 0) { if (cap == 0) {
return false; return false;
} }
@ -261,9 +272,9 @@ public class MainListener {
} }
} }
} }
final Flag entityCap = FlagManager.getPlotFlagRaw(plot, "entity-cap"); Flag entityCap = FlagManager.getPlotFlagRaw(plot, "entity-cap");
if (entityCap != null) { if (entityCap != null) {
final Integer cap = (Integer) entityCap.getValue(); Integer cap = (Integer) entityCap.getValue();
if (cap == 0) { if (cap == 0) {
return false; return false;
} }
@ -283,7 +294,7 @@ public class MainListener {
} }
public void onNotifyNeighborBlock(NotifyNeighborBlockEvent event) throws Exception { public void onNotifyNeighborBlock(NotifyNeighborBlockEvent event) throws Exception {
final AtomicBoolean cancelled = new AtomicBoolean(false); AtomicBoolean cancelled = new AtomicBoolean(false);
// SpongeUtil.printCause("physics", event.getCause()); // SpongeUtil.printCause("physics", event.getCause());
// PlotArea area = plotloc.getPlotArea(); // PlotArea area = plotloc.getPlotArea();
// event.filterDirections(new Predicate<Direction>() { // event.filterDirections(new Predicate<Direction>() {
@ -320,7 +331,7 @@ public class MainListener {
@Listener @Listener
public void onInteract(InteractEvent event) throws Exception { public void onInteract(InteractEvent event) throws Exception {
final Player player = SpongeUtil.getCause(event.getCause(), Player.class); Player player = SpongeUtil.getCause(event.getCause(), Player.class);
if (player == null) { if (player == null) {
event.setCancelled(true); event.setCancelled(true);
return; return;
@ -354,7 +365,7 @@ public class MainListener {
if (plot.isAdded(pp.getUUID()) || Permissions.hasPermission(pp, C.PERMISSION_ADMIN_INTERACT_OTHER)) { if (plot.isAdded(pp.getUUID()) || Permissions.hasPermission(pp, C.PERMISSION_ADMIN_INTERACT_OTHER)) {
return; return;
} else { } else {
final Flag flag = FlagManager.getPlotFlagRaw(plot, "use"); Flag flag = FlagManager.getPlotFlagRaw(plot, "use");
if ((flag != null) && ((HashSet<PlotBlock>) flag.getValue()).contains(SpongeUtil.getPlotBlock(l.getBlock()))) { if ((flag != null) && ((HashSet<PlotBlock>) flag.getValue()).contains(SpongeUtil.getPlotBlock(l.getBlock()))) {
return; return;
} }
@ -368,8 +379,8 @@ public class MainListener {
public void onExplosion(ExplosionEvent e) throws Exception { public void onExplosion(ExplosionEvent e) throws Exception {
if (e instanceof ExplosionEvent.Detonate) { if (e instanceof ExplosionEvent.Detonate) {
ExplosionEvent.Detonate event = (Detonate) e; ExplosionEvent.Detonate event = (Detonate) e;
final World world = event.getTargetWorld(); World world = event.getTargetWorld();
final String worldname = world.getName(); String worldname = world.getName();
if (!PS.get().hasPlotArea(worldname)) { if (!PS.get().hasPlotArea(worldname)) {
return; return;
} }
@ -382,7 +393,7 @@ public class MainListener {
Location origin = SpongeUtil.getLocation(worldname, tnt.getRotation()); Location origin = SpongeUtil.getLocation(worldname, tnt.getRotation());
Plot originPlot = origin.getPlot(); Plot originPlot = origin.getPlot();
Location current = SpongeUtil.getLocation(tnt); Location current = SpongeUtil.getLocation(tnt);
final Plot currentPlot = current.getPlot(); Plot currentPlot = current.getPlot();
if (!Objects.equals(originPlot, currentPlot)) { if (!Objects.equals(originPlot, currentPlot)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
@ -410,8 +421,8 @@ public class MainListener {
} }
public void onChangeBlock(ChangeBlockEvent event) { public void onChangeBlock(ChangeBlockEvent event) {
final World world = event.getTargetWorld(); World world = event.getTargetWorld();
final String worldname = world.getName(); String worldname = world.getName();
if (!PS.get().hasPlotArea(worldname)) { if (!PS.get().hasPlotArea(worldname)) {
return; return;
} }
@ -429,39 +440,36 @@ public class MainListener {
event.filter(new Predicate<org.spongepowered.api.world.Location<World>>() { event.filter(new Predicate<org.spongepowered.api.world.Location<World>>() {
@Override @Override
public boolean test(org.spongepowered.api.world.Location<World> loc) { public boolean test(org.spongepowered.api.world.Location<World> loc) {
if (SpongeUtil.getLocation(worldname, loc).isPlotRoad()) { return !SpongeUtil.getLocation(worldname, loc).isPlotRoad();
return false;
}
return true;
} }
}); });
} }
@Listener @Listener
public void onBlockBreak(final ChangeBlockEvent.Decay event) { public void onBlockBreak(ChangeBlockEvent.Decay event) {
onChangeBlock(event); onChangeBlock(event);
} }
@Listener @Listener
public void onBlockBreak(final ChangeBlockEvent.Grow event) { public void onBlockBreak(ChangeBlockEvent.Grow event) {
onChangeBlock(event); onChangeBlock(event);
} }
@Listener @Listener
public void onBlockBreak(final ChangeBlockEvent.Modify event) { public void onBlockBreak(ChangeBlockEvent.Modify event) {
onChangeBlock(event); onChangeBlock(event);
} }
@Listener @Listener
public void onBlockBreak(final ChangeBlockEvent.Break event) { public void onBlockBreak(ChangeBlockEvent.Break event) {
Player player = SpongeUtil.getCause(event.getCause(), Player.class); Player player = SpongeUtil.getCause(event.getCause(), Player.class);
if (player == null) { if (player == null) {
// SpongeUtil.printCause("break", event.getCause()); // SpongeUtil.printCause("break", event.getCause());
return; return;
} }
final PlotPlayer pp = SpongeUtil.getPlayer(player); PlotPlayer pp = SpongeUtil.getPlayer(player);
final World world = event.getTargetWorld(); World world = event.getTargetWorld();
final String worldname = world.getName(); String worldname = world.getName();
if (!PS.get().hasPlotArea(worldname)) { if (!PS.get().hasPlotArea(worldname)) {
return; return;
} }
@ -491,8 +499,8 @@ public class MainListener {
return; return;
} else { } else {
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_DESTROY_OTHER); MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_DESTROY_OTHER);
final Flag destroy = FlagManager.getPlotFlagRaw(plot, "break"); Flag destroy = FlagManager.getPlotFlagRaw(plot, "break");
final BlockState state = pos.getState(); BlockState state = pos.getState();
if ((destroy == null) || !((HashSet<PlotBlock>) destroy.getValue()).contains(SpongeUtil.getPlotBlock(state))) { if ((destroy == null) || !((HashSet<PlotBlock>) destroy.getValue()).contains(SpongeUtil.getPlotBlock(state))) {
event.setCancelled(true); event.setCancelled(true);
return; return;
@ -509,10 +517,7 @@ public class MainListener {
if (loc.getPlotAbs() == null) { if (loc.getPlotAbs() == null) {
return true; return true;
} }
if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_ROAD)) { return Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_ROAD);
return false;
}
return true;
} }
if (!plot.hasOwner()) { if (!plot.hasOwner()) {
if (Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_UNOWNED)) { if (Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_UNOWNED)) {
@ -524,8 +529,8 @@ public class MainListener {
if (plot.isAdded(pp.getUUID()) || Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_OTHER)) { if (plot.isAdded(pp.getUUID()) || Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_OTHER)) {
return true; return true;
} else { } else {
final Flag destroy = FlagManager.getPlotFlagRaw(plot, "break"); Flag destroy = FlagManager.getPlotFlagRaw(plot, "break");
final BlockState state = l.getBlock(); BlockState state = l.getBlock();
if ((destroy != null) && ((HashSet<PlotBlock>) destroy.getValue()).contains(SpongeUtil.getPlotBlock(state))) { if ((destroy != null) && ((HashSet<PlotBlock>) destroy.getValue()).contains(SpongeUtil.getPlotBlock(state))) {
return true; return true;
} }
@ -537,15 +542,15 @@ public class MainListener {
} }
@Listener @Listener
public void onBlockPlace(final ChangeBlockEvent.Place event) { public void onBlockPlace(ChangeBlockEvent.Place event) {
Player player = SpongeUtil.getCause(event.getCause(), Player.class); Player player = SpongeUtil.getCause(event.getCause(), Player.class);
if (player == null) { if (player == null) {
// SpongeUtil.printCause("place", event.getCause()); // SpongeUtil.printCause("place", event.getCause());
return; return;
} }
final PlotPlayer pp = SpongeUtil.getPlayer(player); PlotPlayer pp = SpongeUtil.getPlayer(player);
final World world = event.getTargetWorld(); World world = event.getTargetWorld();
final String worldname = world.getName(); String worldname = world.getName();
if (!PS.get().hasPlotArea(worldname)) { if (!PS.get().hasPlotArea(worldname)) {
return; return;
} }
@ -575,8 +580,8 @@ public class MainListener {
return; return;
} else { } else {
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER); MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER);
final Flag BUILD = FlagManager.getPlotFlagRaw(plot, C.FLAG_PLACE.s()); Flag BUILD = FlagManager.getPlotFlagRaw(plot, C.FLAG_PLACE.s());
final BlockState state = pos.getState(); BlockState state = pos.getState();
if ((BUILD == null) || !((HashSet<PlotBlock>) BUILD.getValue()).contains(SpongeUtil.getPlotBlock(state))) { if ((BUILD == null) || !((HashSet<PlotBlock>) BUILD.getValue()).contains(SpongeUtil.getPlotBlock(state))) {
event.setCancelled(true); event.setCancelled(true);
return; return;
@ -593,10 +598,7 @@ public class MainListener {
if (loc.getPlotAbs() == null) { if (loc.getPlotAbs() == null) {
return true; return true;
} }
if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_ROAD)) { return Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_ROAD);
return false;
}
return true;
} }
if (!plot.hasOwner()) { if (!plot.hasOwner()) {
if (Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_UNOWNED)) { if (Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_UNOWNED)) {
@ -608,8 +610,8 @@ public class MainListener {
if (plot.isAdded(pp.getUUID()) || Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_OTHER)) { if (plot.isAdded(pp.getUUID()) || Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_OTHER)) {
return true; return true;
} else { } else {
final Flag build = FlagManager.getPlotFlagRaw(plot, C.FLAG_PLACE.s()); Flag build = FlagManager.getPlotFlagRaw(plot, C.FLAG_PLACE.s());
final BlockState state = l.getBlock(); BlockState state = l.getBlock();
if ((build != null) && ((HashSet<PlotBlock>) build.getValue()).contains(SpongeUtil.getPlotBlock(state))) { if ((build != null) && ((HashSet<PlotBlock>) build.getValue()).contains(SpongeUtil.getPlotBlock(state))) {
return true; return true;
} }
@ -621,19 +623,19 @@ public class MainListener {
} }
@Listener @Listener
public void onJoin(final ClientConnectionEvent.Join event) { public void onJoin(ClientConnectionEvent.Join event) {
final Player player = event.getTargetEntity(); Player player = event.getTargetEntity();
SpongeUtil.getPlayer(player).unregister(); SpongeUtil.getPlayer(player).unregister();
final PlotPlayer pp = SpongeUtil.getPlayer(player); PlotPlayer pp = SpongeUtil.getPlayer(player);
// Now // Now
String name = pp.getName(); String name = pp.getName();
StringWrapper sw = new StringWrapper(name); StringWrapper sw = new StringWrapper(name);
final UUID uuid = pp.getUUID(); UUID uuid = pp.getUUID();
UUIDHandler.add(sw, uuid); UUIDHandler.add(sw, uuid);
Location loc = pp.getLocation(); Location loc = pp.getLocation();
PlotArea area = loc.getPlotArea(); PlotArea area = loc.getPlotArea();
final Plot plot; Plot plot;
if (area != null) { if (area != null) {
plot = area.getPlot(loc); plot = area.getPlot(loc);
if (plot != null) { if (plot != null) {
@ -654,20 +656,20 @@ public class MainListener {
} }
@Listener @Listener
public void onQuit(final ClientConnectionEvent.Disconnect event) { public void onQuit(ClientConnectionEvent.Disconnect event) {
final Player player = event.getTargetEntity(); Player player = event.getTargetEntity();
final PlotPlayer pp = SpongeUtil.getPlayer(player); PlotPlayer pp = SpongeUtil.getPlayer(player);
pp.unregister(); pp.unregister();
} }
@Listener @Listener
public void onMove(final DisplaceEntityEvent.TargetPlayer event) { public void onMove(DisplaceEntityEvent.TargetPlayer event) {
org.spongepowered.api.world.Location<World> from = event.getFromTransform().getLocation(); org.spongepowered.api.world.Location<World> from = event.getFromTransform().getLocation();
org.spongepowered.api.world.Location<World> to = event.getToTransform().getLocation(); org.spongepowered.api.world.Location<World> to = event.getToTransform().getLocation();
int x2; int x2;
if (MathMan.roundInt(from.getX()) != (x2 = MathMan.roundInt(to.getX()))) { if (MathMan.roundInt(from.getX()) != (x2 = MathMan.roundInt(to.getX()))) {
final Player player = event.getTargetEntity(); Player player = event.getTargetEntity();
final PlotPlayer pp = SpongeUtil.getPlayer(player); PlotPlayer pp = SpongeUtil.getPlayer(player);
// Cancel teleport // Cancel teleport
TaskManager.TELEPORT_QUEUE.remove(pp.getName()); TaskManager.TELEPORT_QUEUE.remove(pp.getName());
// Set last location // Set last location
@ -679,7 +681,7 @@ public class MainListener {
return; return;
} }
Plot now = area.getPlotAbs(loc); Plot now = area.getPlotAbs(loc);
final Plot lastPlot = pp.getMeta("lastplot"); Plot lastPlot = pp.getMeta("lastplot");
if (now == null) { if (now == null) {
if (lastPlot != null && !PlotListener.plotExit(pp, lastPlot)) { if (lastPlot != null && !PlotListener.plotExit(pp, lastPlot)) {
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_EXIT_DENIED); MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_EXIT_DENIED);
@ -699,7 +701,7 @@ public class MainListener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
final Integer border = area.getBorder(); Integer border = area.getBorder();
if (x2 > border) { if (x2 > border) {
to.sub(x2 - border + 4, 0, 0); to.sub(x2 - border + 4, 0, 0);
player.setLocation(to); player.setLocation(to);
@ -715,8 +717,8 @@ public class MainListener {
} }
int z2; int z2;
if (MathMan.roundInt(from.getZ()) != (z2 = MathMan.roundInt(to.getZ()))) { if (MathMan.roundInt(from.getZ()) != (z2 = MathMan.roundInt(to.getZ()))) {
final Player player = event.getTargetEntity(); Player player = event.getTargetEntity();
final PlotPlayer pp = SpongeUtil.getPlayer(player); PlotPlayer pp = SpongeUtil.getPlayer(player);
// Cancel teleport // Cancel teleport
TaskManager.TELEPORT_QUEUE.remove(pp.getName()); TaskManager.TELEPORT_QUEUE.remove(pp.getName());
// Set last location // Set last location
@ -728,7 +730,7 @@ public class MainListener {
return; return;
} }
Plot now = area.getPlotAbs(loc); Plot now = area.getPlotAbs(loc);
final Plot lastPlot = pp.getMeta("lastplot"); Plot lastPlot = pp.getMeta("lastplot");
if (now == null) { if (now == null) {
if (lastPlot != null && !PlotListener.plotExit(pp, lastPlot)) { if (lastPlot != null && !PlotListener.plotExit(pp, lastPlot)) {
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_EXIT_DENIED); MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_EXIT_DENIED);
@ -748,7 +750,7 @@ public class MainListener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
final Integer border = area.getBorder(); Integer border = area.getBorder();
if (z2 > border) { if (z2 > border) {
to.add(0, 0, z2 - border - 4); to.add(0, 0, z2 - border - 4);
player.setLocation(to); player.setLocation(to);

View File

@ -30,7 +30,7 @@ public class FastQueue extends SlowQueue {
public final SendChunk chunkSender; public final SendChunk chunkSender;
public HashMap<ChunkWrapper, Chunk> toUpdate = new HashMap<>(); public HashMap<ChunkWrapper, Chunk> toUpdate = new HashMap<>();
public FastQueue() throws NoSuchMethodException, RuntimeException { public FastQueue() throws RuntimeException {
TaskManager.runTaskRepeat(new Runnable() { TaskManager.runTaskRepeat(new Runnable() {
@Override @Override
public void run() { public void run() {