/* * Copyright (c) IntellectualCrafters - 2014. * You are not allowed to distribute and/or monetize any of our intellectual property. * IntellectualCrafters is not affiliated with Mojang AB. Minecraft is a trademark of Mojang AB. * * >> File = Main.java * >> Generated by: Citymonstret at 2014-08-09 01:43 */ package com.intellectualcrafters.plot; import static org.bukkit.Material.ACACIA_STAIRS; import static org.bukkit.Material.BEACON; import static org.bukkit.Material.BEDROCK; import static org.bukkit.Material.BIRCH_WOOD_STAIRS; import static org.bukkit.Material.BOOKSHELF; import static org.bukkit.Material.BREWING_STAND; import static org.bukkit.Material.BRICK; import static org.bukkit.Material.BRICK_STAIRS; import static org.bukkit.Material.BURNING_FURNACE; import static org.bukkit.Material.CAKE_BLOCK; import static org.bukkit.Material.CAULDRON; import static org.bukkit.Material.CLAY; import static org.bukkit.Material.CLAY_BRICK; import static org.bukkit.Material.COAL_BLOCK; import static org.bukkit.Material.COAL_ORE; import static org.bukkit.Material.COBBLESTONE; import static org.bukkit.Material.COBBLESTONE_STAIRS; import static org.bukkit.Material.COBBLE_WALL; import static org.bukkit.Material.COMMAND; import static org.bukkit.Material.DARK_OAK_STAIRS; import static org.bukkit.Material.DAYLIGHT_DETECTOR; import static org.bukkit.Material.DIAMOND_BLOCK; import static org.bukkit.Material.DIAMOND_ORE; import static org.bukkit.Material.DIRT; import static org.bukkit.Material.DISPENSER; import static org.bukkit.Material.DROPPER; import static org.bukkit.Material.EMERALD_BLOCK; import static org.bukkit.Material.EMERALD_ORE; import static org.bukkit.Material.ENCHANTMENT_TABLE; import static org.bukkit.Material.ENDER_PORTAL_FRAME; import static org.bukkit.Material.ENDER_STONE; import static org.bukkit.Material.FURNACE; import static org.bukkit.Material.GLASS; import static org.bukkit.Material.GLOWSTONE; import static org.bukkit.Material.GOLD_BLOCK; import static org.bukkit.Material.GOLD_ORE; import static org.bukkit.Material.GRASS; import static org.bukkit.Material.GRAVEL; import static org.bukkit.Material.HARD_CLAY; import static org.bukkit.Material.HAY_BLOCK; import static org.bukkit.Material.HUGE_MUSHROOM_1; import static org.bukkit.Material.HUGE_MUSHROOM_2; import static org.bukkit.Material.IRON_BLOCK; import static org.bukkit.Material.IRON_ORE; import static org.bukkit.Material.JACK_O_LANTERN; import static org.bukkit.Material.JUKEBOX; import static org.bukkit.Material.JUNGLE_WOOD_STAIRS; import static org.bukkit.Material.LAPIS_BLOCK; import static org.bukkit.Material.LAPIS_ORE; import static org.bukkit.Material.LEAVES; import static org.bukkit.Material.LEAVES_2; import static org.bukkit.Material.LOG; import static org.bukkit.Material.LOG_2; import static org.bukkit.Material.MELON_BLOCK; import static org.bukkit.Material.MOB_SPAWNER; import static org.bukkit.Material.MOSSY_COBBLESTONE; import static org.bukkit.Material.MYCEL; import static org.bukkit.Material.NETHERRACK; import static org.bukkit.Material.NETHER_BRICK; import static org.bukkit.Material.NETHER_BRICK_STAIRS; import static org.bukkit.Material.NOTE_BLOCK; import static org.bukkit.Material.OBSIDIAN; import static org.bukkit.Material.PACKED_ICE; import static org.bukkit.Material.PUMPKIN; import static org.bukkit.Material.QUARTZ_BLOCK; import static org.bukkit.Material.QUARTZ_ORE; import static org.bukkit.Material.QUARTZ_STAIRS; import static org.bukkit.Material.REDSTONE_BLOCK; import static org.bukkit.Material.SAND; import static org.bukkit.Material.SANDSTONE; import static org.bukkit.Material.SANDSTONE_STAIRS; import static org.bukkit.Material.SMOOTH_BRICK; import static org.bukkit.Material.SMOOTH_STAIRS; import static org.bukkit.Material.SNOW_BLOCK; import static org.bukkit.Material.SOUL_SAND; import static org.bukkit.Material.SPONGE; import static org.bukkit.Material.SPRUCE_WOOD_STAIRS; import static org.bukkit.Material.STONE; import static org.bukkit.Material.WOOD; import static org.bukkit.Material.WOOD_STAIRS; import static org.bukkit.Material.WOOL; import static org.bukkit.Material.WORKBENCH; import static org.bukkit.Material.getMaterial; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import me.confuser.barapi.BarAPI; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Tameable; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.java.JavaPlugin; import ca.mera.CameraAPI; import com.intellectualcrafters.plot.Logger.LogLevel; import com.intellectualcrafters.plot.Settings.Web; import com.intellectualcrafters.plot.commands.Camera; import com.intellectualcrafters.plot.commands.MainCommand; import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.MySQL; import com.intellectualcrafters.plot.database.PlotMeConverter; import com.intellectualcrafters.plot.database.SQLite; import com.intellectualcrafters.plot.events.PlayerTeleportToPlotEvent; import com.intellectualcrafters.plot.events.PlotDeleteEvent; import com.intellectualcrafters.plot.listeners.PlayerEvents; import com.intellectualcrafters.plot.listeners.WorldEditListener; import com.sk89q.worldedit.bukkit.WorldEditPlugin; /** * @awesome @author Citymonstret, Empire92 PlotMain class. */ public class PlotMain extends JavaPlugin { /** * settings.properties */ public static File configFile; public static YamlConfiguration config; private static int config_ver = 1; /** * storage.properties */ public static File storageFile; public static YamlConfiguration storage; public static int storage_ver = 1; /** * translations.properties */ public static File translationsFile; public static YamlConfiguration translations; public static int translations_ver = 1; /** * list of usable flags */ public static Set registeredFlags = new HashSet(); /** * MySQL Object */ private static MySQL mySQL; /** * MySQL Connection */ public static Connection connection; /** * WorldEdit object */ public static WorldEditPlugin worldEdit = null; /** * BarAPI object */ public static BarAPI barAPI = null; /** * CameraAPI object */ public static CameraAPI cameraAPI; /** * !!WorldGeneration!! */ @Override public ChunkGenerator getDefaultWorldGenerator(String worldname, String id) { return new WorldGenerator(worldname); } /** * TODO: Implement better system * */ @SuppressWarnings("deprecation") public static void checkForExpiredPlots() { final JavaPlugin plugin = PlotMain.getMain(); Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() { @Override public void run() { checkExpired(plugin, true); } }, 0l, 12 * 60 * 60 * 20l); } /** * All loaded plots */ private static HashMap> plots; /** * All loaded plot worlds */ private static HashMap worlds = new HashMap(); public static Set getFlags() { return registeredFlags; } public static boolean isRegisteredFlag(String arg) { for (Flag flag : registeredFlags) { if (flag.getKey().equalsIgnoreCase(arg)) { return true; } } return false; } public static boolean registerFlag(Flag flag) { return registeredFlags.add(flag); } public static boolean unRegisterFlag(Flag flag) { return registeredFlags.remove(flag); } /** * Get all plots * * @return HashMap containing the plot ID and the plot object. */ public static Set getPlots() { ArrayList myplots = new ArrayList(); for (HashMap world : plots.values()) { myplots.addAll(world.values()); } return new HashSet(myplots); } /** * * @param player * @return */ public static Set getPlots(Player player) { UUID uuid = player.getUniqueId(); ArrayList myplots = new ArrayList(); for (HashMap world : plots.values()) { for (Plot plot : world.values()) { if (plot.hasOwner()) { if (plot.getOwner().equals(uuid)) { myplots.add(plot); } } } } return new HashSet(myplots); } /** * * @param world * @param player * @return */ public static Set getPlots(World world, Player player) { UUID uuid = player.getUniqueId(); ArrayList myplots = new ArrayList(); for (Plot plot : getPlots(world).values()) { if (plot.hasOwner()) { if (plot.getOwner().equals(uuid)) { myplots.add(plot); } } } return new HashSet(myplots); } /** * * @param world * @return */ public static HashMap getPlots(World world) { if (plots.containsKey(world.getName())) { return plots.get(world.getName()); } return new HashMap(); } /** * get all plot worlds */ public static String[] getPlotWorlds() { return (worlds.keySet().toArray(new String[0])); } /** * * @return */ public static String[] getPlotWorldsString() { return plots.keySet().toArray(new String[0]); } /** * * @param world * @return */ public static boolean isPlotWorld(World world) { return (worlds.containsKey(world.getName())); } /** * * @param world * @return */ public static PlotWorld getWorldSettings(World world) { if (worlds.containsKey(world.getName())) { return worlds.get(world.getName()); } return null; } /** * * @param world * @return */ public static PlotWorld getWorldSettings(String world) { if (worlds.containsKey(world)) { return worlds.get(world); } return null; } /** * * @param world * @return set containing the plots for a world */ public static Plot[] getWorldPlots(World world) { return (plots.get(world.getName()).values().toArray(new Plot[0])); } public static boolean removePlot(String world, PlotId id) { PlotDeleteEvent event = new PlotDeleteEvent(world, id); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { event.setCancelled(true); return false; } plots.get(world).remove(id); return true; } /** * Replace the plot object with an updated version * * @param plot * plot object */ public static void updatePlot(Plot plot) { String world = plot.world; if (!plots.containsKey(world)) { plots.put(world, new HashMap()); } plot.hasChanged = true; plots.get(world).put(plot.id, plot); } /** * TODO: Implement better system * * @param plugin * Plugin * @param async * Call async? */ private static void checkExpired(JavaPlugin plugin, boolean async) { if (async) { Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { @Override public void run() { for (String world : getPlotWorldsString()) { if (plots.containsKey(world)) { for (Plot plot : plots.get(world).values()) { if (plot.owner == null) { continue; } if (PlayerFunctions.hasExpired(plot)) { PlotDeleteEvent event = new PlotDeleteEvent(world, plot.id); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { event.setCancelled(true); } else { DBFunc.delete(world, plot); } } } } } } }); } else { for (String world : getPlotWorldsString()) { if (PlotMain.plots.containsKey(world)) { for (Plot plot : PlotMain.plots.get(world).values()) { if (PlayerFunctions.hasExpired(plot)) { PlotDeleteEvent event = new PlotDeleteEvent(world, plot.id); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { event.setCancelled(true); } else { DBFunc.delete(world, plot); } } } } } } } private void setupLogger() { File log = new File(getMain().getDataFolder() + File.separator + "logs" + File.separator + "plots.log"); if (!log.exists()) { try { if (!new File(getMain().getDataFolder() + File.separator + "logs").mkdirs()) { sendConsoleSenderMessage(C.PREFIX.s() + "&cFailed to create logs folder. Do it manually."); } if (log.createNewFile()) { FileWriter writer = new FileWriter(log); writer.write("Created at: " + new Date().toString() + "\n\n\n"); writer.close(); } } catch (IOException e) { e.printStackTrace(); } } Logger.setup(log); Logger.add(LogLevel.GENERAL, "Logger enabled"); } private static double getJavaVersion() { return Double.parseDouble(System.getProperty("java.specification.version")); } /** * On Load. */ @Override @SuppressWarnings("deprecation") public void onEnable() { setupLogger(); // Check for outdated java version. if (getJavaVersion() < 1.7) { sendConsoleSenderMessage(C.PREFIX.s() + "&cYour java version is outdated. Please update to at least 1.7."); sendConsoleSenderMessage(C.PREFIX.s() + "&cURL: &6https://java.com/en/download/index.jsp"); Bukkit.getPluginManager().disablePlugin(this); return; } configs(); if (Settings.METRICS) { try { Metrics metrics = new Metrics(this); metrics.start(); sendConsoleSenderMessage(C.PREFIX.s() + "&6Metrics enabled."); } catch (Exception e) { sendConsoleSenderMessage(C.PREFIX.s() + "&cFailed to load up metrics."); } } // TODO make this configurable PlotWorld.BLOCKS = new ArrayList<>(Arrays.asList(new Material[] { ACACIA_STAIRS, BEACON, BEDROCK, BIRCH_WOOD_STAIRS, BOOKSHELF, BREWING_STAND, BRICK, BRICK_STAIRS, BURNING_FURNACE, CAKE_BLOCK, CAULDRON, CLAY_BRICK, CLAY, COAL_BLOCK, COAL_ORE, COBBLE_WALL, COBBLESTONE, COBBLESTONE_STAIRS, COMMAND, DARK_OAK_STAIRS, DAYLIGHT_DETECTOR, DIAMOND_ORE, DIAMOND_BLOCK, DIRT, DISPENSER, DROPPER, EMERALD_BLOCK, EMERALD_ORE, ENCHANTMENT_TABLE, ENDER_PORTAL_FRAME, ENDER_STONE, FURNACE, GLOWSTONE, GOLD_ORE, GOLD_BLOCK, GRASS, GRAVEL, GLASS, HARD_CLAY, HAY_BLOCK, HUGE_MUSHROOM_1, HUGE_MUSHROOM_2, IRON_BLOCK, IRON_ORE, JACK_O_LANTERN, JUKEBOX, JUNGLE_WOOD_STAIRS, LAPIS_BLOCK, LAPIS_ORE, LEAVES, LEAVES_2, LOG, LOG_2, MELON_BLOCK, MOB_SPAWNER, MOSSY_COBBLESTONE, MYCEL, NETHER_BRICK, NETHER_BRICK_STAIRS, NETHERRACK, NOTE_BLOCK, OBSIDIAN, PACKED_ICE, PUMPKIN, QUARTZ_BLOCK, QUARTZ_ORE, QUARTZ_STAIRS, REDSTONE_BLOCK, SANDSTONE, SAND, SANDSTONE_STAIRS, SMOOTH_BRICK, SMOOTH_STAIRS, SNOW_BLOCK, SOUL_SAND, SPONGE, SPRUCE_WOOD_STAIRS, STONE, WOOD, WOOD_STAIRS, WORKBENCH, WOOL, getMaterial(44), getMaterial(126) })); if (Settings.KILL_ROAD_MOBS) { killAllEntities(); } if (C.ENABLED.s().length() > 0) { Broadcast(C.ENABLED); } if (Settings.DB.USE_MYSQL) { try { mySQL = new MySQL(this, Settings.DB.HOST_NAME, Settings.DB.PORT, Settings.DB.DATABASE, Settings.DB.USER, Settings.DB.PASSWORD); connection = mySQL.openConnection(); { DatabaseMetaData meta = connection.getMetaData(); ResultSet res = meta.getTables(null, null, "plot", null); if (!res.next()) { DBFunc.createTables("mysql"); } } } catch (ClassNotFoundException | SQLException e) { Logger.add(LogLevel.DANGER, "MySQL connection failed."); System.out.print("\u001B[31m[Plots] MySQL is not setup correctly. The plugin will disable itself.\u001B[0m"); System.out.print("\u001B[36m==== Here is an ugly stacktrace if you are interested in those things ====\u001B[0m"); e.printStackTrace(); Bukkit.getPluginManager().disablePlugin(this); return; } plots = DBFunc.getPlots(); } else if (Settings.DB.USE_MONGO) { sendConsoleSenderMessage(C.PREFIX.s() + "MongoDB is not yet implemented"); } else if (Settings.DB.USE_SQLITE) { try { connection = new SQLite(this, Settings.DB.SQLITE_DB + ".db").openConnection(); { DatabaseMetaData meta = connection.getMetaData(); ResultSet res = meta.getTables(null, null, "plot", null); if (!res.next()) { DBFunc.createTables("sqlite"); } } } catch (ClassNotFoundException | SQLException e) { Logger.add(LogLevel.DANGER, "SQLite connection failed"); sendConsoleSenderMessage(C.PREFIX.s() + "&cFailed to open SQLite connection. The plugin will disable itself."); sendConsoleSenderMessage("&9==== Here is an ugly stacktrace, if you are interested in those things ==="); e.printStackTrace(); Bukkit.getPluginManager().disablePlugin(this); return; } plots = DBFunc.getPlots(); } else { Logger.add(LogLevel.DANGER, "No storage type is set."); sendConsoleSenderMessage(C.PREFIX + "&cNo storage type is set!"); getServer().getPluginManager().disablePlugin(this); return; } if (getServer().getPluginManager().getPlugin("PlotMe") != null) { try { new PlotMeConverter(this).runAsync(); } catch (Exception e) { e.printStackTrace(); } } getCommand("plots").setExecutor(new MainCommand()); getCommand("plots").setAliases(new ArrayList() { { add("p"); add("plotme"); add("plot"); } }); getServer().getPluginManager().registerEvents(new PlayerEvents(), this); if (getServer().getPluginManager().getPlugin("CameraAPI") != null) { cameraAPI = CameraAPI.getInstance(); Camera camera = new Camera(); MainCommand.subCommands.add(camera); getServer().getPluginManager().registerEvents(camera, this); } if (getServer().getPluginManager().getPlugin("BarAPI") != null) { barAPI = (BarAPI) getServer().getPluginManager().getPlugin("BarAPI"); } if (getServer().getPluginManager().getPlugin("WorldEdit") != null) { worldEdit = (WorldEditPlugin) getServer().getPluginManager().getPlugin("WorldEdit"); getServer().getPluginManager().registerEvents(new WorldEditListener(), this); } checkExpired(PlotMain.getMain(), true); checkForExpiredPlots(); getServer().getScheduler().scheduleSyncRepeatingTask(this, new Lag(), 100L, 1L); if (Web.ENABLED) { sendConsoleSenderMessage(C.PREFIX.s() + "This is not yet implemented..."); } } /** * Get MySQL Connection * * @return connection MySQL Connection. */ @SuppressWarnings("unused") public static Connection getConnection() { return connection; } /** .. */ // Old Stuff /* * private static boolean checkForUpdate() throws IOException { URL call = * new URL(Settings.Update.VERSION_URL); InputStream stream = * call.openStream(); BufferedReader reader = new BufferedReader(new * InputStreamReader(stream)); String latest = reader.readLine(); * reader.close(); return * !getPlotMain().getDescription().getVersion().equalsIgnoreCase(latest); } * private static String getNextUpdateString() throws IOException { URL call * = new URL(Settings.Update.VERSION_URL); InputStream stream = * call.openStream(); BufferedReader reader = new BufferedReader(new * InputStreamReader(stream)); return reader.readLine(); } private static * void update() throws IOException { sendConsoleSenderMessage(C.PREFIX.s() * + "&c&lThere is an update! New Update: &6&l" + getNextUpdateString() + * "&c&l, Current Update: &6&l" + * getPlotMain().getDescription().getVersion()); } */ /** * Send a message to the console. * * @param string * message */ public static void sendConsoleSenderMessage(String string) { if (getMain().getServer().getConsoleSender() == null) { System.out.println(ChatColor.stripColor(ConsoleColors.fromString(string))); } else { getMain().getServer().getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', string)); } } public static boolean teleportPlayer(Player player, Location from, Plot plot) { PlayerTeleportToPlotEvent event = new PlayerTeleportToPlotEvent(player, from, plot); Bukkit.getServer().getPluginManager().callEvent(event); if (!event.isCancelled()) { Location location = PlotHelper.getPlotHome(Bukkit.getWorld(plot.world), plot); if ((location.getBlockX() >= 29999999) || (location.getBlockX() <= -29999999) || (location.getBlockZ() >= 299999999) || (location.getBlockZ() <= -29999999)) { event.setCancelled(true); return false; } player.teleport(location); PlayerFunctions.sendMessage(player, C.TELEPORTED_TO_PLOT); } return event.isCancelled(); } /** * Send a message to the console * * @param c * message */ @SuppressWarnings("unused") public static void sendConsoleSenderMessage(C c) { sendConsoleSenderMessage(c.s()); } /** * Broadcast publicly * * @param c * message */ public static void Broadcast(C c) { Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', C.PREFIX.s() + c.s())); } /** * Returns the main class. * * @return (this class) */ public static PlotMain getMain() { return JavaPlugin.getPlugin(PlotMain.class); } /** * Broadcast a message to all admins * * @param c * message */ public static void BroadcastWithPerms(C c) { for (Player player : Bukkit.getOnlinePlayers()) { if (player.hasPermission("plots.admin")) { PlayerFunctions.sendMessage(player, c); } } System.out.println(ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', C.PREFIX.s() + c.s()))); } public static void reloadTranslations() throws IOException { translations = YamlConfiguration.loadConfiguration(translationsFile); } /** * Load configuration files */ @SuppressWarnings("deprecation") public static void configs() { File folder = new File(getMain().getDataFolder() + File.separator + "config"); if (!folder.exists() && !folder.mkdirs()) { sendConsoleSenderMessage(C.PREFIX.s() + "&cFailed to create the /plugins/config folder. Please create it manually."); } try { configFile = new File(getMain().getDataFolder() + File.separator + "config" + File.separator + "settings.yml"); if (!configFile.exists()) { configFile.createNewFile(); } config = YamlConfiguration.loadConfiguration(configFile); setupConfig(); } catch (Exception err_trans) { Logger.add(LogLevel.DANGER, "Failed to save settings.yml"); System.out.println("Failed to save settings.yml"); } try { storageFile = new File(getMain().getDataFolder() + File.separator + "config" + File.separator + "storage.yml"); if (!storageFile.exists()) { storageFile.createNewFile(); } storage = YamlConfiguration.loadConfiguration(storageFile); setupStorage(); } catch (Exception err_trans) { Logger.add(LogLevel.DANGER, "Failed to save storage.yml"); System.out.println("Failed to save storage.yml"); } try { translationsFile = new File(getMain().getDataFolder() + File.separator + "config" + File.separator + "translations.yml"); if (!translationsFile.exists()) { translationsFile.createNewFile(); } translations = YamlConfiguration.loadConfiguration(translationsFile); setupTranslations(); } catch (Exception err_trans) { Logger.add(LogLevel.DANGER, "Failed to save translations.yml"); System.out.println("Failed to save translations.yml"); } try { config.save(configFile); storage.save(storageFile); translations.save(translationsFile); } catch (IOException e) { Logger.add(LogLevel.DANGER, "Configuration file saving failed"); e.printStackTrace(); } { Settings.DB.USE_MYSQL = storage.getBoolean("mysql.use"); Settings.DB.USER = storage.getString("mysql.user"); Settings.DB.PASSWORD = storage.getString("mysql.password"); Settings.DB.HOST_NAME = storage.getString("mysql.host"); Settings.DB.PORT = storage.getString("mysql.port"); Settings.DB.DATABASE = storage.getString("mysql.database"); Settings.DB.USE_SQLITE = storage.getBoolean("sqlite.use"); Settings.DB.SQLITE_DB = storage.getString("sqlite.db"); } { Settings.METRICS = config.getBoolean("metrics"); // Web // Web.ENABLED = config.getBoolean("web.enabled"); // Web.PORT = config.getInt("web.port"); } } /** * Kill all entities on roads */ @SuppressWarnings("deprecation") public static void killAllEntities() { Bukkit.getScheduler().scheduleAsyncRepeatingTask(getMain(), new Runnable() { Location location; long ticked = 0l; long error = 0l; { sendConsoleSenderMessage(C.PREFIX.s() + "KillAllEntities started."); } @Override public void run() { if (this.ticked > 36000l) { this.ticked = 0l; sendConsoleSenderMessage(C.PREFIX.s() + "KillAllEntities has been running for 60 minutes. Errors: " + this.error); this.error = 0l; } for (String w : getPlotWorlds()) { getWorldSettings(w); World world = Bukkit.getServer().getWorld(w); try { if (world.getLoadedChunks().length < 1) { continue; } for (Chunk chunk : world.getLoadedChunks()) { Entity[] entities = chunk.getEntities(); for (int i = entities.length - 1; i >= 0; i--) { Entity entity = entities[i]; if (entity.getType() == EntityType.PLAYER) { continue; } this.location = entity.getLocation(); if (!PlayerEvents.isInPlot(this.location)) { boolean tamed = false; if (Settings.MOB_PATHFINDING) { if (entity instanceof Tameable) { Tameable tameable = (Tameable) entity; if (tameable.isTamed()) { tamed = true; } } else if (entity instanceof LivingEntity) { LivingEntity livingEntity = ((LivingEntity) entity); if (livingEntity.getCustomName() != null) { tamed = true; } } if (tamed) { boolean found = false; int radius = 1; int dir = 0; int x = this.location.getBlockX(); int y = this.location.getBlockY(); int z = this.location.getBlockZ(); while (!found || (radius > PlotWorld.ROAD_WIDTH_DEFAULT)) { Location pos; switch (dir) { case 0: pos = new Location(world, x + radius, y, z); dir++; break; case 1: pos = new Location(world, x, y, z + radius); dir++; break; case 2: pos = new Location(world, x - radius, y, z); dir++; break; case 3: pos = new Location(world, x, y, z - radius); dir = 0; radius++; break; default: pos = this.location; break; } if (PlayerEvents.isInPlot(pos)) { entity.teleport(pos.add(0.5, 0, 0.5)); found = true; break; } } } } if (!tamed) { entity.remove(); } } } } } catch (Exception e) { ++this.error; } finally { ++this.ticked; } } } }, 0l, 2l); } /** * SETUP: settings.properties */ private static void setupConfig() { config.set("version", config_ver); Map options = new HashMap(); // options.put("auto_update", false); options.put("kill_road_mobs", Settings.KILL_ROAD_MOBS_DEFAULT); options.put("mob_pathfinding", Settings.MOB_PATHFINDING_DEFAULT); options.put("web.enabled", Web.ENABLED); options.put("web.port", Web.PORT); options.put("metrics", true); for (Entry node : options.entrySet()) { if (!config.contains(node.getKey())) { config.set(node.getKey(), node.getValue()); } } Web.ENABLED = config.getBoolean("web.enabled"); Web.PORT = config.getInt("web.port"); Settings.KILL_ROAD_MOBS = config.getBoolean("kill_road_mobs"); Settings.MOB_PATHFINDING = config.getBoolean("mob_pathfinding"); Settings.METRICS = config.getBoolean("metrics"); for (String node : config.getConfigurationSection("worlds").getKeys(false)) { World world = Bukkit.getWorld(node); if (world == null) { Logger.add(LogLevel.WARNING, "World '" + node + "' in settings.yml does not exist (case sensitive)"); } else { ChunkGenerator gen = world.getGenerator(); if ((gen == null) || !gen.toString().equals("PlotSquared")) { Logger.add(LogLevel.WARNING, "World '" + node + "' in settings.yml is not using PlotSquared generator"); } } } } /** * SETUP: storage.properties */ private static void setupStorage() { storage.set("version", storage_ver); Map options = new HashMap(); options.put("mysql.use", true); options.put("sqlite.use", false); options.put("sqlite.db", "storage"); options.put("mysql.host", "localhost"); options.put("mysql.port", "3306"); options.put("mysql.user", "root"); options.put("mysql.password", "password"); options.put("mysql.database", "plot_db"); for (Entry node : options.entrySet()) { if (!storage.contains(node.getKey())) { storage.set(node.getKey(), node.getValue()); } } } /** * SETUP: translations.properties */ public static void setupTranslations() { translations.set("version", translations_ver); for (C c : C.values()) { if (!translations.contains(c.toString())) { translations.set(c.toString(), c.s()); } } } /** * On unload */ @Override public void onDisable() { Logger.add(LogLevel.GENERAL, "Logger disabled"); try { Logger.write(); } catch (IOException e1) { e1.printStackTrace(); } try { connection.close(); mySQL.closeConnection(); } catch (NullPointerException | SQLException e) { if (connection != null) { Logger.add(LogLevel.DANGER, "Could not close mysql connection"); } } /* * if(PlotWeb.PLOTWEB != null) { try { PlotWeb.PLOTWEB.stop(); } catch * (Exception e) { e.printStackTrace(); } } */ } public static void addPlotWorld(String world, PlotWorld plotworld) { PlotMain.worlds.put(world, plotworld); if (!plots.containsKey(world)) { plots.put(world, new HashMap()); } } }