Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
public List<ProtectedRegion> getIntersectingRegions(List<ProtectedRegion> regions)
- Берёшь код WorldGuard
- Смотришь работу команды /rg claim
- Ищешь проверку на пересечение
- ???
- Profit
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. В тот метод что ТС дал надо дать правильный список регионов.Примитивнейшая задача, примитивнейшее решение:
Надо просто проверить регионы на предмет пересечения их двух пар проекций: на плоскостях 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 % работать не будет, а если будет, то не стабильно, получаем выделение привата максимальные координаты и минимальные, все, проверяем на пересечение с другим приватом, но как узнать он пересекается с другим приватом или нет не понятно !Примитивнейшая задача, примитивнейшее решение:
Надо просто проверить регионы на предмет пересечения их двух пар проекций: на плоскостях 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 % работать не будет, а если будет, то не стабильно, получаем выделение привата максимальные координаты и минимальные, все, проверяем на пересечение с другим приватом, но как узнать он пересекается с другим приватом или нет не понятно !
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 + "." : "")); } } }
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("Эта область перекрывается с другой областью."); }