Handle InventoryTransactionEvent. If one of the transactions involves that certain slot, cancel event.
I personally recommend @PEMapModder 's theory but here is something you could also use... PHP: public function onHeld(PlayerItemHeldEvent $event){ $cfg = $this->getConfig(); $player = $event->getPlayer(); $hidetask = new PlayerHideTask($this, $player); $item = $event->getItem()->getId(); switch($item){ case $cfg->get("HidePlayers-Item"): $this->task = $this->getServer()->getScheduler()->scheduleRepeatingTask($hidetask, 20); $player->sendPopup(TextFormat::YELLOW . $cfg->get("HidePlayer-Message")); $event->setCancelled(true); break; case $cfg->get("ShowPlayers-Item"): $this->getServer()->getScheduler()->cancelTask($this->task->getTaskId()); foreach ($this->getServer()->getOnlinePlayers() as $onl){ $player->showPlayer($onl); $player->sendPopup(TextFormat::GREEN . $cfg->get("ShowPlayer-Message")); $event->setCancelled(true); } break; } }} Code: $event->setCancelled(true); Cancels the 'PlayerItemHeldEvent $event' so the item get's placed back to where it was in the Inventory.