mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-21 08:17:34 +00:00
Reuse even more objects!
This commit is contained in:
parent
72c09045d5
commit
6f64af3066
@ -26,6 +26,7 @@ use pocketmine\item\Item;
|
||||
use pocketmine\level\generator\object\TallGrass as TallGrassObject;
|
||||
use pocketmine\level\Level;
|
||||
use pocketmine\level\Position;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\Player;
|
||||
use pocketmine\Server;
|
||||
use pocketmine\utils\Random;
|
||||
@ -54,9 +55,8 @@ class Grass extends Solid{
|
||||
$x = mt_rand($this->x - 1, $this->x + 1);
|
||||
$y = mt_rand($this->y - 2, $this->y + 2);
|
||||
$z = mt_rand($this->z - 1, $this->z + 1);
|
||||
$block = $this->getLevel()->getBlockIdAt($x, $y, $z);
|
||||
if($block === Block::DIRT){
|
||||
$block = Block::get($block, $this->getLevel()->getBlockDataAt($x, $y, $z), Position::createPosition($x, $y, $z, $this->getLevel()));
|
||||
$block = $this->getLevel()->getBlock(Vector3::createVector($x, $y, $z));
|
||||
if($block->getID() === Block::DIRT){
|
||||
if($block->getSide(1) instanceof Transparent){
|
||||
Server::getInstance()->getPluginManager()->callEvent($ev = BlockSpreadEvent::createEvent($block, $this, new Grass()));
|
||||
if(!$ev->isCancelled()){
|
||||
|
@ -25,6 +25,7 @@ use pocketmine\event\block\BlockSpreadEvent;
|
||||
use pocketmine\item\Item;
|
||||
use pocketmine\level\Level;
|
||||
use pocketmine\level\Position;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\Server;
|
||||
|
||||
class Mycelium extends Solid{
|
||||
@ -45,9 +46,8 @@ class Mycelium extends Solid{
|
||||
$x = mt_rand($this->x - 1, $this->x + 1);
|
||||
$y = mt_rand($this->y - 2, $this->y + 2);
|
||||
$z = mt_rand($this->z - 1, $this->z + 1);
|
||||
$block = $this->getLevel()->getBlockIdAt($x, $y, $z);
|
||||
if($block === Block::DIRT){
|
||||
$block = Block::get($block, $this->getLevel()->getBlockDataAt($x, $y, $z), Position::createPosition($x, $y, $z, $this->getLevel()));
|
||||
$block = $this->getLevel()->getBlock(Vector3::createVector($x, $y, $z));
|
||||
if($block->getID() === Block::DIRT){
|
||||
if($block->getSide(1) instanceof Transparent){
|
||||
Server::getInstance()->getPluginManager()->callEvent($ev = BlockSpreadEvent::createEvent($block, $this, new Mycelium()));
|
||||
if(!$ev->isCancelled()){
|
||||
|
@ -424,15 +424,17 @@ abstract class Entity extends Location implements Metadatable{
|
||||
|
||||
$list = $this->level->getCollisionBlocks($this->boundingBox);
|
||||
|
||||
if(count($list) === 0 and !$this->level->isFullBlock(Vector3::createVector($i, $j, $k))){
|
||||
$v = Vector3::createVector($i, $j, $k);
|
||||
|
||||
if(count($list) === 0 and !$this->level->isFullBlock($v->setComponents($i, $j, $k))){
|
||||
return false;
|
||||
}else{
|
||||
$flag = !$this->level->isFullBlock(Vector3::createVector($i - 1, $j, $k));
|
||||
$flag1 = !$this->level->isFullBlock(Vector3::createVector($i + 1, $j, $k));
|
||||
//$flag2 = !$this->level->isFullBlock(Vector3::createVector($i, $j - 1, $k));
|
||||
$flag3 = !$this->level->isFullBlock(Vector3::createVector($i, $j + 1, $k));
|
||||
$flag4 = !$this->level->isFullBlock(Vector3::createVector($i, $j, $k - 1));
|
||||
$flag5 = !$this->level->isFullBlock(Vector3::createVector($i, $j, $k + 1));
|
||||
$flag = !$this->level->isFullBlock($v->setComponents($i - 1, $j, $k));
|
||||
$flag1 = !$this->level->isFullBlock($v->setComponents($i + 1, $j, $k));
|
||||
//$flag2 = !$this->level->isFullBlock($v->setComponents($i, $j - 1, $k));
|
||||
$flag3 = !$this->level->isFullBlock($v->setComponents($i, $j + 1, $k));
|
||||
$flag4 = !$this->level->isFullBlock($v->setComponents($i, $j, $k - 1));
|
||||
$flag5 = !$this->level->isFullBlock($v->setComponents($i, $j, $k + 1));
|
||||
|
||||
$direction = 3; //UP!
|
||||
$limit = 9999;
|
||||
@ -782,10 +784,10 @@ abstract class Entity extends Location implements Metadatable{
|
||||
}
|
||||
|
||||
public function isInsideOfWater(){
|
||||
$block = $this->level->getBlock($pos = Vector3::createVector($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z)->floor());
|
||||
$block = $this->level->getBlock(Vector3::createVector($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z)->floor());
|
||||
|
||||
if($block instanceof Water){
|
||||
$f = ($pos->y + 1) - ($block->getFluidHeightPercent() - 0.1111111);
|
||||
$f = ($block->y + 1) - ($block->getFluidHeightPercent() - 0.1111111);
|
||||
return $y < $f;
|
||||
}
|
||||
|
||||
@ -793,7 +795,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
}
|
||||
|
||||
public function isInsideOfSolid(){
|
||||
$block = $this->level->getBlock($pos = Vector3::createVector($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z)->floor());
|
||||
$block = $this->level->getBlock(Vector3::createVector($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z)->floor());
|
||||
|
||||
$bb = $block->getBoundingBox();
|
||||
|
||||
@ -816,8 +818,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
|
||||
if($this->keepMovement){
|
||||
$this->boundingBox->offset($dx, $dy, $dz);
|
||||
$pos = Vector3::createVector(($this->boundingBox->minX + $this->boundingBox->maxX) / 2, $this->boundingBox->minY - $this->ySize, ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2);
|
||||
$this->setPosition($pos);
|
||||
$this->setPosition(Vector3::createVector(($this->boundingBox->minX + $this->boundingBox->maxX) / 2, $this->boundingBox->minY - $this->ySize, ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2));
|
||||
$this->onGround = $this instanceof Player ? true : false;
|
||||
}else{
|
||||
|
||||
|
@ -176,7 +176,10 @@ class Level implements ChunkManager, Metadatable{
|
||||
private $useSections;
|
||||
private $blockOrder;
|
||||
|
||||
/** @var Position */
|
||||
private $temporalPosition;
|
||||
/** @var Vector3 */
|
||||
private $temporalVector;
|
||||
|
||||
protected $chunkTickRadius;
|
||||
protected $chunkTickList = [];
|
||||
@ -270,6 +273,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
|
||||
$this->timings = new LevelTimings($this);
|
||||
$this->temporalPosition = new Position(0, 0, 0, $this);
|
||||
$this->temporalVector = new Vector3(0, 0, 0);
|
||||
}
|
||||
|
||||
public function initLevel(){
|
||||
@ -746,7 +750,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
|
||||
$collides = [];
|
||||
|
||||
$v = Vector3::createVector(0, 0, 0);
|
||||
$v = $this->temporalVector;
|
||||
|
||||
for($v->z = $minZ; $v->z < $maxZ; ++$v->z){
|
||||
for($v->x = $minX; $v->x < $maxX; ++$v->x){
|
||||
@ -793,7 +797,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
$maxZ = Math::floorFloat($bb->maxZ + 1);
|
||||
|
||||
$collides = [];
|
||||
$v = Vector3::createVector(0, 0, 0);
|
||||
$v = $this->temporalVector;
|
||||
|
||||
for($v->z = $minZ; $v->z < $maxZ; ++$v->z){
|
||||
for($v->x = $minX; $v->x < $maxX; ++$v->x){
|
||||
|
@ -101,39 +101,36 @@ class AxisAlignedBB{
|
||||
}
|
||||
|
||||
public function addCoord($x, $y, $z){
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
$minX = $this->minX;
|
||||
$minY = $this->minY;
|
||||
$minZ = $this->minZ;
|
||||
$maxX = $this->maxX;
|
||||
$maxY = $this->maxY;
|
||||
$maxZ = $this->maxZ;
|
||||
|
||||
if($x < 0){
|
||||
$vec->minX += $x;
|
||||
$minX += $x;
|
||||
}elseif($x > 0){
|
||||
$vec->maxX += $x;
|
||||
$maxX += $x;
|
||||
}
|
||||
|
||||
if($y < 0){
|
||||
$vec->minY += $y;
|
||||
$minY += $y;
|
||||
}elseif($y > 0){
|
||||
$vec->maxY += $y;
|
||||
$maxY += $y;
|
||||
}
|
||||
|
||||
if($z < 0){
|
||||
$vec->minZ += $z;
|
||||
$minZ += $z;
|
||||
}elseif($z > 0){
|
||||
$vec->maxZ += $z;
|
||||
$maxZ += $z;
|
||||
}
|
||||
|
||||
return $vec;
|
||||
return self::getBoundingBoxFromPool($minX, $minY, $minZ, $maxX, $maxY, $maxZ);
|
||||
}
|
||||
|
||||
public function grow($x, $y, $z){
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
$vec->minX -= $x;
|
||||
$vec->minY -= $y;
|
||||
$vec->minZ -= $z;
|
||||
$vec->maxX += $x;
|
||||
$vec->maxY += $y;
|
||||
$vec->maxZ += $z;
|
||||
|
||||
return $vec;
|
||||
return self::getBoundingBoxFromPool($this->minX - $x, $this->minY - $y, $this->minZ - $z, $this->maxX + $x, $this->maxY + $y, $this->maxZ + $z);
|
||||
}
|
||||
|
||||
public function expand($x, $y, $z){
|
||||
@ -159,15 +156,7 @@ class AxisAlignedBB{
|
||||
}
|
||||
|
||||
public function shrink($x, $y, $z){
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
$vec->minX += $x;
|
||||
$vec->minY += $y;
|
||||
$vec->minZ += $z;
|
||||
$vec->maxX -= $x;
|
||||
$vec->maxY -= $y;
|
||||
$vec->maxZ -= $z;
|
||||
|
||||
return $vec;
|
||||
return self::getBoundingBoxFromPool($this->minX + $x, $this->minY + $y, $this->minZ + $z, $this->maxX - $x, $this->maxY - $y, $this->maxZ - $z);
|
||||
}
|
||||
|
||||
public function contract($x, $y, $z){
|
||||
@ -192,15 +181,7 @@ class AxisAlignedBB{
|
||||
}
|
||||
|
||||
public function getOffsetBoundingBox($x, $y, $z){
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
$vec->minX += $x;
|
||||
$vec->minY += $y;
|
||||
$vec->minZ += $z;
|
||||
$vec->maxX += $x;
|
||||
$vec->maxY += $y;
|
||||
$vec->maxZ += $z;
|
||||
|
||||
return $vec;
|
||||
return self::getBoundingBoxFromPool($this->minX + $x, $this->minY + $y, $this->minZ + $z, $this->maxX + $x, $this->maxY + $y, $this->maxZ + $z);
|
||||
}
|
||||
|
||||
public function calculateXOffset(AxisAlignedBB $bb, $x){
|
||||
|
@ -21,10 +21,6 @@
|
||||
|
||||
namespace pocketmine\math;
|
||||
|
||||
/**
|
||||
* WARNING: This class is available on the PocketMine-MP Zephir project.
|
||||
* If this class is modified, remember to modify the PHP C extension.
|
||||
*/
|
||||
class Vector3{
|
||||
|
||||
/** @var Vector3[] */
|
||||
@ -76,6 +72,11 @@ class Vector3{
|
||||
return self::$vectorList[self::$nextVector++]->setComponents($x, $y, $z);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Vector3 $vector
|
||||
*
|
||||
* @return Vector3
|
||||
*/
|
||||
public static function cloneVector(Vector3 $vector){
|
||||
if(self::$nextVector >= count(self::$vectorList)){
|
||||
self::$vectorList[] = new Vector3(0, 0, 0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user