Fixed broken logic in EntityEffectEvents, close #1767 (#1768)

This commit is contained in:
Dylan K. Taylor 2017-12-03 16:14:20 +00:00 committed by GitHub
parent c301788864
commit 5a0afa9f88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 15 deletions

View File

@ -24,8 +24,6 @@ declare(strict_types=1);
namespace pocketmine\entity; namespace pocketmine\entity;
use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\EntityEffectAddEvent;
use pocketmine\event\entity\EntityEffectRemoveEvent;
use pocketmine\event\entity\EntityRegainHealthEvent; use pocketmine\event\entity\EntityRegainHealthEvent;
use pocketmine\event\player\PlayerExhaustEvent; use pocketmine\event\player\PlayerExhaustEvent;
use pocketmine\network\mcpe\protocol\MobEffectPacket; use pocketmine\network\mcpe\protocol\MobEffectPacket;
@ -399,10 +397,6 @@ class Effect{
* @param Effect|null $oldEffect * @param Effect|null $oldEffect
*/ */
public function add(Entity $entity, Effect $oldEffect = null){ public function add(Entity $entity, Effect $oldEffect = null){
$entity->getLevel()->getServer()->getPluginManager()->callEvent($ev = new EntityEffectAddEvent($entity, $this, $oldEffect));
if($ev->isCancelled()){
return;
}
if($entity instanceof Player){ if($entity instanceof Player){
$pk = new MobEffectPacket(); $pk = new MobEffectPacket();
$pk->entityRuntimeId = $entity->getId(); $pk->entityRuntimeId = $entity->getId();
@ -457,11 +451,6 @@ class Effect{
* @param bool $send * @param bool $send
*/ */
public function remove(Entity $entity, bool $send = true){ public function remove(Entity $entity, bool $send = true){
$entity->getLevel()->getServer()->getPluginManager()->callEvent($ev = new EntityEffectRemoveEvent($entity, $this));
if($ev->isCancelled()){
return;
}
if($send and $entity instanceof Player){ if($send and $entity instanceof Player){
$pk = new MobEffectPacket(); $pk = new MobEffectPacket();
$pk->entityRuntimeId = $entity->getId(); $pk->entityRuntimeId = $entity->getId();

View File

@ -28,6 +28,8 @@ use pocketmine\event\entity\EntityDamageByChildEntityEvent;
use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageByEntityEvent;
use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\EntityDeathEvent; use pocketmine\event\entity\EntityDeathEvent;
use pocketmine\event\entity\EntityEffectAddEvent;
use pocketmine\event\entity\EntityEffectRemoveEvent;
use pocketmine\event\entity\EntityRegainHealthEvent; use pocketmine\event\entity\EntityRegainHealthEvent;
use pocketmine\event\Timings; use pocketmine\event\Timings;
use pocketmine\item\Item as ItemItem; use pocketmine\item\Item as ItemItem;
@ -197,6 +199,11 @@ abstract class Living extends Entity implements Damageable{
public function removeEffect(int $effectId){ public function removeEffect(int $effectId){
if(isset($this->effects[$effectId])){ if(isset($this->effects[$effectId])){
$effect = $this->effects[$effectId]; $effect = $this->effects[$effectId];
$this->server->getPluginManager()->callEvent($ev = new EntityEffectRemoveEvent($this, $effect));
if($ev->isCancelled()){
return;
}
unset($this->effects[$effectId]); unset($this->effects[$effectId]);
$effect->remove($this); $effect->remove($this);
@ -237,19 +244,28 @@ abstract class Living extends Entity implements Damageable{
* @return bool whether the effect has been successfully applied. * @return bool whether the effect has been successfully applied.
*/ */
public function addEffect(Effect $effect) : bool{ public function addEffect(Effect $effect) : bool{
$oldEffect = null;
$cancelled = false;
if(isset($this->effects[$effect->getId()])){ if(isset($this->effects[$effect->getId()])){
$oldEffect = $this->effects[$effect->getId()]; $oldEffect = $this->effects[$effect->getId()];
if( if(
abs($effect->getAmplifier()) < $oldEffect->getAmplifier() abs($effect->getAmplifier()) < $oldEffect->getAmplifier()
or (abs($effect->getAmplifier()) === abs($oldEffect->getAmplifier()) and $effect->getDuration() < $oldEffect->getDuration()) or (abs($effect->getAmplifier()) === abs($oldEffect->getAmplifier()) and $effect->getDuration() < $oldEffect->getDuration())
){ ){
return false; $cancelled = true;
} }
$effect->add($this, $oldEffect);
}else{
$effect->add($this);
} }
$ev = new EntityEffectAddEvent($this, $effect, $oldEffect);
$ev->setCancelled($cancelled);
$this->server->getPluginManager()->callEvent($ev);
if($ev->isCancelled()){
return false;
}
$effect->add($this, $oldEffect);
$this->effects[$effect->getId()] = $effect; $this->effects[$effect->getId()] = $effect;
$this->recalculateEffectColor(); $this->recalculateEffectColor();