configuration is now per-world, updated permissions, made commands compatible with console where possible, /region flag now checks correctly for permissions, & some fixes

This commit is contained in:
Redecouverte 2011-02-25 16:42:48 +01:00
parent 71a6d8ab44
commit 9b4a7c705b
41 changed files with 1655 additions and 1190 deletions

View File

@ -6,6 +6,7 @@
CREATE TABLE `blacklist_events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`event` varchar(25) NOT NULL,
`world` varchar(32) NOT NULL,
`player` varchar(16) NOT NULL,
`x` int(11) NOT NULL,
`y` int(11) NOT NULL,
@ -18,4 +19,6 @@ CREATE TABLE `blacklist_events` (
-- Required update if you have an older version of the table:
ALTER TABLE `blacklist_events` ADD `comment` VARCHAR( 255 ) NULL
ALTER TABLE `blacklist_events` ADD `comment` VARCHAR( 255 ) NULL
ALTER TABLE `blacklist_events` ADD `world` VARCHAR( 32 ) NOT NULL

View File

@ -44,6 +44,7 @@
<copy tofile="${build.dir}/plugin.yml" file="plugin.yml"/>
<replace file="${build.dir}/plugin.yml" token="WGVERSIONMACRO" value="${version}"/>
<mkdir dir="${build.dir}/defaults"/>
<copy tofile="${build.dir}/defaults/global.yml" file="global.yml"/>
<copy tofile="${build.dir}/defaults/config.yml" file="config.yml"/>
<copy tofile="${build.dir}/defaults/blacklist.txt" file="blacklist.txt"/>
<jar jarfile="${dist.dir}/WorldGuard.jar" basedir="${build.dir}" manifest="manifest.mf">

View File

@ -21,8 +21,6 @@
summary-on-start: on
suppress-tick-sync-warnings: false
protection:
enforce-single-session: on
item-durability: on
@ -101,7 +99,7 @@ blacklist:
table: blacklist_events
file:
enable: on
path: worldguard/logs/%Y-%m-%d.log
path: worldguard/logs/%w-%Y-%m-%d.log
open-files: 10
# See http://wiki.sk89q.com/wiki/WorldGuard/Permissions/Bukkit

3
global.yml Normal file
View File

@ -0,0 +1,3 @@
suppress-tick-sync-warnings: false

48
permissions_list.txt Normal file
View File

@ -0,0 +1,48 @@
worldguard.god.other
worldguard.god.self
worldguard.slay.other
worldguard.slay.self
worldguard.heal.other
worldguard.heal.self
worldguard.stack
worldguard.stopfire
worldguard.allowfire
worldguard.locate
worldguard.region.flag.ownregions
worldguard.region.flag.memberregions
worldguard.region.flag.foreignregions
worldguard.region.info.ownregions
worldguard.region.info.memberregions
worldguard.region.info.foreignregions
worldguard.region.list
worldguard.region.load
worldguard.region.removeowner.own
worldguard.region.removeowner.all
worldguard.region.removemember.own
worldguard.region.removemember.all
worldguard.region.save
worldguard.region.setparent.own
worldguard.region.setparent.all
worldguard.reloadwg
worldguard.region.delete.own
worldguard.region.delete.all
worldguard.region.define
worldguard.region.claim

View File

@ -34,6 +34,14 @@ public class ConsoleLoggerHandler implements BlacklistLoggerHandler {
*/
private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
private String worldName;
public ConsoleLoggerHandler(String worldName)
{
this.worldName = worldName;
}
/**
* Log an event.
*
@ -44,55 +52,55 @@ public class ConsoleLoggerHandler implements BlacklistLoggerHandler {
// Block break
if (event instanceof BlockBreakBlacklistEvent) {
BlockBreakBlacklistEvent evt = (BlockBreakBlacklistEvent)event;
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " tried to break " + getFriendlyItemName(evt.getType())
+ (comment != null ? " (" + comment + ")" : ""));
// Block place
} else if (event instanceof BlockPlaceBlacklistEvent) {
BlockPlaceBlacklistEvent evt = (BlockPlaceBlacklistEvent)event;
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " tried to place " + getFriendlyItemName(evt.getType())
+ (comment != null ? " (" + comment + ")" : ""));
// Block interact
} else if (event instanceof BlockInteractBlacklistEvent) {
BlockInteractBlacklistEvent evt = (BlockInteractBlacklistEvent)event;
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " tried to interact with " + getFriendlyItemName(evt.getType())
+ (comment != null ? " (" + comment + ")" : ""));
// Destroy with
} else if (event instanceof DestroyWithBlacklistEvent) {
DestroyWithBlacklistEvent evt = (DestroyWithBlacklistEvent)event;
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " tried to destroy with " + getFriendlyItemName(evt.getType())
+ (comment != null ? " (" + comment + ")" : ""));
// Acquire
} else if (event instanceof ItemAcquireBlacklistEvent) {
ItemAcquireBlacklistEvent evt = (ItemAcquireBlacklistEvent)event;
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " tried to acquire " + getFriendlyItemName(evt.getType())
+ (comment != null ? " (" + comment + ")" : ""));
// Drop
} else if (event instanceof ItemDropBlacklistEvent) {
ItemDropBlacklistEvent evt = (ItemDropBlacklistEvent)event;
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " tried to drop " + getFriendlyItemName(evt.getType())
+ (comment != null ? " (" + comment + ")" : ""));
// Use
} else if (event instanceof ItemUseBlacklistEvent) {
ItemUseBlacklistEvent evt = (ItemUseBlacklistEvent)event;
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " tried to use " + getFriendlyItemName(evt.getType())
+ (comment != null ? " (" + comment + ")" : ""));
// Unknown
} else {
logger.log(Level.INFO, "WorldGuard: " + event.getPlayer().getName()
logger.log(Level.INFO, "WorldGuard: [" + worldName + "] " + event.getPlayer().getName()
+ " caught unknown event: " + event.getClass().getCanonicalName());
}
}

View File

@ -61,6 +61,10 @@ public class DatabaseLoggerHandler implements BlacklistLoggerHandler {
* Table.
*/
private String table;
/**
* World name.
*/
private String worldName;
/**
* Database connection.
*/
@ -73,11 +77,12 @@ public class DatabaseLoggerHandler implements BlacklistLoggerHandler {
* @param user
* @param pass
*/
public DatabaseLoggerHandler(String dsn, String user, String pass, String table) {
public DatabaseLoggerHandler(String dsn, String user, String pass, String table, String worldName) {
this.dsn = dsn;
this.user = user;
this.pass = pass;
this.table = table;
this.worldName = worldName;
}
/**
@ -110,16 +115,17 @@ public class DatabaseLoggerHandler implements BlacklistLoggerHandler {
Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO " + table
+ "(event, player, x, y, z, item, time, comment) VALUES "
+ "(?, ?, ?, ?, ?, ?, ?, ?)");
+ "(event, world, player, x, y, z, item, time, comment) VALUES "
+ "(?, ?, ?, ?, ?, ?, ?, ?, ?)");
stmt.setString(1, event);
stmt.setString(2, player.getName());
stmt.setInt(3, pos.getBlockX());
stmt.setInt(4, pos.getBlockY());
stmt.setInt(5, pos.getBlockZ());
stmt.setInt(6, item);
stmt.setInt(7, (int)(System.currentTimeMillis() / 1000));
stmt.setString(8, comment);
stmt.setString(2, worldName);
stmt.setString(3, player.getName());
stmt.setInt(4, pos.getBlockX());
stmt.setInt(5, pos.getBlockY());
stmt.setInt(6, pos.getBlockZ());
stmt.setInt(7, item);
stmt.setInt(8, (int)(System.currentTimeMillis() / 1000));
stmt.setString(9, comment);
stmt.executeUpdate();
} catch (SQLException e) {
logger.log(Level.SEVERE, "Failed to log blacklist event to database: "

View File

@ -57,6 +57,10 @@ public class FileLoggerHandler implements BlacklistLoggerHandler {
* Path pattern.
*/
private String pathPattern;
/**
* World name.
*/
private String worldName;
/**
* Cache of writers.
*/
@ -68,8 +72,9 @@ public class FileLoggerHandler implements BlacklistLoggerHandler {
*
* @param pathPattern
*/
public FileLoggerHandler(String pathPattern) {
public FileLoggerHandler(String pathPattern, String worldName) {
this.pathPattern = pathPattern;
this.worldName = worldName;
}
/**
@ -78,12 +83,13 @@ public class FileLoggerHandler implements BlacklistLoggerHandler {
* @param pathPattern
* @param cacheSize
*/
public FileLoggerHandler(String pathPattern, int cacheSize) {
public FileLoggerHandler(String pathPattern, int cacheSize, String worldName) {
if (cacheSize < 1) {
throw new IllegalArgumentException("Cache size cannot be less than 1");
}
this.pathPattern = pathPattern;
this.cacheSize = cacheSize;
this.worldName = worldName;
}
/**
@ -110,6 +116,12 @@ public class FileLoggerHandler implements BlacklistLoggerHandler {
rep = rep.substring(0, 32);
}
}else if (group.matches("%w")) {
rep = worldName.toLowerCase().replaceAll("[^A-Za-z0-9_]", "_");
if (rep.length() > 32) { // Actual max length is 16
rep = rep.substring(0, 32);
}
// Date and time
} else if (group.matches("%Y")) {
rep = String.valueOf(calendar.get(Calendar.YEAR));

View File

@ -31,7 +31,7 @@ public class BukkitBlacklist extends Blacklist {
public void broadcastNotification(String msg) {
for (Player player : plugin.getServer().getOnlinePlayers()) {
if (plugin.hasPermission(player, "/worldguardnotify")) {
if (plugin.getWgConfiguration().hasPermission(player, "/worldguardnotify")) {
player.sendMessage(msg);
}
}

View File

@ -26,12 +26,16 @@ import com.sk89q.worldguard.LocalPlayer;
public class BukkitPlayer extends LocalPlayer {
private Player player;
private WorldGuardPlugin plugin;
private WorldGuardConfiguration config;
public BukkitPlayer(WorldGuardPlugin plugin, Player player) {
this.plugin = plugin;
public BukkitPlayer(WorldGuardConfiguration config, Player player) {
this.config = config;
this.player = player;
}
public static BukkitPlayer wrapPlayer(WorldGuardConfiguration config, Player player) {
return new BukkitPlayer(config, player);
}
@Override
public String getName() {
@ -40,7 +44,7 @@ public class BukkitPlayer extends LocalPlayer {
@Override
public boolean hasGroup(String group) {
return plugin.inGroup(player, group);
return config.inGroup(player, group);
}
@Override
@ -61,7 +65,7 @@ public class BukkitPlayer extends LocalPlayer {
@Override
public String[] getGroups() {
return plugin.getGroups(player);
return config.getGroups(player);
}
@Override

View File

@ -28,6 +28,8 @@ import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
public class BukkitUtil {
private BukkitUtil() {
}
@ -50,4 +52,5 @@ public class BukkitUtil {
}
return players.get(0);
}
}

View File

@ -69,10 +69,13 @@ public class WorldGuardBlockListener extends BlockListener {
Player player = event.getPlayer();
Block blockDamaged = event.getBlock();
if (plugin.useRegions && blockDamaged.getType() == Material.CAKE_BLOCK) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (wcfg.useRegions && blockDamaged.getType() == Material.CAKE_BLOCK) {
Vector pt = toVector(blockDamaged);
if (!plugin.canBuild(player, pt)) {
if (!cfg.canBuild(player, pt)) {
player.sendMessage(ChatColor.DARK_RED + "You're not invited to this tea party!");
event.setCancelled(true);
@ -93,8 +96,10 @@ public class WorldGuardBlockListener extends BlockListener {
}
Player player = event.getPlayer();
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (!plugin.itemDurability) {
if (!wcfg.itemDurability) {
ItemStack held = player.getItemInHand();
if (held.getTypeId() > 0) {
held.setDurability((short) -1);
@ -102,27 +107,27 @@ public class WorldGuardBlockListener extends BlockListener {
}
}
if (plugin.useRegions) {
if (wcfg.useRegions) {
Vector pt = BukkitUtil.toVector(event.getBlock());
if (!plugin.canBuild(player, pt)) {
if (!cfg.canBuild(player, pt)) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
event.setCancelled(true);
return;
}
}
if (plugin.blacklist != null) {
if (!plugin.blacklist.check(
new BlockBreakBlacklistEvent(plugin.wrapPlayer(player),
if (wcfg.getBlacklist() != null) {
if (!wcfg.getBlacklist().check(
new BlockBreakBlacklistEvent(BukkitPlayer.wrapPlayer(cfg, player),
toVector(event.getBlock()),
event.getBlock().getTypeId()), false, false)) {
event.setCancelled(true);
return;
}
if (!plugin.blacklist.check(
new DestroyWithBlacklistEvent(plugin.wrapPlayer(player),
if (wcfg.getBlacklist().check(
new DestroyWithBlacklistEvent(BukkitPlayer.wrapPlayer(cfg, player),
toVector(event.getBlock()),
player.getItemInHand().getTypeId()), false, false)) {
event.setCancelled(true);
@ -151,17 +156,20 @@ public class WorldGuardBlockListener extends BlockListener {
boolean isWater = blockFrom.getTypeId() == 8 || blockFrom.getTypeId() == 9;
boolean isLava = blockFrom.getTypeId() == 10 || blockFrom.getTypeId() == 11;
if (plugin.simulateSponge && isWater) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName());
if (wcfg.simulateSponge && isWater) {
int ox = blockTo.getX();
int oy = blockTo.getY();
int oz = blockTo.getZ();
for (int cx = -plugin.spongeRadius; cx <= plugin.spongeRadius; cx++) {
for (int cy = -plugin.spongeRadius; cy <= plugin.spongeRadius; cy++) {
for (int cz = -plugin.spongeRadius; cz <= plugin.spongeRadius; cz++) {
for (int cx = -wcfg.spongeRadius; cx <= wcfg.spongeRadius; cx++) {
for (int cy = -wcfg.spongeRadius; cy <= wcfg.spongeRadius; cy++) {
for (int cz = -wcfg.spongeRadius; cz <= wcfg.spongeRadius; cz++) {
Block sponge = world.getBlockAt(ox + cx, oy + cy, oz + cz);
if (sponge.getTypeId() == 19
&& (!plugin.redstoneSponges || !sponge.isBlockIndirectlyPowered())) {
&& (!wcfg.redstoneSponges || !sponge.isBlockIndirectlyPowered())) {
event.setCancelled(true);
return;
}
@ -182,28 +190,28 @@ public class WorldGuardBlockListener extends BlockListener {
}*/
// Check the fluid block (from) whether it is air. If so and the target block is protected, cancel the event
if(plugin.preventWaterDamage.size() > 0 && blockFrom.getTypeId() == 0) {
if(wcfg.preventWaterDamage.size() > 0 && blockFrom.getTypeId() == 0) {
int targetId = world.getBlockTypeIdAt(
blockTo.getX(), blockTo.getY(), blockTo.getZ());
if (plugin.preventWaterDamage.contains(targetId)) {
if (wcfg.preventWaterDamage.contains(targetId)) {
event.setCancelled(true);
return;
}
}
if (plugin.preventWaterDamage.size() > 0 && isWater) {
if (wcfg.preventWaterDamage.size() > 0 && isWater) {
int targetId = world.getBlockTypeIdAt(
blockTo.getX(), blockTo.getY(), blockTo.getZ());
if (plugin.preventWaterDamage.contains(targetId)) {
if (wcfg.preventWaterDamage.contains(targetId)) {
event.setCancelled(true);
return;
}
}
if (plugin.allowedLavaSpreadOver.size() > 0 && isLava) {
if (wcfg.allowedLavaSpreadOver.size() > 0 && isLava) {
int targetId = world.getBlockTypeIdAt(
blockTo.getX(), blockTo.getY() - 1, blockTo.getZ());
if (!plugin.allowedLavaSpreadOver.contains(targetId)) {
if (!wcfg.allowedLavaSpreadOver.contains(targetId)) {
event.setCancelled(true);
return;
}
@ -236,40 +244,43 @@ public class WorldGuardBlockListener extends BlockListener {
IgniteCause cause = event.getCause();
Block block = event.getBlock();
//Player player = event.getPlayer();
World world = block.getWorld();
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
boolean isFireSpread = cause == IgniteCause.SPREAD;
if (plugin.preventLavaFire && cause == IgniteCause.LAVA) {
if (wcfg.preventLavaFire && cause == IgniteCause.LAVA) {
event.setCancelled(true);
return;
}
if (plugin.disableFireSpread && isFireSpread) {
if (wcfg.disableFireSpread && isFireSpread) {
event.setCancelled(true);
return;
}
if (plugin.blockLighter && cause == IgniteCause.FLINT_AND_STEEL) {
if (wcfg.blockLighter && cause == IgniteCause.FLINT_AND_STEEL) {
event.setCancelled(true);
return;
}
if (plugin.fireSpreadDisableToggle && isFireSpread) {
if (wcfg.fireSpreadDisableToggle && isFireSpread) {
event.setCancelled(true);
return;
}
if (plugin.disableFireSpreadBlocks.size() > 0 && isFireSpread) {
if (wcfg.disableFireSpreadBlocks.size() > 0 && isFireSpread) {
int x = block.getX();
int y = block.getY();
int z = block.getZ();
if (plugin.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y - 1, z))
|| plugin.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x + 1, y, z))
|| plugin.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x - 1, y, z))
|| plugin.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y, z - 1))
|| plugin.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y, z + 1))) {
if (wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y - 1, z))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x + 1, y, z))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x - 1, y, z))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y, z - 1))
|| wcfg.disableFireSpreadBlocks.contains(world.getBlockTypeIdAt(x, y, z + 1))) {
event.setCancelled(true);
return;
}
@ -322,20 +333,23 @@ public class WorldGuardBlockListener extends BlockListener {
return;
}
if (plugin.disableFireSpread) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName());
if (wcfg.disableFireSpread) {
event.setCancelled(true);
return;
}
if (plugin.fireSpreadDisableToggle) {
if (wcfg.fireSpreadDisableToggle) {
event.setCancelled(true);
return;
}
if (plugin.disableFireSpreadBlocks.size() > 0) {
if (wcfg.disableFireSpreadBlocks.size() > 0) {
Block block = event.getBlock();
if (plugin.disableFireSpreadBlocks.contains(block.getTypeId())) {
if (wcfg.disableFireSpreadBlocks.contains(block.getTypeId())) {
event.setCancelled(true);
return;
}
@ -355,19 +369,22 @@ public class WorldGuardBlockListener extends BlockListener {
return;
}
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName());
int id = event.getChangedTypeId();
if (id == 13 && plugin.noPhysicsGravel) {
if (id == 13 && wcfg.noPhysicsGravel) {
event.setCancelled(true);
return;
}
if (id == 12 && plugin.noPhysicsSand) {
if (id == 12 && wcfg.noPhysicsSand) {
event.setCancelled(true);
return;
}
if (id == 90 && plugin.allowPortalAnywhere) {
if (id == 90 && wcfg.allowPortalAnywhere) {
event.setCancelled(true);
return;
}
@ -388,7 +405,10 @@ public class WorldGuardBlockListener extends BlockListener {
Block block = event.getBlock();
LivingEntity entity = event.getEntity();
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName());
if (entity instanceof Player
&& (block.getType() == Material.CHEST
|| block.getType() == Material.DISPENSER
@ -396,12 +416,12 @@ public class WorldGuardBlockListener extends BlockListener {
|| block.getType() == Material.BURNING_FURNACE
|| block.getType() == Material.NOTE_BLOCK)) {
Player player = (Player)entity;
if (plugin.useRegions) {
if (wcfg.useRegions) {
Vector pt = toVector(block);
LocalPlayer localPlayer = plugin.wrapPlayer(player);
LocalPlayer localPlayer = BukkitPlayer.wrapPlayer(cfg, player);
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
if (!plugin.hasPermission(player, "/regionbypass")
if (!cfg.hasPermission(player, "/regionbypass")
&& !mgr.getApplicableRegions(pt).allowsFlag(AreaFlags.FLAG_CHEST_ACCESS)
&& !mgr.getApplicableRegions(pt).canBuild(localPlayer)) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
@ -411,11 +431,11 @@ public class WorldGuardBlockListener extends BlockListener {
}
}
if (plugin.blacklist != null && entity instanceof Player) {
if (wcfg.getBlacklist() != null && entity instanceof Player) {
Player player = (Player)entity;
if (!plugin.blacklist.check(
new BlockInteractBlacklistEvent(plugin.wrapPlayer(player), toVector(block),
if (!wcfg.getBlacklist().check(
new BlockInteractBlacklistEvent(BukkitPlayer.wrapPlayer(cfg, player), toVector(block),
block.getTypeId()), false, false)) {
event.setCancelled(true);
return;
@ -439,28 +459,31 @@ public class WorldGuardBlockListener extends BlockListener {
Block blockPlaced = event.getBlock();
Player player = event.getPlayer();
World world = blockPlaced.getWorld();
if (plugin.useRegions) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
if (wcfg.useRegions) {
Vector pt = toVector(blockPlaced);
if (!plugin.canBuild(player, pt)) {
if (!cfg.canBuild(player, pt)) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
event.setCancelled(true);
return;
}
}
if (plugin.blacklist != null) {
if (!plugin.blacklist.check(
new BlockPlaceBlacklistEvent(plugin.wrapPlayer(player), toVector(blockPlaced),
if (wcfg.getBlacklist() != null) {
if (!wcfg.getBlacklist().check(
new BlockPlaceBlacklistEvent(BukkitPlayer.wrapPlayer(cfg, player), toVector(blockPlaced),
blockPlaced.getTypeId()), false, false)) {
event.setCancelled(true);
return;
}
}
if (plugin.simulateSponge && blockPlaced.getTypeId() == 19) {
if (plugin.redstoneSponges && blockPlaced.isBlockIndirectlyPowered()) {
if (wcfg.simulateSponge && blockPlaced.getTypeId() == 19) {
if (wcfg.redstoneSponges && blockPlaced.isBlockIndirectlyPowered()) {
return;
}
@ -482,8 +505,11 @@ public class WorldGuardBlockListener extends BlockListener {
Player player = event.getPlayer();
Block blockClicked = event.getBlock();
if (plugin.useRegions && event.getItemInHand().getTypeId() == plugin.regionWand) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(blockClicked.getWorld().getName());
if (wcfg.useRegions && event.getItemInHand().getTypeId() == wcfg.regionWand) {
Vector pt = toVector(blockClicked);
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
@ -492,7 +518,7 @@ public class WorldGuardBlockListener extends BlockListener {
if (regions.size() > 0) {
player.sendMessage(ChatColor.YELLOW + "Can you build? "
+ (app.canBuild(plugin.wrapPlayer(player)) ? "Yes" : "No"));
+ (app.canBuild(BukkitPlayer.wrapPlayer(cfg, player)) ? "Yes" : "No"));
StringBuilder str = new StringBuilder();
for (Iterator<String> it = regions.iterator(); it.hasNext(); ) {
@ -510,11 +536,11 @@ public class WorldGuardBlockListener extends BlockListener {
Material type = blockClicked.getType();
if (plugin.useRegions && type == Material.CAKE_BLOCK) {
if (wcfg.useRegions && type == Material.CAKE_BLOCK) {
Vector pt = toVector(blockClicked);
if (!plugin.canBuild(player, pt)) {
if (!cfg.canBuild(player, pt)) {
player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
byte newData = (byte) (blockClicked.getData() - 1);
@ -539,10 +565,13 @@ public class WorldGuardBlockListener extends BlockListener {
@Override
public void onBlockRedstoneChange(BlockRedstoneEvent event) {
World world = event.getBlock().getWorld();
Block blockTo = event.getBlock();
World world = blockTo.getWorld();
if (plugin.simulateSponge && plugin.redstoneSponges) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
if (wcfg.simulateSponge && wcfg.redstoneSponges) {
int ox = blockTo.getX();
int oy = blockTo.getY();
int oz = blockTo.getZ();
@ -575,9 +604,13 @@ public class WorldGuardBlockListener extends BlockListener {
* @param oz
*/
private void clearSpongeWater(World world, int ox, int oy, int oz) {
for (int cx = -plugin.spongeRadius; cx <= plugin.spongeRadius; cx++) {
for (int cy = -plugin.spongeRadius; cy <= plugin.spongeRadius; cy++) {
for (int cz = -plugin.spongeRadius; cz <= plugin.spongeRadius; cz++) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
for (int cx = -wcfg.spongeRadius; cx <= wcfg.spongeRadius; cx++) {
for (int cy = -wcfg.spongeRadius; cy <= wcfg.spongeRadius; cy++) {
for (int cz = -wcfg.spongeRadius; cz <= wcfg.spongeRadius; cz++) {
if (isBlockWater(world, ox + cx, oy + cy, oz + cz)) {
world.getBlockAt(ox + cx, oy + cy, oz + cz)
.setTypeId(0);
@ -596,10 +629,14 @@ public class WorldGuardBlockListener extends BlockListener {
* @param oz
*/
private void addSpongeWater(World world, int ox, int oy, int oz) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(world.getName());
// The negative x edge
int cx = ox - plugin.spongeRadius - 1;
for (int cy = oy - plugin.spongeRadius - 1; cy <= oy + plugin.spongeRadius + 1; cy++) {
for (int cz = oz - plugin.spongeRadius - 1; cz <= oz + plugin.spongeRadius + 1; cz++) {
int cx = ox - wcfg.spongeRadius - 1;
for (int cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx + 1, cy, cz);
}
@ -607,9 +644,9 @@ public class WorldGuardBlockListener extends BlockListener {
}
// The positive x edge
cx = ox + plugin.spongeRadius + 1;
for (int cy = oy - plugin.spongeRadius - 1; cy <= oy + plugin.spongeRadius + 1; cy++) {
for (int cz = oz - plugin.spongeRadius - 1; cz <= oz + plugin.spongeRadius + 1; cz++) {
cx = ox + wcfg.spongeRadius + 1;
for (int cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx - 1, cy, cz);
}
@ -617,9 +654,9 @@ public class WorldGuardBlockListener extends BlockListener {
}
// The negative y edge
int cy = oy - plugin.spongeRadius - 1;
for (cx = ox - plugin.spongeRadius - 1; cx <= ox + plugin.spongeRadius + 1; cx++) {
for (int cz = oz - plugin.spongeRadius - 1; cz <= oz + plugin.spongeRadius + 1; cz++) {
int cy = oy - wcfg.spongeRadius - 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy + 1, cz);
}
@ -627,9 +664,9 @@ public class WorldGuardBlockListener extends BlockListener {
}
// The positive y edge
cy = oy + plugin.spongeRadius + 1;
for (cx = ox - plugin.spongeRadius - 1; cx <= ox + plugin.spongeRadius + 1; cx++) {
for (int cz = oz - plugin.spongeRadius - 1; cz <= oz + plugin.spongeRadius + 1; cz++) {
cy = oy + wcfg.spongeRadius + 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (int cz = oz - wcfg.spongeRadius - 1; cz <= oz + wcfg.spongeRadius + 1; cz++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy - 1, cz);
}
@ -637,9 +674,9 @@ public class WorldGuardBlockListener extends BlockListener {
}
// The negative z edge
int cz = oz - plugin.spongeRadius - 1;
for (cx = ox - plugin.spongeRadius - 1; cx <= ox + plugin.spongeRadius + 1; cx++) {
for (cy = oy - plugin.spongeRadius - 1; cy <= oy + plugin.spongeRadius + 1; cy++) {
int cz = oz - wcfg.spongeRadius - 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy, cz + 1);
}
@ -647,9 +684,9 @@ public class WorldGuardBlockListener extends BlockListener {
}
// The positive z edge
cz = oz + plugin.spongeRadius + 1;
for (cx = ox - plugin.spongeRadius - 1; cx <= ox + plugin.spongeRadius + 1; cx++) {
for (cy = oy - plugin.spongeRadius - 1; cy <= oy + plugin.spongeRadius + 1; cy++) {
cz = oz + wcfg.spongeRadius + 1;
for (cx = ox - wcfg.spongeRadius - 1; cx <= ox + wcfg.spongeRadius + 1; cx++) {
for (cy = oy - wcfg.spongeRadius - 1; cy <= oy + wcfg.spongeRadius + 1; cy++) {
if (isBlockWater(world, cx, cy, cz)) {
setBlockToWater(world, cx, cy, cz - 1);
}
@ -693,4 +730,4 @@ public class WorldGuardBlockListener extends BlockListener {
return false;
}
}
}
}

View File

@ -0,0 +1,419 @@
// $Id$
/*
* WorldGuard
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit;
import com.sk89q.bukkit.migration.PermissionsResolverManager;
import com.sk89q.bukkit.migration.PermissionsResolverServerListener;
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.bukkit.commands.CommandHandler.InsufficientPermissionsException;
import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.dbs.CSVDatabase;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
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 java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.config.Configuration;
/**
*
* @author Michael
*/
public class WorldGuardConfiguration {
private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
private PermissionsResolverServerListener permsListener;
private PermissionsResolverManager perms;
private WorldGuardPlugin wg;
private Map<String, WorldGuardWorldConfiguration> worldConfig;
private Set<String> invinciblePlayers = new HashSet<String>();
private Set<String> amphibiousPlayers = new HashSet<String>();
private boolean suppressTickSyncWarnings;
private static Pattern groupPattern = Pattern.compile("^[gG]:(.+)$");
public WorldGuardConfiguration(WorldGuardPlugin wg) {
this.wg = wg;
this.worldConfig = new HashMap<String, WorldGuardWorldConfiguration>();
}
public WorldGuardWorldConfiguration getWorldConfig(String worldName) {
WorldGuardWorldConfiguration ret = worldConfig.get(worldName);
if (ret == null) {
ret = createWorldConfig(worldName);
worldConfig.put(worldName, ret);
}
return ret;
}
private WorldGuardWorldConfiguration createWorldConfig(String worldName) {
File configFile = new File(wg.getDataFolder(), worldName + ".yml");
File blacklistFile = new File(wg.getDataFolder(), worldName + "_blacklist.txt");
return new WorldGuardWorldConfiguration(wg, worldName, configFile, blacklistFile);
}
public void onEnable() {
checkOldConfigFiles();
checkOldCSVDB();
perms = new PermissionsResolverManager(wg.getConfiguration(), wg.getServer(), "WorldGuard", logger);
permsListener = new PermissionsResolverServerListener(perms);
invinciblePlayers.clear();
amphibiousPlayers.clear();
try {
for (Player player : wg.getServer().getOnlinePlayers()) {
if (inGroup(player, "wg-invincible")) {
invinciblePlayers.add(player.getName());
}
if (inGroup(player, "wg-amphibious")) {
amphibiousPlayers.add(player.getName());
}
}
} catch (NullPointerException e) { // Thrown if loaded too early
}
File configFile = new File(wg.getDataFolder(), "global.yml");
WorldGuardWorldConfiguration.createDefaultConfiguration(configFile, "global.yml");
Configuration config = new Configuration(configFile);
config.load();
suppressTickSyncWarnings = config.getBoolean("suppress-tick-sync-warnings", false);
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);
}
}
worldConfig.clear();
;
for (World w : wg.getServer().getWorlds()) {
String worldName = w.getName();
worldConfig.put(worldName, createWorldConfig(worldName));
}
permsListener.register(wg);
perms.load();
}
private void checkOldConfigFiles() {
try {
File oldFile = new File(wg.getDataFolder(), "config.yml");
if (oldFile.exists()) {
logger.info("WorldGuard: WARNING: config.yml is outdated, please reapply your configuration in <world>.yml and global.yml");
logger.info("WorldGuard: WARNING: config.yml renamed to config.yml.old");
oldFile.renameTo(new File(wg.getDataFolder(), "config.yml.old"));
}
oldFile = new File(wg.getDataFolder(), "blacklist.txt");
if (oldFile.exists()) {
logger.info("WorldGuard: WARNING: blacklist.txt is outdated, please reapply your configuration in <world>_blacklist.txt");
logger.info("WorldGuard: WARNING: blacklist.txt renamed to blacklist.txt.old");
oldFile.renameTo(new File(wg.getDataFolder(), "blacklist.txt.old"));
}
} catch (Exception e) {
}
}
private void checkOldCSVDB() {
try {
File CSVfile = new File(wg.getDataFolder(), "regions.txt");
if (CSVfile.exists()) {
logger.info("WorldGuard: Converting old regions.txt to new format....");
World w = wg.getServer().getWorlds().get(0);
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(w.getName());
CSVDatabase db = new CSVDatabase(CSVfile);
db.load();
for (Map.Entry<String, ProtectedRegion> entry : db.getRegions().entrySet()) {
mgr.addRegion(entry.getValue());
}
mgr.save();
CSVfile.renameTo(new File(wg.getDataFolder(), "regions.txt.old"));
logger.info("WorldGuard: Done.");
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
logger.warning("WorldGuard: Failed to load regions: "
+ e.getMessage());
}
}
public void onDisable() {
}
public boolean canBuild(Player player, int x, int y, int z) {
if (getWorldConfig(player.getWorld().getName()).useRegions) {
Vector pt = new Vector(x, y, z);
LocalPlayer localPlayer = BukkitPlayer.wrapPlayer(this, player);
if (!hasPermission(player, "/regionbypass")) {
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
if (!mgr.getApplicableRegions(pt).canBuild(localPlayer)) {
return false;
}
}
return true;
} else {
return true;
}
}
public boolean canBuild(Player player, Vector pt) {
if (getWorldConfig(player.getWorld().getName()).useRegions) {
LocalPlayer localPlayer = BukkitPlayer.wrapPlayer(this, player);
if (!hasPermission(player, "/regionbypass")) {
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
if (!mgr.getApplicableRegions(pt).canBuild(localPlayer)) {
return false;
}
}
return true;
} else {
return true;
}
}
public boolean inGroup(Player player, String group) {
try {
return perms.inGroup(player.getName(), group);
} catch (Throwable t) {
t.printStackTrace();
return false;
}
}
public String[] getGroups(Player player) {
try {
return perms.getGroups(player.getName());
} catch (Throwable t) {
t.printStackTrace();
return new String[0];
}
}
public boolean hasPermission(Player player, String perm) {
try {
return player.isOp() || perms.hasPermission(player.getName(), "worldguard." + perm);
} catch (Throwable t) {
t.printStackTrace();
return false;
}
}
/**
* Checks for the command or /region.
*
* @param player
* @param cmd
* @return
*/
public boolean canUseRegionCommand(Player player, String cmd) {
return hasPermission(player, "region")
|| hasPermission(player, cmd);
}
/**
* Checks to see if there are sufficient permissions, otherwise an exception
* is raised in that case.
*
* @param player
* @param permission
* @throws InsufficientPermissionsException
*/
public void checkRegionPermission(CommandSender sender, String permission)
throws InsufficientPermissionsException {
if (!(sender instanceof Player)) {
return;
}
Player player = (Player)sender;
if (!hasPermission(player, permission)) {
throw new InsufficientPermissionsException();
}
}
/**
* Checks to see if there are sufficient permissions, otherwise an exception
* is raised in that case.
*
* @param sender
* @param permission
* @throws InsufficientPermissionsException
*/
public void checkPermission(CommandSender sender, String permission)
throws InsufficientPermissionsException {
if (!(sender instanceof Player)) {
return;
}
if (!hasPermission((Player)sender, permission)) {
throw new InsufficientPermissionsException();
}
}
/**
* Parse a group/player DefaultDomain specification for areas.
*
* @param domain
* @param split
* @param startIndex
*/
public static void addToDomain(DefaultDomain domain,
String[] split, int startIndex) {
for (int i = startIndex; i < split.length; i++) {
String s = split[i];
Matcher m = groupPattern.matcher(s);
if (m.matches()) {
domain.addGroup(m.group(1));
} else {
domain.addPlayer(s);
}
}
}
/**
* Parse a group/player DefaultDomain specification for areas.
*
* @param domain
* @param split
* @param startIndex
*/
public static void removeFromDomain(DefaultDomain domain,
String[] split, int startIndex) {
for (int i = startIndex; i < split.length; i++) {
String s = split[i];
Matcher m = groupPattern.matcher(s);
if (m.matches()) {
domain.removeGroup(m.group(1));
} else {
domain.removePlayer(s);
}
}
}
/**
* Parse a group/player DefaultDomain specification for areas.
*
* @param split
* @param startIndex
* @return
*/
public static DefaultDomain parseDomainString(String[] split, int startIndex) {
DefaultDomain domain = new DefaultDomain();
for (int i = startIndex; i < split.length; i++) {
String s = split[i];
Matcher m = groupPattern.matcher(s);
if (m.matches()) {
domain.addGroup(m.group(1));
} else {
domain.addPlayer(s);
}
}
return domain;
}
public boolean isAmphibiousPlayer(String playerName) {
if (amphibiousPlayers.contains(playerName)) {
return true;
}
return false;
}
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);
}
public void forgetPlayerAllBlacklists(LocalPlayer player) {
for (Map.Entry<String, WorldGuardWorldConfiguration> entry : worldConfig.entrySet()) {
Blacklist bl = entry.getValue().getBlacklist();
if (bl != null) {
bl.forgetPlayer(player);
}
}
}
public WorldGuardPlugin getWorldGuardPlugin()
{
return this.wg;
}
}

View File

@ -61,17 +61,20 @@ public class WorldGuardEntityListener extends EntityListener {
if (defender instanceof Player) {
Player player = (Player)defender;
if (plugin.invinciblePlayers.contains(player.getName())) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (cfg.isInvinciblePlayer(player.getName())) {
event.setCancelled(true);
return;
}
if (plugin.disableLavaDamage && type == DamageCause.LAVA) {
if (wcfg.disableLavaDamage && type == DamageCause.LAVA) {
event.setCancelled(true);
return;
}
if (plugin.disableContactDamage && type == DamageCause.CONTACT) {
if (wcfg.disableContactDamage && type == DamageCause.CONTACT) {
event.setCancelled(true);
return;
}
@ -86,13 +89,16 @@ public class WorldGuardEntityListener extends EntityListener {
if (defender instanceof Player) {
Player player = (Player)defender;
if (plugin.invinciblePlayers.contains(player.getName())) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (cfg.isInvinciblePlayer(player.getName())) {
event.setCancelled(true);
return;
}
if (attacker != null && attacker instanceof Player) {
if (plugin.useRegions) {
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
@ -106,12 +112,12 @@ public class WorldGuardEntityListener extends EntityListener {
}
if (attacker != null && attacker instanceof Monster) {
if (attacker instanceof Creeper && plugin.blockCreeperExplosions) {
if (attacker instanceof Creeper && wcfg.blockCreeperExplosions) {
event.setCancelled(true);
return;
}
if (plugin.useRegions) {
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
@ -141,13 +147,16 @@ public class WorldGuardEntityListener extends EntityListener {
if (defender instanceof Player) {
Player player = (Player)defender;
if (plugin.invinciblePlayers.contains(player.getName())) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (cfg.isInvinciblePlayer(player.getName())) {
event.setCancelled(true);
return;
}
if (attacker != null && attacker instanceof Player) {
if (plugin.useRegions) {
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
@ -160,7 +169,7 @@ public class WorldGuardEntityListener extends EntityListener {
}
}
if (attacker != null && attacker instanceof Skeleton) {
if (plugin.useRegions) {
if (wcfg.useRegions) {
Vector pt = toVector(defender.getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
@ -200,40 +209,43 @@ public class WorldGuardEntityListener extends EntityListener {
if (defender instanceof Player) {
Player player = (Player)defender;
if (plugin.invinciblePlayers.contains(player.getName())) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (cfg.isInvinciblePlayer(player.getName())) {
event.setCancelled(true);
return;
}
if (plugin.disableFallDamage && type == DamageCause.FALL) {
if (wcfg.disableFallDamage && type == DamageCause.FALL) {
event.setCancelled(true);
return;
}
if (plugin.disableFireDamage && (type == DamageCause.FIRE
if (wcfg.disableFireDamage && (type == DamageCause.FIRE
|| type == DamageCause.FIRE_TICK)) {
event.setCancelled(true);
return;
}
if (plugin.disableDrowningDamage && type == DamageCause.DROWNING) {
if (wcfg.disableDrowningDamage && type == DamageCause.DROWNING) {
event.setCancelled(true);
return;
}
if (plugin.teleportOnSuffocation && type == DamageCause.SUFFOCATION) {
if (wcfg.teleportOnSuffocation && type == DamageCause.SUFFOCATION) {
findFreePosition(player);
event.setCancelled(true);
return;
}
if (plugin.disableSuffocationDamage && type == DamageCause.SUFFOCATION) {
if (wcfg.disableSuffocationDamage && type == DamageCause.SUFFOCATION) {
event.setCancelled(true);
return;
}
if (type == DamageCause.DROWNING
&& plugin.amphibiousPlayers.contains(player.getName())) {
&& cfg.isAmphibiousPlayer(player.getName())) {
event.setCancelled(true);
return;
}
@ -248,18 +260,23 @@ public class WorldGuardEntityListener extends EntityListener {
return;
}
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getEntity().getWorld().getName());
if (event.getEntity() instanceof LivingEntity) {
if (plugin.blockCreeperBlockDamage) {
if (wcfg.blockCreeperBlockDamage) {
event.setCancelled(true);
return;
}
if (plugin.blockCreeperExplosions) {
if (wcfg.blockCreeperExplosions) {
event.setCancelled(true);
return;
}
if (plugin.useRegions) {
if (wcfg.useRegions) {
Vector pt = toVector(event.getEntity().getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(event.getEntity().getWorld().getName());
@ -270,12 +287,12 @@ public class WorldGuardEntityListener extends EntityListener {
}
}
} else { // Shall assume that this is TNT
if (plugin.blockTNT) {
if (wcfg.blockTNT) {
event.setCancelled(true);
return;
}
if (plugin.useRegions && event.getEntity() != null) {
if (wcfg.useRegions && event.getEntity() != null) {
Vector pt = toVector(event.getEntity().getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(event.getEntity().getWorld().getName());
@ -294,26 +311,29 @@ public class WorldGuardEntityListener extends EntityListener {
return;
}
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getEntity().getWorld().getName());
CreatureType creaType = (CreatureType)CreatureType.valueOf(event.getMobType().toString());
String creaName = "";
Boolean cancelEvent = false;
switch(creaType) {
case SPIDER: if (plugin.blockCreatureSpawn.contains("spider")) { cancelEvent = true; } creaName = "spider"; break;
case ZOMBIE: if (plugin.blockCreatureSpawn.contains("zombie")) { cancelEvent = true; } creaName = "zombie"; break;
case CREEPER: if (plugin.blockCreatureSpawn.contains("creeper")) { cancelEvent = true; } creaName = "creeper"; break;
case SKELETON: if (plugin.blockCreatureSpawn.contains("skeleton")) { cancelEvent = true; } creaName = "skeleton"; break;
case SQUID: if (plugin.blockCreatureSpawn.contains("squid")) { cancelEvent = true; } creaName = "squid"; break;
case PIG_ZOMBIE: if (plugin.blockCreatureSpawn.contains("pigzombie")) { cancelEvent = true; } creaName = "pigzombie"; break;
case GHAST: if (plugin.blockCreatureSpawn.contains("ghast")) { cancelEvent = true; } creaName = "ghast"; break;
case SLIME: if (plugin.blockCreatureSpawn.contains("slime")) { cancelEvent = true; } creaName = "slime"; break;
case PIG: if (plugin.blockCreatureSpawn.contains("pig")) { cancelEvent = true; } creaName = "pig"; break;
case COW: if (plugin.blockCreatureSpawn.contains("cow")) { cancelEvent = true; } creaName = "cow"; break;
case SHEEP: if (plugin.blockCreatureSpawn.contains("sheep")) { cancelEvent = true; } creaName = "sheep"; break;
case CHICKEN: if (plugin.blockCreatureSpawn.contains("chicken")) { cancelEvent = true; } creaName = "chicken"; break;
case SPIDER: if (wcfg.blockCreatureSpawn.contains("spider")) { cancelEvent = true; } creaName = "spider"; break;
case ZOMBIE: if (wcfg.blockCreatureSpawn.contains("zombie")) { cancelEvent = true; } creaName = "zombie"; break;
case CREEPER: if (wcfg.blockCreatureSpawn.contains("creeper")) { cancelEvent = true; } creaName = "creeper"; break;
case SKELETON: if (wcfg.blockCreatureSpawn.contains("skeleton")) { cancelEvent = true; } creaName = "skeleton"; break;
case SQUID: if (wcfg.blockCreatureSpawn.contains("squid")) { cancelEvent = true; } creaName = "squid"; break;
case PIG_ZOMBIE: if (wcfg.blockCreatureSpawn.contains("pigzombie")) { cancelEvent = true; } creaName = "pigzombie"; break;
case GHAST: if (wcfg.blockCreatureSpawn.contains("ghast")) { cancelEvent = true; } creaName = "ghast"; break;
case SLIME: if (wcfg.blockCreatureSpawn.contains("slime")) { cancelEvent = true; } creaName = "slime"; break;
case PIG: if (wcfg.blockCreatureSpawn.contains("pig")) { cancelEvent = true; } creaName = "pig"; break;
case COW: if (wcfg.blockCreatureSpawn.contains("cow")) { cancelEvent = true; } creaName = "cow"; break;
case SHEEP: if (wcfg.blockCreatureSpawn.contains("sheep")) { cancelEvent = true; } creaName = "sheep"; break;
case CHICKEN: if (wcfg.blockCreatureSpawn.contains("chicken")) { cancelEvent = true; } creaName = "chicken"; break;
}
if (plugin.useRegions && creaName != "") {
if (wcfg.useRegions && creaName != "") {
Vector pt = toVector(event.getEntity().getLocation());
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(event.getEntity().getWorld().getName());

View File

@ -59,18 +59,21 @@ public class WorldGuardPlayerListener extends PlayerListener {
@Override
public void onPlayerJoin(PlayerEvent event) {
Player player = event.getPlayer();
if (plugin.fireSpreadDisableToggle) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (wcfg.fireSpreadDisableToggle) {
player.sendMessage(ChatColor.YELLOW
+ "Fire spread is currently globally disabled.");
}
if (plugin.inGroup(player, "wg-invincible")) {
plugin.invinciblePlayers.add(player.getName());
if (cfg.inGroup(player, "wg-invincible")) {
cfg.addInvinciblePlayer(player.getName());
}
if (plugin.inGroup(player, "wg-amphibious")) {
plugin.amphibiousPlayers.add(player.getName());
if (cfg.inGroup(player, "wg-amphibious")) {
cfg.addAmphibiousPlayer(player.getName());
}
}
@ -82,11 +85,14 @@ public class WorldGuardPlayerListener extends PlayerListener {
@Override
public void onPlayerQuit(PlayerEvent event) {
Player player = event.getPlayer();
plugin.invinciblePlayers.remove(player.getName());
plugin.amphibiousPlayers.remove(player.getName());
if (plugin.blacklist != null) {
plugin.blacklist.forgetPlayer(plugin.wrapPlayer(player));
}
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
cfg.removeInvinciblePlayer(player.getName());
cfg.removeAmphibiousPlayer(player.getName());
cfg.forgetPlayerAllBlacklists(BukkitPlayer.wrapPlayer(cfg, player));
}
/**
@ -106,7 +112,10 @@ public class WorldGuardPlayerListener extends PlayerListener {
Block block = event.getBlockClicked();
ItemStack item = event.getItem();
if (!plugin.itemDurability) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (!wcfg.itemDurability) {
// Hoes
if (item.getTypeId() >= 290 && item.getTypeId() <= 294) {
item.setDurability((byte)-1);
@ -114,10 +123,10 @@ public class WorldGuardPlayerListener extends PlayerListener {
}
}
if (plugin.useRegions && !event.isBlock() && block != null) {
if (wcfg.useRegions && !event.isBlock() && block != null) {
Vector pt = toVector(block.getRelative(event.getBlockFace()));
if (!plugin.canBuild(player, pt)) {
if (!cfg.canBuild(player, pt)) {
player.sendMessage(ChatColor.DARK_RED
+ "You don't have permission for this area.");
event.setCancelled(true);
@ -125,9 +134,9 @@ public class WorldGuardPlayerListener extends PlayerListener {
}
}
if (plugin.blacklist != null && item != null && block != null) {
if (!plugin.blacklist.check(
new ItemUseBlacklistEvent(plugin.wrapPlayer(player),
if (wcfg.getBlacklist() != null && item != null && block != null) {
if (!wcfg.getBlacklist().check(
new ItemUseBlacklistEvent(BukkitPlayer.wrapPlayer(cfg, player),
toVector(block.getRelative(event.getBlockFace())),
item.getTypeId()), false, false)) {
event.setCancelled(true);
@ -135,7 +144,7 @@ public class WorldGuardPlayerListener extends PlayerListener {
}
}
if (plugin.useRegions && item != null && block != null && item.getTypeId() == 259) {
if (wcfg.useRegions && item != null && block != null && item.getTypeId() == 259) {
Vector pt = toVector(block.getRelative(event.getBlockFace()));
RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
@ -155,8 +164,11 @@ public class WorldGuardPlayerListener extends PlayerListener {
@Override
public void onPlayerLogin(PlayerLoginEvent event) {
Player player = event.getPlayer();
if (plugin.enforceOneSession) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());
if (wcfg.enforceOneSession) {
String name = player.getName();
for (Player pl : plugin.getServer().getOnlinePlayers()) {
@ -179,11 +191,14 @@ public class WorldGuardPlayerListener extends PlayerListener {
return;
}
if (plugin.blacklist != null) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getPlayer().getWorld().getName());
if (wcfg.getBlacklist() != null) {
Item ci = event.getItemDrop();
if (!plugin.blacklist.check(
new ItemDropBlacklistEvent(plugin.wrapPlayer(event
if (!wcfg.getBlacklist().check(
new ItemDropBlacklistEvent(BukkitPlayer.wrapPlayer(cfg, event
.getPlayer()), toVector(ci.getLocation()), ci
.getItemStack().getTypeId()), false, false)) {
event.setCancelled(true);
@ -205,11 +220,14 @@ public class WorldGuardPlayerListener extends PlayerListener {
return;
}
if (plugin.blacklist != null) {
WorldGuardConfiguration cfg = plugin.getWgConfiguration();
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(event.getPlayer().getWorld().getName());
if (wcfg.getBlacklist() != null) {
Item ci = event.getItem();
if (!plugin.blacklist.check(
new ItemAcquireBlacklistEvent(plugin.wrapPlayer(event
if (!wcfg.getBlacklist().check(
new ItemAcquireBlacklistEvent(BukkitPlayer.wrapPlayer(cfg, event
.getPlayer()), toVector(ci.getLocation()), ci
.getItemStack().getTypeId()), false, false)) {
event.setCancelled(true);

View File

@ -15,45 +15,20 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
package com.sk89q.worldguard.bukkit;
import com.sk89q.worldguard.protection.dbs.CSVDatabase;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import java.io.*;
import java.util.*;
import java.util.logging.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.plugin.Plugin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginEvent;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.config.Configuration;
import com.nijikokun.bukkit.iConomy.iConomy;
import com.sk89q.bukkit.migration.PermissionsResolverManager;
import com.sk89q.bukkit.migration.PermissionsResolverServerListener;
import com.sk89q.worldguard.bukkit.WorldGuardServerListener;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.TickSyncDelayLoggerFilter;
import com.sk89q.worldguard.blacklist.*;
import com.sk89q.worldguard.blacklist.loggers.*;
import com.sk89q.worldguard.bukkit.commands.CommandHandler;
import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.*;
import com.sk89q.worldguard.protection.regionmanager.GlobalRegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import org.bukkit.World;
import org.bukkit.plugin.PluginManager;
/**
* Plugin for Bukkit.
@ -61,118 +36,41 @@ import org.bukkit.World;
* @author sk89qs
*/
public class WorldGuardPlugin extends JavaPlugin {
private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
private final WorldGuardPlayerListener playerListener =
new WorldGuardPlayerListener(this);
new WorldGuardPlayerListener(this);
private final WorldGuardBlockListener blockListener =
new WorldGuardBlockListener(this);
new WorldGuardBlockListener(this);
private final WorldGuardEntityListener entityListener =
new WorldGuardEntityListener(this);
new WorldGuardEntityListener(this);
private final WorldGuardServerListener serverListener =
new WorldGuardServerListener(this);
private PermissionsResolverServerListener permsListener;
private PermissionsResolverManager perms;
private GlobalRegionManager globalRegionManager;
private CommandHandler commandHandler;
Blacklist blacklist;
public Set<String> invinciblePlayers = new HashSet<String>();
public Set<String> amphibiousPlayers = new HashSet<String>();
public boolean fireSpreadDisableToggle;
public static iConomy iConomy;
// Configuration follows
public boolean suppressTickSyncWarnings;
public boolean enforceOneSession;
public boolean itemDurability;
public boolean classicWater;
public boolean simulateSponge;
public int spongeRadius;
public boolean redstoneSponges;
public boolean noPhysicsGravel;
public boolean noPhysicsSand;
public boolean allowPortalAnywhere;
public Set<Integer> preventWaterDamage;
public boolean blockTNT;
public boolean blockLighter;
public boolean disableFireSpread;
public Set<Integer> disableFireSpreadBlocks;
public boolean preventLavaFire;
public Set<Integer> allowedLavaSpreadOver;
public boolean blockCreeperExplosions;
public boolean blockCreeperBlockDamage;
public int loginProtection;
public int spawnProtection;
public boolean kickOnDeath;
public boolean exactRespawn;
public boolean teleportToHome;
public boolean disableContactDamage;
public boolean disableFallDamage;
public boolean disableLavaDamage;
public boolean disableFireDamage;
public boolean disableDrowningDamage;
public boolean disableSuffocationDamage;
public boolean teleportOnSuffocation;
public boolean useRegions;
public boolean useiConomy;
public boolean buyOnClaim;
public int buyOnClaimPrice;
public int regionWand = 287;
public String blockCreatureSpawn = "";
/**
* Construct the plugin.
*
*/
public WorldGuardPlugin() {
super();
this.commandHandler = new CommandHandler(this);
logger.info("WorldGuard loaded.");
}
private final CommandHandler commandHandler = new CommandHandler(this);
private final GlobalRegionManager globalRegionManager = new GlobalRegionManager(this);
private final WorldGuardConfiguration configuration = new WorldGuardConfiguration(this);
/**
* Called on plugin enable.
*/
public void onEnable() {
PluginDescriptionFile desc = this.getDescription();
File folder = this.getDataFolder();
folder.mkdirs();
createDefaultConfiguration("config.yml");
createDefaultConfiguration("blacklist.txt");
globalRegionManager = new GlobalRegionManager(this);
perms = new PermissionsResolverManager(getConfiguration(), getServer(),
"WorldGuard", logger);
permsListener = new PermissionsResolverServerListener(perms);
loadConfiguration();
postReload();
getDataFolder().mkdirs();
globalRegionManager.onEnable();
registerEvents();
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);
}
}
logger.info("WorldGuard " + desc.getVersion() + " enabled.");
logger.info("WorldGuard " + this.getDescription().getVersion() + " enabled.");
}
/**
* Called on plugin disable.
*/
public void onDisable() {
globalRegionManager.onDisable();
logger.info("WorldGuard " + this.getDescription().getVersion() + " disabled.");
}
@ -180,288 +78,33 @@ public class WorldGuardPlugin extends JavaPlugin {
* Register used events.
*/
private void registerEvents() {
registerEvent(Event.Type.BLOCK_DAMAGED, blockListener, Priority.High);
registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.High);
registerEvent(Event.Type.BLOCK_FLOW, blockListener, Priority.Normal);
registerEvent(Event.Type.BLOCK_IGNITE, blockListener, Priority.High);
registerEvent(Event.Type.BLOCK_PHYSICS, blockListener, Priority.Normal);
registerEvent(Event.Type.BLOCK_INTERACT, blockListener, Priority.High);
registerEvent(Event.Type.BLOCK_PLACED, blockListener, Priority.High);
registerEvent(Event.Type.BLOCK_RIGHTCLICKED, blockListener, Priority.High);
registerEvent(Event.Type.BLOCK_BURN, blockListener, Priority.High);
registerEvent(Event.Type.REDSTONE_CHANGE, blockListener, Priority.High);
registerEvent(Event.Type.ENTITY_DAMAGED, entityListener, Priority.High);
registerEvent(Event.Type.ENTITY_EXPLODE, entityListener, Priority.High);
registerEvent(Event.Type.CREATURE_SPAWN, entityListener, Priority.High);
PluginManager pm = getServer().getPluginManager();
registerEvent(Event.Type.PLAYER_ITEM, playerListener, Priority.High);
registerEvent(Event.Type.PLAYER_DROP_ITEM, playerListener, Priority.High);
registerEvent(Event.Type.PLAYER_PICKUP_ITEM, playerListener, Priority.High);
registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal);
registerEvent(Event.Type.PLAYER_LOGIN, playerListener, Priority.Normal);
registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Normal);
pm.registerEvent(Event.Type.BLOCK_DAMAGED, blockListener, Priority.High, this);
pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.High, this);
pm.registerEvent(Event.Type.BLOCK_FLOW, blockListener, Priority.Normal, this);
pm.registerEvent(Event.Type.BLOCK_IGNITE, blockListener, Priority.High, this);
pm.registerEvent(Event.Type.BLOCK_PHYSICS, blockListener, Priority.Normal, this);
pm.registerEvent(Event.Type.BLOCK_INTERACT, blockListener, Priority.High, this);
pm.registerEvent(Event.Type.BLOCK_PLACED, blockListener, Priority.High, this);
pm.registerEvent(Event.Type.BLOCK_RIGHTCLICKED, blockListener, Priority.High, this);
pm.registerEvent(Event.Type.BLOCK_BURN, blockListener, Priority.High, this);
pm.registerEvent(Event.Type.REDSTONE_CHANGE, blockListener, Priority.High, this);
this.getServer().getPluginManager().registerEvent(Event.Type.PLUGIN_ENABLE, serverListener, Priority.Monitor, this);
pm.registerEvent(Event.Type.ENTITY_DAMAGED, entityListener, Priority.High, this);
pm.registerEvent(Event.Type.ENTITY_EXPLODE, entityListener, Priority.High, this);
pm.registerEvent(Event.Type.CREATURE_SPAWN, entityListener, Priority.High, this);
permsListener.register(this);
pm.registerEvent(Event.Type.PLAYER_ITEM, playerListener, Priority.High, this);
pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, playerListener, Priority.High, this);
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, playerListener, Priority.High, this);
pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_LOGIN, playerListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Normal, this);
// 25 equals about 1s real time
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new TimedFlagsTimer(this), 25*5, 25*5);
}
/**
* Register an event.
*
* @param type
* @param listener
* @param priority
*/
private void registerEvent(Event.Type type, Listener listener, Priority priority) {
getServer().getPluginManager().registerEvent(type, listener, priority, this);
}
/**
* Create a default configuration file from the .jar.
*
* @param name
*/
private void createDefaultConfiguration(String name) {
File actual = new File(getDataFolder(), name);
if (!actual.exists()) {
InputStream input =
WorldGuardPlugin.class.getResourceAsStream("/defaults/" + name);
if (input != null) {
FileOutputStream output = null;
try {
output = new FileOutputStream(actual);
byte[] buf = new byte[8192];
int length = 0;
while ((length = input.read(buf)) > 0) {
output.write(buf, 0, length);
}
logger.info("WorldGuard: Default configuration file written: "
+ name);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (input != null)
input.close();
} catch (IOException e) {}
try {
if (output != null)
output.close();
} catch (IOException e) {}
}
}
}
}
/**
* Load the configuration.
*/
public void loadConfiguration() {
Configuration config = getConfiguration();
config.load();
perms.load();
suppressTickSyncWarnings = config.getBoolean("suppress-tick-sync-warnings", false);
enforceOneSession = config.getBoolean("protection.enforce-single-session", true);
itemDurability = config.getBoolean("protection.item-durability", true);
classicWater = config.getBoolean("simulation.classic-water", false);
simulateSponge = config.getBoolean("simulation.sponge.enable", true);
spongeRadius = Math.max(1, config.getInt("simulation.sponge.radius", 3)) - 1;
redstoneSponges = config.getBoolean("simulation.sponge.redstone", false);
noPhysicsGravel = config.getBoolean("physics.no-physics-gravel", false);
noPhysicsSand = config.getBoolean("physics.no-physics-sand", false);
allowPortalAnywhere = config.getBoolean("physics.allow-portal-anywhere", false);
preventWaterDamage = new HashSet<Integer>(config.getIntList("physics.disable-water-damage-blocks", null));
blockTNT = config.getBoolean("ignition.block-tnt", false);
blockLighter = config.getBoolean("ignition.block-lighter", false);
preventLavaFire = config.getBoolean("fire.disable-lava-fire-spread", true);
disableFireSpread = config.getBoolean("fire.disable-all-fire-spread", false);
disableFireSpreadBlocks = new HashSet<Integer>(config.getIntList("fire.disable-fire-spread-blocks", null));
allowedLavaSpreadOver = new HashSet<Integer>(config.getIntList("fire.lava-spread-blocks", null));
blockCreeperExplosions = config.getBoolean("mobs.block-creeper-explosions", false);
blockCreeperBlockDamage = config.getBoolean("mobs.block-creeper-block-damage", false);
loginProtection = config.getInt("spawn.login-protection", 3);
spawnProtection = config.getInt("spawn.spawn-protection", 0);
kickOnDeath = config.getBoolean("spawn.kick-on-death", false);
exactRespawn = config.getBoolean("spawn.exact-respawn", false);
teleportToHome = config.getBoolean("spawn.teleport-to-home-on-death", false);
disableFallDamage = config.getBoolean("player-damage.disable-fall-damage", false);
disableLavaDamage = config.getBoolean("player-damage.disable-lava-damage", false);
disableFireDamage = config.getBoolean("player-damage.disable-fire-damage", false);
disableDrowningDamage = config.getBoolean("player-damage.disable-drowning-damage", false);
disableSuffocationDamage = config.getBoolean("player-damage.disable-suffocation-damage", false);
disableContactDamage = config.getBoolean("player-damage.disable-contact-damage", false);
teleportOnSuffocation = config.getBoolean("player-damage.teleport-on-suffocation", false);
useRegions = config.getBoolean("regions.enable", true);
regionWand = config.getInt("regions.wand", 287);
for (String creature : config.getStringList("mobs.block-creature-spawn", null)) {
blockCreatureSpawn += creature.toLowerCase() + " ";
}
useiConomy = config.getBoolean("iconomy.enable", false);
buyOnClaim = config.getBoolean("iconomy.buy-on-claim", false);
buyOnClaimPrice = config.getInt("iconomy.buy-on-claim-price", 1);
GlobalFlags globalFlags = new GlobalFlags();
globalFlags.canBuild = config.getBoolean("regions.default.build", true);
globalFlags.canAccessChests = config.getBoolean("regions.default.chest-access", false);
globalFlags.canPvP = config.getBoolean("regions.default.pvp", true);
globalFlags.canLighter = config.getBoolean("regions.default.lighter", true);
globalFlags.canTnt = config.getBoolean("regions.default.tnt", true);
globalFlags.allowCreeper = config.getBoolean("regions.default.creeper", true);
globalFlags.allowMobDamage = config.getBoolean("regions.default.mobdamage", true);
globalFlags.allowWaterflow = config.getBoolean("regions.default.waterflow", true);
globalRegionManager.setGlobalFlags(globalFlags);
try {
File CSVfile = new File(this.getDataFolder(), "regions.txt");
if (CSVfile.exists()) {
logger.info("WorldGuard: Converting old regions.txt to new format....");
World w = this.getServer().getWorlds().get(0);
RegionManager mgr = globalRegionManager.getRegionManager(w.getName());
CSVDatabase db = new CSVDatabase(CSVfile);
db.load();
for (Map.Entry<String, ProtectedRegion> entry : db.getRegions().entrySet()) {
mgr.addRegion(entry.getValue());
}
mgr.save();
CSVfile.renameTo(new File(this.getDataFolder(), "regions.txt.old"));
logger.info("WorldGuard: Done.");
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
logger.warning("WorldGuard: Failed to load regions: "
+ e.getMessage());
}
// Console log configuration
boolean logConsole = config.getBoolean("blacklist.logging.console.enable", true);
// Database log configuration
boolean logDatabase = config.getBoolean("blacklist.logging.database.enable", false);
String dsn = config.getString("blacklist.logging.database.dsn", "jdbc:mysql://localhost:3306/minecraft");
String user = config.getString("blacklist.logging.database.user", "root");
String pass = config.getString("blacklist.logging.database.pass", "");
String table = config.getString("blacklist.logging.database.table", "blacklist_events");
// File log configuration
boolean logFile = config.getBoolean("blacklist.logging.file.enable", false);
String logFilePattern = config.getString("blacklist.logging.file.path", "worldguard/logs/%Y-%m-%d.log");
int logFileCacheSize = Math.max(1, config.getInt("blacklist.logging.file.open-files", 10));
// Load the blacklist
try {
// If there was an existing blacklist, close loggers
if (blacklist != null) {
blacklist.getLogger().close();
}
// First load the blacklist data from worldguard-blacklist.txt
Blacklist blist = new BukkitBlacklist(this);
blist.load(new File(getDataFolder(), "blacklist.txt"));
// If the blacklist is empty, then set the field to null
// and save some resources
if (blist.isEmpty()) {
this.blacklist = null;
} else {
this.blacklist = blist;
logger.log(Level.INFO, "WorldGuard: Blacklist loaded.");
BlacklistLogger blacklistLogger = blist.getLogger();
if (logDatabase) {
blacklistLogger.addHandler(new DatabaseLoggerHandler(dsn, user, pass, table));
}
if (logConsole) {
blacklistLogger.addHandler(new ConsoleLoggerHandler());
}
if (logFile) {
FileLoggerHandler handler =
new FileLoggerHandler(logFilePattern, logFileCacheSize);
blacklistLogger.addHandler(handler);
}
}
} catch (FileNotFoundException e) {
logger.log(Level.WARNING, "WorldGuard blacklist does not exist.");
} catch (IOException e) {
logger.log(Level.WARNING, "Could not load WorldGuard blacklist: "
+ e.getMessage());
}
// Print an overview of settings
if (config.getBoolean("summary-on-start", true)) {
logger.log(Level.INFO, enforceOneSession ? "WorldGuard: Single session is enforced."
: "WorldGuard: Single session is NOT ENFORCED.");
logger.log(Level.INFO, blockTNT ? "WorldGuard: TNT ignition is blocked."
: "WorldGuard: TNT ignition is PERMITTED.");
logger.log(Level.INFO, blockLighter ? "WorldGuard: Lighters are blocked."
: "WorldGuard: Lighters are PERMITTED.");
logger.log(Level.INFO, preventLavaFire ? "WorldGuard: Lava fire is blocked."
: "WorldGuard: Lava fire is PERMITTED.");
if (disableFireSpread) {
logger.log(Level.INFO, "WorldGuard: All fire spread is disabled.");
} else {
if (disableFireSpreadBlocks.size() > 0) {
logger.log(Level.INFO, "WorldGuard: Fire spread is limited to "
+ disableFireSpreadBlocks.size() + " block types.");
} else {
logger.log(Level.INFO, "WorldGuard: Fire spread is UNRESTRICTED.");
}
}
}
// Temporary
perms.load();
}
/**
* Populates various lists.
*/
public void postReload() {
invinciblePlayers.clear();
amphibiousPlayers.clear();
try {
for (Player player : getServer().getOnlinePlayers()) {
if (inGroup(player, "wg-invincible")) {
invinciblePlayers.add(player.getName());
}
if (inGroup(player, "wg-amphibious")) {
amphibiousPlayers.add(player.getName());
}
}
} catch (NullPointerException e) { // Thrown if loaded too early
}
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new TimedFlagsTimer(this), 25 * 5, 25 * 5);
}
/**
@ -469,91 +112,25 @@ public class WorldGuardPlugin extends JavaPlugin {
*/
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
return commandHandler.handleCommand(sender, cmd, commandLabel, args);
return commandHandler.handleCommand(sender, cmd, commandLabel, args);
}
/**
* Get the region manager.
* Get the GlobalRegionManager.
*
* @return
*/
public GlobalRegionManager getGlobalRegionManager() {
return globalRegionManager;
}
public boolean canBuild(Player player, int x, int y, int z) {
if (useRegions) {
Vector pt = new Vector(x, y, z);
LocalPlayer localPlayer = wrapPlayer(player);
if (!hasPermission(player, "/regionbypass")) {
RegionManager mgr = globalRegionManager.getRegionManager(player.getWorld().getName());
if (!mgr.getApplicableRegions(pt).canBuild(localPlayer)) {
return false;
}
}
return true;
} else {
return true;
}
/**
* Get the WorldGuardConfiguraton.
*
* @return
*/
public WorldGuardConfiguration getWgConfiguration() {
return configuration;
}
public boolean canBuild(Player player, Vector pt) {
if (useRegions) {
LocalPlayer localPlayer = wrapPlayer(player);
if (!hasPermission(player, "/regionbypass")) {
RegionManager mgr = globalRegionManager.getRegionManager(player.getWorld().getName());
if (!mgr.getApplicableRegions(pt).canBuild(localPlayer)) {
return false;
}
}
return true;
} else {
return true;
}
}
public boolean inGroup(Player player, String group) {
try {
return perms.inGroup(player.getName(), group);
} catch (Throwable t) {
t.printStackTrace();
return false;
}
}
public boolean hasPermission(Player player, String perm) {
try {
return player.isOp() || perms.hasPermission(player.getName(), perm);
} catch (Throwable t) {
t.printStackTrace();
return false;
}
}
public String[] getGroups(Player player) {
try {
return perms.getGroups(player.getName());
} catch (Throwable t) {
t.printStackTrace();
return new String[0];
}
}
public BukkitPlayer wrapPlayer(Player player) {
return new BukkitPlayer(this, player);
}
}

View File

@ -0,0 +1,307 @@
// $Id$
/*
* WorldGuard
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit;
import com.sk89q.worldguard.blacklist.Blacklist;
import com.sk89q.worldguard.blacklist.BlacklistLogger;
import com.sk89q.worldguard.blacklist.loggers.ConsoleLoggerHandler;
import com.sk89q.worldguard.blacklist.loggers.DatabaseLoggerHandler;
import com.sk89q.worldguard.blacklist.loggers.FileLoggerHandler;
import com.sk89q.worldguard.protection.GlobalFlags;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.util.config.Configuration;
/**
*
* @author Michael
*/
public class WorldGuardWorldConfiguration {
private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
private WorldGuardPlugin wp;
private String worldName;
private File configFile;
private File blacklistFile;
private Blacklist blacklist;
/* Configuration data start */
public boolean fireSpreadDisableToggle;
public boolean enforceOneSession;
public boolean itemDurability;
public boolean classicWater;
public boolean simulateSponge;
public int spongeRadius;
public boolean redstoneSponges;
public boolean noPhysicsGravel;
public boolean noPhysicsSand;
public boolean allowPortalAnywhere;
public Set<Integer> preventWaterDamage;
public boolean blockTNT;
public boolean blockLighter;
public boolean disableFireSpread;
public Set<Integer> disableFireSpreadBlocks;
public boolean preventLavaFire;
public Set<Integer> allowedLavaSpreadOver;
public boolean blockCreeperExplosions;
public boolean blockCreeperBlockDamage;
public int loginProtection;
public int spawnProtection;
public boolean kickOnDeath;
public boolean exactRespawn;
public boolean teleportToHome;
public boolean disableContactDamage;
public boolean disableFallDamage;
public boolean disableLavaDamage;
public boolean disableFireDamage;
public boolean disableDrowningDamage;
public boolean disableSuffocationDamage;
public boolean teleportOnSuffocation;
public boolean useRegions;
public int regionWand = 287;
public String blockCreatureSpawn;
/* Configuration data end */
public WorldGuardWorldConfiguration(WorldGuardPlugin wp, String worldName, File configFile, File blacklistFile)
{
this.wp = wp;
this.worldName = worldName;
this.configFile = configFile;
this.blacklistFile = blacklistFile;
createDefaultConfiguration(configFile, "config.yml");
createDefaultConfiguration(blacklistFile, "blacklist.txt");
loadConfiguration();
}
/**
* Create a default configuration file from the .jar.
*
* @param name
*/
public static void createDefaultConfiguration(File actual, String defaultName) {
if (!actual.exists()) {
InputStream input =
WorldGuardPlugin.class.getResourceAsStream("/defaults/" + defaultName);
if (input != null) {
FileOutputStream output = null;
try {
output = new FileOutputStream(actual);
byte[] buf = new byte[8192];
int length = 0;
while ((length = input.read(buf)) > 0) {
output.write(buf, 0, length);
}
logger.info("WorldGuard: Default configuration file written: " + defaultName);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (input != null) {
input.close();
}
} catch (IOException e) {
}
try {
if (output != null) {
output.close();
}
} catch (IOException e) {
}
}
}
}
}
/**
* Load the configuration.
*/
private void loadConfiguration() {
Configuration config = new Configuration(this.configFile);
config.load();
enforceOneSession = config.getBoolean("protection.enforce-single-session", true);
itemDurability = config.getBoolean("protection.item-durability", true);
classicWater = config.getBoolean("simulation.classic-water", false);
simulateSponge = config.getBoolean("simulation.sponge.enable", true);
spongeRadius = Math.max(1, config.getInt("simulation.sponge.radius", 3)) - 1;
redstoneSponges = config.getBoolean("simulation.sponge.redstone", false);
noPhysicsGravel = config.getBoolean("physics.no-physics-gravel", false);
noPhysicsSand = config.getBoolean("physics.no-physics-sand", false);
allowPortalAnywhere = config.getBoolean("physics.allow-portal-anywhere", false);
preventWaterDamage = new HashSet<Integer>(config.getIntList("physics.disable-water-damage-blocks", null));
blockTNT = config.getBoolean("ignition.block-tnt", false);
blockLighter = config.getBoolean("ignition.block-lighter", false);
preventLavaFire = config.getBoolean("fire.disable-lava-fire-spread", true);
disableFireSpread = config.getBoolean("fire.disable-all-fire-spread", false);
disableFireSpreadBlocks = new HashSet<Integer>(config.getIntList("fire.disable-fire-spread-blocks", null));
allowedLavaSpreadOver = new HashSet<Integer>(config.getIntList("fire.lava-spread-blocks", null));
blockCreeperExplosions = config.getBoolean("mobs.block-creeper-explosions", false);
blockCreeperBlockDamage = config.getBoolean("mobs.block-creeper-block-damage", false);
loginProtection = config.getInt("spawn.login-protection", 3);
spawnProtection = config.getInt("spawn.spawn-protection", 0);
kickOnDeath = config.getBoolean("spawn.kick-on-death", false);
exactRespawn = config.getBoolean("spawn.exact-respawn", false);
teleportToHome = config.getBoolean("spawn.teleport-to-home-on-death", false);
disableFallDamage = config.getBoolean("player-damage.disable-fall-damage", false);
disableLavaDamage = config.getBoolean("player-damage.disable-lava-damage", false);
disableFireDamage = config.getBoolean("player-damage.disable-fire-damage", false);
disableDrowningDamage = config.getBoolean("player-damage.disable-drowning-damage", false);
disableSuffocationDamage = config.getBoolean("player-damage.disable-suffocation-damage", false);
disableContactDamage = config.getBoolean("player-damage.disable-contact-damage", false);
teleportOnSuffocation = config.getBoolean("player-damage.teleport-on-suffocation", false);
useRegions = config.getBoolean("regions.enable", true);
regionWand = config.getInt("regions.wand", 287);
for (String creature : config.getStringList("mobs.block-creature-spawn", null)) {
blockCreatureSpawn += creature.toLowerCase() + " ";
}
GlobalFlags globalFlags = new GlobalFlags();
globalFlags.canBuild = config.getBoolean("regions.default.build", true);
globalFlags.canAccessChests = config.getBoolean("regions.default.chest-access", false);
globalFlags.canPvP = config.getBoolean("regions.default.pvp", true);
globalFlags.canLighter = config.getBoolean("regions.default.lighter", true);
globalFlags.canTnt = config.getBoolean("regions.default.tnt", true);
globalFlags.allowCreeper = config.getBoolean("regions.default.creeper", true);
globalFlags.allowMobDamage = config.getBoolean("regions.default.mobdamage", true);
wp.getGlobalRegionManager().setGlobalFlags(worldName, globalFlags);
// Console log configuration
boolean logConsole = config.getBoolean("blacklist.logging.console.enable", true);
// Database log configuration
boolean logDatabase = config.getBoolean("blacklist.logging.database.enable", false);
String dsn = config.getString("blacklist.logging.database.dsn", "jdbc:mysql://localhost:3306/minecraft");
String user = config.getString("blacklist.logging.database.user", "root");
String pass = config.getString("blacklist.logging.database.pass", "");
String table = config.getString("blacklist.logging.database.table", "blacklist_events");
// File log configuration
boolean logFile = config.getBoolean("blacklist.logging.file.enable", false);
String logFilePattern = config.getString("blacklist.logging.file.path", "worldguard/logs/%Y-%m-%d.log");
int logFileCacheSize = Math.max(1, config.getInt("blacklist.logging.file.open-files", 10));
// Load the blacklist
try {
// If there was an existing blacklist, close loggers
if (blacklist != null) {
blacklist.getLogger().close();
}
// First load the blacklist data from worldguard-blacklist.txt
Blacklist blist = new BukkitBlacklist(wp);
blist.load(blacklistFile);
// If the blacklist is empty, then set the field to null
// and save some resources
if (blist.isEmpty()) {
this.blacklist = null;
} else {
this.blacklist = blist;
logger.log(Level.INFO, "WorldGuard: Blacklist loaded.");
BlacklistLogger blacklistLogger = blist.getLogger();
if (logDatabase) {
blacklistLogger.addHandler(new DatabaseLoggerHandler(dsn, user, pass, table, worldName));
}
if (logConsole) {
blacklistLogger.addHandler(new ConsoleLoggerHandler(worldName));
}
if (logFile) {
FileLoggerHandler handler =
new FileLoggerHandler(logFilePattern, logFileCacheSize, worldName);
blacklistLogger.addHandler(handler);
}
}
} catch (FileNotFoundException e) {
logger.log(Level.WARNING, "WorldGuard blacklist does not exist.");
} catch (IOException e) {
logger.log(Level.WARNING, "Could not load WorldGuard blacklist: "
+ e.getMessage());
}
// Print an overview of settings
if (config.getBoolean("summary-on-start", true)) {
logger.log(Level.INFO, "=============== WorldGuard configuration for world " + worldName + " ===============");
logger.log(Level.INFO, enforceOneSession ? "WorldGuard: Single session is enforced."
: "WorldGuard: Single session is NOT ENFORCED.");
logger.log(Level.INFO, blockTNT ? "WorldGuard: TNT ignition is blocked."
: "WorldGuard: TNT ignition is PERMITTED.");
logger.log(Level.INFO, blockLighter ? "WorldGuard: Lighters are blocked."
: "WorldGuard: Lighters are PERMITTED.");
logger.log(Level.INFO, preventLavaFire ? "WorldGuard: Lava fire is blocked."
: "WorldGuard: Lava fire is PERMITTED.");
if (disableFireSpread) {
logger.log(Level.INFO, "WorldGuard: All fire spread is disabled.");
} else {
if (disableFireSpreadBlocks.size() > 0) {
logger.log(Level.INFO, "WorldGuard: Fire spread is limited to "
+ disableFireSpreadBlocks.size() + " block types.");
} else {
logger.log(Level.INFO, "WorldGuard: Fire spread is UNRESTRICTED.");
}
}
}
}
public Blacklist getBlacklist()
{
return this.blacklist;
}
public String getWorldName()
{
return this.worldName;
}
}

View File

@ -20,10 +20,13 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.ChatColor;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
*
@ -31,20 +34,38 @@ import org.bukkit.command.CommandSender;
*/
public class CommandAllowFire extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException
{
ch.checkPermission(sender, "/stopfire");
ch.checkArgs(args, 0, 0);
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (wg.fireSpreadDisableToggle) {
wg.getServer().broadcastMessage(ChatColor.YELLOW
+ "Fire spread has been globally re-enabled by " + senderName + ".");
} else {
sender.sendMessage(ChatColor.YELLOW + "Fire spread was already globally enabled.");
}
cfg.checkPermission(sender, "allowfire");
wg.fireSpreadDisableToggle = false;
String worldName;
if (sender instanceof Player) {
CommandHandler.checkArgs(args, 0, 0);
worldName = ((Player)sender).getWorld().getName();
} else {
CommandHandler.checkArgs(args, 1, 1);
worldName = args[0];
}
Server server = cfg.getWorldGuardPlugin().getServer();
if(server.getWorld(worldName) == null)
{
sender.sendMessage("Invalid world specified.");
return true;
}
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(worldName);
if (wcfg.fireSpreadDisableToggle) {
server.broadcastMessage(ChatColor.YELLOW
+ "Fire spread has been globally re-enabled by " + senderName + ".");
} else {
sender.sendMessage(ChatColor.YELLOW + "Fire spread was already globally enabled.");
}
wcfg.fireSpreadDisableToggle = false;
return true;
}
}

View File

@ -19,7 +19,7 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@ -32,46 +32,37 @@ import static com.sk89q.worldguard.bukkit.BukkitUtil.*;
*/
public class CommandGod extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkPermission(player, "/god");
ch.checkArgs(args, 0, 1);
CommandHandler.checkArgs(args, 0, 1);
// Allow setting other people invincible
if (args.length > 0) {
if (!wg.hasPermission(player, "/godother")) {
player.sendMessage(ChatColor.RED + "You don't have permission to make others invincible.");
return true;
}
cfg.checkPermission(sender, "god.other");
Player other = matchSinglePlayer(wg.getServer(), args[0]);
Player other = matchSinglePlayer(cfg.getWorldGuardPlugin().getServer(), args[0]);
if (other == null) {
player.sendMessage(ChatColor.RED + "Player not found.");
sender.sendMessage(ChatColor.RED + "Player not found.");
} else {
if (!wg.invinciblePlayers.contains(other.getName())) {
wg.invinciblePlayers.add(other.getName());
player.sendMessage(ChatColor.YELLOW + other.getName() + " is now invincible!");
other.sendMessage(ChatColor.YELLOW + player.getName() + " has made you invincible!");
if (!cfg.isInvinciblePlayer(other.getName())) {
cfg.addInvinciblePlayer(other.getName());
sender.sendMessage(ChatColor.YELLOW + other.getName() + " is now invincible!");
other.sendMessage(ChatColor.YELLOW + senderName + " has made you invincible!");
} else {
wg.invinciblePlayers.remove(other.getName());
player.sendMessage(ChatColor.YELLOW + other.getName() + " is no longer invincible.");
other.sendMessage(ChatColor.YELLOW + player.getName() + " has taken away your invincibility.");
cfg.removeInvinciblePlayer(other.getName());
sender.sendMessage(ChatColor.YELLOW + other.getName() + " is no longer invincible.");
other.sendMessage(ChatColor.YELLOW + senderName + " has taken away your invincibility.");
}
}
// Invincibility for one's self
} else {
if (!wg.invinciblePlayers.contains(player.getName())) {
wg.invinciblePlayers.add(player.getName());
} else if(sender instanceof Player) {
cfg.checkPermission(sender, "god.self");
Player player = (Player)sender;
if (!cfg.isInvinciblePlayer(player.getName())) {
cfg.addInvinciblePlayer(player.getName());
player.sendMessage(ChatColor.YELLOW + "You are now invincible!");
} else {
wg.invinciblePlayers.remove(player.getName());
cfg.removeInvinciblePlayer(player.getName());
player.sendMessage(ChatColor.YELLOW + "You are no longer invincible.");
}
}

View File

@ -21,11 +21,8 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.domains.DefaultDomain;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -40,7 +37,6 @@ public class CommandHandler {
private WorldGuardPlugin wg;
private Map<String, WgCommand> commandMap;
private static Pattern groupPattern = Pattern.compile("^[gG]:(.+)$");
public static int CMD_LIST_SIZE = 9;
public CommandHandler(WorldGuardPlugin wg)
@ -48,17 +44,18 @@ public class CommandHandler {
this.wg = wg;
this.commandMap = new HashMap<String, WgCommand>();
// commands that DO support console as sender
this.commandMap.put("allowfire", new CommandAllowFire());
this.commandMap.put("god", new CommandGod());
this.commandMap.put("heal", new CommandHeal());
this.commandMap.put("locate", new CommandLocate());
this.commandMap.put("region", new RegionCommandHandler());
this.commandMap.put("reloadwg", new CommandReloadWG());
this.commandMap.put("slay", new CommandSlay());
this.commandMap.put("stack", new CommandStack());
this.commandMap.put("stopfire", new CommandStopFire());
this.commandMap.put("tpregrion", new CommandTpRegion());
this.commandMap.put("buyregion", new CommandBuyRegion());
// commands that DO NOT support console as sender
this.commandMap.put("stack", new CommandStack());
this.commandMap.put("locate", new CommandLocate());
}
@ -74,7 +71,7 @@ public class CommandHandler {
String senderName = sender instanceof Player ? ((Player)sender).getName() : "Console";
wgcmd.handle(sender, senderName, cmdName, args, this, wg);
wgcmd.handle(sender, senderName, cmdName, args, wg.getWgConfiguration());
return true;
} catch (InsufficientArgumentsException e) {
@ -168,113 +165,6 @@ public class CommandHandler {
}
}
/**
* Checks for the command or /region.
*
* @param player
* @param cmd
* @return
*/
public boolean canUseRegionCommand(Player player, String cmd) {
return wg.hasPermission(player, "/region")
|| wg.hasPermission(player, cmd);
}
/**
* Checks to see if there are sufficient permissions, otherwise an exception
* is raised in that case.
*
* @param player
* @param permission
* @throws InsufficientPermissionsException
*/
public void checkRegionPermission(Player player, String permission)
throws InsufficientPermissionsException {
if (!wg.hasPermission(player, "/region") && !wg.hasPermission(player, permission)) {
throw new InsufficientPermissionsException();
}
}
/**
* Checks to see if there are sufficient permissions, otherwise an exception
* is raised in that case.
*
* @param sender
* @param permission
* @throws InsufficientPermissionsException
*/
public void checkPermission(CommandSender sender, String permission)
throws InsufficientPermissionsException {
if (!(sender instanceof Player)) {
return;
}
if (!wg.hasPermission((Player)sender, permission)) {
throw new InsufficientPermissionsException();
}
}
/**
* Parse a group/player DefaultDomain specification for areas.
*
* @param domain
* @param split
* @param startIndex
*/
public static void addToDomain(DefaultDomain domain,
String[] split, int startIndex) {
for (int i = startIndex; i < split.length; i++) {
String s = split[i];
Matcher m = groupPattern.matcher(s);
if (m.matches()) {
domain.addGroup(m.group(1));
} else {
domain.addPlayer(s);
}
}
}
/**
* Parse a group/player DefaultDomain specification for areas.
*
* @param domain
* @param split
* @param startIndex
*/
public static void removeFromDomain(DefaultDomain domain,
String[] split, int startIndex) {
for (int i = startIndex; i < split.length; i++) {
String s = split[i];
Matcher m = groupPattern.matcher(s);
if (m.matches()) {
domain.removeGroup(m.group(1));
} else {
domain.removePlayer(s);
}
}
}
/**
* Parse a group/player DefaultDomain specification for areas.
*
* @param split
* @param startIndex
* @return
*/
public static DefaultDomain parseDomainString(String[] split, int startIndex) {
DefaultDomain domain = new DefaultDomain();
for (int i = startIndex; i < split.length; i++) {
String s = split[i];
Matcher m = groupPattern.matcher(s);
if (m.matches()) {
domain.addGroup(m.group(1));
} else {
domain.addPlayer(s);
}
}
return domain;
}
}

View File

@ -19,7 +19,7 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@ -32,32 +32,25 @@ import static com.sk89q.worldguard.bukkit.BukkitUtil.*;
*/
public class CommandHeal extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkPermission(player, "/heal");
ch.checkArgs(args, 0, 1);
CommandHandler.checkArgs(args, 0, 1);
// Allow healing other people
if (args.length > 0) {
if (!wg.hasPermission(player, "/healother")) {
player.sendMessage(ChatColor.RED + "You don't have permission to heal others.");
return true;
}
cfg.checkPermission(sender, "heal.other");
Player other = matchSinglePlayer(wg.getServer(), args[0]);
Player other = matchSinglePlayer(cfg.getWorldGuardPlugin().getServer(), args[0]);
if (other == null) {
player.sendMessage(ChatColor.RED + "Player not found.");
sender.sendMessage(ChatColor.RED + "Player not found.");
} else {
other.setHealth(20);
player.sendMessage(ChatColor.YELLOW + other.getName() + " has been healed!");
other.sendMessage(ChatColor.YELLOW + player.getName() + " has healed you!");
sender.sendMessage(ChatColor.YELLOW + other.getName() + " has been healed!");
other.sendMessage(ChatColor.YELLOW + senderName + " has healed you!");
}
} else {
} else if (sender instanceof Player){
cfg.checkPermission(sender, "heal.self");
Player player = (Player)sender;
player.setHealth(20);
player.sendMessage(ChatColor.YELLOW + "You have been healed!");
}

View File

@ -20,7 +20,7 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.BukkitUtil;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.ChatColor;
import org.bukkit.Location;
@ -33,19 +33,20 @@ import org.bukkit.entity.Player;
*/
public class CommandLocate extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkPermission(player, "/locate");
ch.checkArgs(args, 0, 3);
cfg.checkPermission(player, "locate");
CommandHandler.checkArgs(args, 0, 3);
if (args.length == 1) {
String name = args[0];
Player target = BukkitUtil.matchSinglePlayer(wg.getServer(), name);
Player target = BukkitUtil.matchSinglePlayer(cfg.getWorldGuardPlugin().getServer(), name);
if (target != null) {
player.setCompassTarget(target.getLocation());
player.sendMessage(ChatColor.YELLOW + "Compass target set to " + target.getName() + ".");

View File

@ -15,12 +15,12 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@ -33,59 +33,70 @@ import org.bukkit.entity.Player;
*
* @author Michael
*/
public class CommandRegionAddMember extends WgCommand {
public class CommandRegionAddMember extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
boolean cmdIsOwner = command.equalsIgnoreCase("addowner");
String permOwn;
String permAll;
if (cmdIsOwner) {
CommandHandler.checkArgs(args, 2, -1, "/region addowner <id> [player1 [group1 [players/groups...]]]");
permOwn = "region.addowner.own";
permAll = "region.addowner.all";
} else {
CommandHandler.checkArgs(args, 2, -1, "/region addmember <id> [player1 [group1 [players/groups...]]]");
permOwn = "region.addmember.own";
permAll = "region.addmember.all";
}
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
String id = args[0].toLowerCase();
if (!mgr.hasRegion(id)) {
sender.sendMessage(ChatColor.RED + "A region with ID '"
+ id + "' doesn't exist.");
return true;
}
Player player = (Player) sender;
if (!wg.hasPermission(player, "/regionclaim") && !wg.hasPermission(player, "/regionmembership")) {
ch.checkRegionPermission(player, "/regiondefine");
ProtectedRegion existing = mgr.getRegion(id);
if (sender instanceof Player) {
Player player = (Player) sender;
if (existing.isOwner(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, permOwn);
}
ch.checkArgs(args, 2, -1, "/region add[member|owner] <id> [player1 [group1 [players/groups...]]]");
String action = command;
boolean isOwner = action.equalsIgnoreCase("addowner");
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
String id = args[0].toLowerCase();
if (!mgr.hasRegion(id)) {
player.sendMessage(ChatColor.RED + "A region with ID '"
+ id + "' doesn't exist.");
return true;
else {
cfg.checkRegionPermission(sender, permAll);
}
ProtectedRegion existing = mgr.getRegion(id);
if (!ch.canUseRegionCommand(player, "/regiondefine")
&& !existing.isOwner(wg.wrapPlayer(player))) {
player.sendMessage(ChatColor.RED + "You don't own this region.");
return true;
}
if (isOwner) {
ch.addToDomain(existing.getOwners(), args, 1);
} else {
ch.addToDomain(existing.getMembers(), args, 1);
}
try {
mgr.save();
player.sendMessage(ChatColor.YELLOW + "Region updated!");
player.sendMessage(ChatColor.GRAY + "Current owners: "
+ existing.getOwners().toUserFriendlyString());
player.sendMessage(ChatColor.GRAY + "Current members: "
+ existing.getMembers().toUserFriendlyString());
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}
return true;
}
else
{
cfg.checkRegionPermission(sender, permAll);
}
if (cmdIsOwner) {
WorldGuardConfiguration.addToDomain(existing.getOwners(), args, 1);
} else {
WorldGuardConfiguration.addToDomain(existing.getMembers(), args, 1);
}
try {
mgr.save();
sender.sendMessage(ChatColor.YELLOW + "Region updated!");
sender.sendMessage(ChatColor.GRAY + "Current owners: "
+ existing.getOwners().toUserFriendlyString());
sender.sendMessage(ChatColor.GRAY + "Current members: "
+ existing.getMembers().toUserFriendlyString());
} catch (IOException e) {
sender.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}
return true;
}
}

View File

@ -26,7 +26,9 @@ import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.regions.Polygonal2DRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
@ -35,8 +37,6 @@ import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.nijikokun.bukkit.iConomy.Account;
import com.nijikokun.bukkit.iConomy.iConomy;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -46,9 +46,9 @@ import org.bukkit.plugin.Plugin;
*
* @author Michael
*/
public class CommandRegionClaim extends WgCommand {
public class CommandRegionClaim extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
@ -56,23 +56,23 @@ public class CommandRegionClaim extends WgCommand {
}
Player player = (Player) sender;
Plugin wePlugin = wg.getServer().getPluginManager().getPlugin("WorldEdit");
Plugin wePlugin = cfg.getWorldGuardPlugin().getServer().getPluginManager().getPlugin("WorldEdit");
if (wePlugin == null) {
player.sendMessage(ChatColor.RED + "WorldEdit must be installed and enabled!");
return true;
}
ch.checkRegionPermission(player, "/regionclaim");
ch.checkArgs(args, 1, 1, "/region claim <id>");
cfg.checkRegionPermission(player, "region.claim");
CommandHandler.checkArgs(args, 1, 1, "/region claim <id>");
try {
String id = args[0].toLowerCase();
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(player.getWorld().getName());
ProtectedRegion existing = mgr.getRegion(id);
if (existing != null) {
if (!existing.getOwners().contains(wg.wrapPlayer(player))) {
if (!existing.getOwners().contains(BukkitPlayer.wrapPlayer(cfg, player))) {
player.sendMessage(ChatColor.RED + "You don't own this region.");
return true;
}
@ -99,7 +99,7 @@ public class CommandRegionClaim extends WgCommand {
region = new ProtectedCuboidRegion(id, min, max);
}
if (mgr.overlapsUnownedRegion(region, wg.wrapPlayer(player))) {
if (mgr.overlapsUnownedRegion(region, BukkitPlayer.wrapPlayer(cfg, player))) {
player.sendMessage(ChatColor.RED + "This region overlaps with someone else's region.");
return true;
}

View File

@ -26,7 +26,8 @@ import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.regions.Polygonal2DRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
@ -43,23 +44,23 @@ import org.bukkit.plugin.Plugin;
*
* @author Michael
*/
public class CommandRegionDefine extends WgCommand {
public class CommandRegionDefine extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
Plugin wePlugin = wg.getServer().getPluginManager().getPlugin("WorldEdit");
Plugin wePlugin = cfg.getWorldGuardPlugin().getServer().getPluginManager().getPlugin("WorldEdit");
if (wePlugin == null) {
player.sendMessage(ChatColor.RED + "WorldEdit must be installed and enabled!");
sender.sendMessage(ChatColor.RED + "WorldEdit must be installed and enabled!");
return true;
}
ch.checkRegionPermission(player, "/regiondefine");
ch.checkArgs(args, 1, -1, "/region define <id> [owner1 [owner2 [owners...]]]");
cfg.checkRegionPermission(sender, "region.define");
CommandHandler.checkArgs(args, 1, -1, "/region define <id> [owner1 [owner2 [owners...]]]");
try {
String id = args[0].toLowerCase();
@ -84,16 +85,16 @@ public class CommandRegionDefine extends WgCommand {
}
if (args.length >= 2) {
region.setOwners(ch.parseDomainString(args, 1));
region.setOwners(WorldGuardConfiguration.parseDomainString(args, 1));
}
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(w.getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(w.getName());
mgr.addRegion(region);
mgr.save();
player.sendMessage(ChatColor.YELLOW + "Region saved as " + id + ".");
sender.sendMessage(ChatColor.YELLOW + "Region saved as " + id + ".");
} catch (IncompleteRegionException e) {
player.sendMessage(ChatColor.RED + "You must first define an area in WorldEdit.");
sender.sendMessage(ChatColor.RED + "You must first define an area in WorldEdit.");
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
sender.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}

View File

@ -15,11 +15,12 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@ -32,45 +33,41 @@ import org.bukkit.entity.Player;
*
* @author Michael
*/
public class CommandRegionDelete extends WgCommand {
public class CommandRegionDelete extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
if (!wg.hasPermission(player, "/regionclaim")) {
ch.checkRegionPermission(player, "/regiondelete");
}
ch.checkArgs(args, 0, 1, "/region delete <id>");
CommandHandler.checkArgs(args, 0, 1, "/region delete <id>");
try {
String id = args[0].toLowerCase();
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
if (!mgr.hasRegion(id)) {
player.sendMessage(ChatColor.RED + "A region with ID '"
sender.sendMessage(ChatColor.RED + "A region with ID '"
+ id + "' doesn't exist.");
return true;
}
ProtectedRegion existing = mgr.getRegion(id);
if (!ch.canUseRegionCommand(player, "/regiondelete")
&& !existing.isOwner(wg.wrapPlayer(player))) {
player.sendMessage(ChatColor.RED + "You don't own this region.");
return true;
if (sender instanceof Player) {
Player player = (Player) sender;
if (existing.isOwner(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, "region.delete.own");
} else {
cfg.checkRegionPermission(sender, "region.delete.all");
}
} else {
cfg.checkRegionPermission(sender, "region.delete.all");
}
mgr.removeRegion(id);
mgr.save();
player.sendMessage(ChatColor.YELLOW + "Region removed!");
sender.sendMessage(ChatColor.YELLOW + "Region removed!");
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
sender.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}

View File

@ -18,8 +18,11 @@
*/
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.BukkitUtil;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.AreaFlags;
@ -34,17 +37,12 @@ import org.bukkit.entity.Player;
*
* @author Michael
*/
public class CommandRegionFlag extends WgCommand {
public class CommandRegionFlag extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
// to-do only allow owners to change flags
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkRegionPermission(player, "/regiondefine");
ch.checkArgs(args, 3, 4, "/region flag <regionid> <name> (<subname>) <value>");
CommandHandler.checkArgs(args, 3, 4, "/region flag <regionid> <name> (<subname>) <value>");
try {
String id = args[0].toLowerCase();
@ -58,34 +56,57 @@ public class CommandRegionFlag extends WgCommand {
valueStr = args[3];
}
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
ProtectedRegion region = mgr.getRegion(id);
if (region == null) {
player.sendMessage(ChatColor.RED + "Could not find a region by that ID.");
sender.sendMessage(ChatColor.RED + "Could not find a region by that ID.");
return true;
}
if (sender instanceof Player) {
Player player = (Player) sender;
if (region.isOwner(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, "region.flag.ownregions");
}
else if(region.isMember(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, "region.flag.memberregions");
}
else {
cfg.checkRegionPermission(sender, "region.flag.foreignregions");
}
}
else
{
cfg.checkRegionPermission(sender, "region.flag.foreignregions");
}
FlagInfo nfo = FlagInfo.getFlagInfo(nameStr, subnameStr);
if (nfo == null) {
if(!(sender instanceof Player))
{
sender.sendMessage(ChatColor.RED + "Unknown flag, or not supported in console mode.");
return true;
}
Player player = (Player)sender;
if(nameStr.equals("spawn"))
{
if (valueStr.equals("set")) {
player.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag spawn set to current location");
sender.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag spawn set to current location");
AreaFlags flags = region.getFlags();
Location l = player.getLocation();
if(region.contains(BukkitUtil.toVector(l))){
flags.setFlag("spawn", "x", l.getX());
flags.setFlag("spawn", "y", l.getY());
flags.setFlag("spawn", "z", l.getZ());
flags.setFlag("spawn", "yaw", l.getYaw());
flags.setFlag("spawn", "pitch", l.getPitch());
flags.setFlag("spawn", "world", l.getWorld().getName());
}else{
player.sendMessage(ChatColor.RED + "You must set the spawn location inside the region it belongs to.");
}
} else if (nameStr.equals("delete")){
flags.setFlag("spawn", "x", l.getX());
flags.setFlag("spawn", "y", l.getY());
flags.setFlag("spawn", "z", l.getZ());
flags.setFlag("spawn", "yaw", l.getYaw());
flags.setFlag("spawn", "pitch", l.getPitch());
flags.setFlag("spawn", "world", l.getWorld().getName());
} else {
AreaFlags flags = region.getFlags();
flags.setFlag("spawn", "x", (String)null);
flags.setFlag("spawn", "y", (String)null);
@ -93,37 +114,13 @@ public class CommandRegionFlag extends WgCommand {
flags.setFlag("spawn", "yaw", (String)null);
flags.setFlag("spawn", "pitch", (String)null);
flags.setFlag("spawn", "world", (String)null);
player.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag spawn removed.");
sender.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag spawn removed.");
}else{
player.sendMessage(ChatColor.RED + "Usage: /region flag <regionid> spawn <set|delete>");
}
}else if(nameStr.equals("teleport"))
{
if (valueStr.equals("set")){
player.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag teleport set to current location");
AreaFlags flags = region.getFlags();
Location l = player.getLocation();
if(region.contains(BukkitUtil.toVector(l))){
flags.setFlag("teleport", "x", l.getX());
flags.setFlag("teleport", "y", l.getY());
flags.setFlag("teleport", "z", l.getZ());
flags.setFlag("teleport", "world", l.getWorld().getName());
}else{
player.sendMessage(ChatColor.RED + "You must set the teleport location inside the region it belongs to.");
}
}else if (valueStr.equals("delete")){
AreaFlags flags = region.getFlags();
flags.setFlag("teleport", "x", (String)null);
flags.setFlag("teleport", "y", (String)null);
flags.setFlag("teleport", "z", (String)null);
flags.setFlag("teleport", "world", (String)null);
player.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag teleport removed.");
}else{
player.sendMessage(ChatColor.RED + "Usage: /region flag <regionid> teleport <set|delete>");
}
} else
{
player.sendMessage(ChatColor.RED + "Unknown flag specified.");
sender.sendMessage(ChatColor.RED + "Unknown flag specified.");
}
return true;
}
@ -197,16 +194,16 @@ public class CommandRegionFlag extends WgCommand {
}
if (!validValue) {
player.sendMessage(ChatColor.RED + "Invalid value '" + valueStr + "' for flag " + fullFlagname);
sender.sendMessage(ChatColor.RED + "Invalid value '" + valueStr + "' for flag " + fullFlagname);
return true;
}
region.getFlags().setFlag(nfo.flagName, nfo.flagSubName, valueStr);
mgr.save();
player.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag " + fullFlagname + " set to " + valueStr);
sender.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated. Flag " + fullFlagname + " set to " + valueStr);
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
sender.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}

View File

@ -19,14 +19,14 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.AreaFlags;
import com.sk89q.worldguard.protection.regions.AreaFlags.State;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -35,36 +35,47 @@ import org.bukkit.entity.Player;
*
* @author Michael
*/
public class CommandRegionInfo extends WgCommand {
public class CommandRegionInfo extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
CommandHandler.checkArgs(args, 1, 1, "/region info <id>");
ch.checkRegionPermission(player, "/regioninfo");
ch.checkArgs(args, 1, 1, "/region info <id>");
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
String id = args[0].toLowerCase();
if (!mgr.hasRegion(id)) {
player.sendMessage(ChatColor.RED + "A region with ID '"
sender.sendMessage(ChatColor.RED + "A region with ID '"
+ id + "' doesn't exist.");
return true;
}
ProtectedRegion region = mgr.getRegion(id);
if (sender instanceof Player) {
Player player = (Player) sender;
if (region.isOwner(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, "region.info.ownregions");
}
else if(region.isMember(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, "region.info.memberregions");
}
else {
cfg.checkRegionPermission(sender, "region.info.foreignregions");
}
}
else
{
cfg.checkRegionPermission(sender, "region.info.foreignregions");
}
AreaFlags flags = region.getFlags();
DefaultDomain owners = region.getOwners();
DefaultDomain members = region.getMembers();
player.sendMessage(ChatColor.YELLOW + "Region: " + id
sender.sendMessage(ChatColor.YELLOW + "Region: " + id
+ ChatColor.GRAY + " (type: " + region.getTypeName() + ")");
player.sendMessage(ChatColor.BLUE + "Priority: " + region.getPriority());
sender.sendMessage(ChatColor.BLUE + "Priority: " + region.getPriority());
StringBuilder s = new StringBuilder();
for (FlagInfo nfo : FlagInfo.getFlagInfoList()) {
@ -89,12 +100,12 @@ public class CommandRegionInfo extends WgCommand {
s.append("spawn: not set");
}
player.sendMessage(ChatColor.BLUE + "Flags: " + s.toString());
player.sendMessage(ChatColor.BLUE + "Parent: "
sender.sendMessage(ChatColor.BLUE + "Flags: " + s.toString());
sender.sendMessage(ChatColor.BLUE + "Parent: "
+ (region.getParent() == null ? "(none)" : region.getParent().getId()));
player.sendMessage(ChatColor.LIGHT_PURPLE + "Owners: "
sender.sendMessage(ChatColor.LIGHT_PURPLE + "Owners: "
+ owners.toUserFriendlyString());
player.sendMessage(ChatColor.LIGHT_PURPLE + "Members: "
sender.sendMessage(ChatColor.LIGHT_PURPLE + "Members: "
+ members.toUserFriendlyString());
return true;
}

View File

@ -19,7 +19,8 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@ -27,23 +28,17 @@ import java.util.Arrays;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
*
* @author Michael
*/
public class CommandRegionList extends WgCommand {
public class CommandRegionList extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkRegionPermission(player, "/regionlist");
ch.checkArgs(args, 0, 1, "/region list [page]");
cfg.checkRegionPermission(sender, "region.list");
CommandHandler.checkArgs(args, 0, 1, "/region list [page]");
int page = 0;
@ -55,10 +50,10 @@ public class CommandRegionList extends WgCommand {
}
}
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
Map<String, ProtectedRegion> regions = mgr.getRegions();
int size = regions.size();
int pages = (int) Math.ceil(size / (float) ch.CMD_LIST_SIZE);
int pages = (int) Math.ceil(size / (float) CommandHandler.CMD_LIST_SIZE);
String[] regionIDList = new String[size];
int index = 0;
@ -68,16 +63,15 @@ public class CommandRegionList extends WgCommand {
}
Arrays.sort(regionIDList);
player.sendMessage(ChatColor.RED + "Regions (page "
sender.sendMessage(ChatColor.RED + "Regions (page "
+ (page + 1) + " of " + pages + "):");
if (page < pages) {
for (int i = page * ch.CMD_LIST_SIZE; i < page * ch.CMD_LIST_SIZE + ch.CMD_LIST_SIZE; i++) {
for (int i = page * CommandHandler.CMD_LIST_SIZE; i < page * CommandHandler.CMD_LIST_SIZE + CommandHandler.CMD_LIST_SIZE; i++) {
if (i >= size) {
break;
}
player.sendMessage(ChatColor.YELLOW.toString() + (i + 1) + ". " + regionIDList[i]);
sender.sendMessage(ChatColor.YELLOW.toString() + (i + 1) + ". " + regionIDList[i]);
}
}

View File

@ -19,36 +19,30 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import java.io.IOException;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
*
* @author Michael
*/
public class CommandRegionLoad extends WgCommand {
public class CommandRegionLoad extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkRegionPermission(player, "/regionload");
ch.checkArgs(args, 0, 0, "/region load");
cfg.checkRegionPermission(sender, "region.load");
CommandHandler.checkArgs(args, 0, 0, "/region load");
try {
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
mgr.load();
player.sendMessage(ChatColor.YELLOW + "Region database loaded from file!");
sender.sendMessage(ChatColor.YELLOW + "Region database loaded from file!");
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to load: "
sender.sendMessage(ChatColor.RED + "Region database failed to load: "
+ e.getMessage());
}

View File

@ -19,7 +19,9 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@ -32,54 +34,66 @@ import org.bukkit.entity.Player;
*
* @author Michael
*/
public class CommandRegionRemoveMember extends WgCommand {
public class CommandRegionRemoveMember extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
boolean cmdIsOwner = command.equalsIgnoreCase("removeowner");
String permOwn;
String permAll;
if (cmdIsOwner) {
CommandHandler.checkArgs(args, 2, -1, "/region removeowner <id> [player1 [group1 [players/groups...]]]");
permOwn = "region.removeowner.own";
permAll = "region.removeowner.all";
} else {
CommandHandler.checkArgs(args, 2, -1, "/region removemember <id> [player1 [group1 [players/groups...]]]");
permOwn = "region.removemember.own";
permAll = "region.removemember.all";
}
Player player = (Player) sender;
if (!wg.hasPermission(player, "/regionclaim") && !wg.hasPermission(player, "/regionmembership")) {
ch.checkRegionPermission(player, "/regiondefine");
}
ch.checkArgs(args, 2, -1, "/region removeowner <id> [owner1 [owner2 [owners...]]]");
String action = command;
boolean isOwner = action.equalsIgnoreCase("removeowner");
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
String id = args[0].toLowerCase();
if (!mgr.hasRegion(id)) {
player.sendMessage(ChatColor.RED + "A region with ID '"
sender.sendMessage(ChatColor.RED + "A region with ID '"
+ id + "' doesn't exist.");
return true;
}
ProtectedRegion existing = mgr.getRegion(id);
if (!ch.canUseRegionCommand(player, "/regiondefine")
&& !existing.isOwner(wg.wrapPlayer(player))) {
player.sendMessage(ChatColor.RED + "You don't own this region.");
return true;
if (sender instanceof Player) {
Player player = (Player) sender;
if (existing.isOwner(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, permOwn);
}
else {
cfg.checkRegionPermission(sender, permAll);
}
}
else
{
cfg.checkRegionPermission(sender, permAll);
}
if (isOwner) {
ch.removeFromDomain(existing.getOwners(), args, 1);
if (cmdIsOwner) {
WorldGuardConfiguration.removeFromDomain(existing.getOwners(), args, 1);
} else {
ch.removeFromDomain(existing.getMembers(), args, 1);
WorldGuardConfiguration.removeFromDomain(existing.getMembers(), args, 1);
}
try {
mgr.save();
player.sendMessage(ChatColor.YELLOW + "Region updated!");
player.sendMessage(ChatColor.GRAY + "Current owners: "
sender.sendMessage(ChatColor.YELLOW + "Region updated!");
sender.sendMessage(ChatColor.GRAY + "Current owners: "
+ existing.getOwners().toUserFriendlyString());
player.sendMessage(ChatColor.GRAY + "Current members: "
sender.sendMessage(ChatColor.GRAY + "Current members: "
+ existing.getMembers().toUserFriendlyString());
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
sender.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}

View File

@ -19,36 +19,31 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import java.io.IOException;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
*
* @author Michael
*/
public class CommandRegionSave extends WgCommand {
public class CommandRegionSave extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkRegionPermission(player, "/regionsave");
ch.checkArgs(args, 0, 0, "/region save");
cfg.checkRegionPermission(sender, "region.save");
CommandHandler.checkArgs(args, 0, 0, "/region save");
try {
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
mgr.save();
player.sendMessage(ChatColor.YELLOW + "Region database saved to file!");
sender.sendMessage(ChatColor.YELLOW + "Region database saved to file!");
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
sender.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}

View File

@ -15,11 +15,12 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.protection.regionmanager.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@ -33,35 +34,33 @@ import org.bukkit.entity.Player;
*
* @author Michael
*/
public class CommandRegionSetParent extends WgCommand {
public class CommandRegionSetParent extends WgRegionCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
if (!wg.hasPermission(player, "/regionclaim")) {
ch.checkRegionPermission(player, "/regiondefine");
}
ch.checkArgs(args, 1, 2, "/region setparent <id> <parent-id>");
CommandHandler.checkArgs(args, 1, 2, "/region setparent <id> <parent-id>");
String id = args[0].toLowerCase();
String parentId = args.length > 1 ? args[1].toLowerCase() : null;
RegionManager mgr = wg.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().getRegionManager(wcfg.getWorldName());
ProtectedRegion region = mgr.getRegion(id);
if (region == null) {
player.sendMessage(ChatColor.RED + "Could not find a region with ID: " + id);
sender.sendMessage(ChatColor.RED + "Could not find a region with ID: " + id);
return true;
}
if (!ch.canUseRegionCommand(player, "/regiondefine")
&& !region.isOwner(wg.wrapPlayer(player))) {
player.sendMessage(ChatColor.RED + "You need to own the target regions");
return true;
if (sender instanceof Player) {
Player player = (Player) sender;
if (region.isOwner(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, "region.setparent.own");
} else {
cfg.checkRegionPermission(sender, "region.setparent.all");
}
} else {
cfg.checkRegionPermission(sender, "region.setparent.all");
}
ProtectedRegion parent = null;
@ -71,14 +70,20 @@ public class CommandRegionSetParent extends WgCommand {
parent = mgr.getRegion(parentId);
if (parent == null) {
player.sendMessage(ChatColor.RED + "Could not find a region with ID: " + parentId);
sender.sendMessage(ChatColor.RED + "Could not find a region with ID: " + parentId);
return true;
}
if (!ch.canUseRegionCommand(player, "/regiondefine")
&& !parent.isOwner(wg.wrapPlayer(player))) {
player.sendMessage(ChatColor.RED + "You need to own the parent region.");
return true;
if (sender instanceof Player) {
Player player = (Player) sender;
if (parent.isOwner(BukkitPlayer.wrapPlayer(cfg, player))) {
cfg.checkRegionPermission(sender, "region.setparent.own");
} else {
cfg.checkRegionPermission(sender, "region.setparent.all");
}
} else {
cfg.checkRegionPermission(sender, "region.setparent.all");
}
}
@ -86,11 +91,11 @@ public class CommandRegionSetParent extends WgCommand {
region.setParent(parent);
mgr.save();
player.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated.");
sender.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated.");
} catch (CircularInheritanceException e) {
player.sendMessage(ChatColor.RED + "Circular inheritance detected. The operation failed.");
sender.sendMessage(ChatColor.RED + "Circular inheritance detected. The operation failed.");
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
sender.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}

View File

@ -15,12 +15,11 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.LoggerToChatHandler;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -33,31 +32,33 @@ import org.bukkit.entity.Player;
*/
public class CommandReloadWG extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
cfg.checkPermission(sender, "reloadwg");
CommandHandler.checkArgs(args, 0, 0);
LoggerToChatHandler handler = null;
Logger minecraftLogger = null;
if (sender instanceof Player) {
Player player = (Player) sender;
handler = new LoggerToChatHandler(player);
handler.setLevel(Level.ALL);
minecraftLogger = Logger.getLogger("Minecraft");
minecraftLogger.addHandler(handler);
}
Player player = (Player) sender;
ch.checkPermission(player, "/reloadwg");
ch.checkArgs(args, 0, 0);
LoggerToChatHandler handler = new LoggerToChatHandler(player);
handler.setLevel(Level.ALL);
Logger minecraftLogger = Logger.getLogger("Minecraft");
minecraftLogger.addHandler(handler);
try {
wg.loadConfiguration();
wg.postReload();
player.sendMessage("WorldGuard configuration reloaded.");
cfg.onDisable();
cfg.onEnable();
sender.sendMessage("WorldGuard configuration reloaded.");
} catch (Throwable t) {
player.sendMessage("Error while reloading: "
sender.sendMessage("Error while reloading: "
+ t.getMessage());
} finally {
minecraftLogger.removeHandler(handler);
if (handler != null) {
minecraftLogger.removeHandler(handler);
}
}
return true;

View File

@ -20,7 +20,7 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.BukkitUtil;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@ -32,34 +32,26 @@ import org.bukkit.entity.Player;
*/
public class CommandSlay extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkPermission(player, "/slay");
ch.checkArgs(args, 0, 1);
CommandHandler.checkArgs(args, 0, 1);
// Allow killing other people
if (args.length > 0) {
if (!wg.hasPermission(player, "/slayother")) {
player.sendMessage(ChatColor.RED + "You don't have permission to kill others.");
return true;
}
cfg.checkPermission(sender, "slay.others");
Player other = BukkitUtil.matchSinglePlayer(wg.getServer(), args[0]);
Player other = BukkitUtil.matchSinglePlayer(cfg.getWorldGuardPlugin().getServer(), args[0]);
if (other == null) {
player.sendMessage(ChatColor.RED + "Player not found.");
sender.sendMessage(ChatColor.RED + "Player not found.");
} else {
other.setHealth(0);
player.sendMessage(ChatColor.YELLOW + other.getName() + " has been killed!");
other.sendMessage(ChatColor.YELLOW + player.getName() + " has killed you!");
sender.sendMessage(ChatColor.YELLOW + other.getName() + " has been killed!");
other.sendMessage(ChatColor.YELLOW + senderName + " has killed you!");
}
} else {
} else if (sender instanceof Player) {
cfg.checkPermission(sender, "slay.self");
Player player = (Player)sender;
player.setHealth(0);
player.sendMessage(ChatColor.YELLOW + "You have committed suicide!");
}

View File

@ -20,7 +20,7 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldedit.blocks.ItemType;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@ -33,15 +33,15 @@ import org.bukkit.inventory.ItemStack;
*/
public class CommandStack extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
return true;
}
Player player = (Player) sender;
ch.checkPermission(player, "/stack");
ch.checkArgs(args, 0, 0);
cfg.checkPermission(player, "stack");
CommandHandler.checkArgs(args, 0, 0);
ItemStack[] items = player.getInventory().getContents();
int len = items.length;

View File

@ -19,9 +19,11 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.ChatColor;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -31,25 +33,40 @@ import org.bukkit.entity.Player;
*/
public class CommandStopFire extends WgCommand {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players may use this command");
cfg.checkPermission(sender, "stopfire");
CommandHandler.checkArgs(args, 0, 0);
String worldName;
if (sender instanceof Player) {
CommandHandler.checkArgs(args, 0, 0);
worldName = ((Player)sender).getWorld().getName();
} else {
CommandHandler.checkArgs(args, 1, 1);
worldName = args[0];
}
Server server = cfg.getWorldGuardPlugin().getServer();
if(server.getWorld(worldName) == null)
{
sender.sendMessage("Invalid world specified.");
return true;
}
Player player = (Player) sender;
ch.checkPermission(sender, "/stopfire");
ch.checkArgs(args, 0, 0);
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(worldName);
if (!wg.fireSpreadDisableToggle) {
wg.getServer().broadcastMessage(ChatColor.YELLOW
if (!wcfg.fireSpreadDisableToggle) {
cfg.getWorldGuardPlugin().getServer().broadcastMessage(ChatColor.YELLOW
+ "Fire spread has been globally disabled by " + senderName + ".");
} else {
sender.sendMessage(ChatColor.YELLOW + "Fire spread was already globally disabled.");
}
wg.fireSpreadDisableToggle = true;
wcfg.fireSpreadDisableToggle = true;
return true;
}

View File

@ -15,16 +15,18 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
*
@ -32,47 +34,76 @@ import org.bukkit.command.CommandSender;
*/
public class RegionCommandHandler extends WgCommand {
private Map<String, WgCommand> commandMap;
private Map<String, WgRegionCommand> commandMap;
public RegionCommandHandler()
{
this.commandMap = new HashMap<String, WgCommand>();
public RegionCommandHandler() {
this.commandMap = new HashMap<String, WgRegionCommand>();
this.commandMap.put("addmember", new CommandRegionAddMember());
this.commandMap.put("addowner", new CommandRegionAddMember());
this.commandMap.put("claim", new CommandRegionClaim());
this.commandMap.put("define", new CommandRegionDefine());
this.commandMap.put("delete", new CommandRegionDelete());
this.commandMap.put("flag", new CommandRegionFlag());
this.commandMap.put("info", new CommandRegionInfo());
this.commandMap.put("list", new CommandRegionList());
this.commandMap.put("load", new CommandRegionLoad());
this.commandMap.put("removemember", new CommandRegionRemoveMember());
this.commandMap.put("removeowner", new CommandRegionRemoveMember());
WgRegionCommand addmember = new CommandRegionAddMember();
WgRegionCommand removemember = new CommandRegionRemoveMember();
// commands that DO support console as sender
this.commandMap.put("save", new CommandRegionSave());
this.commandMap.put("load", new CommandRegionLoad());
this.commandMap.put("list", new CommandRegionList());
this.commandMap.put("info", new CommandRegionInfo());
this.commandMap.put("flag", new CommandRegionFlag());
this.commandMap.put("removemember", removemember);
this.commandMap.put("removeowner", removemember);
this.commandMap.put("setparent", new CommandRegionSetParent());
this.commandMap.put("delete", new CommandRegionDelete());
this.commandMap.put("addmember", addmember);
this.commandMap.put("addowner", addmember);
// commands that DO NOT support console as sender
this.commandMap.put("define", new CommandRegionDefine());
this.commandMap.put("claim", new CommandRegionClaim());
}
public boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException {
public boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException {
if (!wg.useRegions) {
sender.sendMessage(ChatColor.RED + "Regions are disabled.");
String worldName;
String subCommand;
if (sender instanceof Player) {
CommandHandler.checkArgs(args, 1, -1);
worldName = ((Player) sender).getWorld().getName();
subCommand = args[0].toLowerCase();
} else {
CommandHandler.checkArgs(args, 2, -1);
worldName = args[0];
subCommand = args[1].toLowerCase();
}
Server server = cfg.getWorldGuardPlugin().getServer();
if (server.getWorld(worldName) == null) {
sender.sendMessage("Invalid world specified.");
return true;
}
ch.checkArgs(args, 1, -1);
WorldGuardWorldConfiguration wcfg = cfg.getWorldConfig(worldName);
String subCommand = args[0].toLowerCase();
if (!wcfg.useRegions) {
sender.sendMessage(ChatColor.RED + "Regions are disabled in this world.");
return true;
}
WgCommand wgcmd = commandMap.get(subCommand);
WgRegionCommand wgcmd = commandMap.get(subCommand);
if (wgcmd == null) {
return false;
}
String[] subArgs = new String[args.length - 1];
System.arraycopy(args, 1, subArgs, 0, args.length - 1);
String[] subArgs;
if (sender instanceof Player) {
subArgs = new String[args.length - 1];
System.arraycopy(args, 1, subArgs, 0, args.length - 1);
} else {
subArgs = new String[args.length - 2];
System.arraycopy(args, 2, subArgs, 0, args.length - 2);
}
wgcmd.handle(sender, senderName, subCommand, subArgs, ch, wg);
wgcmd.handle(sender, senderName, subCommand, subArgs, cfg, wcfg);
return true;
}

View File

@ -20,10 +20,8 @@
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.InsufficientArgumentsException;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.InsufficientPermissionsException;
import org.bukkit.command.CommandSender;
/**
@ -32,7 +30,6 @@ import org.bukkit.command.CommandSender;
*/
public abstract class WgCommand {
public abstract boolean handle(CommandSender sender, String senderName, String command, String[] args, CommandHandler ch, WorldGuardPlugin wg) throws CommandHandlingException;
public abstract boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg) throws CommandHandlingException;
}

View File

@ -0,0 +1,36 @@
// $Id$
/*
* WorldGuard
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldguard.bukkit.commands;
import com.sk89q.worldguard.bukkit.WorldGuardConfiguration;
import com.sk89q.worldguard.bukkit.WorldGuardWorldConfiguration;
import com.sk89q.worldguard.bukkit.commands.CommandHandler.CommandHandlingException;
import org.bukkit.command.CommandSender;
/**
*
* @author Michael
*/
public abstract class WgRegionCommand {
public abstract boolean handle(CommandSender sender, String senderName, String command, String[] args, WorldGuardConfiguration cfg, WorldGuardWorldConfiguration wcfg) throws CommandHandlingException;
}

View File

@ -37,25 +37,35 @@ public class GlobalRegionManager {
private WorldGuardPlugin wg;
private HashMap<String, RegionManager> managers;
private GlobalFlags globalFlags;
private static final Logger logger = Logger.getLogger("Minecraft.WorldGuard");
public GlobalRegionManager(WorldGuardPlugin wg) {
this.wg = wg;
this.managers = new HashMap<String, RegionManager>();
this.globalFlags = new GlobalFlags();
}
public void onEnable() {
this.managers.clear();
for (World w : wg.getServer().getWorlds()) {
loadWorld(w.getName());
}
wg.getWgConfiguration().onEnable();
}
public void onDisable()
{
wg.getWgConfiguration().onDisable();
}
private void loadWorld(String name) {
String filename = name + ".regions.json";
try {
managers.put(name, new FlatRegionManager(globalFlags, new JSONDatabase(new File(wg.getDataFolder(), filename))));
managers.put(name, new FlatRegionManager(new GlobalFlags(), new JSONDatabase(new File(wg.getDataFolder(), filename))));
} catch (FileNotFoundException e) {
} catch (IOException e) {
logger.warning("WorldGuard: Failed to load regions from file " + filename + " : "
@ -76,12 +86,14 @@ public class GlobalRegionManager {
return ret;
}
public void setGlobalFlags(GlobalFlags globalflags) {
public void setGlobalFlags(String worldName, GlobalFlags globalflags) {
if (globalflags != null) {
this.globalFlags = globalflags;
for (Map.Entry<String, RegionManager> entry : managers.entrySet()) {
entry.getValue().setGlobalFlags(globalflags);
RegionManager ret = this.managers.get(worldName);
if (ret == null) {
ret.setGlobalFlags(globalflags);
}
}