Inheritance: extends EntityEvent, implements pocketmine\event\Cancellable
コード例 #1
0
ファイル: FallingSand.php プロジェクト: iTXTech/Genisys
 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;
 }
コード例 #2
0
ファイル: FallingSand.php プロジェクト: sfpboomz/ImagicalMine
 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;
 }
コード例 #3
0
ファイル: FallingSand.php プロジェクト: rryy/PocketMine-MP
 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;
 }