1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите WorldGuard API & WorldEdit API

Тема в разделе "Разработка плагинов для новичков", создана пользователем MrHaber, 6 ноя 2018.

Статус темы:
Закрыта.
  1. Автор темы
    MrHaber

    MrHaber Активный участник Пользователь

    Баллы:
    66
    Здравствуйте, у меня появился вопрос который затрагивает использование WorldGuard API & WorldEdit API. Уже неделю мучаюсь, выдает ошибку хотя делал все правильно.
    - Как получить имя региона в зависимости от того блока на который игрок кликнул (алмазом) с исключением глобального региона?
    Код:
    import com.sk89q.worldedit.Vector;
    import com.sk89q.worldguard.bukkit.BukkitUtil;
    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.ProtectedRegion;
    import static com.sk89q.worldguard.bukkit.BukkitUtil.*;
    
        private WorldGuardPlugin getWorldGuard() {
            final Plugin plugin = this.getServer().getPluginManager().getPlugin("WorldGuard");
            if (plugin == null || !(plugin instanceof WorldGuardPlugin)) {
                return null;
            }
            return (WorldGuardPlugin)plugin;
        }
           this.wg = getWorldGuard();
        public void onClick(final PlayerInteractEvent event) {
               Action a = event.getAction();
          
           final Player p = event.getPlayer();
            final Block block = event.getClickedBlock();
            final World world = block.getWorld();
            Vector pt = (Vector)BukkitUtil.toVector(block); // This also takes a location
            RegionManager regionManager = Main.wg.getRegionManager(Bukkit.getWorld("world"));
            ApplicableRegionSet set = regionManager.getApplicableRegions(pt);
    
    Данные с которыми я работаю.
    Пожалуйста помогите решить проблему.
     
  2. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Если выдает ошибку, значит не все правильно.
    А в чем проблема? Какая ошибка?
     
  3. Автор темы
    MrHaber

    MrHaber Активный участник Пользователь

    Баллы:
    66
    Код:
           if (a != Action.RIGHT_CLICK_BLOCK) return;
           if (p.getItemInHand().getType() == Material.DIAMOND) {{
                    if (set.size() < 1) {
                        p.sendMessage("Rgs not found");
                        return;
                    }
                    if (((ProtectedRegion) set).getOwners().contains(p.getName()) || ((ProtectedRegion) set).getMembers().contains(p.getName())) {
                        p.sendMessage("You Have been in this region");
                        return;
                    }
                    p.sendMessage("Added");
                    ((ProtectedRegion) set).getMembers().addPlayer(p.getName());
                    }
    
    Уже все перепробовал, на это жалуется.
     
  4. Автор темы
    MrHaber

    MrHaber Активный участник Пользователь

    Баллы:
    66
    Можете помочь мне составить подобный алгоритм с использование WG & WE API?
     
  5. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Если у тебя ошибка, ты должен выкладывать сюда лог, а не писать "на что то жалуется". Последний случай не дает нам никакой полезной информации и мы соответственно не можем помочь.

    В коде ты очевидно приводишь ApplicableRegionSet до ProtectedRegion (коллекцию регионов до региона), что в принципе невозможно. Ты должен итерировать каждый регион из этой коллекции:
    Код:
    for (ProtectedRegion region : set) {
     // ...
    }
     
  6. Автор темы
    MrHaber

    MrHaber Активный участник Пользователь

    Баллы:
    66
    Спасибо, вроде механику проработал -
    Код:
        public void onClick(final PlayerInteractEvent event) {
               Action a = event.getAction();
           
           final Player p = event.getPlayer();
            final Block block = event.getClickedBlock();
            final World world = block.getWorld();
           
            Vector pt = (Vector)BukkitUtil.toVector(block); // This also takes a location
            RegionManager regionManager = Main.wg.getRegionManager(Bukkit.getWorld("world"));
            ApplicableRegionSet set = regionManager.getApplicableRegions(pt);
           final ItemStack i = p.getItemInHand();
           final ItemMeta m = i.getItemMeta();
           
           
           
           for (ProtectedRegion set1 : set){
           if (a != Action.RIGHT_CLICK_BLOCK) return;
           if (p.getItemInHand().getType() == Material.DIAMOND) {
                    if (set.size() < 1) {
                        p.sendMessage("Rgs not found");
                        return;
                    }
                    if (set1.getOwners().contains(p.getName()) || set1.getMembers().contains(p.getName())) {
                        p.sendMessage("You Have been in this region");
                        return;
                    }
                    p.sendMessage("Added");
                    set1.getMembers().addPlayer(p.getName());
                    }
           }
                }
       
    }
    
    Выходит ошибка когда пытаюсь глобальный регион проверить и кликнуть в воздухе -
    Код:
    [Server thread/ERROR]: Could not pass event PlayerInteractEvent to Plugin v2.0
    org.bukkit.event.EventException
       at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
       at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
       at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-db6de12-18fbb24]
       at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-db6de12-18fbb24]
       at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:228) [spigot.jar:git-Spigot-db6de12-18fbb24]
       at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:195) [spigot.jar:git-Spigot-db6de12-18fbb24]
       at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:191) [spigot.jar:git-Spigot-db6de12-18fbb24]
       at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:717) [spigot.jar:git-Spigot-db6de12-18fbb24]
    
    
    
    Так при любом клике по воздуху. Не получается получить глобальный регион.
     
  7. Автор темы
    MrHaber

    MrHaber Активный участник Пользователь

    Баллы:
    66
    Что делать, как быть?
     
  8. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Стак трейс ошибки не полный, ниже должен быть Caused by... и т.д.
     
  9. Автор темы
    MrHaber

    MrHaber Активный участник Пользователь

    Баллы:
    66
    Спасибо, я самостоятельно решил проблему. Методом getGlobalRegionManager().get(world);
    и
    Код:
    for (ProtectedRegion region : set) {
     
    }
    
     
Статус темы:
Закрыта.

Поделиться этой страницей