From cd02f1e4be16deba003c8629326d53ce8919ae0b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 30 Jun 2017 17:31:41 +0100 Subject: [PATCH] Minor performance improvement to explosions This improves calculation time by 20-25% per explosion on flat terrain. --- src/pocketmine/block/Block.php | 4 ++++ src/pocketmine/level/Explosion.php | 14 +++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pocketmine/block/Block.php b/src/pocketmine/block/Block.php index 197b3a29c0..3fcf7824a3 100644 --- a/src/pocketmine/block/Block.php +++ b/src/pocketmine/block/Block.php @@ -58,6 +58,8 @@ class Block extends Position implements BlockIds, Metadatable{ public static $transparent = null; /** @var \SplFixedArray */ public static $diffusesSkyLight = null; + /** @var \SplFixedArray */ + public static $blastResistance = null; /** * Initializes the block factory. By default this is called only once on server start, however you may wish to use @@ -75,6 +77,7 @@ class Block extends Position implements BlockIds, Metadatable{ self::$hardness = new \SplFixedArray(256); self::$transparent = new \SplFixedArray(256); self::$diffusesSkyLight = new \SplFixedArray(256); + self::$blastResistance = new \SplFixedArray(256); self::registerBlock(new Air()); self::registerBlock(new Stone()); @@ -366,6 +369,7 @@ class Block extends Position implements BlockIds, Metadatable{ self::$light[$id] = $block->getLightLevel(); self::$lightFilter[$id] = $block->getLightFilter() + 1; //opacity plus 1 standard light filter self::$diffusesSkyLight[$id] = $block->diffusesSkyLight(); + self::$blastResistance[$id] = $block->getBlastResistance(); } /** diff --git a/src/pocketmine/level/Explosion.php b/src/pocketmine/level/Explosion.php index 85099ea414..c822fee9ca 100644 --- a/src/pocketmine/level/Explosion.php +++ b/src/pocketmine/level/Explosion.php @@ -89,23 +89,27 @@ class Explosion{ $vBlock->x = $pointerX >= $x ? $x : $x - 1; $vBlock->y = $pointerY >= $y ? $y : $y - 1; $vBlock->z = $pointerZ >= $z ? $z : $z - 1; + if(!$this->level->isInWorld($vBlock->x, $vBlock->y, $vBlock->z)){ break; } - $block = $this->level->getBlock($vBlock); - if($block->getId() !== 0){ - $blastForce -= ($block->getBlastResistance() / 5 + 0.3) * $this->stepLen; + $blockId = $this->level->getBlockIdAt($vBlock->x, $vBlock->y, $vBlock->z); + + if($blockId !== 0){ + $blastForce -= (Block::$blastResistance[$blockId] / 5 + 0.3) * $this->stepLen; if($blastForce > 0){ - if(!isset($this->affectedBlocks[$index = Level::blockHash($block->x, $block->y, $block->z)])){ - $this->affectedBlocks[$index] = $block; + if(!isset($this->affectedBlocks[$index = Level::blockHash($vBlock->x, $vBlock->y, $vBlock->z)])){ + $this->affectedBlocks[$index] = $this->level->getBlock($vBlock); } } } + $pointerX += $vector->x; $pointerY += $vector->y; $pointerZ += $vector->z; } + } } }