From f0661999717abc3ed5cefceb4c47b732915761f3 Mon Sep 17 00:00:00 2001 From: Hashim <13991048+Prim69@users.noreply.github.com> Date: Tue, 2 Nov 2021 19:04:55 -0400 Subject: [PATCH] Implement emote support (#4523) --- src/event/player/PlayerEmoteEvent.php | 51 +++++++++++++++++++ src/network/mcpe/NetworkSession.php | 5 ++ .../mcpe/handler/InGamePacketHandler.php | 6 +++ src/player/Player.php | 14 +++++ 4 files changed, 76 insertions(+) create mode 100644 src/event/player/PlayerEmoteEvent.php diff --git a/src/event/player/PlayerEmoteEvent.php b/src/event/player/PlayerEmoteEvent.php new file mode 100644 index 000000000..b10a3171e --- /dev/null +++ b/src/event/player/PlayerEmoteEvent.php @@ -0,0 +1,51 @@ +player = $player; + } + + public function getEmoteId() : string{ + return $this->emoteId; + } + + public function setEmoteId(string $emoteId) : void{ + $this->emoteId = $emoteId; + } + +} diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index cf189d875..ee7c34997 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -62,6 +62,7 @@ use pocketmine\network\mcpe\protocol\AvailableCommandsPacket; use pocketmine\network\mcpe\protocol\ChunkRadiusUpdatedPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\DisconnectPacket; +use pocketmine\network\mcpe\protocol\EmotePacket; use pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket; use pocketmine\network\mcpe\protocol\MobEffectPacket; use pocketmine\network\mcpe\protocol\MobEquipmentPacket; @@ -1043,6 +1044,10 @@ class NetworkSession{ $this->sendDataPacket(SetTitlePacket::setAnimationTimes($fadeIn, $stay, $fadeOut)); } + public function onEmote(Player $from, string $emoteId) : void{ + $this->sendDataPacket(EmotePacket::create($from->getId(), $emoteId, EmotePacket::FLAG_SERVER)); + } + public function tick() : void{ if($this->info === null){ if(time() >= $this->connectTime + 10){ diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index a884bf7c2..ad8b001c0 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -59,6 +59,7 @@ use pocketmine\network\mcpe\protocol\CommandRequestPacket; use pocketmine\network\mcpe\protocol\ContainerClosePacket; use pocketmine\network\mcpe\protocol\ContainerOpenPacket; use pocketmine\network\mcpe\protocol\CraftingEventPacket; +use pocketmine\network\mcpe\protocol\EmotePacket; use pocketmine\network\mcpe\protocol\InteractPacket; use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; use pocketmine\network\mcpe\protocol\ItemFrameDropItemPacket; @@ -890,4 +891,9 @@ class InGamePacketHandler extends PacketHandler{ */ return true; } + + public function handleEmote(EmotePacket $packet) : bool{ + $this->player->emote($packet->getEmoteId()); + return true; + } } diff --git a/src/player/Player.php b/src/player/Player.php index 1ca3faee8..ef48c5b2b 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -53,6 +53,7 @@ use pocketmine\event\player\PlayerChatEvent; use pocketmine\event\player\PlayerCommandPreprocessEvent; use pocketmine\event\player\PlayerDeathEvent; use pocketmine\event\player\PlayerDisplayNameChangeEvent; +use pocketmine\event\player\PlayerEmoteEvent; use pocketmine\event\player\PlayerEntityInteractEvent; use pocketmine\event\player\PlayerExhaustEvent; use pocketmine\event\player\PlayerGameModeChangeEvent; @@ -234,6 +235,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ /** @var int[] ID => ticks map */ protected array $usedItemsCooldown = []; + private int $lastEmoteTick = 0; + protected int $formIdCounter = 0; /** @var Form[] */ protected array $forms = []; @@ -1727,6 +1730,17 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return true; } + public function emote(string $emoteId) : void{ + $event = new PlayerEmoteEvent($this, $emoteId); + $event->call(); + if(!$event->isCancelled() && $this->getServer()->getTick() - $this->lastEmoteTick > 5){ + $this->lastEmoteTick = $this->getServer()->getTick(); + foreach($this->getViewers() as $player){ + $player->getNetworkSession()->onEmote($this, $emoteId); + } + } + } + /** * Drops an item on the ground in front of the player. */