Implemented Vector3 List and AxisAlignedBB Pool to decrease object allocation

This commit is contained in:
Shoghi Cervantes 2014-10-27 15:39:20 +01:00
parent be948f99cc
commit 7abf52e615
39 changed files with 273 additions and 223 deletions

View File

@ -1057,8 +1057,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
return; return;
} }
$oldPos = new Vector3($this->x, $this->y, $this->z); $distanceSquared = $this->newPosition->distanceSquared($this);
$distanceSquared = $oldPos->distanceSquared($this->newPosition);
$revert = false; $revert = false;
@ -1558,7 +1557,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
} }
break; break;
case ProtocolInfo::USE_ITEM_PACKET: case ProtocolInfo::USE_ITEM_PACKET:
$blockVector = new Vector3($packet->x, $packet->y, $packet->z); $blockVector = Vector3::createVector($packet->x, $packet->y, $packet->z);
$this->craftingType = 0; $this->craftingType = 0;
@ -1718,7 +1717,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
} }
$this->craftingType = 0; $this->craftingType = 0;
$vector = new Vector3($packet->x, $packet->y, $packet->z); $vector = Vector3::createVector($packet->x, $packet->y, $packet->z);
if($this->isCreative()){ if($this->isCreative()){
@ -2185,7 +2184,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
} }
$this->craftingType = 0; $this->craftingType = 0;
$t = $this->level->getTile($v = new Vector3($packet->x, $packet->y, $packet->z)); $t = $this->level->getTile(Vector3::createVector($packet->x, $packet->y, $packet->z));
if($t instanceof Sign){ if($t instanceof Sign){
$nbt = new NBT(NBT::LITTLE_ENDIAN); $nbt = new NBT(NBT::LITTLE_ENDIAN);
$nbt->read($packet->namedtag); $nbt->read($packet->namedtag);
@ -2193,7 +2192,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
if($nbt["id"] !== Tile::SIGN){ if($nbt["id"] !== Tile::SIGN){
$t->spawnTo($this); $t->spawnTo($this);
}else{ }else{
$ev = new SignChangeEvent($this->level->getBlock($v), $this, [ $ev = new SignChangeEvent($t->getBlock(), $this, [
$nbt["Text1"], $nbt["Text2"], $nbt["Text3"], $nbt["Text4"] $nbt["Text1"], $nbt["Text2"], $nbt["Text3"], $nbt["Text4"]
]); ]);

View File

@ -50,6 +50,8 @@ use pocketmine\level\generator\GenerationRequestManager;
use pocketmine\level\generator\Generator; use pocketmine\level\generator\Generator;
use pocketmine\level\generator\Normal; use pocketmine\level\generator\Normal;
use pocketmine\level\Level; use pocketmine\level\Level;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Vector3;
use pocketmine\metadata\EntityMetadataStore; use pocketmine\metadata\EntityMetadataStore;
use pocketmine\metadata\LevelMetadataStore; use pocketmine\metadata\LevelMetadataStore;
use pocketmine\metadata\PlayerMetadataStore; use pocketmine\metadata\PlayerMetadataStore;
@ -2111,6 +2113,15 @@ class Server{
$this->generationManager->process(); $this->generationManager->process();
if(($this->tickCounter % 600) === 0){
Vector3::clearVectors();
AxisAlignedBB::clearBoundingBoxes();
}else{
Vector3::clearVectorList();
AxisAlignedBB::clearBoundingBoxPool();
}
Timings::$serverTickTimer->stopTiming(); Timings::$serverTickTimer->stopTiming();
TimingsHandler::tick(); TimingsHandler::tick();

View File

@ -36,11 +36,7 @@ class Bed extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){ return AxisAlignedBB::getBoundingBoxFromPool(
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -512,7 +512,6 @@ class Block extends Position implements Metadatable{
protected $name = "Unknown"; protected $name = "Unknown";
protected $breakTime = 0.20; protected $breakTime = 0.20;
protected $hardness = 10; protected $hardness = 10;
protected $boundingBox = null;
public $hasEntityCollision = false; public $hasEntityCollision = false;
public $isActivable = false; public $isActivable = false;
public $breakable = true; public $breakable = true;
@ -820,7 +819,6 @@ class Block extends Position implements Metadatable{
$this->y = (int) $v->y; $this->y = (int) $v->y;
$this->z = (int) $v->z; $this->z = (int) $v->z;
$this->level = $v->level; $this->level = $v->level;
$this->boundingBox = null;
} }
/** /**
@ -899,11 +897,7 @@ class Block extends Position implements Metadatable{
* @return AxisAlignedBB * @return AxisAlignedBB
*/ */
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){ return AxisAlignedBB::getBoundingBoxFromPool(
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -43,11 +43,8 @@ class Cactus extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 0.0625, $this->x + 0.0625,
$this->y, $this->y,
$this->z + 0.0625, $this->z + 0.0625,
@ -82,7 +79,7 @@ class Cactus extends Transparent{
if($this->getSide(0)->getID() !== self::CACTUS){ if($this->getSide(0)->getID() !== self::CACTUS){
if($this->meta == 0x0F){ if($this->meta == 0x0F){
for($y = 1; $y < 3; ++$y){ for($y = 1; $y < 3; ++$y){
$b = $this->getLevel()->getBlock(new Vector3($this->x, $this->y + $y, $this->z)); $b = $this->getLevel()->getBlock(Vector3::createVector($this->x, $this->y + $y, $this->z));
if($b->getID() === self::AIR){ if($b->getID() === self::AIR){
Server::getInstance()->getPluginManager()->callEvent($ev = new BlockGrowEvent($b, new Cactus())); Server::getInstance()->getPluginManager()->callEvent($ev = new BlockGrowEvent($b, new Cactus()));
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){

View File

@ -38,13 +38,10 @@ class Cake extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$f = (1 + $this->getDamage() * 2) / 16; $f = (1 + $this->getDamage() * 2) / 16;
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + $f, $this->x + $f,
$this->y, $this->y,
$this->z + 0.0625, $this->z + 0.0625,

View File

@ -54,11 +54,8 @@ class Carpet extends Flowable{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -43,11 +43,8 @@ class Chest extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 0.0625, $this->x + 0.0625,
$this->y, $this->y,
$this->z + 0.0625, $this->z + 0.0625,

View File

@ -53,14 +53,11 @@ abstract class Door extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$f = 0.1875; $f = 0.1875;
$damage = $this->getFullDamage(); $damage = $this->getFullDamage();
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -76,7 +73,7 @@ abstract class Door extends Transparent{
if($j === 0){ if($j === 0){
if($flag){ if($flag){
if(!$flag1){ if(!$flag1){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -85,7 +82,7 @@ abstract class Door extends Transparent{
$this->z + $f $this->z + $f
); );
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z + 1 - $f, $this->z + 1 - $f,
@ -95,7 +92,7 @@ abstract class Door extends Transparent{
); );
} }
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -107,7 +104,7 @@ abstract class Door extends Transparent{
}elseif($j === 1){ }elseif($j === 1){
if($flag){ if($flag){
if(!$flag1){ if(!$flag1){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 1 - $f, $this->x + 1 - $f,
$this->y, $this->y,
$this->z, $this->z,
@ -116,7 +113,7 @@ abstract class Door extends Transparent{
$this->z + 1 $this->z + 1
); );
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -126,7 +123,7 @@ abstract class Door extends Transparent{
); );
} }
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -138,7 +135,7 @@ abstract class Door extends Transparent{
}elseif($j === 2){ }elseif($j === 2){
if($flag){ if($flag){
if(!$flag1){ if(!$flag1){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z + 1 - $f, $this->z + 1 - $f,
@ -147,7 +144,7 @@ abstract class Door extends Transparent{
$this->z + 1 $this->z + 1
); );
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -157,7 +154,7 @@ abstract class Door extends Transparent{
); );
} }
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 1 - $f, $this->x + 1 - $f,
$this->y, $this->y,
$this->z, $this->z,
@ -169,7 +166,7 @@ abstract class Door extends Transparent{
}elseif($j === 3){ }elseif($j === 3){
if($flag){ if($flag){
if(!$flag1){ if(!$flag1){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -178,7 +175,7 @@ abstract class Door extends Transparent{
$this->z + 1 $this->z + 1
); );
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 1 - $f, $this->x + 1 - $f,
$this->y, $this->y,
$this->z, $this->z,
@ -188,7 +185,7 @@ abstract class Door extends Transparent{
); );
} }
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z + 1 - $f, $this->z + 1 - $f,
@ -199,7 +196,7 @@ abstract class Door extends Transparent{
} }
} }
return $this->boundingBox = $bb; return $bb;
} }
public function onUpdate($type){ public function onUpdate($type){

View File

@ -30,11 +30,8 @@ class EndPortal extends Solid{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -31,11 +31,8 @@ class Farmland extends Solid{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -32,9 +32,6 @@ class Fence extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$flag = $this->canConnect($this->getSide(2)); $flag = $this->canConnect($this->getSide(2));
$flag1 = $this->canConnect($this->getSide(3)); $flag1 = $this->canConnect($this->getSide(3));
@ -46,7 +43,7 @@ class Fence extends Transparent{
$f2 = $flag ? 0 : 0.375; $f2 = $flag ? 0 : 0.375;
$f3 = $flag1 ? 1 : 0.625; $f3 = $flag1 ? 1 : 0.625;
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + $f, $this->x + $f,
$this->y, $this->y,
$this->z + $f2, $this->z + $f2,

View File

@ -39,9 +39,6 @@ class FenceGate extends Transparent{
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
if(($this->getDamage() & 0x04) > 0){ if(($this->getDamage() & 0x04) > 0){
return null; return null;
@ -49,7 +46,7 @@ class FenceGate extends Transparent{
$i = ($this->getDamage() & 0x03); $i = ($this->getDamage() & 0x03);
if($i === 2 and $i === 0){ if($i === 2 and $i === 0){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z + 0.375, $this->z + 0.375,
@ -58,7 +55,7 @@ class FenceGate extends Transparent{
$this->z + 0.625 $this->z + 0.625
); );
}else{ }else{
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 0.375, $this->x + 0.375,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -44,14 +44,11 @@ class Ladder extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$f = 0.125; $f = 0.125;
if($this->meta === 2){ if($this->meta === 2){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z + 1 - $f, $this->z + 1 - $f,
@ -60,7 +57,7 @@ class Ladder extends Transparent{
$this->z + 1 $this->z + 1
); );
}elseif($this->meta === 3){ }elseif($this->meta === 3){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -69,7 +66,7 @@ class Ladder extends Transparent{
$this->z + $f $this->z + $f
); );
}elseif($this->meta === 4){ }elseif($this->meta === 4){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 1 - $f, $this->x + 1 - $f,
$this->y, $this->y,
$this->z, $this->z,
@ -78,7 +75,7 @@ class Ladder extends Transparent{
$this->z + 1 $this->z + 1
); );
}elseif($this->meta === 5){ }elseif($this->meta === 5){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -80,7 +80,7 @@ abstract class Liquid extends Transparent{
} }
public function getFlowVector(){ public function getFlowVector(){
$vector = new Vector3(0, 0, 0); $vector = Vector3::createVector(0, 0, 0);
$decay = $this->getEffectiveFlowDecay($this); $decay = $this->getEffectiveFlowDecay($this);
@ -99,7 +99,7 @@ abstract class Liquid extends Transparent{
}elseif($j === 3){ }elseif($j === 3){
++$z; ++$z;
} }
$sideBlock = $this->getLevel()->getBlock(new Vector3($x, $y, $z)); $sideBlock = $this->getLevel()->getBlock(Vector3::createVector($x, $y, $z));
$blockDecay = $this->getEffectiveFlowDecay($sideBlock); $blockDecay = $this->getEffectiveFlowDecay($sideBlock);
if($blockDecay < 0){ if($blockDecay < 0){
@ -314,7 +314,7 @@ abstract class Liquid extends Transparent{
}elseif($j === 3){ }elseif($j === 3){
++$z; ++$z;
} }
$blockSide = $this->getLevel()->getBlock(new Vector3($x, $y, $z)); $blockSide = $this->getLevel()->getBlock(Vector3::createVector($x, $y, $z));
if(!$blockSide->isFlowable and !($blockSide instanceof Liquid)){ if(!$blockSide->isFlowable and !($blockSide instanceof Liquid)){
continue; continue;
@ -356,7 +356,7 @@ abstract class Liquid extends Transparent{
}elseif($j === 3){ }elseif($j === 3){
++$z; ++$z;
} }
$block = $this->getLevel()->getBlock(new Vector3($x, $y, $z)); $block = $this->getLevel()->getBlock(Vector3::createVector($x, $y, $z));
if(!$block->isFlowable and !($block instanceof Liquid)){ if(!$block->isFlowable and !($block instanceof Liquid)){
continue; continue;

View File

@ -48,12 +48,9 @@ class Slab extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
if(($this->meta & 0x08) > 0){ if(($this->meta & 0x08) > 0){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + 0.5, $this->y + 0.5,
$this->z, $this->z,
@ -62,7 +59,7 @@ class Slab extends Transparent{
$this->z + 1 $this->z + 1
); );
}else{ }else{
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -31,11 +31,8 @@ class SoulSand extends Solid{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -54,7 +54,7 @@ abstract class Stair extends Transparent{
$f3 = 0.5; $f3 = 0.5;
} }
if($bb->intersectsWith($bb2 = new AxisAlignedBB( if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + $f, $this->y + $f,
$this->z, $this->z,
@ -66,7 +66,7 @@ abstract class Stair extends Transparent{
} }
if($j === 0){ if($j === 0){
if($bb->intersectsWith($bb2 = new AxisAlignedBB( if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 0.5, $this->x + 0.5,
$this->y + $f2, $this->y + $f2,
$this->z, $this->z,
@ -77,7 +77,7 @@ abstract class Stair extends Transparent{
$list[] = $bb2; $list[] = $bb2;
} }
}elseif($j === 1){ }elseif($j === 1){
if($bb->intersectsWith($bb2 = new AxisAlignedBB( if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + $f2, $this->y + $f2,
$this->z, $this->z,
@ -88,7 +88,7 @@ abstract class Stair extends Transparent{
$list[] = $bb2; $list[] = $bb2;
} }
}elseif($j === 2){ }elseif($j === 2){
if($bb->intersectsWith($bb2 = new AxisAlignedBB( if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + $f2, $this->y + $f2,
$this->z + 0.5, $this->z + 0.5,
@ -99,7 +99,7 @@ abstract class Stair extends Transparent{
$list[] = $bb2; $list[] = $bb2;
} }
}elseif($j === 3){ }elseif($j === 3){
if($bb->intersectsWith($bb2 = new AxisAlignedBB( if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + $f2, $this->y + $f2,
$this->z, $this->z,
@ -114,12 +114,9 @@ abstract class Stair extends Transparent{
*/ */
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
if(($this->getDamage() & 0x04) > 0){ if(($this->getDamage() & 0x04) > 0){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + 0.5, $this->y + 0.5,
$this->z, $this->z,
@ -128,7 +125,7 @@ abstract class Stair extends Transparent{
$this->z + 1 $this->z + 1
); );
}else{ }else{
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -37,9 +37,6 @@ class StoneWall extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$flag = $this->canConnect($this->getSide(2)); $flag = $this->canConnect($this->getSide(2));
$flag1 = $this->canConnect($this->getSide(3)); $flag1 = $this->canConnect($this->getSide(3));
@ -62,7 +59,7 @@ class StoneWall extends Transparent{
$f3 = 0.6875; $f3 = 0.6875;
} }
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + $f, $this->x + $f,
$this->y, $this->y,
$this->z + $f2, $this->z + $f2,

View File

@ -49,7 +49,7 @@ class Sugarcane extends Flowable{
if($item->getID() === Item::DYE and $item->getDamage() === 0x0F){ //Bonemeal if($item->getID() === Item::DYE and $item->getDamage() === 0x0F){ //Bonemeal
if($this->getSide(0)->getID() !== self::SUGARCANE_BLOCK){ if($this->getSide(0)->getID() !== self::SUGARCANE_BLOCK){
for($y = 1; $y < 3; ++$y){ for($y = 1; $y < 3; ++$y){
$b = $this->getLevel()->getBlock(new Vector3($this->x, $this->y + $y, $this->z)); $b = $this->getLevel()->getBlock(Vector3::createVector($this->x, $this->y + $y, $this->z));
if($b->getID() === self::AIR){ if($b->getID() === self::AIR){
Server::getInstance()->getPluginManager()->callEvent($ev = new BlockGrowEvent($b, new Sugarcane())); Server::getInstance()->getPluginManager()->callEvent($ev = new BlockGrowEvent($b, new Sugarcane()));
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
@ -83,7 +83,7 @@ class Sugarcane extends Flowable{
if($this->getSide(0)->getID() !== self::SUGARCANE_BLOCK){ if($this->getSide(0)->getID() !== self::SUGARCANE_BLOCK){
if($this->meta === 0x0F){ if($this->meta === 0x0F){
for($y = 1; $y < 3; ++$y){ for($y = 1; $y < 3; ++$y){
$b = $this->getLevel()->getBlock(new Vector3($this->x, $this->y + $y, $this->z)); $b = $this->getLevel()->getBlock(Vector3::createVector($this->x, $this->y + $y, $this->z));
if($b->getID() === self::AIR){ if($b->getID() === self::AIR){
$this->getLevel()->setBlock($b, new Sugarcane(), true); $this->getLevel()->setBlock($b, new Sugarcane(), true);
break; break;

View File

@ -30,9 +30,6 @@ abstract class Thin extends Transparent{
public $isSolid = false; public $isSolid = false;
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$f = 0.4375; $f = 0.4375;
$f1 = 0.5625; $f1 = 0.5625;
@ -66,7 +63,7 @@ abstract class Thin extends Transparent{
$f3 = 1; $f3 = 1;
} }
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + $f, $this->x + $f,
$this->y, $this->y,
$this->z + $f2, $this->z + $f2,

View File

@ -38,9 +38,6 @@ class Trapdoor extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$damage = $this->getDamage(); $damage = $this->getDamage();
@ -49,7 +46,7 @@ class Trapdoor extends Transparent{
$bb = null; $bb = null;
if(($damage & 0x08) > 0){ if(($damage & 0x08) > 0){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + 1 - $f, $this->y + 1 - $f,
$this->z, $this->z,
@ -58,7 +55,7 @@ class Trapdoor extends Transparent{
$this->z + 1 $this->z + 1
); );
}else{ }else{
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -70,7 +67,7 @@ class Trapdoor extends Transparent{
if(($damage & 0x04) > 0){ if(($damage & 0x04) > 0){
if(($damage & 0x03) === 0){ if(($damage & 0x03) === 0){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z + 1 - $f, $this->z + 1 - $f,
@ -79,7 +76,7 @@ class Trapdoor extends Transparent{
$this->z + 1 $this->z + 1
); );
}elseif(($damage & 0x03) === 1){ }elseif(($damage & 0x03) === 1){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -88,7 +85,7 @@ class Trapdoor extends Transparent{
$this->z + $f $this->z + $f
); );
}if(($damage & 0x03) === 2){ }if(($damage & 0x03) === 2){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x + 1 - $f, $this->x + 1 - $f,
$this->y, $this->y,
$this->z, $this->z,
@ -97,7 +94,7 @@ class Trapdoor extends Transparent{
$this->z + 1 $this->z + 1
); );
}if(($damage & 0x03) === 3){ }if(($damage & 0x03) === 3){
$bb = new AxisAlignedBB( $bb = AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,
@ -108,7 +105,7 @@ class Trapdoor extends Transparent{
} }
} }
return $this->boundingBox = $bb; return $bb;
} }
public function place(Item $item, Block $block, Block $target, $face, $fx, $fy, $fz, Player $player = null){ public function place(Item $item, Block $block, Block $target, $face, $fx, $fy, $fz, Player $player = null){

View File

@ -44,9 +44,6 @@ class Vine extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
$f1 = 1; $f1 = 1;
$f2 = 1; $f2 = 1;
@ -96,7 +93,7 @@ class Vine extends Transparent{
$f6 = 1; $f6 = 1;
} }
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x + $f1, $this->x + $f1,
$this->y + $f2, $this->y + $f2,
$this->z + $f3, $this->z + $f3,

View File

@ -46,12 +46,9 @@ class WoodSlab extends Transparent{
} }
public function getBoundingBox(){ public function getBoundingBox(){
if($this->boundingBox !== null){
return $this->boundingBox;
}
if(($this->meta & 0x08) > 0){ if(($this->meta & 0x08) > 0){
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y + 0.5, $this->y + 0.5,
$this->z, $this->z,
@ -60,7 +57,7 @@ class WoodSlab extends Transparent{
$this->z + 1 $this->z + 1
); );
}else{ }else{
return $this->boundingBox = new AxisAlignedBB( return AxisAlignedBB::getBoundingBoxFromPool(
$this->x, $this->x,
$this->y, $this->y,
$this->z, $this->z,

View File

@ -98,7 +98,7 @@ class TeleportCommand extends VanillaCommand{
$x = $this->getRelativeDouble($target->x, $sender, $args[$pos++]); $x = $this->getRelativeDouble($target->x, $sender, $args[$pos++]);
$y = $this->getRelativeDouble($target->y, $sender, $args[$pos++], 0, 128); $y = $this->getRelativeDouble($target->y, $sender, $args[$pos++], 0, 128);
$z = $this->getRelativeDouble($target->z, $sender, $args[$pos]); $z = $this->getRelativeDouble($target->z, $sender, $args[$pos]);
$target->teleport(new Vector3($x, $y, $z)); $target->teleport(Vector3::createVector($x, $y, $z));
Command::broadcastCommandMessage($sender, "Teleported " . $target->getDisplayName() . " to " . round($x, 2) . ", " . round($y, 2) . ", " . round($z, 2)); Command::broadcastCommandMessage($sender, "Teleported " . $target->getDisplayName() . " to " . round($x, 2) . ", " . round($y, 2) . ", " . round($z, 2));
return true; return true;

View File

@ -87,7 +87,7 @@ class Arrow extends Projectile{
$this->keepMovement = $this->checkObstruction($this->x, ($this->boundingBox->minY + $this->boundingBox->maxY) / 2, $this->z); $this->keepMovement = $this->checkObstruction($this->x, ($this->boundingBox->minY + $this->boundingBox->maxY) / 2, $this->z);
$moveVector = new Vector3($this->x + $this->motionX, $this->y + $this->motionY, $this->z + $this->motionZ); $moveVector = Vector3::createVector($this->x + $this->motionX, $this->y + $this->motionY, $this->z + $this->motionZ);
$list = $this->getLevel()->getCollidingEntities($this->boundingBox->addCoord($this->motionX, $this->motionY, $this->motionZ)->expand(1, 1, 1), $this); $list = $this->getLevel()->getCollidingEntities($this->boundingBox->addCoord($this->motionX, $this->motionY, $this->motionZ)->expand(1, 1, 1), $this);

View File

@ -99,7 +99,7 @@ class DroppedItem extends Entity{
$friction = 1 - $this->drag; $friction = 1 - $this->drag;
if($this->onGround and ($this->motionX != 0 or $this->motionZ != 0)){ if($this->onGround and ($this->motionX != 0 or $this->motionZ != 0)){
$friction = $this->getLevel()->getBlock(new Vector3($this->getFloorX(), $this->getFloorY() - 1, $this->getFloorZ()))->frictionFactor * $friction; $friction = $this->getLevel()->getBlock(Vector3::createVector($this->getFloorX(), $this->getFloorY() - 1, $this->getFloorZ()))->frictionFactor * $friction;
} }
$this->motionX *= $friction; $this->motionX *= $friction;

View File

@ -173,7 +173,7 @@ abstract class Entity extends Location implements Metadatable{
$this->boundingBox = new AxisAlignedBB(0, 0, 0, 0, 0, 0); $this->boundingBox = new AxisAlignedBB(0, 0, 0, 0, 0, 0);
$this->setPositionAndRotation( $this->setPositionAndRotation(
new Vector3( Vector3::createVector(
$this->namedtag["Pos"][0], $this->namedtag["Pos"][0],
$this->namedtag["Pos"][1], $this->namedtag["Pos"][1],
$this->namedtag["Pos"][2] $this->namedtag["Pos"][2]
@ -182,7 +182,7 @@ abstract class Entity extends Location implements Metadatable{
$this->namedtag->Rotation[1], $this->namedtag->Rotation[1],
true true
); );
$this->setMotion(new Vector3($this->namedtag["Motion"][0], $this->namedtag["Motion"][1], $this->namedtag["Motion"][2])); $this->setMotion(Vector3::createVector($this->namedtag["Motion"][0], $this->namedtag["Motion"][1], $this->namedtag["Motion"][2]));
if(!isset($this->namedtag->FallDistance)){ if(!isset($this->namedtag->FallDistance)){
$this->namedtag->FallDistance = new Float("FallDistance", 0); $this->namedtag->FallDistance = new Float("FallDistance", 0);
@ -387,15 +387,15 @@ abstract class Entity extends Location implements Metadatable{
$list = $this->level->getCollisionBlocks($this->boundingBox); $list = $this->level->getCollisionBlocks($this->boundingBox);
if(count($list) === 0 and !$this->level->isFullBlock(new Vector3($i, $j, $k))){ if(count($list) === 0 and !$this->level->isFullBlock(Vector3::createVector($i, $j, $k))){
return false; return false;
}else{ }else{
$flag = !$this->level->isFullBlock(new Vector3($i - 1, $j, $k)); $flag = !$this->level->isFullBlock(Vector3::createVector($i - 1, $j, $k));
$flag1 = !$this->level->isFullBlock(new Vector3($i + 1, $j, $k)); $flag1 = !$this->level->isFullBlock(Vector3::createVector($i + 1, $j, $k));
//$flag2 = !$this->level->isFullBlock(new Vector3($i, $j - 1, $k)); //$flag2 = !$this->level->isFullBlock(Vector3::createVector($i, $j - 1, $k));
$flag3 = !$this->level->isFullBlock(new Vector3($i, $j + 1, $k)); $flag3 = !$this->level->isFullBlock(Vector3::createVector($i, $j + 1, $k));
$flag4 = !$this->level->isFullBlock(new Vector3($i, $j, $k - 1)); $flag4 = !$this->level->isFullBlock(Vector3::createVector($i, $j, $k - 1));
$flag5 = !$this->level->isFullBlock(new Vector3($i, $j, $k + 1)); $flag5 = !$this->level->isFullBlock(Vector3::createVector($i, $j, $k + 1));
$direction = 3; //UP! $direction = 3; //UP!
$limit = 9999; $limit = 9999;
@ -583,7 +583,7 @@ abstract class Entity extends Location implements Metadatable{
$x = -$xz * sin(deg2rad($this->yaw)); $x = -$xz * sin(deg2rad($this->yaw));
$z = $xz * cos(deg2rad($this->yaw)); $z = $xz * cos(deg2rad($this->yaw));
return new Vector3($x, $y, $z); return Vector3::createVector($x, $y, $z);
} }
public function onUpdate($currentTick){ public function onUpdate($currentTick){
@ -745,7 +745,7 @@ abstract class Entity extends Location implements Metadatable{
} }
public function isInsideOfWater(){ public function isInsideOfWater(){
$block = $this->level->getBlock($pos = (new Vector3($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z))->floor()); $block = $this->level->getBlock($pos = Vector3::createVector($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z)->floor());
if($block instanceof Water){ if($block instanceof Water){
$f = ($pos->y + 1) - ($block->getFluidHeightPercent() - 0.1111111); $f = ($pos->y + 1) - ($block->getFluidHeightPercent() - 0.1111111);
@ -756,7 +756,7 @@ abstract class Entity extends Location implements Metadatable{
} }
public function isInsideOfSolid(){ public function isInsideOfSolid(){
$block = $this->level->getBlock($pos = (new Vector3($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z))->floor()); $block = $this->level->getBlock($pos = Vector3::createVector($this->x, $y = ($this->y + $this->getEyeHeight()), $this->z)->floor());
$bb = $block->getBoundingBox(); $bb = $block->getBoundingBox();
@ -779,7 +779,7 @@ abstract class Entity extends Location implements Metadatable{
if($this->keepMovement){ if($this->keepMovement){
$this->boundingBox->offset($dx, $dy, $dz); $this->boundingBox->offset($dx, $dy, $dz);
$pos = new Vector3(($this->boundingBox->minX + $this->boundingBox->maxX) / 2, $this->boundingBox->minY - $this->ySize, ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2); $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($pos);
}else{ }else{
@ -803,7 +803,7 @@ abstract class Entity extends Location implements Metadatable{
$movY = $dy; $movY = $dy;
$movZ = $dz; $movZ = $dz;
$axisalignedbb = clone $this->boundingBox; $axisalignedbb = AxisAlignedBB::cloneBoundingBoxFromPool($this->boundingBox);
/*$sneakFlag = $this->onGround and $this instanceof Player; /*$sneakFlag = $this->onGround and $this instanceof Player;
@ -881,7 +881,7 @@ abstract class Entity extends Location implements Metadatable{
$dy = $this->stepHeight; $dy = $this->stepHeight;
$dz = $movZ; $dz = $movZ;
$axisalignedbb1 = clone $this->boundingBox; $axisalignedbb1 = AxisAlignedBB::cloneBoundingBoxFromPool($this->boundingBox);
$this->boundingBox->setBB($axisalignedbb); $this->boundingBox->setBB($axisalignedbb);
@ -941,7 +941,7 @@ abstract class Entity extends Location implements Metadatable{
} }
$pos = new Vector3( $pos = Vector3::createVector(
($this->boundingBox->minX + $this->boundingBox->maxX) / 2, ($this->boundingBox->minX + $this->boundingBox->maxX) / 2,
$this->boundingBox->minY - $this->ySize, $this->boundingBox->minY - $this->ySize,
($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2 ($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2
@ -956,7 +956,7 @@ abstract class Entity extends Location implements Metadatable{
if($this instanceof Player){ if($this instanceof Player){
if(!$this->onGround or $movY != 0){ if(!$this->onGround or $movY != 0){
$bb = clone $this->boundingBox; $bb = AxisAlignedBB::cloneBoundingBoxFromPool($this->boundingBox);
$bb->maxY = $bb->minY + 1; $bb->maxY = $bb->minY + 1;
if(count($this->level->getCollisionBlocks($bb->expand(0.01, 0.01, 0.01))) > 0){ if(count($this->level->getCollisionBlocks($bb->expand(0.01, 0.01, 0.01))) > 0){
$this->onGround = true; $this->onGround = true;
@ -998,12 +998,13 @@ abstract class Entity extends Location implements Metadatable{
$maxY = Math::floorFloat($this->boundingBox->maxY - 0.001); $maxY = Math::floorFloat($this->boundingBox->maxY - 0.001);
$maxZ = Math::floorFloat($this->boundingBox->maxZ - 0.001); $maxZ = Math::floorFloat($this->boundingBox->maxZ - 0.001);
$vector = new Vector3(0, 0, 0); $vector = Vector3::createVector(0, 0, 0);
$v = Vector3::createVector(0, 0, 0);
for($z = $minZ; $z <= $maxZ; ++$z){ for($v->z = $minZ; $v->z < $maxZ; ++$v->z){
for($x = $minX; $x <= $maxX; ++$x){ for($v->x = $minX; $v->x < $maxX; ++$v->x){
for($y = $minY; $y <= $maxY; ++$y){ for($v->y = $minY; $v->y < $maxY; ++$v->y){
$block = $this->level->getBlock(new Vector3($x, $y, $z)); $block = $this->level->getBlock($v);
if($block !== null and $block->hasEntityCollision){ if($block !== null and $block->hasEntityCollision){
$block->onEntityCollide($this); $block->onEntityCollide($this);
if(!($this instanceof Player)){ if(!($this instanceof Player)){
@ -1082,7 +1083,7 @@ abstract class Entity extends Location implements Metadatable{
} }
public function getMotion(){ public function getMotion(){
return new Vector3($this->motionX, $this->motionY, $this->motionZ); return Vector3::createVector($this->motionX, $this->motionY, $this->motionZ);
} }
public function setMotion(Vector3 $motion){ public function setMotion(Vector3 $motion){
@ -1145,7 +1146,7 @@ abstract class Entity extends Location implements Metadatable{
$this->ySize = 0; $this->ySize = 0;
$pos = $ev->getTo(); $pos = $ev->getTo();
$this->setMotion(new Vector3(0, 0, 0)); $this->setMotion(Vector3::createVector(0, 0, 0));
if($this->setPositionAndRotation($pos, $yaw === null ? $this->yaw : $yaw, $pitch === null ? $this->pitch : $pitch, true) !== false){ if($this->setPositionAndRotation($pos, $yaw === null ? $this->yaw : $yaw, $pitch === null ? $this->pitch : $pitch, true) !== false){
$this->fallDistance = 0; $this->fallDistance = 0;
$this->onGround = true; $this->onGround = true;

View File

@ -27,6 +27,7 @@ use pocketmine\event\entity\EntityBlockChangeEvent;
use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\EntityRegainHealthEvent; use pocketmine\event\entity\EntityRegainHealthEvent;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\math\Vector3;
use pocketmine\nbt\tag\Byte; use pocketmine\nbt\tag\Byte;
use pocketmine\nbt\tag\String; use pocketmine\nbt\tag\String;
use pocketmine\network\protocol\AddEntityPacket; use pocketmine\network\protocol\AddEntityPacket;
@ -81,12 +82,12 @@ class FallingBlock extends Entity{
if(!$this->dead){ if(!$this->dead){
if($this->ticksLived === 1){ if($this->ticksLived === 1){
$block = $this->level->getBlock($this->floor()); $block = $this->level->getBlock($pos = Vector3::createVector($this->x, $this->y, $this->z)->floor());
if($block->getID() != $this->blockId){ if($block->getID() != $this->blockId){
$this->kill(); $this->kill();
return true; return true;
} }
$this->level->setBlock($this->floor(), Block::get(0), true); $this->level->setBlock($pos, Block::get(0), true);
} }
@ -100,7 +101,7 @@ class FallingBlock extends Entity{
$this->motionY *= 1 - $this->drag; $this->motionY *= 1 - $this->drag;
$this->motionZ *= $friction; $this->motionZ *= $friction;
$pos = $this->floor(); $pos = Vector3::createVector($this->x, $this->y, $this->z)->floor();
if($this->onGround){ if($this->onGround){
$this->kill(); $this->kill();

View File

@ -65,7 +65,7 @@ abstract class Living extends Entity implements Damageable{
public function hasLineOfSight(Entity $entity){ public function hasLineOfSight(Entity $entity){
//TODO: head height //TODO: head height
return true; return true;
//return $this->getLevel()->rayTraceBlocks(new Vector3($this->x, $this->y + $this->height, $this->z), new Vector3($entity->x, $entity->y + $entity->height, $entity->z)) === null; //return $this->getLevel()->rayTraceBlocks(Vector3::createVector($this->x, $this->y + $this->height, $this->z), Vector3::createVector($entity->x, $entity->y + $entity->height, $entity->z)) === null;
} }
public function attack($damage, $source = EntityDamageEvent::CAUSE_MAGIC){ public function attack($damage, $source = EntityDamageEvent::CAUSE_MAGIC){
@ -99,7 +99,7 @@ abstract class Living extends Entity implements Damageable{
$f = sqrt($x ** 2 + $z ** 2); $f = sqrt($x ** 2 + $z ** 2);
$base = 0.4; $base = 0.4;
$motion = new Vector3($this->motionX, $this->motionY, $this->motionZ); $motion = Vector3::createVector($this->motionX, $this->motionY, $this->motionZ);
$motion->x /= 2; $motion->x /= 2;
$motion->y /= 2; $motion->y /= 2;

View File

@ -42,6 +42,9 @@ class InventoryTransactionEvent extends Event implements Cancellable{
$this->ts = $ts; $this->ts = $ts;
} }
/**
* @return TransactionGroup
*/
public function getTransaction(){ public function getTransaction(){
return $this->ts; return $this->ts;
} }

View File

@ -129,9 +129,8 @@ class SimpleTransactionGroup implements TransactionGroup{
public function canExecute(){ public function canExecute(){
$haveItems = []; $haveItems = [];
$needItems = []; $needItems = [];
$this->matchItems($haveItems, $needItems);
return count($haveItems) === 0 and count($needItems) === 0 and count($this->transactions) > 0; return $this->matchItems($haveItems, $needItems) and count($haveItems) === 0 and count($needItems) === 0 and count($this->transactions) > 0;
} }
public function execute(){ public function execute(){

View File

@ -84,27 +84,31 @@ class Explosion{
return false; return false;
} }
$pointer = Vector3::createVector(0, 0, 0);
$vector = Vector3::createVector(0, 0, 0);
$vBlock = Vector3::createVector(0, 0, 0);
$mRays = $this->rays - 1; $mRays = $this->rays - 1;
for($i = 0; $i < $this->rays; ++$i){ for($i = 0; $i < $this->rays; ++$i){
for($j = 0; $j < $this->rays; ++$j){ for($j = 0; $j < $this->rays; ++$j){
//break 2 gets here //break 2 gets here
for($k = 0; $k < $this->rays; ++$k){ for($k = 0; $k < $this->rays; ++$k){
if($i == 0 or $i == $mRays or $j == 0 or $j == $mRays or $k == 0 or $k == $mRays){ if($i == 0 or $i == $mRays or $j == 0 or $j == $mRays or $k == 0 or $k == $mRays){
$vector = new Vector3($i / $mRays * 2 - 1, $j / $mRays * 2 - 1, $k / $mRays * 2 - 1); //($i / $mRays) * 2 - 1 $vector->setComponents($i / $mRays * 2 - 1, $j / $mRays * 2 - 1, $k / $mRays * 2 - 1);
$vector = $vector->normalize()->multiply($this->stepLen); $vector->setComponents(($vector->x / ($len = $vector->length())) * $this->stepLen, ($vector->y / $len) * $this->stepLen, ($vector->z / $len) * $this->stepLen);
$pointer = clone $this->source; $pointer->setComponents($this->source->x, $this->source->y, $this->source->z);
for($blastForce = $this->size * (mt_rand(700, 1300) / 1000); $blastForce > 0; $blastForce -= $this->stepLen * 0.75){ for($blastForce = $this->size * (mt_rand(700, 1300) / 1000); $blastForce > 0; $blastForce -= $this->stepLen * 0.75){
$vBlock = $pointer->floor(); $x = (int) $pointer->x;
$y = (int) $pointer->y;
$z = (int) $pointer->z;
$vBlock->setComponents($pointer->x >= $x ? $x : $x - 1, $pointer->y >= $y ? $y : $y - 1, $pointer->z >= $z ? $z : $z - 1);
if($vBlock->y < 0 or $vBlock->y > 127){ if($vBlock->y < 0 or $vBlock->y > 127){
break; break;
} }
$block = $this->level->getBlock($vBlock); $block = $this->level->getBlock($vBlock);
if(!($block instanceof Air)){ if(!($block instanceof Air)){
$block->x = $vBlock->x;
$block->y = $vBlock->y;
$block->z = $vBlock->z;
$blastForce -= ($block->getHardness() / 5 + 0.3) * $this->stepLen; $blastForce -= ($block->getHardness() / 5 + 0.3) * $this->stepLen;
if($blastForce > 0){ if($blastForce > 0){
$index = ($block->x << 15) + ($block->z << 7) + $block->y; $index = ($block->x << 15) + ($block->z << 7) + $block->y;
@ -113,7 +117,9 @@ class Explosion{
} }
} }
} }
$pointer = $pointer->add($vector); $pointer->x += $vector->x;
$pointer->y += $vector->y;
$pointer->z += $vector->z;
} }
} }
} }
@ -125,7 +131,7 @@ class Explosion{
public function explodeB(){ public function explodeB(){
$send = []; $send = [];
$source = $this->source->floor(); $source = Vector3::cloneVector($this->source)->floor();
$yield = (1 / $this->size) * 100; $yield = (1 / $this->size) * 100;
if($this->what instanceof Entity){ if($this->what instanceof Entity){
@ -146,7 +152,7 @@ class Explosion{
$minZ = Math::floorFloat($this->source->z - $explosionSize - 1); $minZ = Math::floorFloat($this->source->z - $explosionSize - 1);
$maxZ = Math::floorFloat($this->source->z + $explosionSize + 1); $maxZ = Math::floorFloat($this->source->z + $explosionSize + 1);
$explosionBB = new AxisAlignedBB($minX, $minY, $minZ, $maxX, $maxY, $maxZ); $explosionBB = AxisAlignedBB::getBoundingBoxFromPool($minX, $minY, $minZ, $maxX, $maxY, $maxZ);
$list = $this->level->getNearbyEntities($explosionBB, $this->what instanceof Entity ? $this->what : null); $list = $this->level->getNearbyEntities($explosionBB, $this->what instanceof Entity ? $this->what : null);
foreach($list as $entity){ foreach($list as $entity){

View File

@ -742,10 +742,12 @@ class Level implements ChunkManager, Metadatable{
$collides = []; $collides = [];
for($z = $minZ; $z < $maxZ; ++$z){ $v = Vector3::createVector(0, 0, 0);
for($x = $minX; $x < $maxX; ++$x){
for($y = $minY - 1; $y < $maxY; ++$y){ for($v->z = $minZ; $v->z < $maxZ; ++$v->z){
$block = $this->getBlock(new Vector3($x, $y, $z)); for($v->x = $minX; $v->x < $maxX; ++$v->x){
for($v->y = $minY - 1; $v->y < $maxY; ++$v->y){
$block = $this->getBlock($v);
if(!($block instanceof Air)){ if(!($block instanceof Air)){
$block->collidesWithBB($bb, $collides); $block->collidesWithBB($bb, $collides);
} }
@ -787,11 +789,12 @@ class Level implements ChunkManager, Metadatable{
$maxZ = Math::floorFloat($bb->maxZ + 1); $maxZ = Math::floorFloat($bb->maxZ + 1);
$collides = []; $collides = [];
$v = Vector3::createVector(0, 0, 0);
for($z = $minZ; $z < $maxZ; ++$z){ for($v->z = $minZ; $v->z < $maxZ; ++$v->z){
for($x = $minX; $x < $maxX; ++$x){ for($v->x = $minX; $v->x < $maxX; ++$v->x){
for($y = $minY - 1; $y < $maxY; ++$y){ for($v->y = $minY - 1; $v->y < $maxY; ++$v->y){
$block = $this->getBlock(new Vector3($x, $y, $z)); $block = $this->getBlock($v);
if(!($block instanceof Air)){ if(!($block instanceof Air)){
$block->collidesWithBB($bb, $collides); $block->collidesWithBB($bb, $collides);
} }
@ -801,7 +804,7 @@ class Level implements ChunkManager, Metadatable{
if($entities){ if($entities){
foreach($this->getCollidingEntities($bb->grow(0.25, 0.25, 0.25), $entity) as $ent){ foreach($this->getCollidingEntities($bb->grow(0.25, 0.25, 0.25), $entity) as $ent){
$collides[] = clone $ent->boundingBox; $collides[] = AxisAlignedBB::cloneBoundingBoxFromPool($ent->boundingBox);
} }
} }
@ -819,7 +822,7 @@ class Level implements ChunkManager, Metadatable{
$y2 = (int) $pos2->y; $y2 = (int) $pos2->y;
$z2 = (int) $pos2->z; $z2 = (int) $pos2->z;
$block = $this->getBlock(new Vector3($x1, $y1, $z1)); $block = $this->getBlock(Vector3::createVector($x1, $y1, $z1));
if(!$flag1 or $block->getBoundingBox() !== null){ if(!$flag1 or $block->getBoundingBox() !== null){
$ob = $block->calculateIntercept($pos1, $pos2); $ob = $block->calculateIntercept($pos1, $pos2);
@ -976,7 +979,7 @@ class Level implements ChunkManager, Metadatable{
$this->server->getPluginManager()->callEvent($ev = new BlockUpdateEvent($block)); $this->server->getPluginManager()->callEvent($ev = new BlockUpdateEvent($block));
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
$ev->getBlock()->onUpdate(self::BLOCK_UPDATE_NORMAL); $ev->getBlock()->onUpdate(self::BLOCK_UPDATE_NORMAL);
foreach($this->getNearbyEntities(new AxisAlignedBB($block->x - 1, $block->y - 1, $block->z - 1, $block->x + 2, $block->y + 2, $block->z + 2)) as $entity){ foreach($this->getNearbyEntities(AxisAlignedBB::getBoundingBoxFromPool($block->x - 1, $block->y - 1, $block->z - 1, $block->x + 2, $block->y + 2, $block->z + 2)) as $entity){
$entity->scheduleUpdate(); $entity->scheduleUpdate();
} }
} }
@ -991,7 +994,7 @@ class Level implements ChunkManager, Metadatable{
* @param int $delay * @param int $delay
*/ */
public function dropItem(Vector3 $source, Item $item, Vector3 $motion = null, $delay = 10){ public function dropItem(Vector3 $source, Item $item, Vector3 $motion = null, $delay = 10){
$motion = $motion === null ? new Vector3(lcg_value() * 0.2 - 0.1, 0.2, lcg_value() * 0.2 - 0.1) : $motion; $motion = $motion === null ? Vector3::createVector(lcg_value() * 0.2 - 0.1, 0.2, lcg_value() * 0.2 - 0.1) : $motion;
if($item->getID() > 0 and $item->getCount() > 0){ if($item->getID() > 0 and $item->getCount() > 0){
$itemEntity = new DroppedItem($this->getChunk($source->getX() >> 4, $source->getZ() >> 4), new Compound("", [ $itemEntity = new DroppedItem($this->getChunk($source->getX() >> 4, $source->getZ() >> 4), new Compound("", [
"Pos" => new Enum("Pos", [ "Pos" => new Enum("Pos", [
@ -1074,7 +1077,7 @@ class Level implements ChunkManager, Metadatable{
$level = $target->getLevel(); $level = $target->getLevel();
if($level instanceof Level){ if($level instanceof Level){
$above = $level->getBlock(new Vector3($target->x, $target->y + 1, $target->z)); $above = $level->getBlock(Vector3::createVector($target->x, $target->y + 1, $target->z));
if($above instanceof Block){ if($above instanceof Block){
if($above->getID() === Item::FIRE){ if($above->getID() === Item::FIRE){
$level->setBlock($above, new Air(), true); $level->setBlock($above, new Air(), true);
@ -1258,7 +1261,7 @@ class Level implements ChunkManager, Metadatable{
} }
/** /**
* Gets the list of all the entitites in this level * Gets the list of all the entities in this level
* *
* @return Entity[] * @return Entity[]
*/ */
@ -1923,27 +1926,26 @@ class Level implements ChunkManager, Metadatable{
$x = Math::floorFloat($spawn->x); $x = Math::floorFloat($spawn->x);
$y = Math::floorFloat($spawn->y); $y = Math::floorFloat($spawn->y);
$z = Math::floorFloat($spawn->z); $z = Math::floorFloat($spawn->z);
for(; $y > 0; --$y){ $v = Vector3::createVector($x, $y, $z);
$v = new Vector3($x, $y, $z); for(; $v->y > 0; --$v->y){
$b = $this->getBlock($v->getSide(0)); $b = $this->getBlock($v->getSide(0));
if($b === false){ if($b === null){
return $spawn; return $spawn;
}elseif(!($b instanceof Air)){ }elseif(!($b instanceof Air)){
break; break;
} }
} }
for(; $y < 128; ++$y){ for(; $v->y < 128; ++$v->y){
$v = new Vector3($x, $y, $z);
if($this->getBlock($v->getSide(1)) instanceof Air){ if($this->getBlock($v->getSide(1)) instanceof Air){
if($this->getBlock($v) instanceof Air){ if($this->getBlock($v) instanceof Air){
return new Position($spawn->x, $y === Math::floorFloat($spawn->y) ? $spawn->y : $y, $spawn->z, $this); return new Position($spawn->x, $v->y === Math::floorFloat($spawn->y) ? $spawn->y : $v->y, $spawn->z, $this);
} }
}else{ }else{
++$y; ++$v->y;
} }
} }
return new Position($spawn->x, $y, $spawn->z, $this); return new Position($spawn->x, $v->y, $spawn->z, $this);
} }
return false; return false;

View File

@ -64,7 +64,7 @@ class MovingObjectPosition{
$ob->blockX = $x; $ob->blockX = $x;
$ob->blockY = $y; $ob->blockY = $y;
$ob->blockZ = $z; $ob->blockZ = $z;
$ob->hitVector = new Vector3($hitVector->x, $hitVector->y, $hitVector->z); $ob->hitVector = Vector3::createVector($hitVector->x, $hitVector->y, $hitVector->z);
return $ob; return $ob;
} }
@ -77,7 +77,7 @@ class MovingObjectPosition{
$ob = new MovingObjectPosition; $ob = new MovingObjectPosition;
$ob->typeOfHit = 1; $ob->typeOfHit = 1;
$ob->entityHit = $entity; $ob->entityHit = $entity;
$ob->hitVector = new Vector3($entity->x, $entity->y, $entity->z); $ob->hitVector = Vector3::createVector($entity->x, $entity->y, $entity->z);
return $ob; return $ob;
} }
} }

View File

@ -22,11 +22,13 @@
namespace pocketmine\math; namespace pocketmine\math;
use pocketmine\level\MovingObjectPosition; use pocketmine\level\MovingObjectPosition;
/**
* WARNING: This class is available on the PocketMine-MP Zephir project.
* If this class is modified, remember to modify the PHP C extension.
*/
class AxisAlignedBB{ class AxisAlignedBB{
/** @var AxisAlignedBB[] */
private static $boundingBoxes = [];
private static $nextBoundingBox = 0;
public $minX; public $minX;
public $minY; public $minY;
public $minZ; public $minZ;
@ -43,6 +45,46 @@ class AxisAlignedBB{
$this->maxZ = $maxZ; $this->maxZ = $maxZ;
} }
public static function clearBoundingBoxes(){
self::$nextBoundingBox = 0;
self::$boundingBoxes = [];
}
public static function clearBoundingBoxPool(){
self::$nextBoundingBox = 0;
}
/**
* @param $minX
* @param $minY
* @param $minZ
* @param $maxX
* @param $maxY
* @param $maxZ
*
* @return AxisAlignedBB
*/
public static function getBoundingBoxFromPool($minX, $minY, $minZ, $maxX, $maxY, $maxZ){
if(self::$nextBoundingBox >= count(self::$boundingBoxes)){
self::$boundingBoxes[] = new AxisAlignedBB(0, 0, 0, 0, 0, 0);
}
return self::$boundingBoxes[self::$nextBoundingBox++]->setBounds($minX, $minY, $minZ, $maxX, $maxY, $maxZ);
}
/**
* @param AxisAlignedBB $bb
*
* @return AxisAlignedBB
*/
public static function cloneBoundingBoxFromPool(AxisAlignedBB $bb){
if(self::$nextBoundingBox >= count(self::$boundingBoxes)){
self::$boundingBoxes[] = new AxisAlignedBB(0, 0, 0, 0, 0, 0);
}
return self::$boundingBoxes[self::$nextBoundingBox++]->setBounds($bb->minX, $bb->minY, $bb->minZ, $bb->maxX, $bb->maxY, $bb->maxZ);
}
public function setBounds($minX, $minY, $minZ, $maxX, $maxY, $maxZ){ public function setBounds($minX, $minY, $minZ, $maxX, $maxY, $maxZ){
$this->minX = $minX; $this->minX = $minX;
$this->minY = $minY; $this->minY = $minY;
@ -55,7 +97,7 @@ class AxisAlignedBB{
} }
public function addCoord($x, $y, $z){ public function addCoord($x, $y, $z){
$vec = clone $this; $vec = self::cloneBoundingBoxFromPool($this);
if($x < 0){ if($x < 0){
$vec->minX += $x; $vec->minX += $x;
@ -79,7 +121,7 @@ class AxisAlignedBB{
} }
public function grow($x, $y, $z){ public function grow($x, $y, $z){
$vec = clone $this; $vec = self::cloneBoundingBoxFromPool($this);
$vec->minX -= $x; $vec->minX -= $x;
$vec->minY -= $y; $vec->minY -= $y;
$vec->minZ -= $z; $vec->minZ -= $z;
@ -113,7 +155,7 @@ class AxisAlignedBB{
} }
public function shrink($x, $y, $z){ public function shrink($x, $y, $z){
$vec = clone $this; $vec = self::cloneBoundingBoxFromPool($this);
$vec->minX += $x; $vec->minX += $x;
$vec->minY += $y; $vec->minY += $y;
$vec->minZ += $z; $vec->minZ += $z;
@ -146,7 +188,7 @@ class AxisAlignedBB{
} }
public function getOffsetBoundingBox($x, $y, $z){ public function getOffsetBoundingBox($x, $y, $z){
$vec = clone $this; $vec = self::cloneBoundingBoxFromPool($this);
$vec->minX += $x; $vec->minX += $x;
$vec->minY += $y; $vec->minY += $y;
$vec->minZ += $z; $vec->minZ += $z;

View File

@ -27,6 +27,10 @@ namespace pocketmine\math;
*/ */
class Vector3{ class Vector3{
/** @var Vector3[] */
private static $vectorList = [];
private static $nextVector = 0;
const SIDE_DOWN = 0; const SIDE_DOWN = 0;
const SIDE_UP = 1; const SIDE_UP = 1;
const SIDE_NORTH = 2; const SIDE_NORTH = 2;
@ -44,6 +48,38 @@ class Vector3{
$this->z = $z; $this->z = $z;
} }
public static function clearVectors(){
self::$nextVector = 0;
self::$vectorList = [];
}
public static function clearVectorList(){
self::$nextVector = 0;
}
/**
* @param $x
* @param $y
* @param $z
*
* @return Vector3
*/
public static function createVector($x, $y, $z){
if(self::$nextVector >= count(self::$vectorList)){
self::$vectorList[] = new Vector3(0, 0, 0);
}
return self::$vectorList[self::$nextVector++]->setComponents($x, $y, $z);
}
public static function cloneVector(Vector3 $vector){
if(self::$nextVector >= count(self::$vectorList)){
self::$vectorList[] = new Vector3(0, 0, 0);
}
return self::$vectorList[self::$nextVector++]->setComponents($vector->x, $vector->y, $vector->z);
}
public function getX(){ public function getX(){
return $this->x; return $this->x;
} }
@ -97,9 +133,9 @@ class Vector3{
*/ */
public function add($x, $y = 0, $z = 0){ public function add($x, $y = 0, $z = 0){
if($x instanceof Vector3){ if($x instanceof Vector3){
return new Vector3($this->x + $x->x, $this->y + $x->y, $this->z + $x->z); return self::createVector($this->x + $x->x, $this->y + $x->y, $this->z + $x->z);
}else{ }else{
return new Vector3($this->x + $x, $this->y + $y, $this->z + $z); return self::createVector($this->x + $x, $this->y + $y, $this->z + $z);
} }
} }
@ -119,15 +155,15 @@ class Vector3{
} }
public function multiply($number){ public function multiply($number){
return new Vector3($this->x * $number, $this->y * $number, $this->z * $number); return self::createVector($this->x * $number, $this->y * $number, $this->z * $number);
} }
public function divide($number){ public function divide($number){
return new Vector3($this->x / $number, $this->y / $number, $this->z / $number); return self::createVector($this->x / $number, $this->y / $number, $this->z / $number);
} }
public function ceil(){ public function ceil(){
return new Vector3((int) ($this->x + 1), (int) ($this->y + 1), (int) ($this->z + 1)); return self::createVector((int) ($this->x + 1), (int) ($this->y + 1), (int) ($this->z + 1));
} }
public function floor(){ public function floor(){
@ -148,17 +184,17 @@ class Vector3{
public function getSide($side, $step = 1){ public function getSide($side, $step = 1){
switch((int) $side){ switch((int) $side){
case self::SIDE_DOWN: case self::SIDE_DOWN:
return new Vector3($this->x, $this->y - $step, $this->z); return self::createVector($this->x, $this->y - $step, $this->z);
case self::SIDE_UP: case self::SIDE_UP:
return new Vector3($this->x, $this->y + $step, $this->z); return self::createVector($this->x, $this->y + $step, $this->z);
case self::SIDE_NORTH: case self::SIDE_NORTH:
return new Vector3($this->x, $this->y, $this->z - $step); return self::createVector($this->x, $this->y, $this->z - $step);
case self::SIDE_SOUTH: case self::SIDE_SOUTH:
return new Vector3($this->x, $this->y, $this->z + $step); return self::createVector($this->x, $this->y, $this->z + $step);
case self::SIDE_WEST: case self::SIDE_WEST:
return new Vector3($this->x - $step, $this->y, $this->z); return self::createVector($this->x - $step, $this->y, $this->z);
case self::SIDE_EAST: case self::SIDE_EAST:
return new Vector3($this->x + $step, $this->y, $this->z); return self::createVector($this->x + $step, $this->y, $this->z);
default: default:
return $this; return $this;
} }
@ -218,7 +254,7 @@ class Vector3{
return $this->divide($len); return $this->divide($len);
} }
return new Vector3(0, 0, 0); return self::createVector(0, 0, 0);
} }
public function dot(Vector3 $v){ public function dot(Vector3 $v){
@ -226,7 +262,7 @@ class Vector3{
} }
public function cross(Vector3 $v){ public function cross(Vector3 $v){
return new Vector3( return self::createVector(
$this->y * $v->z - $this->z * $v->y, $this->y * $v->z - $this->z * $v->y,
$this->z * $v->x - $this->x * $v->z, $this->z * $v->x - $this->x * $v->z,
$this->x * $v->y - $this->y * $v->x $this->x * $v->y - $this->y * $v->x
@ -256,7 +292,7 @@ class Vector3{
if($f < 0 or $f > 1){ if($f < 0 or $f > 1){
return null; return null;
}else{ }else{
return new Vector3($this->x + $xDiff * $f, $this->y + $yDiff * $f, $this->z + $zDiff * $f); return self::createVector($this->x + $xDiff * $f, $this->y + $yDiff * $f, $this->z + $zDiff * $f);
} }
} }
@ -283,7 +319,7 @@ class Vector3{
if($f < 0 or $f > 1){ if($f < 0 or $f > 1){
return null; return null;
}else{ }else{
return new Vector3($this->x + $xDiff * $f, $this->y + $yDiff * $f, $this->z + $zDiff * $f); return self::createVector($this->x + $xDiff * $f, $this->y + $yDiff * $f, $this->z + $zDiff * $f);
} }
} }
@ -310,10 +346,24 @@ class Vector3{
if($f < 0 or $f > 1){ if($f < 0 or $f > 1){
return null; return null;
}else{ }else{
return new Vector3($this->x + $xDiff * $f, $this->y + $yDiff * $f, $this->z + $zDiff * $f); return self::createVector($this->x + $xDiff * $f, $this->y + $yDiff * $f, $this->z + $zDiff * $f);
} }
} }
/**
* @param $x
* @param $y
* @param $z
*
* @return Vector3
*/
public function setComponents($x, $y, $z){
$this->x = $x;
$this->y = $y;
$this->z = $z;
return $this;
}
public function __toString(){ public function __toString(){
return "Vector3(x=" . $this->x . ",y=" . $this->y . ",z=" . $this->z . ")"; return "Vector3(x=" . $this->x . ",y=" . $this->y . ",z=" . $this->z . ")";
} }

View File

@ -196,7 +196,7 @@ class Chest extends Spawnable implements InventoryHolder, Container{
*/ */
public function getPair(){ public function getPair(){
if($this->isPaired()){ if($this->isPaired()){
$tile = $this->getLevel()->getTile(new Vector3((int) $this->namedtag["pairx"], $this->y, (int) $this->namedtag["pairz"])); $tile = $this->getLevel()->getTile(Vector3::createVector((int) $this->namedtag["pairx"], $this->y, (int) $this->namedtag["pairz"]));
if($tile instanceof Chest){ if($tile instanceof Chest){
return $tile; return $tile;
} }

View File

@ -58,7 +58,7 @@ class BlockIterator implements \Iterator{
$this->level = $level; $this->level = $level;
$this->maxDistance = (int) $maxDistance; $this->maxDistance = (int) $maxDistance;
$startClone = clone $start; $startClone = Vector3::createVector($start->x, $start->y, $start->z);
$startClone->y += $yOffset; $startClone->y += $yOffset;
$this->currentDistance = 0; $this->currentDistance = 0;
@ -71,7 +71,7 @@ class BlockIterator implements \Iterator{
$secondPosition = 0; $secondPosition = 0;
$thirdPosition = 0; $thirdPosition = 0;
$startBlock = $this->level->getBlock($startClone->floor()); $startBlock = $this->level->getBlock(Vector3::createVector($startClone->x, $startClone->y, $startClone->z)->floor());
if($this->getXLength($direction) > $mainDirection){ if($this->getXLength($direction) > $mainDirection){
$this->mainFace = $this->getXFace($direction); $this->mainFace = $this->getXFace($direction);