Added some priority support.

This commit is contained in:
sk89q 2011-01-17 02:31:32 -08:00
parent 80e9799579
commit 251647c7a2
7 changed files with 215 additions and 38 deletions

View File

@ -301,7 +301,7 @@ public boolean handleCommand(PlayerChatEvent event) {
} else if (split[0].equalsIgnoreCase("/rg") } else if (split[0].equalsIgnoreCase("/rg")
|| split[0].equalsIgnoreCase("/region")) { || split[0].equalsIgnoreCase("/region")) {
if (split.length < 2) { if (split.length < 2) {
player.sendMessage(ChatColor.RED + "/region <define|flag|delete|info|add|remove|list|save|load> ..."); player.sendMessage(ChatColor.RED + "/region <define|claim|flag|delete|info|add|remove|list|save|load> ...");
return true; return true;
} }
@ -455,8 +455,7 @@ private void handleRegionCommand(Player player, String action, String[] args) {
} }
if (args.length < 4) { if (args.length < 4) {
player.sendMessage(ChatColor.RED + "/region flag <id> <lighter> <none|allow|deny>"); player.sendMessage(ChatColor.RED + "/region flag <id> <flag> <none|allow|deny>");
player.sendMessage(ChatColor.RED + "Other flags not supported in Bukkit at the moment.");
return; return;
} }
@ -486,13 +485,13 @@ private void handleRegionCommand(Player player, String action, String[] args) {
AreaFlags flags = region.getFlags(); AreaFlags flags = region.getFlags();
/*if (flagStr.equalsIgnoreCase("build")) { if (flagStr.equalsIgnoreCase("build")) {
flags.allowBuild = state; flags.allowBuild = state;
} else if (flagStr.equalsIgnoreCase("pvp")) { } else if (flagStr.equalsIgnoreCase("pvp")) {
flags.allowPvP = state; flags.allowPvP = state;
} else if (flagStr.equalsIgnoreCase("tnt")) { } else if (flagStr.equalsIgnoreCase("tnt")) {
flags.allowTNT = state; flags.allowTNT = state;
} else*/ if (flagStr.equalsIgnoreCase("lighter")) { } else if (flagStr.equalsIgnoreCase("lighter")) {
flags.allowLighter = state; flags.allowLighter = state;
} else { } else {
player.sendMessage(ChatColor.RED + "Acceptable flags: build, pvp, tnt, lighter"); player.sendMessage(ChatColor.RED + "Acceptable flags: build, pvp, tnt, lighter");
@ -505,6 +504,42 @@ private void handleRegionCommand(Player player, String action, String[] args) {
player.sendMessage(ChatColor.RED + "Region database failed to save: " player.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage()); + e.getMessage());
} }
/*} else if (action.equalsIgnoreCase("priority")) {
if (!canUseRegionCommand(player, "/regiondefine")) {
player.sendMessage(ChatColor.RED + "You don't have the /regiondefine permission.");
return;
}
if (args.length < 3) {
player.sendMessage(ChatColor.RED + "/region priority <id> <priority>");
return;
}
try {
String id = args[1].toLowerCase();
int priority = 0;
try {
priority = Integer.parseInt(args[2]);
} catch (NumberFormatException e) {
player.sendMessage(ChatColor.RED + "The priority must be a number.");
return;
}
ProtectedRegion region = plugin.regionManager.getRegion(id);
if (region == null) {
player.sendMessage(ChatColor.RED + "Could not find a region by that ID.");
return;
}
region.setPriority(priority);
plugin.regionLoader.save(plugin.regionManager);
player.sendMessage(ChatColor.YELLOW + "Region '" + id + "' updated.");
} catch (IOException e) {
player.sendMessage(ChatColor.RED + "Region database failed to save: "
+ e.getMessage());
}*/
} else if (action.equalsIgnoreCase("info")) { } else if (action.equalsIgnoreCase("info")) {
if (!canUseRegionCommand(player, "/regioninfo")) { if (!canUseRegionCommand(player, "/regioninfo")) {
player.sendMessage(ChatColor.RED + "You don't have the /regioninfo permission."); player.sendMessage(ChatColor.RED + "You don't have the /regioninfo permission.");
@ -529,6 +564,7 @@ private void handleRegionCommand(Player player, String action, String[] args) {
player.sendMessage(ChatColor.YELLOW + "Region ID: " + id); player.sendMessage(ChatColor.YELLOW + "Region ID: " + id);
player.sendMessage(ChatColor.GRAY + "Type: " + region.getClass().getCanonicalName()); player.sendMessage(ChatColor.GRAY + "Type: " + region.getClass().getCanonicalName());
player.sendMessage(ChatColor.GRAY + "Priority: " + region.getPriority());
player.sendMessage(ChatColor.BLUE + "Build: " + flags.allowBuild.name()); player.sendMessage(ChatColor.BLUE + "Build: " + flags.allowBuild.name());
player.sendMessage(ChatColor.BLUE + "PvP: " + flags.allowPvP.name()); player.sendMessage(ChatColor.BLUE + "PvP: " + flags.allowPvP.name());
player.sendMessage(ChatColor.BLUE + "TNT: " + flags.allowTNT.name()); player.sendMessage(ChatColor.BLUE + "TNT: " + flags.allowTNT.name());

View File

@ -19,7 +19,7 @@
package com.sk89q.worldguard.protection; package com.sk89q.worldguard.protection;
import java.util.Map; import java.util.SortedMap;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.protection.AreaFlags.State; import com.sk89q.worldguard.protection.AreaFlags.State;
@ -31,93 +31,172 @@
*/ */
public class ApplicableRegionSet { public class ApplicableRegionSet {
private Vector pt; private Vector pt;
private Map<String,ProtectedRegion> regions; private SortedMap<String,ProtectedRegion> regions;
public ApplicableRegionSet(Vector pt, Map<String,ProtectedRegion> regions) { public ApplicableRegionSet(Vector pt, SortedMap<String,ProtectedRegion> regions) {
this.pt = pt; this.pt = pt;
this.regions = regions; this.regions = regions;
} }
public boolean canBuild(LocalPlayer player) { public boolean canBuild(LocalPlayer player) {
boolean allowed = false;
boolean found = false; boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (region.getFlags().allowBuild == State.ALLOW) continue;
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowBuild == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
if (!region.getOwners().contains(player)) {
return false;
}
found = true; found = true;
lastPriority = region.getPriority();
if (!allowed && region.getFlags().allowBuild == State.ALLOW) {
allowed = true;
}
if (!allowed && region.getOwners().contains(player)) {
allowed = true;
}
} }
return found ? allowed : true; return true;
} }
public boolean allowsPvP() { public boolean allowsPvP() {
boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowBuild == State.DENY) return false; if (region.getFlags().allowPvP == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
found = true;
lastPriority = region.getPriority();
} }
return true; return true;
} }
public boolean allowsMobDamage() { public boolean allowsMobDamage() {
boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowMobDamage == State.DENY) return false; if (region.getFlags().allowMobDamage == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
found = true;
lastPriority = region.getPriority();
} }
return true; return true;
} }
public boolean allowsCreeperExplosions() { public boolean allowsCreeperExplosions() {
boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowCreeperExplosions == State.DENY) return false; if (region.getFlags().allowCreeperExplosions == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
found = true;
lastPriority = region.getPriority();
} }
return true; return true;
} }
public boolean allowsTNT() { public boolean allowsTNT() {
boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowTNT == State.DENY) return false; if (region.getFlags().allowTNT == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
found = true;
lastPriority = region.getPriority();
} }
return true; return true;
} }
public boolean allowsLighter() { public boolean allowsLighter() {
boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowLighter == State.DENY) return false; if (region.getFlags().allowLighter == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
found = true;
lastPriority = region.getPriority();
} }
return true; return true;
} }
public boolean allowsFireSpread() { public boolean allowsFireSpread() {
boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowFireSpread == State.DENY) return false; if (region.getFlags().allowFireSpread == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
found = true;
lastPriority = region.getPriority();
} }
return true; return true;
} }
public boolean allowsLavaFire() { public boolean allowsLavaFire() {
boolean found = false;
int lastPriority = 0;
for (ProtectedRegion region : regions.values()) { for (ProtectedRegion region : regions.values()) {
if (!region.contains(pt)) continue; if (!region.contains(pt)) continue;
if (region.getFlags().allowLavaFire == State.DENY) return false; if (region.getFlags().allowLavaFire == State.DENY) return false;
// Ignore lower priority regions
if (found && region.getPriority() < lastPriority) {
break;
}
found = true;
lastPriority = region.getPriority();
} }
return true; return true;

View File

@ -28,6 +28,7 @@
import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter; import au.com.bytecode.opencsv.CSVWriter;
import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.domains.DefaultDomain; import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.AreaFlags.State; import com.sk89q.worldguard.protection.AreaFlags.State;
@ -126,14 +127,18 @@ public void load() throws IOException {
} }
String id = line[0]; String id = line[0];
BlockVector min = new BlockVector( Vector pt1 = new Vector(
Integer.parseInt(line[2]), Integer.parseInt(line[2]),
Integer.parseInt(line[3]), Integer.parseInt(line[3]),
Integer.parseInt(line[4])); Integer.parseInt(line[4]));
BlockVector max = new BlockVector( Vector pt2 = new Vector(
Integer.parseInt(line[5]), Integer.parseInt(line[5]),
Integer.parseInt(line[6]), Integer.parseInt(line[6]),
Integer.parseInt(line[7])); Integer.parseInt(line[7]));
BlockVector min = Vector.getMinimum(pt1, pt2).toBlockVector();
BlockVector max = Vector.getMaximum(pt1, pt2).toBlockVector();
int priority = Integer.parseInt(line[8]); int priority = Integer.parseInt(line[8]);
String ownersData = line[9]; String ownersData = line[9];
String flagsData = line[10]; String flagsData = line[10];
@ -146,7 +151,7 @@ public void load() throws IOException {
region.setFlags(parseFlags(flagsData)); region.setFlags(parseFlags(flagsData));
regions.put(id, region); regions.put(id, region);
} else { } else {
logger.warning("Line has invalid: " + line); logger.warning("Line is invalid: " + line);
} }
} }
} finally { } finally {

View File

@ -0,0 +1,40 @@
// $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.protection;
import java.util.Comparator;
class DescendingPriorityComparator implements Comparator<ProtectedRegion> {
/**
* Compares two regions.
*
* @param other
* @return
*/
public int compare(ProtectedRegion r1, ProtectedRegion r2) {
if (r1.getPriority() == r2.getPriority()) {
return 0;
} else if (r1.getPriority() > r2.getPriority()) {
return -1;
} else {
return 1;
}
}
}

View File

@ -22,7 +22,8 @@
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.LinkedHashMap; import java.util.SortedMap;
import java.util.TreeMap;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.LocalPlayer;
@ -37,13 +38,13 @@ public class FlatRegionManager implements RegionManager {
/** /**
* List of protected regions. * List of protected regions.
*/ */
private Map<String,ProtectedRegion> regions; private SortedMap<String,ProtectedRegion> regions;
/** /**
* Construct the manager. * Construct the manager.
*/ */
public FlatRegionManager() { public FlatRegionManager() {
regions = new LinkedHashMap<String,ProtectedRegion>(); regions = new TreeMap<String,ProtectedRegion>();
} }
/** /**
@ -54,7 +55,16 @@ public FlatRegionManager() {
public Map<String,ProtectedRegion> getRegions() { public Map<String,ProtectedRegion> getRegions() {
return regions; return regions;
} }
/**
* Set a list of protected regions.
*
* @return
*/
public void setRegions(Map<String,ProtectedRegion> regions) {
this.regions = new TreeMap<String,ProtectedRegion>(regions);
}
/** /**
* Adds a region. * Adds a region.
* *
@ -93,15 +103,6 @@ public ProtectedRegion getRegion(String id) {
return regions.get(id); return regions.get(id);
} }
/**
* Set a list of protected regions.
*
* @return
*/
public void setRegions(Map<String,ProtectedRegion> regions) {
this.regions = regions;
}
/** /**
* Get an object for a point for rules to be applied with. * Get an object for a point for rules to be applied with.
* *

View File

@ -28,7 +28,7 @@
* *
* @author sk89q * @author sk89q
*/ */
public abstract class ProtectedRegion { public abstract class ProtectedRegion implements Comparable<ProtectedRegion> {
/** /**
* Area message. * Area message.
*/ */
@ -47,7 +47,7 @@ public abstract class ProtectedRegion {
private AreaFlags flags = new AreaFlags(); private AreaFlags flags = new AreaFlags();
/** /**
* Construct a new instance of this cuboid region. * Construct a new instance of this region.
* *
* @param id * @param id
* @param priority * @param priority
@ -127,6 +127,22 @@ public AreaFlags getFlags() {
*/ */
public abstract boolean contains(Vector pt); public abstract boolean contains(Vector pt);
/**
* Compares to another region.
*
* @param other
* @return
*/
public int compareTo(ProtectedRegion other) {
if (priority == other.priority) {
return 0;
} else if (priority > other.priority) {
return -1;
} else {
return 1;
}
}
/** /**
* Checks if two region intersects. * Checks if two region intersects.
* *

View File

@ -38,7 +38,7 @@ public interface RegionManager {
* *
* @return * @return
*/ */
public Map<String,ProtectedRegion> getRegions(); public Map<String, ProtectedRegion> getRegions();
/** /**
* Set a list of protected regions. * Set a list of protected regions.