mirror of
https://github.com/EngineHub/WorldGuard.git
synced 2024-11-27 21:15:57 +01:00
Re-added priority tree region manager implementation. Add and removal operations are not yet optimized.
This commit is contained in:
parent
43489ca087
commit
feb9ce6633
40
LICENSE.txt
40
LICENSE.txt
@ -1,3 +1,7 @@
|
|||||||
|
----------------------------------------------------------------------------
|
||||||
|
WorldGuard License
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
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
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
apply, that proxy's public statement of acceptance of any version is
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
permanent authorization for you to choose that version for the
|
permanent authorization for you to choose that version for the
|
||||||
Library.
|
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.
|
10
build.xml
10
build.xml
@ -10,7 +10,11 @@
|
|||||||
<property name="docs.dir" location="docs"/>
|
<property name="docs.dir" location="docs"/>
|
||||||
|
|
||||||
<fileset id="libs" dir="${lib.dir}">
|
<fileset id="libs" dir="${lib.dir}">
|
||||||
<include name="*.jar"/>
|
<include name="truezip.jar" />
|
||||||
|
<include name="Bukkit.jar" />
|
||||||
|
<include name="Craftbukkit.jar" />
|
||||||
|
<include name="WorldEdit.jar" />
|
||||||
|
<include name="prtree.jar" />
|
||||||
</fileset>
|
</fileset>
|
||||||
|
|
||||||
<target name="init">
|
<target name="init">
|
||||||
@ -41,7 +45,9 @@
|
|||||||
<mkdir dir="${build.dir}/defaults"/>
|
<mkdir dir="${build.dir}/defaults"/>
|
||||||
<copy tofile="${build.dir}/defaults/config.yml" file="config.yml"/>
|
<copy tofile="${build.dir}/defaults/config.yml" file="config.yml"/>
|
||||||
<copy tofile="${build.dir}/defaults/blacklist.txt" file="blacklist.txt"/>
|
<copy tofile="${build.dir}/defaults/blacklist.txt" file="blacklist.txt"/>
|
||||||
<jar jarfile="${dist.dir}/WorldGuard.jar" basedir="${build.dir}" manifest="manifest.mf"/>
|
<jar jarfile="${dist.dir}/WorldGuard.jar" basedir="${build.dir}" manifest="manifest.mf">
|
||||||
|
<zipgroupfileset dir="lib" includes="prtree.jar" />
|
||||||
|
</jar>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Create the .jar -->
|
<!-- Create the .jar -->
|
||||||
|
BIN
lib/prtree.jar
Normal file
BIN
lib/prtree.jar
Normal file
Binary file not shown.
203
src/com/sk89q/worldguard/protection/PRTreeRegionManager.java
Normal file
203
src/com/sk89q/worldguard/protection/PRTreeRegionManager.java
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
// $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.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<String,ProtectedRegion> regions;
|
||||||
|
/**
|
||||||
|
* Global flags.
|
||||||
|
*/
|
||||||
|
private GlobalFlags global;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converter to get coordinates of the tree.
|
||||||
|
*/
|
||||||
|
private MBRConverter<ProtectedRegion> converter
|
||||||
|
= new ProtectedRegionMBRConverter();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Priority R-tree.
|
||||||
|
*/
|
||||||
|
private PRTree<ProtectedRegion> tree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the manager.
|
||||||
|
*/
|
||||||
|
public PRTreeRegionManager(GlobalFlags global) {
|
||||||
|
regions = new TreeMap<String,ProtectedRegion>();
|
||||||
|
tree = new PRTree<ProtectedRegion>(converter, BRANCH_FACTOR);
|
||||||
|
this.global = global;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of protected regions.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Map<String,ProtectedRegion> getRegions() {
|
||||||
|
return regions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a list of protected regions.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void setRegions(Map<String,ProtectedRegion> regions) {
|
||||||
|
this.regions = new TreeMap<String,ProtectedRegion>(regions);
|
||||||
|
tree = new PRTree<ProtectedRegion>(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<ProtectedRegion>(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<String, ProtectedRegion> entry : regions.entrySet()) {
|
||||||
|
if (entry.getValue().getParent() == region) {
|
||||||
|
removeRegion(entry.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tree = new PRTree<ProtectedRegion>(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<String> getApplicableRegionsIDs(Vector pt) {
|
||||||
|
List<String> applicable = new ArrayList<String>();
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
// $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 org.khelekore.prtree.MBRConverter;
|
||||||
|
|
||||||
|
public class ProtectedRegionMBRConverter implements MBRConverter<ProtectedRegion> {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user