[ Закрыто ] Пересечение регионов

  • Автор темы Автор темы KuSaMe
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

KuSaMe

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
KuSaMe
Надо проверить есть ли пересечение региона с другим регионом, и если есть, то выдать сообщение ! WG API подключен!
 
Последнее редактирование:
  • Берёшь код WorldGuard
  • Смотришь работу команды /rg claim
  • Ищешь проверку на пересечение
  • ???
  • Profit
 
  • Берёшь код WorldGuard
  • Смотришь работу команды /rg claim
  • Ищешь проверку на пересечение
  • ???
  • Profit
public List<ProtectedRegion> getIntersectingRegions(List<ProtectedRegion> regions)
throws UnsupportedIntersectionException
Вот проверка на пересечение, ток не понимаю как подключить ! в вг код так-же видел, но тоже не понятно !
 
Примитивнейшая задача, примитивнейшее решение:
Надо просто проверить регионы на предмет пересечения их двух пар проекций: на плоскостях ZOY и XOY.

Вот код проверки пересечения прямоугольников, т.е. наших проекций, на JS, скопипащенный с какого-то форума, работоспособность не гарантирую:
PHP:
var intersects = function ( a, b ) {
  //a и b - обьекты прямоугольников, x, y1, y, y1 - координаты вершин 
  return ( a.y < b.y1 || a.y1 > b.y || a.x1 < b.x || a.x > b.x1 );
}
 
Последнее редактирование:
Примитивнейшая задача, примитивнейшее решение:
Надо просто проверить регионы на предмет пересечения их двух пар проекций: на плоскостях ZOY и XOY.

Вот код проверки пересечения прямоугольников, т.е. наших проекций, на JS, скопипащенный с какого-то форума, работоспособность не гарантирую:
PHP:
var intersects = function ( a, b ) {
  //a и b - обьекты прямоугольников, x, y1, y, y1 - координаты вершин
  return ( a.y < b.y1 || a.y1 > b.y || a.x1 < b.x || a.x > b.x1 );
}
Тебе надо такое делать для всех регионов в мире. Надо смотреть как делалось в rg claim. В тот метод что ТС дал надо дать правильный список регионов.
 
public List<ProtectedRegion> getIntersectingRegions(List<ProtectedRegion> regions)
throws UnsupportedIntersectionException
Мне бы лучше бы объяснили как подключить данную функцию !
в коде вг указано size >0 и считывание чтоб во всех приватах ты был овнер, но мне надо чтоб не с чем он не пересекался!
 
Примитивнейшая задача, примитивнейшее решение:
Надо просто проверить регионы на предмет пересечения их двух пар проекций: на плоскостях ZOY и XOY.

Вот код проверки пересечения прямоугольников, т.е. наших проекций, на JS, скопипащенный с какого-то форума, работоспособность не гарантирую:
PHP:
var intersects = function ( a, b ) {
  //a и b - обьекты прямоугольников, x, y1, y, y1 - координаты вершин
  return ( a.y < b.y1 || a.y1 > b.y || a.x1 < b.x || a.x > b.x1 );
}
Данный вариант 100 % работать не будет, а если будет, то не стабильно, получаем выделение привата максимальные координаты и минимальные, все, проверяем на пересечение с другим приватом, но как узнать он пересекается с другим приватом или нет не понятно !
 
Данный вариант 100 % работать не будет, а если будет, то не стабильно, получаем выделение привата максимальные координаты и минимальные, все, проверяем на пересечение с другим приватом, но как узнать он пересекается с другим приватом или нет не понятно !
Получаешь сет регионов на определённой локации и проверяешь их количество, ничего сложного.
 
Код:
    static WorldGuardPlugin wg = (WorldGuardPlugin) Bukkit.getPluginManager().getPlugin("WorldGuard");
    public static void get(ProtectedRegion region, World world) {
        RegionManager manager = wg.getRegionContainer().get(world);
        ApplicableRegionSet rg = manager.getApplicableRegions(region);
        //TODO
    }
 
Данный вариант 100 % работать не будет, а если будет, то не стабильно, получаем выделение привата максимальные координаты и минимальные, все, проверяем на пересечение с другим приватом, но как узнать он пересекается с другим приватом или нет не понятно !
Если совсем всё плохо, то держи:
Код:
if (WGBukkit.getRegionManager(Bukkit.getWorlds().get(0)).getApplicableRegions(Bukkit.getWorlds().get(0).getSpawnLocation()).size() > 1)
p.sendMessage("На этой локации более 1 региона (а это значит, что как минимум 1 регион перекрывает другой)");
 
Если совсем всё плохо, то держи:
Код:
if (WGBukkit.getRegionManager(Bukkit.getWorlds().get(0)).getApplicableRegions(Bukkit.getWorlds().get(0).getSpawnLocation()).size() > 1)
p.sendMessage("На этой локации более 1 региона (а это значит, что как минимум 1 регион перекрывает другой)");
щас гляну, но он проверяет регион именно на пересечение сетки с ворлд едит ?
 
