/** * Set the Vanish mode on or off * * @param Player $player * @param bool $state * @param bool $noPacket * @return bool */ public function setVanish(Player $player, $state, $noPacket = false) { if (!is_bool($state)) { return false; } if ($this->invisibilityEffect === null) { $effect = new Effect(Effect::INVISIBILITY, "Vanish", 127, 131, 146); $effect->setDuration(1728000); // 24 hours... Well... No one will play more than this, so I think its OK xD $this->invisibilityEffect = $effect; } $this->getServer()->getPluginManager()->callEvent($ev = new PlayerVanishEvent($this, $player, $state, $noPacket)); if ($ev->isCancelled()) { return false; } $state = $ev->willVanish(); $player->setDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_INVISIBLE, $state); $player->setDataProperty(Entity::DATA_SHOW_NAMETAG, Entity::DATA_TYPE_BYTE, $state ? 0 : 1); /** @var Player[] $pl */ $pl = []; foreach ($player->getLevel()->getPlayers() as $p) { if ($state || !$state && !in_array($p->getName(), $ev->getHiddenFor())) { $pl[] = $p; } } $noPacket = $ev->noPacket(); if ($this->isVanished($player) && $ev->noPacket() !== ($priority = $this->hasNoPacket($player))) { $noPacket = $priority; } if (!$noPacket) { if (!$state) { $pk = new MobEffectPacket(); $pk->eid = $player->getId(); $pk->eventId = MobEffectPacket::EVENT_REMOVE; $pk->effectId = $this->invisibilityEffect->getId(); } else { $pk = new MobEffectPacket(); $pk->eid = $player->getId(); $pk->effectId = $this->invisibilityEffect->getId(); $pk->amplifier = $this->invisibilityEffect->getAmplifier(); $pk->particles = $this->invisibilityEffect->isVisible(); $pk->duration = $this->invisibilityEffect->getDuration(); $pk->eventId = MobEffectPacket::EVENT_ADD; } $this->getServer()->broadcastPacket($pl, $pk); } else { if (!$state) { foreach ($pl as $p) { $p->showPlayer($player); } } else { foreach ($pl as $p) { $p->hidePlayer($player); } } } $this->getSession($player)->setVanish($state, !$state ? $ev->noPacket() : $noPacket); return true; }