首页 > 解决方案 > 检查指定半径处是否存在不同的区域

问题描述

我根据世界守卫地区创建情节。我正在寻找一种检查每个方向 50 个计数半径内是否没有其他区域的好方法。我的观点是,没有人创造一个情节和别人的情节。目前,我以一种奇怪的方式检查了它,但它实际上有效。

    Location p3 = p.getLocation();
    p3.setX(p3.getBlockX());
    p3.setY(60);
    p3.setZ(p3.getBlockZ()+size);
    if(region.getApplicableRegions(p3).size() == 0) {
        plotsCheck.put(p.getUniqueId(), plotsCheck.get(p.getUniqueId())+1);
    }

    Location p3a = p.getLocation();
    p3a.setX(p3a.getBlockX());
    p3a.setY(60);
    p3a.setZ(p3a.getBlockZ()+10);
    if(region.getApplicableRegions(p3a).size() == 0) {
        plotsCheck.put(p.getUniqueId(), plotsCheck.get(p.getUniqueId())+1);
    }

    Location p4 = p.getLocation();
    p4.setX(p4.getBlockX());
    p4.setY(60);
    p4.setZ(p4.getBlockZ()-size);
    if(region.getApplicableRegions(p4).size() == 0) {
        plotsCheck.put(p.getUniqueId(), plotsCheck.get(p.getUniqueId())+1);
    }

这样,我检查了它是否为空。如果是这样,我在哈希图中添加了 1 个点。不幸的是,这并不总是有效,并以几个情节属于 2 人的事实结束。你们中有人为此提出不同的解决方案吗?

标签: javabukkit

解决方案


WorldGuard 已经为此提供了一些内置功能。

RegionContainer container = getWorldGuard().getRegionContainer();
RegionManager manager = container.get(world);

Region newRegion = //create your region somehow
manager.addRegion(newRegion);

List<ProtectedRegion> regions = new ArrayList<ProtectedRegion>(manager.getRegions().values());

List<ProtectedRegion> overlappingRegions = newRegion.getIntersectingRegions(regions);

if (overlappingRegions.size() > 0) {
    //delete region newRegion
} else {
   //region is valid 
}

这当然只有在区域已经创建之后才有效。

代码未经测试。刚刚搜索了 WorldGuard API wiki。

https://worldguard.enginehub.org/en/latest/developer/regions/protected-region/#finding-intersecting-regions


推荐阅读