From feb9ce6633f85047ce8dd4c8a4d50b8d2e350083 Mon Sep 17 00:00:00 2001 From: sk89q Date: Sat, 12 Feb 2011 16:09:21 -0800 Subject: [PATCH] Re-added priority tree region manager implementation. Add and removal operations are not yet optimized. --- LICENSE.txt | 40 +++- build.xml | 10 +- lib/prtree.jar | Bin 0 -> 34929 bytes .../protection/PRTreeRegionManager.java | 203 ++++++++++++++++++ .../ProtectedRegionMBRConverter.java | 41 ++++ 5 files changed, 291 insertions(+), 3 deletions(-) create mode 100644 lib/prtree.jar create mode 100644 src/com/sk89q/worldguard/protection/PRTreeRegionManager.java create mode 100644 src/com/sk89q/worldguard/protection/ProtectedRegionMBRConverter.java diff --git a/LICENSE.txt b/LICENSE.txt index f0156c53..72d590f5 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,3 +1,7 @@ +---------------------------------------------------------------------------- +WorldGuard License +---------------------------------------------------------------------------- + GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 @@ -162,4 +166,38 @@ General Public License ever published by the Free Software Foundation. whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the -Library. \ No newline at end of file +Library. + +---------------------------------------------------------------------------- +PRTree License +---------------------------------------------------------------------------- + +Copyright (c) 2008-2010 Robert Olofsson. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the authors nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. \ No newline at end of file diff --git a/build.xml b/build.xml index 90a523c0..c5838bd2 100644 --- a/build.xml +++ b/build.xml @@ -10,7 +10,11 @@ - + + + + + @@ -41,7 +45,9 @@ - + + + diff --git a/lib/prtree.jar b/lib/prtree.jar new file mode 100644 index 0000000000000000000000000000000000000000..7e462416b030b2cf275a10439e41c76286ffbb00 GIT binary patch literal 34929 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

MXJOKH}O?OMx^1CmpsOW6kr9@@S) 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 hb=l^1eg^Jw&HC>J01W(587jaZCcv^1a((>u{{Y + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +package com.sk89q.worldguard.protection; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import org.khelekore.prtree.MBRConverter; +import org.khelekore.prtree.PRTree; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldguard.LocalPlayer; + +public class PRTreeRegionManager implements RegionManager { + private static final int BRANCH_FACTOR = 30; + + /** + * List of protected regions. + */ + private Map regions; + /** + * Global flags. + */ + private GlobalFlags global; + + /** + * Converter to get coordinates of the tree. + */ + private MBRConverter converter + = new ProtectedRegionMBRConverter(); + + /** + * Priority R-tree. + */ + private PRTree tree; + + /** + * Construct the manager. + */ + public PRTreeRegionManager(GlobalFlags global) { + regions = new TreeMap(); + tree = new PRTree(converter, BRANCH_FACTOR); + this.global = global; + } + + /** + * Get a list of protected regions. + * + * @return + */ + public Map getRegions() { + return regions; + } + + /** + * Set a list of protected regions. + * + * @return + */ + public void setRegions(Map regions) { + this.regions = new TreeMap(regions); + tree = new PRTree(converter, BRANCH_FACTOR); + tree.load(regions.values()); + } + + /** + * Adds a region. + * + * @param id + * @param region + */ + public void addRegion(ProtectedRegion region) { + regions.put(region.getId(), region); + tree = new PRTree(converter, BRANCH_FACTOR); + tree.load(regions.values()); + } + + /** + * Return whether a region exists by an ID. + * + * @param id + * @return + */ + public boolean hasRegion(String id) { + return regions.containsKey(id); + } + + /** + * Get a region by its ID. + * + * @param id + */ + public ProtectedRegion getRegion(String id) { + return regions.get(id); + } + + /** + * Removes a region and its children. + * + * @param id + */ + public void removeRegion(String id) { + ProtectedRegion region = regions.get(id); + + regions.remove(id); + + if (region != null) { + for (Map.Entry entry : regions.entrySet()) { + if (entry.getValue().getParent() == region) { + removeRegion(entry.getKey()); + } + } + } + + tree = new PRTree(converter, BRANCH_FACTOR); + tree.load(regions.values()); + } + + /** + * Get an object for a point for rules to be applied with. + * + * @param pt + * @return + */ + public ApplicableRegionSet getApplicableRegions(Vector pt) { + return new ApplicableRegionSet(pt, regions.values().iterator(), global); + } + + /** + * Get a list of region IDs that contain a point. + * + * @param pt + * @return + */ + public List getApplicableRegionsIDs(Vector pt) { + List applicable = new ArrayList(); + + int x = pt.getBlockX(); + int z = pt.getBlockZ(); + + for (ProtectedRegion region : tree.find(x, z, x, z)) { + if (region.contains(pt)) { + applicable.add(region.getId()); + } + } + + return applicable; + } + + /** + * Returns true if the provided region overlaps with any other region that + * is not owned by the player. + * + * @param region + * @param player + * @return + */ + public boolean overlapsUnownedRegion(ProtectedRegion region, LocalPlayer player) { + for (ProtectedRegion other : regions.values()) { + if (other.getOwners().contains(player)) { + continue; + } + + try { + if (ProtectedRegion.intersects(region, other)) { + return true; + } + } catch (UnsupportedIntersectionException e) { + // TODO: Maybe do something here + } + } + + return false; + } + + /** + * Get the number of regions. + * + * @return + */ + public int size() { + return regions.size(); + } + +} diff --git a/src/com/sk89q/worldguard/protection/ProtectedRegionMBRConverter.java b/src/com/sk89q/worldguard/protection/ProtectedRegionMBRConverter.java new file mode 100644 index 00000000..268a4904 --- /dev/null +++ b/src/com/sk89q/worldguard/protection/ProtectedRegionMBRConverter.java @@ -0,0 +1,41 @@ +// $Id$ +/* + * WorldGuard + * Copyright (C) 2010 sk89q + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +package com.sk89q.worldguard.protection; + +import org.khelekore.prtree.MBRConverter; + +public class ProtectedRegionMBRConverter implements MBRConverter { + public double getMinX(ProtectedRegion t) { + return t.getMinimumPoint().getBlockX(); + } + + public double getMinY(ProtectedRegion t) { + return t.getMinimumPoint().getBlockZ(); + } + + public double getMaxX(ProtectedRegion t) { + return t.getMaximumPoint().getBlockX(); + } + + public double getMaxY(ProtectedRegion t) { + return t.getMaximumPoint().getBlockZ(); + } + +}