Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите WG plugin ошибка

Тема в разделе "Разработка плагинов для новичков", создана пользователем Darwin, 26 фев 2015.

  1. Автор темы
    Darwin

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

    Баллы:
    78
    Имя в Minecraft:
    Darwinian
    Нужно написать плагин для wg, который будет при взаимодействии с сундуком определять онлайн ли хозяин сундука и если да, позволять открыть его. И собственно почти все уже сделано, но есть пара моментов.
    После открытия сундука в игре, его невозможно сломать. Получаешь сообщение (you do not have permission to do that), хотя регионов может даже и не быть в этом месте. Помогает перезагрузка сервера. С чем это связано?

    И еще, не выходит создать исключение для регионов, где вообще нет овнеров. Помогите с этим.

    Собственно код:
    Код:
    package net.darwin.owlchest;
    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 java.util.Set;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.Chest;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class BukkitPluginMain extends JavaPlugin implements Listener
    {
        private WorldGuardPlugin worldGuard;
        @Override
        public void onLoad()
        {
        }
        @Override
        public void onEnable()
        {
            Bukkit.getPluginManager().registerEvents(this, this);
            worldGuard = getWorldGuard();
        }
        @Override
        public void onDisable()
        {
            getServer().getServicesManager().unregisterAll(this);
        }
        @EventHandler(priority = EventPriority.MONITOR)
        public void onPlayerInteract(PlayerInteractEvent event)
        {
            // Без него ничего не поделать :)
            if(worldGuard == null)
                return;
            final Player player = event.getPlayer();
            // Ползающие нафиг
            if(player.isSneaking() && player.getItemInHand()!= null && player.getItemInHand().getType() != Material.AIR)
                return;
            //if (player.hasPermission("owlchest.open"))
            //    return;
            // Если игрок мутит ПКМ ...
            if(event.getAction() == Action.RIGHT_CLICK_BLOCK)
            {
                // определение магазинов и так далее
                if(event.useInteractedBlock() == Event.Result.DENY)
                    return;
                // ... по сундуку ...
                if(event.getClickedBlock().getType() == Material.CHEST)
                {
                    // ... получаем список регионов, внутри которых расположен блок.
                    final Block block = event.getClickedBlock();
                    final Location blockLoc = block.getLocation();
                    final RegionManager rm = worldGuard.getRegionManager(player.getWorld());
                    final ApplicableRegionSet regions = rm.getApplicableRegions(blockLoc);
                    // Пробегаемся по им всем, определяя, у всех ли регионов есть как минимум один онлайн владелец
                    //boolean unblockedRegions = true;
                    //boolean emtyRegion = true;
                    for(ProtectedRegion region : regions)
                    {
                        final Set<String> owners = region.getOwners().getPlayers();
                        final Set<String> members = region.getMembers().getPlayers();
                        boolean isSomebodyOnline = false;
                       
                        for(String owner : owners)
                        {
                            // Как бы уже не следует так делать, но пока ещё работает
                            Player test = getServer().getPlayerExact(owner);
                            //Исключение для регионов без владельцев
                            //if (owner.isEmpty())
                            //    emtyRegion = false;
                            if(test != null && test.isOnline())
                                isSomebodyOnline = true;
                        }
                        for(String member : members)
                        {
                            // Как бы уже не следует так делать, но пока ещё работает
                            Player test = getServer().getPlayerExact(member);
                            if(test != null && test.isOnline())
                                isSomebodyOnline = true;
                        }
                        // Никого нет — сундук в регионе заперт
                        if(!isSomebodyOnline)
                        {
                            //unblockedRegions = false;
                            // Один регион запретил нам это, зачем продолжать? :(
                            event.getPlayer().sendMessage(ChatColor.RED + "Хозяин не в сети");
                            event.setCancelled(true);
                            break;
                        }
                        if(isSomebodyOnline) // || emtyRegion == true)
                        {
                            event.setCancelled(true);
                            player.openInventory(((Chest)block.getState()).getInventory());
                            break;
                        }
                    }
                }
            }
        }
       
        public static WorldGuardPlugin getWorldGuard()
        {
            final Plugin worldGuard = Bukkit.getPluginManager().getPlugin("WorldGuard");
            return (worldGuard != null && worldGuard instanceof WorldGuardPlugin)
                ? (WorldGuardPlugin)worldGuard
                : null;
        }
    }
    
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Darwin

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

    Баллы:
    78
    Имя в Minecraft:
    Darwinian
    Насчет первого вопроса. Оказалось всему виной не wg, а багнутая версия 4.0 PhatLoots.
    Второй вопрос все еще в силе. Как сделать проверку исключения, когда у региона вообще нет овнера?
     
  4. Code

    Code Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    эм, что-нибудь типа owners.size() == 0?
     
  5. Автор темы
    Darwin

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

    Баллы:
    78
    Имя в Minecraft:
    Darwinian
    Такой функции судя по всему вообще нет. Предлагает заменить на isEmpty()
     
  6. LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Баллы:
    103
    Skype:
    sgp_the_controller
    1. final ApplicableRegionSet regions = rm.getApplicableRegions(blockLoc)
    2. (сюда вставляем) if(regions.size == 0)return;
    3. for(ProtectedRegion region : regions)
     

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