From 02cf6ae46c07a3670c11f288579e0d0f94493f7b Mon Sep 17 00:00:00 2001 From: TheNewHEROBRINEX Date: Sat, 21 May 2022 17:41:14 +0200 Subject: [PATCH] Added PlayerDeathEvent->setKeepXp(), closes #4002 (#4015) --- src/event/player/PlayerDeathEvent.php | 9 +++++++++ src/player/Player.php | 10 ++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/event/player/PlayerDeathEvent.php b/src/event/player/PlayerDeathEvent.php index 8eb6e6e6a..3c8e7ec59 100644 --- a/src/event/player/PlayerDeathEvent.php +++ b/src/event/player/PlayerDeathEvent.php @@ -40,6 +40,7 @@ class PlayerDeathEvent extends EntityDeathEvent{ private Translatable|string $deathMessage; private bool $keepInventory = false; + private bool $keepXp = false; /** * @param Item[] $drops @@ -78,6 +79,14 @@ class PlayerDeathEvent extends EntityDeathEvent{ $this->keepInventory = $keepInventory; } + public function getKeepXp() : bool{ + return $this->keepXp; + } + + public function setKeepXp(bool $keepXp) : void{ + $this->keepXp = $keepXp; + } + /** * Returns the vanilla death message for the given death cause. */ diff --git a/src/player/Player.php b/src/player/Player.php index edfa881ab..4aec23135 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -33,6 +33,7 @@ use pocketmine\data\java\GameModeIdMap; use pocketmine\entity\animation\Animation; use pocketmine\entity\animation\ArmSwingAnimation; use pocketmine\entity\animation\CriticalHitAnimation; +use pocketmine\entity\Attribute; use pocketmine\entity\effect\VanillaEffects; use pocketmine\entity\Entity; use pocketmine\entity\Human; @@ -2223,8 +2224,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } } - $this->getWorld()->dropExperience($this->location, $ev->getXpDropAmount()); - $this->xpManager->setXpAndProgress(0, 0.0); + if(!$ev->getKeepXp()){ + $this->getWorld()->dropExperience($this->location, $ev->getXpDropAmount()); + $this->xpManager->setXpAndProgress(0, 0.0); + } if($ev->getDeathMessage() != ""){ $this->server->broadcastMessage($ev->getDeathMessage()); @@ -2285,6 +2288,9 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->setHealth($this->getMaxHealth()); foreach($this->attributeMap->getAll() as $attr){ + if($attr->getId() === Attribute::EXPERIENCE || $attr->getId() === Attribute::EXPERIENCE_LEVEL){ //we have already reset both of those if needed when the player died + continue; + } $attr->resetToDefault(); }