Вопрос Не выходит конвертировать мир Bukkit в мир WorldGuard..

Версия Minecraft
1.17.X

ProGiple

Пользователь
Сообщения
81
Решения
1
Привет, разработчики! Кто может подсказать, как можно в целом работать с регионами WorldGuard? АПИ читал, но ничего не понял, особенно то, как можно конвертировать мир Bukkit в мир WorldGuard. Это мне нужно для определения в каком регионе находиться блок, по которому игрок нажал правой кнопкой мыши.
 
Решение
Какие-то странные действия, например это

Можно таким образом получить список регионов в определённой точке:

Set<ProtectedRegion> regions = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(мир)).getApplicableRegions(BlockVector3.at(координаты).getRegions();

После этого по нему можно будет пройтись и проверить принадлежность игрока к каждому из них
BukkitAdapter.adapt(world)
Объединено

Тут же всё написано
и как мне это использовать в самом коде? Надо задавать этому какую либо переменную (по типу String test = "") или сразу вставлять в скобки для определения мира?
 
и как мне это использовать в самом коде? Надо задавать этому какую либо переменную (по типу String test = "") или сразу вставлять в скобки для определения мира?
Метод adapt принимает баккитовский мир и возвращает мир с которым можно работать в worldguard. Можешь создать переменную для него, главное не напутай с типом данных, так как и там и там класс называется World
 
Метод adapt принимает баккитовский мир и возвращает мир с которым можно работать в worldguard. Можешь создать переменную для него, главное не напутай с типом данных, так как и там и там класс называется World
Хорошо, спасибо! А можешь подсказать, как получать регион, в котором находиться блок, по которому кликнул игрок?
 
Метод adapt принимает баккитовский мир и возвращает мир с которым можно работать в worldguard. Можешь создать переменную для него, главное не напутай с типом данных, так как и там и там класс называется World
А вот, я решил попробывать и вот что получаю:
BukkitAdapter()' has private access in 'com.sk89q.worldedit.bukkit.BukkitAdapter

Код:
Код:
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
                RegionManager regions = container.get(new BukkitAdapter(world));
 
А вот, я решил попробывать и вот что получаю:
BukkitAdapter()' has private access in 'com.sk89q.worldedit.bukkit.BukkitAdapter

Код:
Код:
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
                RegionManager regions = container.get(new BukkitAdapter(world));
Тебе ж сказали, что не new BukkitAdapter(world), а BukkitAdapter.adapt(world)
 
Тебе ж сказали, что не new BukkitAdapter(world), а BukkitAdapter.adapt(world)
я уже понял, извините, написал в общем примерно такой код:
Код:
World world1 = block.getWorld();
                WorldGuard worldGuard = WorldGuard.getInstance();
                RegionContainer container = worldGuard.getPlatform().getRegionContainer();
                RegionManager regionManager = container.get(BukkitAdapter.adapt(world1));

                boolean isSafer = false;
                if (regionManager != null) {
                    BlockVector3 targetPoint = BlockVector3.at(x, y, z);
                    Set<String> regionNames = Collections.singleton(regionManager.getName());

                    for (String regionName : regionNames) {
                        ProtectedRegion region = regionManager.getRegion(regionName);
                        assert region != null;
                        if (region.contains(targetPoint)) {
                            Set<String> members = region.getMembers().getPlayers();
                            Set<String> owners = region.getOwners().getPlayers();

                            for (String member : members) {
                                if (Objects.equals(member, player.getName())) {
                                    isSafer = true;
                                    break;
                                }
                            }
                            for (String owner : owners) {
                                if (Objects.equals(owner, player.getName())) {
                                    isSafer = true;
                                    break;
                                }
                            }
                        }
                    }
                } else {
                    isSafer = true;
                }
                if (isSafer) {

Но выдаёт ошибку:

Код:
[21:19:34 ERROR]: Could not pass event PlayerInteractEvent to SateSpawners v1.0-SNAPSHOT
java.lang.NullPointerException: Cannot invoke "com.sk89q.worldguard.protection.regions.ProtectedRegion.contains(com.sk89q.worldedit.math.BlockVector3)" because "region" is null
        at org.satellite.progiple.satespawners.SateSpawners.OnClickOnSpawner(SateSpawners.java:97) ~[SateSpawners-1.0-SNAPSHOT-shaded.jar:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor211.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.17.1.jar:git-Paper-411]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.17.1.jar:git-Paper-411]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.17.1.jar:git-Paper-411]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:628) ~[patched_1.17.1.jar:git-Paper-411]
        at org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:543) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.server.level.ServerPlayerGameMode.useItemOn(ServerPlayerGameMode.java:542) ~[app:?]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.handleUseItemOn(ServerGamePacketListenerImpl.java:1815) ~[app:?]
        at net.minecraft.network.protocol.game.ServerboundUseItemOnPacket.handle(ServerboundUseItemOnPacket.java:33) ~[app:?]
        at net.minecraft.network.protocol.game.ServerboundUseItemOnPacket.a(ServerboundUseItemOnPacket.java:9) ~[app:?]
        at net.minecraft.network.protocol.PacketUtils.lambda$ensureRunningOnSameThread$1(PacketUtils.java:56) ~[app:?]
        at net.minecraft.server.TickTask.run(TickTask.java:18) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:149) ~[app:?]
        at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:23) ~[app:?]
        at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1426) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.server.MinecraftServer.executeTask(MinecraftServer.java:192) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:122) ~[app:?]
        at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1404) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1397) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:132) ~[app:?]
        at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1375) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1286) ~[patched_1.17.1.jar:git-Paper-411]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:319) ~[patched_1.17.1.jar:git-Paper-411]
        at java.lang.Thread.run(Thread.java:842) ~[?:?]
 
