make PlayerAchievementAwardedEvent less useless

This commit is contained in:
Dylan K. Taylor 2019-07-19 18:59:06 +01:00
parent b4df1ac547
commit 556beacdbf
2 changed files with 52 additions and 9 deletions

View File

@ -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 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;
}
}

View File

@ -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;