PlayerHider

Discussion in 'Plugin Development' started by max12345, Jan 3, 2018.

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

    max12345

    Hi,

    I'm trying to code a PlayerHider for my LobbyPlugin.

    I have two versions tried:
    Version 1: ONE ITEM LISTENED (ONLY ONE WAY) - working, item is set to stick
    Code:
    package me.max.lobbysystem.listener;
    
    import java.util.ArrayList;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    
    import me.max.lobbysystem.Main;
    import me.max.lobbysystem.utils.Items;
    
    public class InteractListener implements Listener {
       
        public static ArrayList<Player> players = new ArrayList<>();
       
        @SuppressWarnings("deprecation")
        @EventHandler
        public void onInteract(PlayerInteractEvent e) {
           
            Player p = e.getPlayer();
           
    
               
                if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR)) {
                   
                    if(p.getItemInHand().getItemMeta().getDisplayName().equals("§6Spieler ausblenden")) {
                       
                        if(p.hasPermission("lobbysystem.hide")) {
                           
                            for(Player all : Bukkit.getOnlinePlayers()) {
                               
                                p.hidePlayer(all);
                                all.hidePlayer(p);
                                players.add(p);
                               
                            }
                           
                            p.getInventory().setItem(2, Items.createItem(Material.STICK, 0, "§6Spieler einblenden"));
                            p.sendMessage(Main.prefix + "§aDu hast alle Spieler versteckt!");
                           
                        } else {
                       
                            p.sendMessage(Main.np);
                           
                        }
    
                    }   
    
            }   
    
        }   
    }
    Version 2: (TWO ITEMS ARE LISTENED) - not working, see video.
    Code:
    package me.max.lobbysystem.listener;
    
    import java.util.ArrayList;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    
    import me.max.lobbysystem.Main;
    import me.max.lobbysystem.utils.Items;
    
    public class InteractListener implements Listener {
       
        public static ArrayList<Player> players = new ArrayList<>();
       
        @SuppressWarnings("deprecation")
        @EventHandler
        public void onInteract(PlayerInteractEvent e) {
           
            Player p = e.getPlayer();
           
    
               
                if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR)) {
                   
                    if(p.getItemInHand().getItemMeta().getDisplayName().equals("§6Spieler ausblenden")) {
                       
                        if(p.hasPermission("lobbysystem.hide")) {
                           
                            for(Player all : Bukkit.getOnlinePlayers()) {
                               
                                p.hidePlayer(all);
                                all.hidePlayer(p);
                                players.add(p);
                               
                            }
                           
                            p.getInventory().setItem(2, Items.createItem(Material.STICK, 0, "§6Spieler einblenden"));
                            p.sendMessage(Main.prefix + "§aDu hast alle Spieler versteckt!");
                           
                        } else {
                       
                            p.sendMessage(Main.np);
                           
                        }
                } else if(p.getItemInHand().getItemMeta().getDisplayName().equals("§6Spieler einblenden")) {
                       
                        if(p.hasPermission("lobbysystem.hide")) {
                           
                            for(Player all : Bukkit.getOnlinePlayers()) {
                               
                                p.showPlayer(all);
                                all.showPlayer(p);
                                players.remove(p);
                               
                            }
                           
                            p.getInventory().setItem(2, Items.createItem(Material.BLAZE_ROD, 0, "§6Spieler ausblenden"));
                            p.sendMessage(Main.prefix + "§aDu siehst nun wieder alle Spieler!");
                           
                        } else {
                       
                            p.sendMessage(Main.noPermission);
                           
                        }
    
                    }   
                   
    
            }   
    
        }   
    }
    Trying this version i get 4 messages, Player Hided, Player Shown, Player Hided, Player show. Here's a video:
    https://workupload.com/file/gLPLtAQ, please don't delete the link, i can't upload the video here (too big).
    Using Windows you have to choose Windows Media Player and not Films & TV as program...

    I hope you can help me ;)
     
  2. Offline

    ipodtouch0218

    Don't use an ArrayList of <Player>, as it can cause memory leaks. Use the player's UUID instead. The ArrayList also doesn't have to be static.

    You problem is that the PlayerInteractEvent is called twice with the introduction of 1.9: one for the main hand, one for the off-hand. You must check for e.getHand() == EquipmentSlot.HAND before running any other code if you only want it to run once.
     
  3. Offline

    max12345

    Thanks,
    but i get 2 errors:
    The left-hand side of an assignment must be a variable

    and

    Syntax error on token "==", invalid AssignmentOperator

    The code:
    Code:
    public class InteractListener implements Listener {
          
        public ArrayList<UUID> players = new ArrayList<>();
      
        @SuppressWarnings("deprecation")
        @EventHandler
        public void onInteract(PlayerInteractEvent e) {
          
            Player p = e.getPlayer();
            UUID u = p.getUniqueId();
          
    
              
                if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR)) {
                    e.getHand() == EquipmentSlot.HAND
                    if(p.getItemInHand().getItemMeta().getDisplayName().equals("§6Spieler ausblenden")) {
                      
                        if(p.hasPermission("lobbysystem.hide")) {
                          
                            for(Player all : Bukkit.getOnlinePlayers()) {
                              
                                p.hidePlayer(all);
                                all.hidePlayer(p);
                                players.add(u);
                              
                            }
                          
                            p.getInventory().setItem(2, Items.createItem(Material.STICK, 0, "§6Spieler einblenden"));
                            p.sendMessage(Main.prefix + "§aDu hast alle Spieler versteckt!");
                            e.getHand() == EquipmentSlot.HAND
                          
                          
                        } else {
                      
                            p.sendMessage(Main.np);
                          
                        }
                } else if(p.getItemInHand().getItemMeta().getDisplayName().equals("§6Spieler einblenden")) {
                      
                        if(p.hasPermission("lobbysystem.hide")) {
                          
                            for(Player all : Bukkit.getOnlinePlayers()) {
                              
                                p.showPlayer(all);
                                all.showPlayer(p);
                                players.remove(u);
                              
                            }
                          
                            p.getInventory().setItem(2, Items.createItem(Material.BLAZE_ROD, 0, "§6Spieler ausblenden"));
                            p.sendMessage(Main.prefix + "§aDu siehst nun wieder alle Spieler!");
                          
                        } else {
                      
                            p.sendMessage(Main.noPermission);
                          
                        }
    
                    }  
                  
    
            }  
    
        }  
    }
     
    Last edited by a moderator: Jan 4, 2018
  4. Offline

    nullYoung

    ArrayList must have same content in reference and in imstance. And == is used for compare two values and maybe you want use it for assign some values. You have to use =.
     
  5. Offline

    max12345

    What do you mean? I have the uuid in the definition of the Array List and also write a uuid in.

    I've removed it (again) but the error "assignment of the left handside must be a variable" is still there...
     
  6. Offline

    Drkmaster83

    What are you doing with this??
    Code:
    e.getHand() == EquipmentSlot.HAND
     
  7. Offline

    max12345

    This ...
     
  8. Offline

    Drkmaster83

    Right, but you can't just slap that in there willy nilly, you use boolean logic (AKA if statements) to evaluate that...
     
  9. Offline

    Horsey

  10. Offline

    max12345

    I know the if statemets ;), but i was a bit confused yesterday.

    Now it works, but when a player joins he's "visible". How can i solve this when i use the UUID as you said and not the "normal Player" in a array list?
     
  11. Offline

    Horsey

    Using a Player is fine. Just remove the Player from the arraylist in the PlayerQuitEvent.
     
Thread Status:
Not open for further replies.

Share This Page