Какие-то странные действия, например это

Можно таким образом получить список регионов в определённой точке:

Set<ProtectedRegion> regions = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(мир)).getApplicableRegions(BlockVector3.at(координаты).getRegions();

После этого по нему можно будет пройтись и проверить принадлежность игрока к каждому из них
 
Какие-то странные действия, например это


Можно таким образом получить список регионов в определённой точке:

Set<ProtectedRegion> regions = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(мир)).getApplicableRegions(BlockVector3.at(координаты).getRegions();

После этого по нему можно будет пройтись и проверить принадлежность игрока к каждому из них
Set<ProtectedRegion> regions = Objects.requireNonNull(WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world1))).getApplicableRegions(BlockVector3.at(x, y, z).getRegions());


Выдаёт ошибку:
Cannot resolve method 'getRegions' in 'BlockVector3'
Объединено

Какие-то странные действия, например это


Можно таким образом получить список регионов в определённой точке:

Set<ProtectedRegion> regions = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(мир)).getApplicableRegions(BlockVector3.at(координаты).getRegions();

После этого по нему можно будет пройтись и проверить принадлежность игрока к каждому из них
Код:
boolean isSafer = false;
                if (regionManager != null) {
                    BlockVector3 targetPoint = BlockVector3.at(x, y, z);
                    Set<ProtectedRegion> regions = Objects.requireNonNull(WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world1))).getApplicableRegions(BlockVector3.at(x, y, z).getRegions());

                    for (ProtectedRegion region : regions) {
                            Set<String> members = region.getMembers().getPlayers();
                            Set<String> owners = region.getOwners().getPlayers();

                            for (String member : members) {
                                if (Objects.equals(member, player.getName())) {
                                    isSafer = true;
                                    break;
                                }
                            }
                            for (String owner : owners) {
                                if (Objects.equals(owner, player.getName())) {
                                    isSafer = true;
                                    break;
                                }
                            }
                        }
                } else {
                    isSafer = true;
                }
так?
 
Последнее редактирование:
Назад
Сверху Снизу