diff --git a/src/entity/Entity.php b/src/entity/Entity.php index cc7647912..8a406924e 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -519,7 +519,12 @@ abstract class Entity{ } public function attack(EntityDamageEvent $source) : void{ - if($this->isFireProof() && ($source->getCause() === EntityDamageEvent::CAUSE_FIRE || $source->getCause() === EntityDamageEvent::CAUSE_FIRE_TICK)){ + if($this->isFireProof() && ( + $source->getCause() === EntityDamageEvent::CAUSE_FIRE || + $source->getCause() === EntityDamageEvent::CAUSE_FIRE_TICK || + $source->getCause() === EntityDamageEvent::CAUSE_LAVA + ) + ){ $source->cancel(); } $source->call(); @@ -686,8 +691,10 @@ abstract class Entity{ if($fireTicks < 0 || $fireTicks > 0x7fff){ throw new \InvalidArgumentException("Fire ticks must be in range 0 ... " . 0x7fff . ", got $fireTicks"); } - $this->fireTicks = $fireTicks; - $this->networkPropertiesDirty = true; + if(!$this->isFireProof()){ + $this->fireTicks = $fireTicks; + $this->networkPropertiesDirty = true; + } } public function extinguish() : void{ @@ -700,12 +707,13 @@ abstract class Entity{ } protected function doOnFireTick(int $tickDiff = 1) : bool{ - if($this->isFireProof() && $this->fireTicks > 1){ - $this->fireTicks = 1; - }else{ - $this->fireTicks -= $tickDiff; + if($this->isFireProof() && $this->isOnFire()){ + $this->extinguish(); + return false; } + $this->fireTicks -= $tickDiff; + if(($this->fireTicks % 20 === 0) || $tickDiff > 20){ $this->dealFireDamage(); } diff --git a/src/entity/Living.php b/src/entity/Living.php index 016146b3a..61ad48da1 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -507,7 +507,7 @@ abstract class Living extends Entity{ } public function attack(EntityDamageEvent $source) : void{ - if($this->noDamageTicks > 0){ + if($this->noDamageTicks > 0 && $source->getCause() !== EntityDamageEvent::CAUSE_SUICIDE){ $source->cancel(); } diff --git a/src/player/Player.php b/src/player/Player.php index 4a13654d7..f8d4923f0 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1199,10 +1199,6 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return !$this->gamemode->equals(GameMode::CREATIVE()); } - public function isFireProof() : bool{ - return $this->isCreative(); - } - public function getDrops() : array{ if($this->hasFiniteResources()){ return parent::getDrops(); @@ -1440,6 +1436,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->entityBaseTick($tickDiff); Timings::$entityBaseTick->stopTiming(); + if($this->isCreative() && $this->fireTicks > 1){ + $this->fireTicks = 1; + } + if(!$this->isSpectator() && $this->isAlive()){ Timings::$playerCheckNearEntities->startTiming(); $this->checkNearEntities();