mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-04 00:59:51 +00:00
Use standard subchunk iterator code in Explosion
this causes a slight performance loss (<10%), but in a sane language this would be inlined anyway
This commit is contained in:
parent
d3e5733ea0
commit
88318d740a
@ -35,6 +35,7 @@ use pocketmine\event\entity\EntityExplodeEvent;
|
|||||||
use pocketmine\item\Item;
|
use pocketmine\item\Item;
|
||||||
use pocketmine\item\ItemFactory;
|
use pocketmine\item\ItemFactory;
|
||||||
use pocketmine\level\particle\HugeExplodeSeedParticle;
|
use pocketmine\level\particle\HugeExplodeSeedParticle;
|
||||||
|
use pocketmine\level\utils\SubChunkIteratorManager;
|
||||||
use pocketmine\math\AxisAlignedBB;
|
use pocketmine\math\AxisAlignedBB;
|
||||||
use pocketmine\math\Math;
|
use pocketmine\math\Math;
|
||||||
use pocketmine\math\Vector3;
|
use pocketmine\math\Vector3;
|
||||||
@ -58,11 +59,16 @@ class Explosion{
|
|||||||
/** @var Entity|Block */
|
/** @var Entity|Block */
|
||||||
private $what;
|
private $what;
|
||||||
|
|
||||||
|
/** @var SubChunkIteratorManager */
|
||||||
|
private $subChunkHandler;
|
||||||
|
|
||||||
public function __construct(Position $center, $size, $what = null){
|
public function __construct(Position $center, $size, $what = null){
|
||||||
$this->level = $center->getLevel();
|
$this->level = $center->getLevel();
|
||||||
$this->source = $center;
|
$this->source = $center;
|
||||||
$this->size = max($size, 0);
|
$this->size = max($size, 0);
|
||||||
$this->what = $what;
|
$this->what = $what;
|
||||||
|
|
||||||
|
$this->subChunkHandler = new SubChunkIteratorManager($this->level, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,11 +82,6 @@ class Explosion{
|
|||||||
$vector = new Vector3(0, 0, 0);
|
$vector = new Vector3(0, 0, 0);
|
||||||
$vBlock = new Position(0, 0, 0, $this->level);
|
$vBlock = new Position(0, 0, 0, $this->level);
|
||||||
|
|
||||||
$currentX = ((int) $this->source->x) >> 4;
|
|
||||||
$currentZ = ((int) $this->source->z) >> 4;
|
|
||||||
|
|
||||||
$currentSubY = ((int) $this->source->y) >> 4;
|
|
||||||
|
|
||||||
$currentChunk = null;
|
$currentChunk = null;
|
||||||
$currentSubChunk = null;
|
$currentSubChunk = null;
|
||||||
|
|
||||||
@ -103,33 +104,17 @@ class Explosion{
|
|||||||
$vBlock->y = $pointerY >= $y ? $y : $y - 1;
|
$vBlock->y = $pointerY >= $y ? $y : $y - 1;
|
||||||
$vBlock->z = $pointerZ >= $z ? $z : $z - 1;
|
$vBlock->z = $pointerZ >= $z ? $z : $z - 1;
|
||||||
|
|
||||||
|
if(!$this->subChunkHandler->moveTo($vBlock->x, $vBlock->y, $vBlock->z)){
|
||||||
if($currentChunk === null or ($vBlock->x >> 4) !== $currentX or ($vBlock->z >> 4) !== $currentZ){
|
|
||||||
$currentX = $vBlock->x >> 4;
|
|
||||||
$currentZ = $vBlock->z >> 4;
|
|
||||||
$currentSubChunk = null;
|
|
||||||
|
|
||||||
$currentChunk = $this->level->getChunk($currentX, $currentZ);
|
|
||||||
if($currentChunk === null){
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if($currentSubChunk === null or ($vBlock->y >> 4) !== $currentSubY){
|
$blockId = $this->subChunkHandler->currentSubChunk->getBlockId($vBlock->x & 0x0f, $vBlock->y & 0x0f, $vBlock->z & 0x0f);
|
||||||
$currentSubY = $vBlock->y >> 4;
|
|
||||||
$currentSubChunk = $currentChunk->getSubChunk($currentSubY);
|
|
||||||
if($currentSubChunk === null){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$blockId = $currentSubChunk->getBlockId($vBlock->x & 0x0f, $vBlock->y & 0x0f, $vBlock->z & 0x0f);
|
|
||||||
|
|
||||||
if($blockId !== 0){
|
if($blockId !== 0){
|
||||||
$blastForce -= (BlockFactory::$blastResistance[$blockId] / 5 + 0.3) * $this->stepLen;
|
$blastForce -= (BlockFactory::$blastResistance[$blockId] / 5 + 0.3) * $this->stepLen;
|
||||||
if($blastForce > 0){
|
if($blastForce > 0){
|
||||||
if(!isset($this->affectedBlocks[$index = Level::blockHash($vBlock->x, $vBlock->y, $vBlock->z)])){
|
if(!isset($this->affectedBlocks[$index = Level::blockHash($vBlock->x, $vBlock->y, $vBlock->z)])){
|
||||||
$this->affectedBlocks[$index] = BlockFactory::get($blockId, $currentSubChunk->getBlockData($vBlock->x & 0x0f, $vBlock->y & 0x0f, $vBlock->z & 0x0f), $vBlock);
|
$this->affectedBlocks[$index] = BlockFactory::get($blockId, $this->subChunkHandler->currentSubChunk->getBlockData($vBlock->x & 0x0f, $vBlock->y & 0x0f, $vBlock->z & 0x0f), $vBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user