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