diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 62151c67f..527de1920 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -877,7 +877,7 @@ abstract class Entity extends Location implements Metadatable{ $x = -$xz * sin(deg2rad($this->yaw)); $z = $xz * cos(deg2rad($this->yaw)); - return (new Vector3($x, $y, $z))->normalize(); + return $this->temporalVector->setComponents($x, $y, $z)->normalize(); } public function getDirectionPlane(){ @@ -1048,7 +1048,7 @@ abstract class Entity extends Location implements Metadatable{ } public function isInsideOfWater(){ - $block = $this->level->getBlock(new Vector3(Math::floorFloat($this->x), Math::floorFloat($y = ($this->y + $this->getEyeHeight())), Math::floorFloat($this->z))); + $block = $this->level->getBlock($this->temporalVector->setComponents(Math::floorFloat($this->x), Math::floorFloat($y = ($this->y + $this->getEyeHeight())), Math::floorFloat($this->z))); if($block instanceof Water){ $f = ($block->y + 1) - ($block->getFluidHeightPercent() - 0.1111111); @@ -1059,7 +1059,7 @@ abstract class Entity extends Location implements Metadatable{ } public function isInsideOfSolid(){ - $block = $this->level->getBlock(new Vector3(Math::floorFloat($this->x), Math::floorFloat($y = ($this->y + $this->getEyeHeight())), Math::floorFloat($this->z))); + $block = $this->level->getBlock($this->temporalVector->setComponents(Math::floorFloat($this->x), Math::floorFloat($y = ($this->y + $this->getEyeHeight())), Math::floorFloat($this->z))); $bb = $block->getBoundingBox(); @@ -1086,34 +1086,28 @@ abstract class Entity extends Location implements Metadatable{ $this->boundingBox = $newBB; } - $pos = new Vector3( - ($this->boundingBox->minX + $this->boundingBox->maxX) / 2, - $this->boundingBox->minY, - ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2 - ); + $this->x = ($this->boundingBox->minX + $this->boundingBox->maxX) / 2; + $this->y = $this->boundingBox->minY - $this->ySize; + $this->z = ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2; - $result = true; + $this->checkChunks(); - if(!$this->setPosition($pos)){ - $this->boundingBox->setBB($axisalignedbb); - $result = false; - }else{ - if(!$this->onGround or $dy != 0){ - $bb = clone $this->boundingBox; - $bb->minY -= 0.75; - $this->onGround = false; + if(!$this->onGround or $dy != 0){ + $bb = clone $this->boundingBox; + $bb->minY -= 0.75; + $this->onGround = false; - if(count($this->level->getCollisionBlocks($bb)) > 0){ - $this->onGround = true; - } + if(count($this->level->getCollisionBlocks($bb)) > 0){ + $this->onGround = true; } - $this->isCollided = $this->onGround; - $this->updateFallState($dy, $this->onGround); } + $this->isCollided = $this->onGround; + $this->updateFallState($dy, $this->onGround); + Timings::$entityMoveTimer->stopTiming(); - return $result; + return true; } public function move($dx, $dy, $dz){ @@ -1124,7 +1118,7 @@ abstract class Entity extends Location implements Metadatable{ if($this->keepMovement){ $this->boundingBox->offset($dx, $dy, $dz); - $this->setPosition(new Vector3(($this->boundingBox->minX + $this->boundingBox->maxX) / 2, $this->boundingBox->minY, ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2)); + $this->setPosition($this->temporalVector->setComponents(($this->boundingBox->minX + $this->boundingBox->maxX) / 2, $this->boundingBox->minY, ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2)); $this->onGround = $this instanceof Player ? true : false; return true; }else{ @@ -1247,6 +1241,8 @@ abstract class Entity extends Location implements Metadatable{ $this->y = $this->boundingBox->minY - $this->ySize; $this->z = ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2; + $this->checkChunks(); + if($this instanceof Player){ if(!$this->onGround or $movY != 0){ $bb = clone $this->boundingBox; @@ -1295,7 +1291,7 @@ abstract class Entity extends Location implements Metadatable{ $maxY = Math::ceilFloat($this->boundingBox->maxY - 0.001); $maxZ = Math::ceilFloat($this->boundingBox->maxZ - 0.001); - $vector = new Vector3(0, 0, 0); + $vector = $this->temporalVector; $v = new Vector3(0, 0, 0); for($v->z = $minZ; $v->z <= $maxZ; ++$v->z){ @@ -1443,8 +1439,8 @@ abstract class Entity extends Location implements Metadatable{ $this->ySize = 0; $pos = $ev->getTo(); - $this->setMotion(new Vector3(0, 0, 0)); - if($this->setPositionAndRotation($pos, $yaw === null ? $this->yaw : $yaw, $pitch === null ? $this->pitch : $pitch, true) !== false){ + $this->setMotion($this->temporalVector->setComponents(0, 0, 0)); + if($this->setPositionAndRotation($pos, $yaw === null ? $this->yaw : $yaw, $pitch === null ? $this->pitch : $pitch) !== false){ $this->resetFallDistance(); $this->onGround = true; diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 476e46593..77c21b5d8 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1405,7 +1405,7 @@ class Level implements ChunkManager, Metadatable{ $item = Item::get(Item::AIR, 0, 0); } - if($player instanceof Player){ + if($player !== null){ $ev = new BlockBreakEvent($player, $target, $item, ($player->getGamemode() & 0x01) === 1 ? true : false); if($player->isSurvival() and $item instanceof Item and !$target->isBreakable($item)){ @@ -1434,15 +1434,15 @@ class Level implements ChunkManager, Metadatable{ } $player->lastBreak = PHP_INT_MAX; - }elseif($item instanceof Item and !$target->isBreakable($item)){ + }elseif($item !== null and !$target->isBreakable($item)){ return false; } $level = $target->getLevel(); - if($level instanceof Level){ + if($level !== null){ $above = $level->getBlock(new Vector3($target->x, $target->y + 1, $target->z)); - if($above instanceof Block){ + if($above !== null){ if($above->getId() === Item::FIRE){ $level->setBlock($above, new Air(), true); } @@ -1466,7 +1466,7 @@ class Level implements ChunkManager, Metadatable{ $target->onBreak($item); $tile = $this->getTile($target); - if($tile instanceof Tile){ + if($tile !== null){ if($tile instanceof InventoryHolder){ if($tile instanceof Chest){ $tile->unpair(); @@ -1480,14 +1480,14 @@ class Level implements ChunkManager, Metadatable{ $tile->close(); } - if($item instanceof Item){ + if($item !== null){ $item->useOn($target); if($item->isTool() and $item->getDamage() >= $item->getMaxDurability()){ $item = Item::get(Item::AIR, 0, 0); } } - if(!($player instanceof Player) or $player->isSurvival()){ + if($player === null or $player->isSurvival()){ foreach($drops as $drop){ if($drop[2] > 0){ $this->dropItem($vector->add(0.5, 0.5, 0.5), Item::get(...$drop)); @@ -1523,7 +1523,7 @@ class Level implements ChunkManager, Metadatable{ return false; } - if($player instanceof Player){ + if($player !== null){ $ev = new PlayerInteractEvent($player, $item, $target, $face, $target->getId() === 0 ? PlayerInteractEvent::RIGHT_CLICK_AIR : PlayerInteractEvent::RIGHT_CLICK_BLOCK); if(!$player->isOp() and ($distance = $this->server->getSpawnRadius()) > -1){ $t = new Vector2($target->x, $target->z); @@ -1590,7 +1590,7 @@ class Level implements ChunkManager, Metadatable{ } - if($player instanceof Player){ + if($player !== null){ $ev = new BlockPlaceEvent($player, $hand, $block, $target, $item); if(!$player->isOp() and ($distance = $this->server->getSpawnRadius()) > -1){ $t = new Vector2($target->x, $target->z); @@ -1620,7 +1620,7 @@ class Level implements ChunkManager, Metadatable{ "Text3" => new String("Text3", ""), "Text4" => new String("Text4", "") ])); - if($player instanceof Player){ + if($player !== null){ $tile->namedtag->Creator = new String("Creator", $player->getUniqueId()); } } diff --git a/src/pocketmine/math/Vector3.php b/src/pocketmine/math/Vector3.php index d14efc802..46c131bb4 100644 --- a/src/pocketmine/math/Vector3.php +++ b/src/pocketmine/math/Vector3.php @@ -207,7 +207,7 @@ class Vector3{ */ public function normalize(){ $len = $this->lengthSquared(); - if($len != 0){ + if($len > 0){ return $this->divide(sqrt($len)); }