mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-13 21:35:21 +00:00
Added XP level-up sounds and refactored XP gain sound handling
This commit is contained in:
parent
0410df77aa
commit
03fda936a8
@ -42,6 +42,8 @@ use pocketmine\nbt\tag\IntTag;
|
|||||||
use pocketmine\nbt\tag\ListTag;
|
use pocketmine\nbt\tag\ListTag;
|
||||||
use pocketmine\nbt\tag\StringTag;
|
use pocketmine\nbt\tag\StringTag;
|
||||||
use pocketmine\network\mcpe\protocol\AddPlayerPacket;
|
use pocketmine\network\mcpe\protocol\AddPlayerPacket;
|
||||||
|
use pocketmine\network\mcpe\protocol\LevelEventPacket;
|
||||||
|
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
|
||||||
use pocketmine\network\mcpe\protocol\PlayerSkinPacket;
|
use pocketmine\network\mcpe\protocol\PlayerSkinPacket;
|
||||||
use pocketmine\Player;
|
use pocketmine\Player;
|
||||||
use pocketmine\utils\UUID;
|
use pocketmine\utils\UUID;
|
||||||
@ -306,10 +308,20 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a number of XP levels to the player.
|
* Adds a number of XP levels to the player.
|
||||||
|
*
|
||||||
* @param int $amount
|
* @param int $amount
|
||||||
|
* @param bool $playSound
|
||||||
*/
|
*/
|
||||||
public function addXpLevels(int $amount) : void{
|
public function addXpLevels(int $amount, bool $playSound = true) : void{
|
||||||
$this->setXpLevel($this->getXpLevel() + $amount);
|
$oldLevel = $this->getXpLevel();
|
||||||
|
$this->setXpLevel($oldLevel + $amount);
|
||||||
|
|
||||||
|
if($playSound){
|
||||||
|
$newLevel = $this->getXpLevel();
|
||||||
|
if((int) ($newLevel / 5) > (int) ($oldLevel / 5)){
|
||||||
|
$this->playLevelUpSound($newLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -373,10 +385,30 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
|||||||
* player's lifetime XP.
|
* player's lifetime XP.
|
||||||
*
|
*
|
||||||
* @param int $amount
|
* @param int $amount
|
||||||
|
* @param bool $playSound Whether to play level-up and XP gained sounds.
|
||||||
*/
|
*/
|
||||||
public function addXp(int $amount) : void{
|
public function addXp(int $amount, bool $playSound = true) : void{
|
||||||
$this->totalXp += $amount;
|
$this->totalXp += $amount;
|
||||||
$this->setCurrentTotalXp($this->getCurrentTotalXp() + $amount);
|
|
||||||
|
$oldLevel = $this->getXpLevel();
|
||||||
|
$oldTotal = $this->getCurrentTotalXp();
|
||||||
|
|
||||||
|
$this->setCurrentTotalXp($oldTotal + $amount);
|
||||||
|
|
||||||
|
if($playSound){
|
||||||
|
$newLevel = $this->getXpLevel();
|
||||||
|
|
||||||
|
if((int) ($newLevel / 5) > (int) ($oldLevel / 5)){
|
||||||
|
$this->playLevelUpSound($newLevel);
|
||||||
|
}elseif($this->getCurrentTotalXp() > $oldTotal){
|
||||||
|
$this->level->broadcastLevelEvent($this, LevelEventPacket::EVENT_SOUND_ORB, mt_rand());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function playLevelUpSound(int $newLevel) : void{
|
||||||
|
$volume = 0x10000000 * (min(30, $newLevel) / 5); //No idea why such odd numbers, but this works...
|
||||||
|
$this->level->broadcastLevelSoundEvent($this, LevelSoundEventPacket::SOUND_LEVELUP, 1, (int) $volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,7 +27,6 @@ use pocketmine\entity\Entity;
|
|||||||
use pocketmine\entity\Human;
|
use pocketmine\entity\Human;
|
||||||
use pocketmine\nbt\tag\IntTag;
|
use pocketmine\nbt\tag\IntTag;
|
||||||
use pocketmine\nbt\tag\ShortTag;
|
use pocketmine\nbt\tag\ShortTag;
|
||||||
use pocketmine\network\mcpe\protocol\LevelEventPacket;
|
|
||||||
use pocketmine\Player;
|
use pocketmine\Player;
|
||||||
|
|
||||||
class ExperienceOrb extends Entity{
|
class ExperienceOrb extends Entity{
|
||||||
@ -200,7 +199,6 @@ class ExperienceOrb extends Entity{
|
|||||||
$this->flagForDespawn();
|
$this->flagForDespawn();
|
||||||
|
|
||||||
$currentTarget->addXp($this->getXpValue());
|
$currentTarget->addXp($this->getXpValue());
|
||||||
$this->level->broadcastLevelEvent($this, LevelEventPacket::EVENT_SOUND_ORB, mt_rand());
|
|
||||||
$currentTarget->resetXpCooldown();
|
$currentTarget->resetXpCooldown();
|
||||||
|
|
||||||
//TODO: check Mending enchantment
|
//TODO: check Mending enchantment
|
||||||
|
Loading…
x
Reference in New Issue
Block a user