mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-22 00:33:59 +00:00
Implemented Vector3 List and AxisAlignedBB Pool to decrease object allocation
This commit is contained in:
parent
be948f99cc
commit
7abf52e615
@ -1057,8 +1057,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
||||
return;
|
||||
}
|
||||
|
||||
$oldPos = new Vector3($this->x, $this->y, $this->z);
|
||||
$distanceSquared = $oldPos->distanceSquared($this->newPosition);
|
||||
$distanceSquared = $this->newPosition->distanceSquared($this);
|
||||
|
||||
$revert = false;
|
||||
|
||||
@ -1558,7 +1557,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
||||
}
|
||||
break;
|
||||
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;
|
||||
|
||||
@ -1718,7 +1717,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
||||
}
|
||||
$this->craftingType = 0;
|
||||
|
||||
$vector = new Vector3($packet->x, $packet->y, $packet->z);
|
||||
$vector = Vector3::createVector($packet->x, $packet->y, $packet->z);
|
||||
|
||||
|
||||
if($this->isCreative()){
|
||||
@ -2185,7 +2184,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
||||
}
|
||||
$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){
|
||||
$nbt = new NBT(NBT::LITTLE_ENDIAN);
|
||||
$nbt->read($packet->namedtag);
|
||||
@ -2193,7 +2192,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
||||
if($nbt["id"] !== Tile::SIGN){
|
||||
$t->spawnTo($this);
|
||||
}else{
|
||||
$ev = new SignChangeEvent($this->level->getBlock($v), $this, [
|
||||
$ev = new SignChangeEvent($t->getBlock(), $this, [
|
||||
$nbt["Text1"], $nbt["Text2"], $nbt["Text3"], $nbt["Text4"]
|
||||
]);
|
||||
|
||||
|
@ -50,6 +50,8 @@ use pocketmine\level\generator\GenerationRequestManager;
|
||||
use pocketmine\level\generator\Generator;
|
||||
use pocketmine\level\generator\Normal;
|
||||
use pocketmine\level\Level;
|
||||
use pocketmine\math\AxisAlignedBB;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\metadata\EntityMetadataStore;
|
||||
use pocketmine\metadata\LevelMetadataStore;
|
||||
use pocketmine\metadata\PlayerMetadataStore;
|
||||
@ -2111,6 +2113,15 @@ class Server{
|
||||
|
||||
$this->generationManager->process();
|
||||
|
||||
|
||||
if(($this->tickCounter % 600) === 0){
|
||||
Vector3::clearVectors();
|
||||
AxisAlignedBB::clearBoundingBoxes();
|
||||
}else{
|
||||
Vector3::clearVectorList();
|
||||
AxisAlignedBB::clearBoundingBoxPool();
|
||||
}
|
||||
|
||||
Timings::$serverTickTimer->stopTiming();
|
||||
|
||||
TimingsHandler::tick();
|
||||
|
@ -36,11 +36,7 @@ class Bed extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -512,7 +512,6 @@ class Block extends Position implements Metadatable{
|
||||
protected $name = "Unknown";
|
||||
protected $breakTime = 0.20;
|
||||
protected $hardness = 10;
|
||||
protected $boundingBox = null;
|
||||
public $hasEntityCollision = false;
|
||||
public $isActivable = false;
|
||||
public $breakable = true;
|
||||
@ -820,7 +819,6 @@ class Block extends Position implements Metadatable{
|
||||
$this->y = (int) $v->y;
|
||||
$this->z = (int) $v->z;
|
||||
$this->level = $v->level;
|
||||
$this->boundingBox = null;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -899,11 +897,7 @@ class Block extends Position implements Metadatable{
|
||||
* @return AxisAlignedBB
|
||||
*/
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -43,11 +43,8 @@ class Cactus extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 0.0625,
|
||||
$this->y,
|
||||
$this->z + 0.0625,
|
||||
@ -82,7 +79,7 @@ class Cactus extends Transparent{
|
||||
if($this->getSide(0)->getID() !== self::CACTUS){
|
||||
if($this->meta == 0x0F){
|
||||
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){
|
||||
Server::getInstance()->getPluginManager()->callEvent($ev = new BlockGrowEvent($b, new Cactus()));
|
||||
if(!$ev->isCancelled()){
|
||||
|
@ -38,13 +38,10 @@ class Cake extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$f = (1 + $this->getDamage() * 2) / 16;
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + $f,
|
||||
$this->y,
|
||||
$this->z + 0.0625,
|
||||
|
@ -54,11 +54,8 @@ class Carpet extends Flowable{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -43,11 +43,8 @@ class Chest extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 0.0625,
|
||||
$this->y,
|
||||
$this->z + 0.0625,
|
||||
|
@ -53,14 +53,11 @@ abstract class Door extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$f = 0.1875;
|
||||
$damage = $this->getFullDamage();
|
||||
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -76,7 +73,7 @@ abstract class Door extends Transparent{
|
||||
if($j === 0){
|
||||
if($flag){
|
||||
if(!$flag1){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -85,7 +82,7 @@ abstract class Door extends Transparent{
|
||||
$this->z + $f
|
||||
);
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z + 1 - $f,
|
||||
@ -95,7 +92,7 @@ abstract class Door extends Transparent{
|
||||
);
|
||||
}
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -107,7 +104,7 @@ abstract class Door extends Transparent{
|
||||
}elseif($j === 1){
|
||||
if($flag){
|
||||
if(!$flag1){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 1 - $f,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -116,7 +113,7 @@ abstract class Door extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -126,7 +123,7 @@ abstract class Door extends Transparent{
|
||||
);
|
||||
}
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -138,7 +135,7 @@ abstract class Door extends Transparent{
|
||||
}elseif($j === 2){
|
||||
if($flag){
|
||||
if(!$flag1){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z + 1 - $f,
|
||||
@ -147,7 +144,7 @@ abstract class Door extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -157,7 +154,7 @@ abstract class Door extends Transparent{
|
||||
);
|
||||
}
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 1 - $f,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -169,7 +166,7 @@ abstract class Door extends Transparent{
|
||||
}elseif($j === 3){
|
||||
if($flag){
|
||||
if(!$flag1){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -178,7 +175,7 @@ abstract class Door extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 1 - $f,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -188,7 +185,7 @@ abstract class Door extends Transparent{
|
||||
);
|
||||
}
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z + 1 - $f,
|
||||
@ -199,7 +196,7 @@ abstract class Door extends Transparent{
|
||||
}
|
||||
}
|
||||
|
||||
return $this->boundingBox = $bb;
|
||||
return $bb;
|
||||
}
|
||||
|
||||
public function onUpdate($type){
|
||||
|
@ -30,11 +30,8 @@ class EndPortal extends Solid{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -31,11 +31,8 @@ class Farmland extends Solid{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -32,9 +32,6 @@ class Fence extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$flag = $this->canConnect($this->getSide(2));
|
||||
$flag1 = $this->canConnect($this->getSide(3));
|
||||
@ -46,7 +43,7 @@ class Fence extends Transparent{
|
||||
$f2 = $flag ? 0 : 0.375;
|
||||
$f3 = $flag1 ? 1 : 0.625;
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + $f,
|
||||
$this->y,
|
||||
$this->z + $f2,
|
||||
|
@ -39,9 +39,6 @@ class FenceGate extends Transparent{
|
||||
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
if(($this->getDamage() & 0x04) > 0){
|
||||
return null;
|
||||
@ -49,7 +46,7 @@ class FenceGate extends Transparent{
|
||||
|
||||
$i = ($this->getDamage() & 0x03);
|
||||
if($i === 2 and $i === 0){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z + 0.375,
|
||||
@ -58,7 +55,7 @@ class FenceGate extends Transparent{
|
||||
$this->z + 0.625
|
||||
);
|
||||
}else{
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 0.375,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -44,14 +44,11 @@ class Ladder extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$f = 0.125;
|
||||
|
||||
if($this->meta === 2){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z + 1 - $f,
|
||||
@ -60,7 +57,7 @@ class Ladder extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}elseif($this->meta === 3){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -69,7 +66,7 @@ class Ladder extends Transparent{
|
||||
$this->z + $f
|
||||
);
|
||||
}elseif($this->meta === 4){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 1 - $f,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -78,7 +75,7 @@ class Ladder extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}elseif($this->meta === 5){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -80,7 +80,7 @@ abstract class Liquid extends Transparent{
|
||||
}
|
||||
|
||||
public function getFlowVector(){
|
||||
$vector = new Vector3(0, 0, 0);
|
||||
$vector = Vector3::createVector(0, 0, 0);
|
||||
|
||||
$decay = $this->getEffectiveFlowDecay($this);
|
||||
|
||||
@ -99,7 +99,7 @@ abstract class Liquid extends Transparent{
|
||||
}elseif($j === 3){
|
||||
++$z;
|
||||
}
|
||||
$sideBlock = $this->getLevel()->getBlock(new Vector3($x, $y, $z));
|
||||
$sideBlock = $this->getLevel()->getBlock(Vector3::createVector($x, $y, $z));
|
||||
$blockDecay = $this->getEffectiveFlowDecay($sideBlock);
|
||||
|
||||
if($blockDecay < 0){
|
||||
@ -314,7 +314,7 @@ abstract class Liquid extends Transparent{
|
||||
}elseif($j === 3){
|
||||
++$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)){
|
||||
continue;
|
||||
@ -356,7 +356,7 @@ abstract class Liquid extends Transparent{
|
||||
}elseif($j === 3){
|
||||
++$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)){
|
||||
continue;
|
||||
|
@ -48,12 +48,9 @@ class Slab extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
if(($this->meta & 0x08) > 0){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + 0.5,
|
||||
$this->z,
|
||||
@ -62,7 +59,7 @@ class Slab extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}else{
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -31,11 +31,8 @@ class SoulSand extends Solid{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -54,7 +54,7 @@ abstract class Stair extends Transparent{
|
||||
$f3 = 0.5;
|
||||
}
|
||||
|
||||
if($bb->intersectsWith($bb2 = new AxisAlignedBB(
|
||||
if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + $f,
|
||||
$this->z,
|
||||
@ -66,7 +66,7 @@ abstract class Stair extends Transparent{
|
||||
}
|
||||
|
||||
if($j === 0){
|
||||
if($bb->intersectsWith($bb2 = new AxisAlignedBB(
|
||||
if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 0.5,
|
||||
$this->y + $f2,
|
||||
$this->z,
|
||||
@ -77,7 +77,7 @@ abstract class Stair extends Transparent{
|
||||
$list[] = $bb2;
|
||||
}
|
||||
}elseif($j === 1){
|
||||
if($bb->intersectsWith($bb2 = new AxisAlignedBB(
|
||||
if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + $f2,
|
||||
$this->z,
|
||||
@ -88,7 +88,7 @@ abstract class Stair extends Transparent{
|
||||
$list[] = $bb2;
|
||||
}
|
||||
}elseif($j === 2){
|
||||
if($bb->intersectsWith($bb2 = new AxisAlignedBB(
|
||||
if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + $f2,
|
||||
$this->z + 0.5,
|
||||
@ -99,7 +99,7 @@ abstract class Stair extends Transparent{
|
||||
$list[] = $bb2;
|
||||
}
|
||||
}elseif($j === 3){
|
||||
if($bb->intersectsWith($bb2 = new AxisAlignedBB(
|
||||
if($bb->intersectsWith($bb2 = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + $f2,
|
||||
$this->z,
|
||||
@ -114,12 +114,9 @@ abstract class Stair extends Transparent{
|
||||
*/
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
if(($this->getDamage() & 0x04) > 0){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + 0.5,
|
||||
$this->z,
|
||||
@ -128,7 +125,7 @@ abstract class Stair extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}else{
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -37,9 +37,6 @@ class StoneWall extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$flag = $this->canConnect($this->getSide(2));
|
||||
$flag1 = $this->canConnect($this->getSide(3));
|
||||
@ -62,7 +59,7 @@ class StoneWall extends Transparent{
|
||||
$f3 = 0.6875;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + $f,
|
||||
$this->y,
|
||||
$this->z + $f2,
|
||||
|
@ -49,7 +49,7 @@ class Sugarcane extends Flowable{
|
||||
if($item->getID() === Item::DYE and $item->getDamage() === 0x0F){ //Bonemeal
|
||||
if($this->getSide(0)->getID() !== self::SUGARCANE_BLOCK){
|
||||
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){
|
||||
Server::getInstance()->getPluginManager()->callEvent($ev = new BlockGrowEvent($b, new Sugarcane()));
|
||||
if(!$ev->isCancelled()){
|
||||
@ -83,7 +83,7 @@ class Sugarcane extends Flowable{
|
||||
if($this->getSide(0)->getID() !== self::SUGARCANE_BLOCK){
|
||||
if($this->meta === 0x0F){
|
||||
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){
|
||||
$this->getLevel()->setBlock($b, new Sugarcane(), true);
|
||||
break;
|
||||
|
@ -30,9 +30,6 @@ abstract class Thin extends Transparent{
|
||||
public $isSolid = false;
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$f = 0.4375;
|
||||
$f1 = 0.5625;
|
||||
@ -66,7 +63,7 @@ abstract class Thin extends Transparent{
|
||||
$f3 = 1;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + $f,
|
||||
$this->y,
|
||||
$this->z + $f2,
|
||||
|
@ -38,9 +38,6 @@ class Trapdoor extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$damage = $this->getDamage();
|
||||
|
||||
@ -49,7 +46,7 @@ class Trapdoor extends Transparent{
|
||||
$bb = null;
|
||||
|
||||
if(($damage & 0x08) > 0){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + 1 - $f,
|
||||
$this->z,
|
||||
@ -58,7 +55,7 @@ class Trapdoor extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}else{
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -70,7 +67,7 @@ class Trapdoor extends Transparent{
|
||||
|
||||
if(($damage & 0x04) > 0){
|
||||
if(($damage & 0x03) === 0){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z + 1 - $f,
|
||||
@ -79,7 +76,7 @@ class Trapdoor extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}elseif(($damage & 0x03) === 1){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -88,7 +85,7 @@ class Trapdoor extends Transparent{
|
||||
$this->z + $f
|
||||
);
|
||||
}if(($damage & 0x03) === 2){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + 1 - $f,
|
||||
$this->y,
|
||||
$this->z,
|
||||
@ -97,7 +94,7 @@ class Trapdoor extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}if(($damage & 0x03) === 3){
|
||||
$bb = new AxisAlignedBB(
|
||||
$bb = AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$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){
|
||||
|
@ -44,9 +44,6 @@ class Vine extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
$f1 = 1;
|
||||
$f2 = 1;
|
||||
@ -96,7 +93,7 @@ class Vine extends Transparent{
|
||||
$f6 = 1;
|
||||
}
|
||||
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x + $f1,
|
||||
$this->y + $f2,
|
||||
$this->z + $f3,
|
||||
|
@ -46,12 +46,9 @@ class WoodSlab extends Transparent{
|
||||
}
|
||||
|
||||
public function getBoundingBox(){
|
||||
if($this->boundingBox !== null){
|
||||
return $this->boundingBox;
|
||||
}
|
||||
|
||||
if(($this->meta & 0x08) > 0){
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y + 0.5,
|
||||
$this->z,
|
||||
@ -60,7 +57,7 @@ class WoodSlab extends Transparent{
|
||||
$this->z + 1
|
||||
);
|
||||
}else{
|
||||
return $this->boundingBox = new AxisAlignedBB(
|
||||
return AxisAlignedBB::getBoundingBoxFromPool(
|
||||
$this->x,
|
||||
$this->y,
|
||||
$this->z,
|
||||
|
@ -98,7 +98,7 @@ class TeleportCommand extends VanillaCommand{
|
||||
$x = $this->getRelativeDouble($target->x, $sender, $args[$pos++]);
|
||||
$y = $this->getRelativeDouble($target->y, $sender, $args[$pos++], 0, 128);
|
||||
$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));
|
||||
|
||||
return true;
|
||||
|
@ -87,7 +87,7 @@ class Arrow extends Projectile{
|
||||
|
||||
$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);
|
||||
|
||||
|
@ -99,7 +99,7 @@ class DroppedItem extends Entity{
|
||||
$friction = 1 - $this->drag;
|
||||
|
||||
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;
|
||||
|
@ -173,7 +173,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
|
||||
$this->boundingBox = new AxisAlignedBB(0, 0, 0, 0, 0, 0);
|
||||
$this->setPositionAndRotation(
|
||||
new Vector3(
|
||||
Vector3::createVector(
|
||||
$this->namedtag["Pos"][0],
|
||||
$this->namedtag["Pos"][1],
|
||||
$this->namedtag["Pos"][2]
|
||||
@ -182,7 +182,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
$this->namedtag->Rotation[1],
|
||||
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)){
|
||||
$this->namedtag->FallDistance = new Float("FallDistance", 0);
|
||||
@ -387,15 +387,15 @@ abstract class Entity extends Location implements Metadatable{
|
||||
|
||||
$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;
|
||||
}else{
|
||||
$flag = !$this->level->isFullBlock(new Vector3($i - 1, $j, $k));
|
||||
$flag1 = !$this->level->isFullBlock(new Vector3($i + 1, $j, $k));
|
||||
//$flag2 = !$this->level->isFullBlock(new Vector3($i, $j - 1, $k));
|
||||
$flag3 = !$this->level->isFullBlock(new Vector3($i, $j + 1, $k));
|
||||
$flag4 = !$this->level->isFullBlock(new Vector3($i, $j, $k - 1));
|
||||
$flag5 = !$this->level->isFullBlock(new Vector3($i, $j, $k + 1));
|
||||
$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));
|
||||
|
||||
$direction = 3; //UP!
|
||||
$limit = 9999;
|
||||
@ -583,7 +583,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);
|
||||
return Vector3::createVector($x, $y, $z);
|
||||
}
|
||||
|
||||
public function onUpdate($currentTick){
|
||||
@ -745,7 +745,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
}
|
||||
|
||||
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){
|
||||
$f = ($pos->y + 1) - ($block->getFluidHeightPercent() - 0.1111111);
|
||||
@ -756,7 +756,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
@ -779,7 +779,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
|
||||
if($this->keepMovement){
|
||||
$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);
|
||||
}else{
|
||||
|
||||
@ -803,7 +803,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
$movY = $dy;
|
||||
$movZ = $dz;
|
||||
|
||||
$axisalignedbb = clone $this->boundingBox;
|
||||
$axisalignedbb = AxisAlignedBB::cloneBoundingBoxFromPool($this->boundingBox);
|
||||
|
||||
/*$sneakFlag = $this->onGround and $this instanceof Player;
|
||||
|
||||
@ -881,7 +881,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
$dy = $this->stepHeight;
|
||||
$dz = $movZ;
|
||||
|
||||
$axisalignedbb1 = clone $this->boundingBox;
|
||||
$axisalignedbb1 = AxisAlignedBB::cloneBoundingBoxFromPool($this->boundingBox);
|
||||
|
||||
$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->minY - $this->ySize,
|
||||
($this->boundingBox->minZ + $this->boundingBox->maxZ) / 2
|
||||
@ -956,7 +956,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
|
||||
if($this instanceof Player){
|
||||
if(!$this->onGround or $movY != 0){
|
||||
$bb = clone $this->boundingBox;
|
||||
$bb = AxisAlignedBB::cloneBoundingBoxFromPool($this->boundingBox);
|
||||
$bb->maxY = $bb->minY + 1;
|
||||
if(count($this->level->getCollisionBlocks($bb->expand(0.01, 0.01, 0.01))) > 0){
|
||||
$this->onGround = true;
|
||||
@ -998,12 +998,13 @@ abstract class Entity extends Location implements Metadatable{
|
||||
$maxY = Math::floorFloat($this->boundingBox->maxY - 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($x = $minX; $x <= $maxX; ++$x){
|
||||
for($y = $minY; $y <= $maxY; ++$y){
|
||||
$block = $this->level->getBlock(new Vector3($x, $y, $z));
|
||||
for($v->z = $minZ; $v->z < $maxZ; ++$v->z){
|
||||
for($v->x = $minX; $v->x < $maxX; ++$v->x){
|
||||
for($v->y = $minY; $v->y < $maxY; ++$v->y){
|
||||
$block = $this->level->getBlock($v);
|
||||
if($block !== null and $block->hasEntityCollision){
|
||||
$block->onEntityCollide($this);
|
||||
if(!($this instanceof Player)){
|
||||
@ -1082,7 +1083,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
}
|
||||
|
||||
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){
|
||||
@ -1145,7 +1146,7 @@ abstract class Entity extends Location implements Metadatable{
|
||||
$this->ySize = 0;
|
||||
$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){
|
||||
$this->fallDistance = 0;
|
||||
$this->onGround = true;
|
||||
|
@ -27,6 +27,7 @@ use pocketmine\event\entity\EntityBlockChangeEvent;
|
||||
use pocketmine\event\entity\EntityDamageEvent;
|
||||
use pocketmine\event\entity\EntityRegainHealthEvent;
|
||||
use pocketmine\item\Item;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\nbt\tag\Byte;
|
||||
use pocketmine\nbt\tag\String;
|
||||
use pocketmine\network\protocol\AddEntityPacket;
|
||||
@ -81,12 +82,12 @@ class FallingBlock extends Entity{
|
||||
|
||||
if(!$this->dead){
|
||||
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){
|
||||
$this->kill();
|
||||
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->motionZ *= $friction;
|
||||
|
||||
$pos = $this->floor();
|
||||
$pos = Vector3::createVector($this->x, $this->y, $this->z)->floor();
|
||||
|
||||
if($this->onGround){
|
||||
$this->kill();
|
||||
|
@ -65,7 +65,7 @@ abstract class Living extends Entity implements Damageable{
|
||||
public function hasLineOfSight(Entity $entity){
|
||||
//TODO: head height
|
||||
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){
|
||||
@ -99,7 +99,7 @@ abstract class Living extends Entity implements Damageable{
|
||||
$f = sqrt($x ** 2 + $z ** 2);
|
||||
$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->y /= 2;
|
||||
|
@ -42,6 +42,9 @@ class InventoryTransactionEvent extends Event implements Cancellable{
|
||||
$this->ts = $ts;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TransactionGroup
|
||||
*/
|
||||
public function getTransaction(){
|
||||
return $this->ts;
|
||||
}
|
||||
|
@ -129,9 +129,8 @@ class SimpleTransactionGroup implements TransactionGroup{
|
||||
public function canExecute(){
|
||||
$haveItems = [];
|
||||
$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(){
|
||||
|
@ -84,27 +84,31 @@ class Explosion{
|
||||
return false;
|
||||
}
|
||||
|
||||
$pointer = Vector3::createVector(0, 0, 0);
|
||||
$vector = Vector3::createVector(0, 0, 0);
|
||||
$vBlock = Vector3::createVector(0, 0, 0);
|
||||
|
||||
$mRays = $this->rays - 1;
|
||||
for($i = 0; $i < $this->rays; ++$i){
|
||||
for($j = 0; $j < $this->rays; ++$j){
|
||||
//break 2 gets here
|
||||
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){
|
||||
$vector = new Vector3($i / $mRays * 2 - 1, $j / $mRays * 2 - 1, $k / $mRays * 2 - 1); //($i / $mRays) * 2 - 1
|
||||
$vector = $vector->normalize()->multiply($this->stepLen);
|
||||
$pointer = clone $this->source;
|
||||
$vector->setComponents($i / $mRays * 2 - 1, $j / $mRays * 2 - 1, $k / $mRays * 2 - 1);
|
||||
$vector->setComponents(($vector->x / ($len = $vector->length())) * $this->stepLen, ($vector->y / $len) * $this->stepLen, ($vector->z / $len) * $this->stepLen);
|
||||
$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){
|
||||
$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){
|
||||
break;
|
||||
}
|
||||
$block = $this->level->getBlock($vBlock);
|
||||
|
||||
if(!($block instanceof Air)){
|
||||
$block->x = $vBlock->x;
|
||||
$block->y = $vBlock->y;
|
||||
$block->z = $vBlock->z;
|
||||
$blastForce -= ($block->getHardness() / 5 + 0.3) * $this->stepLen;
|
||||
if($blastForce > 0){
|
||||
$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(){
|
||||
$send = [];
|
||||
$source = $this->source->floor();
|
||||
$source = Vector3::cloneVector($this->source)->floor();
|
||||
$yield = (1 / $this->size) * 100;
|
||||
|
||||
if($this->what instanceof Entity){
|
||||
@ -146,7 +152,7 @@ class Explosion{
|
||||
$minZ = 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);
|
||||
foreach($list as $entity){
|
||||
|
@ -742,10 +742,12 @@ class Level implements ChunkManager, Metadatable{
|
||||
|
||||
$collides = [];
|
||||
|
||||
for($z = $minZ; $z < $maxZ; ++$z){
|
||||
for($x = $minX; $x < $maxX; ++$x){
|
||||
for($y = $minY - 1; $y < $maxY; ++$y){
|
||||
$block = $this->getBlock(new Vector3($x, $y, $z));
|
||||
$v = Vector3::createVector(0, 0, 0);
|
||||
|
||||
for($v->z = $minZ; $v->z < $maxZ; ++$v->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)){
|
||||
$block->collidesWithBB($bb, $collides);
|
||||
}
|
||||
@ -787,11 +789,12 @@ class Level implements ChunkManager, Metadatable{
|
||||
$maxZ = Math::floorFloat($bb->maxZ + 1);
|
||||
|
||||
$collides = [];
|
||||
$v = Vector3::createVector(0, 0, 0);
|
||||
|
||||
for($z = $minZ; $z < $maxZ; ++$z){
|
||||
for($x = $minX; $x < $maxX; ++$x){
|
||||
for($y = $minY - 1; $y < $maxY; ++$y){
|
||||
$block = $this->getBlock(new Vector3($x, $y, $z));
|
||||
for($v->z = $minZ; $v->z < $maxZ; ++$v->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)){
|
||||
$block->collidesWithBB($bb, $collides);
|
||||
}
|
||||
@ -801,7 +804,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
|
||||
if($entities){
|
||||
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;
|
||||
$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){
|
||||
$ob = $block->calculateIntercept($pos1, $pos2);
|
||||
@ -976,7 +979,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
$this->server->getPluginManager()->callEvent($ev = new BlockUpdateEvent($block));
|
||||
if(!$ev->isCancelled()){
|
||||
$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();
|
||||
}
|
||||
}
|
||||
@ -991,7 +994,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
* @param int $delay
|
||||
*/
|
||||
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){
|
||||
$itemEntity = new DroppedItem($this->getChunk($source->getX() >> 4, $source->getZ() >> 4), new Compound("", [
|
||||
"Pos" => new Enum("Pos", [
|
||||
@ -1074,7 +1077,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
$level = $target->getLevel();
|
||||
|
||||
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->getID() === Item::FIRE){
|
||||
$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[]
|
||||
*/
|
||||
@ -1923,27 +1926,26 @@ class Level implements ChunkManager, Metadatable{
|
||||
$x = Math::floorFloat($spawn->x);
|
||||
$y = Math::floorFloat($spawn->y);
|
||||
$z = Math::floorFloat($spawn->z);
|
||||
for(; $y > 0; --$y){
|
||||
$v = new Vector3($x, $y, $z);
|
||||
$v = Vector3::createVector($x, $y, $z);
|
||||
for(; $v->y > 0; --$v->y){
|
||||
$b = $this->getBlock($v->getSide(0));
|
||||
if($b === false){
|
||||
if($b === null){
|
||||
return $spawn;
|
||||
}elseif(!($b instanceof Air)){
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(; $y < 128; ++$y){
|
||||
$v = new Vector3($x, $y, $z);
|
||||
for(; $v->y < 128; ++$v->y){
|
||||
if($this->getBlock($v->getSide(1)) 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{
|
||||
++$y;
|
||||
++$v->y;
|
||||
}
|
||||
}
|
||||
|
||||
return new Position($spawn->x, $y, $spawn->z, $this);
|
||||
return new Position($spawn->x, $v->y, $spawn->z, $this);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -64,7 +64,7 @@ class MovingObjectPosition{
|
||||
$ob->blockX = $x;
|
||||
$ob->blockY = $y;
|
||||
$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;
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@ class MovingObjectPosition{
|
||||
$ob = new MovingObjectPosition;
|
||||
$ob->typeOfHit = 1;
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
@ -22,11 +22,13 @@
|
||||
namespace pocketmine\math;
|
||||
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{
|
||||
|
||||
|
||||
/** @var AxisAlignedBB[] */
|
||||
private static $boundingBoxes = [];
|
||||
private static $nextBoundingBox = 0;
|
||||
|
||||
public $minX;
|
||||
public $minY;
|
||||
public $minZ;
|
||||
@ -43,6 +45,46 @@ class AxisAlignedBB{
|
||||
$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){
|
||||
$this->minX = $minX;
|
||||
$this->minY = $minY;
|
||||
@ -55,7 +97,7 @@ class AxisAlignedBB{
|
||||
}
|
||||
|
||||
public function addCoord($x, $y, $z){
|
||||
$vec = clone $this;
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
|
||||
if($x < 0){
|
||||
$vec->minX += $x;
|
||||
@ -79,7 +121,7 @@ class AxisAlignedBB{
|
||||
}
|
||||
|
||||
public function grow($x, $y, $z){
|
||||
$vec = clone $this;
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
$vec->minX -= $x;
|
||||
$vec->minY -= $y;
|
||||
$vec->minZ -= $z;
|
||||
@ -113,7 +155,7 @@ class AxisAlignedBB{
|
||||
}
|
||||
|
||||
public function shrink($x, $y, $z){
|
||||
$vec = clone $this;
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
$vec->minX += $x;
|
||||
$vec->minY += $y;
|
||||
$vec->minZ += $z;
|
||||
@ -146,7 +188,7 @@ class AxisAlignedBB{
|
||||
}
|
||||
|
||||
public function getOffsetBoundingBox($x, $y, $z){
|
||||
$vec = clone $this;
|
||||
$vec = self::cloneBoundingBoxFromPool($this);
|
||||
$vec->minX += $x;
|
||||
$vec->minY += $y;
|
||||
$vec->minZ += $z;
|
||||
|
@ -27,6 +27,10 @@ namespace pocketmine\math;
|
||||
*/
|
||||
class Vector3{
|
||||
|
||||
/** @var Vector3[] */
|
||||
private static $vectorList = [];
|
||||
private static $nextVector = 0;
|
||||
|
||||
const SIDE_DOWN = 0;
|
||||
const SIDE_UP = 1;
|
||||
const SIDE_NORTH = 2;
|
||||
@ -44,6 +48,38 @@ class Vector3{
|
||||
$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(){
|
||||
return $this->x;
|
||||
}
|
||||
@ -97,9 +133,9 @@ class Vector3{
|
||||
*/
|
||||
public function add($x, $y = 0, $z = 0){
|
||||
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{
|
||||
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){
|
||||
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){
|
||||
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(){
|
||||
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(){
|
||||
@ -148,17 +184,17 @@ class Vector3{
|
||||
public function getSide($side, $step = 1){
|
||||
switch((int) $side){
|
||||
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:
|
||||
return new Vector3($this->x, $this->y + $step, $this->z);
|
||||
return self::createVector($this->x, $this->y + $step, $this->z);
|
||||
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:
|
||||
return new Vector3($this->x, $this->y, $this->z + $step);
|
||||
return self::createVector($this->x, $this->y, $this->z + $step);
|
||||
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:
|
||||
return new Vector3($this->x + $step, $this->y, $this->z);
|
||||
return self::createVector($this->x + $step, $this->y, $this->z);
|
||||
default:
|
||||
return $this;
|
||||
}
|
||||
@ -218,7 +254,7 @@ class Vector3{
|
||||
return $this->divide($len);
|
||||
}
|
||||
|
||||
return new Vector3(0, 0, 0);
|
||||
return self::createVector(0, 0, 0);
|
||||
}
|
||||
|
||||
public function dot(Vector3 $v){
|
||||
@ -226,7 +262,7 @@ class Vector3{
|
||||
}
|
||||
|
||||
public function cross(Vector3 $v){
|
||||
return new Vector3(
|
||||
return self::createVector(
|
||||
$this->y * $v->z - $this->z * $v->y,
|
||||
$this->z * $v->x - $this->x * $v->z,
|
||||
$this->x * $v->y - $this->y * $v->x
|
||||
@ -256,7 +292,7 @@ class Vector3{
|
||||
if($f < 0 or $f > 1){
|
||||
return null;
|
||||
}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){
|
||||
return null;
|
||||
}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){
|
||||
return null;
|
||||
}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(){
|
||||
return "Vector3(x=" . $this->x . ",y=" . $this->y . ",z=" . $this->z . ")";
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ class Chest extends Spawnable implements InventoryHolder, Container{
|
||||
*/
|
||||
public function getPair(){
|
||||
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){
|
||||
return $tile;
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ class BlockIterator implements \Iterator{
|
||||
$this->level = $level;
|
||||
$this->maxDistance = (int) $maxDistance;
|
||||
|
||||
$startClone = clone $start;
|
||||
$startClone = Vector3::createVector($start->x, $start->y, $start->z);
|
||||
$startClone->y += $yOffset;
|
||||
|
||||
$this->currentDistance = 0;
|
||||
@ -71,7 +71,7 @@ class BlockIterator implements \Iterator{
|
||||
$secondPosition = 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){
|
||||
$this->mainFace = $this->getXFace($direction);
|
||||
|
Loading…
x
Reference in New Issue
Block a user