diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index b8d13fb7a1..1f71de95f8 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -892,21 +892,7 @@ abstract class Entity extends Location implements Metadatable{ $this->setLastDamageCause($source); - $damage = $source->getFinalDamage(); - - $absorption = $this->getAbsorption(); - if($absorption > 0){ - if($absorption > $damage){ - //Use absorption health before normal health. - $this->setAbsorption($absorption - $damage); - $damage = 0; - }else{ - $this->setAbsorption(0); - $damage -= $absorption; - } - } - - $this->setHealth($this->getHealth() - $damage); + $this->setHealth($this->getHealth() - $source->getFinalDamage()); } /** @@ -953,14 +939,6 @@ abstract class Entity extends Location implements Metadatable{ } } - public function getAbsorption() : float{ - return 0; - } - - public function setAbsorption(float $absorption){ - - } - /** * @param EntityDamageEvent $type */ diff --git a/src/pocketmine/entity/Living.php b/src/pocketmine/entity/Living.php index 8c4d01b19a..3cde9874e1 100644 --- a/src/pocketmine/entity/Living.php +++ b/src/pocketmine/entity/Living.php @@ -342,8 +342,10 @@ abstract class Living extends Entity implements Damageable{ $source->setCancelled(); } + $source->setDamage(-min($this->getAbsorption(), $source->getFinalDamage()), EntityDamageEvent::MODIFIER_ABSORPTION); + if($this->hasEffect(Effect::DAMAGE_RESISTANCE)){ - $source->setDamage(-($source->getDamage(EntityDamageEvent::MODIFIER_BASE) * 0.20 * $this->getEffect(Effect::DAMAGE_RESISTANCE)->getEffectLevel()), EntityDamageEvent::MODIFIER_RESISTANCE); + $source->setDamage(-($source->getFinalDamage() * 0.20 * $this->getEffect(Effect::DAMAGE_RESISTANCE)->getEffectLevel()), EntityDamageEvent::MODIFIER_RESISTANCE); } parent::attack($source); @@ -369,6 +371,8 @@ abstract class Living extends Entity implements Damageable{ } } + $this->setAbsorption(max(0, $this->getAbsorption() + $source->getDamage(EntityDamageEvent::MODIFIER_ABSORPTION))); + $pk = new EntityEventPacket(); $pk->entityRuntimeId = $this->getId(); $pk->event = $this->getHealth() <= 0 ? EntityEventPacket::DEATH_ANIMATION : EntityEventPacket::HURT_ANIMATION; //Ouch! diff --git a/src/pocketmine/event/entity/EntityDamageEvent.php b/src/pocketmine/event/entity/EntityDamageEvent.php index 836ed2feca..4194f425e4 100644 --- a/src/pocketmine/event/entity/EntityDamageEvent.php +++ b/src/pocketmine/event/entity/EntityDamageEvent.php @@ -37,6 +37,7 @@ class EntityDamageEvent extends EntityEvent implements Cancellable{ const MODIFIER_STRENGTH = 2; const MODIFIER_WEAKNESS = 3; const MODIFIER_RESISTANCE = 4; + const MODIFIER_ABSORPTION = 5; const CAUSE_CONTACT = 0; const CAUSE_ENTITY_ATTACK = 1;