setCritical($critical); } public function isCritical() : bool{ return $this->getGenericFlag(self::DATA_FLAG_CRITICAL); } public function setCritical(bool $value = true){ $this->setGenericFlag(self::DATA_FLAG_CRITICAL, $value); } public function getResultDamage() : int{ $base = parent::getResultDamage(); if($this->isCritical()){ return ($base + mt_rand(0, (int) ($base / 2) + 1)); }else{ return $base; } } public function entityBaseTick(int $tickDiff = 1) : bool{ if($this->closed){ return false; } $hasUpdate = parent::entityBaseTick($tickDiff); if($this->age > 1200){ $this->flagForDespawn(); $hasUpdate = true; } return $hasUpdate; } protected function onHit(ProjectileHitEvent $event) : void{ $this->setCritical(false); $this->level->broadcastLevelSoundEvent($this, LevelSoundEventPacket::SOUND_BOW_HIT); } protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{ parent::onHitBlock($blockHit, $hitResult); $this->broadcastEntityEvent(EntityEventPacket::ARROW_SHAKE, 7); //7 ticks } public function onCollideWithPlayer(Player $player){ if($this->blockHit === null){ return; } $item = ItemFactory::get(Item::ARROW, 0, 1); $playerInventory = $player->getInventory(); if($player->isSurvival() and !$playerInventory->canAddItem($item)){ return; } $this->server->getPluginManager()->callEvent($ev = new InventoryPickupArrowEvent($playerInventory, $this)); if($ev->isCancelled()){ return; } $pk = new TakeItemEntityPacket(); $pk->eid = $player->getId(); $pk->target = $this->getId(); $this->server->broadcastPacket($this->getViewers(), $pk); $playerInventory->addItem(clone $item); $this->flagForDespawn(); } }