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
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.
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); } } } } }
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 =.
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...
Right, but you can't just slap that in there willy nilly, you use boolean logic (AKA if statements) to evaluate that...
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html You need to know Java if you want to use a Java API.
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?