Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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;
    }
}
 
Насчет первого вопроса. Оказалось всему виной не wg, а багнутая версия 4.0 PhatLoots.
Второй вопрос все еще в силе. Как сделать проверку исключения, когда у региона вообще нет овнера?
 
Насчет первого вопроса. Оказалось всему виной не wg, а багнутая версия 4.0 PhatLoots.
Второй вопрос все еще в силе. Как сделать проверку исключения, когда у региона вообще нет овнера?
эм, что-нибудь типа owners.size() == 0?
 
Такой функции судя по всему вообще нет. Предлагает заменить на isEmpty()
 
  1. final ApplicableRegionSet regions = rm.getApplicableRegions(blockLoc)
  2. (сюда вставляем) if(regions.size == 0)return;
  3. for(ProtectedRegion region : regions)
 

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

Назад
Верх