From a9e5f929585a99bc4c8f010751083355d41bf30d Mon Sep 17 00:00:00 2001 From: IvanCraft623 <57236932+IvanCraft623@users.noreply.github.com> Date: Thu, 22 Dec 2022 10:36:31 -0500 Subject: [PATCH] Show death message on death screen (#5386) --- src/network/mcpe/NetworkSession.php | 4 +-- .../mcpe/handler/DeathPacketHandler.php | 26 ++++++++++++++++++- src/player/Player.php | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 1cd31e180..fcae7e8d8 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -743,9 +743,9 @@ class NetworkSession{ $this->setHandler(new InGamePacketHandler($this->player, $this, $this->invManager)); } - public function onServerDeath() : void{ + public function onServerDeath(Translatable|string $deathMessage) : void{ if($this->handler instanceof InGamePacketHandler){ //TODO: this is a bad fix for pre-spawn death, this shouldn't be reachable at all at this stage :( - $this->setHandler(new DeathPacketHandler($this->player, $this, $this->invManager ?? throw new AssumptionFailedError())); + $this->setHandler(new DeathPacketHandler($this->player, $this, $this->invManager ?? throw new AssumptionFailedError(), $deathMessage)); } } diff --git a/src/network/mcpe/handler/DeathPacketHandler.php b/src/network/mcpe/handler/DeathPacketHandler.php index 0ae5f444f..43deec463 100644 --- a/src/network/mcpe/handler/DeathPacketHandler.php +++ b/src/network/mcpe/handler/DeathPacketHandler.php @@ -23,19 +23,23 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; +use pocketmine\lang\Translatable; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\ContainerClosePacket; +use pocketmine\network\mcpe\protocol\DeathInfoPacket; use pocketmine\network\mcpe\protocol\PlayerActionPacket; use pocketmine\network\mcpe\protocol\RespawnPacket; use pocketmine\network\mcpe\protocol\types\PlayerAction; use pocketmine\player\Player; +use function array_map; class DeathPacketHandler extends PacketHandler{ public function __construct( private Player $player, private NetworkSession $session, - private InventoryManager $inventoryManager + private InventoryManager $inventoryManager, + private Translatable|string $deathMessage ){} public function setUp() : void{ @@ -44,6 +48,26 @@ class DeathPacketHandler extends PacketHandler{ RespawnPacket::SEARCHING_FOR_SPAWN, $this->player->getId() )); + + /** @var string[] $parameters */ + $parameters = []; + if($this->deathMessage instanceof Translatable){ + //we can't send nested translations to the client, so make sure they are always pre-translated by the server + $language = $this->player->getLanguage(); + $parameters = array_map(fn(string|Translatable $p) => $p instanceof Translatable ? $language->translate($p) : $p, $this->deathMessage->getParameters()); + if(!$this->player->getServer()->isLanguageForced()){ + foreach($parameters as $i => $p){ + $parameters[$i] = $language->translateString($p, [], "pocketmine."); + } + $message = $language->translateString($this->deathMessage->getText(), $parameters, "pocketmine."); + }else{ + $message = $language->translateString($this->deathMessage->getText(), $parameters); + $parameters = []; + } + }else{ + $message = $this->deathMessage; + } + $this->session->sendDataPacket(DeathInfoPacket::create($message, $parameters)); } public function handlePlayerAction(PlayerActionPacket $packet) : bool{ diff --git a/src/player/Player.php b/src/player/Player.php index 8ec47b335..ba40e9f84 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2300,7 +2300,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->startDeathAnimation(); - $this->getNetworkSession()->onServerDeath(); + $this->getNetworkSession()->onServerDeath($ev->getDeathMessage()); } protected function onDeathUpdate(int $tickDiff) : bool{