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

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

Discussion in 'Разработка плагинов для новичков' started by Darwin, Feb 26, 2015.

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

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

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

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

    Собственно код:
    Code:
    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 Активный участник Пользователь

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

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

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

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

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

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

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

Share This Page