diff --git a/src/pocketmine/event/player/PlayerAchievementAwardedEvent.php b/src/pocketmine/event/player/PlayerAchievementAwardedEvent.php index 7edcb70190..dfab7b9cef 100644 --- a/src/pocketmine/event/player/PlayerAchievementAwardedEvent.php +++ b/src/pocketmine/event/player/PlayerAchievementAwardedEvent.php @@ -23,8 +23,10 @@ declare(strict_types=1); namespace pocketmine\event\player; +use pocketmine\command\CommandSender; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; +use pocketmine\lang\TextContainer; use pocketmine\player\Player; /** @@ -35,14 +37,22 @@ class PlayerAchievementAwardedEvent extends PlayerEvent implements Cancellable{ /** @var string */ protected $achievement; + /** @var TextContainer|null */ + private $message; + /** @var CommandSender[] */ + private $broadcastRecipients; /** - * @param Player $player - * @param string $achievementId + * @param Player $player + * @param string $achievementId + * @param TextContainer|null $message + * @param CommandSender[] $messageRecipients */ - public function __construct(Player $player, string $achievementId){ + public function __construct(Player $player, string $achievementId, ?TextContainer $message, array $messageRecipients){ $this->player = $player; $this->achievement = $achievementId; + $this->message = $message; + $this->broadcastRecipients = $messageRecipients; } /** @@ -51,4 +61,32 @@ class PlayerAchievementAwardedEvent extends PlayerEvent implements Cancellable{ public function getAchievement() : string{ return $this->achievement; } + + /** + * @return TextContainer|null + */ + public function getMessage() : ?TextContainer{ + return $this->message; + } + + /** + * @param TextContainer|null $message + */ + public function setMessage(?TextContainer $message) : void{ + $this->message = $message; + } + + /** + * @return CommandSender[] + */ + public function getBroadcastRecipients() : array{ + return $this->broadcastRecipients; + } + + /** + * @param CommandSender[] $broadcastRecipients + */ + public function setBroadcastRecipients(array $broadcastRecipients) : void{ + $this->broadcastRecipients = $broadcastRecipients; + } } diff --git a/src/pocketmine/player/Player.php b/src/pocketmine/player/Player.php index 2d2a22e17d..2de37e60b2 100644 --- a/src/pocketmine/player/Player.php +++ b/src/pocketmine/player/Player.php @@ -108,6 +108,7 @@ use pocketmine\world\particle\PunchBlockParticle; use pocketmine\world\Position; use pocketmine\world\World; use function abs; +use function array_filter; use function assert; use function ceil; use function count; @@ -1146,15 +1147,19 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, return false; } } - $ev = new PlayerAchievementAwardedEvent($this, $achievementId); + $ev = new PlayerAchievementAwardedEvent( + $this, + $achievementId, + new TranslationContainer("chat.type.achievement", [$this->getDisplayName(), TextFormat::GREEN . Achievement::$list[$achievementId]["name"] . TextFormat::RESET]), + $this->server->getConfigBool("announce-player-achievements", true) ? array_filter(PermissionManager::getInstance()->getPermissionSubscriptions(Server::BROADCAST_CHANNEL_USERS), function($v){ + return $v instanceof CommandSender; + }) : [$this] + ); $ev->call(); if(!$ev->isCancelled()){ $this->achievements[$achievementId] = true; - $translation = new TranslationContainer("chat.type.achievement", [$this->getDisplayName(), TextFormat::GREEN . Achievement::$list[$achievementId]["name"] . TextFormat::RESET]); - if($this->server->getConfigBool("announce-player-achievements", true)){ - $this->server->broadcastMessage($translation); - }else{ - $this->sendMessage($translation); + if(($message = $ev->getMessage()) !== null){ + $this->server->broadcastMessage($message, $ev->getBroadcastRecipients()); } return true;