From e9a2f8884775c7b97fabf052d39cb6349928c9d3 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Tue, 16 Sep 2014 10:42:29 +0200 Subject: [PATCH] Added Fire, Lava damage --- src/pocketmine/block/Block.php | 8 ++++++++ src/pocketmine/block/FenceGate.php | 2 +- src/pocketmine/block/Fire.php | 11 +++++++++++ src/pocketmine/block/Lava.php | 11 +++++++++++ src/pocketmine/block/StillLava.php | 17 +++++++++++++++++ src/pocketmine/entity/Entity.php | 29 +++++++++++++++-------------- 6 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/pocketmine/block/Block.php b/src/pocketmine/block/Block.php index f5e4b4f1b..1b9283f32 100644 --- a/src/pocketmine/block/Block.php +++ b/src/pocketmine/block/Block.php @@ -24,6 +24,7 @@ */ namespace pocketmine\block; +use pocketmine\entity\Entity; use pocketmine\entity\Villager; use pocketmine\entity\Zombie; use pocketmine\item\Item; @@ -832,6 +833,13 @@ abstract class Block extends Position implements Metadatable{ } } + /** + * @param Entity $entity + */ + public function onEntityCollide(Entity $entity){ + + } + /** * @return AxisAlignedBB */ diff --git a/src/pocketmine/block/FenceGate.php b/src/pocketmine/block/FenceGate.php index 9d9a85779..9e144b55c 100644 --- a/src/pocketmine/block/FenceGate.php +++ b/src/pocketmine/block/FenceGate.php @@ -42,7 +42,7 @@ class FenceGate extends Transparent{ if(($this->getDamage() & 0x04) > 0){ return null; } - + $i = ($this->getDamage() & 0x03); if($i === 2 and $i === 0){ return new AxisAlignedBB( diff --git a/src/pocketmine/block/Fire.php b/src/pocketmine/block/Fire.php index f785cdbaf..ec8895119 100644 --- a/src/pocketmine/block/Fire.php +++ b/src/pocketmine/block/Fire.php @@ -22,7 +22,10 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\entity\Entity; use pocketmine\level\Level; +use pocketmine\event\entity\EntityDamageEvent; +use pocketmine\Server; class Fire extends Flowable{ public function __construct($meta = 0){ @@ -37,6 +40,14 @@ class Fire extends Flowable{ return null; } + public function onEntityCollide(Entity $entity){ + $entity->setOnFire(8); + $ev = new EntityDamageEvent($entity, EntityDamageEvent::CAUSE_FIRE, 1); + Server::getInstance()->getPluginManager()->callEvent($ev); + if(!$ev->isCancelled()){ + $entity->attack($ev->getFinalDamage(), $ev); + } + } public function getDrops(Item $item){ return []; diff --git a/src/pocketmine/block/Lava.php b/src/pocketmine/block/Lava.php index a73ecde5e..6e301ef37 100644 --- a/src/pocketmine/block/Lava.php +++ b/src/pocketmine/block/Lava.php @@ -22,10 +22,12 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\entity\Entity; use pocketmine\level\Level; use pocketmine\level\Position; use pocketmine\Player; use pocketmine\Server; +use pocketmine\event\entity\EntityDamageEvent; class Lava extends Liquid{ public function __construct($meta = 0){ @@ -37,6 +39,15 @@ class Lava extends Liquid{ return null; } + public function onEntityCollide(Entity $entity){ + $entity->setOnFire(15); + $ev = new EntityDamageEvent($entity, EntityDamageEvent::CAUSE_LAVA, 4); + Server::getInstance()->getPluginManager()->callEvent($ev); + if(!$ev->isCancelled()){ + $entity->attack($ev->getFinalDamage(), $ev); + } + $entity->attack(4, EntityDamageEvent::CAUSE_LAVA); + } public function place(Item $item, Block $block, Block $target, $face, $fx, $fy, $fz, Player $player = null){ $ret = $this->getLevel()->setBlock($this, $this, true); diff --git a/src/pocketmine/block/StillLava.php b/src/pocketmine/block/StillLava.php index 33808bcdd..cd3143894 100644 --- a/src/pocketmine/block/StillLava.php +++ b/src/pocketmine/block/StillLava.php @@ -21,6 +21,9 @@ namespace pocketmine\block; +use pocketmine\event\entity\EntityDamageEvent; +use pocketmine\Server; +use pocketmine\entity\Entity; class StillLava extends Liquid{ public function __construct($meta = 0){ @@ -28,4 +31,18 @@ class StillLava extends Liquid{ $this->hardness = 500; } + public function getBoundingBox(){ + return null; + } + + public function onEntityCollide(Entity $entity){ + $entity->setOnFire(15); + $ev = new EntityDamageEvent($entity, EntityDamageEvent::CAUSE_LAVA, 4); + Server::getInstance()->getPluginManager()->callEvent($ev); + if(!$ev->isCancelled()){ + $entity->attack($ev->getFinalDamage(), $ev); + } + $entity->attack(4, EntityDamageEvent::CAUSE_LAVA); + } + } \ No newline at end of file diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 027e5ad29..8c8110d84 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -460,6 +460,8 @@ abstract class Entity extends Position implements Metadatable{ $hasUpdate = false; $this->updateMovement(); + $this->checkBlockCollision(); + if($this->handleWaterMovement()){ $this->fallDistance = 0; $this->inWater = true; @@ -483,7 +485,11 @@ abstract class Entity extends Position implements Metadatable{ } }else{ if(($this->fireTicks % 20) === 0){ - $this->attack(1, EntityDamageEvent::CAUSE_FIRE_TICK); + $ev = new EntityDamageEvent($this, EntityDamageEvent::CAUSE_FIRE_TICK, 1); + $this->server->getPluginManager()->callEvent($ev); + if(!$ev->isCancelled()){ + $this->attack($ev->getFinalDamage(), $ev); + } } --$this->fireTicks; } @@ -491,8 +497,8 @@ abstract class Entity extends Position implements Metadatable{ } if($this->handleLavaMovement()){ - $this->attack(4, EntityDamageEvent::CAUSE_LAVA); - $this->setOnFire(15); + //$this->attack(4, EntityDamageEvent::CAUSE_LAVA); + //$this->setOnFire(15); $hasUpdate = true; $this->fallDistance *= 0.5; } @@ -712,8 +718,7 @@ abstract class Entity extends Position implements Metadatable{ } public function move($dx, $dy, $dz){ - //$collision = []; - //$this->checkBlockCollision($collision); + if($dx == 0 and $dz == 0 and $dy == 0){ return true; } @@ -932,12 +937,7 @@ abstract class Entity extends Position implements Metadatable{ //} } - /** - * @param Block[] $list - * - * @return Block[] - */ - protected function checkBlockCollision(&$list = []){ + protected function checkBlockCollision(){ $minX = floor($this->boundingBox->minX + 0.001); $minY = floor($this->boundingBox->minY + 0.001); $minZ = floor($this->boundingBox->minZ + 0.001); @@ -948,12 +948,13 @@ abstract class Entity extends Position implements Metadatable{ for($z = $minZ; $z <= $maxZ; ++$z){ for($x = $minX; $x <= $maxX; ++$x){ for($y = $minY; $y <= $maxY; ++$y){ - $this->getLevel()->getBlock(new Vector3($x, $y, $z))->collidesWithBB($this->boundingBox, $list); + $block = $this->getLevel()->getBlock(new Vector3($x, $y, $z)); + if($block !== null and $block->getID() > 0){ + $block->onEntityCollide($this); + } } } } - - return $list; } public function setPositionAndRotation(Vector3 $pos, $yaw, $pitch, $force = false){