From 962cefdcd8391abb4433e1e7e0ab059ac0a8700d Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Thu, 22 Dec 2022 07:38:09 +0100 Subject: [PATCH] fix(Core/Misc): Consider `/dance` as an emote state. (#14275) --- src/server/game/Entities/Unit/Unit.cpp | 3 +++ src/server/game/Handlers/ChatHandler.cpp | 3 +++ src/server/game/Handlers/MovementHandler.cpp | 9 +++++++++ 3 files changed, 15 insertions(+) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 28ed2ae35..7227ec04d 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14464,6 +14464,9 @@ void Unit::setDeathState(DeathState s, bool despawn) SetHealth(0); SetPower(getPowerType(), 0); + // Stop emote on death + SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + // players in instance don't have ZoneScript, but they have InstanceScript if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : (ZoneScript*)GetInstanceScript()) zoneScript->OnUnitDeath(this); diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 5d0642fca..e580a378a 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -755,6 +755,9 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) case EMOTE_STATE_KNEEL: case EMOTE_ONESHOT_NONE: break; + case EMOTE_STATE_DANCE: + GetPlayer()->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote_anim); + break; default: // Only allow text-emotes for "dead" entities (feign death included) if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 73d98d3e1..f0889150b 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -370,6 +370,15 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) movementInfo.guid = guid; ReadMovementInfo(recvData, &movementInfo); + // Stop emote on move + if (Player* plrMover = mover->ToPlayer()) + { + if (plrMover->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_ONESHOT_NONE) + { + plrMover->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + } + } + if (!movementInfo.pos.IsPositionValid()) { if (plrMover)