Вот те полный код.
Код:
package Example;

import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;

import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldedit.bukkit.selections.Polygonal2DSelection;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;

public class wg {
    protected static WorldGuardPlugin wg = (WorldGuardPlugin) Bukkit.getPluginManager().getPlugin("WorldGuard");

    public static void get(Player player, String id, World world) throws CommandException {
        LocalPlayer localPlayer = wg.wrapPlayer(player);
        RegionManager manager = wg.getRegionContainer().get(world);
        checkRegionDoesNotExist(manager, id, false);
        ApplicableRegionSet regions = manager.getApplicableRegions(checkRegionFromSelection(player, id));
        if (regions.size() > 0) {
            if (!regions.isOwnerOfAll(localPlayer)) {
                throw new CommandException("This region overlaps with someone else's region.");
            }
        }
    }

    protected static Selection checkSelection(Player player) throws CommandException {
        WorldEditPlugin worldEdit = WorldGuardPlugin.inst().getWorldEdit();
        Selection selection = worldEdit.getSelection(player);
        if (selection == null) {
            throw new CommandException(
                    "Please select an area first. Use WorldEdit to make a selection! (wiki: http://wiki.sk89q.com/wiki/WorldEdit).");
        }
        return selection;
    }

    protected static ProtectedRegion checkRegionFromSelection(Player player, String id) throws CommandException {
        Selection selection = checkSelection(player);
        if ((selection instanceof Polygonal2DSelection)) {
            Polygonal2DSelection polySel = (Polygonal2DSelection) selection;
            int minY = polySel.getNativeMinimumPoint().getBlockY();
            int maxY = polySel.getNativeMaximumPoint().getBlockY();
            return new ProtectedPolygonalRegion(id, polySel.getNativePoints(), minY, maxY);
        }
        if ((selection instanceof CuboidSelection)) {
            BlockVector min = selection.getNativeMinimumPoint().toBlockVector();
            BlockVector max = selection.getNativeMaximumPoint().toBlockVector();
            return new ProtectedCuboidRegion(id, min, max);
        }
        throw new CommandException("Sorry, you can only use cuboids and polygons for WorldGuard regions.");
    }

    protected static String checkRegionId(String id, boolean allowGlobal) throws CommandException {
        if (!ProtectedRegion.isValidId(id)) {
            throw new CommandException("The region name of '" + id + "' contains characters that are not allowed.");
        }
        if ((!allowGlobal) && (id.equalsIgnoreCase("__global__"))) {
            throw new CommandException("Sorry, you can't use __global__ here.");
        }
        return id;
    }

    protected static void checkRegionDoesNotExist(RegionManager manager, String id, boolean mayRedefine)
            throws CommandException {
        if (manager.hasRegion(id)) {
            throw new CommandException("A region with that name already exists. Please choose another name."
                    + (mayRedefine ? " To change the shape, use /region redefine " + id + "." : ""));
        }
    }
}
 
Последнее редактирование:
Вот те полный код.
Код:
package Example;

import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;

import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldedit.bukkit.selections.Polygonal2DSelection;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;

public class wg {
    protected static WorldGuardPlugin wg = (WorldGuardPlugin) Bukkit.getPluginManager().getPlugin("WorldGuard");

    public static void get(Player player, String id, World world) throws CommandException {
        LocalPlayer localPlayer = wg.wrapPlayer(player);
        RegionManager manager = wg.getRegionContainer().get(world);
        checkRegionDoesNotExist(manager, id, false);
        ApplicableRegionSet regions = manager.getApplicableRegions(checkRegionFromSelection(player, id));
        if (regions.size() > 0) {
            if (!regions.isOwnerOfAll(localPlayer)) {
                throw new CommandException("This region overlaps with someone else's region.");
            }
        }
    }

    protected static Selection checkSelection(Player player) throws CommandException {
        WorldEditPlugin worldEdit = WorldGuardPlugin.inst().getWorldEdit();
        Selection selection = worldEdit.getSelection(player);
        if (selection == null) {
            throw new CommandException(
                    "Please select an area first. Use WorldEdit to make a selection! (wiki: http://wiki.sk89q.com/wiki/WorldEdit).");
        }
        return selection;
    }

    protected static ProtectedRegion checkRegionFromSelection(Player player, String id) throws CommandException {
        Selection selection = checkSelection(player);
        if ((selection instanceof Polygonal2DSelection)) {
            Polygonal2DSelection polySel = (Polygonal2DSelection) selection;
            int minY = polySel.getNativeMinimumPoint().getBlockY();
            int maxY = polySel.getNativeMaximumPoint().getBlockY();
            return new ProtectedPolygonalRegion(id, polySel.getNativePoints(), minY, maxY);
        }
        if ((selection instanceof CuboidSelection)) {
            BlockVector min = selection.getNativeMinimumPoint().toBlockVector();
            BlockVector max = selection.getNativeMaximumPoint().toBlockVector();
            return new ProtectedCuboidRegion(id, min, max);
        }
        throw new CommandException("Sorry, you can only use cuboids and polygons for WorldGuard regions.");
    }

