diff options
author | Peter Keresztes Schmidt <carbenium@outlook.com> | 2020-08-15 15:29:43 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-15 15:29:43 +0200 |
commit | 6c7837f947ff4eb5110a116a371daa6f9e2b3bbe (patch) | |
tree | 68c0338b65932b47b62903f8b09a3f573909b66e | |
parent | 34d403e83f42304332f89ffc73549f6f2c695ccd (diff) |
Core/Unit: Make HandleEmoteCommand typesafe (#25249)
* Scripts/ScarletMonastery: Fix wrong emote during Headless Horseman encounter
* Scripts/HoR: Fix wrong emote during escape event
* Core/Unit: Make improve type safety of HandleEmoteCommand
Change argument type to the expected enum type Emote
* Scripts/CoS: Use SetUInt32Value to set UNIT_NPC_EMOTESTATE
UNIT_NPC_EMOTESTATE is no flag field
20 files changed, 41 insertions, 62 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index feb0cbd978e..4df56079d1f 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -307,7 +307,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (IsUnit(target)) { - target->ToUnit()->HandleEmoteCommand(e.action.emote.emote); + target->ToUnit()->HandleEmoteCommand(static_cast<Emote>(e.action.emote.emote)); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_PLAY_EMOTE: target: %s %s, emote: %u", target->GetName().c_str(), target->GetGUID().ToString().c_str(), e.action.emote.emote); } @@ -461,7 +461,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (IsUnit(target)) { - uint32 emote = Trinity::Containers::SelectRandomContainerElement(emotes); + Emote emote = static_cast<Emote>(Trinity::Containers::SelectRandomContainerElement(emotes)); target->ToUnit()->HandleEmoteCommand(emote); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_RANDOM_EMOTE: Creature %s handle random emote %u", target->GetGUID().ToString().c_str(), emote); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f695159ee7c..5d71cd12499 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1527,7 +1527,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) } } -void Unit::HandleEmoteCommand(uint32 emoteId) +void Unit::HandleEmoteCommand(Emote emoteId) { WorldPackets::Chat::Emote packet; packet.EmoteID = emoteId; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 3d2110ada04..c83f2e5edd5 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -948,7 +948,7 @@ class TC_GAME_API Unit : public WorldObject DamageInfo* damageInfo, HealInfo* healInfo); void TriggerAurasProcOnEvent(ProcEventInfo& eventInfo, AuraApplicationProcContainer& procAuras); - void HandleEmoteCommand(uint32 emoteId); + void HandleEmoteCommand(Emote emoteId); void AttackerStateUpdate (Unit* victim, WeaponAttackType attType = BASE_ATTACK, bool extra = false); void CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, WeaponAttackType attackType = BASE_ATTACK); diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 56e4ed2066b..a43707d0ef6 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -562,7 +562,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) void WorldSession::HandleEmoteOpcode(WorldPackets::Chat::EmoteClient& packet) { - uint32 emoteId = packet.EmoteID; + Emote emoteId = static_cast<Emote>(packet.EmoteID); // restrict to the only emotes hardcoded in client if (emoteId != EMOTE_ONESHOT_NONE && emoteId != EMOTE_ONESHOT_WAVE) @@ -632,9 +632,9 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) if (!em) return; - uint32 emote_anim = em->EmoteID; + Emote emote = static_cast<Emote>(em->EmoteID); - switch (emote_anim) + switch (emote) { case EMOTE_STATE_SLEEP: case EMOTE_STATE_SIT: @@ -645,7 +645,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) // Only allow text-emotes for "dead" entities (feign death included) if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) break; - GetPlayer()->HandleEmoteCommand(emote_anim); + GetPlayer()->HandleEmoteCommand(emote); break; } diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp index 0b6f4901c3d..63c4113348e 100644 --- a/src/server/game/Maps/MapScripts.cpp +++ b/src/server/game/Maps/MapScripts.cpp @@ -450,7 +450,7 @@ void Map::ScriptsProcess() if (step.script->Emote.Flags & SF_EMOTE_USE_STATE) cSource->SetUInt32Value(UNIT_NPC_EMOTESTATE, step.script->Emote.EmoteID); else - cSource->HandleEmoteCommand(step.script->Emote.EmoteID); + cSource->HandleEmoteCommand(static_cast<Emote>(step.script->Emote.EmoteID)); } break; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 6e0024e769d..acb2c962d57 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1910,7 +1910,7 @@ void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::stri FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, channel); } -void ScriptMgr::OnPlayerEmote(Player* player, uint32 emote) +void ScriptMgr::OnPlayerEmote(Player* player, Emote emote) { FOREACH_SCRIPT(PlayerScript)->OnEmote(player, emote); } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index f255a3b06a3..be35f14448e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -76,6 +76,7 @@ enum BattlegroundTypeId : uint32; enum ContentLevels : uint8; enum Difficulty : uint8; enum DuelCompleteType : uint8; +enum Emote : uint32; enum QuestStatus : uint8; enum RemoveMethod : uint8; enum ShutdownExitCode : uint32; @@ -682,7 +683,7 @@ class TC_GAME_API PlayerScript : public ScriptObject virtual void OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Channel* /*channel*/) { } // Both of the below are called on emote opcodes. - virtual void OnEmote(Player* /*player*/, uint32 /*emote*/) { } + virtual void OnEmote(Player* /*player*/, Emote /*emote*/) { } virtual void OnTextEmote(Player* /*player*/, uint32 /*textEmote*/, uint32 /*emoteNum*/, ObjectGuid /*guid*/) { } @@ -1027,7 +1028,7 @@ class TC_GAME_API ScriptMgr void OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group); void OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild); void OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel); - void OnPlayerEmote(Player* player, uint32 emote); + void OnPlayerEmote(Player* player, Emote emote); void OnPlayerTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid); void OnPlayerSpellCast(Player* player, Spell* spell, bool skipCheck); void OnPlayerLogin(Player* player, bool firstLogin); diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 9d7efaa71ac..5d37aa2f507 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -382,7 +382,7 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* source->SendMessageToSetInRange(data, dist, true); } -void CreatureTextMgr::SendEmote(Unit* source, uint32 emote) +void CreatureTextMgr::SendEmote(Unit* source, Emote emote) { if (!source) return; diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index 7b14188a410..263685566aa 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -94,7 +94,7 @@ class TC_GAME_API CreatureTextMgr CreatureTextMap const& GetTextMap() const { return mTextMap; } void SendSound(Creature* source, uint32 sound, ChatMsg msgType, WorldObject const* whisperTarget, CreatureTextRange range, Team team, bool gmOnly); - void SendEmote(Unit* source, uint32 emote); + void SendEmote(Unit* source, Emote emote); //if sent, returns the 'duration' of the text else 0 if error uint32 SendChat(Creature* source, uint8 textGroup, WorldObject const* whisperTarget = nullptr, ChatMsg msgType = CHAT_MSG_ADDON, Language language = LANG_ADDON, CreatureTextRange range = TEXT_RANGE_NORMAL, uint32 sound = 0, Team team = TEAM_OTHER, bool gmOnly = false, Player* srcPlr = nullptr); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 5a9c94b384f..eca67c1bf8e 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1243,14 +1243,10 @@ public: } //show animation - static bool HandleDebugAnimCommand(ChatHandler* handler, char const* args) + static bool HandleDebugAnimCommand(ChatHandler* handler, uint32 emoteId) { - if (!*args) - return false; - - uint32 animId = atoi((char*)args); if (Unit* unit = handler->getSelectedUnit()) - unit->HandleEmoteCommand(animId); + unit->HandleEmoteCommand(static_cast<Emote>(emoteId)); return true; } diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index f6e8d40e03f..13e9d0a8635 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -525,7 +525,7 @@ struct boss_headless_horseman : public ScriptedAI if (Player* player = it->GetSource()) { player->Say(HeadlessHorsemanInitialPlayerTexts[talkContext.GetRepeatCounter()], LANG_UNIVERSAL); - player->HandleEmoteCommand(ANIM_EMOTE_SHOUT); + player->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT); } } diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp index 48733f2b7cd..bcb4644f224 100644 --- a/src/server/scripts/Events/childrens_week.cpp +++ b/src/server/scripts/Events/childrens_week.cpp @@ -1046,26 +1046,15 @@ class npc_cw_area_trigger : public CreatureScript if (player->GetQuestStatus(QUEST_NOW_WHEN_I_GROW_UP) == QUEST_STATUS_COMPLETE) if (Creature* samuro = me->FindNearestCreature(25151, 20.0f)) { - uint32 emote = 0; - switch (urand(1, 5)) - { - case 1: - emote = EMOTE_ONESHOT_WAVE; - break; - case 2: - emote = EMOTE_ONESHOT_ROAR; - break; - case 3: - emote = EMOTE_ONESHOT_FLEX; - break; - case 4: - emote = EMOTE_ONESHOT_SALUTE; - break; - case 5: - emote = EMOTE_ONESHOT_DANCE; - break; - } - samuro->HandleEmoteCommand(emote); + Emote const emotes[] = + { + EMOTE_ONESHOT_WAVE, + EMOTE_ONESHOT_ROAR, + EMOTE_ONESHOT_FLEX, + EMOTE_ONESHOT_SALUTE, + EMOTE_ONESHOT_DANCE + }; + samuro->HandleEmoteCommand(Trinity::Containers::SelectRandomContainerElement(emotes)); } } break; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index b246c8da786..abbb21686fe 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -617,7 +617,7 @@ struct npc_martha_goslin : public CreatureScript InterruptTimer = 12000; SplineChainMovementGenerator::GetResumeInfo(ResumeInfo, me); me->GetMotionMaster()->Clear(); - me->SetFlag(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); } void MovementInform(uint32 type, uint32 id) override @@ -627,12 +627,12 @@ struct npc_martha_goslin : public CreatureScript switch (id) { case MOVEID_EVENT1: - me->SetFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); me->SetFacingTo(marthaIdleOrientation1, true); Events.ScheduleEvent(EVENT_MARTHA_IDLE2, Seconds(9), Seconds(15)); break; case MOVEID_EVENT2: - me->SetFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); me->SetFacingTo(marthaIdleOrientation2, true); Events.ScheduleEvent(EVENT_MARTHA_IDLE1, Seconds(9), Seconds(15)); break; @@ -669,11 +669,11 @@ struct npc_martha_goslin : public CreatureScript switch (eventId) { case EVENT_MARTHA_IDLE1: - me->SetFlag(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->GetMotionMaster()->MoveAlongSplineChain(MOVEID_EVENT1, CHAIN_MARTHA_IDLE1, true); break; case EVENT_MARTHA_IDLE2: - me->SetFlag(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->GetMotionMaster()->MoveAlongSplineChain(MOVEID_EVENT2, CHAIN_MARTHA_IDLE2, true); break; default: @@ -684,7 +684,7 @@ struct npc_martha_goslin : public CreatureScript void JustAppeared() override { - me->SetFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); Events.RescheduleEvent(EVENT_MARTHA_IDLE2, Seconds(5), Seconds(10)); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp index c267e9bfd0f..2dcc3246dee 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp @@ -1074,7 +1074,7 @@ public: DoCast(citizen, SPELL_CRUSADER_STRIKE, TRIGGERED_IGNORE_SET_FACING); if (Creature* resident = me->FindNearestCreature(NPC_RESIDENT, 100.0f, true)) { - resident->SetFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); + resident->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); resident->AI()->Talk(RP2_LINE_RESIDENT1, ObjectAccessor::GetUnit(*me, _eventStarterGuid)); } break; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 0f8deaadb80..85e73c40f70 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -1091,7 +1091,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript break; case EVENT_ESCAPE_7: if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_THE_LICH_KING_ESCAPE))) - lichking->HandleEmoteCommand(TEXT_EMOTE_ROAR); + lichking->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]); _events.ScheduleEvent(EVENT_ESCAPE_8, 3s); break; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index fc681d398ac..b504a8f816a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -678,7 +678,7 @@ private: bool _checkCasting; }; -static std::vector<uint32> const DarkFallensEmotes = +static Emote const DarkFallensEmotes[]= { EMOTE_ONESHOT_TALK, EMOTE_ONESHOT_EXCLAMATION, diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index a5fb0ad3389..3ee199c8481 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -128,7 +128,7 @@ public: break; case 20: if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) - RWORG->HandleEmoteCommand(34); + RWORG->HandleEmoteCommand(EMOTE_ONESHOT_WOUND_CRITICAL); break; case 21: if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 9b795cc4610..8653254d5f0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -150,7 +150,7 @@ class boss_broggok : public CreatureScript } }; -static std::vector<uint32> const PrisionersEmotes = +static Emote const PrisionersEmotes[] = { EMOTE_ONESHOT_ROAR, EMOTE_ONESHOT_SHOUT, diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index c83cd236629..5e69d8ce72e 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3200,14 +3200,7 @@ class spell_gen_seaforium_blast : public SpellScript } }; -enum SpectatorCheerTrigger -{ - EMOTE_ONE_SHOT_CHEER = 4, - EMOTE_ONE_SHOT_EXCLAMATION = 5, - EMOTE_ONE_SHOT_APPLAUD = 21 -}; - -uint8 const EmoteArray[3] = { EMOTE_ONE_SHOT_CHEER, EMOTE_ONE_SHOT_EXCLAMATION, EMOTE_ONE_SHOT_APPLAUD }; +static Emote const EmoteArray[] = { EMOTE_ONESHOT_CHEER, EMOTE_ONESHOT_EXCLAMATION, EMOTE_ONESHOT_APPLAUD }; class spell_gen_spectator_cheer_trigger : public SpellScript { @@ -3216,7 +3209,7 @@ class spell_gen_spectator_cheer_trigger : public SpellScript void HandleDummy(SpellEffIndex /*effIndex*/) { if (roll_chance_i(40)) - GetCaster()->HandleEmoteCommand(EmoteArray[urand(0, 2)]); + GetCaster()->HandleEmoteCommand(Trinity::Containers::SelectRandomContainerElement(EmoteArray)); } void Register() override diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 6b27202f749..171f5e5c172 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -1922,7 +1922,7 @@ enum TextEmotes }; // Emotes.dbc -enum Emote +enum Emote : uint32 { EMOTE_ONESHOT_NONE = 0, EMOTE_ONESHOT_TALK = 1, |