mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-19 04:05:31 +00:00
Better explosion damage calculation
This commit is contained in:
parent
275e27f7a9
commit
c4a5a9c849
@ -48,7 +48,7 @@ class Explosion{
|
|||||||
for($j = 0; $j < $this->rays; ++$j){
|
for($j = 0; $j < $this->rays; ++$j){
|
||||||
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);
|
$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);
|
$vector = $vector->normalize()->multiply($this->stepLen);
|
||||||
$pointer = clone $this->source;
|
$pointer = clone $this->source;
|
||||||
|
|
||||||
@ -57,12 +57,15 @@ class Explosion{
|
|||||||
if($vBlock->y >= 128 or $vBlock->y < 0){
|
if($vBlock->y >= 128 or $vBlock->y < 0){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$block = $this->level->getBlock($vBlock);
|
$block = $this->level->getBlockRaw($vBlock);
|
||||||
|
|
||||||
if(!($block instanceof AirBlock)){
|
if(!($block instanceof AirBlock)){
|
||||||
$blastForce -= ($block->getHardness() / 5 + 0.3) * $this->stepLen;
|
$blastForce -= ($block->getHardness() / 5 + 0.3) * $this->stepLen;
|
||||||
if($blastForce > 0){
|
if($blastForce > 0){
|
||||||
$this->affectedBlocks[$vBlock->x.":".$vBlock->y.":".$vBlock->z] = $block;
|
$index = ($vBlock->x << 15) + ($vBlock->z << 7) + $vBlock->y;
|
||||||
|
if(!isset($this->affectedBlocks[$index])){
|
||||||
|
$this->affectedBlocks[$index] = $block;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$pointer = $pointer->add($vector);
|
$pointer = $pointer->add($vector);
|
||||||
@ -75,10 +78,10 @@ class Explosion{
|
|||||||
$send = array();
|
$send = array();
|
||||||
$airblock = new AirBlock();
|
$airblock = new AirBlock();
|
||||||
$source = $this->source->floor();
|
$source = $this->source->floor();
|
||||||
|
$radius = 2 * $this->size;
|
||||||
foreach($server->api->entity->getRadius($this->source, 10) as $entity){
|
foreach($server->api->entity->getRadius($this->source, $radius) as $entity){
|
||||||
$impact = (1 - $this->source->distance($entity) / 10);
|
$impact = (1 - $this->source->distance($entity) / $radius) * 0.5; //placeholder, 0.7 should be exposure
|
||||||
$damage = (int) (($impact * $impact + $impact) * 4 * $this->size + 1);
|
$damage = (int) (($impact * $impact + $impact) * 8 * $this->size + 1);
|
||||||
$entity->harm($damage, "explosion");
|
$entity->harm($damage, "explosion");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user