    protected static String checkRegionId(String id, boolean allowGlobal) throws CommandException {
        if (!ProtectedRegion.isValidId(id)) {
            throw new CommandException("The region name of '" + id + "' contains characters that are not allowed.");
        }
        if ((!allowGlobal) && (id.equalsIgnoreCase("__global__"))) {
            throw new CommandException("Sorry, you can't use __global__ here.");
        }
        return id;
    }

    protected static void checkRegionDoesNotExist(RegionManager manager, String id, boolean mayRedefine)
            throws CommandException {
        if (manager.hasRegion(id)) {
            throw new CommandException("A region with that name already exists. Please choose another name."
                    + (mayRedefine ? " To change the shape, use /region redefine " + id + "." : ""));
        }
    }
}
Спасибо большое, это очень помогло, понял чего не хватает!
А так-же всех хочу сказать спасибо за помощь !
Рад что есть люди которые могут поделиться знаниями !
 
  • intersectsEdges
    protected boolean intersectsEdges ( ProtectedRegion region)
    Сравнивает все ребра двух областей, чтобы увидеть, пересекается ли какая-либо из них
    Параметры:
    region - регион для проверки
    Возвращает:
    не пересекаются ли какие-либо края области


  • вот это как прикрутить не могу понять )
 
Код:
            Selection sel = getWorldEdit().getSelection(p);
            
             WorldGuardPlugin wg = (WorldGuardPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldGuard");
             RegionManager rgm = wg.getRegionManager(p.getWorld());
             ApplicableRegionSet ars = rgm.getApplicableRegions(p.getLocation());
             LocalPlayer localPlayer = wg.wrapPlayer(p);


                if (ars.size() == 0 )
                {
                            
                        
                           ProtectedCuboidRegion aregions = new ProtectedCuboidRegion(
                           p.getName()
                           + "_" + z1 + "x" + z1 + "_" + rnd1 + rnd2 + rnd3,
                           new BlockVector(sel.getNativeMinimumPoint()),
                           new BlockVector(sel.getNativeMaximumPoint()));
                          
            if (!rgm.overlapsUnownedRegion(aregions, localPlayer) )
            {
                    DefaultDomain owners = new DefaultDomain();
                    owners.addPlayer(getWorldGuard().wrapPlayer(p));
                    aregions.setOwners(owners);

            if(ars.isOwnerOfAll(localPlayer))
            {
                getWorldGuard().getRegionManager(p.getWorld()).addRegion(aregions);
                owner = aregions.getOwners().getUniqueIds().contains(p.getUniqueId());
                
              p.sendMessage(ChatColor.GREEN + "AutoRegions: Ваш регион содержит следующее имя: " + aregions.getId());

                p.sendMessage(ChatColor.RED + "Тест:" +  sel.getRegionSelector().getIncompleteRegion() );
            }
                    else
                    {
                        p.sendMessage(ChatColor.RED + "Вы не можете заприватить, так как ваш приват пересекаеться с другим приватом.");
                        e.setCancelled(true);
                    }   
                    }
                    
                }
                    
                }
            }               
          }
 
Писец ты темный. Тебе всего то надо было с моим кодом выше.
Код:
        try {
            wg.get(e.getPlayer(), "rg_id", e.getPlayer().getWorld());
             //TODO
        } catch (CommandException ex) {
            e.getPlayer().sendMessage(ex.getMessage());
        }
 
Писец ты темный. Тебе всего то надо было с моим кодом выше.
Код:
        try {
            wg.get(e.getPlayer(), "rg_id", e.getPlayer().getWorld());
             //TODO
        } catch (CommandException ex) {
            e.getPlayer().sendMessage(ex.getMessage());
        }
это не то, у меня запрет идет с региона если не мой, но мне надо запретить даже на своем регионе ! чтоб сетка не пересекалась !
 
это не то, у меня запрет идет с региона если не мой, но мне надо запретить даже на своем регионе ! чтоб сетка не пересекалась !
Поменяй
Код:
        if (regions.size() > 0) {
            if (!regions.isOwnerOfAll(localPlayer)) {
                throw new CommandException("Эта область перекрывается с чужой областью.");
            }
        }
На это

Код:
        if (regions.size() > 0) {
            throw new CommandException("Эта область перекрывается с другой областью.");
        }
И все, теперь будет ругаться на все пересечения.
 
Поменяй
Код:
        if (regions.size() > 0) {
            if (!regions.isOwnerOfAll(localPlayer)) {
                throw new CommandException("Эта область перекрывается с чужой областью.");
            }
        }
На это

Код:
        if (regions.size() > 0) {
            throw new CommandException("Эта область перекрывается с другой областью.");
        }
И все, теперь будет ругаться на все пересечения.

regions.size() > 0) почему > а не == ?
 
просто я как понял он берет именно приват, а не выделения привата ! он не считывает точки выделения !
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх