public function onUpdate($currentTick) { if ($this->closed) { return false; } $this->timings->startTiming(); $tickDiff = $currentTick - $this->lastUpdate; if ($tickDiff <= 0 and !$this->justCreated) { return true; } $this->lastUpdate = $currentTick; $height = $this->fallDistance; $hasUpdate = $this->entityBaseTick($tickDiff); if ($this->isAlive()) { $pos = (new Vector3($this->x - 0.5, $this->y, $this->z - 0.5))->round(); if ($this->ticksLived === 1) { $block = $this->level->getBlock($pos); if ($block->getId() !== $this->blockId) { return true; } $this->level->setBlock($pos, Block::get(0), true); } $this->motionY -= $this->gravity; $this->move($this->motionX, $this->motionY, $this->motionZ); $friction = 1 - $this->drag; $this->motionX *= $friction; $this->motionY *= 1 - $this->drag; $this->motionZ *= $friction; $pos = (new Vector3($this->x - 0.5, $this->y, $this->z - 0.5))->round(); if ($this->onGround) { $this->kill(); $block = $this->level->getBlock($pos); if ($block->getId() > 0 and !$block->isSolid() and !$block instanceof Liquid) { $this->getLevel()->dropItem($this, ItemItem::get($this->getBlock(), $this->getDamage(), 1)); } else { if ($block instanceof SnowLayer) { $oldDamage = $block->getDamage(); $this->server->getPluginManager()->callEvent($ev = new EntityBlockChangeEvent($this, $block, Block::get($this->getBlock(), $this->getDamage() + $oldDamage))); } else { $this->server->getPluginManager()->callEvent($ev = new EntityBlockChangeEvent($this, $block, Block::get($this->getBlock(), $this->getDamage()))); } if (!$ev->isCancelled()) { $this->getLevel()->setBlock($pos, $ev->getTo(), true); if ($ev->getTo() instanceof Anvil) { $sound = new AnvilFallSound($this); $this->getLevel()->addSound($sound); foreach ($this->level->getNearbyEntities($this->boundingBox->grow(0.1, 0.1, 0.1), $this) as $entity) { $entity->scheduleUpdate(); if (!$entity->isAlive()) { continue; } if ($entity instanceof Living) { $damage = ($height - 1) * 2; if ($damage > 40) { $damage = 40; } $ev = new EntityDamageByEntityEvent($this, $entity, EntityDamageByEntityEvent::CAUSE_FALL, $damage, 0.1); $entity->attack($damage, $ev); } } } } } $hasUpdate = true; } $this->updateMovement(); } return $hasUpdate or !$this->onGround or abs($this->motionX) > 1.0E-5 or abs($this->motionY) > 1.0E-5 or abs($this->motionZ) > 1.0E-5; }
public function onUpdate($currentTick) { if ($this->closed) { return false; } $this->timings->startTiming(); $tickDiff = $currentTick - $this->lastUpdate; if ($tickDiff <= 0 and !$this->justCreated) { return true; } $this->lastUpdate = $currentTick; $hasUpdate = $this->entityBaseTick($tickDiff); if ($this->isAlive()) { $pos = (new Vector3($this->x - 0.5, $this->y, $this->z - 0.5))->round(); if ($this->ticksLived === 1) { $block = $this->level->getBlock($pos); if ($block->getId() !== $this->blockId) { $this->kill(); return true; } $this->level->setBlock($pos, Block::get(0), true); } $this->motionY -= $this->gravity; $this->move($this->motionX, $this->motionY, $this->motionZ); $friction = 1 - $this->drag; $this->motionX *= $friction; $this->motionY *= 1 - $this->drag; $this->motionZ *= $friction; $pos = (new Vector3($this->x - 0.5, $this->y, $this->z - 0.5))->floor(); if ($this->onGround) { $this->kill(); $block = $this->level->getBlock($pos); if ($block->getId() > 0 and !$block->isSolid() and !$block instanceof Liquid) { $this->getLevel()->dropItem($this, ItemItem::get($this->getBlock(), $this->getDamage(), 1)); } else { $this->server->getPluginManager()->callEvent($ev = new EntityBlockChangeEvent($this, $block, Block::get($this->getBlock(), $this->getDamage()))); if (!$ev->isCancelled()) { $this->getLevel()->setBlock($pos, $ev->getTo(), true); } } $hasUpdate = true; } $this->updateMovement(); } return $hasUpdate or !$this->onGround or abs($this->motionX) > 1.0E-5 or abs($this->motionY) > 1.0E-5 or abs($this->motionZ) > 1.0E-5; }
public function onUpdate($currentTick) { if ($this->closed) { return false; } $this->timings->startTiming(); $tickDiff = max(1, $currentTick - $this->lastUpdate); $this->lastUpdate = $currentTick; $hasUpdate = $this->entityBaseTick($tickDiff); if (!$this->dead) { if ($this->ticksLived === 1) { $block = $this->level->getBlock($pos = (new Vector3($this->x, $this->y, $this->z))->floor()); if ($block->getId() != $this->blockId) { $this->kill(); return true; } $this->level->setBlock($pos, Block::get(0), true); } $this->motionY -= $this->gravity; $this->move($this->motionX, $this->motionY, $this->motionZ); $friction = 1 - $this->drag; $this->motionX *= $friction; $this->motionY *= 1 - $this->drag; $this->motionZ *= $friction; $pos = (new Vector3($this->x, $this->y, $this->z))->floor(); if ($this->onGround) { $this->kill(); $block = $this->level->getBlock($pos); if (!$block->isFullBlock) { $this->getLevel()->dropItem($this, ItemItem::get($this->getBlock(), $this->getDamage(), 1)); } else { $this->server->getPluginManager()->callEvent($ev = new EntityBlockChangeEvent($this, $block, Block::get($this->getBlock(), $this->getDamage()))); if (!$ev->isCancelled()) { $this->getLevel()->setBlock($pos, $ev->getTo(), true); } } $hasUpdate = true; } $this->updateMovement(); } return $hasUpdate or !$this->onGround or $this->motionX != 0 or $this->motionY != 0 or $this->motionZ != 0; }