mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-04 11:13:45 +01:00 
			
		
		
		
	Merge branch 'master' of https://github.com/IntellectualSites/PlotSquared
This commit is contained in:
		@@ -39,7 +39,6 @@ import com.plotsquared.bukkit.database.plotme.PlotMeConnector_017;
 | 
			
		||||
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
 | 
			
		||||
import com.plotsquared.bukkit.listeners.ChunkListener;
 | 
			
		||||
import com.plotsquared.bukkit.listeners.EntitySpawnListener;
 | 
			
		||||
import com.plotsquared.bukkit.listeners.ForceFieldListener;
 | 
			
		||||
import com.plotsquared.bukkit.listeners.PlayerEvents;
 | 
			
		||||
import com.plotsquared.bukkit.listeners.PlayerEvents183;
 | 
			
		||||
import com.plotsquared.bukkit.listeners.PlayerEvents_1_8;
 | 
			
		||||
@@ -123,7 +122,14 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onEnable() {
 | 
			
		||||
        getServer().getName();
 | 
			
		||||
        new PS(this, "Bukkit");
 | 
			
		||||
        if (Settings.Enabled_Components.METRICS) {
 | 
			
		||||
            new Metrics(this).start();
 | 
			
		||||
            PS.log(C.PREFIX + "&6Metrics enabled.");
 | 
			
		||||
        } else {
 | 
			
		||||
            PS.log(C.CONSOLE_PLEASE_ENABLE_METRICS);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -363,8 +369,11 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain
 | 
			
		||||
        PlayerEvents main = new PlayerEvents();
 | 
			
		||||
        getServer().getPluginManager().registerEvents(main, this);
 | 
			
		||||
        try {
 | 
			
		||||
            getServer().getClass().getMethod("spigot");
 | 
			
		||||
            getServer().getPluginManager().registerEvents(new EntitySpawnListener(), this);
 | 
			
		||||
        } catch (Throwable ignore) {}
 | 
			
		||||
        } catch (NoSuchMethodException ignored) {
 | 
			
		||||
            PS.debug("Not running Spigot. Skipping EntitySpawnListener event.");
 | 
			
		||||
        }
 | 
			
		||||
        if (PS.get().checkVersion(getServerVersion(), 1, 8, 0)) {
 | 
			
		||||
            try {
 | 
			
		||||
                getServer().getPluginManager().registerEvents(new PlayerEvents_1_8(), this);
 | 
			
		||||
@@ -401,7 +410,6 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerForceFieldEvents() {
 | 
			
		||||
        getServer().getPluginManager().registerEvents(new ForceFieldListener(), this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -570,15 +578,9 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain
 | 
			
		||||
        return new BukkitInventoryUtil();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getServerName() {
 | 
			
		||||
        return Bukkit.getServerName();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void startMetrics() {
 | 
			
		||||
        Metrics metrics = new Metrics(this);
 | 
			
		||||
        metrics.start();
 | 
			
		||||
        new Metrics(this).start();
 | 
			
		||||
        PS.log(C.PREFIX + "&6Metrics enabled.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,25 @@
 | 
			
		||||
package com.plotsquared.bukkit.chat;
 | 
			
		||||
 | 
			
		||||
import static com.plotsquared.bukkit.chat.TextualComponent.rawText;
 | 
			
		||||
 | 
			
		||||
import com.google.gson.JsonArray;
 | 
			
		||||
import com.google.gson.JsonElement;
 | 
			
		||||
import com.google.gson.JsonObject;
 | 
			
		||||
import com.google.gson.JsonParser;
 | 
			
		||||
import com.google.gson.stream.JsonWriter;
 | 
			
		||||
import org.bukkit.Achievement;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.Statistic;
 | 
			
		||||
import org.bukkit.Statistic.Type;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.configuration.serialization.ConfigurationSerializable;
 | 
			
		||||
import org.bukkit.configuration.serialization.ConfigurationSerialization;
 | 
			
		||||
import org.bukkit.entity.EntityType;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.StringWriter;
 | 
			
		||||
import java.lang.reflect.Constructor;
 | 
			
		||||
@@ -19,21 +34,6 @@ import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import org.bukkit.Achievement;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.Statistic;
 | 
			
		||||
import org.bukkit.Statistic.Type;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.configuration.serialization.ConfigurationSerializable;
 | 
			
		||||
import org.bukkit.configuration.serialization.ConfigurationSerialization;
 | 
			
		||||
import org.bukkit.entity.EntityType;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import static com.plotsquared.bukkit.chat.TextualComponent.rawText;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a formattable message. Such messages can use elements such as colors, formatting codes, hover and click data, and other features provided by the vanilla Minecraft <a href="http://minecraft.gamepedia.com/Tellraw#Raw_JSON_Text">JSON message formatter</a>.
 | 
			
		||||
@@ -60,7 +60,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
	@Override
 | 
			
		||||
	public FancyMessage clone() throws CloneNotSupportedException {
 | 
			
		||||
		FancyMessage instance = (FancyMessage) super.clone();
 | 
			
		||||
		instance.messageParts = new ArrayList<MessagePart>(messageParts.size());
 | 
			
		||||
		instance.messageParts = new ArrayList<>(messageParts.size());
 | 
			
		||||
		for (int i = 0; i < messageParts.size(); i++) {
 | 
			
		||||
			instance.messageParts.add(i, messageParts.get(i).clone());
 | 
			
		||||
		}
 | 
			
		||||
@@ -78,15 +78,15 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
		this(rawText(firstPartText));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public FancyMessage(final com.plotsquared.bukkit.chat.TextualComponent firstPartText) {
 | 
			
		||||
		messageParts = new ArrayList<MessagePart>();
 | 
			
		||||
	public FancyMessage(final TextualComponent firstPartText) {
 | 
			
		||||
		messageParts = new ArrayList<>();
 | 
			
		||||
		messageParts.add(new MessagePart(firstPartText));
 | 
			
		||||
		jsonString = null;
 | 
			
		||||
		dirty = false;
 | 
			
		||||
 | 
			
		||||
		if (nmsPacketPlayOutChatConstructor == null) {
 | 
			
		||||
			try {
 | 
			
		||||
				nmsPacketPlayOutChatConstructor = com.plotsquared.bukkit.chat.Reflection.getNMSClass("PacketPlayOutChat").getDeclaredConstructor(com.plotsquared.bukkit.chat.Reflection.getNMSClass("IChatBaseComponent"));
 | 
			
		||||
				nmsPacketPlayOutChatConstructor = Reflection.getNMSClass("PacketPlayOutChat").getDeclaredConstructor(Reflection.getNMSClass("IChatBaseComponent"));
 | 
			
		||||
				nmsPacketPlayOutChatConstructor.setAccessible(true);
 | 
			
		||||
			} catch (NoSuchMethodException e) {
 | 
			
		||||
				Bukkit.getLogger().log(Level.SEVERE, "Could not find Minecraft method or constructor.", e);
 | 
			
		||||
@@ -100,7 +100,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
	 * Creates a JSON message without text.
 | 
			
		||||
	 */
 | 
			
		||||
	public FancyMessage() {
 | 
			
		||||
		this((com.plotsquared.bukkit.chat.TextualComponent) null);
 | 
			
		||||
		this((TextualComponent) null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -122,7 +122,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
	 * @param text The new text of the current editing component.
 | 
			
		||||
	 * @return This builder instance.
 | 
			
		||||
	 */
 | 
			
		||||
	public FancyMessage text(com.plotsquared.bukkit.chat.TextualComponent text) {
 | 
			
		||||
	public FancyMessage text(TextualComponent text) {
 | 
			
		||||
		MessagePart latest = latest();
 | 
			
		||||
		latest.text = text;
 | 
			
		||||
		dirty = true;
 | 
			
		||||
@@ -243,8 +243,8 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
	 */
 | 
			
		||||
	public FancyMessage achievementTooltip(final Achievement which) {
 | 
			
		||||
		try {
 | 
			
		||||
			Object achievement = com.plotsquared.bukkit.chat.Reflection.getMethod(com.plotsquared.bukkit.chat.Reflection.getOBCClass("CraftStatistic"), "getNMSAchievement", Achievement.class).invoke(null, which);
 | 
			
		||||
			return achievementTooltip((String) com.plotsquared.bukkit.chat.Reflection.getField(com.plotsquared.bukkit.chat.Reflection.getNMSClass("Achievement"), "name").get(achievement));
 | 
			
		||||
			Object achievement = Reflection.getMethod(Reflection.getOBCClass("CraftStatistic"), "getNMSAchievement", Achievement.class).invoke(null, which);
 | 
			
		||||
			return achievementTooltip((String) Reflection.getField(Reflection.getNMSClass("Achievement"), "name").get(achievement));
 | 
			
		||||
		} catch (IllegalAccessException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Could not access method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
@@ -252,7 +252,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Argument could not be passed.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		} catch (InvocationTargetException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occured durring invoking of method.", e);
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occurred during invoking of method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -271,8 +271,8 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			throw new IllegalArgumentException("That statistic requires an additional " + type + " parameter!");
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			Object statistic = com.plotsquared.bukkit.chat.Reflection.getMethod(com.plotsquared.bukkit.chat.Reflection.getOBCClass("CraftStatistic"), "getNMSStatistic", Statistic.class).invoke(null, which);
 | 
			
		||||
			return achievementTooltip((String) com.plotsquared.bukkit.chat.Reflection.getField(com.plotsquared.bukkit.chat.Reflection.getNMSClass("Statistic"), "name").get(statistic));
 | 
			
		||||
			Object statistic = Reflection.getMethod(Reflection.getOBCClass("CraftStatistic"), "getNMSStatistic", Statistic.class).invoke(null, which);
 | 
			
		||||
			return achievementTooltip((String) Reflection.getField(Reflection.getNMSClass("Statistic"), "name").get(statistic));
 | 
			
		||||
		} catch (IllegalAccessException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Could not access method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
@@ -280,7 +280,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Argument could not be passed.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		} catch (InvocationTargetException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occured durring invoking of method.", e);
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occurred during invoking of method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -303,8 +303,8 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			throw new IllegalArgumentException("Wrong parameter type for that statistic - needs " + type + "!");
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			Object statistic = com.plotsquared.bukkit.chat.Reflection.getMethod(com.plotsquared.bukkit.chat.Reflection.getOBCClass("CraftStatistic"), "getMaterialStatistic", Statistic.class, Material.class).invoke(null, which, item);
 | 
			
		||||
			return achievementTooltip((String) com.plotsquared.bukkit.chat.Reflection.getField(com.plotsquared.bukkit.chat.Reflection.getNMSClass("Statistic"), "name").get(statistic));
 | 
			
		||||
			Object statistic = Reflection.getMethod(Reflection.getOBCClass("CraftStatistic"), "getMaterialStatistic", Statistic.class, Material.class).invoke(null, which, item);
 | 
			
		||||
			return achievementTooltip((String) Reflection.getField(Reflection.getNMSClass("Statistic"), "name").get(statistic));
 | 
			
		||||
		} catch (IllegalAccessException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Could not access method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
@@ -312,7 +312,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Argument could not be passed.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		} catch (InvocationTargetException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occured durring invoking of method.", e);
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occurred during invoking of method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -335,8 +335,8 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			throw new IllegalArgumentException("Wrong parameter type for that statistic - needs " + type + "!");
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			Object statistic = com.plotsquared.bukkit.chat.Reflection.getMethod(com.plotsquared.bukkit.chat.Reflection.getOBCClass("CraftStatistic"), "getEntityStatistic", Statistic.class, EntityType.class).invoke(null, which, entity);
 | 
			
		||||
			return achievementTooltip((String) com.plotsquared.bukkit.chat.Reflection.getField(com.plotsquared.bukkit.chat.Reflection.getNMSClass("Statistic"), "name").get(statistic));
 | 
			
		||||
			Object statistic = Reflection.getMethod(Reflection.getOBCClass("CraftStatistic"), "getEntityStatistic", Statistic.class, EntityType.class).invoke(null, which, entity);
 | 
			
		||||
			return achievementTooltip((String) Reflection.getField(Reflection.getNMSClass("Statistic"), "name").get(statistic));
 | 
			
		||||
		} catch (IllegalAccessException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Could not access method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
@@ -344,7 +344,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Argument could not be passed.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		} catch (InvocationTargetException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occured durring invoking of method.", e);
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occurred during invoking of method.", e);
 | 
			
		||||
			return this;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -370,8 +370,8 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
	 */
 | 
			
		||||
	public FancyMessage itemTooltip(final ItemStack itemStack) {
 | 
			
		||||
		try {
 | 
			
		||||
			Object nmsItem = com.plotsquared.bukkit.chat.Reflection.getMethod(com.plotsquared.bukkit.chat.Reflection.getOBCClass("inventory.CraftItemStack"), "asNMSCopy", ItemStack.class).invoke(null, itemStack);
 | 
			
		||||
			return itemTooltip(com.plotsquared.bukkit.chat.Reflection.getMethod(com.plotsquared.bukkit.chat.Reflection.getNMSClass("ItemStack"), "save", com.plotsquared.bukkit.chat.Reflection.getNMSClass("NBTTagCompound")).invoke(nmsItem, com.plotsquared.bukkit.chat.Reflection.getNMSClass("NBTTagCompound").newInstance()).toString());
 | 
			
		||||
			Object nmsItem = Reflection.getMethod(Reflection.getOBCClass("inventory.CraftItemStack"), "asNMSCopy", ItemStack.class).invoke(null, itemStack);
 | 
			
		||||
			return itemTooltip(Reflection.getMethod(Reflection.getNMSClass("ItemStack"), "save", Reflection.getNMSClass("NBTTagCompound")).invoke(nmsItem, Reflection.getNMSClass("NBTTagCompound").newInstance()).toString());
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			return this;
 | 
			
		||||
@@ -565,7 +565,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
	 * @param text The text which will populate the new message component.
 | 
			
		||||
	 * @return This builder instance.
 | 
			
		||||
	 */
 | 
			
		||||
	public FancyMessage then(final com.plotsquared.bukkit.chat.TextualComponent text) {
 | 
			
		||||
	public FancyMessage then(final TextualComponent text) {
 | 
			
		||||
		if (!latest().hasText()) {
 | 
			
		||||
			throw new IllegalStateException("previous message part has no text");
 | 
			
		||||
		}
 | 
			
		||||
@@ -641,9 +641,9 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
		}
 | 
			
		||||
		Player player = (Player) sender;
 | 
			
		||||
		try {
 | 
			
		||||
			Object handle = com.plotsquared.bukkit.chat.Reflection.getHandle(player);
 | 
			
		||||
			Object connection = com.plotsquared.bukkit.chat.Reflection.getField(handle.getClass(), "playerConnection").get(handle);
 | 
			
		||||
			com.plotsquared.bukkit.chat.Reflection.getMethod(connection.getClass(), "sendPacket", com.plotsquared.bukkit.chat.Reflection.getNMSClass("Packet")).invoke(connection, createChatPacket(jsonString));
 | 
			
		||||
			Object handle = Reflection.getHandle(player);
 | 
			
		||||
			Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle);
 | 
			
		||||
			Reflection.getMethod(connection.getClass(), "sendPacket", Reflection.getNMSClass("Packet")).invoke(connection, createChatPacket(jsonString));
 | 
			
		||||
		} catch (IllegalArgumentException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Argument could not be passed.", e);
 | 
			
		||||
		} catch (IllegalAccessException e) {
 | 
			
		||||
@@ -651,7 +651,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
		} catch (InstantiationException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Underlying class is abstract.", e);
 | 
			
		||||
		} catch (InvocationTargetException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occured durring invoking of method.", e);
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A error has occurred during invoking of method.", e);
 | 
			
		||||
		} catch (NoSuchMethodException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "Could not find method.", e);
 | 
			
		||||
		} catch (ClassNotFoundException e) {
 | 
			
		||||
@@ -673,16 +673,16 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			//   X = major
 | 
			
		||||
			//   Y = minor
 | 
			
		||||
			//   Z = revision
 | 
			
		||||
			final String version = com.plotsquared.bukkit.chat.Reflection.getVersion();
 | 
			
		||||
			final String version = Reflection.getVersion();
 | 
			
		||||
			String[] split = version.substring(1, version.length() - 1).split("_"); // Remove trailing dot
 | 
			
		||||
			//int majorVersion = Integer.parseInt(split[0]);
 | 
			
		||||
			int minorVersion = Integer.parseInt(split[1]);
 | 
			
		||||
			int revisionVersion = Integer.parseInt(split[2].substring(1)); // Substring to ignore R
 | 
			
		||||
 | 
			
		||||
			if (minorVersion < 8 || (minorVersion == 8 && revisionVersion == 1)) {
 | 
			
		||||
				chatSerializerClazz = com.plotsquared.bukkit.chat.Reflection.getNMSClass("ChatSerializer");
 | 
			
		||||
				chatSerializerClazz = Reflection.getNMSClass("ChatSerializer");
 | 
			
		||||
			} else {
 | 
			
		||||
				chatSerializerClazz = com.plotsquared.bukkit.chat.Reflection.getNMSClass("IChatBaseComponent$ChatSerializer");
 | 
			
		||||
				chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (chatSerializerClazz == null) {
 | 
			
		||||
@@ -702,7 +702,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
 | 
			
		||||
		// Since the method is so simple, and all the obfuscated methods have the same name, it's easier to reimplement 'IChatBaseComponent a(String)' than to reflectively call it
 | 
			
		||||
		// Of course, the implementation may change, but fuzzy matches might break with signature changes
 | 
			
		||||
		Object serializedChatComponent = fromJsonMethod.invoke(nmsChatSerializerGsonInstance, json, com.plotsquared.bukkit.chat.Reflection.getNMSClass("IChatBaseComponent"));
 | 
			
		||||
		Object serializedChatComponent = fromJsonMethod.invoke(nmsChatSerializerGsonInstance, json, Reflection.getNMSClass("IChatBaseComponent"));
 | 
			
		||||
 | 
			
		||||
		return nmsPacketPlayOutChatConstructor.newInstance(serializedChatComponent);
 | 
			
		||||
	}
 | 
			
		||||
@@ -781,7 +781,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
 | 
			
		||||
	// Doc copied from interface
 | 
			
		||||
	public Map<String, Object> serialize() {
 | 
			
		||||
		HashMap<String, Object> map = new HashMap<String, Object>();
 | 
			
		||||
		HashMap<String, Object> map = new HashMap<>();
 | 
			
		||||
		map.put("messageParts", messageParts);
 | 
			
		||||
//		map.put("JSON", toJSONString());
 | 
			
		||||
		return map;
 | 
			
		||||
@@ -829,9 +829,9 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
			JsonObject messagePart = mPrt.getAsJsonObject();
 | 
			
		||||
			for (Map.Entry<String, JsonElement> entry : messagePart.entrySet()) {
 | 
			
		||||
				// Deserialize text
 | 
			
		||||
				if (com.plotsquared.bukkit.chat.TextualComponent.isTextKey(entry.getKey())) {
 | 
			
		||||
				if (TextualComponent.isTextKey(entry.getKey())) {
 | 
			
		||||
					// The map mimics the YAML serialization, which has a "key" field and one or more "value" fields
 | 
			
		||||
					Map<String, Object> serializedMapForm = new HashMap<String, Object>(); // Must be object due to Bukkit serializer API compliance
 | 
			
		||||
					Map<String, Object> serializedMapForm = new HashMap<>(); // Must be object due to Bukkit serializer API compliance
 | 
			
		||||
					serializedMapForm.put("key", entry.getKey());
 | 
			
		||||
					if (entry.getValue().isJsonPrimitive()) {
 | 
			
		||||
						// Assume string
 | 
			
		||||
@@ -842,7 +842,7 @@ public class FancyMessage implements JsonRepresentedObject, Cloneable, Iterable<
 | 
			
		||||
							serializedMapForm.put("value." + compositeNestedElement.getKey(), compositeNestedElement.getValue().getAsString());
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					component.text = com.plotsquared.bukkit.chat.TextualComponent.deserialize(serializedMapForm);
 | 
			
		||||
					component.text = TextualComponent.deserialize(serializedMapForm);
 | 
			
		||||
				} else if (MessagePart.stylesToNames.inverse().containsKey(entry.getKey())) {
 | 
			
		||||
					if (entry.getValue().getAsBoolean()) {
 | 
			
		||||
						component.styles.add(MessagePart.stylesToNames.inverse().get(entry.getKey()));
 | 
			
		||||
 
 | 
			
		||||
@@ -19,137 +19,139 @@ import java.util.logging.Level;
 | 
			
		||||
 */
 | 
			
		||||
final class MessagePart implements JsonRepresentedObject, ConfigurationSerializable, Cloneable {
 | 
			
		||||
 | 
			
		||||
	ChatColor color = ChatColor.WHITE;
 | 
			
		||||
	ArrayList<ChatColor> styles = new ArrayList<ChatColor>();
 | 
			
		||||
	String clickActionName = null, clickActionData = null, hoverActionName = null;
 | 
			
		||||
	JsonRepresentedObject hoverActionData = null;
 | 
			
		||||
	TextualComponent text = null;
 | 
			
		||||
	String insertionData = null;
 | 
			
		||||
	ArrayList<JsonRepresentedObject> translationReplacements = new ArrayList<JsonRepresentedObject>();
 | 
			
		||||
    ChatColor color = ChatColor.WHITE;
 | 
			
		||||
    ArrayList<ChatColor> styles = new ArrayList<>();
 | 
			
		||||
    String clickActionName = null;
 | 
			
		||||
    String clickActionData = null;
 | 
			
		||||
    String hoverActionName = null;
 | 
			
		||||
    JsonRepresentedObject hoverActionData = null;
 | 
			
		||||
    TextualComponent text = null;
 | 
			
		||||
    String insertionData = null;
 | 
			
		||||
    ArrayList<JsonRepresentedObject> translationReplacements = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
	MessagePart(final TextualComponent text) {
 | 
			
		||||
		this.text = text;
 | 
			
		||||
	}
 | 
			
		||||
    MessagePart(final TextualComponent text) {
 | 
			
		||||
        this.text = text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	MessagePart() {
 | 
			
		||||
		this.text = null;
 | 
			
		||||
	}
 | 
			
		||||
    MessagePart() {
 | 
			
		||||
        this.text = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	boolean hasText() {
 | 
			
		||||
		return text != null;
 | 
			
		||||
	}
 | 
			
		||||
    boolean hasText() {
 | 
			
		||||
        return text != null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public MessagePart clone() throws CloneNotSupportedException {
 | 
			
		||||
		MessagePart obj = (MessagePart) super.clone();
 | 
			
		||||
		obj.styles = (ArrayList<ChatColor>) styles.clone();
 | 
			
		||||
		if (hoverActionData instanceof JsonString) {
 | 
			
		||||
			obj.hoverActionData = new JsonString(((JsonString) hoverActionData).getValue());
 | 
			
		||||
		} else if (hoverActionData instanceof FancyMessage) {
 | 
			
		||||
			obj.hoverActionData = ((FancyMessage) hoverActionData).clone();
 | 
			
		||||
		}
 | 
			
		||||
		obj.translationReplacements = (ArrayList<JsonRepresentedObject>) translationReplacements.clone();
 | 
			
		||||
		return obj;
 | 
			
		||||
    @Override
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public MessagePart clone() throws CloneNotSupportedException {
 | 
			
		||||
        MessagePart obj = (MessagePart) super.clone();
 | 
			
		||||
        obj.styles = (ArrayList<ChatColor>) styles.clone();
 | 
			
		||||
        if (hoverActionData instanceof JsonString) {
 | 
			
		||||
            obj.hoverActionData = new JsonString(((JsonString) hoverActionData).getValue());
 | 
			
		||||
        } else if (hoverActionData instanceof FancyMessage) {
 | 
			
		||||
            obj.hoverActionData = ((FancyMessage) hoverActionData).clone();
 | 
			
		||||
        }
 | 
			
		||||
        obj.translationReplacements = (ArrayList<JsonRepresentedObject>) translationReplacements.clone();
 | 
			
		||||
        return obj;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	static final BiMap<ChatColor, String> stylesToNames;
 | 
			
		||||
    static final BiMap<ChatColor, String> stylesToNames;
 | 
			
		||||
 | 
			
		||||
	static {
 | 
			
		||||
		ImmutableBiMap.Builder<ChatColor, String> builder = ImmutableBiMap.builder();
 | 
			
		||||
		for (final ChatColor style : ChatColor.values()) {
 | 
			
		||||
			if (!style.isFormat()) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
    static {
 | 
			
		||||
        ImmutableBiMap.Builder<ChatColor, String> builder = ImmutableBiMap.builder();
 | 
			
		||||
        for (final ChatColor style : ChatColor.values()) {
 | 
			
		||||
            if (!style.isFormat()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			String styleName;
 | 
			
		||||
			switch (style) {
 | 
			
		||||
				case MAGIC:
 | 
			
		||||
					styleName = "obfuscated";
 | 
			
		||||
					break;
 | 
			
		||||
				case UNDERLINE:
 | 
			
		||||
					styleName = "underlined";
 | 
			
		||||
					break;
 | 
			
		||||
				default:
 | 
			
		||||
					styleName = style.name().toLowerCase();
 | 
			
		||||
					break;
 | 
			
		||||
			}
 | 
			
		||||
            String styleName;
 | 
			
		||||
            switch (style) {
 | 
			
		||||
                case MAGIC:
 | 
			
		||||
                    styleName = "obfuscated";
 | 
			
		||||
                    break;
 | 
			
		||||
                case UNDERLINE:
 | 
			
		||||
                    styleName = "underlined";
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    styleName = style.name().toLowerCase();
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			builder.put(style, styleName);
 | 
			
		||||
		}
 | 
			
		||||
		stylesToNames = builder.build();
 | 
			
		||||
	}
 | 
			
		||||
            builder.put(style, styleName);
 | 
			
		||||
        }
 | 
			
		||||
        stylesToNames = builder.build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	public void writeJson(JsonWriter json) {
 | 
			
		||||
		try {
 | 
			
		||||
			json.beginObject();
 | 
			
		||||
			text.writeJson(json);
 | 
			
		||||
			json.name("color").value(color.name().toLowerCase());
 | 
			
		||||
			for (final ChatColor style : styles) {
 | 
			
		||||
				json.name(stylesToNames.get(style)).value(true);
 | 
			
		||||
			}
 | 
			
		||||
			if (clickActionName != null && clickActionData != null) {
 | 
			
		||||
				json.name("clickEvent")
 | 
			
		||||
						.beginObject()
 | 
			
		||||
						.name("action").value(clickActionName)
 | 
			
		||||
						.name("value").value(clickActionData)
 | 
			
		||||
						.endObject();
 | 
			
		||||
			}
 | 
			
		||||
			if (hoverActionName != null && hoverActionData != null) {
 | 
			
		||||
				json.name("hoverEvent")
 | 
			
		||||
						.beginObject()
 | 
			
		||||
						.name("action").value(hoverActionName)
 | 
			
		||||
						.name("value");
 | 
			
		||||
				hoverActionData.writeJson(json);
 | 
			
		||||
				json.endObject();
 | 
			
		||||
			}
 | 
			
		||||
			if (insertionData != null) {
 | 
			
		||||
				json.name("insertion").value(insertionData);
 | 
			
		||||
			}
 | 
			
		||||
			if (translationReplacements.size() > 0 && text != null && TextualComponent.isTranslatableText(text)) {
 | 
			
		||||
				json.name("with").beginArray();
 | 
			
		||||
				for (JsonRepresentedObject obj : translationReplacements) {
 | 
			
		||||
					obj.writeJson(json);
 | 
			
		||||
				}
 | 
			
		||||
				json.endArray();
 | 
			
		||||
			}
 | 
			
		||||
			json.endObject();
 | 
			
		||||
		} catch (IOException e) {
 | 
			
		||||
			Bukkit.getLogger().log(Level.WARNING, "A problem occured during writing of JSON string", e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
    public void writeJson(JsonWriter json) {
 | 
			
		||||
        try {
 | 
			
		||||
            json.beginObject();
 | 
			
		||||
            text.writeJson(json);
 | 
			
		||||
            json.name("color").value(color.name().toLowerCase());
 | 
			
		||||
            for (final ChatColor style : styles) {
 | 
			
		||||
                json.name(stylesToNames.get(style)).value(true);
 | 
			
		||||
            }
 | 
			
		||||
            if (clickActionName != null && clickActionData != null) {
 | 
			
		||||
                json.name("clickEvent")
 | 
			
		||||
                        .beginObject()
 | 
			
		||||
                        .name("action").value(clickActionName)
 | 
			
		||||
                        .name("value").value(clickActionData)
 | 
			
		||||
                        .endObject();
 | 
			
		||||
            }
 | 
			
		||||
            if (hoverActionName != null && hoverActionData != null) {
 | 
			
		||||
                json.name("hoverEvent")
 | 
			
		||||
                        .beginObject()
 | 
			
		||||
                        .name("action").value(hoverActionName)
 | 
			
		||||
                        .name("value");
 | 
			
		||||
                hoverActionData.writeJson(json);
 | 
			
		||||
                json.endObject();
 | 
			
		||||
            }
 | 
			
		||||
            if (insertionData != null) {
 | 
			
		||||
                json.name("insertion").value(insertionData);
 | 
			
		||||
            }
 | 
			
		||||
            if (translationReplacements.size() > 0 && text != null && TextualComponent.isTranslatableText(text)) {
 | 
			
		||||
                json.name("with").beginArray();
 | 
			
		||||
                for (JsonRepresentedObject obj : translationReplacements) {
 | 
			
		||||
                    obj.writeJson(json);
 | 
			
		||||
                }
 | 
			
		||||
                json.endArray();
 | 
			
		||||
            }
 | 
			
		||||
            json.endObject();
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            Bukkit.getLogger().log(Level.WARNING, "A problem occured during writing of JSON string", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	public Map<String, Object> serialize() {
 | 
			
		||||
		HashMap<String, Object> map = new HashMap<String, Object>();
 | 
			
		||||
		map.put("text", text);
 | 
			
		||||
		map.put("styles", styles);
 | 
			
		||||
		map.put("color", color.getChar());
 | 
			
		||||
		map.put("hoverActionName", hoverActionName);
 | 
			
		||||
		map.put("hoverActionData", hoverActionData);
 | 
			
		||||
		map.put("clickActionName", clickActionName);
 | 
			
		||||
		map.put("clickActionData", clickActionData);
 | 
			
		||||
		map.put("insertion", insertionData);
 | 
			
		||||
		map.put("translationReplacements", translationReplacements);
 | 
			
		||||
		return map;
 | 
			
		||||
	}
 | 
			
		||||
    public Map<String, Object> serialize() {
 | 
			
		||||
        HashMap<String, Object> map = new HashMap<>();
 | 
			
		||||
        map.put("text", text);
 | 
			
		||||
        map.put("styles", styles);
 | 
			
		||||
        map.put("color", color.getChar());
 | 
			
		||||
        map.put("hoverActionName", hoverActionName);
 | 
			
		||||
        map.put("hoverActionData", hoverActionData);
 | 
			
		||||
        map.put("clickActionName", clickActionName);
 | 
			
		||||
        map.put("clickActionData", clickActionData);
 | 
			
		||||
        map.put("insertion", insertionData);
 | 
			
		||||
        map.put("translationReplacements", translationReplacements);
 | 
			
		||||
        return map;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public static MessagePart deserialize(Map<String, Object> serialized) {
 | 
			
		||||
		MessagePart part = new MessagePart((TextualComponent) serialized.get("text"));
 | 
			
		||||
		part.styles = (ArrayList<ChatColor>) serialized.get("styles");
 | 
			
		||||
		part.color = ChatColor.getByChar(serialized.get("color").toString());
 | 
			
		||||
		part.hoverActionName = (String) serialized.get("hoverActionName");
 | 
			
		||||
		part.hoverActionData = (JsonRepresentedObject) serialized.get("hoverActionData");
 | 
			
		||||
		part.clickActionName = (String) serialized.get("clickActionName");
 | 
			
		||||
		part.clickActionData = (String) serialized.get("clickActionData");
 | 
			
		||||
		part.insertionData = (String) serialized.get("insertion");
 | 
			
		||||
		part.translationReplacements = (ArrayList<JsonRepresentedObject>) serialized.get("translationReplacements");
 | 
			
		||||
		return part;
 | 
			
		||||
	}
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static MessagePart deserialize(Map<String, Object> serialized) {
 | 
			
		||||
        MessagePart part = new MessagePart((TextualComponent) serialized.get("text"));
 | 
			
		||||
        part.styles = (ArrayList<ChatColor>) serialized.get("styles");
 | 
			
		||||
        part.color = ChatColor.getByChar(serialized.get("color").toString());
 | 
			
		||||
        part.hoverActionName = (String) serialized.get("hoverActionName");
 | 
			
		||||
        part.hoverActionData = (JsonRepresentedObject) serialized.get("hoverActionData");
 | 
			
		||||
        part.clickActionName = (String) serialized.get("clickActionName");
 | 
			
		||||
        part.clickActionData = (String) serialized.get("clickActionData");
 | 
			
		||||
        part.insertionData = (String) serialized.get("insertion");
 | 
			
		||||
        part.translationReplacements = (ArrayList<JsonRepresentedObject>) serialized.get("translationReplacements");
 | 
			
		||||
        return part;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	static {
 | 
			
		||||
		ConfigurationSerialization.registerClass(MessagePart.class);
 | 
			
		||||
	}
 | 
			
		||||
    static {
 | 
			
		||||
        ConfigurationSerialization.registerClass(MessagePart.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package com.plotsquared.bukkit.chat;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
@@ -17,17 +18,17 @@ public final class Reflection {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Stores loaded classes from the {@code net.minecraft.server} package.
 | 
			
		||||
	 */
 | 
			
		||||
	private static final Map<String, Class<?>> _loadedNMSClasses = new HashMap<String, Class<?>>();
 | 
			
		||||
	private static final Map<String, Class<?>> _loadedNMSClasses = new HashMap<>();
 | 
			
		||||
	/**
 | 
			
		||||
	 * Stores loaded classes from the {@code org.bukkit.craftbukkit} package (and subpackages).
 | 
			
		||||
	 */
 | 
			
		||||
	private static final Map<String, Class<?>> _loadedOBCClasses = new HashMap<String, Class<?>>();
 | 
			
		||||
	private static final Map<Class<?>, Map<String, Field>> _loadedFields = new HashMap<Class<?>, Map<String, Field>>();
 | 
			
		||||
	private static final Map<String, Class<?>> _loadedOBCClasses = new HashMap<>();
 | 
			
		||||
	private static final Map<Class<?>, Map<String, Field>> _loadedFields = new HashMap<>();
 | 
			
		||||
	/**
 | 
			
		||||
	 * Contains loaded methods in a cache.
 | 
			
		||||
	 * The map maps [types to maps of [method names to maps of [parameter types to method instances]]].
 | 
			
		||||
	 */
 | 
			
		||||
	private static final Map<Class<?>, Map<String, Map<ArrayWrapper<Class<?>>, Method>>> _loadedMethods = new HashMap<Class<?>, Map<String, Map<ArrayWrapper<Class<?>>, Method>>>();
 | 
			
		||||
	private static final Map<Class<?>, Map<String, Map<ArrayWrapper<Class<?>>, Method>>> _loadedMethods = new HashMap<>();
 | 
			
		||||
	private static String _versionString;
 | 
			
		||||
 | 
			
		||||
	private Reflection() { }
 | 
			
		||||
@@ -64,10 +65,10 @@ public final class Reflection {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		String fullName = "net.minecraft.server." + getVersion() + className;
 | 
			
		||||
		Class<?> clazz = null;
 | 
			
		||||
		Class<?> clazz;
 | 
			
		||||
		try {
 | 
			
		||||
			clazz = Class.forName(fullName);
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
		} catch (ClassNotFoundException e) {
 | 
			
		||||
			_loadedNMSClasses.put(className, null);
 | 
			
		||||
			throw new RuntimeException(e);
 | 
			
		||||
		}
 | 
			
		||||
@@ -88,10 +89,10 @@ public final class Reflection {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		String fullName = "org.bukkit.craftbukkit." + getVersion() + className;
 | 
			
		||||
		Class<?> clazz = null;
 | 
			
		||||
		Class<?> clazz;
 | 
			
		||||
		try {
 | 
			
		||||
			clazz = Class.forName(fullName);
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
		} catch (ClassNotFoundException e) {
 | 
			
		||||
			_loadedOBCClasses.put(className, null);
 | 
			
		||||
			throw new RuntimeException(e);
 | 
			
		||||
		}
 | 
			
		||||
@@ -108,12 +109,8 @@ public final class Reflection {
 | 
			
		||||
	 * @param obj The object for which to retrieve an NMS handle.
 | 
			
		||||
	 * @return The NMS handle of the specified object, or {@code null} if it could not be retrieved using {@code getHandle()}.
 | 
			
		||||
	 */
 | 
			
		||||
	public synchronized static Object getHandle(Object obj) {
 | 
			
		||||
		try {
 | 
			
		||||
	public synchronized static Object getHandle(Object obj) throws InvocationTargetException, IllegalAccessException, IllegalArgumentException {
 | 
			
		||||
			return getMethod(obj.getClass(), "getHandle").invoke(obj);
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
			throw new RuntimeException(e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -137,7 +134,7 @@ public final class Reflection {
 | 
			
		||||
	public synchronized static Field getField(Class<?> clazz, String name) {
 | 
			
		||||
		Map<String, Field> loaded;
 | 
			
		||||
		if (!_loadedFields.containsKey(clazz)) {
 | 
			
		||||
			loaded = new HashMap<String, Field>();
 | 
			
		||||
			loaded = new HashMap<>();
 | 
			
		||||
			_loadedFields.put(clazz, loaded);
 | 
			
		||||
		} else {
 | 
			
		||||
			loaded = _loadedFields.get(clazz);
 | 
			
		||||
@@ -146,19 +143,19 @@ public final class Reflection {
 | 
			
		||||
			// If the field is loaded (or cached as not existing), return the relevant value, which might be null
 | 
			
		||||
			return loaded.get(name);
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			Field field = clazz.getDeclaredField(name);
 | 
			
		||||
			field.setAccessible(true);
 | 
			
		||||
			loaded.put(name, field);
 | 
			
		||||
			return field;
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
			// Error loading
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			// Cache field as not existing
 | 
			
		||||
			loaded.put(name, null);
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
        try {
 | 
			
		||||
            Field field = clazz.getDeclaredField(name);
 | 
			
		||||
            field.setAccessible(true);
 | 
			
		||||
            loaded.put(name, field);
 | 
			
		||||
            return field;
 | 
			
		||||
        } catch (NoSuchFieldException | SecurityException e) {
 | 
			
		||||
            // Error loading
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            // Cache field as not existing
 | 
			
		||||
            loaded.put(name, null);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Retrieves a {@link Method} instance declared by the specified class with the specified name and argument types.
 | 
			
		||||
@@ -167,11 +164,9 @@ public final class Reflection {
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * A global caching mechanism within this class is used to store method. Combined with synchronization, this guarantees that
 | 
			
		||||
	 * no method will be reflectively looked up twice.
 | 
			
		||||
	 * </p>
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * If a method is deemed suitable for return, {@link Method#setAccessible(boolean) setAccessible} will be invoked with an argument of {@code true} before it is returned.
 | 
			
		||||
	 * This ensures that callers do not have to check or worry about Java access modifiers when dealing with the returned instance.
 | 
			
		||||
	 * </p>
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * This method does <em>not</em> search superclasses of the specified type for methods with the specified signature.
 | 
			
		||||
	 * Callers wishing this behavior should use {@link Class#getDeclaredMethod(String, Class...)}.
 | 
			
		||||
@@ -192,7 +187,7 @@ public final class Reflection {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Map<ArrayWrapper<Class<?>>, Method> loadedSignatures = loadedMethodNames.get(name);
 | 
			
		||||
		ArrayWrapper<Class<?>> wrappedArg = new ArrayWrapper<Class<?>>(args);
 | 
			
		||||
		ArrayWrapper<Class<?>> wrappedArg = new ArrayWrapper<>(args);
 | 
			
		||||
		if (loadedSignatures.containsKey(wrappedArg)) {
 | 
			
		||||
			return loadedSignatures.get(wrappedArg);
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
package com.plotsquared.bukkit.listeners;
 | 
			
		||||
 | 
			
		||||
import com.intellectualcrafters.plot.config.Settings;
 | 
			
		||||
import com.intellectualcrafters.plot.flag.Flags;
 | 
			
		||||
import com.intellectualcrafters.plot.object.Location;
 | 
			
		||||
import com.intellectualcrafters.plot.object.Plot;
 | 
			
		||||
import com.intellectualcrafters.plot.object.PlotArea;
 | 
			
		||||
@@ -14,14 +16,14 @@ public class EntitySpawnListener implements Listener {
 | 
			
		||||
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
			
		||||
    public void creatureSpawnEvent(EntitySpawnEvent event) {
 | 
			
		||||
        Entity entity = event.getEntity();
 | 
			
		||||
        Location location = BukkitUtil.getLocation(entity.getLocation());
 | 
			
		||||
        PlotArea area = location.getPlotArea();
 | 
			
		||||
        if (area == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        Plot plot = area.getOwnedPlotAbs(location);
 | 
			
		||||
        switch (entity.getType()) {
 | 
			
		||||
            case ENDER_CRYSTAL:
 | 
			
		||||
                Location location = BukkitUtil.getLocation(entity.getLocation());
 | 
			
		||||
                PlotArea area = location.getPlotArea();
 | 
			
		||||
                if (area == null) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                Plot plot = area.getOwnedPlotAbs(location);
 | 
			
		||||
                if (plot == null) {
 | 
			
		||||
                    if (!area.MOB_SPAWNING) {
 | 
			
		||||
                        event.setCancelled(true);
 | 
			
		||||
@@ -32,5 +34,8 @@ public class EntitySpawnListener implements Listener {
 | 
			
		||||
                    event.setCancelled(true);
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
        if (Settings.Done.RESTRICT_BUILDING && plot.hasFlag(Flags.DONE)) {
 | 
			
		||||
            event.setCancelled(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,14 +8,13 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
 | 
			
		||||
import com.plotsquared.bukkit.object.BukkitPlayer;
 | 
			
		||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.Listener;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class ForceFieldListener implements Listener {
 | 
			
		||||
public class ForceFieldListener {
 | 
			
		||||
 | 
			
		||||
    private static Set<PlotPlayer> getNearbyPlayers(Player player, Plot plot) {
 | 
			
		||||
        Set<PlotPlayer> players = new HashSet<>();
 | 
			
		||||
 
 | 
			
		||||
@@ -28,16 +28,6 @@ import com.plotsquared.bukkit.object.BukkitPlayer;
 | 
			
		||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
			
		||||
import com.plotsquared.listener.PlayerBlockEventType;
 | 
			
		||||
import com.plotsquared.listener.PlotListener;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
@@ -121,6 +111,17 @@ import org.bukkit.projectiles.BlockProjectileSource;
 | 
			
		||||
import org.bukkit.projectiles.ProjectileSource;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Player Events involving plots.
 | 
			
		||||
 *
 | 
			
		||||
@@ -483,7 +484,7 @@ public class PlayerEvents extends PlotListener implements Listener {
 | 
			
		||||
                pp.deleteMeta("lastplot");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Plot now = area.getPlot(loc);
 | 
			
		||||
            Plot now = area.getPlotAbs(loc);
 | 
			
		||||
            Plot lastPlot = pp.getMeta("lastplot");
 | 
			
		||||
            if (now == null) {
 | 
			
		||||
                if (lastPlot != null && !plotExit(pp, lastPlot)) {
 | 
			
		||||
@@ -1470,6 +1471,7 @@ public class PlayerEvents extends PlotListener implements Listener {
 | 
			
		||||
            case MINECART_TNT:
 | 
			
		||||
            case BOAT:
 | 
			
		||||
                return checkEntity(plot, Flags.ENTITY_CAP, Flags.VEHICLE_CAP);
 | 
			
		||||
            case POLAR_BEAR:
 | 
			
		||||
            case RABBIT:
 | 
			
		||||
            case SHEEP:
 | 
			
		||||
            case MUSHROOM_COW:
 | 
			
		||||
@@ -1848,6 +1850,9 @@ public class PlayerEvents extends PlotListener implements Listener {
 | 
			
		||||
 | 
			
		||||
    @EventHandler(priority = EventPriority.MONITOR)
 | 
			
		||||
    public void onLeave(PlayerQuitEvent event) {
 | 
			
		||||
        if (TaskManager.TELEPORT_QUEUE.contains(event.getPlayer().getName())) {
 | 
			
		||||
            TaskManager.TELEPORT_QUEUE.remove(event.getPlayer().getName());
 | 
			
		||||
        }
 | 
			
		||||
        PlotPlayer pp = BukkitUtil.getPlayer(event.getPlayer());
 | 
			
		||||
        pp.unregister();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,6 @@ import com.intellectualcrafters.plot.util.block.GlobalBlockQueue;
 | 
			
		||||
import com.intellectualcrafters.plot.util.block.LocalBlockQueue;
 | 
			
		||||
import com.intellectualcrafters.plot.util.block.ScopedLocalBlockQueue;
 | 
			
		||||
import com.plotsquared.bukkit.object.entity.EntityWrapper;
 | 
			
		||||
import java.util.ArrayDeque;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.Chunk;
 | 
			
		||||
import org.bukkit.DyeColor;
 | 
			
		||||
@@ -57,6 +49,15 @@ import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.InventoryHolder;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayDeque;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class BukkitChunkManager extends ChunkManager {
 | 
			
		||||
 | 
			
		||||
    public static boolean isIn(RegionWrapper region, int x, int z) {
 | 
			
		||||
@@ -546,6 +547,7 @@ public class BukkitChunkManager extends ChunkManager {
 | 
			
		||||
            case BOAT:
 | 
			
		||||
                count[4]++;
 | 
			
		||||
                break;
 | 
			
		||||
            case POLAR_BEAR:
 | 
			
		||||
            case RABBIT:
 | 
			
		||||
            case SHEEP:
 | 
			
		||||
            case MUSHROOM_COW:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package com.plotsquared.bukkit.util;
 | 
			
		||||
 | 
			
		||||
import com.intellectualcrafters.plot.PS;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
@@ -9,71 +8,38 @@ import org.bukkit.scheduler.BukkitTask;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.ByteArrayOutputStream;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.io.OutputStream;
 | 
			
		||||
import java.io.UnsupportedEncodingException;
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.net.Proxy;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.net.URLConnection;
 | 
			
		||||
import java.net.URLEncoder;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.LinkedHashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.zip.GZIPOutputStream;
 | 
			
		||||
 | 
			
		||||
public class Metrics {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The current revision number.
 | 
			
		||||
     */
 | 
			
		||||
    /** The current revision number. */
 | 
			
		||||
    private static final int REVISION = 7;
 | 
			
		||||
    /**
 | 
			
		||||
     * The base url of the metrics domain.
 | 
			
		||||
     */
 | 
			
		||||
    /** The base url of the metrics domain.*/
 | 
			
		||||
    private static final String BASE_URL = "http://report.mcstats.org";
 | 
			
		||||
    /**
 | 
			
		||||
     * The url used to report a server's status.
 | 
			
		||||
     */
 | 
			
		||||
    /** The url used to report a server's status. */
 | 
			
		||||
    private static final String REPORT_URL = "/plugin/%s";
 | 
			
		||||
    /**
 | 
			
		||||
     * Interval of time to ping (in minutes).
 | 
			
		||||
     */
 | 
			
		||||
    /** Interval of time to ping (in minutes). */
 | 
			
		||||
    private static final int PING_INTERVAL = 15;
 | 
			
		||||
    /**
 | 
			
		||||
     * The plugin this metrics submits for.
 | 
			
		||||
     */
 | 
			
		||||
    /** The plugin this metrics submits for. */
 | 
			
		||||
    private final Plugin plugin;
 | 
			
		||||
    /**
 | 
			
		||||
     * All of the custom graphs to submit to metrics.
 | 
			
		||||
     */
 | 
			
		||||
    private final Set<Graph> graphs = Collections.synchronizedSet(new HashSet<Graph>());
 | 
			
		||||
    /**
 | 
			
		||||
     * Unique server id.
 | 
			
		||||
     */
 | 
			
		||||
    /** Unique server id. */
 | 
			
		||||
    private final String guid;
 | 
			
		||||
    /**
 | 
			
		||||
     * Debug mode.
 | 
			
		||||
     */
 | 
			
		||||
    private final boolean debug;
 | 
			
		||||
    /**
 | 
			
		||||
     * The scheduled task.
 | 
			
		||||
     */
 | 
			
		||||
    /** The scheduled task. */
 | 
			
		||||
    private volatile BukkitTask task = null;
 | 
			
		||||
 | 
			
		||||
    public Metrics(Plugin plugin) {
 | 
			
		||||
        if (plugin == null) {
 | 
			
		||||
            throw new IllegalArgumentException("Plugin cannot be null");
 | 
			
		||||
        }
 | 
			
		||||
        this.plugin = plugin;
 | 
			
		||||
        this.guid = UUID.randomUUID().toString();
 | 
			
		||||
        this.debug = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -186,38 +152,6 @@ public class Metrics {
 | 
			
		||||
        return URLEncoder.encode(text, "UTF-8");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics
 | 
			
		||||
     * website. Plotters can be added to the graph object returned.
 | 
			
		||||
     *
 | 
			
		||||
     * @param name The name of the graph
 | 
			
		||||
     *
 | 
			
		||||
     * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given
 | 
			
		||||
     */
 | 
			
		||||
    public Graph createGraph(String name) {
 | 
			
		||||
        if (name == null) {
 | 
			
		||||
            throw new IllegalArgumentException("Graph name cannot be null");
 | 
			
		||||
        }
 | 
			
		||||
        // Construct the graph object
 | 
			
		||||
        Graph graph = new Graph(name);
 | 
			
		||||
        // Now we can add our graph
 | 
			
		||||
        this.graphs.add(graph);
 | 
			
		||||
        // and return back
 | 
			
		||||
        return graph;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a Graph object to BukkitMetrics that represents data for the plugin that should be sent to the backend
 | 
			
		||||
     *
 | 
			
		||||
     * @param graph The name of the graph
 | 
			
		||||
     */
 | 
			
		||||
    public void addGraph(Graph graph) {
 | 
			
		||||
        if (graph == null) {
 | 
			
		||||
            throw new IllegalArgumentException("Graph cannot be null");
 | 
			
		||||
        }
 | 
			
		||||
        this.graphs.add(graph);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Start measuring statistics. This will immediately create an async repeating task as the plugin and send the
 | 
			
		||||
     * initial data to the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200
 | 
			
		||||
@@ -244,54 +178,12 @@ public class Metrics {
 | 
			
		||||
                    this.firstPost = false;
 | 
			
		||||
                } catch (IOException e) {
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                    if (Metrics.this.debug) {
 | 
			
		||||
                        Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage());
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }, 0, PING_INTERVAL * 1200);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Enables metrics for the server by setting "opt-out" to false in the config file and starting the metrics task.
 | 
			
		||||
     */
 | 
			
		||||
    public void enable() {
 | 
			
		||||
        // Enable Task, if it is not running
 | 
			
		||||
        if (this.task == null) {
 | 
			
		||||
            start();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task.
 | 
			
		||||
     */
 | 
			
		||||
    public void disable() {
 | 
			
		||||
        // Disable Task, if it is running
 | 
			
		||||
        if (this.task != null) {
 | 
			
		||||
            this.task.cancel();
 | 
			
		||||
            this.task = null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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
 | 
			
		||||
     */
 | 
			
		||||
    public File getConfigFile() {
 | 
			
		||||
        // I believe the easiest way to get the base folder (e.g craftbukkit set
 | 
			
		||||
        // via -P) for plugins to use
 | 
			
		||||
        // is to abuse the plugin object we already have
 | 
			
		||||
        // plugin.getDataFolder() => base/plugins/PluginA/
 | 
			
		||||
        // pluginsFolder => base/plugins/
 | 
			
		||||
        // The base is not necessarily relative to the startup directory.
 | 
			
		||||
        File pluginsFolder = this.plugin.getDataFolder().getParentFile();
 | 
			
		||||
        // return => base/plugins/PluginMetrics/config.yml
 | 
			
		||||
        return new File(new File(pluginsFolder, "PluginMetrics"), "config.yml");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Generic method that posts a plugin to the metrics website.
 | 
			
		||||
     */
 | 
			
		||||
@@ -342,46 +234,12 @@ public class Metrics {
 | 
			
		||||
        if (isPing) {
 | 
			
		||||
            appendJSONPair(json, "ping", "1");
 | 
			
		||||
        }
 | 
			
		||||
        if (!this.graphs.isEmpty()) {
 | 
			
		||||
            synchronized (this.graphs) {
 | 
			
		||||
                json.append(',');
 | 
			
		||||
                json.append('"');
 | 
			
		||||
                json.append("graphs");
 | 
			
		||||
                json.append('"');
 | 
			
		||||
                json.append(':');
 | 
			
		||||
                json.append('{');
 | 
			
		||||
                boolean firstGraph = true;
 | 
			
		||||
                for (Graph graph : this.graphs) {
 | 
			
		||||
                    StringBuilder graphJson = new StringBuilder();
 | 
			
		||||
                    graphJson.append('{');
 | 
			
		||||
                    for (Plotter plotter : graph.getPlotters()) {
 | 
			
		||||
                        appendJSONPair(graphJson, plotter.getColumnName(), Integer.toString(plotter.getValue()));
 | 
			
		||||
                    }
 | 
			
		||||
                    graphJson.append('}');
 | 
			
		||||
                    if (!firstGraph) {
 | 
			
		||||
                        json.append(',');
 | 
			
		||||
                    }
 | 
			
		||||
                    json.append(escapeJSON(graph.getName()));
 | 
			
		||||
                    json.append(':');
 | 
			
		||||
                    json.append(graphJson);
 | 
			
		||||
                    firstGraph = false;
 | 
			
		||||
                }
 | 
			
		||||
                json.append('}');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // close json
 | 
			
		||||
        json.append('}');
 | 
			
		||||
        // Create the url
 | 
			
		||||
        URL url = new URL(BASE_URL + String.format(REPORT_URL, urlEncode(pluginName)));
 | 
			
		||||
        // Connect to the website
 | 
			
		||||
        URLConnection connection;
 | 
			
		||||
        // Mineshafter creates a socks proxy, so we can safely bypass it
 | 
			
		||||
        // It does not reroute POST requests so we need to go around it
 | 
			
		||||
        if (isMineshafterPresent()) {
 | 
			
		||||
            connection = url.openConnection(Proxy.NO_PROXY);
 | 
			
		||||
        } else {
 | 
			
		||||
            connection = url.openConnection();
 | 
			
		||||
        }
 | 
			
		||||
        URLConnection connection = url.openConnection();
 | 
			
		||||
        byte[] uncompressed = json.toString().getBytes();
 | 
			
		||||
        byte[] compressed = gzip(json.toString());
 | 
			
		||||
        // Headers
 | 
			
		||||
@@ -392,9 +250,6 @@ public class Metrics {
 | 
			
		||||
        connection.addRequestProperty("Accept", "application/json");
 | 
			
		||||
        connection.addRequestProperty("Connection", "close");
 | 
			
		||||
        connection.setDoOutput(true);
 | 
			
		||||
        if (this.debug) {
 | 
			
		||||
            PS.debug("[Metrics] Prepared request for " + pluginName + " uncompressed=" + uncompressed.length + " compressed=" + compressed.length);
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            try (OutputStream os = connection.getOutputStream()) {
 | 
			
		||||
                os.write(compressed);
 | 
			
		||||
@@ -403,9 +258,6 @@ public class Metrics {
 | 
			
		||||
            String response;
 | 
			
		||||
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
 | 
			
		||||
                response = reader.readLine();
 | 
			
		||||
                if (this.debug) {
 | 
			
		||||
                    PS.debug("[Metrics] Response for " + pluginName + ": " + response);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (response == null || response.startsWith("ERR") || response.startsWith("7")) {
 | 
			
		||||
                if (response == null) {
 | 
			
		||||
@@ -414,171 +266,7 @@ public class Metrics {
 | 
			
		||||
                    response = response.substring(response.startsWith("7,") ? 2 : 1);
 | 
			
		||||
                }
 | 
			
		||||
                throw new IOException(response);
 | 
			
		||||
            } else {
 | 
			
		||||
                // Is this the first update this hour?
 | 
			
		||||
                if ("1".equals(response) || response.contains("This is your first update this hour")) {
 | 
			
		||||
                    synchronized (this.graphs) {
 | 
			
		||||
                        for (Graph graph : this.graphs) {
 | 
			
		||||
                            for (Plotter plotter : graph.getPlotters()) {
 | 
			
		||||
                                plotter.reset();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            if (this.debug) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if mineshafter is present. If it is, we need to bypass it to send POST requests
 | 
			
		||||
     *
 | 
			
		||||
     * @return true if mineshafter is installed on the server
 | 
			
		||||
     */
 | 
			
		||||
    private boolean isMineshafterPresent() {
 | 
			
		||||
        try {
 | 
			
		||||
            Class.forName("mineshafter.MineServer");
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (ClassNotFoundException ignored) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Represents a custom graph on the website
 | 
			
		||||
     */
 | 
			
		||||
    public static class Graph {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The graph's name, alphanumeric and spaces only :) If it does not comply to the above when submitted, it is
 | 
			
		||||
         * rejected
 | 
			
		||||
         */
 | 
			
		||||
        private final String name;
 | 
			
		||||
        /**
 | 
			
		||||
         * The set of plotters that are contained within this graph
 | 
			
		||||
         */
 | 
			
		||||
        private final Set<Plotter> plotters = new LinkedHashSet<>();
 | 
			
		||||
 | 
			
		||||
        private Graph(String name) {
 | 
			
		||||
            this.name = name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Gets the graph's name
 | 
			
		||||
         *
 | 
			
		||||
         * @return the Graph's name
 | 
			
		||||
         */
 | 
			
		||||
        public String getName() {
 | 
			
		||||
            return this.name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Add a plotter to the graph, which will be used to plot entries
 | 
			
		||||
         *
 | 
			
		||||
         * @param plotter the plotter to add to the graph
 | 
			
		||||
         */
 | 
			
		||||
        public void addPlotter(Plotter plotter) {
 | 
			
		||||
            this.plotters.add(plotter);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Remove a plotter from the graph
 | 
			
		||||
         *
 | 
			
		||||
         * @param plotter the plotter to remove from the graph
 | 
			
		||||
         */
 | 
			
		||||
        public void removePlotter(Plotter plotter) {
 | 
			
		||||
            this.plotters.remove(plotter);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Gets an <b>unmodifiable</b> set of the plotter objects in the graph
 | 
			
		||||
         *
 | 
			
		||||
         * @return an unmodifiable {@link Set} of the plotter objects
 | 
			
		||||
         */
 | 
			
		||||
        public Set<Plotter> getPlotters() {
 | 
			
		||||
            return Collections.unmodifiableSet(this.plotters);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int hashCode() {
 | 
			
		||||
            return this.name.hashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public boolean equals(Object object) {
 | 
			
		||||
            if (!(object instanceof Graph)) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            Graph graph = (Graph) object;
 | 
			
		||||
            return graph.name.equals(this.name);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Interface used to collect custom data for a plugin
 | 
			
		||||
     */
 | 
			
		||||
    public abstract static class Plotter {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The plot's name
 | 
			
		||||
         */
 | 
			
		||||
        private final String name;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Construct a plotter with the default plot name
 | 
			
		||||
         */
 | 
			
		||||
        public Plotter() {
 | 
			
		||||
            this("Default");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Construct a plotter with a specific plot name
 | 
			
		||||
         *
 | 
			
		||||
         * @param name the name of the plotter to use, which will show up on the website
 | 
			
		||||
         */
 | 
			
		||||
        public Plotter(String name) {
 | 
			
		||||
            this.name = name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Get the current value for the plotted point. Since this function defers to an external function it may or may
 | 
			
		||||
         * not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called
 | 
			
		||||
         * from any thread so care should be taken when accessing resources that need to be synchronized.
 | 
			
		||||
         *
 | 
			
		||||
         * @return the current value for the point to be plotted.
 | 
			
		||||
         */
 | 
			
		||||
        public abstract int getValue();
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Get the column name for the plotted point
 | 
			
		||||
         *
 | 
			
		||||
         * @return the plotted point's column name
 | 
			
		||||
         */
 | 
			
		||||
        public String getColumnName() {
 | 
			
		||||
            return this.name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Called after the website graphs have been updated
 | 
			
		||||
         */
 | 
			
		||||
        public void reset() {}
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int hashCode() {
 | 
			
		||||
            return getColumnName().hashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public boolean equals(Object object) {
 | 
			
		||||
            if (!(object instanceof Plotter)) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            Plotter plotter = (Plotter) object;
 | 
			
		||||
            return plotter.name.equals(this.name) && plotter.getValue() == getValue();
 | 
			
		||||
        }
 | 
			
		||||
        } catch (IOException ignored) {}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -163,7 +163,7 @@ public class FileUUIDHandler extends UUIDHandlerImplementation {
 | 
			
		||||
                        ByteSource is = com.google.common.io.Files.asByteSource(file);
 | 
			
		||||
                        NbtFactory.NbtCompound compound = NbtFactory.fromStream(is, NbtFactory.StreamOptions.GZIP_COMPRESSION);
 | 
			
		||||
                        if (!compound.containsKey("bukkit")) {
 | 
			
		||||
                            PS.debug("ERROR: Player data does not contain the the key \"bukkit\"");
 | 
			
		||||
                            PS.debug("ERROR: Player data (" + uuid.toString() + ".dat) does not contain the the key \"bukkit\"");
 | 
			
		||||
                        } else {
 | 
			
		||||
                            NbtFactory.NbtCompound bukkit = (NbtFactory.NbtCompound) compound.get("bukkit");
 | 
			
		||||
                            String name = (String) bukkit.get("lastKnownName");
 | 
			
		||||
 
 | 
			
		||||
@@ -236,12 +236,6 @@ public interface IPlotMain extends ILogger {
 | 
			
		||||
     */
 | 
			
		||||
    void registerWorldEvents();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the name of the server.
 | 
			
		||||
     * @return the server name
 | 
			
		||||
     */
 | 
			
		||||
    String getServerName();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the class that will manage player titles.
 | 
			
		||||
     * @return
 | 
			
		||||
 
 | 
			
		||||
@@ -171,7 +171,6 @@ public class PS {
 | 
			
		||||
                this.IMP.registerPlayerEvents();
 | 
			
		||||
                this.IMP.registerInventoryEvents();
 | 
			
		||||
                this.IMP.registerPlotPlusEvents();
 | 
			
		||||
                this.IMP.registerForceFieldEvents();
 | 
			
		||||
            }
 | 
			
		||||
            // Required
 | 
			
		||||
            this.IMP.registerWorldEvents();
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.intellectualcrafters.plot;
 | 
			
		||||
 | 
			
		||||
public enum Platform {
 | 
			
		||||
    Bukkit,
 | 
			
		||||
    Sponge,
 | 
			
		||||
    Spigot,
 | 
			
		||||
    Cauldron
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -118,7 +118,7 @@ public class Auto extends SubCommand {
 | 
			
		||||
        }
 | 
			
		||||
        if (EconHandler.manager != null && plotarea.USE_ECONOMY) {
 | 
			
		||||
            Expression<Double> costExp = plotarea.PRICES.get("claim");
 | 
			
		||||
            double cost = costExp.evalute((double) currentPlots);
 | 
			
		||||
            double cost = costExp.evaluate((double) currentPlots);
 | 
			
		||||
            cost = (size_x * size_z) * cost;
 | 
			
		||||
            if (cost > 0d) {
 | 
			
		||||
                if (EconHandler.manager.getMoney(player) < cost) {
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ public class Claim extends SubCommand {
 | 
			
		||||
        PlotArea world = plot.getArea();
 | 
			
		||||
        if ((EconHandler.manager != null) && world.USE_ECONOMY) {
 | 
			
		||||
            Expression<Double> costExr = world.PRICES.get("claim");
 | 
			
		||||
            double cost = costExr.evalute((double) currentPlots);
 | 
			
		||||
            double cost = costExr.evaluate((double) currentPlots);
 | 
			
		||||
            if (cost > 0d) {
 | 
			
		||||
                if (EconHandler.manager.getMoney(player) < cost) {
 | 
			
		||||
                    return sendMessage(player, C.CANNOT_AFFORD_PLOT, "" + cost);
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,7 @@ public class Delete extends SubCommand {
 | 
			
		||||
                        plot.removeRunning();
 | 
			
		||||
                        if ((EconHandler.manager != null) && plotArea.USE_ECONOMY) {
 | 
			
		||||
                            Expression<Double> valueExr = plotArea.PRICES.get("sell");
 | 
			
		||||
                            double value = plots.size() * valueExr.evalute((double) currentPlots);
 | 
			
		||||
                            double value = plots.size() * valueExr.evaluate((double) currentPlots);
 | 
			
		||||
                            if (value > 0d) {
 | 
			
		||||
                                EconHandler.manager.depositMoney(player, value);
 | 
			
		||||
                                sendMessage(player, C.ADDED_BALANCE, String.valueOf(value));
 | 
			
		||||
 
 | 
			
		||||
@@ -148,13 +148,7 @@ public class Load extends SubCommand {
 | 
			
		||||
                String world = split[1];
 | 
			
		||||
                PlotId id = PlotId.fromString(split[2] + ';' + split[3]);
 | 
			
		||||
                String size = split[4];
 | 
			
		||||
                String server = split[5].replaceAll(".schematic", "");
 | 
			
		||||
                String color;
 | 
			
		||||
                if (PS.get().IMP.getServerName().replaceAll("[^A-Za-z0-9]", "").equals(server)) {
 | 
			
		||||
                    color = "$4";
 | 
			
		||||
                } else {
 | 
			
		||||
                    color = "$1";
 | 
			
		||||
                }
 | 
			
		||||
                String color = "$4";
 | 
			
		||||
                MainUtil.sendMessage(player,
 | 
			
		||||
                        "$3[$2" + (i + 1) + "$3] " + color + time + "$3 | " + color + world + ';' + id + "$3 | " + color + size + 'x' + size);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
@@ -191,7 +185,7 @@ public class Load extends SubCommand {
 | 
			
		||||
            time -= minutes * 60;
 | 
			
		||||
            toreturn.append(minutes + "m ");
 | 
			
		||||
        }
 | 
			
		||||
        if (toreturn.equals("") || (time > 0)) {
 | 
			
		||||
        if (toreturn.length() == 0 || (time > 0)) {
 | 
			
		||||
            toreturn.append(time + "s ");
 | 
			
		||||
        }
 | 
			
		||||
        return toreturn.toString().trim();
 | 
			
		||||
 
 | 
			
		||||
@@ -141,7 +141,7 @@ public class MainCommand extends Command {
 | 
			
		||||
                                    PlotArea area = player.getApplicablePlotArea();
 | 
			
		||||
                                    if (area != null) {
 | 
			
		||||
                                        Expression<Double> priceEval = area.PRICES.get(cmd.getFullId());
 | 
			
		||||
                                        Double price = priceEval != null ? priceEval.evalute(0d) : 0d;
 | 
			
		||||
                                        Double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
 | 
			
		||||
                                        if (price != null && EconHandler.manager.getMoney(player) < price) {
 | 
			
		||||
                                            if (failure != null) {
 | 
			
		||||
                                                failure.run();
 | 
			
		||||
@@ -161,7 +161,7 @@ public class MainCommand extends Command {
 | 
			
		||||
                        PlotArea area = player.getApplicablePlotArea();
 | 
			
		||||
                        if (area != null) {
 | 
			
		||||
                            Expression<Double> priceEval = area.PRICES.get(cmd.getFullId());
 | 
			
		||||
                            Double price = priceEval != null ? priceEval.evalute(0d) : 0d;
 | 
			
		||||
                            Double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
 | 
			
		||||
                            if (price != 0d && EconHandler.manager.getMoney(player) < price) {
 | 
			
		||||
                                if (failure != null) {
 | 
			
		||||
                                    failure.run();
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ public class Merge extends SubCommand {
 | 
			
		||||
        final PlotArea plotArea = plot.getArea();
 | 
			
		||||
        Expression<Double> priceExr = plotArea.PRICES.containsKey("merge") ? plotArea.PRICES.get("merge") : null;
 | 
			
		||||
        final int size = plot.getConnectedPlots().size();
 | 
			
		||||
        final double price = priceExr == null ? 0d : priceExr.evalute((double) size);
 | 
			
		||||
        final double price = priceExr == null ? 0d : priceExr.evaluate((double) size);
 | 
			
		||||
        if (EconHandler.manager != null && plotArea.USE_ECONOMY && price > 0d && EconHandler.manager.getMoney(player) < price) {
 | 
			
		||||
            sendMessage(player, C.CANNOT_AFFORD_MERGE, String.valueOf(price));
 | 
			
		||||
            return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -63,12 +63,11 @@ public class Save extends SubCommand {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void run() {
 | 
			
		||||
                        String time = (System.currentTimeMillis() / 1000) + "";
 | 
			
		||||
                        String name = PS.get().IMP.getServerName().replaceAll("[^A-Za-z0-9]", "");
 | 
			
		||||
                        Location[] corners = plot.getCorners();
 | 
			
		||||
                        int size = (corners[1].getX() - corners[0].getX()) + 1;
 | 
			
		||||
                        PlotId id = plot.getId();
 | 
			
		||||
                        String world = plot.getArea().toString().replaceAll(";", "-").replaceAll("[^A-Za-z0-9]", "");
 | 
			
		||||
                        final String file = time + '_' + world + '_' + id.x + '_' + id.y + '_' + size + '_' + name;
 | 
			
		||||
                        final String file = time + '_' + world + '_' + id.x + '_' + id.y + '_' + size;
 | 
			
		||||
                        UUID uuid = player.getUUID();
 | 
			
		||||
                        SchematicHandler.manager.upload(value, uuid, file, new RunnableVal<URL>() {
 | 
			
		||||
                            @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ public enum C {
 | 
			
		||||
     */
 | 
			
		||||
    CONSOLE_JAVA_OUTDATED_1_8("&cYour version of java is outdated. It is highly recommended that you update to Java 8 as it increases performance "
 | 
			
		||||
            + "and security. PlotSquared will require Java 9 in a future update.", "static.console"),
 | 
			
		||||
    CONSOLE_PLEASE_ENABLE_METRICS("&dPlease enable metrics for PlotSquared. Using metrics improves plugin stabability, performance, and features. "
 | 
			
		||||
    CONSOLE_PLEASE_ENABLE_METRICS("&dPlease enable metrics for PlotSquared. Using metrics improves plugin stability, performance, and features. "
 | 
			
		||||
            + "Bug fixes and new features are influenced on metrics.", "static.console"),
 | 
			
		||||
    /*
 | 
			
		||||
     * Confirm
 | 
			
		||||
@@ -368,7 +368,7 @@ public enum C {
 | 
			
		||||
    /*
 | 
			
		||||
     * Unknown Error
 | 
			
		||||
     */
 | 
			
		||||
    ERROR("$2An error occured: %s", "Errors"),
 | 
			
		||||
    ERROR("$2An error occurred: %s", "Errors"),
 | 
			
		||||
    // SETTINGS_PASTE_UPLOADED("$2settings.yml was uploaded to: $1%url%", "Paste"),
 | 
			
		||||
    // LATEST_LOG_UPLOADED("$2latest.log was uploaded to: $1%url%", "Paste"),
 | 
			
		||||
    DEBUG_REPORT_CREATED("$1Uploaded a full debug to: $1%url%", "Paste"),
 | 
			
		||||
 
 | 
			
		||||
@@ -296,7 +296,7 @@ public class Settings extends Config {
 | 
			
		||||
        public static boolean WORLDEDIT_RESTRICTIONS = true;
 | 
			
		||||
        @Comment("Allow economy to be used")
 | 
			
		||||
        public static boolean ECONOMY = true;
 | 
			
		||||
        @Comment("Send anonymous usage statistics")
 | 
			
		||||
        @Comment("Send anonymous usage statistics. Bukkit only setting.")
 | 
			
		||||
        public static boolean METRICS = true;
 | 
			
		||||
        @Comment("Expiry will clear old or simplistic plots")
 | 
			
		||||
        public static boolean PLOT_EXPIRY = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -114,7 +114,7 @@ public final class Flags {
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    public static final BooleanFlag SLEEP = new BooleanFlag("sleep");
 | 
			
		||||
    public static final TeleportDenyFlag TELEPORT_DENY = new TeleportDenyFlag("teleport-deny");
 | 
			
		||||
    public static final TeleportDenyFlag DENY_TELEPORT = new TeleportDenyFlag("deny-teleport");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private static final HashMap<String, Flag<?>> flags;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,12 @@ import com.intellectualcrafters.plot.commands.MainCommand;
 | 
			
		||||
import javax.script.ScriptException;
 | 
			
		||||
 | 
			
		||||
public abstract class Expression<T> {
 | 
			
		||||
    public abstract T evalute(T arg);
 | 
			
		||||
    public abstract T evaluate(T arg);
 | 
			
		||||
 | 
			
		||||
    public static <U> Expression<U> constant(final U value) {
 | 
			
		||||
        return new Expression<U>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public U evalute(U arg) {
 | 
			
		||||
            public U evaluate(U arg) {
 | 
			
		||||
                return value;
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
@@ -20,8 +20,8 @@ public abstract class Expression<T> {
 | 
			
		||||
    public static Expression<Double> linearDouble(final Double value) {
 | 
			
		||||
        return new Expression<Double>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public Double evalute(Double arg) {
 | 
			
		||||
                return (arg.doubleValue() * value.doubleValue());
 | 
			
		||||
            public Double evaluate(Double arg) {
 | 
			
		||||
                return (arg * value);
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
@@ -29,15 +29,15 @@ public abstract class Expression<T> {
 | 
			
		||||
    public static Expression<Double> doubleExpression(final String expression) {
 | 
			
		||||
        try {
 | 
			
		||||
            return constant(Double.parseDouble(expression));
 | 
			
		||||
        } catch (Exception ignore) {}
 | 
			
		||||
        } catch (NumberFormatException ignore) {}
 | 
			
		||||
        if (expression.endsWith("*{arg}")) {
 | 
			
		||||
            try {
 | 
			
		||||
                return linearDouble(Double.parseDouble(expression.substring(0, expression.length() - 6)));
 | 
			
		||||
            } catch (Exception ignore) {}
 | 
			
		||||
            } catch (NumberFormatException ignore) {}
 | 
			
		||||
        }
 | 
			
		||||
        return new Expression<Double>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public Double evalute(Double arg) {
 | 
			
		||||
            public Double evaluate(Double arg) {
 | 
			
		||||
                DebugExec exec = (DebugExec) MainCommand.getInstance().getCommand(DebugExec.class);
 | 
			
		||||
                try {
 | 
			
		||||
                    return (Double) exec.getEngine().eval(expression.replace("{arg}", "" + arg));
 | 
			
		||||
 
 | 
			
		||||
@@ -68,6 +68,7 @@ public abstract class EventUtil {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (PS.get().update != null && Permissions.hasPermission(player, C.PERMISSION_ADMIN_UPDATE) && Settings.Enabled_Components.UPDATER) {
 | 
			
		||||
            MainUtil.sendMessage(player,C.CONSOLE_JAVA_OUTDATED_1_8.s());
 | 
			
		||||
            MainUtil.sendMessage(player, "&6An update for PlotSquared is available: &7/plot update");
 | 
			
		||||
        }
 | 
			
		||||
        final Plot plot = player.getCurrentPlot();
 | 
			
		||||
 
 | 
			
		||||
@@ -207,7 +207,8 @@ public class PlotListener {
 | 
			
		||||
                    for (UUID uuid : plot.getOwners()) {
 | 
			
		||||
                        PlotPlayer owner = UUIDHandler.getPlayer(uuid);
 | 
			
		||||
                        if ((owner != null) && !owner.getUUID().equals(player.getUUID())) {
 | 
			
		||||
                            MainUtil.sendMessage(player, C.NOTIFY_LEAVE.s().replace("%player", player.getName()).replace("%plot", plot.getId().toString()));
 | 
			
		||||
                            MainUtil.sendMessage(owner, C.NOTIFY_LEAVE.s().replace("%player", player.getName()).replace("%plot", plot.getId()
 | 
			
		||||
                                    .toString()));
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -220,7 +221,7 @@ public class PlotListener {
 | 
			
		||||
                    PlotGameMode gameMode = player.getGameMode();
 | 
			
		||||
                    if (gameMode == PlotGameMode.SURVIVAL || gameMode == PlotGameMode.ADVENTURE) {
 | 
			
		||||
                        player.setFlight(false);
 | 
			
		||||
                    } else if (player.getFlight() != true) {
 | 
			
		||||
                    } else if (!player.getFlight()) {
 | 
			
		||||
                        player.setFlight(true);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -14,17 +14,23 @@ buildscript {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
apply plugin: 'net.minecraftforge.gradle.forge'
 | 
			
		||||
apply plugin: 'net.minecrell.vanilla.server.library'
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    compile project(':Core')
 | 
			
		||||
    compile 'org.spongepowered:spongeapi:5.0.0-SNAPSHOT'
 | 
			
		||||
    compile 'net.minecrell.mcstats:statslite-sponge:0.2.2'
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sourceCompatibility = 1.8
 | 
			
		||||
targetCompatibility = 1.8
 | 
			
		||||
 | 
			
		||||
repositories {
 | 
			
		||||
    maven {
 | 
			
		||||
        name = 'minecrell'
 | 
			
		||||
        url = 'http://repo.minecrell.net/releases'
 | 
			
		||||
    }
 | 
			
		||||
    maven {
 | 
			
		||||
        name = 'forge'
 | 
			
		||||
        url = 'http://files.minecraftforge.net/maven'
 | 
			
		||||
@@ -35,7 +41,7 @@ repositories {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
minecraft {
 | 
			
		||||
    version = "2014"
 | 
			
		||||
    version = "1.10.2"
 | 
			
		||||
    mappings = "snapshot_20160629"
 | 
			
		||||
    runDir = 'run'
 | 
			
		||||
}
 | 
			
		||||
@@ -51,9 +57,9 @@ processResources {
 | 
			
		||||
shadowJar {
 | 
			
		||||
    dependencies {
 | 
			
		||||
        include(dependency(':Core'))
 | 
			
		||||
        //include(dependency('org.mcstats.sponge:metrics:R8-SNAPSHOT'))
 | 
			
		||||
        include dependency('net.minecrell.mcstats:statslite-sponge')
 | 
			
		||||
    }
 | 
			
		||||
    //relocate 'org.mcstats', 'com.plotsquared.stats'
 | 
			
		||||
    relocate 'net.minecrell.mcstats', 'com.plotsquared.util.mcstats'
 | 
			
		||||
    archiveName = "${parent.name}-${project.name}-${parent.version}.jar"
 | 
			
		||||
    destinationDir = file '../target'
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,6 @@ import com.plotsquared.sponge.util.SpongeEconHandler;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeEventUtil;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeHybridUtils;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeInventoryUtil;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeMetrics;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeSchematicHandler;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeSetupUtils;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeTaskManager;
 | 
			
		||||
@@ -51,13 +50,7 @@ import com.plotsquared.sponge.util.block.SpongeLocalQueue;
 | 
			
		||||
import com.plotsquared.sponge.uuid.SpongeLowerOfflineUUIDWrapper;
 | 
			
		||||
import com.plotsquared.sponge.uuid.SpongeOnlineUUIDWrapper;
 | 
			
		||||
import com.plotsquared.sponge.uuid.SpongeUUIDHandler;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import net.minecrell.mcstats.SpongeStatsLite;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.spongepowered.api.Game;
 | 
			
		||||
import org.spongepowered.api.Server;
 | 
			
		||||
@@ -66,6 +59,7 @@ import org.spongepowered.api.config.ConfigDir;
 | 
			
		||||
import org.spongepowered.api.entity.living.player.Player;
 | 
			
		||||
import org.spongepowered.api.event.Listener;
 | 
			
		||||
import org.spongepowered.api.event.game.state.GameAboutToStartServerEvent;
 | 
			
		||||
import org.spongepowered.api.event.game.state.GamePreInitializationEvent;
 | 
			
		||||
import org.spongepowered.api.plugin.Plugin;
 | 
			
		||||
import org.spongepowered.api.plugin.PluginContainer;
 | 
			
		||||
import org.spongepowered.api.profile.GameProfileManager;
 | 
			
		||||
@@ -74,8 +68,16 @@ import org.spongepowered.api.world.gen.GenerationPopulator;
 | 
			
		||||
import org.spongepowered.api.world.gen.WorldGenerator;
 | 
			
		||||
import org.spongepowered.api.world.gen.WorldGeneratorModifier;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Plugin(id = "plotsquared", name = "PlotSquared", description = "Easy, yet powerful Plot World generation and management.",
 | 
			
		||||
        url = "https://github.com/IntellectualSites/PlotSquared", version = "3.3.3")
 | 
			
		||||
        url = "https://github.com/IntellectualSites/PlotSquared", version = "3.5.0-SNAPSHOT")
 | 
			
		||||
public class SpongeMain implements IPlotMain {
 | 
			
		||||
 | 
			
		||||
    public static SpongeMain THIS;
 | 
			
		||||
@@ -89,6 +91,9 @@ public class SpongeMain implements IPlotMain {
 | 
			
		||||
    @Inject
 | 
			
		||||
    private Game game;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    public SpongeStatsLite stats;
 | 
			
		||||
 | 
			
		||||
    private Server server;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
@@ -97,8 +102,7 @@ public class SpongeMain implements IPlotMain {
 | 
			
		||||
 | 
			
		||||
    private GameProfileManager resolver;
 | 
			
		||||
 | 
			
		||||
    //    @Override
 | 
			
		||||
    public Logger getLogger() {
 | 
			
		||||
    private Logger getLogger() {
 | 
			
		||||
        return this.logger;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -121,6 +125,12 @@ public class SpongeMain implements IPlotMain {
 | 
			
		||||
        return THIS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Listener
 | 
			
		||||
    public void onPreInitialize(GamePreInitializationEvent event) {
 | 
			
		||||
        getLogger().info("The metrics section in PlotSquared is ignored in favor of the actual metrics reporter configurations.");
 | 
			
		||||
        this.stats.start();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Listener
 | 
			
		||||
    public void onServerAboutToStart(GameAboutToStartServerEvent event) {
 | 
			
		||||
        THIS = this;
 | 
			
		||||
@@ -241,14 +251,11 @@ public class SpongeMain implements IPlotMain {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerPlotPlusEvents() {
 | 
			
		||||
        // TODO Auto-generated method stub
 | 
			
		||||
        PS.log("registerPlotPlusEvents is not implemented!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerForceFieldEvents() {
 | 
			
		||||
        // TODO Auto-generated method stub
 | 
			
		||||
        PS.log("registerForceFieldEvents is not implemented!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -292,16 +299,8 @@ public class SpongeMain implements IPlotMain {
 | 
			
		||||
        Sponge.getEventManager().registerListeners(this, new WorldEvents());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getServerName() {
 | 
			
		||||
        throw new UnsupportedOperationException("NOT IMPLEMENTED YET");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void startMetrics() {
 | 
			
		||||
        SpongeMetrics metrics = new SpongeMetrics(this.game, this.plugin);
 | 
			
		||||
        metrics.start();
 | 
			
		||||
        PS.log(C.PREFIX.s() + "&6Metrics enabled.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import com.intellectualcrafters.plot.generator.AugmentedUtils;
 | 
			
		||||
import com.intellectualcrafters.plot.object.PlotBlock;
 | 
			
		||||
import com.intellectualcrafters.plot.util.block.DelegateLocalBlockQueue;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeUtil;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import org.spongepowered.api.block.BlockState;
 | 
			
		||||
import org.spongepowered.api.world.World;
 | 
			
		||||
import org.spongepowered.api.world.extent.ImmutableBiomeArea;
 | 
			
		||||
@@ -13,6 +12,8 @@ import org.spongepowered.api.world.extent.MutableBlockVolume;
 | 
			
		||||
import org.spongepowered.api.world.gen.GenerationPopulator;
 | 
			
		||||
import org.spongepowered.api.world.gen.WorldGenerator;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class SpongeAugmentedGenerator implements GenerationPopulator {
 | 
			
		||||
    
 | 
			
		||||
    private static SpongeAugmentedGenerator generator;
 | 
			
		||||
@@ -51,7 +52,7 @@ public class SpongeAugmentedGenerator implements GenerationPopulator {
 | 
			
		||||
            @Override
 | 
			
		||||
            public PlotBlock getBlock(int x, int y, int z) {
 | 
			
		||||
                BlockState block = terrain.getBlock(bx + x, y, bz + z);
 | 
			
		||||
                return block == null ? PlotBlock.get(0, 0) : SpongeUtil.getPlotBlock(block);
 | 
			
		||||
                return SpongeUtil.getPlotBlock(block);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,97 @@
 | 
			
		||||
package com.plotsquared.sponge.listener;
 | 
			
		||||
 | 
			
		||||
import com.flowpowered.math.vector.Vector3d;
 | 
			
		||||
import com.intellectualcrafters.plot.flag.Flags;
 | 
			
		||||
import com.intellectualcrafters.plot.object.Location;
 | 
			
		||||
import com.intellectualcrafters.plot.object.Plot;
 | 
			
		||||
import com.intellectualcrafters.plot.object.PlotPlayer;
 | 
			
		||||
import com.plotsquared.sponge.object.SpongePlayer;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeUtil;
 | 
			
		||||
import org.spongepowered.api.entity.Entity;
 | 
			
		||||
import org.spongepowered.api.entity.EntityTypes;
 | 
			
		||||
import org.spongepowered.api.entity.living.player.Player;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class ForceFieldListener {
 | 
			
		||||
 | 
			
		||||
    private static Set<PlotPlayer> getNearbyPlayers(Player player, Plot plot) {
 | 
			
		||||
        Set<PlotPlayer> players = new HashSet<>();
 | 
			
		||||
        for (Entity nearbyEntity : player.getNearbyEntities(entity -> entity.getType().equals(EntityTypes.PLAYER))) {
 | 
			
		||||
            Player nearbyPlayer = (Player) nearbyEntity;
 | 
			
		||||
            PlotPlayer plotPlayer;
 | 
			
		||||
            if ((plotPlayer = SpongeUtil.getPlayer(nearbyPlayer)) == null || !plot.equals(plotPlayer.getCurrentPlot())) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (!plot.isAdded(plotPlayer.getUUID())) {
 | 
			
		||||
                players.add(plotPlayer);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        return players;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static PlotPlayer hasNearbyPermitted(Player player, Plot plot) {
 | 
			
		||||
        for (Entity nearbyEntity : player.getNearbyEntities(entity -> entity.getType().equals(EntityTypes.PLAYER))) {
 | 
			
		||||
            Player nearbyPlayer = (Player) nearbyEntity;
 | 
			
		||||
            PlotPlayer plotPlayer;
 | 
			
		||||
            if ((plotPlayer = SpongeUtil.getPlayer(nearbyPlayer)) == null || !plot.equals(plotPlayer.getCurrentPlot())) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (plot.isAdded(plotPlayer.getUUID())) {
 | 
			
		||||
                return plotPlayer;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static Vector3d calculateVelocity(PlotPlayer player, PlotPlayer e) {
 | 
			
		||||
        Location playerLocation = player.getLocationFull();
 | 
			
		||||
        Location oPlayerLocation = e.getLocation();
 | 
			
		||||
        double playerX = playerLocation.getX();
 | 
			
		||||
        double playerY = playerLocation.getY();
 | 
			
		||||
        double playerZ = playerLocation.getZ();
 | 
			
		||||
        double oPlayerX = oPlayerLocation.getX();
 | 
			
		||||
        double oPlayerY = oPlayerLocation.getY();
 | 
			
		||||
        double oPlayerZ = oPlayerLocation.getZ();
 | 
			
		||||
        double x = 0d;
 | 
			
		||||
        if (playerX < oPlayerX) {
 | 
			
		||||
            x = 1.0d;
 | 
			
		||||
        } else if (playerX > oPlayerX) {
 | 
			
		||||
            x = -1.0d;
 | 
			
		||||
        }
 | 
			
		||||
        double y = 0d;
 | 
			
		||||
        if (playerY < oPlayerY) {
 | 
			
		||||
            y = 0.5d;
 | 
			
		||||
        } else if (playerY > oPlayerY) {
 | 
			
		||||
            y = -0.5d;
 | 
			
		||||
        }
 | 
			
		||||
        double z = 0d;
 | 
			
		||||
        if (playerZ < oPlayerZ) {
 | 
			
		||||
            z = 1.0d;
 | 
			
		||||
        } else if (playerZ > oPlayerZ) {
 | 
			
		||||
            z = -1.0d;
 | 
			
		||||
        }
 | 
			
		||||
        return new Vector3d(x, y, z);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void handleForcefield(Player player, PlotPlayer plotPlayer, Plot plot) {
 | 
			
		||||
        if (Flags.FORCEFIELD.isTrue(plot)) {
 | 
			
		||||
            UUID uuid = plotPlayer.getUUID();
 | 
			
		||||
            if (plot.isAdded(uuid)) {
 | 
			
		||||
                Set<PlotPlayer> players = getNearbyPlayers(player, plot);
 | 
			
		||||
                for (PlotPlayer oPlayer : players) {
 | 
			
		||||
                    ((SpongePlayer) oPlayer).player.setVelocity(calculateVelocity(plotPlayer, oPlayer));
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                PlotPlayer oPlayer = hasNearbyPermitted(player, plot);
 | 
			
		||||
                if (oPlayer == null) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                player.setVelocity(calculateVelocity(oPlayer, plotPlayer));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -662,6 +662,7 @@ public class MainListener {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (now.equals(lastPlot)) {
 | 
			
		||||
                ForceFieldListener.handleForcefield(player, pp, now);
 | 
			
		||||
                return;
 | 
			
		||||
            } else if (!PlotListener.plotEntry(pp, now)) {
 | 
			
		||||
                MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_ENTRY_DENIED);
 | 
			
		||||
@@ -711,6 +712,7 @@ public class MainListener {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (now.equals(lastPlot)) {
 | 
			
		||||
                ForceFieldListener.handleForcefield(player, pp, now);
 | 
			
		||||
                return;
 | 
			
		||||
            } else if (!PlotListener.plotEntry(pp, now)) {
 | 
			
		||||
                MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_ENTRY_DENIED);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package com.plotsquared.sponge.object;
 | 
			
		||||
 | 
			
		||||
import com.flowpowered.math.vector.Vector3d;
 | 
			
		||||
import com.intellectualcrafters.plot.PS;
 | 
			
		||||
import com.intellectualcrafters.plot.commands.RequiredType;
 | 
			
		||||
import com.intellectualcrafters.plot.object.Location;
 | 
			
		||||
import com.intellectualcrafters.plot.object.PlotPlayer;
 | 
			
		||||
@@ -111,8 +112,12 @@ public class SpongePlayer extends PlotPlayer {
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setCompassTarget(Location location) {
 | 
			
		||||
        TargetedLocationData target = this.player.getOrCreate(TargetedLocationData.class).get();
 | 
			
		||||
        target.set(Keys.TARGETED_LOCATION, SpongeUtil.getLocation(location).getPosition());
 | 
			
		||||
        Optional<TargetedLocationData> target = this.player.getOrCreate(TargetedLocationData.class);
 | 
			
		||||
        if (target.isPresent()) {
 | 
			
		||||
            target.get().set(Keys.TARGETED_LOCATION, SpongeUtil.getLocation(location).getPosition());
 | 
			
		||||
        } else {
 | 
			
		||||
            PS.debug("Failed to set compass target.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ import java.util.Objects;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
public class SpongeSetupUtils extends SetupUtils {
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateGenerators() {
 | 
			
		||||
        if (!SetupUtils.generators.isEmpty()) {
 | 
			
		||||
@@ -48,7 +48,7 @@ public class SpongeSetupUtils extends SetupUtils {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getGenerator(PlotArea plotArea) {
 | 
			
		||||
        if (SetupUtils.generators.isEmpty()) {
 | 
			
		||||
@@ -61,7 +61,7 @@ public class SpongeSetupUtils extends SetupUtils {
 | 
			
		||||
        WorldGenerator generator = world.getWorldGenerator();
 | 
			
		||||
        throw new UnsupportedOperationException("NOT IMPLEMENTED YET");
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String setupWorld(SetupObject object) {
 | 
			
		||||
        SetupUtils.manager.updateGenerators();
 | 
			
		||||
@@ -146,7 +146,7 @@ public class SpongeSetupUtils extends SetupUtils {
 | 
			
		||||
            .loadsOnStartup(true)
 | 
			
		||||
            .keepsSpawnLoaded(true)
 | 
			
		||||
            .dimension(DimensionTypes.OVERWORLD)
 | 
			
		||||
            .generator(GeneratorTypes.OVERWORLD)
 | 
			
		||||
            .generator(GeneratorTypes.FLAT)
 | 
			
		||||
            .usesMapFeatures(false)
 | 
			
		||||
            .enabled(true)
 | 
			
		||||
            .generatorModifiers(wgm)
 | 
			
		||||
 
 | 
			
		||||
@@ -17,16 +17,6 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
 | 
			
		||||
import com.intellectualcrafters.plot.util.WorldUtil;
 | 
			
		||||
import com.plotsquared.sponge.SpongeMain;
 | 
			
		||||
import com.plotsquared.sponge.object.SpongePlayer;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import net.minecraft.block.Block;
 | 
			
		||||
import net.minecraft.world.biome.Biome;
 | 
			
		||||
import org.spongepowered.api.Sponge;
 | 
			
		||||
@@ -51,6 +41,17 @@ import org.spongepowered.api.world.biome.BiomeType;
 | 
			
		||||
import org.spongepowered.api.world.biome.BiomeTypes;
 | 
			
		||||
import org.spongepowered.api.world.extent.Extent;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
public class SpongeUtil extends WorldUtil {
 | 
			
		||||
 | 
			
		||||
    public static Cause CAUSE = Cause.of(NamedCause.source(Sponge.getPluginManager().fromInstance(SpongeMain.THIS).get()));
 | 
			
		||||
@@ -303,7 +304,8 @@ public class SpongeUtil extends WorldUtil {
 | 
			
		||||
            StringComparison<PlotBlock> outer = new StringComparison<PlotBlock>();
 | 
			
		||||
            return outer.new ComparisonResult(match, block);
 | 
			
		||||
 | 
			
		||||
        } catch (NumberFormatException ignored) {}
 | 
			
		||||
        } catch (NumberFormatException ignored) {
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import com.intellectualcrafters.plot.object.ChunkWrapper;
 | 
			
		||||
import com.intellectualcrafters.plot.object.Location;
 | 
			
		||||
import com.intellectualcrafters.plot.object.PlotBlock;
 | 
			
		||||
import com.intellectualcrafters.plot.util.block.ScopedLocalBlockQueue;
 | 
			
		||||
import com.plotsquared.sponge.SpongeMain;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeUtil;
 | 
			
		||||
import org.spongepowered.api.world.biome.BiomeType;
 | 
			
		||||
import org.spongepowered.api.world.extent.MutableBiomeArea;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,6 @@ import com.intellectualcrafters.plot.util.StringMan;
 | 
			
		||||
import com.intellectualcrafters.plot.util.TaskManager;
 | 
			
		||||
import com.intellectualcrafters.plot.util.block.BasicLocalBlockQueue;
 | 
			
		||||
import com.plotsquared.sponge.util.SpongeUtil;
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import net.minecraft.block.Block;
 | 
			
		||||
import net.minecraft.block.state.IBlockState;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
@@ -33,6 +30,10 @@ import org.spongepowered.api.block.BlockTypes;
 | 
			
		||||
import org.spongepowered.api.world.World;
 | 
			
		||||
import org.spongepowered.api.world.biome.BiomeType;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
 | 
			
		||||
public class SpongeLocalQueue extends BasicLocalBlockQueue<char[]> {
 | 
			
		||||
 | 
			
		||||
    public SpongeLocalQueue(String world) {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,19 +6,19 @@ buildscript {
 | 
			
		||||
        maven { url = "https://oss.sonatype.org/content/repositories/snapshots/"}
 | 
			
		||||
        jcenter()
 | 
			
		||||
    }
 | 
			
		||||
	dependencies {
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3'
 | 
			
		||||
        classpath 'org.ajoberstar:grgit:1.7.0'
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
group = 'com.intellectualcrafters'
 | 
			
		||||
def revision = ""
 | 
			
		||||
 | 
			
		||||
ext {
 | 
			
		||||
    git = Grgit.open()
 | 
			
		||||
    revision = "-${git.head().abbreviatedId}"
 | 
			
		||||
    revision = "${git.head().abbreviatedId}"
 | 
			
		||||
}
 | 
			
		||||
version = "3.4.5-SNAPSHOT${revision}"
 | 
			
		||||
version = "3.4.5-SNAPSHOT-${revision}"
 | 
			
		||||
description = """PlotSquared"""
 | 
			
		||||
 | 
			
		||||
subprojects {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user