Hi! I'm new to writting plugins and I wanted to write Vanish like plugin. I have a problem with PlayerItemPickupEvent, becouse i wanted to make vanished players not to pick up items, but it isn't working. Thanks for your help. W7 x64 Java SE 1.8 Main file: Code: package me.pitrzu.adminhelper; import org.bukkit.plugin.java.JavaPlugin; public class Main extends JavaPlugin{ public void onEnable() { System.out.println("Uruchamiam..."); getCommand("tp").setExecutor(new teleport()); getCommand("tphere").setExecutor(new teleport()); getCommand("hide").setExecutor(new vanish()); getCommand("hideme").setExecutor(new vanish()); getServer().getPluginManager().registerEvents(new vanish(), this); } public void onDisable() { System.out.println("Wylaczam..."); } } Vanish file: Code: package me.pitrzu.adminhelper; import java.util.ArrayList; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; public class vanish implements CommandExecutor, Listener { public ArrayList<Player> hide = new ArrayList<Player>(); public ArrayList<Player> hidden = new ArrayList<Player>(); @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if(cmd.getName().equalsIgnoreCase("hide")) { if(!(sender instanceof Player)) { sender.sendMessage("Nie jestes graczem !"); return true; } if(args.length != 0) { return false; } if(!(hide.contains((Player) sender))) { hide.add((Player) sender); sender.sendMessage("Nie widzisz innych graczy!"); for(Player p : Bukkit.getOnlinePlayers()) { ((Player)sender).hidePlayer(p); } return true; } else { hide.remove((Player) sender); sender.sendMessage("Widzisz wszystkich graczy!"); for(Player p : Bukkit.getOnlinePlayers()) { ((Player)sender).showPlayer(p); } return true; } } if(cmd.getName().equalsIgnoreCase("hideme")) { if(!(sender instanceof Player)) { sender.sendMessage("Nie jestes graczem !"); return true; } if(args.length != 0) { return false; } if(!(hidden.contains((Player) sender))) { hidden.add((Player) sender); sender.sendMessage("Inni gracze cie nie widza!"); for(Player p : Bukkit.getOnlinePlayers()) { p.hidePlayer(((Player)sender)); } return true; } else { hidden.remove((Player) sender); sender.sendMessage("Inni gracze cie widza!"); for(Player p : Bukkit.getOnlinePlayers()) { p.showPlayer(((Player)sender)); } return true; } } return false; } @EventHandler public void onConnection(PlayerJoinEvent e) { for(Player p : hidden) { e.getPlayer().hidePlayer(p); } } public void onLeave(PlayerQuitEvent e) { hidden.remove(e.getPlayer()); } public void onPickup(PlayerPickupItemEvent e) { if(hidden.contains(e.getPlayer())){ e.setCancelled(true); } } }
It's still not working but i know that it can detect event happening @EventHandler public void onConnection(PlayerJoinEvent e) { for(Player p : hidden) { e.getPlayer().hidePlayer(p); } } @EventHandler public void onLeave(PlayerQuitEvent e) { hidden.remove(e.getPlayer()); } @EventHandler public void onPickup(PlayerPickupItemEvent e) { e.getPlayer().sendMessage("e"); if(hidden.contains(e.getPlayer())){ // Breaks after this line e.getPlayer().sendMessage("e"); e.setCancelled(true); } }
What are you trying to do? If you want to create a spectator mode, there would be bugs with your setup because you could not place plocks where a spectator is. If you want to do that, you should set the player "transparent" like this: Code: p.spigot().setCollidesWithEntities(false); The player would firstly not collide with entities and players can place plocks through / inside them. Secondly arrows could pass him and he is not able to pick up items. Of course you would still have to cancel interact and damage events. EDIT: Please write class names in CamelCase so it is easier to read