Making a Player Visibility Plugin

Discussion in 'Plugin Development' started by Camaflicks, Jul 13, 2014.

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

    Camaflicks

    Hey guys! I am developing a plugin for the new server, Potatocraft. Right now I have implemented everything I want to, except for a player visibility plugin, like the one on theHive or Mineplex.

    What happens is simple: It displays the wrong message each and every time. Here is my code:

    Code:java
    1. package com.invictuspvp.PotatoVanish;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.List;
    5.  
    6. import org.bukkit.Bukkit;
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.Material;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.event.EventHandler;
    11. import org.bukkit.event.Listener;
    12. import org.bukkit.event.block.Action;
    13. import org.bukkit.event.inventory.InventoryClickEvent;
    14. import org.bukkit.event.player.PlayerInteractEvent;
    15. import org.bukkit.event.player.PlayerJoinEvent;
    16. import org.bukkit.event.player.PlayerQuitEvent;
    17. import org.bukkit.inventory.ItemStack;
    18. import org.bukkit.inventory.PlayerInventory;
    19. import org.bukkit.inventory.meta.ItemMeta;
    20. import org.bukkit.plugin.java.JavaPlugin;
    21.  
    22. public class PotatoVanish extends JavaPlugin implements Listener {
    23.  
    24. public ArrayList<String> cooldown = new ArrayList<>();
    25. //List for hiding players
    26. ArrayList<String> players = new ArrayList<String>();
    27.  
    28. public void onEnable() {
    29. getServer().getPluginManager().registerEvents(this, this);
    30. }
    31.  
    32. public void onInventoryClick(InventoryClickEvent event) {
    33. event.setCancelled(true);
    34. }
    35.  
    36. //Removing player from list
    37. public void onQuitEvent(PlayerQuitEvent event) {
    38. Player player = event.getPlayer();
    39. players.remove(player.getName());
    40. }
    41.  
    42. //Adding people to the list and giving them spawn items
    43. @EventHandler
    44. public void onPlayerJoin(PlayerJoinEvent event) {
    45. Player player = event.getPlayer();
    46. PlayerInventory inv = player.getInventory();
    47. players.add(player.getName());
    48.  
    49. ItemStack enable = new ItemStack(Material.INK_SACK, 1, (short) 10);
    50. ItemMeta enableMeta = (ItemMeta) enable.getItemMeta();
    51. enableMeta.setDisplayName(ChatColor.GREEN + "Players >> Enabled");
    52. List<String> enableList = new ArrayList<String>();
    53. enableList.add(ChatColor.WHITE + "Right click to enable to disable player visability");
    54. enableMeta.setLore(enableList);
    55. enable.setItemMeta(enableMeta);
    56.  
    57. // Just here for testing
    58. inv.setItem(8, enable);
    59. }
    60.  
    61. //Visibility Dye
    62. @EventHandler
    63. public void onPlayerClickEvent(PlayerInteractEvent event) {
    64.  
    65. final Player player = event.getPlayer();
    66.  
    67. ItemStack enable = new ItemStack(Material.INK_SACK, 1, (short) 10);
    68. ItemMeta enableMeta = (ItemMeta) enable.getItemMeta();
    69. enableMeta.setDisplayName(ChatColor.GREEN + "Players >> Enabled");
    70. List<String> enableList = new ArrayList<String>();
    71. enableList.add(ChatColor.WHITE + "Right click disable player visability");
    72. enableMeta.setLore(enableList);
    73. enable.setItemMeta(enableMeta);
    74.  
    75. ItemStack disable = new ItemStack(Material.INK_SACK, 1, (short) 8);;
    76. ItemMeta disableMeta = (ItemMeta) disable.getItemMeta();
    77. disableMeta.setDisplayName(ChatColor.RED + "Players >> Disabled");
    78. List<String> disableList = new ArrayList<String>();
    79. disableList.add(ChatColor.WHITE + "Right click to enable player visability");
    80. disableMeta.setLore(disableList);
    81. disable.setItemMeta(disableMeta);
    82.  
    83. if(player.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.GREEN + "Players >> Enabled")){
    84. if (cooldown.contains(player)) {
    85. player.sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "Visibility" + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY + "Please wait " + ChatColor.YELLOW +"5 seconds " + ChatColor.GRAY + "to toggled players visibility: " + ChatColor.GREEN + "On");
    86. event.setCancelled(true);
    87. } else {
    88. if(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) || event.getAction().equals(Action.RIGHT_CLICK_AIR)){
    89. if(this.players.contains(event.getPlayer().getName())){
    90. for(Player targetPlayers : Bukkit.getOnlinePlayers()){
    91. if(player.canSee(targetPlayers)){
    92. player.hidePlayer(targetPlayers);
    93. } else{
    94. event.setCancelled(true);
    95. }
    96. this.players.add(player.getName());
    97. }
    98. player.getInventory().removeItem(enable);
    99. player.setItemInHand(disable);
    100. player.sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "Visibility" + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY + "You have toggled players visibility: " + ChatColor.GREEN + "On");
    101. cooldown.add(player.getName());
    102. Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
    103. public void run() {
    104. cooldown.remove(player.getName());
    105. }
    106. }, 100);
    107. return;
    108. }
    109. }
    110. }
    111. }
    112. if(player.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.RED + "Players >> Disabled")){
    113. if (cooldown.contains(player)) {
    114. player.sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "Visibility" + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY + "Please wait " + ChatColor.YELLOW +"5 seconds " + ChatColor.GRAY + "to toggled players visibility: " + ChatColor.RED + "Off");
    115. event.setCancelled(true);
    116. } else {
    117. if(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) || event.getAction().equals(Action.RIGHT_CLICK_AIR)){
    118. if(this.players.contains(event.getPlayer().getName())){
    119. for(Player targetPlayers : Bukkit.getOnlinePlayers()){
    120. if(player.canSee(targetPlayers)){
    121. event.setCancelled(true);
    122. } else {
    123. player.showPlayer(targetPlayers);
    124. }
    125. this.players.remove(player.getName());
    126. }
    127. }
    128. player.getInventory().removeItem(disable);
    129. player.setItemInHand(enable);
    130. player.sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "Visibility" + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY + "You have toggled players visibility: " + ChatColor.RED + "Off");
    131. cooldown.add(player.getName());
    132. Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
    133. public void run() {
    134. cooldown.remove(player.getName());
    135. }
    136. }, 100);
    137. return;
    138. }
    139. }
    140. }
    141. }
    142.  
    143. }


    And here is an image of what happens:

    [​IMG]

    [​IMG]

    Also, the player disappears at the correct time, but the chat is always incorrect. I also tried changing the messages in the code. Didn't work. I tried flipping around the enable and disable items at the bottom of the code. Didn't work.

    Thanks for reading this guys! It would be great if you could help by just giving me the fixied code or telling me where my mistake is. I did most of it :( It wouldn't really be spoon feeding.
     
    GrandmaJam likes this.
  2. Offline

    sgtcaze

    I cleaned up all your code for readability and to ensure you use better programming practices.

    Quick notes:

    1) Changed all "this.object" to "object". "this" is unnecessary in this case.
    2) I moved your item-stacks to the onEnable method so they are not recreated every time one of the events is fired
    3) I switched your cooldown method from a scheduler to comparing system time
    4) I put in the missing @EventHandler annotations
    5) Used == instead of .equals for the enums
    6) Cleaned up your events in general

    With that in mind it should help you out.

    Code:
        ItemStack enable, disabled;
     
        HashMap<UUID, Long> tracker = new HashMap<>();
        ArrayList<String> players = new ArrayList<String>();
     
        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
     
            enable = new ItemStack(Material.INK_SACK, 1, (short) 10);
            ItemMeta enableMeta = (ItemMeta) enable.getItemMeta();
            enableMeta.setDisplayName(ChatColor.GREEN + "Players >> Enabled");
            enableMeta.setLore(Arrays.asList(ChatColor.WHITE
                    + "Right click to enable to disable player visability"));
            enable.setItemMeta(enableMeta);
     
            disabled = new ItemStack(Material.INK_SACK, 1, (short) 8);
            ItemMeta disableMeta = (ItemMeta) disabled.getItemMeta();
            disableMeta.setDisplayName(ChatColor.RED + "Players >> Disabled");
            disableMeta.setLore(Arrays.asList(ChatColor.WHITE
                    + "Right click to enable player visability"));
            disabled.setItemMeta(disableMeta);
        }
     
        @EventHandler
        public void onInventoryClick(InventoryClickEvent event) {
            event.setCancelled(true);
        }
     
        @EventHandler
        public void onQuitEvent(PlayerQuitEvent event) {
            Player player = event.getPlayer();
            if (players.contains(player.getName())) {
                players.remove(player.getName());
            }
        }
     
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
     
            if (players.contains(player.getName())) {
                players.add(player.getName());
            }
     
            player.getInventory().setItem(8, enable);
        }
     
        public boolean canReuse(Player p, HashMap<UUID, Long> map, int seconds) {
     
            UUID uuid = p.getUniqueId();
     
            if (map.containsKey(uuid)) {
                long diff = (System.currentTimeMillis() - map.get(uuid)) / 1000;
                if (diff < seconds) {
                    p.sendMessage("Cooldown remaining (seconds): §e"
                            + (seconds - diff));
                    return false;
                } else {
                    map.remove(uuid);
                }
            } else {
                map.put(uuid, System.currentTimeMillis());
            }
            return true;
        }
     
        @SuppressWarnings("deprecation")
        @EventHandler
        public void onPlayerClickEvent(PlayerInteractEvent event) {
     
            Player player = event.getPlayer();
            ItemStack item = player.getItemInHand();
     
            if (event.getAction() == Action.RIGHT_CLICK_BLOCK
                    || event.getAction() == Action.RIGHT_CLICK_AIR) {
                if (item.getItemMeta().getDisplayName()
                        .equalsIgnoreCase(ChatColor.GREEN + "Players >> Enabled")) {
     
                    if (canReuse(player, tracker, 30)) {
                        if (players.contains(player.getName())) {
                            for (Player targetPlayers : Bukkit.getOnlinePlayers()) {
                                if (player.canSee(targetPlayers)) {
                                    player.hidePlayer(targetPlayers);
                                }
                                players.add(player.getName());
                            }
                            player.getInventory().removeItem(enable);
                            player.setItemInHand(disabled);
                            player.sendMessage(ChatColor.DARK_GRAY + "["
                                    + ChatColor.YELLOW + "Visibility"
                                    + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY
                                    + "You have toggled players visibility: "
                                    + ChatColor.GREEN + "On");
                        }
                    }
                } else if (item.getItemMeta().getDisplayName()
                        .equalsIgnoreCase(ChatColor.RED + "Players >> Disabled")) {
                    if (canReuse(player, tracker, 30)) {
                        if (players.contains(event.getPlayer().getName())) {
                            for (Player targetPlayers : Bukkit.getOnlinePlayers()) {
                                if (player.canSee(targetPlayers)) {
                                    event.setCancelled(true);
                                } else {
                                    player.showPlayer(targetPlayers);
                                }
                                players.remove(player.getName());
                            }
                        }
                        player.getInventory().removeItem(disabled);
                        player.setItemInHand(enable);
                        player.sendMessage(ChatColor.DARK_GRAY + "["
                                + ChatColor.YELLOW + "Visibility"
                                + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY
                                + "You have toggled players visibility: "
                                + ChatColor.RED + "Off");
                    }
                }
            }
        }
     
    GrandmaJam likes this.
  3. Offline

    Camaflicks

    sgtcaze Question: Do I remove all my code inside my public class and just replace it with the code you gave me? So it would be like this:
    Code:java
    1. package com.invictuspvp.PotatoVanish;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.HashMap;
    6. import java.util.UUID;
    7.  
    8. import org.bukkit.Bukkit;
    9. import org.bukkit.ChatColor;
    10. import org.bukkit.Material;
    11. import org.bukkit.entity.Player;
    12. import org.bukkit.event.EventHandler;
    13. import org.bukkit.event.Listener;
    14. import org.bukkit.event.block.Action;
    15. import org.bukkit.event.inventory.InventoryClickEvent;
    16. import org.bukkit.event.player.PlayerInteractEvent;
    17. import org.bukkit.event.player.PlayerJoinEvent;
    18. import org.bukkit.event.player.PlayerQuitEvent;
    19. import org.bukkit.inventory.ItemStack;
    20. import org.bukkit.inventory.meta.ItemMeta;
    21. import org.bukkit.plugin.java.JavaPlugin;
    22.  
    23. public class PotatoVanish extends JavaPlugin implements Listener {
    24.  
    25. ItemStack enable, disabled;
    26.  
    27. HashMap<UUID, Long> tracker = new HashMap<>();
    28. ArrayList<String> players = new ArrayList<String>();
    29.  
    30. public void onEnable() {
    31. getServer().getPluginManager().registerEvents(this, this);
    32.  
    33. enable = new ItemStack(Material.INK_SACK, 1, (short) 10);
    34. ItemMeta enableMeta = (ItemMeta) enable.getItemMeta();
    35. enableMeta.setDisplayName(ChatColor.GREEN + "Players >> Enabled");
    36. enableMeta.setLore(Arrays.asList(ChatColor.WHITE
    37. + "Right click to disable player visability"));
    38. enable.setItemMeta(enableMeta);
    39.  
    40. disabled = new ItemStack(Material.INK_SACK, 1, (short) 8);
    41. ItemMeta disableMeta = (ItemMeta) disabled.getItemMeta();
    42. disableMeta.setDisplayName(ChatColor.RED + "Players >> Disabled");
    43. disableMeta.setLore(Arrays.asList(ChatColor.WHITE
    44. + "Right click to enable player visability"));
    45. disabled.setItemMeta(disableMeta);
    46. }
    47.  
    48. @EventHandler
    49. public void onInventoryClick(InventoryClickEvent event) {
    50. event.setCancelled(true);
    51. }
    52.  
    53. @EventHandler
    54. public void onQuitEvent(PlayerQuitEvent event) {
    55. Player player = event.getPlayer();
    56. if (players.contains(player.getName())) {
    57. players.remove(player.getName());
    58. }
    59. }
    60.  
    61. @EventHandler
    62. public void onPlayerJoin(PlayerJoinEvent event) {
    63. Player player = event.getPlayer();
    64.  
    65. if (players.contains(player.getName())) {
    66. players.add(player.getName());
    67. }
    68.  
    69. player.getInventory().setItem(8, enable);
    70. }
    71.  
    72. public boolean canReuse(Player p, HashMap<UUID, Long> map, int seconds) {
    73.  
    74. UUID uuid = p.getUniqueId();
    75.  
    76. if (map.containsKey(uuid)) {
    77. long diff = (System.currentTimeMillis() - map.get(uuid)) / 1000;
    78. if (diff < seconds) {
    79. p.sendMessage("Cooldown remaining (seconds): §e"
    80. + (seconds - diff));
    81. return false;
    82. } else {
    83. map.remove(uuid);
    84. }
    85. } else {
    86. map.put(uuid, System.currentTimeMillis());
    87. }
    88. return true;
    89. }
    90.  
    91. @SuppressWarnings("deprecation")
    92. @EventHandler
    93. public void onPlayerClickEvent(PlayerInteractEvent event) {
    94.  
    95. Player player = event.getPlayer();
    96. ItemStack item = player.getItemInHand();
    97.  
    98. if (event.getAction() == Action.RIGHT_CLICK_BLOCK
    99. || event.getAction() == Action.RIGHT_CLICK_AIR) {
    100. if (item.getItemMeta().getDisplayName()
    101. .equalsIgnoreCase(ChatColor.GREEN + "Players >> Enabled")) {
    102.  
    103. if (canReuse(player, tracker, 5)) {
    104. if (players.contains(player.getName())) {
    105. for (Player targetPlayers : Bukkit.getOnlinePlayers()) {
    106. if (player.canSee(targetPlayers)) {
    107. player.hidePlayer(targetPlayers);
    108. }
    109. players.add(player.getName());
    110. }
    111. player.getInventory().removeItem(enable);
    112. player.setItemInHand(disabled);
    113. player.sendMessage(ChatColor.DARK_GRAY + "["
    114. + ChatColor.YELLOW + "Visibility"
    115. + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY
    116. + "You have toggled players visibility: "
    117. + ChatColor.GREEN + "On");
    118. }
    119. }
    120. } else if (item.getItemMeta().getDisplayName()
    121. .equalsIgnoreCase(ChatColor.RED + "Players >> Disabled")) {
    122. if (canReuse(player, tracker, 5)) {
    123. if (players.contains(event.getPlayer().getName())) {
    124. for (Player targetPlayers : Bukkit.getOnlinePlayers()) {
    125. if (player.canSee(targetPlayers)) {
    126. event.setCancelled(true);
    127. } else {
    128. player.showPlayer(targetPlayers);
    129. }
    130. players.remove(player.getName());
    131. }
    132. }
    133. player.getInventory().removeItem(disabled);
    134. player.setItemInHand(enable);
    135. player.sendMessage(ChatColor.DARK_GRAY + "["
    136. + ChatColor.YELLOW + "Visibility"
    137. + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY
    138. + "You have toggled players visibility: "
    139. + ChatColor.RED + "Off");
    140. }
    141. }
    142. }
    143. }
    144.  
    145. }
    146.  


    Because this doesn't work. At all.
     
  4. Offline

    sgtcaze

    Well, if you read through what I posted I made a simple mistake. PlayerJoinEvent should look like:

    Code:
    @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
     
            if (!players.contains(player.getName())) {
                players.add(player.getName());
            }
     
            player.getInventory().setItem(8, enable);
        }
    Remember the code always does what you tell it to. One character like that can throw everything off.
     
    GrandmaJam likes this.
  5. Offline

    Camaflicks

    sgtcaze Ok well that worked, but now it is doing the same thing as my original issue. What is going on that it is mixed and matched like in the pictures?!
     
  6. Offline

    Camaflicks

  7. Offline

    cosmicARTS

    bump (this is my new account)
     
  8. Offline

    Synapz

    cosmicARTS
    Did you export it right into the plugins folder? Sometimes it is a simple mistake like this you aren't seeing. If it wasn't exported correctly it can still be using the non-fixed version.
     
  9. Offline

    cosmicARTS

    No... but I fixed it already. I made a sperate thread. Thanks for trying to help tho!
    Kudos to you!
     
  10. Offline

    Adoma_

    Look, Im gonna make it simple. Just give then invisibity xx:xx and canel the bubble effects. That should work :)
     
    GrandmaJam likes this.
Thread Status:
Not open for further replies.

Share This Page