Getting A region name from a sign using WorldGuard

Discussion in 'Plugin Development' started by Drew1080, Jun 26, 2012.

Thread Status:
Not open for further replies.
  1. Offline

    Drew1080

    Hi.

    The title of what I am going to ask pretty much says it all.

    How would you get a WorldGuard region name from the text on a sign?

    Thx to Paul O'Reilly for helping me to get a region name from a users location.
    Mabey you could help me again to get the name from a sign.

    Any help from anyone else will still be greatly appreciated. :D
     
  2. Offline

    ienze

  3. Offline

    Drew1080

    I know that I've looked at it before. But I Still cant seem to figure out how to get it to work.

    This is my BlockListener class for the onSignChangeEvent

    Code:
    package me.drew1080.signprotect;
     
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.SignChangeEvent;
     
    import com.sk89q.worldedit.Vector;
    import com.sk89q.worldguard.LocalPlayer;
    import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
    import com.sk89q.worldguard.protection.ApplicableRegionSet;
    import com.sk89q.worldguard.protection.managers.RegionManager;
     
    public class SignProtectBlockListener implements Listener{
       
          protected SignProtect plugin;
     
          SignProtectBlockListener(SignProtect plugin)
          {
            this.plugin = plugin;
          }
       
          @EventHandler(priority=EventPriority.MONITOR)
          public boolean onSignChange(SignChangeEvent event){
          if (event.getLine(0).equalsIgnoreCase("[PLOT]"));
            {
             
                Player player = event.getPlayer();
                Location loc = event.getBlock().getLocation();
                WorldGuardPlugin worldGuard = SignProtect.getWorldGuard();
                Vector pt = toVector(event.getLine(1)); // This also takes a location
                LocalPlayer localPlayer = worldGuard.wrapPlayer(player);
             
                RegionManager regionManager = worldGuard.getRegionManager(loc.getWorld());
                ApplicableRegionSet set = regionManager.getApplicableRegions(pt);
                return set.canBuild(localPlayer);
           
            }
          }
    }
    Heres my main class file:
    Code:
    package me.drew1080.signprotect;
     
     
    import java.util.logging.Logger;
     
    import org.bukkit.Server;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
     
    import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
     
    public class SignProtect extends JavaPlugin{
     
          private static Server server;
          Logger log = Logger.getLogger("Minecraft");
       
          public static WorldGuardPlugin getWorldGuard()
          {
            Plugin plugin = server.getPluginManager().getPlugin("WorldGuard");
     
            if ((plugin == null) || (!(plugin instanceof WorldGuardPlugin))) {
              return null;
            }
            return (WorldGuardPlugin)plugin;
          }
          public void onEnable(){
              registerEvents();
              getConfig();
              log.info("[SignProtect] SignProtect is enabled");
          }
            public void registerEvents() {
                PluginManager pm = getServer().getPluginManager();
                pm.registerEvents(new SignProtectBlockListener(this), this);
                }
          public void onDisable(){
              log.info("[SignProtect] SignProtect is disabled");
          }
    }
    
    and heres the error I get when I run it on the server:

    Code:
    17:43:21 [SEVERE] Could not pass event SignChangeEvent to SignProtect
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:303)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:459)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:1265)
        at net.minecraft.server.Packet130UpdateSign.handle(SourceFile:41)
        at net.minecraft.server.NetworkManager.b(NetworkManager.java:229)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:113)
        at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:78)
        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:551)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:449)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:492)
    Caused by: java.lang.NullPointerException
        at me.drew1080.signprotect.SignProtect.getWorldGuard(SignProtect.java:20)
        at me.drew1080.signprotect.SignProtectBlockListener.onSignChange(SignProtectBlockListener.java:33)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:301)
        ... 10 more
    I know that it returns a nullPointerException but even when I insert a null check it still return the same error.
     
  4. Offline

    ienze

    You don't need player build flag...
    Code:
    ApplicableRegionSet set = regionManager.getApplicableRegions(pt);
    return set.canBuild(localPlayer);
    (Try read it if you copy it)

    You need names of regions on player location...
    Code:
    //get set of all regions player are in
    ApplicableRegionSet set = regionManager.getApplicableRegions(player.getLocation());
     
    //test if player isn't only in global region
    for (ProtectedRegion region : set) {
        if (region.getId() != "__global__") {
            // return name of region, or you can change line on sign...
            return region.getId();
        }
    }
    
    Sorry for bad english.
    Ienze
     
    Drew1080 likes this.
  5. Offline

    Drew1080

    Thx for that, I have never tried to implement anything from worldguard or worldedit before so this was all kinda new to me.
     
  6. Offline

    ienze

    ...yes, It been new to me too, but I working on Radiaiton plugin, and I use it here...
     
Thread Status:
Not open for further replies.

Share This Page