From e9891a35c0ebabcb6b7a2870ccb3721e373e417f Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 8 Jul 2018 23:44:37 +0200 Subject: [PATCH] Emotes can now be interrupted, getting in and out of persistant emotes including /sit should work fine, too #329 --- src/common/Network/CommonActorControl.h | 1 + src/servers/sapphire_zone/Actor/Player.cpp | 5 +++++ src/servers/sapphire_zone/Actor/Player.h | 2 ++ .../Network/Handlers/ClientTriggerHandler.cpp | 10 ++++++++++ 4 files changed, 18 insertions(+) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index fb2fe4ba..e6b7af5b 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -125,6 +125,7 @@ namespace Core { ActorFateOut1 = 0x110, Emote = 0x122, + EmoteInterrupt = 0x123, SetPose = 0x127, diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 4f17b1d0..3054a8e2 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1656,6 +1656,11 @@ void Core::Entity::Player::emote( uint32_t emoteId, uint64_t targetId, bool isSi emoteId, 0, isSilent ? 1 : 0, 0, targetId ) ); } +void Core::Entity::Player::emoteInterrupt() +{ + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), ActorControlType::EmoteInterrupt ) ); +} + void Core::Entity::Player::teleportQuery( uint16_t aetheryteId ) { auto pExdData = g_fw.get< Data::ExdDataGenerated >(); diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index fe460c2e..a842958f 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -508,6 +508,8 @@ public: bool isMarkedForZoning() const; void emote( uint32_t emoteId, uint64_t targetId, bool isSilent ); + void emoteInterrupt(); + void sendZoneInPackets( uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, bool pSetStatus ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 598460d4..c48adc71 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -147,8 +147,18 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR player.emote( emoteId, targetId, isSilent ); break; } + case ClientTriggerType::EmoteCancel: // emote + { + player.emoteInterrupt(); + break; + } case ClientTriggerType::PersistantEmoteCancel: // cancel persistant emote { + player.emoteInterrupt(); + auto SetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), + SetStatus, + static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ); + player.sendToInRangeSet( SetStatusPacket ); break; } case ClientTriggerType::PoseChange: // change pose