backport b8d1eb20b: EntityDeathEvent: add XP amount API, closes #2690

This commit is contained in:
Dylan K. Taylor 2019-03-21 19:53:14 +00:00
parent ec5598dbb1
commit 0fabc0c199
4 changed files with 32 additions and 9 deletions

View File

@ -3665,7 +3665,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
//main inventory and drops the rest on the ground.
$this->doCloseInventory();
$ev = new PlayerDeathEvent($this, $this->getDrops());
$ev = new PlayerDeathEvent($this, $this->getDrops(), null, $this->getXpDropAmount());
$ev->call();
if(!$ev->getKeepInventory()){
@ -3682,8 +3682,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
}
//TODO: allow this number to be manipulated during PlayerDeathEvent
$this->level->dropExperience($this, $this->getXpDropAmount());
$this->level->dropExperience($this, $ev->getXpDropAmount());
$this->setXpAndProgress(0, 0);
if($ev->getDeathMessage() != ""){

View File

@ -639,15 +639,14 @@ abstract class Living extends Entity implements Damageable{
}
protected function onDeath() : void{
$ev = new EntityDeathEvent($this, $this->getDrops());
$ev = new EntityDeathEvent($this, $this->getDrops(), $this->getXpDropAmount());
$ev->call();
foreach($ev->getDrops() as $item){
$this->getLevel()->dropItem($this, $item);
}
//TODO: check death conditions (must have been damaged by player < 5 seconds from death)
//TODO: allow this number to be manipulated during EntityDeathEvent
$this->level->dropExperience($this, $this->getXpDropAmount());
$this->level->dropExperience($this, $ev->getXpDropAmount());
}
protected function onDeathUpdate(int $tickDiff) : bool{

View File

@ -29,14 +29,18 @@ use pocketmine\item\Item;
class EntityDeathEvent extends EntityEvent{
/** @var Item[] */
private $drops = [];
/** @var int */
private $xp;
/**
* @param Living $entity
* @param Item[] $drops
* @param int $xp
*/
public function __construct(Living $entity, array $drops = []){
public function __construct(Living $entity, array $drops = [], int $xp = 0){
$this->entity = $entity;
$this->drops = $drops;
$this->xp = $xp;
}
/**
@ -59,4 +63,24 @@ class EntityDeathEvent extends EntityEvent{
public function setDrops(array $drops) : void{
$this->drops = $drops;
}
/**
* Returns how much experience is dropped due to this entity's death.
* @return int
*/
public function getXpDropAmount() : int{
return $this->xp;
}
/**
* @param int $xp
*
* @throws \InvalidArgumentException
*/
public function setXpDropAmount(int $xp) : void{
if($xp < 0){
throw new \InvalidArgumentException("XP drop amount must not be negative");
}
$this->xp = $xp;
}
}

View File

@ -46,9 +46,10 @@ class PlayerDeathEvent extends EntityDeathEvent{
* @param Player $entity
* @param Item[] $drops
* @param string|TextContainer|null $deathMessage Null will cause the default vanilla message to be used
* @param int $xp
*/
public function __construct(Player $entity, array $drops, $deathMessage = null){
parent::__construct($entity, $drops);
public function __construct(Player $entity, array $drops, $deathMessage = null, int $xp = 0){
parent::__construct($entity, $drops, $xp);
$this->deathMessage = $deathMessage ?? self::deriveMessage($entity->getDisplayName(), $entity->getLastDamageCause());
}