[SOLVED] How to Make Enter and Exit Messages for Areas?

Discussion in 'Plugin Development' started by thebiologist13, Mar 29, 2012.

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

    thebiologist13

    Hello All!

    How should I make my plugin display a message when a user enters an area, then another message when they exit that area? I have tried a bunch of different ways, but it prints the enter or exit message over and over.

    Thanks! :D
     
  2. Offline

    Tzeentchful

    I know that world guard can do this with the "greeting" and "farewell" flags
     
  3. PlayerMoveEvent

    Check if the player has actually moved a block, not just the head and then if his location is within the area do player.sendMessage

    I'll try and post the code later to do this.

    Keir
     
  4. Offline

    thebiologist13

    Thanks!

    So I tried this:
    Code:
    if(isWithin(player.getLocation(), pos1, pos2) && inWorld(f)) {
        if(isWithin(event.getTo(), pos1, pos2) && !isWithin(event.getFrom(), pos1, pos2)) {
            player.sendMessage(ChatColor.DARK_PURPLE + "Enter Message");
        }
    }
                       
    if(isWithin(event.getFrom(), pos1, pos2) && !isWithin(event.getTo(), pos1, pos2)) {
            player.sendMessage(ChatColor.DARK_PURPLE + "Exit Message");
    }
    isWithin(Location, Location, Location) just checks if the first location argument is inside the other two locations. I know it works because it works in other places throughout my plugin.

    With the above, I got it to print an exit message, but not an enter message. With a bit of debugging, I have found "!isWithin(event.getFrom(), pos1, pos2)" is evaluating false. Which, does not make sense.

    Any ideas?
     
  5. Offline

    dillyg10

    here is what i do for areas

    Code:java
    1.  
    2.  
    3. public Map<Player, Boolean> enteredArea = new HashMap<Player, Boolean>();
    4.  
    5.  
    6. public void onPlayerMove(PlayerMoveEvent event) {
    7. Player player = event.getPlayer();
    8. int
    9. ,x = player.getLocation().getBlockX()
    10. ,y = player.getLocation().getBlockY()
    11. ,z = player.getLocation().getBlockZ()
    12. //not sure where u get the area from, let's just pretrend a config.
    13. ,startAreaX = getConfig().getInt("startX")
    14. ,startAreaY = getConfig().getInt("startY")
    15. ,startAreaZ = getConfig().getInt("startZ")
    16. ,endAreaX = getConfig().getInt("endX")
    17. ,endAreaY = getConfig().getInt("endY")
    18. ,endAreaZ = getConfig().getInt("endZ");
    19.  
    20. if (x >= startAreaX && x <= endAreaX) {
    21. if (y >= startAreaY && y <= endAreaY) {
    22. if (z >= startAreaZ && z <= endAreaZ) {
    23. if (enteredArea.get(player) == null || enteredArea.get(player) == false) {
    24. p.sendMessage("Welcome!");
    25. } else {
    26. if (enteredArea.get(player) != null || enteredArea.get(player) == true) {
    27. player.sendMessage("Bye bye now");
    28. }
    29. } else {
    30. if (enteredArea.get(player) != null || enteredArea.get(player) == true) {
    31. player.sendMessage("Bye bye now");
    32. }
    33. }
    34. else {
    35. if (enteredArea.get(player) != null || enteredArea.get(player) == true) {
    36. player.sendMessage("Bye bye now");
    37. }
    38. }
    39. }
     
  6. Offline

    thebiologist13

    I tried your code out, but it gave me a null pointer at line 35. :confused: Is it because the enteredArea Map doesn't have any values assigned to it?

    Here's the actual stack trace if you need it:
    Code:
    2012-03-30 10:32:55 [SEVERE] Could not pass event PlayerMoveEvent to Query
    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:209)
        at net.minecraft.server.Packet10Flying.handle(SourceFile:126)
        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:554)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:452)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:490)
    Caused by: java.lang.NullPointerException
        at com.github.thebiologist13.QueryPlayerMoveListener.onPlayerMove(QueryPlayerMoveListener.java:75)
        at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:301)
        ... 10 more
    Line 75 in my code is the same as line 35 in your code.

    Thanks!

    Never mind, I did a bit of tinkering with you code and got it to work. :D

    Here is what I did:
    Code:
    HashMap<Player, Boolean> enteredArea = new HashMap<Player, Boolean>();
     
    @EventHandler
    public void onPlayerMove(PlayerMoveEvent event) {
       
        player = event.getPlayer();
     
        HashMap<String, Integer> positions = new HashMap<String, Integer>();
     
        FileConfiguration yaml = YamlConfiguration.loadConfiguration(f);
                   
        positions = getPositions(f);
                   
        Location pos1 = new Location(player.getWorld(), positions.get("pos1x"), positions.get("pos1y"), positions.get("pos1z"));
        Location pos2 = new Location(player.getWorld(), positions.get("pos2x"), positions.get("pos2y"), positions.get("pos2z"));
                   
        if(isWithin(event.getTo(), pos1, pos2)) {
            enteredArea.put(player, true);
        } else if(!isWithin(event.getTo(), pos1, pos2)) {
            enteredArea.put(player, false);
        }
                   
        if(!isWithin(event.getFrom(), pos1, pos2) && enteredArea.get(player) && inWorld(f)) {
            player.sendMessage(ChatColor.DARK_PURPLE + "Enter Message"));
        } else if(isWithin(event.getFrom(), pos1, pos2) && !enteredArea.get(player) && inWorld(f)) {
            player.sendMessage(ChatColor.DARK_PURPLE + "Exit Message"));
        }
    }
    
    I made some of my own methods that load positions from yaml files, check if a coordinate is in an area, etc. I think their names are pretty self explanatory.

    Thanks for all of your help! :D

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 24, 2016
Thread Status:
Not open for further replies.

Share This Page