Implemented block break XP drops

This commit is contained in:
Dylan K. Taylor
2018-04-15 19:03:18 +01:00
parent 1e2122d854
commit 532269a484
9 changed files with 84 additions and 3 deletions

View File

@ -1676,10 +1676,16 @@ class Level implements ChunkManager, Metadatable{
$item = ItemFactory::get(Item::AIR, 0, 0);
}
$drops = ($player !== null and $player->isCreative()) ? [] : array_merge(...array_map(function(Block $block) use ($item) : array{ return $block->getDrops($item); }, $affectedBlocks));
$drops = [];
$xpDrop = 0;
if($player !== null and !$player->isCreative()){
$drops = array_merge(...array_map(function(Block $block) use ($item) : array{ return $block->getDrops($item); }, $affectedBlocks));
$xpDrop = array_sum(array_map(function(Block $block) use ($item) : int{ return $block->getXpDropForTool($item); }, $affectedBlocks));
}
if($player !== null){
$ev = new BlockBreakEvent($player, $target, $item, $player->isCreative(), $drops);
$ev = new BlockBreakEvent($player, $target, $item, $player->isCreative(), $drops, $xpDrop);
if(($player->isSurvival() and !$target->isBreakable($item)) or $player->isSpectator()){
$ev->setCancelled();
@ -1711,6 +1717,7 @@ class Level implements ChunkManager, Metadatable{
}
$drops = $ev->getDrops();
$xpDrop = $ev->getXpDropAmount();
}elseif(!$target->isBreakable($item)){
return false;
@ -1731,6 +1738,10 @@ class Level implements ChunkManager, Metadatable{
}
}
if($xpDrop > 0){
$this->dropExperience($target->add(0.5, 0.5, 0.5), $xpDrop);
}
return true;
}