diff --git a/build.xml b/build.xml
index d71af6b9..71f692c8 100644
--- a/build.xml
+++ b/build.xml
@@ -46,6 +46,7 @@
+
diff --git a/config_world.yml b/config_world.yml
new file mode 100644
index 00000000..3108d091
--- /dev/null
+++ b/config_world.yml
@@ -0,0 +1,84 @@
+#
+# WorldGuard's configuration file.
+#
+# This is the a per-world configuration file. It only affects one
+# corresponding world.
+#
+# About editing this file:
+# - DO NOT USE TABS. You MUST use spaces or Bukkit will complain. If
+# you use an editor like Notepad++ (recommended for Windows users), you
+# must configure it to "replace tabs with spaces." In Notepad++, this can
+# be changed in Settings > Preferences > Language Menu.
+# - Don't get rid of the indents. They are indented so some entries are
+# in categories (like "enforce-single-session" is in the "protection"
+# category.
+# - If you want to check the format of this file before putting it
+# into WorldGuard, paste it into http://yaml-online-parser.appspot.com/
+# and see if it gives "ERROR:".
+# - Lines starting with # are commentsand so they are ignored.
+#
+
+summary-on-start: on
+
+protection:
+ enforce-single-session: on
+ item-durability: on
+
+simulation:
+ sponge:
+ enable: on
+ redstone: off
+ radius: 3
+
+physics:
+ no-physics-gravel: off
+ no-physics-sand: off
+ allow-portal-anywhere: off
+ disable-water-damage-blocks: []
+
+ignition:
+ block-tnt: off
+ block-lighter: off
+
+fire:
+ disable-all-fire-spread: off
+ disable-fire-spread-blocks: []
+ disable-lava-fire-spread: on
+ lava-spread-blocks: []
+
+mobs:
+ block-creeper-explosions: off
+ block-creeper-block-damage: off
+ block-creature-spawn: []
+
+spawn:
+ login-protection: 3
+ spawn-protection: 0
+ kick-on-death: off
+ exact-respawn: off
+ teleport-to-home-on-death: off
+
+player-damage:
+ disable-fall-damage: off
+ disable-lava-damage: off
+ disable-fire-damage: off
+ disable-drowning-damage: off
+ disable-suffocation-damage: off
+ disable-contact-damage: off
+ teleport-on-suffocation: off
+
+regions:
+ enable: on
+ wand: 287
+ max-claim-volume: 30000
+ claim-only-inside-existing-regions: off
+ max-region-count-per-player: 7
+
+iconomy:
+ enable: on
+ buy-on-claim: on
+ # Price per block for buying on claim
+ buy-on-claim-price: 2
+
+blacklist:
+ use-as-whitelist: off
\ No newline at end of file
diff --git a/src/com/sk89q/worldguard/LocalPlayer.java b/src/com/sk89q/worldguard/LocalPlayer.java
index 76169cce..736994b6 100644
--- a/src/com/sk89q/worldguard/LocalPlayer.java
+++ b/src/com/sk89q/worldguard/LocalPlayer.java
@@ -72,6 +72,14 @@ public abstract class LocalPlayer {
*/
public abstract String[] getGroups();
+ /**
+ * Returns whether a player has permission.
+ *
+ * @param perm
+ * @return
+ */
+ public abstract boolean hasPermission(String perm);
+
@Override
public boolean equals(Object obj) {
if (!(obj instanceof LocalPlayer)) {
diff --git a/src/com/sk89q/worldguard/bukkit/BukkitPlayer.java b/src/com/sk89q/worldguard/bukkit/BukkitPlayer.java
index 0dee4d6c..3d7b0e15 100644
--- a/src/com/sk89q/worldguard/bukkit/BukkitPlayer.java
+++ b/src/com/sk89q/worldguard/bukkit/BukkitPlayer.java
@@ -69,4 +69,9 @@ public void printRaw(String msg) {
player.sendMessage(msg);
}
+ @Override
+ public boolean hasPermission(String perm) {
+ return plugin.hasPermission(player, perm);
+ }
+
}
diff --git a/src/com/sk89q/worldguard/bukkit/ConfigurationManager.java b/src/com/sk89q/worldguard/bukkit/ConfigurationManager.java
new file mode 100644
index 00000000..00326933
--- /dev/null
+++ b/src/com/sk89q/worldguard/bukkit/ConfigurationManager.java
@@ -0,0 +1,121 @@
+// $Id$
+/*
+ * WorldGuard
+ * Copyright (C) 2010 sk89q
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.sk89q.worldguard.bukkit;
+
+import com.sk89q.worldguard.LocalPlayer;
+import com.sk89q.worldguard.blacklist.Blacklist;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import org.bukkit.World;
+import org.bukkit.util.config.Configuration;
+
+/**
+ * Represents the global configuration and also delegates configuration
+ * for individual worlds.
+ *
+ * @author sk89q
+ * @author Michael
+ */
+public class ConfigurationManager {
+
+ /**
+ * Reference to the plugin.
+ */
+ private WorldGuardPlugin plugin;
+
+ /**
+ * Holds configurations for different worlds.
+ */
+ private Map worlds;
+
+ public boolean suppressTickSyncWarnings;
+
+ /**
+ * Construct the object.
+ *
+ * @param plugin
+ */
+ public ConfigurationManager(WorldGuardPlugin plugin) {
+ this.plugin = plugin;
+ this.worlds = new HashMap();
+ }
+
+ /**
+ * Load the configuration.
+ */
+ public void load() {
+ // Create the default configuration file
+ WorldGuardPlugin.createDefaultConfiguration(
+ new File(plugin.getDataFolder(), "config.yml"), "config.yml");
+
+ Configuration config = plugin.getConfiguration();
+ config.load();
+
+ suppressTickSyncWarnings = config.getBoolean(
+ "suppress-tick-sync-warnings", false);
+
+ // Load configurations for each world
+ for (World world : plugin.getServer().getWorlds()) {
+ forWorld(world.getName());
+ }
+ }
+
+ /**
+ * Unload the configuration.
+ */
+ public void unload() {
+ worlds.clear();
+ }
+
+ /**
+ * Get the configuration for a world.
+ *
+ * @param worldName
+ * @return
+ */
+ public WorldConfiguration forWorld(String worldName) {
+ WorldConfiguration config = worlds.get(worldName);
+
+ if (config == null) {
+ config = new WorldConfiguration(plugin, worldName);
+ worlds.put(worldName, config);
+ }
+
+ return config;
+ }
+
+ /**
+ * Forget a player.
+ *
+ * @param player
+ */
+ public void forgetPlayer(LocalPlayer player) {
+ for (Map.Entry entry
+ : worlds.entrySet()) {
+
+ // The blacklist needs to forget players
+ Blacklist bl = entry.getValue().getBlacklist();
+ if (bl != null) {
+ bl.forgetPlayer(player);
+ }
+
+ }
+ }
+}
diff --git a/src/com/sk89q/worldguard/bukkit/GlobalConfiguration.java b/src/com/sk89q/worldguard/bukkit/GlobalConfiguration.java
deleted file mode 100644
index 5470abd6..00000000
--- a/src/com/sk89q/worldguard/bukkit/GlobalConfiguration.java
+++ /dev/null
@@ -1,317 +0,0 @@
-// $Id$
-/*
- * WorldGuard
- * Copyright (C) 2010 sk89q
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.sk89q.worldguard.bukkit;
-
-import com.nijiko.coelho.iConomy.iConomy;
-import com.sk89q.worldedit.Vector;
-import com.sk89q.worldguard.LocalPlayer;
-import com.sk89q.worldguard.TickSyncDelayLoggerFilter;
-import com.sk89q.worldguard.blacklist.Blacklist;
-import com.sk89q.worldguard.protection.databases.CSVDatabase;
-import com.sk89q.worldguard.protection.managers.RegionManager;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Filter;
-import java.util.logging.Logger;
-import org.bukkit.World;
-import org.bukkit.entity.Player;
-import org.bukkit.util.config.Configuration;
-
-/**
- * Represents the global configuration and also delegates configuration
- * for individual worlds.
- *
- * @author Michael
- * @author sk89q
- */
-public class GlobalConfiguration {
-
- private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
-
- private WorldGuardPlugin plugin;
- private Map worldConfig;
-
- protected Set invinciblePlayers = new HashSet();
- protected Set amphibiousPlayers = new HashSet();
-
- private iConomy iConomy;
-
- /**
- * Construct the object.
- *
- * @param plugin
- */
- public GlobalConfiguration(WorldGuardPlugin plugin) {
- this.plugin = plugin;
- this.worldConfig = new HashMap();
- this.iConomy = null;
- }
-
- /**
- * Get the configuration for a world.
- *
- * @param worldName
- * @return
- */
- public WorldConfiguration getWorldConfig(String worldName) {
- WorldConfiguration ret = worldConfig.get(worldName);
- if (ret == null) {
- ret = createWorldConfig(worldName);
- worldConfig.put(worldName, ret);
- }
-
- return ret;
- }
-
- /**
- * Create the configuration for a world.
- *
- * @param worldName
- * @return
- */
- private WorldConfiguration createWorldConfig(String worldName) {
- File baseFolder = new File(plugin.getDataFolder(), worldName);
- File configFile = new File(baseFolder, "config.yml");
- File blacklistFile = new File(baseFolder, "blacklist.txt");
-
- return new WorldConfiguration(plugin, worldName, configFile, blacklistFile);
- }
-
- /**
- * Load the configuration files.
- */
- public void load() {
- checkOldConfigFiles();
- checkOldCSVDB();
-
- Configuration config = plugin.getConfiguration();
-
- boolean suppressTickSyncWarnings = config.getBoolean(
- "suppress-tick-sync-warnings", false);
-
- invinciblePlayers.clear();
- amphibiousPlayers.clear();
-
- // Build initial lists of users matching the criteria
- for (Player player : plugin.getServer().getOnlinePlayers()) {
- if (plugin.inGroup(player, "wg-invincible"))
- invinciblePlayers.add(player.getName());
-
- if (plugin.inGroup(player, "wg-amphibious"))
- amphibiousPlayers.add(player.getName());
- }
-
- if (suppressTickSyncWarnings) {
- Logger.getLogger("Minecraft").setFilter(
- new TickSyncDelayLoggerFilter());
- } else {
- Filter filter = Logger.getLogger("Minecraft").getFilter();
- if (filter != null && filter instanceof TickSyncDelayLoggerFilter) {
- Logger.getLogger("Minecraft").setFilter(null);
- }
- }
-
- loadWorldConfiguration();
- }
-
- public void unload() {
- }
-
- /**
- * Load the configurations for the different worlds.
- */
- private void loadWorldConfiguration() {
- worldConfig.clear();
-
- for (World w : plugin.getServer().getWorlds()) {
- String worldName = w.getName();
- worldConfig.put(worldName, createWorldConfig(worldName));
- }
- }
-
- /**
- * Check for old pre-4.x configuration files.
- */
- private void checkOldConfigFiles() {
- File oldFile = new File(plugin.getDataFolder(), "blacklist.txt");
-
- if (oldFile.exists()) {
- logger.warning("WorldGuard: blacklist.txt is outdated, please "
- + "reapply your configuration in /blacklist.txt");
- logger.warning("WorldGuard: blacklist.txt renamed to blacklist.txt.old");
-
- oldFile.renameTo(new File(plugin.getDataFolder(),
- "blacklist.txt.old"));
- }
- }
-
- /**
- * Check for old world databases from pre-4.x versions. Also convert them
- * over to the new format.
- */
- private void checkOldCSVDB() {
- try {
- File oldDatabase = new File(plugin.getDataFolder(), "regions.txt");
- if (!oldDatabase.exists()) return;
-
- logger.info("WorldGuard: The regions database has changed in 4.x. "
- + "Your old regions database will be converted to the new format "
- + "and set as your primarily world's database.");
- logger.info("WorldGuard: Converting...");
-
- // We're assuming that the regions
- World w = plugin.getServer().getWorlds().get(0);
-
- RegionManager mgr = plugin.getGlobalRegionManager()
- .get(w.getName());
-
- // First load up the old database using the CSV loader
- CSVDatabase db = new CSVDatabase(oldDatabase);
- db.load();
-
- // Then save the new database
- mgr.setRegions(db.getRegions());
- mgr.save();
-
- logger.info("WorldGuard: regions.txt has been renamed to regions.txt.old.");
-
- oldDatabase.renameTo(new File(plugin.getDataFolder(), "regions.txt.old"));
- } catch (FileNotFoundException e) {
- } catch (IOException e) {
- logger.warning("WorldGuard: Failed to load regions: "
- + e.getMessage());
- }
- }
-
- /**
- * Check if a player has permission to build at a location.
- *
- * @param player
- * @param pt
- * @return
- */
- public boolean canBuild(Player player, Vector pt) {
- if (getWorldConfig(player.getWorld().getName()).useRegions) {
- LocalPlayer localPlayer = plugin.wrapPlayer(player);
-
- if (!plugin.hasPermission(player, "region.bypass")) {
- RegionManager mgr = plugin.getGlobalRegionManager()
- .get(player.getWorld().getName());
-
- if (!mgr.getApplicableRegions(pt).canBuild(localPlayer)) {
- return false;
- }
- }
-
- return true;
- } else {
- return true;
- }
- }
-
- /**
- * Check if a player has permission to build at a location.
- *
- * @param player
- * @param x
- * @param y
- * @param z
- * @return
- */
- public boolean canBuild(Player player, int x, int y, int z) {
- return canBuild(player, new Vector(x, y, z));
- }
-
- /**
- * Check whether a player can breathe underwater.
- *
- * @param playerName
- * @return
- */
- public boolean isAmphibiousPlayer(String playerName) {
- if (amphibiousPlayers.contains(playerName)) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Check whether a player is invincible.
- *
- * @param playerName
- * @return
- */
- public boolean isInvinciblePlayer(String playerName) {
- if (invinciblePlayers.contains(playerName)) {
- return true;
- }
-
- return false;
- }
-
- public void addAmphibiousPlayer(String playerName) {
- amphibiousPlayers.add(playerName);
- }
-
- public void addInvinciblePlayer(String playerName) {
- invinciblePlayers.add(playerName);
- }
-
- public void removeAmphibiousPlayer(String playerName) {
- amphibiousPlayers.remove(playerName);
- }
-
- public void removeInvinciblePlayer(String playerName) {
- invinciblePlayers.remove(playerName);
- }
-
- /**
- * Forget all players.
- * @param player
- */
- public void forgetPlayer(LocalPlayer player) {
-
- for (Map.Entry entry : worldConfig
- .entrySet()) {
- Blacklist bl = entry.getValue().getBlacklist();
- if (bl != null) {
- bl.forgetPlayer(player);
- }
- }
-
- }
-
- public WorldGuardPlugin getWorldGuardPlugin() {
- return this.plugin;
- }
-
- public iConomy getiConomy() {
- return this.iConomy;
- }
-
- public void setiConomy(iConomy newVal) {
- this.iConomy = newVal;
- }
-}
diff --git a/src/com/sk89q/worldguard/bukkit/LegacyWorldGuardMigration.java b/src/com/sk89q/worldguard/bukkit/LegacyWorldGuardMigration.java
new file mode 100644
index 00000000..9d88510f
--- /dev/null
+++ b/src/com/sk89q/worldguard/bukkit/LegacyWorldGuardMigration.java
@@ -0,0 +1,154 @@
+// $Id$
+/*
+ * WorldGuard
+ * Copyright (C) 2010 sk89q
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+*/
+
+package com.sk89q.worldguard.bukkit;
+
+import java.io.*;
+import java.util.logging.Logger;
+import org.bukkit.World;
+import com.sk89q.worldguard.protection.databases.CSVDatabase;
+import com.sk89q.worldguard.protection.managers.RegionManager;
+
+/**
+ * Utility methods for porting from legacy versions.
+ *
+ * @author sk89q
+ */
+public class LegacyWorldGuardMigration {
+ /**
+ * Logger for messages.
+ */
+ protected static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
+
+ /**
+ * Port over the blacklist.
+ *
+ * @param plugin
+ */
+ public static void migrateBlacklist(WorldGuardPlugin plugin) {
+ World mainWorld = plugin.getServer().getWorlds().get(0);
+ String mainWorldName = mainWorld.getName();
+ String newPath = "worlds/" + mainWorldName + "/blacklist.txt";
+
+ File oldFile = new File(plugin.getDataFolder(), "blacklist.txt");
+ File newFile = new File(plugin.getDataFolder(), newPath);
+
+ if (!newFile.exists() && oldFile.exists()) {
+ logger.warning("WorldGuard: WorldGuard will now update your blacklist "
+ + "from an older version of WorldGuard.");
+
+ // Need to make root directories
+ newFile.getParentFile().mkdirs();
+
+ if (copyFile(oldFile, newFile)) {
+ oldFile.renameTo(new File(plugin.getDataFolder(),
+ "blacklist.txt.old"));
+ } else {
+ logger.warning("WorldGuard: blacklist.txt has been converted " +
+ "for the main world at " + newPath + "");
+ logger.warning("WorldGuard: Your other worlds currently have no " +
+ "blacklist defined!");
+ }
+
+ }
+ }
+
+ /**
+ * Migrate region settings.
+ *
+ * @param plugin
+ */
+ public static void migrateRegions(WorldGuardPlugin plugin) {
+ try {
+ File oldDatabase = new File(plugin.getDataFolder(), "regions.txt");
+ if (!oldDatabase.exists()) return;
+
+ logger.info("WorldGuard: The regions database has changed in 4.x. "
+ + "Your old regions database will be converted to the new format "
+ + "and set as your primarily world's database.");
+
+ World w = plugin.getServer().getWorlds().get(0);
+
+ RegionManager mgr = plugin.getGlobalRegionManager()
+ .get(w.getName());
+
+ // First load up the old database using the CSV loader
+ CSVDatabase db = new CSVDatabase(oldDatabase);
+ db.load();
+
+ // Then save the new database
+ mgr.setRegions(db.getRegions());
+ mgr.save();
+
+ oldDatabase.renameTo(new File(plugin.getDataFolder(), "regions.txt.old"));
+
+ logger.info("WorldGuard: Regions database converted!");
+ } catch (FileNotFoundException e) {
+ } catch (IOException e) {
+ logger.warning("WorldGuard: Failed to load regions: "
+ + e.getMessage());
+ }
+ }
+
+ /**
+ * Copies a file.
+ *
+ * @param from
+ * @param to
+ * @return true if successful
+ */
+ private static boolean copyFile(File from, File to) {
+ InputStream in = null;
+ OutputStream out = null;
+
+ try {
+ in = new FileInputStream(from);
+ out = new FileOutputStream(to);
+
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+
+ in.close();
+ out.close();
+
+ return true;
+ } catch (FileNotFoundException ex) {
+ } catch (IOException e) {
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ }
+ }
+
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java b/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java
index 5ad5023a..3a90bbfc 100644
--- a/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java
+++ b/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java
@@ -35,7 +35,9 @@
import org.bukkit.util.config.Configuration;
/**
+ * Holds the configuration for individual worlds.
*
+ * @author sk89q
* @author Michael
*/
public class WorldConfiguration {
@@ -95,17 +97,26 @@ public class WorldConfiguration {
/* Configuration data end */
- public WorldConfiguration(WorldGuardPlugin wp, String worldName,
- File configFile, File blacklistFile) {
- this.plugin = wp;
+ /**
+ * Construct the object.
+ *
+ * @param plugin
+ * @param worldName
+ */
+ public WorldConfiguration(WorldGuardPlugin plugin, String worldName) {
+ File baseFolder = new File(plugin.getDataFolder(), "worlds/" + worldName);
+ configFile = new File(baseFolder, "config.yml");
+ blacklistFile = new File(baseFolder, "blacklist.txt");
+
+ this.plugin = plugin;
this.worldName = worldName;
- this.configFile = configFile;
- this.blacklistFile = blacklistFile;
-
- WorldGuardPlugin.createDefaultConfiguration(configFile, "config.yml");
+
+ WorldGuardPlugin.createDefaultConfiguration(configFile, "config_world.yml");
WorldGuardPlugin.createDefaultConfiguration(blacklistFile, "blacklist.txt");
loadConfiguration();
+
+ logger.info("WorldGuard: Loaded configuration for world '" + worldName + '"');
}
/**
diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java
index 499b2f89..c9ee89a8 100644
--- a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java
+++ b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java
@@ -23,16 +23,9 @@
import org.bukkit.event.Event.Priority;
import org.bukkit.event.Event;
import org.bukkit.plugin.PluginManager;
-import com.nijiko.coelho.iConomy.iConomy;
-import com.nijiko.coelho.iConomy.system.Account;
-import java.util.Iterator;
-import java.util.List;
import org.bukkit.block.Block;
-import org.bukkit.block.BlockState;
-import org.bukkit.block.Sign;
import org.bukkit.ChatColor;
import org.bukkit.Material;
-import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.World;
import org.bukkit.event.block.*;
@@ -41,10 +34,7 @@
import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.blacklist.events.*;
-import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
-import com.sk89q.worldguard.protection.regions.ProtectedRegion;
-
import static com.sk89q.worldguard.bukkit.BukkitUtil.*;
public class WorldGuardBlockListener extends BlockListener {
@@ -93,13 +83,11 @@ public void onBlockDamage(BlockDamageEvent event) {
Player player = event.getPlayer();
Block blockDamaged = event.getBlock();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (wcfg.useRegions && blockDamaged.getType() == Material.CAKE_BLOCK) {
- Vector pt = toVector(blockDamaged);
-
- if (!cfg.canBuild(player, pt)) {
+ if (!plugin.canBuild(player, blockDamaged.getLocation())) {
player.sendMessage(ChatColor.DARK_RED + "You're not invited to this tea party!");
event.setCancelled(true);
@@ -122,8 +110,8 @@ public void onBlockBreak(BlockBreakEvent event) {
}
Player player = event.getPlayer();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (!wcfg.itemDurability) {
ItemStack held = player.getItemInHand();
@@ -134,9 +122,7 @@ public void onBlockBreak(BlockBreakEvent event) {
}
if (wcfg.useRegions) {
- Vector pt = BukkitUtil.toVector(event.getBlock());
-
- if (!cfg.canBuild(player, pt)) {
+ if (!plugin.canBuild(player, event.getBlock().getLocation())) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
event.setCancelled(true);
return;
@@ -181,8 +167,8 @@ public void onBlockFlow(BlockFromToEvent event) {
boolean isWater = blockFrom.getTypeId() == 8 || blockFrom.getTypeId() == 9;
boolean isLava = blockFrom.getTypeId() == 10 || blockFrom.getTypeId() == 11;
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(event.getBlock().getWorld().getName());
if (wcfg.simulateSponge && isWater) {
int ox = blockTo.getX();
@@ -270,8 +256,8 @@ public void onBlockIgnite(BlockIgniteEvent event) {
Block block = event.getBlock();
World world = block.getWorld();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(world.getName());
boolean isFireSpread = cause == IgniteCause.SPREAD;
@@ -358,8 +344,8 @@ public void onBlockBurn(BlockBurnEvent event) {
return;
}
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(event.getBlock().getWorld().getName());
if (wcfg.disableFireSpread) {
event.setCancelled(true);
@@ -393,8 +379,8 @@ public void onBlockPhysics(BlockPhysicsEvent event) {
return;
}
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(event.getBlock().getWorld().getName());
int id = event.getChangedTypeId();
@@ -497,13 +483,11 @@ public void onBlockPlace(BlockPlaceEvent event) {
Player player = event.getPlayer();
World world = blockPlaced.getWorld();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(world.getName());
if (wcfg.useRegions) {
- Vector pt = toVector(blockPlaced);
-
- if (!cfg.canBuild(player, pt)) {
+ if (!plugin.canBuild(player, blockPlaced.getLocation())) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
event.setCancelled(true);
return;
@@ -653,8 +637,8 @@ public void onBlockRedstoneChange(BlockRedstoneEvent event) {
Block blockTo = event.getBlock();
World world = blockTo.getWorld();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(world.getName());
if (wcfg.simulateSponge && wcfg.redstoneSponges) {
int ox = blockTo.getX();
@@ -690,8 +674,8 @@ public void onBlockRedstoneChange(BlockRedstoneEvent event) {
*/
private void clearSpongeWater(World world, int ox, int oy, int oz) {
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(world.getName());
for (int cx = -wcfg.spongeRadius; cx <= wcfg.spongeRadius; cx++) {
for (int cy = -wcfg.spongeRadius; cy <= wcfg.spongeRadius; cy++) {
@@ -714,8 +698,8 @@ private void clearSpongeWater(World world, int ox, int oy, int oz) {
*/
private void addSpongeWater(World world, int ox, int oy, int oz) {
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(world.getName());
// The negative x edge
int cx = ox - wcfg.spongeRadius - 1;
diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java
index 9aff8555..67b616c3 100644
--- a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java
+++ b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java
@@ -74,13 +74,8 @@ public void onEntityDamageByBlock(EntityDamageByBlockEvent event) {
if (defender instanceof Player) {
Player player = (Player) defender;
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
-
- if (cfg.isInvinciblePlayer(player.getName())) {
- event.setCancelled(true);
- return;
- }
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (wcfg.disableLavaDamage && type == DamageCause.LAVA) {
event.setCancelled(true);
@@ -102,13 +97,8 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (defender instanceof Player) {
Player player = (Player) defender;
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
-
- if (cfg.isInvinciblePlayer(player.getName())) {
- event.setCancelled(true);
- return;
- }
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (attacker != null && attacker instanceof Player) {
if (wcfg.useRegions) {
@@ -158,13 +148,8 @@ public void onEntityDamageByProjectile(EntityDamageByProjectileEvent event) {
if (defender instanceof Player) {
Player player = (Player) defender;
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
-
- if (cfg.isInvinciblePlayer(player.getName())) {
- event.setCancelled(true);
- return;
- }
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (attacker != null && attacker instanceof Player) {
if (wcfg.useRegions) {
@@ -217,13 +202,8 @@ public void onEntityDamage(EntityDamageEvent event) {
if (defender instanceof Player) {
Player player = (Player) defender;
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
-
- if (cfg.isInvinciblePlayer(player.getName())) {
- event.setCancelled(true);
- return;
- }
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (wcfg.disableFallDamage && type == DamageCause.FALL) {
event.setCancelled(true);
@@ -251,12 +231,6 @@ public void onEntityDamage(EntityDamageEvent event) {
event.setCancelled(true);
return;
}
-
- if (type == DamageCause.DROWNING
- && cfg.isAmphibiousPlayer(player.getName())) {
- event.setCancelled(true);
- return;
- }
}
}
@@ -267,9 +241,9 @@ public void onEntityExplode(EntityExplodeEvent event) {
return;
}
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
Location l = event.getLocation();
- WorldConfiguration wcfg = cfg.getWorldConfig(l.getWorld().getName());
+ WorldConfiguration wcfg = cfg.forWorld(l.getWorld().getName());
if (event.getEntity() instanceof LivingEntity) {
@@ -317,8 +291,8 @@ public void onCreatureSpawn(CreatureSpawnEvent event) {
return;
}
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(event.getEntity().getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(event.getEntity().getWorld().getName());
//CreatureType creaType = (CreatureType) CreatureType.valueOf(event.getMobType().toString());
CreatureType creaType = event.getCreatureType();
@@ -380,7 +354,7 @@ public void findFreePosition(Player player) {
loc.setX(x + 0.5);
loc.setY(y);
loc.setZ(z + 0.5);
- player.teleportTo(loc);
+ player.teleport(loc);
}
return;
diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java
index fba2c43c..421d8880 100644
--- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java
+++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java
@@ -20,25 +20,14 @@
import static com.sk89q.worldguard.bukkit.BukkitUtil.toVector;
import org.bukkit.ChatColor;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.player.*;
-import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager;
-import com.nijiko.coelho.iConomy.iConomy;
-import com.sk89q.worldedit.Vector;
-import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.blacklist.events.ItemAcquireBlacklistEvent;
import com.sk89q.worldguard.blacklist.events.ItemDropBlacklistEvent;
-import com.sk89q.worldguard.blacklist.events.ItemUseBlacklistEvent;
-import com.sk89q.worldguard.protection.ApplicableRegionSet;
-import com.sk89q.worldguard.protection.flags.DefaultFlag;
-import com.sk89q.worldguard.protection.managers.RegionManager;
/**
* Handles all events thrown in relation to a Player
@@ -49,7 +38,6 @@ public class WorldGuardPlayerListener extends PlayerListener {
* Plugin.
*/
private WorldGuardPlugin plugin;
- private boolean checkediConomy = false;
/**
* Construct the object;
@@ -83,21 +71,13 @@ public void registerEvents() {
public void onPlayerJoin(PlayerEvent event) {
Player player = event.getPlayer();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (wcfg.fireSpreadDisableToggle) {
player.sendMessage(ChatColor.YELLOW
+ "Fire spread is currently globally disabled.");
}
-
- if (plugin.inGroup(player, "wg-invincible")) {
- cfg.addInvinciblePlayer(player.getName());
- }
-
- if (plugin.inGroup(player, "wg-amphibious")) {
- cfg.addAmphibiousPlayer(player.getName());
- }
}
/**
@@ -109,11 +89,7 @@ public void onPlayerJoin(PlayerEvent event) {
public void onPlayerQuit(PlayerEvent event) {
Player player = event.getPlayer();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
-
- cfg.removeInvinciblePlayer(player.getName());
- cfg.removeAmphibiousPlayer(player.getName());
-
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
cfg.forgetPlayer(plugin.wrapPlayer(player));
}
@@ -195,8 +171,8 @@ public void onPlayerItem(PlayerItemEvent event) {
public void onPlayerLogin(PlayerLoginEvent event) {
Player player = event.getPlayer();
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(player.getWorld().getName());
if (wcfg.enforceOneSession) {
String name = player.getName();
@@ -207,15 +183,6 @@ public void onPlayerLogin(PlayerLoginEvent event) {
}
}
}
-
- if (!checkediConomy) {
- iConomy iconomy = (iConomy) plugin.getServer().getPluginManager().getPlugin("iConomy");
- if (iconomy != null) {
- plugin.getGlobalConfiguration().setiConomy(iconomy);
- }
-
- checkediConomy = true;
- }
}
/**
@@ -230,8 +197,8 @@ public void onPlayerDropItem(PlayerDropItemEvent event) {
return;
}
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(event.getPlayer().getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(event.getPlayer().getWorld().getName());
if (wcfg.getBlacklist() != null) {
Item ci = event.getItemDrop();
@@ -257,8 +224,8 @@ public void onPlayerPickupItem(PlayerPickupItemEvent event) {
return;
}
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- WorldConfiguration wcfg = cfg.getWorldConfig(event.getPlayer().getWorld().getName());
+ ConfigurationManager cfg = plugin.getGlobalConfiguration();
+ WorldConfiguration wcfg = cfg.forWorld(event.getPlayer().getWorld().getName());
if (wcfg.getBlacklist() != null) {
Item ci = event.getItem();
diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java
index 0867137a..b7ff0ecf 100644
--- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java
+++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java
@@ -16,80 +16,115 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
package com.sk89q.worldguard.bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.World.Environment;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
-import com.sk89q.bukkit.migration.PermissionsResolverManager;
-import com.sk89q.bukkit.migration.PermissionsResolverServerListener;
-import com.sk89q.minecraft.util.commands.CommandException;
-import com.sk89q.minecraft.util.commands.CommandPermissionsException;
-import com.sk89q.minecraft.util.commands.CommandsManager;
+import com.sk89q.bukkit.migration.*;
+import com.sk89q.minecraft.util.commands.*;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.LocalPlayer;
-import com.sk89q.worldguard.protection.GlobalRegionManager;
-import com.sk89q.worldguard.protection.TimedFlagsTimer;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
+import com.sk89q.worldguard.TickSyncDelayLoggerFilter;
+import com.sk89q.worldguard.bukkit.commands.ProtectionCommands;
+import com.sk89q.worldguard.bukkit.commands.ToggleCommands;
+import com.sk89q.worldguard.protection.*;
+import com.sk89q.worldguard.protection.managers.RegionManager;
+import java.io.*;
+import java.util.*;
+import java.util.logging.Filter;
import java.util.logging.Logger;
/**
- * Plugin for Bukkit.
+ * The main class for WorldGuard as a Bukkit plugin.
*
* @author sk89q
*/
public class WorldGuardPlugin extends JavaPlugin {
-
/**
* Logger for messages.
*/
protected static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
/**
- * List of commands.
+ * Manager for commands. This automatically handles nested commands,
+ * permissions checking, and a number of other fancy command things.
+ * We just set it up and register commands against it.
*/
- protected CommandsManager commands;
+ protected final CommandsManager commands;
/**
* Handles the region databases for all worlds.
*/
- protected GlobalRegionManager globalRegionManager;
+ protected final GlobalRegionManager globalRegionManager;
/**
* Handles all configuration.
*/
- protected GlobalConfiguration configuration;
+ protected final ConfigurationManager configuration;
/**
- * Processes queries for permissions information.
+ * Processes queries for permissions information. The permissions manager
+ * is from WorldEdit and it automatically handles looking up permissions
+ * systems and picking the right one. WorldGuard just needs to call
+ * the permission methods.
*/
protected PermissionsResolverManager perms;
+ /**
+ * Construct objects. Actual loading occurs when the plugin is enabled, so
+ * this merely instantiates the objects.
+ */
+ public WorldGuardPlugin() {
+ configuration = new ConfigurationManager(this);
+ globalRegionManager = new GlobalRegionManager(this);
+
+ final WorldGuardPlugin plugin = this;
+ commands = new CommandsManager() {
+ @Override
+ public boolean hasPermission(CommandSender player, String perm) {
+ return plugin.hasPermission(player, perm);
+ }
+ };
+
+ // Register command classes
+ commands.register(ToggleCommands.class);
+ commands.register(ProtectionCommands.class);
+
+ // Set up permissions
+ perms = new PermissionsResolverManager(
+ getConfiguration(), getServer(), "WorldGuard", logger);
+ }
+
/**
* Called on plugin enable.
*/
public void onEnable() {
+ // Need to create the plugins/WorldGuard folder
getDataFolder().mkdirs();
-
- configuration = new GlobalConfiguration(this);
- configuration.load();
- globalRegionManager = new GlobalRegionManager();
+ // This must be done before configuration is laoded
+ LegacyWorldGuardMigration.migrateBlacklist(this);
- for (World world : getServer().getWorlds()) {
- globalRegionManager.load(world.getName());
- }
+ // Load the configuration
+ configuration.load();
+ globalRegionManager.preload();
+
+ // Migrate regions after the regions were loaded because
+ // the migration code reuses the loaded region managers
+ LegacyWorldGuardMigration.migrateRegions(this);
+
+ // Load permissions
+ (new PermissionsResolverServerListener(perms)).register(this);
+ perms.load();
// Register events
(new WorldGuardPlayerListener(this)).registerEvents();
@@ -98,23 +133,18 @@ public void onEnable() {
(new WorldGuardVehicleListener(this)).registerEvents();
// 25 equals about 1s real time
- this.getServer().getScheduler().scheduleSyncRepeatingTask(
+ getServer().getScheduler().scheduleSyncRepeatingTask(
this, new TimedFlagsTimer(this), 25 * 5, 25 * 5);
- // Register the commands that we want to use
- final WorldGuardPlugin plugin = this;
- commands = new CommandsManager() {
- @Override
- public boolean hasPermission(CommandSender player, String perm) {
- return plugin.hasPermission(player, perm);
+ if (configuration.suppressTickSyncWarnings) {
+ Logger.getLogger("Minecraft").setFilter(
+ new TickSyncDelayLoggerFilter());
+ } else {
+ Filter filter = Logger.getLogger("Minecraft").getFilter();
+ if (filter != null && filter instanceof TickSyncDelayLoggerFilter) {
+ Logger.getLogger("Minecraft").setFilter(null);
}
- };
-
- // Set up permissions
- perms = new PermissionsResolverManager(
- getConfiguration(), getServer(), "WorldGuard", logger);
- (new PermissionsResolverServerListener(perms)).register(this);
- perms.load();
+ }
logger.info("WorldGuard " + this.getDescription().getVersion() + " enabled.");
}
@@ -128,7 +158,35 @@ public void onDisable() {
logger.info("WorldGuard " + getDescription().getVersion() + " disabled.");
}
-
+
+ /**
+ * Handle a command.
+ */
+ @Override
+ public boolean onCommand(CommandSender sender, Command cmd, String label,
+ String[] args) {
+ try {
+ commands.execute(cmd.getName(), args, sender, this, sender);
+ } catch (CommandPermissionsException e) {
+ sender.sendMessage(ChatColor.RED + "You don't have permission.");
+ } catch (MissingNestedCommandException e) {
+ sender.sendMessage(ChatColor.RED + e.getUsage());
+ } catch (CommandUsageException e) {
+ sender.sendMessage(ChatColor.RED + e.getMessage());
+ sender.sendMessage(ChatColor.RED + e.getUsage());
+ } catch (WrappedCommandException e) {
+ if (e.getCause() instanceof NumberFormatException) {
+ sender.sendMessage(ChatColor.RED + "Number expected, string received instead.");
+ } else {
+ sender.sendMessage(ChatColor.RED + "An error has occurred. See console.");
+ e.printStackTrace();
+ }
+ } catch (CommandException e) {
+ sender.sendMessage(ChatColor.RED + e.getMessage());
+ }
+
+ return true;
+ }
/**
* Get the GlobalRegionManager.
@@ -144,7 +202,7 @@ public GlobalRegionManager getGlobalRegionManager() {
*
* @return
*/
- public GlobalConfiguration getGlobalConfiguration() {
+ public ConfigurationManager getGlobalConfiguration() {
return configuration;
}
@@ -528,6 +586,48 @@ public WorldEditPlugin getWorldEdit() throws CommandException {
throw new CommandException("WorldEdit detection failed (report error).");
}
}
+ /**
+ * Check if a player has permission to build at a location.
+ *
+ * @param player
+ * @param loc
+ * @return
+ */
+ public boolean canBuild(Player player, Location loc) {
+ WorldConfiguration worldConfig =
+ configuration.forWorld(loc.getWorld().getName());
+
+ if (worldConfig.useRegions) {
+ LocalPlayer localPlayer = wrapPlayer(player);
+
+ if (!hasPermission(player, "region.bypass")) {
+ RegionManager mgr = getGlobalRegionManager()
+ .get(player.getWorld().getName());
+
+ if (!mgr.getApplicableRegions(BukkitUtil.toVector(loc))
+ .canBuild(localPlayer)) {
+ return false;
+ }
+ }
+
+ return true;
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Check if a player has permission to build at a location.
+ *
+ * @param player
+ * @param x
+ * @param y
+ * @param z
+ * @return
+ */
+ public boolean canBuild(Player player, int x, int y, int z) {
+ return canBuild(player, new Location(player.getWorld(), x, y, z));
+ }
/**
* Wrap a player as a LocalPlayer.
@@ -573,7 +673,7 @@ public static void createDefaultConfiguration(File actual,
}
logger.info("WorldGuard: Default configuration file written: "
- + defaultName);
+ + actual.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
} finally {
diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardVehicleListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardVehicleListener.java
index 494878c0..bfc6ee49 100644
--- a/src/com/sk89q/worldguard/bukkit/WorldGuardVehicleListener.java
+++ b/src/com/sk89q/worldguard/bukkit/WorldGuardVehicleListener.java
@@ -69,8 +69,7 @@ public void onVehicleCreate(VehicleCreateEvent event) {
Vector pt = new Vector(vhclLoc.getBlockX(), vhclLoc.getBlockY(), vhclLoc.getBlockZ());
if (vhcl instanceof Minecart || vhcl instanceof Boat) {
- GlobalConfiguration cfg = plugin.getGlobalConfiguration();
- RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().get(vhcl.getWorld().getName());
+ RegionManager mgr = plugin.getGlobalRegionManager().get(vhcl.getWorld().getName());
ApplicableRegionSet applicableRegions = mgr.getApplicableRegions(pt);
if (!applicableRegions.allows(DefaultFlag.PLACE_VEHICLE)) {
diff --git a/src/com/sk89q/worldguard/bukkit/commands/ProtectionCommands.java b/src/com/sk89q/worldguard/bukkit/commands/ProtectionCommands.java
new file mode 100644
index 00000000..956d23cf
--- /dev/null
+++ b/src/com/sk89q/worldguard/bukkit/commands/ProtectionCommands.java
@@ -0,0 +1,33 @@
+// $Id$
+/*
+ * WorldGuard
+ * Copyright (C) 2010 sk89q
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+*/
+
+package com.sk89q.worldguard.bukkit.commands;
+
+import org.bukkit.command.CommandSender;
+import com.sk89q.minecraft.util.commands.*;
+import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
+
+public class ProtectionCommands {
+ @Command(aliases = {"region"},
+ desc = "Region management commands")
+ @NestedCommand({RegionCommands.class})
+ public static void region(CommandContext args, WorldGuardPlugin plugin,
+ CommandSender sender) throws CommandException {
+ }
+}
diff --git a/src/com/sk89q/worldguard/bukkit/commands/RegionCommands.java b/src/com/sk89q/worldguard/bukkit/commands/RegionCommands.java
index 8ba41256..5fd7b63d 100644
--- a/src/com/sk89q/worldguard/bukkit/commands/RegionCommands.java
+++ b/src/com/sk89q/worldguard/bukkit/commands/RegionCommands.java
@@ -24,8 +24,6 @@
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import com.nijiko.coelho.iConomy.iConomy;
-import com.nijiko.coelho.iConomy.system.Account;
import com.sk89q.minecraft.util.commands.*;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
@@ -139,7 +137,7 @@ public static void claim(CommandContext args, WorldGuardPlugin plugin,
}
WorldConfiguration wcfg = plugin.getGlobalConfiguration()
- .getWorldConfig(player.getWorld().getName());
+ .forWorld(player.getWorld().getName());
RegionManager mgr = plugin.getGlobalRegionManager().get(
sel.getWorld().getName());
@@ -174,7 +172,7 @@ public static void claim(CommandContext args, WorldGuardPlugin plugin,
}
}*/
- if (plugin.getGlobalConfiguration().getiConomy() != null && wcfg.useiConomy && wcfg.buyOnClaim) {
+ /*if (plugin.getGlobalConfiguration().getiConomy() != null && wcfg.useiConomy && wcfg.buyOnClaim) {
if (iConomy.getBank().hasAccount(player.getName())) {
Account account = iConomy.getBank().getAccount(player.getName());
double balance = account.getBalance();
@@ -195,7 +193,7 @@ public static void claim(CommandContext args, WorldGuardPlugin plugin,
player.sendMessage(ChatColor.YELLOW + "You have not enough money.");
return;
}
- }
+ }*/
if (region.countBlocks() > wcfg.maxClaimVolume) {
player.sendMessage(ChatColor.RED + "This region is to large to claim.");
diff --git a/src/com/sk89q/worldguard/bukkit/commands/ToggleCommands.java b/src/com/sk89q/worldguard/bukkit/commands/ToggleCommands.java
index a174f5bf..eb39f5be 100644
--- a/src/com/sk89q/worldguard/bukkit/commands/ToggleCommands.java
+++ b/src/com/sk89q/worldguard/bukkit/commands/ToggleCommands.java
@@ -44,7 +44,7 @@ public static void stopFire(CommandContext args, WorldGuardPlugin plugin,
}
WorldConfiguration wcfg = plugin.getGlobalConfiguration()
- .getWorldConfig(world.getName());
+ .forWorld(world.getName());
if (!wcfg.fireSpreadDisableToggle) {
plugin.getServer().broadcastMessage(
@@ -76,7 +76,7 @@ public static void allowFire(CommandContext args, WorldGuardPlugin plugin,
}
WorldConfiguration wcfg = plugin.getGlobalConfiguration()
- .getWorldConfig(world.getName());
+ .forWorld(world.getName());
if (wcfg.fireSpreadDisableToggle) {
plugin.getServer().broadcastMessage(ChatColor.YELLOW
diff --git a/src/com/sk89q/worldguard/protection/GlobalRegionManager.java b/src/com/sk89q/worldguard/protection/GlobalRegionManager.java
index d1d4be81..2c568f25 100644
--- a/src/com/sk89q/worldguard/protection/GlobalRegionManager.java
+++ b/src/com/sk89q/worldguard/protection/GlobalRegionManager.java
@@ -18,6 +18,7 @@
*/
package com.sk89q.worldguard.protection;
+import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.databases.JSONDatabase;
import com.sk89q.worldguard.protection.managers.FlatRegionManager;
import com.sk89q.worldguard.protection.managers.RegionManager;
@@ -26,6 +27,7 @@
import java.io.IOException;
import java.util.HashMap;
import java.util.logging.Logger;
+import org.bukkit.World;
/**
* This class keeps track of region information for every world. It loads
@@ -37,11 +39,11 @@
public class GlobalRegionManager {
private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
-
+
/**
- * Path to the folder that region data is stored within.
+ * Reference to the plugin.
*/
- protected File dataFolder;
+ private WorldGuardPlugin plugin;
/**
* Map of managers per-world.
@@ -56,8 +58,11 @@ public class GlobalRegionManager {
/**
* Construct the object.
+ *
+ * @param plugin
*/
- public GlobalRegionManager() {
+ public GlobalRegionManager(WorldGuardPlugin plugin) {
+ this.plugin = plugin;
managers = new HashMap();
lastModified = new HashMap();
}
@@ -77,8 +82,8 @@ public void unload() {
* @return
*/
protected File getPath(String name) {
- return new File(dataFolder,
- "name" + File.separator + "regions.json");
+ return new File(plugin.getDataFolder(),
+ "worlds" + File.separator + name + File.separator + "regions.json");
}
/**
@@ -125,6 +130,16 @@ public void load(String name) {
+ file.getAbsolutePath() + " : " + e.getMessage());
}
}
+
+ /**
+ * Preloads region managers for all worlds.
+ */
+ public void preload() {
+ // Load regions
+ for (World world : plugin.getServer().getWorlds()) {
+ load(world.getName());
+ }
+ }
/**
* Reloads the region information from file when region databases
diff --git a/src/com/sk89q/worldguard/protection/databases/JSONDatabase.java b/src/com/sk89q/worldguard/protection/databases/JSONDatabase.java
index bb3f1017..11dd850a 100644
--- a/src/com/sk89q/worldguard/protection/databases/JSONDatabase.java
+++ b/src/com/sk89q/worldguard/protection/databases/JSONDatabase.java
@@ -15,7 +15,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
-*/
+ */
package com.sk89q.worldguard.protection.databases;
@@ -23,16 +23,18 @@
import com.google.gson.Gson;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import java.io.BufferedInputStream;
+import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileWriter;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.OutputStreamWriter;
import java.util.Map;
import java.util.logging.Logger;
/**
* Represents a protected area database that uses JSON files.
- *
+ *
* @author Redecouverte
*/
public class JSONDatabase implements ProtectionDatabase {
@@ -46,12 +48,12 @@ public class JSONDatabase implements ProtectionDatabase {
/**
* Holds the list of regions.
*/
- private Map regions;
+ private Map regions;
/**
- * Construct the database with a path to a file. No file is read or
- * written at this time.
- *
+ * Construct the database with a path to a file. No file is read or written
+ * at this time.
+ *
* @param file
*/
public JSONDatabase(File file) {
@@ -61,11 +63,13 @@ public JSONDatabase(File file) {
/**
* Helper function to read a file into a String
*/
- private static String readFileAsString(File file) throws java.io.IOException {
+ private static String readFileAsString(File file)
+ throws java.io.IOException {
byte[] buffer = new byte[(int) file.length()];
BufferedInputStream f = null;
try {
- f = new BufferedInputStream(new FileInputStream(file.getAbsolutePath()));
+ f = new BufferedInputStream(new FileInputStream(
+ file.getAbsolutePath()));
f.read(buffer);
} finally {
if (f != null) {
@@ -76,10 +80,8 @@ private static String readFileAsString(File file) throws java.io.IOException {
}
}
- for(int i = 0; i < buffer.length; i++)
- {
- if(buffer[i] < 0x20 || buffer[i] > 0x126)
- {
+ for (int i = 0; i < buffer.length; i++) {
+ if (buffer[i] < 0x20 || buffer[i] > 0x126) {
buffer[i] = 0x20;
}
}
@@ -92,9 +94,10 @@ private static String readFileAsString(File file) throws java.io.IOException {
*/
public void load() throws IOException {
- Gson gson = new Gson();
- JSONContainer jContainer = gson.fromJson(readFileAsString(file), JSONContainer.class);
- this.regions = jContainer.getRegions();
+ Gson gson = new Gson();
+ JSONContainer jContainer = gson.fromJson(readFileAsString(file),
+ JSONContainer.class);
+ this.regions = jContainer.getRegions();
}
/**
@@ -103,37 +106,41 @@ public void load() throws IOException {
public void save() throws IOException {
Gson gson = new Gson();
- String jsonData = gson.toJson(new JSONContainer(this.regions), JSONContainer.class);
+ String jsonData = gson.toJson(new JSONContainer(this.regions),
+ JSONContainer.class);
writeStringToFile(jsonData, this.file);
}
-
/**
* Writes a String to a file.
*
- * @param string
- * @param file
+ * @param string
+ * @param file
* @throws IOException
*/
- public static void writeStringToFile(String string, File file) throws IOException {
- FileWriter writer = null;
-
+ public static void writeStringToFile(String string, File file)
+ throws IOException {
+ FileOutputStream output = null;
+
try {
- writer = new FileWriter(file);
+ output = new FileOutputStream(file);
+ OutputStreamWriter streamWriter = new OutputStreamWriter(output, "utf-8");
+ BufferedWriter writer = new BufferedWriter(streamWriter);
writer.write(string);
+ writer.close();
} finally {
- try {
- if (writer != null) {
- writer.close();
+ if (output != null) {
+ try {
+ output.close();
+ } catch (IOException e) {
}
- } catch (IOException e) {
}
}
}
/**
* Load the list of regions into a region manager.
- *
+ *
* @throws IOException
*/
public void load(RegionManager manager) throws IOException {
@@ -143,7 +150,7 @@ public void load(RegionManager manager) throws IOException {
/**
* Save the list of regions from a region manager.
- *
+ *
* @throws IOException
*/
public void save(RegionManager manager) throws IOException {
@@ -153,17 +160,17 @@ public void save(RegionManager manager) throws IOException {
/**
* Get a list of protected regions.
- *
+ *
* @return
*/
- public Map getRegions() {
+ public Map getRegions() {
return regions;
}
/**
* Get a list of protected regions.
*/
- public void setRegions(Map regions) {
+ public void setRegions(Map regions) {
this.regions = regions;
}
}
diff --git a/tests/com/sk89q/worldguard/TestPlayer.java b/tests/com/sk89q/worldguard/TestPlayer.java
index 9c3f6bf9..9c3d62dc 100644
--- a/tests/com/sk89q/worldguard/TestPlayer.java
+++ b/tests/com/sk89q/worldguard/TestPlayer.java
@@ -75,4 +75,9 @@ public String[] getGroups() {
// TODO Auto-generated method stub
return null;
}
+
+ @Override
+ public boolean hasPermission(String perm) {
+ return true;
+ }
}