From 0bef1e1ee606dc018a11bd05b902c002792aeef9 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Fri, 30 Aug 2024 13:36:18 -0400 Subject: [PATCH 01/46] fix(DB/Creature): Add taunt immunity to Gurtogg Bloodboil. (#19800) Init. --- data/sql/updates/pending_db_world/bloodboil-taunt.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/sql/updates/pending_db_world/bloodboil-taunt.sql diff --git a/data/sql/updates/pending_db_world/bloodboil-taunt.sql b/data/sql/updates/pending_db_world/bloodboil-taunt.sql new file mode 100644 index 000000000..b65862bfb --- /dev/null +++ b/data/sql/updates/pending_db_world/bloodboil-taunt.sql @@ -0,0 +1 @@ +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|256 WHERE `entry` = 22948; From b1bae64171b911ce5cfd62f2488a6da4b36938dd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 30 Aug 2024 17:37:10 +0000 Subject: [PATCH 02/46] chore(DB): import pending files Referenced commit(s): 0bef1e1ee606dc018a11bd05b902c002792aeef9 --- .../bloodboil-taunt.sql => db_world/2024_08_30_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/bloodboil-taunt.sql => db_world/2024_08_30_01.sql} (66%) diff --git a/data/sql/updates/pending_db_world/bloodboil-taunt.sql b/data/sql/updates/db_world/2024_08_30_01.sql similarity index 66% rename from data/sql/updates/pending_db_world/bloodboil-taunt.sql rename to data/sql/updates/db_world/2024_08_30_01.sql index b65862bfb..c5c976623 100644 --- a/data/sql/updates/pending_db_world/bloodboil-taunt.sql +++ b/data/sql/updates/db_world/2024_08_30_01.sql @@ -1 +1,2 @@ +-- DB update 2024_08_30_00 -> 2024_08_30_01 UPDATE `creature_template` SET `flags_extra` = `flags_extra`|256 WHERE `entry` = 22948; From e4aab5b4f08d0cfcbfbf028b92ffc62e79bea5df Mon Sep 17 00:00:00 2001 From: Grimdhex <176165533+Grimdhex@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:10:51 +0200 Subject: [PATCH 03/46] fix(Scripts/TempestKeep): revamp Kael'Thas (#19648) * fix(Scripts/TempestKeep): force attackstop for all player during the last phase and cleanup the script of Kael'Thas * few new fixes * fix codestyle * fix codestyle and remove misc stuff *remove the useless DisableSpline *remove also a misc change use only during the dev * pass the health to DamageTaken instead UpdateIA * avoid to iterate over the threatlist and use RemoveAllAttackers() instead * Revert "avoid to iterate over the threatlist and use RemoveAllAttackers() instead" This reverts commit 0623c0075191c91c2530496c83d017d3b6a824db. * Revert "pass the health to DamageTaken instead UpdateIA" This reverts commit 7f8609af603ecc042c819801a2f04d9d65c5031a. * revert recents commits * avoid potential conflicts with others enums * fix build --- .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 154 +++++++++--------- 1 file changed, 78 insertions(+), 76 deletions(-) diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 8ff0f0512..017e52d64 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -23,7 +23,7 @@ #include "WorldPacket.h" #include "the_eye.h" -enum Yells +enum KTYells { // Kael'thas Speech SAY_INTRO = 0, @@ -54,7 +54,7 @@ enum Yells EMOTE_THALADRED_FIXATE = 2 }; -enum Spells +enum KTSpells { // _phase 2 spells SPELL_SUMMON_WEAPONS = 36976, @@ -79,7 +79,7 @@ enum Spells SPELL_FLAME_STRIKE = 36735, SPELL_FLAME_STRIKE_DAMAGE = 36731, - // Event + // transition scene spells SPELL_NETHERBEAM_AURA1 = 36364, SPELL_NETHERBEAM_AURA2 = 36370, SPELL_NETHERBEAM_AURA3 = 36371, @@ -138,57 +138,44 @@ enum Spells SPELL_SILENCE = 30225 }; -enum Misc +enum KTPhases { - POINT_MIDDLE = 1, - POINT_AIR = 2, - POINT_START_LAST_PHASE = 3, - DATA_RESURRECT_CAST = 1, - NPC_WORLD_TRIGGER = 19871, - NPC_NETHER_VAPOR = 21002, - NPC_NETHERSTRAND_LONGBOW = 21268, - NPC_STAFF_OF_DISINTEGRATION = 21274, - PHASE_NONE = 0, PHASE_SINGLE_ADVISOR = 1, PHASE_WEAPONS = 2, PHASE_TRANSITION = 3, PHASE_ALL_ADVISORS = 4, - PHASE_FINAL = 5, + PHASE_FINAL = 5 +}; - EVENT_PREFIGHT_PHASE11 = 1, - EVENT_PREFIGHT_PHASE12 = 2, - EVENT_PREFIGHT_PHASE21 = 3, - EVENT_PREFIGHT_PHASE22 = 4, - EVENT_PREFIGHT_PHASE31 = 5, - EVENT_PREFIGHT_PHASE32 = 6, - EVENT_PREFIGHT_PHASE41 = 7, - EVENT_PREFIGHT_PHASE42 = 8, - EVENT_PREFIGHT_PHASE51 = 9, - EVENT_PREFIGHT_PHASE52 = 10, - EVENT_PREFIGHT_PHASE61 = 11, - EVENT_PREFIGHT_PHASE62 = 12, - EVENT_PREFIGHT_PHASE63 = 13, - EVENT_PREFIGHT_PHASE71 = 14, - EVENT_GATHER_ADVISORS = 15, +enum KTMisc +{ + POINT_MIDDLE = 1, + POINT_AIR = 2, + POINT_LAND = 3, + POINT_START_LAST_PHASE = 4, - EVENT_SPELL_SEQ_1 = 30, - EVENT_SPELL_SEQ_2 = 31, - EVENT_SPELL_SEQ_3 = 32, - EVENT_SPELL_FIREBALL = 33, - EVENT_SPELL_PYROBLAST = 34, - EVENT_SPELL_FLAMESTRIKE = 35, - EVENT_SPELL_ARCANE_DISRUPTION = 36, - EVENT_SPELL_MIND_CONTROL = 37, - EVENT_SPELL_SUMMON_PHOENIX = 38, - EVENT_CHECK_HEALTH = 39, - EVENT_SPELL_GRAVITY_LAPSE = 40, - EVENT_GRAVITY_LAPSE_END = 41, - EVENT_SPELL_SHOCK_BARRIER = 42, - EVENT_SPELL_NETHER_BEAM = 43, - EVENT_SPELL_NETHER_VAPOR = 44, + DATA_RESURRECT_CAST = 1, - EVENT_SCENE_1 = 50, + NPC_WORLD_TRIGGER = 19871, + NPC_NETHER_VAPOR = 21002, + NPC_NETHERSTRAND_LONGBOW = 21268, + NPC_STAFF_OF_DISINTEGRATION = 21274, +}; + +enum KTPreFightEvents +{ + EVENT_PREFIGHT_PHASE1_01 = 1, + EVENT_PREFIGHT_PHASE1_02 = 2, + EVENT_PREFIGHT_PHASE5_01 = 3, + EVENT_PREFIGHT_PHASE5_02 = 4, + EVENT_PREFIGHT_PHASE6_02 = 5, + EVENT_PREFIGHT_PHASE6_03 = 6, +}; + +enum KTTransitionScene +{ + EVENT_SCENE_1 = 50, // NYI EVENT_SCENE_2 = 51, EVENT_SCENE_3 = 52, EVENT_SCENE_4 = 53, @@ -206,7 +193,7 @@ enum Misc EVENT_SCENE_16 = 65 }; -enum KaelActions +enum KTActions { ACTION_START_SANGUINAR = 0, ACTION_START_CAPERNIAN = 1, @@ -215,7 +202,7 @@ enum KaelActions ACTION_PROGRESS_PHASE_CHECK = 4 }; -enum SpellGroups +enum KTSpellGroups { GROUP_PROGRESS_PHASE = 0, GROUP_PYROBLAST = 1, @@ -288,7 +275,9 @@ struct boss_kaelthas : public BossAI { PrepareAdvisors(); }); + _phase = PHASE_NONE; + _transitionSceneReached = false; me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HOVER, true); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); @@ -296,15 +285,6 @@ struct boss_kaelthas : public BossAI SetRoomState(GO_STATE_READY); me->SetDisableGravity(false); me->SetWalk(false); - ScheduleHealthCheckEvent(50, [&]{ - scheduler.CancelAll(); - me->CastStop(); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), true, true); - me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); - me->SendMeleeAttackStop(); - }); } void AttackStart(Unit* who) override @@ -313,17 +293,23 @@ struct boss_kaelthas : public BossAI BossAI::AttackStart(who); } + void JustReachedHome() override + { + Reset(); + } + void MoveInLineOfSight(Unit* who) override { if (_phase == PHASE_NONE && who->IsPlayer() && me->IsValidAttackTarget(who)) { _phase = PHASE_SINGLE_ADVISOR; me->SetInCombatWithZone(); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); Talk(SAY_INTRO); ScheduleUniqueTimedEvent(23s, [&] { Talk(SAY_INTRO_THALADRED); - }, EVENT_PREFIGHT_PHASE11); + }, EVENT_PREFIGHT_PHASE1_01); ScheduleUniqueTimedEvent(30s, [&] { if (Creature* thaladred = summons.GetCreatureWithEntry(NPC_THALADRED)) @@ -334,15 +320,10 @@ struct boss_kaelthas : public BossAI thaladred->AI()->AttackStart(target); thaladred->SetInCombatWithZone(); } - }, EVENT_PREFIGHT_PHASE12); + }, EVENT_PREFIGHT_PHASE1_02); } } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - } - void KilledUnit(Unit* victim) override { if (victim->IsPlayer()) @@ -376,7 +357,7 @@ struct boss_kaelthas : public BossAI Talk(SAY_PHASE2_WEAPON); DoCastSelf(SPELL_SUMMON_WEAPONS); _phase = PHASE_WEAPONS; - }, EVENT_PREFIGHT_PHASE51); + }, EVENT_PREFIGHT_PHASE5_01); ScheduleUniqueTimedEvent(9s, [&]{ summons.DoForAllSummons([&](WorldObject* summon) { @@ -397,7 +378,7 @@ struct boss_kaelthas : public BossAI { PhaseAllAdvisorsExecute(); }); - }, EVENT_PREFIGHT_PHASE52); + }, EVENT_PREFIGHT_PHASE5_02); break; case ACTION_PROGRESS_PHASE_CHECK: if (_phase == PHASE_ALL_ADVISORS) @@ -511,7 +492,6 @@ struct boss_kaelthas : public BossAI me->SetTarget(); DoCastSelf(SPELL_KAEL_EXPLODES1, true); DoCastSelf(SPELL_KAEL_GAINING_POWER); - me->SetDisableGravity(true); }, EVENT_SCENE_2); ScheduleUniqueTimedEvent(4000ms, [&] { @@ -519,7 +499,9 @@ struct boss_kaelthas : public BossAI for (uint8 i = 0; i < 2; ++i) if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i], TEMPSUMMON_TIMED_DESPAWN, 60000)) trigger->CastSpell(me, SPELL_NETHERBEAM1 + i, false); - me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), 76.0f, false, true); + me->SetDisableGravity(true); + me->SendMovementFlagUpdate(); + me->GetMotionMaster()->MoveTakeoff(POINT_AIR, me->GetPositionX(), me->GetPositionY(), 75.0f, 2.99); DoCastSelf(SPELL_GROW, true); }, EVENT_SCENE_3); ScheduleUniqueTimedEvent(7000ms, [&] @@ -551,8 +533,6 @@ struct boss_kaelthas : public BossAI ScheduleUniqueTimedEvent(17500ms, [&] { SetRoomState(GO_STATE_ACTIVE); - me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_WALKING | MOVEMENTFLAG_DISABLE_GRAVITY); - me->SendMovementFlagUpdate(); }, EVENT_SCENE_7); ScheduleUniqueTimedEvent(19000ms, [&] { @@ -612,8 +592,6 @@ struct boss_kaelthas : public BossAI DoCastSelf(SPELL_PURE_NETHER_BEAM4, true); DoCastSelf(SPELL_PURE_NETHER_BEAM5, true); DoCastSelf(SPELL_PURE_NETHER_BEAM6, true); - me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_WALKING); - me->SendMovementFlagUpdate(); }, EVENT_SCENE_15); ScheduleUniqueTimedEvent(36000ms, [&] { @@ -621,11 +599,12 @@ struct boss_kaelthas : public BossAI me->CastStop(); me->GetMotionMaster()->Clear(); me->RemoveAurasDueToSpell(SPELL_DARK_BANISH_STATE); // WRONG VISUAL + me->GetMotionMaster()->MoveLand(POINT_LAND, me->GetPositionX(), me->GetPositionY(), 48.0f, 2.99f); // Moveland doesn't handle POINT_START_LAST_PHASE so we need to use MovePoint me->GetMotionMaster()->MovePoint(POINT_START_LAST_PHASE, me->GetHomePosition(), false, true); }, EVENT_SCENE_16); } - void IntroduceNewAdvisor(Yells talkIntroduction, KaelActions kaelAction) + void IntroduceNewAdvisor(KTYells talkIntroduction, KTActions kaelAction) { std::chrono::milliseconds attackStartTimer = 0ms; EyeNPCs advisorNPCId = NPC_THALADRED; @@ -671,7 +650,7 @@ struct boss_kaelthas : public BossAI Talk(SAY_PHASE3_ADVANCE); ScheduleUniqueTimedEvent(6s, [&]{ DoCastSelf(SPELL_RESURRECTION); - }, EVENT_PREFIGHT_PHASE62); + }, EVENT_PREFIGHT_PHASE6_02); ScheduleUniqueTimedEvent(12s, [&]{ _phase = PHASE_ALL_ADVISORS; summons.DoForAllSummons([&](WorldObject* summon) @@ -694,7 +673,7 @@ struct boss_kaelthas : public BossAI { PhaseKaelExecute(); }); - }, EVENT_PREFIGHT_PHASE63); + }, EVENT_PREFIGHT_PHASE6_03); } void PhaseKaelExecute() @@ -703,11 +682,33 @@ struct boss_kaelthas : public BossAI Talk(SAY_PHASE4_INTRO2); _phase = PHASE_FINAL; DoResetThreatList(); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) { AttackStart(target); } + ScheduleHealthCheckEvent(50, [&]{ + if(!_transitionSceneReached) + { + _transitionSceneReached = true; + scheduler.CancelAll(); + me->CastStop(); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), true, true); + me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); + me->SendMeleeAttackStop(); + + ThreatContainer::StorageType threatList = me->GetThreatMgr().GetThreatList(); + for (ThreatContainer::StorageType::const_iterator i = threatList.begin(); i != threatList.end(); ++i) + { + if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) + { + target->AttackStop(); + } + } + } + }); ScheduleTimedEvent(1000ms, [&] { DoCastVictim(SPELL_FIREBALL); @@ -721,7 +722,6 @@ struct boss_kaelthas : public BossAI Talk(SAY_SUMMON_PHOENIX); DoCastSelf(SPELL_PHOENIX); }, 35450ms, 41550ms); - //sequence ScheduleTimedEvent(20s, 23s, [&] { if (roll_chance_i(50)) @@ -762,8 +762,10 @@ struct boss_kaelthas : public BossAI { return me->GetHomePosition().GetExactDist2d(me) > 165.0f || !SelectTargetFromPlayerList(165.0f); } + private: uint32 _phase; + bool _transitionSceneReached = false; }; struct npc_lord_sanguinar : public ScriptedAI { From 0fb2c5efebddcbba29349e823e7d070649573305 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Fri, 30 Aug 2024 21:20:52 +0200 Subject: [PATCH 04/46] fix(Scripts/TheEye): Kaelthas remove enchanted weapons (#19801) * remove weapons Co-authored-by: killerwife * style for consistency * also cast on KT JustDied * fix TriggerCastFlags to not ignore reagent cost * Apply suggestions from code review --------- Co-authored-by: killerwife --- .../rev_1725040501028883764.sql | 3 ++ .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 34 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1725040501028883764.sql diff --git a/data/sql/updates/pending_db_world/rev_1725040501028883764.sql b/data/sql/updates/pending_db_world/rev_1725040501028883764.sql new file mode 100644 index 000000000..47b3756ef --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1725040501028883764.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `spell_script_names` WHERE `spell_id`=39497; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES(39497, 'spell_kaelthas_remove_enchanted_weapons'); diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 017e52d64..825b21ed0 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -115,6 +115,7 @@ enum KTSpells SPELL_NETHER_BEAM_DAMAGE = 35873, SPELL_REMOTE_TOY_STUN = 37029, + SPELL_REMOVE_ENCHANTED_WEAPONS = 39497, // Advisors // Universal @@ -306,6 +307,7 @@ struct boss_kaelthas : public BossAI me->SetInCombatWithZone(); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); Talk(SAY_INTRO); + DoCastAOE(SPELL_REMOVE_ENCHANTED_WEAPONS, true); ScheduleUniqueTimedEvent(23s, [&] { Talk(SAY_INTRO_THALADRED); @@ -762,7 +764,11 @@ struct boss_kaelthas : public BossAI { return me->GetHomePosition().GetExactDist2d(me) > 165.0f || !SelectTargetFromPlayerList(165.0f); } - + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + DoCastAOE(SPELL_REMOVE_ENCHANTED_WEAPONS, true); + } private: uint32 _phase; bool _transitionSceneReached = false; @@ -1323,6 +1329,31 @@ class spell_kael_pyroblast : public SpellScript } }; +class spell_kaelthas_remove_enchanted_weapons : public SpellScript +{ + PrepareSpellScript(spell_kaelthas_remove_enchanted_weapons); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + if (!target || !target->IsPlayer()) + return; + TriggerCastFlags triggerFlags = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST); + target->CastSpell((Unit*)nullptr, 39498, triggerFlags); + target->CastSpell((Unit*)nullptr, 39499, triggerFlags); + target->CastSpell((Unit*)nullptr, 39500, triggerFlags); + target->CastSpell((Unit*)nullptr, 39501, triggerFlags); + target->CastSpell((Unit*)nullptr, 39502, triggerFlags); + target->CastSpell((Unit*)nullptr, 39503, triggerFlags); + target->CastSpell((Unit*)nullptr, 39504, triggerFlags); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_boss_kaelthas() { RegisterTheEyeAI(boss_kaelthas); @@ -1341,4 +1372,5 @@ void AddSC_boss_kaelthas() RegisterSpellScript(spell_kaelthas_nether_beam); RegisterSpellScript(spell_kaelthas_summon_nether_vapor); RegisterSpellScript(spell_kael_pyroblast); + RegisterSpellScript(spell_kaelthas_remove_enchanted_weapons); } From fc735e37a2166bbb39b272abd6950a5ae70ae761 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 30 Aug 2024 19:22:27 +0000 Subject: [PATCH 05/46] chore(DB): import pending files Referenced commit(s): 0fb2c5efebddcbba29349e823e7d070649573305 --- .../rev_1725040501028883764.sql => db_world/2024_08_30_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1725040501028883764.sql => db_world/2024_08_30_02.sql} (80%) diff --git a/data/sql/updates/pending_db_world/rev_1725040501028883764.sql b/data/sql/updates/db_world/2024_08_30_02.sql similarity index 80% rename from data/sql/updates/pending_db_world/rev_1725040501028883764.sql rename to data/sql/updates/db_world/2024_08_30_02.sql index 47b3756ef..d4bf5ae6f 100644 --- a/data/sql/updates/pending_db_world/rev_1725040501028883764.sql +++ b/data/sql/updates/db_world/2024_08_30_02.sql @@ -1,3 +1,4 @@ +-- DB update 2024_08_30_01 -> 2024_08_30_02 -- DELETE FROM `spell_script_names` WHERE `spell_id`=39497; INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES(39497, 'spell_kaelthas_remove_enchanted_weapons'); From 9a503d4703b63c0cc1ca5a037ca02be624313637 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sat, 31 Aug 2024 08:40:48 -0400 Subject: [PATCH 06/46] fix(Scripts/BlackTemple): Ensure Illidari council health is balanced across wipes. (#19809) Init. --- .../scripts/Outland/BlackTemple/boss_illidari_council.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 5c20cb1e5..91d6e1dbc 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -146,9 +146,10 @@ struct boss_illidari_council : public BossAI void DoAction(int32 param) override { - if (!me->isActiveObject() && param == ACTION_START_ENCOUNTER) + if (param == ACTION_START_ENCOUNTER) { - me->setActive(true); + if (!me->isActiveObject()) + me->setActive(true); bool spoken = false; From 30f87a3e2f02c5e17b17dc6ba7f27a3fc6d5bb24 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sat, 31 Aug 2024 08:41:19 -0400 Subject: [PATCH 07/46] fix(Scripts/BlackTemple): Call evade for Council creature when members evade. (#19808) Init. --- .../scripts/Outland/BlackTemple/boss_illidari_council.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 91d6e1dbc..e6567e0ab 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -232,7 +232,12 @@ struct boss_illidari_council_memberAI : public ScriptedAI void EnterEvadeMode(EvadeReason why) override { - me->SetOwnerGUID(ObjectGuid::Empty); + if (Unit* council = me->GetOwner()) + { + me->SetOwnerGUID(ObjectGuid::Empty); // Set owner here to avoid infinite loop of evade calls + if (council->ToCreature()->AI()) + council->ToCreature()->AI()->EnterEvadeMode(why); + } ScriptedAI::EnterEvadeMode(why); } From 887495386246a0a282edfbd83ec3816d353632aa Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sat, 31 Aug 2024 09:36:57 -0400 Subject: [PATCH 08/46] fix(Core/CharmInfo): Respect charm spell indices when adding to action bar. (#19811) Init. --- src/server/game/Entities/Unit/CharmInfo.cpp | 23 ++++++++++++++------- src/server/game/Entities/Unit/CharmInfo.h | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/server/game/Entities/Unit/CharmInfo.cpp b/src/server/game/Entities/Unit/CharmInfo.cpp index df36bb732..d315f01a2 100644 --- a/src/server/game/Entities/Unit/CharmInfo.cpp +++ b/src/server/game/Entities/Unit/CharmInfo.cpp @@ -98,12 +98,10 @@ void CharmInfo::InitPossessCreateSpells() uint32 spellId = _unit->ToCreature()->m_spells[i]; SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (spellInfo) - { if (spellInfo->IsPassive()) _unit->CastSpell(_unit, spellInfo, true); - else - AddSpellToActionBar(spellInfo, ACT_PASSIVE); - } + + AddSpellToActionBar(spellInfo, ACT_PASSIVE, i); } } else @@ -157,10 +155,16 @@ void CharmInfo::InitCharmCreateSpells() } } -bool CharmInfo::AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate) +bool CharmInfo::AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate, uint32 index) { - uint32 spell_id = spellInfo->Id; - uint32 first_id = spellInfo->GetFirstRankSpell()->Id; + uint32 spell_id = 0; + uint32 first_id = 0; + + if (spellInfo) + { + spell_id = spellInfo->Id; + first_id = spellInfo->GetFirstRankSpell()->Id; + } // new spell rank can be already listed for (uint8 i = 0; i < MAX_UNIT_ACTION_BAR_INDEX; ++i) @@ -180,6 +184,9 @@ bool CharmInfo::AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates new { if (!PetActionBar[i].GetAction() && PetActionBar[i].IsActionBarForSpell()) { + if (i != index && index <= MAX_UNIT_ACTION_BAR_INDEX) + continue; + SetActionBar(i, spell_id, newstate == ACT_DECIDE ? spellInfo->IsAutocastable() ? ACT_DISABLED : ACT_PASSIVE : newstate); if (_unit->GetCharmer() && _unit->GetCharmer()->IsPlayer()) @@ -218,7 +225,7 @@ bool CharmInfo::RemoveSpellFromActionBar(uint32 spell_id) { if (PetActionBar[i].IsActionBarForSpell() && sSpellMgr->GetFirstSpellInChain(action) == first_id) { - SetActionBar(i, 0, ACT_PASSIVE); + SetActionBar(i, 0, ACT_DISABLED); return true; } } diff --git a/src/server/game/Entities/Unit/CharmInfo.h b/src/server/game/Entities/Unit/CharmInfo.h index 6a62c6ef8..2f44c2ff4 100644 --- a/src/server/game/Entities/Unit/CharmInfo.h +++ b/src/server/game/Entities/Unit/CharmInfo.h @@ -140,7 +140,7 @@ public: void InitEmptyActionBar(bool withAttack = true); //return true if successful - bool AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate = ACT_DECIDE); + bool AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate = ACT_DECIDE, uint32 index = MAX_UNIT_ACTION_BAR_INDEX + 1); bool RemoveSpellFromActionBar(uint32 spell_id); void LoadPetActionBar(const std::string& data); void BuildActionBar(WorldPacket* data); From 5ab142af93f76568a5556bb90f6e81d57d371401 Mon Sep 17 00:00:00 2001 From: Grimdhex <176165533+Grimdhex@users.noreply.github.com> Date: Sat, 31 Aug 2024 16:05:18 +0200 Subject: [PATCH 09/46] fix(Core/AI): remove an unused variable in ScriptedAI (#19816) fix(Core/AI): remove an unused variable --- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 3 +-- src/server/game/AI/ScriptedAI/ScriptedCreature.h | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 63d63c925..81211529b 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -190,8 +190,7 @@ bool SummonList::IsAnyCreatureInCombat() const } ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature), - me(creature), - IsFleeing(false) + me(creature) { _isHeroic = me->GetMap()->IsHeroic(); _difficulty = Difficulty(me->GetMap()->GetSpawnMode()); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 709d6698b..b252923ba 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -279,9 +279,6 @@ struct ScriptedAI : public CreatureAI //Pointer to creature we are manipulating Creature* me; - //For fleeing - bool IsFleeing; - // ************* //Pure virtual functions // ************* From 63a0f333df163ef1f7af340f2f6c27fb5033a641 Mon Sep 17 00:00:00 2001 From: Carriola-wotlk <148633595+Carriola-wotlk@users.noreply.github.com> Date: Sat, 31 Aug 2024 16:06:11 +0200 Subject: [PATCH 10/46] fix(DB/Creature): SSC - Greyheart Spellbinder miss Banish ability (#19813) fix(DB/Creature)-SSC-Greyheart-Spellbinder-miss-Banish-ability --- data/sql/updates/pending_db_world/2024_08_31_01.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 data/sql/updates/pending_db_world/2024_08_31_01.sql diff --git a/data/sql/updates/pending_db_world/2024_08_31_01.sql b/data/sql/updates/pending_db_world/2024_08_31_01.sql new file mode 100644 index 000000000..1482397ea --- /dev/null +++ b/data/sql/updates/pending_db_world/2024_08_31_01.sql @@ -0,0 +1,5 @@ +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 21806; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21806) AND (`source_type` = 0) AND (`id` IN (5)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(21806, 0, 5, 0, 0, 0, 23, 0, 10000, 30000, 10000, 30000, 0, 0, 11, 37527, 0, 0, 0, 0, 0, 5, 40, 0, 0, 0, 0, 0, 0, 0, 'Greyheart Spellbinder - In Combat - Cast Banish'); From be4b0f536ebe50e3b862dd648225f203f396f08c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 31 Aug 2024 14:06:15 +0000 Subject: [PATCH 11/46] chore(DB): import pending files Referenced commit(s): 5ab142af93f76568a5556bb90f6e81d57d371401 --- .../2024_08_31_01.sql => db_world/2024_08_31_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/2024_08_31_01.sql => db_world/2024_08_31_00.sql} (95%) diff --git a/data/sql/updates/pending_db_world/2024_08_31_01.sql b/data/sql/updates/db_world/2024_08_31_00.sql similarity index 95% rename from data/sql/updates/pending_db_world/2024_08_31_01.sql rename to data/sql/updates/db_world/2024_08_31_00.sql index 1482397ea..d48d0d27b 100644 --- a/data/sql/updates/pending_db_world/2024_08_31_01.sql +++ b/data/sql/updates/db_world/2024_08_31_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_08_30_02 -> 2024_08_31_00 UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 21806; DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21806) AND (`source_type` = 0) AND (`id` IN (5)); From 9ae19e542951ff1555704e2cf9dcfbe761bd4e77 Mon Sep 17 00:00:00 2001 From: Carriola-wotlk <148633595+Carriola-wotlk@users.noreply.github.com> Date: Sat, 31 Aug 2024 17:22:18 +0200 Subject: [PATCH 12/46] fix(DB/Item): Feathermoon Headdress has the wrong stats (#19814) * fix(DB/Item): Feathermoon Headdress has the wrong stats * ITEM_MOD_SPELL_DAMAGE_DONE deprecated check removed --- data/sql/updates/pending_db_world/2024_08_31_02.sql | 9 +++++++++ src/server/game/Globals/ObjectMgr.cpp | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/2024_08_31_02.sql diff --git a/data/sql/updates/pending_db_world/2024_08_31_02.sql b/data/sql/updates/pending_db_world/2024_08_31_02.sql new file mode 100644 index 000000000..06d58166d --- /dev/null +++ b/data/sql/updates/pending_db_world/2024_08_31_02.sql @@ -0,0 +1,9 @@ +UPDATE `item_template` +SET `stat_type1` = 5, +`stat_value1` = 20, +`stat_type2` = 7, +`stat_value2` = 13, +`stat_type3` = 42, +`stat_value3` = 25, +`StatsCount` = 3 +WHERE (`entry` = 13113); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index aff933782..17c0acdd7 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2989,7 +2989,6 @@ void ObjectMgr::LoadItemTemplates() switch (itemTemplate.ItemStat[j].ItemStatType) { case ITEM_MOD_SPELL_HEALING_DONE: - case ITEM_MOD_SPELL_DAMAGE_DONE: LOG_ERROR("sql.sql", "Item (Entry: {}) has deprecated stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType); break; default: From 5331a299621a5e10f9d6067bc7d77994dcd1cddf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 31 Aug 2024 15:23:12 +0000 Subject: [PATCH 13/46] chore(DB): import pending files Referenced commit(s): 9ae19e542951ff1555704e2cf9dcfbe761bd4e77 --- .../2024_08_31_02.sql => db_world/2024_08_31_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/2024_08_31_02.sql => db_world/2024_08_31_01.sql} (80%) diff --git a/data/sql/updates/pending_db_world/2024_08_31_02.sql b/data/sql/updates/db_world/2024_08_31_01.sql similarity index 80% rename from data/sql/updates/pending_db_world/2024_08_31_02.sql rename to data/sql/updates/db_world/2024_08_31_01.sql index 06d58166d..ddec84ad4 100644 --- a/data/sql/updates/pending_db_world/2024_08_31_02.sql +++ b/data/sql/updates/db_world/2024_08_31_01.sql @@ -1,3 +1,4 @@ +-- DB update 2024_08_31_00 -> 2024_08_31_01 UPDATE `item_template` SET `stat_type1` = 5, `stat_value1` = 20, From 43d60694e4ef3305fb1db871b13eade8d6ae26b7 Mon Sep 17 00:00:00 2001 From: sudlud Date: Sat, 31 Aug 2024 22:25:52 +0200 Subject: [PATCH 14/46] fix(CI/codestyle): bump dependencies for Node.js 20 (#19778) --- .github/workflows/codestyle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index f24a1d252..74f932050 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.10' - name: AzerothCore codestyle From 3b45e90e417253f045ea66a88b8836fd768a165f Mon Sep 17 00:00:00 2001 From: Walter Pagani Date: Sat, 31 Aug 2024 17:34:56 -0300 Subject: [PATCH 15/46] fix(Scripts/ICC): NPC Muradin Dialogues (#18931) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Meji Co-authored-by: 天鹿 <18535853+PkllonG@users.noreply.github.com> --- src/server/game/Entities/Creature/Creature.cpp | 5 ++++- .../Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index cae76f330..29086a8dc 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -3029,8 +3029,11 @@ std::string Creature::GetScriptName() const uint32 Creature::GetScriptId() const { if (CreatureData const* creatureData = GetCreatureData()) - if (uint32 scriptId = creatureData->ScriptId) + { + uint32 scriptId = creatureData->ScriptId; + if (scriptId && GetEntry() == creatureData->id1) return scriptId; + } return sObjectMgr->GetCreatureTemplate(GetEntry())->ScriptID; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 43df1ceaa..4398b49a2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -401,7 +401,7 @@ public: case NPC_SE_HIGH_OVERLORD_SAURFANG: if (TeamIdInInstance == TEAM_ALLIANCE) { - creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, creature->GetCreatureData()); + creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, true); creature->LoadEquipment(); } DeathbringerSaurfangEventGUID = creature->GetGUID(); From 83d623e559cd82114cf2577d20e33ee717706b60 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 31 Aug 2024 17:35:17 -0300 Subject: [PATCH 16/46] fix(Scripts/BlackTemple): Fix Mother Shahraz teleport (#19820) fix(Scripts/BlackTemple): Fix Mother Sharaz teleport Co-authored-by: Keader --- .../scripts/Outland/BlackTemple/boss_mother_shahraz.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index db41a2091..830447c8d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -212,14 +212,7 @@ class spell_mother_shahraz_fatal_attraction : public SpellScript void SetDest(SpellDestination& dest) { - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID)) - { - dest.Relocate(*target); - if (roll_chance_i(50)) - break; - } + dest.Relocate(GetCaster()->GetRandomNearPosition(50.0f)); } void HandleTeleportUnits(SpellEffIndex /*effIndex*/) From f88812443d8e2f0057416e70d8e4c474e3ca79cb Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sat, 31 Aug 2024 16:38:03 -0400 Subject: [PATCH 17/46] refactor(Core): Correct typo. (#19830) Init. --- src/server/game/Achievements/AchievementMgr.cpp | 6 +++--- src/server/game/Achievements/AchievementMgr.h | 4 ++-- src/server/game/Entities/Item/ItemTemplate.h | 2 +- src/server/game/Entities/Player/PlayerStorage.cpp | 8 ++++---- src/server/game/Entities/Unit/Unit.cpp | 6 +++--- .../TrialOfTheCrusader/instance_trial_of_the_crusader.cpp | 2 +- src/server/scripts/Spells/spell_generic.cpp | 4 ++-- src/server/shared/SharedDefines.h | 2 +- src/server/shared/enuminfo_SharedDefines.cpp | 6 +++--- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 37ed221ee..6748e0190 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -244,11 +244,11 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE: case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_TEAMS_SCORES: return true; // not check correctness node indexes - case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM: + case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY: if (equipped_item.item_quality >= MAX_ITEM_QUALITY) { - LOG_ERROR("sql.sql", "Table `achievement_criteria_requirement` (Entry: {} Type: {}) for requirement ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPED_ITEM ({}) has unknown quality state in value1 ({}), ignored.", + LOG_ERROR("sql.sql", "Table `achievement_criteria_requirement` (Entry: {} Type: {}) for requirement ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPPED_ITEM ({}) has unknown quality state in value1 ({}), ignored.", criteria->ID, criteria->requiredType, dataType, equipped_item.item_quality); return false; } @@ -411,7 +411,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un } return instance->CheckAchievementCriteriaMeet(criteria_id, source, target, miscvalue1); } - case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM: + case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: { ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscvalue1); if (!pProto) diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index c82cc6f4e..e05ef8e31 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -62,7 +62,7 @@ enum AchievementCriteriaDataType ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16, // holiday_id 0 event in holiday time ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17, // min_score max_score player's team win bg and opposition team have team score in range ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit - ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19, // item_level item_quality for equipped item in slot to check item level and quality + ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19, // item_level item_quality for equipped item in slot to check item level and quality ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID = 20, // map_id 0 player must be on map with id in map_id ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21, // class_id race_id ACHIEVEMENT_CRITERIA_DATA_TYPE_NTH_BIRTHDAY = 22, // N login on day of N-th Birthday @@ -170,7 +170,7 @@ struct AchievementCriteriaData uint32 max_score; } bg_loss_team_score; // ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18 (no data) - // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19 + // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19 struct { uint32 item_level; diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index ec5d0e0f0..8313f9686 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -94,7 +94,7 @@ enum ItemBondingType { NO_BIND = 0, BIND_WHEN_PICKED_UP = 1, - BIND_WHEN_EQUIPED = 2, + BIND_WHEN_EQUIPPED = 2, BIND_WHEN_USE = 3, BIND_QUEST_ITEM = 4, BIND_QUEST_ITEM1 = 5 // not used in game diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 4fcdc5602..c0938e84c 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -1897,7 +1897,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16& dest, Item* pItem, bool if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot)) return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE; - // if we are swapping 2 equiped items, CanEquipUniqueItem check + // if we are swapping 2 equipped items, CanEquipUniqueItem check // should ignore the item we are trying to swap, and not the // destination item. CanEquipUniqueItem should ignore destination // item only when we are swapping weapon from bag @@ -2645,7 +2645,7 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM || - (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPED && IsBagPos(pos))) + (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos))) pItem->SetBinding(true); Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag); @@ -2685,7 +2685,7 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool { if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM || - (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPED && IsBagPos(pos))) + (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos))) pItem2->SetBinding(true); pItem2->SetCount(pItem2->GetCount() + count); @@ -2893,7 +2893,7 @@ void Player::VisualizeItem(uint8 slot, Item* pItem) return; // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory) - if (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM) + if (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED || pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM) pItem->SetBinding(true); LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry()); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4884f22e8..25be63539 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11249,7 +11249,7 @@ float Unit::SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, Da { // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization) if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 && - !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL) + !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL) { continue; } @@ -11264,7 +11264,7 @@ float Unit::SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, Da { if ((*i)->GetSpellInfo()->EquippedItemClass == -1) AddPct(DoneTotalMod, (*i)->GetAmount()); - else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) + else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) AddPct(DoneTotalMod, (*i)->GetAmount()); else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) AddPct(DoneTotalMod, (*i)->GetAmount()); @@ -13089,7 +13089,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType { if ((*i)->GetSpellInfo()->EquippedItemClass == -1) AddPct(DoneTotalMod, (*i)->GetAmount()); - else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) + else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) AddPct(DoneTotalMod, (*i)->GetAmount()); else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) AddPct(DoneTotalMod, (*i)->GetAmount()); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 7b3ab1688..8a9a3a498 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -118,7 +118,7 @@ public: return true; if (item->ItemId == 46017) // Val'anyr, Hammer of Ancient Kings - exception, too powerful return false; - if (item->ItemLevel == 245 && item->Bonding == BIND_WHEN_EQUIPED) // this also includes items crafted from patterns obtained in ToC 10 norm/hc + if (item->ItemLevel == 245 && item->Bonding == BIND_WHEN_EQUIPPED) // this also includes items crafted from patterns obtained in ToC 10 norm/hc return true; if (validDedicatedInsanityItems.find(item->ItemId) != validDedicatedInsanityItems.end()) // list of items dropping from ToC 10 norm/hc and also items ilevel 245 buyable for emblems of triumph return true; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 42a12e526..1e7eccb93 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3284,7 +3284,7 @@ class spell_gen_summon_tournament_mount : public SpellScript return ValidateSpellInfo({ SPELL_LANCE_EQUIPPED }); } - SpellCastResult CheckIfLanceEquiped() + SpellCastResult CheckIfLanceEquipped() { if (GetCaster()->IsInDisallowedMountForm()) GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); @@ -3300,7 +3300,7 @@ class spell_gen_summon_tournament_mount : public SpellScript void Register() override { - OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount::CheckIfLanceEquiped); + OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount::CheckIfLanceEquipped); } }; diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 241f4ac5d..42c81bccf 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -580,7 +580,7 @@ enum SpellAttr5 : uint32 SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC = 0x00002000, // TITLE Duration scales with Haste Rating SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED = 0x00004000, // TITLE Charmed units cannot cast this spell SPELL_ATTR5_TREAT_AS_AREA_EFFECT = 0x00008000, // TITLE Unknown attribute 15@Attr5 DESCRIPTION Related to multi-target spells? - SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM = 0x00010000, // TITLE DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped + SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM = 0x00010000, // TITLE DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped SPELL_ATTR5_ALLOW_WHILE_FLEEING = 0x00020000, // TITLE Usable while feared SPELL_ATTR5_ALLOW_WHILE_CONFUSED = 0x00040000, // TITLE Usable while confused SPELL_ATTR5_AI_DOESNT_FACE_TARGET = 0x00080000, // TITLE Do not auto-turn while casting diff --git a/src/server/shared/enuminfo_SharedDefines.cpp b/src/server/shared/enuminfo_SharedDefines.cpp index e5ae568dd..f584257a8 100644 --- a/src/server/shared/enuminfo_SharedDefines.cpp +++ b/src/server/shared/enuminfo_SharedDefines.cpp @@ -818,7 +818,7 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr5 value) case SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC: return { "SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC", "Duration scales with Haste Rating", "" }; case SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED: return { "SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED", "Charmed units cannot cast this spell", "" }; case SPELL_ATTR5_TREAT_AS_AREA_EFFECT: return { "SPELL_ATTR5_TREAT_AS_AREA_EFFECT", "Unknown attribute 15@Attr5", "Related to multi-target spells?" }; - case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM: return { "SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM", "DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped", "" }; + case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM: return { "SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM", "DESCRIPTION this allows spells with EquippedItemClass to affect spells from other items if the required item is equipped", "" }; case SPELL_ATTR5_ALLOW_WHILE_FLEEING: return { "SPELL_ATTR5_ALLOW_WHILE_FLEEING", "Usable while feared", "" }; case SPELL_ATTR5_ALLOW_WHILE_CONFUSED: return { "SPELL_ATTR5_ALLOW_WHILE_CONFUSED", "Usable while confused", "" }; case SPELL_ATTR5_AI_DOESNT_FACE_TARGET: return { "SPELL_ATTR5_AI_DOESNT_FACE_TARGET", "Do not auto-turn while casting", "" }; @@ -862,7 +862,7 @@ AC_API_EXPORT SpellAttr5 EnumUtils::FromIndex(std::size_t index) case 13: return SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC; case 14: return SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED; case 15: return SPELL_ATTR5_TREAT_AS_AREA_EFFECT; - case 16: return SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM; + case 16: return SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM; case 17: return SPELL_ATTR5_ALLOW_WHILE_FLEEING; case 18: return SPELL_ATTR5_ALLOW_WHILE_CONFUSED; case 19: return SPELL_ATTR5_AI_DOESNT_FACE_TARGET; @@ -903,7 +903,7 @@ AC_API_EXPORT std::size_t EnumUtils::ToIndex(SpellAttr5 value) case SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC: return 13; case SPELL_ATTR5_NOT_AVALIABLE_WHILE_CHARMED: return 14; case SPELL_ATTR5_TREAT_AS_AREA_EFFECT: return 15; - case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM: return 16; + case SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM: return 16; case SPELL_ATTR5_ALLOW_WHILE_FLEEING: return 17; case SPELL_ATTR5_ALLOW_WHILE_CONFUSED: return 18; case SPELL_ATTR5_AI_DOESNT_FACE_TARGET: return 19; From 5d31b9f98ff9b44598c60f4944a3fd98e79c9cbf Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sun, 1 Sep 2024 00:38:50 +0200 Subject: [PATCH 18/46] refactor(Core/Item): Add helpers (#19828) --- apps/codestyle/codestyle.py | 57 ++++++++++- .../game/Entities/Creature/CreatureData.h | 2 +- src/server/game/Entities/Item/Item.cpp | 12 +-- src/server/game/Entities/Item/Item.h | 5 +- src/server/game/Entities/Item/ItemTemplate.h | 96 +++++++++---------- src/server/game/Entities/Player/Player.cpp | 12 +-- .../game/Entities/Player/PlayerStorage.cpp | 22 ++--- src/server/game/Globals/ObjectMgr.cpp | 28 +++--- src/server/game/Groups/Group.cpp | 2 +- .../game/Handlers/AuctionHouseHandler.cpp | 2 +- src/server/game/Handlers/ItemHandler.cpp | 10 +- src/server/game/Handlers/LootHandler.cpp | 2 +- src/server/game/Handlers/MailHandler.cpp | 6 +- src/server/game/Handlers/SpellHandler.cpp | 10 +- src/server/game/Handlers/TradeHandler.cpp | 6 +- src/server/game/Loot/LootItemStorage.cpp | 2 +- src/server/game/Loot/LootMgr.cpp | 22 ++--- src/server/game/Spells/Spell.cpp | 10 +- src/server/game/Spells/SpellEffects.cpp | 6 +- 19 files changed, 183 insertions(+), 129 deletions(-) diff --git a/apps/codestyle/codestyle.py b/apps/codestyle/codestyle.py index 8c595d704..50c5fe3dd 100644 --- a/apps/codestyle/codestyle.py +++ b/apps/codestyle/codestyle.py @@ -12,7 +12,9 @@ results = { "Trailing whitespace check": "Passed", "GetCounter() check": "Passed", "GetTypeId() check": "Passed", - "NpcFlagHelpers check": "Passed" + "NpcFlagHelpers check": "Passed", + "ItemFlagHelpers check": "Passed", + "ItemTemplateFlagHelpers check": "Passed" } # Main function to parse all the files of the project @@ -31,6 +33,10 @@ def parsing_file(directory: str) -> None: get_typeid_check(file, file_path) if file_name != 'Unit.h': npcflags_helpers_check(file, file_path) + if file_name != 'Item.h': + itemflag_helpers_check(file, file_path) + if file_name != 'ItemTemplate.h': + itemtemplateflag_helpers_check(file, file_path) except UnicodeDecodeError: print(f"\nCould not decode file {file_path}") sys.exit(1) @@ -139,10 +145,59 @@ def npcflags_helpers_check(file: io, file_path: str) -> None: if 'RemoveFlag(UNIT_NPC_FLAGS,' in line: print( f"Please use RemoveNpcFlag() instead RemoveFlag(UNIT_NPC_FLAGS, ...): {file_path} at line {line_number}") + check_failed = True # Handle the script error and update the result output if check_failed: error_handler = True results["NpcFlagHelpers check"] = "Failed" +# Codestyle patterns checking for ItemFlag helpers +def itemflag_helpers_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)' in line: + print( + f"Please use IsRefundable() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE): {file_path} at line {line_number}") + check_failed = True + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)' in line: + print( + f"Please use IsBOPTradable() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE): {file_path} at line {line_number}") + check_failed = True + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)' in line: + print( + f"Please use IsWrapped() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED): {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["ItemFlagHelpers check"] = "Failed" + +# Codestyle patterns checking for ItemTemplate helpers +def itemtemplateflag_helpers_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'Flags & ITEM_FLAG' in line: + print( + f"Please use HasFlag(ItemFlag) instead of 'Flags & ITEM_FLAG_' {file_path} at line {line_number}") + check_failed = True + if 'Flags2 & ITEM_FLAG2' in line: + print( + f"Please use HasFlag2(ItemFlag2) instead of 'Flags2 & ITEM_FLAG2_': {file_path} at line {line_number}") + check_failed = True + if 'FlagsCu & ITEM_FLAGS_CU' in line: + print( + f"Please use HasFlagCu(ItemFlagsCustom) instead of 'FlagsCu & ITEM_FLAGS_CU_': {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["ItemTemplateFlagHelpers check"] = "Failed" + # Main function parsing_file(src_directory) diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index e3fb72314..b14cb85ea 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -464,7 +464,7 @@ struct VendorItem uint32 ExtendedCost; //helpers - bool IsGoldRequired(ItemTemplate const* pProto) const { return pProto->Flags2 & ITEM_FLAGS_EXTRA_EXT_COST_REQUIRES_GOLD || !ExtendedCost; } + bool IsGoldRequired(ItemTemplate const* pProto) const { return pProto->HasFlag2(ITEM_FLAG2_DONT_IGNORE_BUY_PRICE) || !ExtendedCost; } }; typedef std::vector VendorItemList; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 7c62b7798..c75e0e32c 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -379,7 +379,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction trans) trans->Append(stmt); - if ((uState == ITEM_CHANGED) && HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if ((uState == ITEM_CHANGED) && IsWrapped()) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GIFT_OWNER); stmt->SetData(0, GetOwnerGUID().GetCounter()); @@ -394,7 +394,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction trans) stmt->SetData(0, guid); trans->Append(stmt); - if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (IsWrapped()) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); stmt->SetData(0, guid); @@ -493,7 +493,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi // update max durability (and durability) if need // xinef: do not overwrite durability for wrapped items!! SetUInt32Value(ITEM_FIELD_MAXDURABILITY, proto->MaxDurability); - if (durability > proto->MaxDurability && !HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (durability > proto->MaxDurability && !IsWrapped()) { SetUInt32Value(ITEM_FIELD_DURABILITY, proto->MaxDurability); need_save = true; @@ -794,7 +794,7 @@ bool Item::IsEquipped() const bool Item::CanBeTraded(bool mail, bool trade) const { - if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE) || !trade))) + if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!IsBOPTradable() || !trade))) return false; if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty())) @@ -1140,7 +1140,7 @@ bool Item::IsBindedNotWith(Player const* player) const if (GetOwnerGUID() == player->GetGUID()) return false; - if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (IsBOPTradable()) if (allowedGUIDs.find(player->GetGUID()) != allowedGUIDs.end()) return false; @@ -1200,7 +1200,7 @@ void Item::DeleteRefundDataFromDB(CharacterDatabaseTransaction* trans) void Item::SetNotRefundable(Player* owner, bool changestate /*=true*/, CharacterDatabaseTransaction* trans /*=nullptr*/) { - if (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (!IsRefundable()) return; RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE); diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 4ce4c1072..6fdc2f509 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -234,7 +234,7 @@ public: void SetBinding(bool val) { ApplyModFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_SOULBOUND, val); } [[nodiscard]] bool IsSoulBound() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_SOULBOUND); } - [[nodiscard]] bool IsBoundAccountWide() const { return (GetTemplate()->Flags & ITEM_FLAG_IS_BOUND_TO_ACCOUNT) != 0; } + [[nodiscard]] bool IsBoundAccountWide() const { return GetTemplate()->HasFlag(ITEM_FLAG_IS_BOUND_TO_ACCOUNT) != 0; } bool IsBindedNotWith(Player const* player) const; [[nodiscard]] bool IsBoundByEnchant() const; [[nodiscard]] bool IsBoundByTempEnchant() const; @@ -258,6 +258,9 @@ public: [[nodiscard]] bool CanBeTraded(bool mail = false, bool trade = false) const; void SetInTrade(bool b = true) { mb_in_trade = b; } [[nodiscard]] bool IsInTrade() const { return mb_in_trade; } + [[nodiscard]] bool IsRefundable() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE); } + [[nodiscard]] bool IsBOPTradable() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE); } + [[nodiscard]] bool IsWrapped() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED); } bool HasEnchantRequiredSkill(Player const* player) const; [[nodiscard]] uint32 GetEnchantRequiredLevel() const; diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 8313f9686..1550b3883 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -152,30 +152,30 @@ enum ItemFlags : uint32 ITEM_FLAG_NO_USER_DESTROY = 0x00000020, // Item can not be destroyed, except by using spell (item can be reagent for spell) ITEM_FLAG_PLAYERCAST = 0x00000040, // Item's spells are castable by players ITEM_FLAG_NO_EQUIP_COOLDOWN = 0x00000080, // No default 30 seconds cooldown when equipped - ITEM_FLAG_MULTI_LOOT_QUEST = 0x00000100, + ITEM_FLAG_MULTI_LOOT_QUEST = 0x00000100, // NYI ITEM_FLAG_IS_WRAPPER = 0x00000200, // Item can wrap other items - ITEM_FLAG_USES_RESOURCES = 0x00000400, + ITEM_FLAG_USES_RESOURCES = 0x00000400, // NYI ITEM_FLAG_MULTI_DROP = 0x00000800, // Looting this item does not remove it from available loot ITEM_FLAG_ITEM_PURCHASE_RECORD = 0x00001000, // Item can be returned to vendor for its original cost (extended cost) ITEM_FLAG_PETITION = 0x00002000, // Item is guild or arena charter ITEM_FLAG_HAS_TEXT = 0x00004000, // Only readable items have this (but not all) - ITEM_FLAG_NO_DISENCHANT = 0x00008000, - ITEM_FLAG_REAL_DURATION = 0x00010000, + ITEM_FLAG_NO_DISENCHANT = 0x00008000, // NYI + ITEM_FLAG_REAL_DURATION = 0x00010000, // NYI ITEM_FLAG_NO_CREATOR = 0x00020000, ITEM_FLAG_IS_PROSPECTABLE = 0x00040000, // Item can be prospected ITEM_FLAG_UNIQUE_EQUIPPABLE = 0x00080000, // You can only equip one of these - ITEM_FLAG_IGNORE_FOR_AURAS = 0x00100000, + ITEM_FLAG_IGNORE_FOR_AURAS = 0x00100000, // NYI ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS = 0x00200000, // Item can be used during arena match ITEM_FLAG_NO_DURABILITY_LOSS = 0x00400000, // Some Thrown weapons have it (and only Thrown) but not all ITEM_FLAG_USE_WHEN_SHAPESHIFTED = 0x00800000, // Item can be used in shapeshift forms - ITEM_FLAG_HAS_QUEST_GLOW = 0x01000000, + ITEM_FLAG_HAS_QUEST_GLOW = 0x01000000, // NYI ITEM_FLAG_HIDE_UNUSABLE_RECIPE = 0x02000000, // Profession recipes: can only be looted if you meet requirements and don't already know it ITEM_FLAG_NOT_USEABLE_IN_ARENA = 0x04000000, // Item cannot be used in arena ITEM_FLAG_IS_BOUND_TO_ACCOUNT = 0x08000000, // Item binds to account and can be sent only to your own characters ITEM_FLAG_NO_REAGENT_COST = 0x10000000, // Spell is cast ignoring reagents ITEM_FLAG_IS_MILLABLE = 0x20000000, // Item can be milled - ITEM_FLAG_REPORT_TO_GUILD_CHAT = 0x40000000, - ITEM_FLAG_NO_PROGRESSIVE_LOOT = 0x80000000 + ITEM_FLAG_REPORT_TO_GUILD_CHAT = 0x40000000, // NYI + ITEM_FLAG_NO_PROGRESSIVE_LOOT = 0x80000000 // NYI }; enum ItemFlags2 : uint32 @@ -183,46 +183,38 @@ enum ItemFlags2 : uint32 ITEM_FLAG2_FACTION_HORDE = 0x00000001, ITEM_FLAG2_FACTION_ALLIANCE = 0x00000002, ITEM_FLAG2_DONT_IGNORE_BUY_PRICE = 0x00000004, // when item uses extended cost, gold is also required - ITEM_FLAG2_CLASSIFY_AS_CASTER = 0x00000008, - ITEM_FLAG2_CLASSIFY_AS_PHYSICAL = 0x00000010, - ITEM_FLAG2_EVERYONE_CAN_ROLL_NEED = 0x00000020, - ITEM_FLAG2_NO_TRADE_BIND_ON_ACQUIRE = 0x00000040, - ITEM_FLAG2_CAN_TRADE_BIND_ON_ACQUIRE = 0x00000080, + ITEM_FLAG2_CLASSIFY_AS_CASTER = 0x00000008, // NYI + ITEM_FLAG2_CLASSIFY_AS_PHYSICAL = 0x00000010, // NYI + ITEM_FLAG2_EVERYONE_CAN_ROLL_NEED = 0x00000020, // NYI + ITEM_FLAG2_NO_TRADE_BIND_ON_ACQUIRE = 0x00000040, // NYI + ITEM_FLAG2_CAN_TRADE_BIND_ON_ACQUIRE = 0x00000080, // NYI ITEM_FLAG2_CAN_ONLY_ROLL_GREED = 0x00000100, - ITEM_FLAG2_CASTER_WEAPON = 0x00000200, - ITEM_FLAG2_DELETE_ON_LOGIN = 0x00000400, - ITEM_FLAG2_INTERNAL_ITEM = 0x00000800, - ITEM_FLAG2_NO_VENDOR_VALUE = 0x00001000, - ITEM_FLAG2_SHOW_BEFORE_DISCOVERED = 0x00002000, - ITEM_FLAG2_OVERRIDE_GOLD_COST = 0x00004000, - ITEM_FLAG2_IGNORE_DEFAULT_RATED_BG_RESTRICTIONS = 0x00008000, - ITEM_FLAG2_NOT_USABLE_IN_RATED_BG = 0x00010000, - ITEM_FLAG2_BNET_ACCOUNT_TRADE_OK = 0x00020000, - ITEM_FLAG2_CONFIRM_BEFORE_USE = 0x00040000, - ITEM_FLAG2_REEVALUATE_BONDING_ON_TRANSFORM = 0x00080000, - ITEM_FLAG2_NO_TRANSFORM_ON_CHARGE_DEPLETION = 0x00100000, - ITEM_FLAG2_NO_ALTER_ITEM_VISUAL = 0x00200000, - ITEM_FLAG2_NO_SOURCE_FOR_ITEM_VISUAL = 0x00400000, - ITEM_FLAG2_IGNORE_QUALITY_FOR_ITEM_VISUAL_SOURCE = 0x00800000, - ITEM_FLAG2_NO_DURABILITY = 0x01000000, - ITEM_FLAG2_ROLE_TANK = 0x02000000, - ITEM_FLAG2_ROLE_HEALER = 0x04000000, - ITEM_FLAG2_ROLE_DAMAGE = 0x08000000, - ITEM_FLAG2_CAN_DROP_IN_CHALLENGE_MODE = 0x10000000, - ITEM_FLAG2_NEVER_STACK_IN_LOOT_UI = 0x20000000, - ITEM_FLAG2_DISENCHANT_TO_LOOT_TABLE = 0x40000000, - ITEM_FLAG2_USED_IN_A_TRADESKILL = 0x80000000 + ITEM_FLAG2_CASTER_WEAPON = 0x00000200, // NYI + ITEM_FLAG2_DELETE_ON_LOGIN = 0x00000400, // NYI + ITEM_FLAG2_INTERNAL_ITEM = 0x00000800, // NYI + ITEM_FLAG2_NO_VENDOR_VALUE = 0x00001000, // NYI + ITEM_FLAG2_SHOW_BEFORE_DISCOVERED = 0x00002000, // NYI + ITEM_FLAG2_OVERRIDE_GOLD_COST = 0x00004000, // NYI + ITEM_FLAG2_IGNORE_DEFAULT_RATED_BG_RESTRICTIONS = 0x00008000, // NYI + ITEM_FLAG2_NOT_USABLE_IN_RATED_BG = 0x00010000, // NYI + ITEM_FLAG2_BNET_ACCOUNT_TRADE_OK = 0x00020000, // NYI + ITEM_FLAG2_CONFIRM_BEFORE_USE = 0x00040000, // NYI + ITEM_FLAG2_REEVALUATE_BONDING_ON_TRANSFORM = 0x00080000, // NYI + ITEM_FLAG2_NO_TRANSFORM_ON_CHARGE_DEPLETION = 0x00100000, // NYI + ITEM_FLAG2_NO_ALTER_ITEM_VISUAL = 0x00200000, // NYI + ITEM_FLAG2_NO_SOURCE_FOR_ITEM_VISUAL = 0x00400000, // NYI + ITEM_FLAG2_IGNORE_QUALITY_FOR_ITEM_VISUAL_SOURCE = 0x00800000, // NYI + ITEM_FLAG2_NO_DURABILITY = 0x01000000, // NYI + ITEM_FLAG2_ROLE_TANK = 0x02000000, // NYI + ITEM_FLAG2_ROLE_HEALER = 0x04000000, // NYI + ITEM_FLAG2_ROLE_DAMAGE = 0x08000000, // NYI + ITEM_FLAG2_CAN_DROP_IN_CHALLENGE_MODE = 0x10000000, // NYI + ITEM_FLAG2_NEVER_STACK_IN_LOOT_UI = 0x20000000, // NYI + ITEM_FLAG2_DISENCHANT_TO_LOOT_TABLE = 0x40000000, // NYI + ITEM_FLAG2_USED_IN_A_TRADESKILL = 0x80000000 // NYI }; -enum ItemFlagsExtra -{ - ITEM_FLAGS_EXTRA_HORDE_ONLY = 0x00000001, - ITEM_FLAGS_EXTRA_ALLIANCE_ONLY = 0x00000002, - ITEM_FLAGS_EXTRA_EXT_COST_REQUIRES_GOLD = 0x00000004, // when item uses extended cost, gold is also required - ITEM_FLAGS_EXTRA_NEED_ROLL_DISABLED = 0x00000100 -}; - -enum ItemFlagsCustom +enum ItemFlagsCustom : uint32 { ITEM_FLAGS_CU_DURATION_REAL_TIME = 0x0001, // Item duration will tick even if player is offline ITEM_FLAGS_CU_IGNORE_QUEST_STATUS = 0x0002, // No quest status will be checked when this item drops @@ -632,8 +624,8 @@ struct ItemTemplate std::string Name1; uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc uint32 Quality; - uint32 Flags; - uint32 Flags2; + ItemFlags Flags; + ItemFlags2 Flags2; uint32 BuyCount; int32 BuyPrice; uint32 SellPrice; @@ -699,7 +691,7 @@ struct ItemTemplate uint32 FoodType; uint32 MinMoneyLoot; uint32 MaxMoneyLoot; - uint32 FlagsCu; + ItemFlagsCustom FlagsCu; WorldPacket queryData; // pussywizard // helpers @@ -708,7 +700,7 @@ struct ItemTemplate return GetMaxStackSize() == 1 && Class != ITEM_CLASS_CONSUMABLE && Class != ITEM_CLASS_QUEST && - (Flags & ITEM_FLAG_NO_CREATOR) == 0 && + !HasFlag(ITEM_FLAG_NO_CREATOR) && ItemId != 6948; /*Hearthstone*/ } @@ -827,11 +819,15 @@ struct ItemTemplate [[nodiscard]] bool IsPotion() const { return Class == ITEM_CLASS_CONSUMABLE && SubClass == ITEM_SUBCLASS_POTION; } [[nodiscard]] bool IsWeaponVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_WEAPON_ENCHANTMENT; } [[nodiscard]] bool IsArmorVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_ARMOR_ENCHANTMENT; } - [[nodiscard]] bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && (Flags & ITEM_FLAG_CONJURED); } + [[nodiscard]] bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && HasFlag(ITEM_FLAG_CONJURED); } [[nodiscard]] bool HasStat(ItemModType stat) const; [[nodiscard]] bool HasSpellPowerStat() const; + [[nodiscard]] bool HasFlag(ItemFlags flag) const { return (Flags & flag) != 0; } + [[nodiscard]] bool HasFlag2(ItemFlags2 flag) const { return (Flags2 & flag) != 0; } + [[nodiscard]] bool HasFlagCu(ItemFlagsCustom flag) const { return (FlagsCu & flag) != 0; } + void InitializeQueryData(); }; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2f2fec96e..bc044e5e3 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -10644,7 +10644,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c if (!bStore) AutoUnequipOffhandIfNeed(); - if (pProto->Flags & ITEM_FLAG_ITEM_PURCHASE_RECORD && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1) + if (pProto->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1) { it->SetFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE); it->SetRefundRecipient(GetGUID().GetCounter()); @@ -10692,7 +10692,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin return false; } - if (!IsGameMaster() && ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && GetTeamId(true) == TEAM_ALLIANCE) || (pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && GetTeamId(true) == TEAM_HORDE))) + if (!IsGameMaster() && ((pProto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) == TEAM_ALLIANCE) || (pProto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) == TEAM_HORDE))) { return false; } @@ -11722,7 +11722,7 @@ void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint3 void Player::ApplyEquipCooldown(Item* pItem) { - if (pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_NO_EQUIP_COOLDOWN)) + if (pItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_EQUIP_COOLDOWN)) return; for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) @@ -13765,7 +13765,7 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot, uint32 limit_count) const { // check unique-equipped on item - if (itemProto->Flags & ITEM_FLAG_UNIQUE_EQUIPPABLE) + if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE)) { // there is an equip limit on this item if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot)) @@ -15471,7 +15471,7 @@ void Player::SendRefundInfo(Item* item) // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours. item->UpdatePlayedTime(this); - if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (!item->IsRefundable()) { LOG_DEBUG("entities.player.items", "Item refund: item not refundable!"); return; @@ -15539,7 +15539,7 @@ PetStable& Player::GetOrInitPetStable() void Player::RefundItem(Item* item) { - if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (!item->IsRefundable()) { LOG_DEBUG("entities.player.items", "Item refund: item not refundable!"); return; diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index c0938e84c..c4d0a7f68 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -2296,12 +2296,12 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const return EQUIP_ERR_ITEM_NOT_FOUND; } - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeamId(true) != TEAM_HORDE) + if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) != TEAM_HORDE) { return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; } - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeamId(true) != TEAM_ALLIANCE) + if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) != TEAM_ALLIANCE) { return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; } @@ -3030,7 +3030,7 @@ void Player::MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool // in case trade we already have item in other player inventory pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this); - if (pLastItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (pLastItem->IsBOPTradable()) AddTradeableItem(pLastItem); } } @@ -3047,7 +3047,7 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) for (uint8 i = 0; i < MAX_BAG_SIZE; ++i) DestroyItem(slot, i, update); - if (pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (pItem->IsWrapped()) { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); stmt->SetData(0, pItem->GetGUID().GetCounter()); @@ -3117,7 +3117,7 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) pBag->RemoveItem(slot, update); // Xinef: item is removed, remove loot from storage if any - if (proto->Flags & ITEM_FLAG_HAS_LOOT) + if (proto->HasFlag(ITEM_FLAG_HAS_LOOT)) sLootItemStorage->RemoveStoredLoot(pItem->GetGUID()); if (IsInWorld() && update) @@ -4169,7 +4169,7 @@ void Player::UpdateItemDuration(uint32 time, bool realtimeonly) Item* item = *itr; ++itr; // current element can be erased in UpdateDuration - if (!realtimeonly || item->GetTemplate()->FlagsCu & ITEM_FLAGS_CU_DURATION_REAL_TIME) + if (!realtimeonly || item->GetTemplate()->HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME)) item->UpdateDuration(this, time); } } @@ -5999,13 +5999,13 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3 remove = true; } // "Conjured items disappear if you are logged out for more than 15 minutes" - else if (timeDiff > 15 * MINUTE && proto->Flags & ITEM_FLAG_CONJURED) + else if (timeDiff > 15 * MINUTE && proto->HasFlag(ITEM_FLAG_CONJURED)) { LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.", GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry()); remove = true; } - else if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + else if (item->IsRefundable()) { if (item->GetPlayedTime() > (2 * HOUR)) { @@ -6038,7 +6038,7 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3 } } } - else if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + else if (item->IsBOPTradable()) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE); stmt->SetData(0, item->GetGUID().GetCounter()); @@ -7266,7 +7266,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) if (item->GetState() == ITEM_NEW) { // Xinef: item is removed, remove loot from storage if any - if (item->GetTemplate()->Flags & ITEM_FLAG_HAS_LOOT) + if (item->GetTemplate()->HasFlag(ITEM_FLAG_HAS_LOOT)) sLootItemStorage->RemoveStoredLoot(item->GetGUID()); continue; } @@ -7281,7 +7281,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) m_items[i]->FSetState(ITEM_NEW); // Xinef: item is removed, remove loot from storage if any - if (item->GetTemplate()->Flags & ITEM_FLAG_HAS_LOOT) + if (item->GetTemplate()->HasFlag(ITEM_FLAG_HAS_LOOT)) sLootItemStorage->RemoveStoredLoot(item->GetGUID()); } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 17c0acdd7..cfe00b79d 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2720,8 +2720,8 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Name1 = fields[4].Get(); itemTemplate.DisplayInfoID = fields[5].Get(); itemTemplate.Quality = uint32(fields[6].Get()); - itemTemplate.Flags = fields[7].Get(); - itemTemplate.Flags2 = fields[8].Get(); + itemTemplate.Flags = ItemFlags(fields[7].Get()); + itemTemplate.Flags2 = ItemFlags2(fields[8].Get()); itemTemplate.BuyCount = uint32(fields[9].Get()); itemTemplate.BuyPrice = int32(fields[10].Get() * sWorld->getRate((Rates)(RATE_BUYVALUE_ITEM_POOR + itemTemplate.Quality))); itemTemplate.SellPrice = uint32(fields[11].Get() * sWorld->getRate((Rates)(RATE_SELLVALUE_ITEM_POOR + itemTemplate.Quality))); @@ -2817,7 +2817,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FoodType = uint32(fields[134].Get()); itemTemplate.MinMoneyLoot = fields[135].Get(); itemTemplate.MaxMoneyLoot = fields[136].Get(); - itemTemplate.FlagsCu = fields[137].Get(); + itemTemplate.FlagsCu = ItemFlagsCustom(fields[137].Get()); // Checks ItemEntry const* dbcitem = sItemStore.LookupEntry(entry); @@ -2873,23 +2873,23 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Quality = ITEM_QUALITY_NORMAL; } - if (itemTemplate.Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) + if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_HORDE)) { if (FactionEntry const* faction = sFactionStore.LookupEntry(HORDE)) if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0) - LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAGS_EXTRA_HORDE_ONLY ({}) in Flags field, item cannot be equipped or used by these races.", - entry, itemTemplate.AllowableRace, ITEM_FLAGS_EXTRA_HORDE_ONLY); + LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAG2_FACTION_HORDE ({}) in Flags field, item cannot be equipped or used by these races.", + entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_HORDE); - if (itemTemplate.Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) - LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `Flags2` flags (ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) and ITEM_FLAGS_EXTRA_HORDE_ONLY ({}) in Flags field, this is a wrong combination.", - entry, ITEM_FLAGS_EXTRA_ALLIANCE_ONLY, ITEM_FLAGS_EXTRA_HORDE_ONLY); + if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE)) + LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `Flags2` flags (ITEM_FLAG2_FACTION_ALLIANCE) and ITEM_FLAG2_FACTION_HORDE ({}) in Flags field, this is a wrong combination.", + entry, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE); } - else if (itemTemplate.Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) + else if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE)) { if (FactionEntry const* faction = sFactionStore.LookupEntry(ALLIANCE)) if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0) - LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAGS_EXTRA_ALLIANCE_ONLY ({}) in Flags field, item cannot be equipped or used by these races.", - entry, itemTemplate.AllowableRace, ITEM_FLAGS_EXTRA_ALLIANCE_ONLY); + LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAG2_FACTION_ALLIANCE ({}) in Flags field, item cannot be equipped or used by these races.", + entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_ALLIANCE); } if (itemTemplate.BuyCount <= 0) @@ -3200,10 +3200,10 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.HolidayId = 0; } - if (itemTemplate.FlagsCu & ITEM_FLAGS_CU_DURATION_REAL_TIME && !itemTemplate.Duration) + if (itemTemplate.HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME) && !itemTemplate.Duration) { LOG_ERROR("sql.sql", "Item (Entry {}) has flag ITEM_FLAGS_CU_DURATION_REAL_TIME but it does not have duration limit", entry); - itemTemplate.FlagsCu &= ~ITEM_FLAGS_CU_DURATION_REAL_TIME; + itemTemplate.FlagsCu = static_cast(static_cast(itemTemplate.FlagsCu) & ~ITEM_FLAGS_CU_DURATION_REAL_TIME); } // Fill categories map diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index c9e8a5896..7bd5cef5b 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1202,7 +1202,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) if (item->DisenchantID && m_maxEnchantingLevel >= item->RequiredDisenchantSkill) r->rollVoteMask |= ROLL_FLAG_TYPE_DISENCHANT; - if (item->Flags2 & ITEM_FLAGS_EXTRA_NEED_ROLL_DISABLED) + if (item->HasFlag2(ITEM_FLAG2_CAN_ONLY_ROLL_GREED)) r->rollVoteMask &= ~ROLL_FLAG_TYPE_NEED; loot->items[itemSlot].is_blocked = true; diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index a9a43c895..bf5fbc069 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -207,7 +207,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) itemEntry = item->GetTemplate()->ItemId; if (sAuctionMgr->GetAItem(item->GetGUID()) || !item->CanBeTraded() || item->IsNotEmptyBag() || - item->GetTemplate()->Flags & ITEM_FLAG_CONJURED || item->GetUInt32Value(ITEM_FIELD_DURATION) || + item->GetTemplate()->HasFlag(ITEM_FLAG_CONJURED) || item->GetUInt32Value(ITEM_FIELD_DURATION) || item->GetCount() < count[i] || itemEntry != item->GetTemplate()->ItemId) { SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index afe228b4e..0623001e8 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -319,7 +319,7 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData) return; } - if (pItem->GetTemplate()->Flags & ITEM_FLAG_NO_USER_DESTROY) + if (pItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_USER_DESTROY)) { _player->SendEquipError(EQUIP_ERR_CANT_DROP_SOULBOUND, nullptr, nullptr); return; @@ -783,7 +783,7 @@ void WorldSession::HandleSellItemOpcode(WorldPacket& recvData) // prevent selling item for sellprice when the item is still refundable // this probably happens when right clicking a refundable item, the client sends both // CMSG_SELL_ITEM and CMSG_REFUND_ITEM (unverified) - if (pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) + if (pItem->IsRefundable()) return; // Therefore, no feedback to client // special case at auto sell (sell all) @@ -1091,7 +1091,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) } // Only display items in vendor lists for the team the // player is on. If GM on, display all items. - if (!_player->IsGameMaster() && ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeamId() == TEAM_ALLIANCE) || (itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeamId() == TEAM_HORDE))) + if (!_player->IsGameMaster() && ((itemTemplate->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && _player->GetTeamId() == TEAM_ALLIANCE) || (itemTemplate->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && _player->GetTeamId() == TEAM_HORDE))) { continue; } @@ -1282,7 +1282,7 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData) return; } - if (!(gift->GetTemplate()->Flags & ITEM_FLAG_IS_WRAPPER)) // cheating: non-wrapper wrapper + if (!(gift->GetTemplate()->HasFlag(ITEM_FLAG_IS_WRAPPER))) // cheating: non-wrapper wrapper { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, gift, nullptr); return; @@ -1483,7 +1483,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) ItemTemplate const* iGemProto = Gems[i]->GetTemplate(); // unique item (for new and already placed bit removed enchantments - if (iGemProto->Flags & ITEM_FLAG_UNIQUE_EQUIPPABLE) + if (iGemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE)) { for (int j = 0; j < MAX_GEM_SOCKETS; ++j) { diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 70a2e0513..cd644bef9 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -372,7 +372,7 @@ void WorldSession::DoLootRelease(ObjectGuid lguid) player->DestroyItemCount(pItem, count, true); } - else if (pItem->loot.isLooted() || !(proto->Flags & ITEM_FLAG_HAS_LOOT)) + else if (pItem->loot.isLooted() || !proto->HasFlag(ITEM_FLAG_HAS_LOOT)) { player->DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), true); return; diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 3c8482a3b..71cd2dfb0 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -203,7 +203,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (item) { ItemTemplate const* itemProto = item->GetTemplate(); - if (!itemProto || !(itemProto->Flags & ITEM_FLAG_IS_BOUND_TO_ACCOUNT)) + if (!itemProto || !itemProto->HasFlag(ITEM_FLAG_IS_BOUND_TO_ACCOUNT)) { accountBound = false; break; @@ -257,13 +257,13 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) return; } - if (item->GetTemplate()->Flags & ITEM_FLAG_CONJURED || item->GetUInt32Value(ITEM_FIELD_DURATION)) + if (item->GetTemplate()->HasFlag(ITEM_FLAG_CONJURED) || item->GetUInt32Value(ITEM_FIELD_DURATION)) { player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_MAIL_BOUND_ITEM); return; } - if (COD && item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (COD && item->IsWrapped()) { player->SendMailResult(0, MAIL_SEND, MAIL_ERR_CANT_SEND_WRAPPED_COD); return; diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index e09e8033b..a373d5bf7 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -116,14 +116,14 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) } // only allow conjured consumable, bandage, poisons (all should have the 2^21 item flag set in DB) - if (proto->Class == ITEM_CLASS_CONSUMABLE && !(proto->Flags & ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS) && pUser->InArena()) + if (proto->Class == ITEM_CLASS_CONSUMABLE && !proto->HasFlag(ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS) && pUser->InArena()) { pUser->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, pItem, nullptr); return; } // don't allow items banned in arena - if (proto->Flags & ITEM_FLAG_NOT_USEABLE_IN_ARENA && pUser->InArena()) + if (proto->HasFlag(ITEM_FLAG_NOT_USEABLE_IN_ARENA) && pUser->InArena()) { pUser->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, pItem, nullptr); return; @@ -204,7 +204,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) } // Verify that the bag is an actual bag or wrapped item that can be used "normally" - if (!(proto->Flags & ITEM_FLAG_HAS_LOOT) && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) + if (!proto->HasFlag(ITEM_FLAG_HAS_LOOT) && !item->IsWrapped()) { pUser->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); LOG_ERROR("network.opcode", "Possible hacking attempt: Player {} [{}] tried to open item [{}, entry: {}] which is not openable!", @@ -235,7 +235,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) if (sScriptMgr->OnBeforeOpenItem(pUser, item)) { - if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED))// wrapped? + if (item->IsWrapped())// wrapped? { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM); stmt->SetData(0, item->GetGUID().GetCounter()); @@ -258,7 +258,7 @@ void WorldSession::HandleOpenWrappedItemCallback(uint8 bagIndex, uint8 slot, Obj if (!item) return; - if (item->GetGUID().GetCounter() != itemLowGUID || !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) // during getting result, gift was swapped with another item + if (item->GetGUID().GetCounter() != itemLowGUID || !item->IsWrapped()) // during getting result, gift was swapped with another item return; if (!result) diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 9d649ae85..77cba1d8e 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -102,7 +102,7 @@ void WorldSession::SendUpdateTrade(bool trader_data /*= true*/) data << uint32(item->GetTemplate()->DisplayInfoID);// display id data << uint32(item->GetCount()); // stack count // wrapped: hide stats but show giftcreator name - data << uint32(item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED) ? 1 : 0); + data << uint32(item->IsWrapped() ? 1 : 0); data << item->GetGuidValue(ITEM_FIELD_GIFTCREATOR); // perm. enchantment and gems data << uint32(item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); @@ -154,7 +154,7 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[]) LOG_DEBUG("network", "partner storing: {}", myItems[i]->GetGUID().ToString()); // adjust time (depends on /played) - if (myItems[i]->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (myItems[i]->IsBOPTradable()) myItems[i]->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, trader->GetTotalPlayedTime() - (_player->GetTotalPlayedTime() - myItems[i]->GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME))); // store trader->MoveItemToInventory(traderDst, myItems[i], true, true); @@ -165,7 +165,7 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[]) LOG_DEBUG("network", "player storing: {}", hisItems[i]->GetGUID().ToString()); // adjust time (depends on /played) - if (hisItems[i]->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)) + if (hisItems[i]->IsBOPTradable()) hisItems[i]->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, _player->GetTotalPlayedTime() - (trader->GetTotalPlayedTime() - hisItems[i]->GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME))); // store _player->MoveItemToInventory(playerDst, hisItems[i], true, true); diff --git a/src/server/game/Loot/LootItemStorage.cpp b/src/server/game/Loot/LootItemStorage.cpp index 1c490f13a..712702346 100644 --- a/src/server/game/Loot/LootItemStorage.cpp +++ b/src/server/game/Loot/LootItemStorage.cpp @@ -214,7 +214,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player) // non-conditional one-player only items are counted here, // free for all items are counted in FillFFALoot(), // non-ffa conditionals are counted in FillNonQuestNonFFAConditionalLoot() - if ((!li.needs_quest && li.conditions.empty() && !(proto->Flags & ITEM_FLAG_MULTI_DROP)) || li.is_counted) + if ((!li.needs_quest && li.conditions.empty() && !proto->HasFlag(ITEM_FLAG_MULTI_DROP)) || li.is_counted) { ++loot->unlootedCount; } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index d85a49194..9b714e225 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -390,8 +390,8 @@ LootItem::LootItem(LootStoreItem const& li) conditions = li.conditions; ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemid); - freeforall = proto && (proto->Flags & ITEM_FLAG_MULTI_DROP); - follow_loot_rules = proto && (proto->FlagsCu & ITEM_FLAGS_CU_FOLLOW_LOOT_RULES); + freeforall = proto && proto->HasFlag(ITEM_FLAG_MULTI_DROP); + follow_loot_rules = proto && proto->HasFlagCu(ITEM_FLAGS_CU_FOLLOW_LOOT_RULES); needs_quest = li.needs_quest; @@ -429,7 +429,7 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const // Master Looter can see conditioned recipes if (isMasterLooter && itemVisibleForMasterLooter) { - if ((pProto->Flags & ITEM_FLAG_HIDE_UNUSABLE_RECIPE) || (pProto->Class == ITEM_CLASS_RECIPE && pProto->Bonding == BIND_WHEN_PICKED_UP && pProto->Spells[1].SpellId != 0)) + if (pProto->HasFlag(ITEM_FLAG_HIDE_UNUSABLE_RECIPE) || (pProto->Class == ITEM_CLASS_RECIPE && pProto->Bonding == BIND_WHEN_PICKED_UP && pProto->Spells[1].SpellId != 0)) { return true; } @@ -439,12 +439,12 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const } // not show loot for not own team - if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && player->GetTeamId(true) != TEAM_HORDE) + if (pProto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && player->GetTeamId(true) != TEAM_HORDE) { return false; } - if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && player->GetTeamId(true) != TEAM_ALLIANCE) + if (pProto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && player->GetTeamId(true) != TEAM_ALLIANCE) { return false; } @@ -456,7 +456,7 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const } // Don't allow loot for players without profession or those who already know the recipe - if ((pProto->Flags & ITEM_FLAG_HIDE_UNUSABLE_RECIPE) && (!player->HasSkill(pProto->RequiredSkill) || player->HasSpell(pProto->Spells[1].SpellId))) + if (pProto->HasFlag(ITEM_FLAG_HIDE_UNUSABLE_RECIPE) && (!player->HasSkill(pProto->RequiredSkill) || player->HasSpell(pProto->Spells[1].SpellId))) { return false; } @@ -468,7 +468,7 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const } // check quest requirements - if (!(pProto->FlagsCu & ITEM_FLAGS_CU_IGNORE_QUEST_STATUS)) + if (!pProto->HasFlagCu(ITEM_FLAGS_CU_IGNORE_QUEST_STATUS)) { // Don't drop quest items if the player is missing the relevant quest if (needs_quest && !player->HasQuestForItem(itemid)) @@ -555,7 +555,7 @@ void Loot::AddItem(LootStoreItem const& item) // non-conditional one-player only items are counted here, // free for all items are counted in FillFFALoot(), // non-ffa conditionals are counted in FillNonQuestNonFFAConditionalLoot() - if (!item.needs_quest && item.conditions.empty() && !(proto->Flags & ITEM_FLAG_MULTI_DROP)) + if (!item.needs_quest && item.conditions.empty() && !proto->HasFlag(ITEM_FLAG_MULTI_DROP)) ++unlootedCount; } } @@ -2099,7 +2099,7 @@ void LoadLootTemplates_Item() // remove real entries and check existence loot ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) - if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end() && itr->second.Flags & ITEM_FLAG_HAS_LOOT) + if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end() && itr->second.HasFlag(ITEM_FLAG_HAS_LOOT)) lootIdSet.erase(itr->second.ItemId); // output error for any still listed (not referenced from appropriate table) ids @@ -2126,7 +2126,7 @@ void LoadLootTemplates_Milling() ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) { - if (!(itr->second.Flags & ITEM_FLAG_IS_MILLABLE)) + if (!itr->second.HasFlag(ITEM_FLAG_IS_MILLABLE)) continue; if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end()) @@ -2193,7 +2193,7 @@ void LoadLootTemplates_Prospecting() ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) { - if (!(itr->second.Flags & ITEM_FLAG_IS_PROSPECTABLE)) + if (!itr->second.HasFlag(ITEM_FLAG_IS_PROSPECTABLE)) continue; if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end()) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 61fa99050..3c8ee5076 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5526,7 +5526,7 @@ void Spell::TakeReagents() ItemTemplate const* castItemTemplate = m_CastItem ? m_CastItem->GetTemplate() : nullptr; // do not take reagents for these item casts - if (castItemTemplate && castItemTemplate->Flags & ITEM_FLAG_NO_REAGENT_COST) + if (castItemTemplate && castItemTemplate->HasFlag(ITEM_FLAG_NO_REAGENT_COST)) return; Player* p_caster = m_caster->ToPlayer(); @@ -7273,7 +7273,7 @@ SpellCastResult Spell::CheckItems() } // do not take reagents for these item casts - if (!(m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_FLAG_NO_REAGENT_COST)) + if (!(m_CastItem && m_CastItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_REAGENT_COST))) { bool checkReagents = !HasTriggeredCastFlag(TRIGGERED_IGNORE_POWER_AND_REAGENT_COST) && !player->CanNoReagentCast(m_spellInfo); // Not own traded item (in trader trade slot) requires reagents even if triggered spell @@ -7427,7 +7427,7 @@ SpellCastResult Spell::CheckItems() if (m_targets.GetItemTarget()->GetOwner() != m_caster) return SPELL_FAILED_NOT_TRADEABLE; // do not allow to enchant vellum from scroll made by vellum-prevent exploit - if (m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_FLAG_NO_REAGENT_COST) + if (m_CastItem && m_CastItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_REAGENT_COST)) return SPELL_FAILED_TOTEM_CATEGORY; ItemPosCountVec dest; InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1); @@ -7561,7 +7561,7 @@ SpellCastResult Spell::CheckItems() if (!m_targets.GetItemTarget()) return SPELL_FAILED_CANT_BE_PROSPECTED; //ensure item is a prospectable ore - if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_FLAG_IS_PROSPECTABLE)) + if (!(m_targets.GetItemTarget()->GetTemplate()->HasFlag(ITEM_FLAG_IS_PROSPECTABLE))) return SPELL_FAILED_CANT_BE_PROSPECTED; //prevent prospecting in trade slot if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) @@ -7584,7 +7584,7 @@ SpellCastResult Spell::CheckItems() if (!m_targets.GetItemTarget()) return SPELL_FAILED_CANT_BE_MILLED; //ensure item is a millable herb - if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_FLAG_IS_MILLABLE)) + if (!(m_targets.GetItemTarget()->GetTemplate()->HasFlag(ITEM_FLAG_IS_MILLABLE))) return SPELL_FAILED_CANT_BE_MILLED; //prevent milling in trade slot if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 2a3d7b008..fc118371b 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2835,7 +2835,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) else { // do not increase skill if vellum used - if (!(m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_FLAG_NO_REAGENT_COST)) + if (!(m_CastItem && m_CastItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_REAGENT_COST))) p_caster->UpdateCraftSkill(m_spellInfo->Id); uint32 enchant_id = m_spellInfo->Effects[effIndex].MiscValue; @@ -5476,7 +5476,7 @@ void Spell::EffectProspecting(SpellEffIndex /*effIndex*/) return; Player* p_caster = m_caster->ToPlayer(); - if (!itemTarget || !(itemTarget->GetTemplate()->Flags & ITEM_FLAG_IS_PROSPECTABLE)) + if (!itemTarget || !itemTarget->GetTemplate()->HasFlag(ITEM_FLAG_IS_PROSPECTABLE)) return; if (itemTarget->GetCount() < 5) @@ -5501,7 +5501,7 @@ void Spell::EffectMilling(SpellEffIndex /*effIndex*/) return; Player* p_caster = m_caster->ToPlayer(); - if (!itemTarget || !(itemTarget->GetTemplate()->Flags & ITEM_FLAG_IS_MILLABLE)) + if (!itemTarget || !itemTarget->GetTemplate()->HasFlag(ITEM_FLAG_IS_MILLABLE)) return; if (itemTarget->GetCount() < 5) From 888aa00cfb51bbce968674a806a6beb02bdfd184 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sat, 31 Aug 2024 23:48:13 -0400 Subject: [PATCH 19/46] fix(Core/Guild): Require repair rights in order to make use of guild repairs. (#19836) * Init. * Ensure only repair requests are screened. * Adjust parentheses. --- src/server/game/Guilds/Guild.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index d42c1313d..648131080 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1705,6 +1705,9 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today return false; + if (!(_GetRankRights(member->GetRankId()) & GR_RIGHT_WITHDRAW_REPAIR) && repair) + return false; + // Call script after validation and before money transfer. sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair); From 5c3e4cae6da3cd2359e3cbbd09ba6a9f2e9c35b0 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 1 Sep 2024 20:54:41 -0300 Subject: [PATCH 20/46] fix(DB/Creature): Fix unit flags for Arcane Charge trigger npc (#19833) --- data/sql/updates/pending_db_world/rev_1725143233684093900.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1725143233684093900.sql diff --git a/data/sql/updates/pending_db_world/rev_1725143233684093900.sql b/data/sql/updates/pending_db_world/rev_1725143233684093900.sql new file mode 100644 index 000000000..c3335ac63 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1725143233684093900.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` = 23429; From dd32c74a7e2d6be4cbd7895aa84c445f1d9afc50 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 1 Sep 2024 23:55:33 +0000 Subject: [PATCH 21/46] chore(DB): import pending files Referenced commit(s): 5c3e4cae6da3cd2359e3cbbd09ba6a9f2e9c35b0 --- .../rev_1725143233684093900.sql => db_world/2024_09_01_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1725143233684093900.sql => db_world/2024_09_01_00.sql} (64%) diff --git a/data/sql/updates/pending_db_world/rev_1725143233684093900.sql b/data/sql/updates/db_world/2024_09_01_00.sql similarity index 64% rename from data/sql/updates/pending_db_world/rev_1725143233684093900.sql rename to data/sql/updates/db_world/2024_09_01_00.sql index c3335ac63..ad9aea5f6 100644 --- a/data/sql/updates/pending_db_world/rev_1725143233684093900.sql +++ b/data/sql/updates/db_world/2024_09_01_00.sql @@ -1,2 +1,3 @@ +-- DB update 2024_08_31_01 -> 2024_09_01_00 -- UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` = 23429; From 5d4c85143c04d63ec10fbf4842d3d5971a68f983 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Mon, 2 Sep 2024 01:56:05 +0200 Subject: [PATCH 22/46] fix(Core/GameObject): Allow use of Mage portal if caster is offline and still in group (#19797) search group of user for ownerGUID --- .../game/Entities/GameObject/GameObject.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 3259ec0e1..ab1637bc9 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1885,13 +1885,21 @@ void GameObject::Use(Unit* user) if (info->spellcaster.partyOnly) { - Player const* caster = ObjectAccessor::FindConnectedPlayer(GetOwnerGUID()); - if (!caster || user->GetTypeId() != TYPEID_PLAYER || !user->ToPlayer()->IsInSameRaidWith(caster)) + if (!user->IsPlayer()) return; - } - user->RemoveAurasByType(SPELL_AURA_MOUNTED); - spellId = info->spellcaster.spellId; + if (Group* group = user->ToPlayer()->GetGroup()) + { + if (ObjectGuid ownerGuid = GetOwnerGUID()) + { + if (group->IsMember(ownerGuid)) + { + user->RemoveAurasByType(SPELL_AURA_MOUNTED); + spellId = info->spellcaster.spellId; + } + } + } + } break; } From 62b825f8bd5724e714fe688b62336ee6feff87d0 Mon Sep 17 00:00:00 2001 From: Saqra1 <161769195+Saqra1@users.noreply.github.com> Date: Sun, 1 Sep 2024 18:57:17 -0500 Subject: [PATCH 23/46] fix(Core/Movement): Don't move for change in orientation only (#19687) Changing only the orientation of a unit also flags it as if it were moving, which causes spells to be interrupted. --- src/server/game/Movement/Spline/MoveSplineInit.cpp | 4 +++- src/server/game/Spells/SpellEffects.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index faf6cd203..c2f6664b6 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -101,7 +101,9 @@ namespace Movement moveFlags = (moveFlags & ~(MOVEMENTFLAG_FORWARD)) | MOVEMENTFLAG_BACKWARD; } - if (moveFlags & MOVEMENTFLAG_ROOT) + bool isOrientationOnly = args.path.size() == 2 && args.path[0] == args.path[1]; + + if ((moveFlags & MOVEMENTFLAG_ROOT) || isOrientationOnly) moveFlags &= ~MOVEMENTFLAG_MASK_MOVING; if (!args.HasVelocity) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index fc118371b..293557bd2 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2677,7 +2677,7 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/) if (unitTarget->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING)) return; - unitTarget->SetFacingTo(unitTarget->GetAngle(destTarget)); /// @BUG Causes the player to stop moving + interrupts spellcast. + unitTarget->SetFacingTo(unitTarget->GetAngle(destTarget)); /// @BUG Causes the player to stop moving. unitTarget->GetMotionMaster()->MoveDistract(damage * IN_MILLISECONDS); } From e1abc72a259f911a1c0acee37032340d62a6dc2b Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Mon, 2 Sep 2024 01:58:03 +0200 Subject: [PATCH 24/46] fix(Core/Spell): warrior stances proccing darkmoon card vengeance damage (#19796) add spellinfocorrection --- src/server/game/Spells/SpellInfoCorrections.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 46f31c6f4..0e3c9833a 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4812,6 +4812,16 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx3 |= SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD; }); + // Warrior stances passives + ApplySpellFix({ + 2457, // Battle Stance + 2458, // Berserker Stance + 7376 // Defensive Stance Passive + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_SUPRESS_CASTER_PROCS; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From 485e998afcf7dcba852eafeaba1543cb2127fb3e Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sun, 1 Sep 2024 21:55:05 -0400 Subject: [PATCH 25/46] fix(DB/Creature): Adjust Shadowy Construct run speed. (#19847) Init. --- data/sql/updates/pending_db_world/shadowy-construct-speed.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/sql/updates/pending_db_world/shadowy-construct-speed.sql diff --git a/data/sql/updates/pending_db_world/shadowy-construct-speed.sql b/data/sql/updates/pending_db_world/shadowy-construct-speed.sql new file mode 100644 index 000000000..30124b085 --- /dev/null +++ b/data/sql/updates/pending_db_world/shadowy-construct-speed.sql @@ -0,0 +1 @@ +UPDATE `creature_template` SET `speed_run` = 0.785714 WHERE `entry` = 23111; From 981f35d173d62de898e34691082b69ec1b7bc9fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 2 Sep 2024 01:55:59 +0000 Subject: [PATCH 26/46] chore(DB): import pending files Referenced commit(s): 485e998afcf7dcba852eafeaba1543cb2127fb3e --- .../shadowy-construct-speed.sql => db_world/2024_09_02_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/shadowy-construct-speed.sql => db_world/2024_09_02_00.sql} (63%) diff --git a/data/sql/updates/pending_db_world/shadowy-construct-speed.sql b/data/sql/updates/db_world/2024_09_02_00.sql similarity index 63% rename from data/sql/updates/pending_db_world/shadowy-construct-speed.sql rename to data/sql/updates/db_world/2024_09_02_00.sql index 30124b085..3b2716bc1 100644 --- a/data/sql/updates/pending_db_world/shadowy-construct-speed.sql +++ b/data/sql/updates/db_world/2024_09_02_00.sql @@ -1 +1,2 @@ +-- DB update 2024_09_01_00 -> 2024_09_02_00 UPDATE `creature_template` SET `speed_run` = 0.785714 WHERE `entry` = 23111; From cdd816a1c6469b125998cfe55e3529e9f85a15b2 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sun, 1 Sep 2024 22:21:40 -0400 Subject: [PATCH 27/46] fix(DB/Spell): Don't allow Molten Flame damage to stack from multiple spawns. (#19848) Init. --- data/sql/updates/pending_db_world/molten-flame-stack.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/molten-flame-stack.sql diff --git a/data/sql/updates/pending_db_world/molten-flame-stack.sql b/data/sql/updates/pending_db_world/molten-flame-stack.sql new file mode 100644 index 000000000..242057f23 --- /dev/null +++ b/data/sql/updates/pending_db_world/molten-flame-stack.sql @@ -0,0 +1,2 @@ +DELETE FROM `spell_custom_attr` WHERE `spell_id` = 40253; +INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES (40253, 536870912); From e295dfdea75991919279cf82ce0fff130c3e8985 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 2 Sep 2024 02:22:34 +0000 Subject: [PATCH 28/46] chore(DB): import pending files Referenced commit(s): cdd816a1c6469b125998cfe55e3529e9f85a15b2 --- .../molten-flame-stack.sql => db_world/2024_09_02_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/molten-flame-stack.sql => db_world/2024_09_02_01.sql} (76%) diff --git a/data/sql/updates/pending_db_world/molten-flame-stack.sql b/data/sql/updates/db_world/2024_09_02_01.sql similarity index 76% rename from data/sql/updates/pending_db_world/molten-flame-stack.sql rename to data/sql/updates/db_world/2024_09_02_01.sql index 242057f23..c36605f69 100644 --- a/data/sql/updates/pending_db_world/molten-flame-stack.sql +++ b/data/sql/updates/db_world/2024_09_02_01.sql @@ -1,2 +1,3 @@ +-- DB update 2024_09_02_00 -> 2024_09_02_01 DELETE FROM `spell_custom_attr` WHERE `spell_id` = 40253; INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES (40253, 536870912); From 2f00db341800d036e13d3d851320e4184ca402e0 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Mon, 2 Sep 2024 04:34:30 -0400 Subject: [PATCH 29/46] fix(Scripts/BlackTemple): Adjust order of damage calculations for Shared Rule. (#19849) Init. --- .../scripts/Outland/BlackTemple/boss_illidari_council.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index e6567e0ab..14f159da2 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -254,13 +254,13 @@ struct boss_illidari_council_memberAI : public ScriptedAI { InstanceScript* instance = me->GetInstanceScript(); - if (me->GetHealth() <= damage) - damage = me->GetHealth() - 1; - int32 damageTaken = damage; Creature* target = instance->GetCreature(DATA_ILLIDARI_COUNCIL); me->CastCustomSpell(target->ToUnit(), SPELL_SHARED_RULE_DMG, &damageTaken, &damageTaken, &damageTaken, true, nullptr, nullptr, me->GetGUID()); + + if (me->GetHealth() <= damage) + damage = me->GetHealth() - 1; } void KilledUnit(Unit*) override From 0504c7f9de62eb21632e1aa1888338636eafbbc5 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Mon, 2 Sep 2024 19:00:15 +0200 Subject: [PATCH 30/46] fix(Core/GameObject): fixup allow use of Mage portal if caster is offline and still in group (#19853) * fix portals * fixup! fix portals * fixup! fixup! fix portals --- .../game/Entities/GameObject/GameObject.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index ab1637bc9..4fd9a5cd3 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1887,20 +1887,21 @@ void GameObject::Use(Unit* user) { if (!user->IsPlayer()) return; - - if (Group* group = user->ToPlayer()->GetGroup()) + if (ObjectGuid ownerGuid = GetOwnerGUID()) { - if (ObjectGuid ownerGuid = GetOwnerGUID()) + if (user->GetGUID() != ownerGuid) { - if (group->IsMember(ownerGuid)) - { - user->RemoveAurasByType(SPELL_AURA_MOUNTED); - spellId = info->spellcaster.spellId; - } + Group* group = user->ToPlayer()->GetGroup(); + if (!group) + return; + if (!group->IsMember(ownerGuid)) + return; } } } + user->RemoveAurasByType(SPELL_AURA_MOUNTED); + spellId = info->spellcaster.spellId; break; } case GAMEOBJECT_TYPE_MEETINGSTONE: //23 From 0158fa3e9e8218da150fa132ae91f6a3c47e9bc5 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:22:01 -0400 Subject: [PATCH 31/46] fix(Core/Handlers): Don't allow data to be sent while not grouped. (#19852) Init. https: //github.com/TrinityCore/TrinityCore/commit/f57647287af1f47a1c4a503cde654d6ff8f4261c Co-authored-by: Shauren --- src/server/game/Handlers/GroupHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 96ef394c3..7f22c320c 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -956,7 +956,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) recvData >> Guid; Player* player = HashMapHolder::Find(Guid); - if (!player) + if (!player || !player->IsInSameRaidWith(_player)) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3 + 4 + 2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related From 0954e314a017e629e0578e9c5a48e421bcc2d76f Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:44:34 -0300 Subject: [PATCH 32/46] fix(Scripts/BlackTemple): Fix Zerevor not casting Dampen Magic OOC (#19768) * fix(Scripts/BlackTemple): Fix Zerevor not casting Dampen Magic OOC * Update boss_illidari_council.cpp * recast every 1min * implement the recast checks * Update CreatureAI.h * Update boss_illidari_council.cpp * Update boss_illidari_council.cpp * fix ooc cast * Update boss_illidari_council.cpp * always respect the 60s lock * Update boss_illidari_council.cpp * Update boss_illidari_council.cpp --- src/server/game/AI/CreatureAI.h | 3 + src/server/game/Entities/Unit/Unit.cpp | 3 + .../BlackTemple/boss_illidari_council.cpp | 136 +++++++++++------- 3 files changed, 92 insertions(+), 50 deletions(-) diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 94478d15e..a354b603b 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -220,6 +220,9 @@ public: virtual bool OnTeleportUnreacheablePlayer(Player* /*player*/) { return false; } + // Called when an aura is removed or expires. + virtual void OnAuraRemove(AuraApplication* /*aurApp*/, AuraRemoveMode /*mode*/) { } + protected: virtual void MoveInLineOfSight(Unit* /*who*/); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 25be63539..ec64f1bba 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4603,6 +4603,9 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator& i, AuraRemoveMode removeMo i = m_appliedAuras.begin(); sScriptMgr->OnAuraRemove(this, aurApp, removeMode); + + if (this->ToCreature() && this->ToCreature()->IsAIEnabled) + this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode); } void Unit::_UnapplyAura(AuraApplication* aurApp, AuraRemoveMode removeMode) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 14f159da2..807bc0d73 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -88,12 +88,6 @@ enum Misc EVENT_SPELL_JUDGEMENT = 5, EVENT_SPELL_CONSECRATION = 6, - EVENT_SPELL_FLAMESTRIKE = 10, - EVENT_SPELL_BLIZZARD = 11, - EVENT_SPELL_ARCANE_BOLT = 12, - EVENT_SPELL_DAMPEN_MAGIC = 13, - EVENT_SPELL_ARCANE_EXPLOSION = 14, - EVENT_SPELL_REFLECTIVE_SHIELD = 20, EVENT_SPELL_CIRCLE_OF_HEALING = 21, EVENT_SPELL_DIVINE_WRATH = 22, @@ -378,22 +372,67 @@ private: struct boss_high_nethermancer_zerevor : public boss_illidari_council_memberAI { - boss_high_nethermancer_zerevor(Creature* creature) : boss_illidari_council_memberAI(creature) { } + boss_high_nethermancer_zerevor(Creature* creature) : boss_illidari_council_memberAI(creature), _canCastDampenMagic(true) { } + + void Reset() override + { + scheduler.CancelAll(); + _canCastDampenMagic = true; + boss_illidari_council_memberAI::Reset(); + CastDampenMagicIfPossible(); + } void AttackStart(Unit* who) override { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); + AttackStartCaster(who, 20.0f); } void JustEngagedWith(Unit* who) override { boss_illidari_council_memberAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); + + ScheduleTimedEvent(25s, [&] + { + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + DoCastRandomTarget(SPELL_FLAMESTRIKE, 0, 100.0f); + }, 40s); + + ScheduleTimedEvent(15s, [&] + { + DoCastVictim(SPELL_ARCANE_BOLT); + }, 3s); + + ScheduleTimedEvent(5s, [&] + { + DoCastRandomTarget(SPELL_BLIZZARD, 0, 100.0f); + }, 40s); + + ScheduleTimedEvent(10s, [&] + { + if (SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) + DoCastAOE(SPELL_ARCANE_EXPLOSION); + }, 10s); + + if (Aura* aura = me->GetAura(SPELL_DAMPEN_MAGIC)) + { + if (aura->GetDuration() <= 4 * MINUTE * IN_MILLISECONDS) + CastDampenMagicIfPossible(); + } + } + + void OnAuraRemove(AuraApplication* auraApp, AuraRemoveMode mode) override + { + if (auraApp->GetBase()->GetId() == SPELL_DAMPEN_MAGIC) + if (mode == AURA_REMOVE_BY_ENEMY_SPELL || mode == AURA_REMOVE_BY_EXPIRE) + if (!CastDampenMagicIfPossible()) + { + scheduler.Schedule(1s, [this](TaskContext context) + { + if (!CastDampenMagicIfPossible()) + context.Repeat(); + }); + } } void UpdateAI(uint32 diff) override @@ -401,41 +440,44 @@ struct boss_high_nethermancer_zerevor : public boss_illidari_council_memberAI if (!UpdateVictim()) return; - events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); + } + + bool CastDampenMagicIfPossible() + { + if (_canCastDampenMagic) { - case EVENT_SPELL_DAMPEN_MAGIC: - me->CastSpell(me, SPELL_DAMPEN_MAGIC, false); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000); - break; - case EVENT_SPELL_ARCANE_BOLT: - me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000); - break; - case EVENT_SPELL_FLAMESTRIKE: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - me->CastSpell(target, SPELL_FLAMESTRIKE, false); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000); - break; - case EVENT_SPELL_BLIZZARD: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - me->CastSpell(target, SPELL_BLIZZARD, false); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000); - break; - case EVENT_SPELL_ARCANE_EXPLOSION: - if (SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) - me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); - break; + _canCastDampenMagic = false; + me->m_Events.AddEventAtOffset([this] { + _canCastDampenMagic = true; + }, 1min); + + if (me->IsInCombat()) + { + scheduler.Schedule(1s, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_DAMPEN_MAGIC); + }); + } + else + { + me->m_Events.AddEventAtOffset([this] { + DoCastSelf(SPELL_DAMPEN_MAGIC); + }, 1s); + } + + return true; } - DoMeleeAttackIfReady(); + return false; } + + private: + bool _canCastDampenMagic; }; struct boss_lady_malande : public boss_illidari_council_memberAI @@ -572,9 +614,7 @@ class spell_illidari_council_empyreal_balance : public SpellScript { PreventHitDefaultEffect(effIndex); if (GetHitUnit()) - { _targetCount++; - } } void HandleAfterCast() @@ -585,7 +625,7 @@ class spell_illidari_council_empyreal_balance : public SpellScript return; } - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + auto const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) { @@ -619,19 +659,15 @@ class spell_illidari_council_empyreal_equivalency : public SpellScript { PreventHitDefaultEffect(effIndex); if (GetHitUnit()) - { _targetCount++; - } } void HandleAfterCast() { if (_targetCount != 4) - { return; - } - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + auto const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) target->SetHealth(GetCaster()->GetHealth() / _targetCount); From fd2e2936f6477013df8e5326b7038a431f51d62f Mon Sep 17 00:00:00 2001 From: Carriola Date: Tue, 3 Sep 2024 02:20:00 +0200 Subject: [PATCH 33/46] =?UTF-8?q?fix(DB/Creature):=20Black=20Temple=20-=20?= =?UTF-8?q?Dragonmaw=20Wyrmcallers=20don't=20use=20Jab=20=E2=80=A6=20(#198?= =?UTF-8?q?55)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(DB/Creature): Black Temple - Dragonmaw Wyrmcallers don't use Jab ability --- data/sql/updates/pending_db_world/2024_09_02_00.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/2024_09_02_00.sql diff --git a/data/sql/updates/pending_db_world/2024_09_02_00.sql b/data/sql/updates/pending_db_world/2024_09_02_00.sql new file mode 100644 index 000000000..e1f03dbe2 --- /dev/null +++ b/data/sql/updates/pending_db_world/2024_09_02_00.sql @@ -0,0 +1,3 @@ +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 22960) AND (`source_type` = 0) AND (`id` IN (0)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(22960, 0, 0, 0, 0, 0, 40, 0, 0, 10000, 0, 10000, 0, 0, 11, 40895, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Wyrmcaller - In Combat - Cast \'Jab\''); From 4eb44a08b5e1577f38dc01afa114e07a6b6d2996 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Sep 2024 00:20:51 +0000 Subject: [PATCH 34/46] chore(DB): import pending files Referenced commit(s): fd2e2936f6477013df8e5326b7038a431f51d62f --- .../2024_09_02_00.sql => db_world/2024_09_03_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/2024_09_02_00.sql => db_world/2024_09_03_00.sql} (94%) diff --git a/data/sql/updates/pending_db_world/2024_09_02_00.sql b/data/sql/updates/db_world/2024_09_03_00.sql similarity index 94% rename from data/sql/updates/pending_db_world/2024_09_02_00.sql rename to data/sql/updates/db_world/2024_09_03_00.sql index e1f03dbe2..9c2a766a9 100644 --- a/data/sql/updates/pending_db_world/2024_09_02_00.sql +++ b/data/sql/updates/db_world/2024_09_03_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_09_02_01 -> 2024_09_03_00 DELETE FROM `smart_scripts` WHERE (`entryorguid` = 22960) AND (`source_type` = 0) AND (`id` IN (0)); INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES (22960, 0, 0, 0, 0, 0, 40, 0, 0, 10000, 0, 10000, 0, 0, 11, 40895, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonmaw Wyrmcaller - In Combat - Cast \'Jab\''); From 4189b4399a37a08975870fdbb27b7a4c2e1ac93e Mon Sep 17 00:00:00 2001 From: Carriola Date: Tue, 3 Sep 2024 02:21:09 +0200 Subject: [PATCH 35/46] fix(DB/Creature): Steamvault - Coilfang Oracle casts Frostshock twice (#19844) * fix(DB/Creature): Steamvault - Coilfang Oracle casts Frostshock twice * fix extended to heroic mode --- data/sql/updates/pending_db_world/2024_09_01_00.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/2024_09_01_00.sql diff --git a/data/sql/updates/pending_db_world/2024_09_01_00.sql b/data/sql/updates/pending_db_world/2024_09_01_00.sql new file mode 100644 index 000000000..17dfa8808 --- /dev/null +++ b/data/sql/updates/pending_db_world/2024_09_01_00.sql @@ -0,0 +1,6 @@ +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 17803; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17803) AND (`source_type` = 0) AND (`id` IN (0, 1)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17803, 0, 0, 0, 0, 0, 100, 2, 5000, 8000, 13000, 16000, 0, 0, 11, 22582, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Oracle - In Combat - Cast \'Frost Shock\' (Normal Dungeon)'), +(17803, 0, 1, 0, 0, 0, 100, 4, 5000, 8000, 13000, 16000, 0, 0, 11, 37865, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Oracle - In Combat - Cast \'Frost Shock\' (Heroic Dungeon)'); From f6fd978a7a871ff91ad67e60284c5195e227dcd5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Sep 2024 00:21:49 +0000 Subject: [PATCH 36/46] chore(DB): import pending files Referenced commit(s): 4eb44a08b5e1577f38dc01afa114e07a6b6d2996 --- .../2024_09_01_00.sql => db_world/2024_09_03_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/2024_09_01_00.sql => db_world/2024_09_03_01.sql} (96%) diff --git a/data/sql/updates/pending_db_world/2024_09_01_00.sql b/data/sql/updates/db_world/2024_09_03_01.sql similarity index 96% rename from data/sql/updates/pending_db_world/2024_09_01_00.sql rename to data/sql/updates/db_world/2024_09_03_01.sql index 17dfa8808..6302e6580 100644 --- a/data/sql/updates/pending_db_world/2024_09_01_00.sql +++ b/data/sql/updates/db_world/2024_09_03_01.sql @@ -1,3 +1,4 @@ +-- DB update 2024_09_03_00 -> 2024_09_03_01 UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 17803; DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17803) AND (`source_type` = 0) AND (`id` IN (0, 1)); From de2bcbdabf19cb05682b2087b42726ee2325fe8e Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:59:37 +0200 Subject: [PATCH 37/46] refactor(Core/Misc): Acore::StringFormat to fmt format (#19838) refactor(Core/Utilities): Acore::StringFormat to fmt format * closes https://github.com/azerothcore/azerothcore-wotlk/issues/10356 --- apps/Fmt/FormatReplace.py | 20 ++++++++--------- src/common/Banner.cpp | 2 +- src/common/Collision/Management/MMapMgr.cpp | 4 ++-- src/common/Configuration/Config.cpp | 8 +++---- src/common/Debugging/Errors.cpp | 16 +++++++------- src/common/Debugging/Errors.h | 6 ++--- src/common/Logging/AppenderConsole.cpp | 4 ++-- src/common/Logging/AppenderFile.cpp | 4 ++-- src/common/Logging/Log.h | 4 ++-- src/common/Utilities/StringFormat.h | 19 ++-------------- src/common/Utilities/Timer.cpp | 12 +++++----- .../database/Database/DatabaseWorkerPool.h | 6 ++--- .../database/Database/PreparedStatement.cpp | 2 +- src/server/database/Database/Transaction.h | 2 +- src/server/database/Updater/DBUpdater.cpp | 8 +++---- src/server/game/Battlegrounds/ArenaScore.h | 2 +- .../game/Battlegrounds/BattlegroundQueue.cpp | 2 +- src/server/game/Chat/Chat.h | 22 +++++++++---------- .../game/Chat/ChatCommands/ChatCommand.cpp | 12 +++++----- .../game/Chat/ChatCommands/ChatCommand.h | 2 +- .../game/Chat/ChatCommands/ChatCommandArgs.h | 6 ++--- .../Chat/ChatCommands/ChatCommandHelpers.h | 2 +- src/server/game/Tools/PlayerDump.cpp | 4 ++-- src/server/game/Warden/Warden.cpp | 8 +++---- src/server/game/Warden/WardenCheckMgr.cpp | 2 +- src/server/game/Warden/WardenPayloadMgr.cpp | 2 +- src/server/scripts/Commands/cs_character.cpp | 2 +- src/server/scripts/Commands/cs_debug.cpp | 8 +++---- src/server/scripts/Commands/cs_message.cpp | 2 +- src/server/scripts/Commands/cs_send.cpp | 2 +- src/server/scripts/Commands/cs_server.cpp | 4 ++-- src/server/scripts/Spells/spell_generic.cpp | 2 +- .../shared/DataStores/DBCDatabaseLoader.cpp | 2 +- src/server/shared/Packets/ByteBuffer.cpp | 2 +- src/server/shared/Secrets/SecretMgr.cpp | 4 ++-- src/tools/map_extractor/System.cpp | 6 ++--- 36 files changed, 100 insertions(+), 115 deletions(-) diff --git a/apps/Fmt/FormatReplace.py b/apps/Fmt/FormatReplace.py index a25a02ed5..a9d553f14 100644 --- a/apps/Fmt/FormatReplace.py +++ b/apps/Fmt/FormatReplace.py @@ -62,12 +62,12 @@ def isPAppend(line): else : return False -# def isStringFormat(line): -# substring = 'StringFormat' -# if substring in line: -# return True -# else : -# return False +def isStringFormat(line): + substring = 'StringFormat' + if substring in line: + return True + else : + return False def haveDelimeter(line): if ';' in line: @@ -96,8 +96,8 @@ def checkSoloLine(line): # return handleCleanup(line), False # elif isPSendSysMessage(line): # return handleCleanup(line), False - # elif isStringFormat(line): - # return handleCleanup(line), False + elif isStringFormat(line): + return handleCleanup(line), False else: return line, False @@ -122,8 +122,8 @@ def startMultiLine(line): elif isPAppend(line): line = line.replace("PAppend", "Append"); return handleCleanup(line), True - # elif isStringFormat(line): - # return handleCleanup(line), True + elif isStringFormat(line): + return handleCleanup(line), True else : return line, False diff --git a/src/common/Banner.cpp b/src/common/Banner.cpp index f77c9abee..65f5ab577 100644 --- a/src/common/Banner.cpp +++ b/src/common/Banner.cpp @@ -21,7 +21,7 @@ void Acore::Banner::Show(std::string_view applicationName, void(*log)(std::string_view text), void(*logExtraInfo)()) { - log(Acore::StringFormatFmt("{} ({})", GitRevision::GetFullVersion(), applicationName)); + log(Acore::StringFormat("{} ({})", GitRevision::GetFullVersion(), applicationName)); log(" to stop.\n"); log(" █████╗ ███████╗███████╗██████╗ ██████╗ ████████╗██╗ ██╗"); log(" ██╔══██╗╚══███╔╝██╔════╝██╔══██╗██╔═══██╗╚══██╔══╝██║ ██║"); diff --git a/src/common/Collision/Management/MMapMgr.cpp b/src/common/Collision/Management/MMapMgr.cpp index bb6791057..480a2db2d 100644 --- a/src/common/Collision/Management/MMapMgr.cpp +++ b/src/common/Collision/Management/MMapMgr.cpp @@ -85,7 +85,7 @@ namespace MMAP } // load and init dtNavMesh - read parameters from file - std::string fileName = Acore::StringFormat(MAP_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", ".").c_str(), mapId); + std::string fileName = Acore::StringFormat(MAP_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", "."), mapId); FILE* file = fopen(fileName.c_str(), "rb"); if (!file) @@ -146,7 +146,7 @@ namespace MMAP } // load this tile :: mmaps/MMMXXYY.mmtile - std::string fileName = Acore::StringFormat(TILE_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", ".").c_str(), mapId, x, y); + std::string fileName = Acore::StringFormat(TILE_FILE_NAME_FORMAT, sConfigMgr->GetOption("DataDir", "."), mapId, x, y); FILE* file = fopen(fileName.c_str(), "rb"); if (!file) { diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index 2261c14b1..5f653fa96 100644 --- a/src/common/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp @@ -65,7 +65,7 @@ namespace template inline void PrintError(std::string_view filename, Format&& fmt, Args&& ... args) { - std::string message = Acore::StringFormatFmt(std::forward(fmt), std::forward(args)...); + std::string message = Acore::StringFormat(std::forward(fmt), std::forward(args)...); if (IsAppConfig(filename)) { @@ -117,7 +117,7 @@ namespace return false; } - throw ConfigException(Acore::StringFormatFmt("Config::LoadFile: Failed open {}file '{}'", isOptional ? "optional " : "", file)); + throw ConfigException(Acore::StringFormat("Config::LoadFile: Failed open {}file '{}'", isOptional ? "optional " : "", file)); } uint32 count = 0; @@ -144,7 +144,7 @@ namespace // read line error if (!in.good() && !in.eof()) - throw ConfigException(Acore::StringFormatFmt("> Config::LoadFile: Failure to read line number {} in file '{}'", lineNumber, file)); + throw ConfigException(Acore::StringFormat("> Config::LoadFile: Failure to read line number {} in file '{}'", lineNumber, file)); // remove whitespace in line line = Acore::String::Trim(line, in.getloc()); @@ -187,7 +187,7 @@ namespace return false; } - throw ConfigException(Acore::StringFormatFmt("Config::LoadFile: Empty file '{}'", file)); + throw ConfigException(Acore::StringFormat("Config::LoadFile: Empty file '{}'", file)); } // Add correct keys if file load without errors diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp index 9ca5f8c29..b42b34a18 100644 --- a/src/common/Debugging/Errors.cpp +++ b/src/common/Debugging/Errors.cpp @@ -62,19 +62,19 @@ namespace inline std::string MakeMessage(std::string_view messageType, std::string_view file, uint32 line, std::string_view function, std::string_view message, std::string_view fmtMessage = {}, std::string_view debugInfo = {}) { - std::string msg = Acore::StringFormatFmt("\n>> {}\n\n# Location: {}:{}\n# Function: {}\n# Condition: {}\n", messageType, file, line, function, message); + std::string msg = Acore::StringFormat("\n>> {}\n\n# Location: {}:{}\n# Function: {}\n# Condition: {}\n", messageType, file, line, function, message); if (!fmtMessage.empty()) { - msg.append(Acore::StringFormatFmt("# Message: {}\n", fmtMessage)); + msg.append(Acore::StringFormat("# Message: {}\n", fmtMessage)); } if (!debugInfo.empty()) { - msg.append(Acore::StringFormatFmt("\n# Debug info: {}\n", debugInfo)); + msg.append(Acore::StringFormat("\n# Debug info: {}\n", debugInfo)); } - return Acore::StringFormatFmt( + return Acore::StringFormat( "#{0:-^{2}}#\n" " {1: ^{2}} \n" "#{0:-^{2}}#\n", "", msg, 70); @@ -90,14 +90,14 @@ namespace */ inline std::string MakeAbortMessage(std::string_view file, uint32 line, std::string_view function, std::string_view fmtMessage = {}) { - std::string msg = Acore::StringFormatFmt("\n>> ABORTED\n\n# Location '{}:{}'\n# Function '{}'\n", file, line, function); + std::string msg = Acore::StringFormat("\n>> ABORTED\n\n# Location '{}:{}'\n# Function '{}'\n", file, line, function); if (!fmtMessage.empty()) { - msg.append(Acore::StringFormatFmt("# Message '{}'\n", fmtMessage)); + msg.append(Acore::StringFormat("# Message '{}'\n", fmtMessage)); } - return Acore::StringFormatFmt( + return Acore::StringFormat( "\n#{0:-^{2}}#\n" " {1: ^{2}} \n" "#{0:-^{2}}#\n", "", msg, 70); @@ -148,7 +148,7 @@ void Acore::Abort(std::string_view file, uint32 line, std::string_view function, void Acore::AbortHandler(int sigval) { // nothing useful to log here, no way to pass args - std::string formattedMessage = StringFormatFmt("Caught signal {}\n", sigval); + std::string formattedMessage = StringFormat("Caught signal {}\n", sigval); fmt::print(stderr, "{}", formattedMessage); fflush(stderr); Crash(formattedMessage.c_str()); diff --git a/src/common/Debugging/Errors.h b/src/common/Debugging/Errors.h index 0155d0ddb..24a36f1e8 100644 --- a/src/common/Debugging/Errors.h +++ b/src/common/Debugging/Errors.h @@ -31,19 +31,19 @@ namespace Acore template AC_COMMON_API inline void Assert(std::string_view file, uint32 line, std::string_view function, std::string_view debugInfo, std::string_view message, std::string_view fmt, Args&&... args) { - Assert(file, line, function, debugInfo, message, StringFormatFmt(fmt, std::forward(args)...)); + Assert(file, line, function, debugInfo, message, StringFormat(fmt, std::forward(args)...)); } template AC_COMMON_API inline void Fatal(std::string_view file, uint32 line, std::string_view function, std::string_view message, std::string_view fmt, Args&&... args) { - Fatal(file, line, function, message, StringFormatFmt(fmt, std::forward(args)...)); + Fatal(file, line, function, message, StringFormat(fmt, std::forward(args)...)); } template AC_COMMON_API inline void Abort(std::string_view file, uint32 line, std::string_view function, std::string_view fmt, Args&&... args) { - Abort(file, line, function, StringFormatFmt(fmt, std::forward(args)...)); + Abort(file, line, function, StringFormat(fmt, std::forward(args)...)); } AC_COMMON_API void Warning(std::string_view file, uint32 line, std::string_view function, std::string_view message); diff --git a/src/common/Logging/AppenderConsole.cpp b/src/common/Logging/AppenderConsole.cpp index e7c63eadb..db5a47336 100644 --- a/src/common/Logging/AppenderConsole.cpp +++ b/src/common/Logging/AppenderConsole.cpp @@ -52,7 +52,7 @@ void AppenderConsole::InitColors(std::string const& name, std::string_view str) std::vector colorStrs = Acore::Tokenize(str, ' ', false); if (colorStrs.size() != NUM_ENABLED_LOG_LEVELS) { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Invalid color data '{}' for console appender {} (expected {} entries, got {})", + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Invalid color data '{}' for console appender {} (expected {} entries, got {})", str, name, NUM_ENABLED_LOG_LEVELS, colorStrs.size())); } @@ -64,7 +64,7 @@ void AppenderConsole::InitColors(std::string const& name, std::string_view str) } else { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Invalid color '{}' for log level {} on console appender {}", + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Invalid color '{}' for log level {} on console appender {}", colorStrs[i], EnumUtils::ToTitle(static_cast(i)), name)); } } diff --git a/src/common/Logging/AppenderFile.cpp b/src/common/Logging/AppenderFile.cpp index 81b84cb98..9b4aa53ca 100644 --- a/src/common/Logging/AppenderFile.cpp +++ b/src/common/Logging/AppenderFile.cpp @@ -31,7 +31,7 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, Ap { if (args.size() < 4) { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Missing file name for appender {}", name)); + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Missing file name for appender {}", name)); } _fileName.assign(args[3]); @@ -63,7 +63,7 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, Ap } else { - throw InvalidAppenderArgsException(Acore::StringFormatFmt("Log::CreateAppenderFromConfig: Invalid size '{}' for appender {}", args[5], name)); + throw InvalidAppenderArgsException(Acore::StringFormat("Log::CreateAppenderFromConfig: Invalid size '{}' for appender {}", args[5], name)); } } diff --git a/src/common/Logging/Log.h b/src/common/Logging/Log.h index f60bb0367..e4b6d6142 100644 --- a/src/common/Logging/Log.h +++ b/src/common/Logging/Log.h @@ -69,7 +69,7 @@ public: template inline void outMessage(std::string const& filter, LogLevel const level, Acore::FormatString fmt, Args&&... args) { - _outMessage(filter, level, Acore::StringFormatFmt(fmt, std::forward(args)...)); + _outMessage(filter, level, Acore::StringFormat(fmt, std::forward(args)...)); } template @@ -80,7 +80,7 @@ public: return; } - _outCommand(Acore::StringFormatFmt(fmt, std::forward(args)...), std::to_string(account)); + _outCommand(Acore::StringFormat(fmt, std::forward(args)...), std::to_string(account)); } void SetRealmId(uint32 id); diff --git a/src/common/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h index fa5aeb461..d4d93f232 100644 --- a/src/common/Utilities/StringFormat.h +++ b/src/common/Utilities/StringFormat.h @@ -26,27 +26,12 @@ namespace Acore { - /// Default AC string format function. - template - inline std::string StringFormat(Format&& fmt, Args&& ... args) - { - try - { - return fmt::sprintf(std::forward(fmt), std::forward(args)...); - } - catch (const fmt::format_error& formatError) - { - std::string error = "An error occurred formatting string \"" + std::string(fmt) + "\" : " + std::string(formatError.what()); - return error; - } - } - template using FormatString = fmt::format_string; - // Default string format function. + /// Default AC string format function. template - inline std::string StringFormatFmt(FormatString fmt, Args&&... args) + inline std::string StringFormat(FormatString fmt, Args&&... args) { try { diff --git a/src/common/Utilities/Timer.cpp b/src/common/Utilities/Timer.cpp index e7cb691a1..54913163f 100644 --- a/src/common/Utilities/Timer.cpp +++ b/src/common/Utilities/Timer.cpp @@ -86,27 +86,27 @@ AC_COMMON_API std::string Acore::Time::ToTimeString(uint64 duratio { if (days) { - return Acore::StringFormatFmt("{}:{:02}:{:02}:{:02}:{:02}:{:02}", days, hours, minutes, secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}:{:02}:{:02}:{:02}", days, hours, minutes, secs, millisecs); } else if (hours) { - return Acore::StringFormatFmt("{}:{:02}:{:02}:{:02}:{:02}", hours, minutes, secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}:{:02}:{:02}", hours, minutes, secs, millisecs); } else if (minutes) { - return Acore::StringFormatFmt("{}:{:02}:{:02}:{:02}", minutes, secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}:{:02}", minutes, secs, millisecs); } else if (secs) { - return Acore::StringFormatFmt("{}:{:02}:{:02}", secs, millisecs); + return Acore::StringFormat("{}:{:02}:{:02}", secs, millisecs); } else if (millisecs) { - return Acore::StringFormatFmt("{}:{:02}", millisecs); + return Acore::StringFormat("{}:{:02}", millisecs); } else // microsecs { - return Acore::StringFormatFmt("{}", microsecs); + return Acore::StringFormat("{}", microsecs); } } diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index 181dd7f58..233fd5cf2 100644 --- a/src/server/database/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -103,7 +103,7 @@ public: if (sql.empty()) return; - Execute(Acore::StringFormatFmt(sql, std::forward(args)...)); + Execute(Acore::StringFormat(sql, std::forward(args)...)); } //! Enqueues a one-way SQL operation in prepared statement format that will be executed asynchronously. @@ -126,7 +126,7 @@ public: if (sql.empty()) return; - DirectExecute(Acore::StringFormatFmt(sql, std::forward(args)...)); + DirectExecute(Acore::StringFormat(sql, std::forward(args)...)); } //! Directly executes a one-way SQL operation in prepared statement format, that will block the calling thread until finished. @@ -149,7 +149,7 @@ public: if (sql.empty()) return QueryResult(nullptr); - return Query(Acore::StringFormatFmt(sql, std::forward(args)...)); + return Query(Acore::StringFormat(sql, std::forward(args)...)); } //! Directly executes an SQL query in prepared format that will block the calling thread until finished. diff --git a/src/server/database/Database/PreparedStatement.cpp b/src/server/database/Database/PreparedStatement.cpp index 4059509dc..4b8f870ea 100644 --- a/src/server/database/Database/PreparedStatement.cpp +++ b/src/server/database/Database/PreparedStatement.cpp @@ -104,7 +104,7 @@ bool PreparedStatementTask::Execute() template std::string PreparedStatementData::ToString(T value) { - return Acore::StringFormatFmt("{}", value); + return Acore::StringFormat("{}", value); } template<> diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h index 5d82703ae..448925053 100644 --- a/src/server/database/Database/Transaction.h +++ b/src/server/database/Database/Transaction.h @@ -45,7 +45,7 @@ public: template void Append(std::string_view sql, Args&&... args) { - Append(Acore::StringFormatFmt(sql, std::forward(args)...)); + Append(Acore::StringFormat(sql, std::forward(args)...)); } [[nodiscard]] std::size_t GetSize() const { return m_queries.size(); } diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index ffbdc1827..7b3ead066 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -235,7 +235,7 @@ bool DBUpdater::Update(DatabaseWorkerPool& pool, std::string_view modulesL auto CheckUpdateTable = [&](std::string const& tableName) { - auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormatFmt("SHOW TABLES LIKE '{}'", tableName)); + auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormat("SHOW TABLES LIKE '{}'", tableName)); if (!checkTable) { LOG_WARN("sql.updates", "> Table '{}' not exist! Try add based table", tableName); @@ -279,7 +279,7 @@ bool DBUpdater::Update(DatabaseWorkerPool& pool, std::string_view modulesL return false; } - std::string const info = Acore::StringFormatFmt("Containing {} new and {} archived updates.", result.recent, result.archived); + std::string const info = Acore::StringFormat("Containing {} new and {} archived updates.", result.recent, result.archived); if (!result.updated) LOG_INFO("sql.updates", ">> {} database is up-to-date! {}", DBUpdater::GetTableName(), info); @@ -307,7 +307,7 @@ bool DBUpdater::Update(DatabaseWorkerPool& pool, std::vector auto CheckUpdateTable = [&](std::string const& tableName) { - auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormatFmt("SHOW TABLES LIKE '{}'", tableName)); + auto checkTable = DBUpdater::Retrieve(pool, Acore::StringFormat("SHOW TABLES LIKE '{}'", tableName)); if (!checkTable) { Path const temp(GetBaseFilesDirectory() + tableName + ".sql"); @@ -507,7 +507,7 @@ void DBUpdater::ApplyFile(DatabaseWorkerPool& pool, std::string const& hos // Execute sql file args.emplace_back("-e"); - args.emplace_back(Acore::StringFormat("BEGIN; SOURCE %s; COMMIT;", path.generic_string().c_str())); + args.emplace_back(Acore::StringFormat("BEGIN; SOURCE {}; COMMIT;", path.generic_string())); // Database if (!database.empty()) diff --git a/src/server/game/Battlegrounds/ArenaScore.h b/src/server/game/Battlegrounds/ArenaScore.h index d29c1487c..3363c60f6 100644 --- a/src/server/game/Battlegrounds/ArenaScore.h +++ b/src/server/game/Battlegrounds/ArenaScore.h @@ -35,7 +35,7 @@ protected: // For Logging purpose std::string ToString() const override { - return Acore::StringFormatFmt("Damage done: {}, Healing done: {}, Killing blows: {}", DamageDone, HealingDone, KillingBlows); + return Acore::StringFormat("Damage done: {}, Healing done: {}, Killing blows: {}", DamageDone, HealingDone, KillingBlows); } uint8 PvPTeamId; diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index cef257d0f..1d602967d 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -1107,7 +1107,7 @@ void BattlegroundQueue::SendJoinMessageArenaQueue(Player* leader, GroupQueueInfo BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); auto bgName = bg->GetName(); - auto arenatype = Acore::StringFormat("%uv%u", ginfo->ArenaType, ginfo->ArenaType); + auto arenatype = Acore::StringFormat("{}v{}", ginfo->ArenaType, ginfo->ArenaType); uint32 playersNeed = ArenaTeam::GetReqPlayersForType(ginfo->ArenaType); uint32 q_min_level = std::min(bracketEntry->minLevel, (uint32)80); uint32 q_max_level = std::min(bracketEntry->maxLevel, (uint32)80); diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 8ef21176e..8a31c3c76 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -56,13 +56,13 @@ public: void SendNotification(uint32 strId, Args&&... args) { if (HasSession()) - SendNotification(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + SendNotification(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...)); } template void SendNotification(char const* fmt, Args&&... args) { if (HasSession()) - SendNotification(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendNotification(Acore::StringFormat(fmt, std::forward(args)...)); } void SendGMText(std::string_view str); @@ -73,7 +73,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendGMText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + SendGMText(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...)); }); } template @@ -83,7 +83,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendGMText(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendGMText(Acore::StringFormat(fmt, std::forward(args)...)); }); } @@ -95,7 +95,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...)); + SendWorldText(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...)); }); } template @@ -105,7 +105,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldText(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendWorldText(Acore::StringFormat(fmt, std::forward(args)...)); }); } @@ -117,7 +117,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldTextOptional(Acore::StringFormatFmt(GetAcoreString(strId), std::forward(args)...), flag); + SendWorldTextOptional(Acore::StringFormat(GetAcoreString(strId), std::forward(args)...), flag); }); } template @@ -127,7 +127,7 @@ public: DoForAllValidSessions([&](Player* player) { m_session = player->GetSession(); - SendWorldTextOptional(Acore::StringFormatFmt(fmt, std::forward(args)...), flag); + SendWorldTextOptional(Acore::StringFormat(fmt, std::forward(args)...), flag); }); } @@ -142,7 +142,7 @@ public: void PSendSysMessage(char const* fmt, Args&&... args) { if (HasSession()) - SendSysMessage(Acore::StringFormatFmt(fmt, std::forward(args)...)); + SendSysMessage(Acore::StringFormat(fmt, std::forward(args)...)); } template @@ -155,7 +155,7 @@ public: template std::string PGetParseString(uint32 entry, Args&&... args) const { - return Acore::StringFormatFmt(GetAcoreString(entry), std::forward(args)...); + return Acore::StringFormat(GetAcoreString(entry), std::forward(args)...); } std::string const* GetModuleString(std::string module, uint32 id) const; @@ -170,7 +170,7 @@ public: template std::string PGetParseModuleString(std::string module, uint32 id, Args&&... args) const { - return Acore::StringFormatFmt(GetModuleString(module, id)->c_str(), std::forward(args)...); + return Acore::StringFormat(GetModuleString(module, id)->c_str(), std::forward(args)...); } void SendErrorMessage(uint32 entry); diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.cpp b/src/server/game/Chat/ChatCommands/ChatCommand.cpp index 916b83919..93bcd25f4 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommand.cpp @@ -175,7 +175,7 @@ static void LogCommandUsage(WorldSession const& session, std::string_view cmdStr zoneName = zone->area_name[locale]; } - std::string logMessage = Acore::StringFormatFmt("Command: {} [Player: {} ({}) (Account: {}) X: {} Y: {} Z: {} Map: {} ({}) Area: {} ({}) Zone: {} ({}) Selected: {} ({})]", + std::string logMessage = Acore::StringFormat("Command: {} [Player: {} ({}) (Account: {}) X: {} Y: {} Z: {} Map: {} ({}) Area: {} ({}) Zone: {} ({}) Selected: {} ({})]", cmdStr, player->GetName(), player->GetGUID().ToString(), session.GetAccountId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), @@ -443,11 +443,11 @@ namespace Acore::Impl::ChatCommands { if (prefix.empty()) { - return Acore::StringFormatFmt("{}{}{}", match, COMMAND_DELIMITER, suffix); + return Acore::StringFormat("{}{}{}", match, COMMAND_DELIMITER, suffix); } else { - return Acore::StringFormatFmt("{}{}{}{}{}", prefix, COMMAND_DELIMITER, match, COMMAND_DELIMITER, suffix); + return Acore::StringFormat("{}{}{}{}{}", prefix, COMMAND_DELIMITER, match, COMMAND_DELIMITER, suffix); } }); @@ -465,7 +465,7 @@ namespace Acore::Impl::ChatCommands path.assign(it1->first); else { - path = Acore::StringFormatFmt("{}{}{}", path, COMMAND_DELIMITER, it1->first); + path = Acore::StringFormat("{}{}{}", path, COMMAND_DELIMITER, it1->first); } cmd = &it1->second; map = &cmd->_subCommands; @@ -477,7 +477,7 @@ namespace Acore::Impl::ChatCommands { /* there is some trailing text, leave it as is */ if (cmd) { /* if we matched a command at some point, auto-complete it */ - return { Acore::StringFormatFmt("{}{}{}", path, COMMAND_DELIMITER, oldTail) }; + return { Acore::StringFormat("{}{}{}", path, COMMAND_DELIMITER, oldTail) }; } else return {}; @@ -490,7 +490,7 @@ namespace Acore::Impl::ChatCommands return std::string(match); else { - return Acore::StringFormatFmt("{}{}{}", prefix, COMMAND_DELIMITER, match); + return Acore::StringFormat("{}{}{}", prefix, COMMAND_DELIMITER, match); } }); diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.h b/src/server/game/Chat/ChatCommands/ChatCommand.h index 079f40a50..ce1ead8b5 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.h +++ b/src/server/game/Chat/ChatCommands/ChatCommand.h @@ -91,7 +91,7 @@ namespace Acore::Impl::ChatCommands return result2; if (result1.HasErrorMessage() && result2.HasErrorMessage()) { - return Acore::StringFormatFmt("{} \"{}\"\n{} \"{}\"", + return Acore::StringFormat("{} \"{}\"\n{} \"{}\"", GetAcoreString(handler, LANG_CMDPARSER_EITHER), result2.GetErrorMessage(), GetAcoreString(handler, LANG_CMDPARSER_OR), result1.GetErrorMessage()); } diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h index 524cc608e..af1b0b3e8 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h @@ -273,9 +273,9 @@ namespace Acore::Impl::ChatCommands if (!nestedResult.HasErrorMessage()) return thisResult; if (StringStartsWith(nestedResult.GetErrorMessage(), "\"")) - return Acore::StringFormat("\"%s\"\n%s %s", thisResult.GetErrorMessage().c_str(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage().c_str()); + return Acore::StringFormat("\"{}\"\n{} {}", thisResult.GetErrorMessage(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage()); else - return Acore::StringFormat("\"%s\"\n%s \"%s\"", thisResult.GetErrorMessage().c_str(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage().c_str()); + return Acore::StringFormat("\"{}\"\n{} \"{}\"", thisResult.GetErrorMessage(), GetAcoreString(handler, LANG_CMDPARSER_OR), nestedResult.GetErrorMessage()); } } else @@ -286,7 +286,7 @@ namespace Acore::Impl::ChatCommands { ChatCommandResult result = TryAtIndex<0>(val, handler, args); if (result.HasErrorMessage() && (result.GetErrorMessage().find('\n') != std::string::npos)) - return Acore::StringFormat("%s %s", GetAcoreString(handler, LANG_CMDPARSER_EITHER), result.GetErrorMessage().c_str()); + return Acore::StringFormat("{} {}", GetAcoreString(handler, LANG_CMDPARSER_EITHER), result.GetErrorMessage()); return result; } }; diff --git a/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h b/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h index f5b4cf5af..e7e803a5e 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandHelpers.h @@ -125,7 +125,7 @@ namespace Acore::Impl::ChatCommands template std::string FormatAcoreString(ChatHandler const* handler, AcoreStrings which, Ts&&... args) { - return Acore::StringFormatFmt(GetAcoreString(handler, which), std::forward(args)...); + return Acore::StringFormat(GetAcoreString(handler, which), std::forward(args)...); } } diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 96f066a9e..95fbdd787 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -304,7 +304,7 @@ void PlayerDump::InitializeTables() // item0 - item18 for (uint32 j = 0; j < EQUIPMENT_SLOT_END; ++j) { - std::string itColumn = Acore::StringFormat("item%u", j); + std::string itColumn = Acore::StringFormat("item{}", j); MarkDependentColumn(t, itColumn, GUID_TYPE_ITEM); } break; @@ -923,7 +923,7 @@ DumpReturn PlayerDumpReader::LoadDump(std::istream& input, uint32 account, std:: if (name.empty()) { // generate a temporary name - std::string guidPart = Acore::StringFormat("%X", guid); + std::string guidPart = Acore::StringFormat("{:X}", guid); std::size_t maxCharsFromOriginalName = MAX_PLAYER_NAME - guidPart.length(); name = GetColumn(ts, line, "name").substr(0, maxCharsFromOriginalName) + guidPart; diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 298264e46..e32fcc1c9 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -246,14 +246,14 @@ void Warden::ApplyPenalty(uint16 checkId, std::string const& reason) if (Player const* plr = _session->GetPlayer()) { std::string const reportFormat = "Player {} (guid {}, account id: {}) failed warden {} check ({}). Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), + reportMsg = Acore::StringFormat(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), checkId, ((checkData && !checkData->Comment.empty()) ? checkData->Comment : ""), GetWardenActionStr(action)); } else { std::string const reportFormat = "Account id: {} failed warden {} check. Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, _session->GetAccountId(), checkId, GetWardenActionStr(action)); + reportMsg = Acore::StringFormat(reportFormat, _session->GetAccountId(), checkId, GetWardenActionStr(action)); } } else @@ -261,12 +261,12 @@ void Warden::ApplyPenalty(uint16 checkId, std::string const& reason) if (Player const* plr = _session->GetPlayer()) { std::string const reportFormat = "Player {} (guid {}, account id: {}) triggered warden penalty by reason: {}. Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); + reportMsg = Acore::StringFormat(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); } else { std::string const reportFormat = "Account id: {} failed warden {} check. Action: {}"; - reportMsg = Acore::StringFormatFmt(reportFormat, _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); + reportMsg = Acore::StringFormat(reportFormat, _session->GetAccountId(), causeMsg, GetWardenActionStr(action)); } } diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp index 301659781..0ac1c7e36 100644 --- a/src/server/game/Warden/WardenCheckMgr.cpp +++ b/src/server/game/Warden/WardenCheckMgr.cpp @@ -137,7 +137,7 @@ void WardenCheckMgr::LoadWardenChecks() continue; } - std::string str2 = Acore::StringFormat("%04u", id); + std::string str2 = Acore::StringFormat("{:04}", id); ASSERT(str2.size() == 4); std::copy(str2.begin(), str2.end(), wardenCheck.IdStr.begin()); diff --git a/src/server/game/Warden/WardenPayloadMgr.cpp b/src/server/game/Warden/WardenPayloadMgr.cpp index 4f88f1891..d6a06edc3 100644 --- a/src/server/game/Warden/WardenPayloadMgr.cpp +++ b/src/server/game/Warden/WardenPayloadMgr.cpp @@ -74,7 +74,7 @@ bool WardenPayloadMgr::RegisterPayload(std::string const& payload, uint16 payloa wCheck.Str = payload; wCheck.CheckId = payloadId; - std::string idStr = Acore::StringFormat("%04u", payloadId); + std::string idStr = Acore::StringFormat("{:04}", payloadId); ASSERT(idStr.size() == 4); std::copy(idStr.begin(), idStr.end(), wCheck.IdStr.begin()); diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 44d14e6e6..fc479a383 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -310,7 +310,7 @@ public: if (target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index) activeStr = handler->GetAcoreString(LANG_ACTIVE); - std::string titleName = Acore::StringFormat(name, player->GetName().c_str()); + std::string titleName = Acore::StringFormat(name, player->GetName()); // send title in "id (idx:idx) - [namedlink locale]" format if (handler->GetSession()) diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 3053564e6..852c79a3a 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -733,14 +733,14 @@ public: if (item->GetOwnerGUID() != player->GetGUID()) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): For the item {}, the owner ({}) and the player ({}) don't match!", index, item->GetGUID().ToString(), item->GetOwnerGUID().ToString(), player->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): For the item {}, the owner ({}) and the player ({}) don't match!", index, item->GetGUID().ToString(), item->GetOwnerGUID().ToString(), player->GetGUID().ToString())); error = true; continue; } if (item->GetQueuePos() != index) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): For the item {}, the queuepos doesn't match it's position in the queue!", index, item->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): For the item {}, the queuepos doesn't match it's position in the queue!", index, item->GetGUID().ToString())); error = true; continue; } @@ -752,14 +752,14 @@ public: if (!test) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): The bag({}) and slot({}) values for {} are incorrect, the player doesn't have any item at that position!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): The bag({}) and slot({}) values for {} are incorrect, the player doesn't have any item at that position!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString())); error = true; continue; } if (test != item) { - handler->SendSysMessage(Acore::StringFormatFmt("queue({}): The bag({}) and slot({}) values for the {} are incorrect, {} is there instead!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString())); + handler->SendSysMessage(Acore::StringFormat("queue({}): The bag({}) and slot({}) values for the {} are incorrect, {} is there instead!", index, item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString())); error = true; continue; } diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index dd42ce23d..717e94ef7 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -87,7 +87,7 @@ public: if (message.empty()) return false; - sWorld->SendServerMessage(SERVER_MSG_STRING, Acore::StringFormatFmt(handler->GetAcoreString(LANG_SYSTEMMESSAGE), message.data())); + sWorld->SendServerMessage(SERVER_MSG_STRING, Acore::StringFormat(handler->GetAcoreString(LANG_SYSTEMMESSAGE), message.data())); return true; } diff --git a/src/server/scripts/Commands/cs_send.cpp b/src/server/scripts/Commands/cs_send.cpp index 3645370ae..d09e9e292 100644 --- a/src/server/scripts/Commands/cs_send.cpp +++ b/src/server/scripts/Commands/cs_send.cpp @@ -79,7 +79,7 @@ public: itemCount = *Acore::StringTo(itemTokens.at(1)); break; default: - handler->SendSysMessage(Acore::StringFormatFmt("> Incorrect item list format for '{}'", itemString)); + handler->SendSysMessage(Acore::StringFormat("> Incorrect item list format for '{}'", itemString)); continue; } diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index dc9ee029f..39d2fd8a9 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -121,9 +121,9 @@ public: dbPort = (*res)[0].Get(); if (dbPort) - dbPortOutput = Acore::StringFormatFmt("Realmlist (Realm Id: {}) configured in port {}", realm.Id.Realm, dbPort); + dbPortOutput = Acore::StringFormat("Realmlist (Realm Id: {}) configured in port {}", realm.Id.Realm, dbPort); else - dbPortOutput = Acore::StringFormatFmt("Realm Id: {} not found in `realmlist` table. Please check your setup", realm.Id.Realm); + dbPortOutput = Acore::StringFormat("Realm Id: {} not found in `realmlist` table. Please check your setup", realm.Id.Realm); } HandleServerInfoCommand(handler); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 1e7eccb93..e77fa638f 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -144,7 +144,7 @@ class spell_the_flag_of_ownership : public SpellScript LocaleConstant loc_idx = caster->ToPlayer()->GetSession()->GetSessionDbLocaleIndex(); BroadcastText const* bct = sObjectMgr->GetBroadcastText(TEXT_FLAG_OF_OWNERSHIP); - std::string bctMsg = Acore::StringFormat(bct->GetText(loc_idx, caster->getGender()), caster->GetName().c_str(), target->GetName().c_str()); + std::string bctMsg = Acore::StringFormat(bct->GetText(loc_idx, caster->getGender()), caster->GetName(), target->GetName()); caster->Talk(bctMsg, CHAT_MSG_MONSTER_EMOTE, LANG_UNIVERSAL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target); haveTarget = true; diff --git a/src/server/shared/DataStores/DBCDatabaseLoader.cpp b/src/server/shared/DataStores/DBCDatabaseLoader.cpp index 37e2884d6..1985b01bb 100644 --- a/src/server/shared/DataStores/DBCDatabaseLoader.cpp +++ b/src/server/shared/DataStores/DBCDatabaseLoader.cpp @@ -36,7 +36,7 @@ DBCDatabaseLoader::DBCDatabaseLoader(char const* tableName, char const* dbcForma char* DBCDatabaseLoader::Load(uint32& records, char**& indexTable) { - std::string query = Acore::StringFormat("SELECT * FROM `%s` ORDER BY `ID` DESC", _sqlTableName); + std::string query = Acore::StringFormat("SELECT * FROM `{}` ORDER BY `ID` DESC", _sqlTableName); // no error if empty set QueryResult result = WorldDatabase.Query(query); diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp index dab792c77..b17b85dce 100644 --- a/src/server/shared/Packets/ByteBuffer.cpp +++ b/src/server/shared/Packets/ByteBuffer.cpp @@ -51,7 +51,7 @@ ByteBufferSourceException::ByteBufferSourceException(std::size_t pos, std::size_ ByteBufferInvalidValueException::ByteBufferInvalidValueException(char const* type, char const* value) { - message().assign(Acore::StringFormat("Invalid %s value (%s) found in ByteBuffer", type, value)); + message().assign(Acore::StringFormat("Invalid {} value ({}) found in ByteBuffer", type, value)); } ByteBuffer& ByteBuffer::operator>>(float& value) diff --git a/src/server/shared/Secrets/SecretMgr.cpp b/src/server/shared/Secrets/SecretMgr.cpp index cfc42e4ca..5f4d345b5 100644 --- a/src/server/shared/Secrets/SecretMgr.cpp +++ b/src/server/shared/Secrets/SecretMgr.cpp @@ -188,11 +188,11 @@ Optional SecretMgr::AttemptTransition(Secrets i, Optional(totpSecret, oldSecret->ToByteArray()); if (!success) - return Acore::StringFormat("Cannot decrypt old TOTP tokens - value of '%s' is incorrect for some users!", secret_info[i].oldKey); + return Acore::StringFormat("Cannot decrypt old TOTP tokens - value of '{}' is incorrect for some users!", secret_info[i].oldKey); } if (newSecret) diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 1d2d47a37..6f9806e34 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -990,7 +990,7 @@ void ExtractMapsFromMpq(uint32 build) { printf("Extract %s (%d/%u) \n", map_ids[z].name, z + 1, map_count); // Loadup map grid data - mpqMapName = Acore::StringFormat(R"(World\Maps\%s\%s.wdt)", map_ids[z].name, map_ids[z].name); + mpqMapName = Acore::StringFormat(R"(World\Maps\{}\{}.wdt)", map_ids[z].name, map_ids[z].name); WDT_file wdt; if (!wdt.loadFile(mpqMapName, false)) { @@ -1004,8 +1004,8 @@ void ExtractMapsFromMpq(uint32 build) { if (!wdt.main->adt_list[y][x].exist) continue; - mpqFileName = Acore::StringFormat(R"(World\Maps\%s\%s_%u_%u.adt)", map_ids[z].name, map_ids[z].name, x, y); - outputFileName = Acore::StringFormat("%s/maps/%03u%02u%02u.map", output_path, map_ids[z].id, y, x); + mpqFileName = Acore::StringFormat(R"(World\Maps\{}\{}_{}_{}.adt)", map_ids[z].name, map_ids[z].name, x, y); + outputFileName = Acore::StringFormat("{}/maps/{:03}{:02}{:02}.map", output_path, map_ids[z].id, y, x); ConvertADT(mpqFileName, outputFileName, y, x, build); } // draw progress bar From 9af86553c50c0c84bee35c5024a01d000277208c Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:01:00 +0200 Subject: [PATCH 38/46] chore(Core/Misc): update floor and ceil to std (#19837) --- src/server/game/Entities/Item/ItemEnchantmentMgr.cpp | 3 ++- src/server/game/Entities/Player/Player.cpp | 3 ++- src/server/game/Entities/Unit/Unit.cpp | 10 +++++----- src/server/game/Handlers/ItemHandler.cpp | 3 ++- src/server/game/Handlers/NPCHandler.cpp | 5 +++-- src/server/game/Spells/Spell.cpp | 9 +++++---- src/server/game/Time/UpdateTime.cpp | 7 ++++--- .../scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp | 2 +- src/server/scripts/Northrend/zone_wintergrasp.cpp | 3 ++- src/server/scripts/Spells/spell_generic.cpp | 3 ++- 10 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 6696e66b9..b7c0fccd2 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -21,6 +21,7 @@ #include "Log.h" #include "ObjectMgr.h" #include "Util.h" +#include #include #include @@ -105,7 +106,7 @@ uint32 GetItemEnchantMod(int32 entry) } //we could get here only if sum of all enchantment chances is lower than 100% - dRoll = (irand(0, (int)floor(fCount * 100) + 1)) / 100; + dRoll = (irand(0, (int)std::floor(fCount * 100) + 1)) / 100; fCount = 0; for (EnchStoreList::const_iterator ench_iter = tab->second.begin(); ench_iter != tab->second.end(); ++ench_iter) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bc044e5e3..c1c1e372e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -83,6 +83,7 @@ #include "World.h" #include "WorldPacket.h" #include "WorldSession.h" +#include /// @todo: this import is not necessary for compilation and marked as unused by the IDE // however, for some reasons removing it would cause a damn linking issue @@ -10804,7 +10805,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT // reputation discount - price = uint32(floor(price * GetReputationPriceDiscount(creature))); + price = uint32(std::floor(price * GetReputationPriceDiscount(creature))); if (!HasEnoughMoney(price)) { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ec64f1bba..9d2e77854 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -69,7 +69,7 @@ #include "Vehicle.h" #include "World.h" #include "WorldPacket.h" -#include +#include float baseMoveSpeed[MAX_MOVE_TYPE] = { @@ -2013,14 +2013,14 @@ uint32 Unit::CalcArmorReducedDamage(Unit const* attacker, Unit const* victim, co { if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL && (*j)->IsAffectedOnSpell(spellInfo)) - armor = floor(AddPct(armor, -(*j)->GetAmount())); + armor = std::floor(AddPct(armor, -(*j)->GetAmount())); } AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j) { if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) - armor = floor(AddPct(armor, -(*j)->GetAmount())); + armor = std::floor(AddPct(armor, -(*j)->GetAmount())); } // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc. @@ -10980,7 +10980,7 @@ Unit* Unit::GetMagicHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo) float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ()); if (dist < 5.0f) dist = 5.0f; - queueTime = magnet->m_Events.CalculateTime((uint64)floor(dist / spellInfo->Speed * 1000.0f)); + queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f)); } magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime); @@ -13397,7 +13397,7 @@ float Unit::GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const* spe if (Player* modOwner = GetSpellModOwner()) modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM); - return floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60)) + return std::floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60)) } void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 0623001e8..3873b82a3 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -28,6 +28,7 @@ #include "UpdateData.h" #include "WorldPacket.h" #include "WorldSession.h" +#include void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData) { @@ -1111,7 +1112,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) } // reputation discount - int32 price = item->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; + int32 price = item->IsGoldRequired(itemTemplate) ? uint32(std::floor(itemTemplate->BuyPrice * discountMod)) : 0; data << uint32(slot + 1); // client expects counting to start at 1 data << uint32(item->item); diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index b226b9ed0..5f68af663 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -32,6 +32,7 @@ #include "UpdateMask.h" #include "WorldPacket.h" #include "WorldSession.h" +#include enum StableResultCode { @@ -164,7 +165,7 @@ void WorldSession::SendTrainerList(ObjectGuid guid, const std::string& strTitle) data << uint32(tSpell->spell); // learned spell (or cast-spell in profession case) data << uint8(state == TRAINER_SPELL_GREEN_DISABLED ? TRAINER_SPELL_GREEN : state); - data << uint32(floor(tSpell->spellCost * fDiscountMod)); + data << uint32(std::floor(tSpell->spellCost * fDiscountMod)); data << uint32(primary_prof_first_rank && can_learn_primary_prof ? 1 : 0); // primary prof. learn confirmation dialog @@ -247,7 +248,7 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket& recvData) return; // apply reputation discount - uint32 nSpellCost = uint32(floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit))); + uint32 nSpellCost = uint32(std::floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit))); // check money requirement if (!_player->HasEnoughMoney(nSpellCost)) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 3c8ee5076..60d153f9d 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -55,6 +55,7 @@ #include "Vehicle.h" #include "World.h" #include "WorldPacket.h" +#include /// @todo: this import is not necessary for compilation and marked as unused by the IDE // however, for some reasons removing it would cause a damn linking issue @@ -900,7 +901,7 @@ uint64 Spell::CalculateDelayMomentForDst() const { float speed = m_targets.GetSpeedXY(); if (speed > 0.0f) - return (uint64)floor(m_targets.GetDist2d() / speed * 1000.0f); + return (uint64)std::floor(m_targets.GetDist2d() / speed * 1000.0f); } else if (m_spellInfo->Speed > 0.0f) { @@ -1441,7 +1442,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici bool inwater = false; bool wcol = false; const float step = 2.0f; - const uint8 numChecks = ceil(fabs(distance / step)); + const uint8 numChecks = std::ceil(std::fabs(distance / step)); const float DELTA_X = (destx - pos.GetPositionX()) / numChecks; const float DELTA_Y = (desty - pos.GetPositionY()) / numChecks; int j = 1; @@ -2462,7 +2463,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= if (dist < 5.0f) dist = 5.0f; - targetInfo.timeDelay = (uint64) floor(dist / m_spellInfo->Speed * 1000.0f); + targetInfo.timeDelay = (uint64) std::floor(dist / m_spellInfo->Speed * 1000.0f); // Calculate minimum incoming time if (m_delayMoment == 0 || m_delayMoment > targetInfo.timeDelay) @@ -2561,7 +2562,7 @@ void Spell::AddGOTarget(GameObject* go, uint32 effectMask) float dist = m_caster->GetDistance(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); if (dist < 5.0f) dist = 5.0f; - target.timeDelay = uint64(floor(dist / m_spellInfo->Speed * 1000.0f)); + target.timeDelay = uint64(std::floor(dist / m_spellInfo->Speed * 1000.0f)); if (m_delayMoment == 0 || m_delayMoment > target.timeDelay) m_delayMoment = target.timeDelay; } diff --git a/src/server/game/Time/UpdateTime.cpp b/src/server/game/Time/UpdateTime.cpp index 3c4886376..75244b19e 100644 --- a/src/server/game/Time/UpdateTime.cpp +++ b/src/server/game/Time/UpdateTime.cpp @@ -20,6 +20,7 @@ #include "Log.h" #include "Timer.h" #include +#include #include // create instance @@ -87,12 +88,12 @@ uint32 UpdateTime::GetPercentile(uint8 p) double index = (double(p) / 100.0) * (GetDatasetSize() - 1); // If the index is an integer, return the value at that index - if (index == floor(index)) + if (index == std::floor(index)) return _orderedUpdateTimeDataTable[index]; // Otherwise, perform linear interpolation - int lowerIndex = floor(index); - int upperIndex = ceil(index); + int lowerIndex = std::floor(index); + int upperIndex = std::ceil(index); double fraction = index - lowerIndex; return _orderedUpdateTimeDataTable[lowerIndex] * (1 - fraction) + _orderedUpdateTimeDataTable[upperIndex] * fraction; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index ffdb70f6f..dbe0f1263 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -234,7 +234,7 @@ public: me->SetInFront(me->GetVictim()); } /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; - SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ + SDisruptAOEVisual_Timer = 1000 + std::floor(dist / 30 * 1000.0f);*/ events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 18000)); break; } diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 3a4ea4d30..56aa104a6 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -34,6 +34,7 @@ #include "SpellScriptLoader.h" #include "Vehicle.h" #include "World.h" +#include enum eWGqueuenpctext { @@ -1089,7 +1090,7 @@ class spell_wg_reduce_damage_by_distance : public SpellScript float maxDistance = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); // Xinef: always stored in EFFECT_0 float distance = std::min(GetHitUnit()->GetDistance(*GetExplTargetDest()), maxDistance); - int32 damage = std::max(0, int32(GetHitDamage() - floor(GetHitDamage() * (distance / maxDistance)))); + int32 damage = std::max(0, int32(GetHitDamage() - std::floor(GetHitDamage() * (distance / maxDistance)))); SetHitDamage(damage); } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e77fa638f..3bca70883 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -35,6 +35,7 @@ #include "Unit.h" #include "Vehicle.h" #include +#include /* * Scripts for spells with SPELLFAMILY_GENERIC which cannot be included in AI script file * of creature using it or can't be bound to any player class. @@ -4255,7 +4256,7 @@ class spell_gen_gift_of_naaru : public AuraScript break; } - int32 healTick = floor(heal / aurEff->GetTotalTicks()); + int32 healTick = std::floor(heal / aurEff->GetTotalTicks()); amount += int32(std::max(healTick, 0)); } From c929b95172c88d5257077dbbdebb9ca8fabbad26 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 3 Sep 2024 13:02:28 +0200 Subject: [PATCH 39/46] fix(Conf): sync default values with core defaults (#19708) fix(Conf): sync values with core defaults --- src/server/apps/worldserver/Main.cpp | 4 +- .../apps/worldserver/worldserver.conf.dist | 38 +++++++++---------- src/server/database/Database/DatabaseLoader.h | 2 +- src/server/game/Globals/ObjectMgr.cpp | 2 +- src/server/game/Time/UpdateTime.cpp | 2 +- src/server/game/World/World.cpp | 16 ++++---- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/server/apps/worldserver/Main.cpp b/src/server/apps/worldserver/Main.cpp index 3adfb5965..0b485bffa 100644 --- a/src/server/apps/worldserver/Main.cpp +++ b/src/server/apps/worldserver/Main.cpp @@ -233,7 +233,7 @@ int main(int argc, char** argv) signals.async_wait(SignalHandler); // Start the Boost based thread pool - int numThreads = sConfigMgr->GetOption("ThreadPool", 1); + int numThreads = sConfigMgr->GetOption("ThreadPool", 2); std::shared_ptr> threadPool(new std::vector(), [ioContext](std::vector* del) { ioContext->stop(); @@ -257,7 +257,7 @@ int main(int argc, char** argv) } // Set process priority according to configuration settings - SetProcessPriority("server.worldserver", sConfigMgr->GetOption(CONFIG_PROCESSOR_AFFINITY, 0), sConfigMgr->GetOption(CONFIG_HIGH_PRIORITY, false)); + SetProcessPriority("server.worldserver", sConfigMgr->GetOption(CONFIG_PROCESSOR_AFFINITY, 0), sConfigMgr->GetOption(CONFIG_HIGH_PRIORITY, true)); // Loading modules configs before scripts sConfigMgr->LoadModulesConfigs(); diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 53038ffde..2b2f58f2e 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -139,13 +139,13 @@ CharacterDatabase.WorkerThreads = 1 # WorldDatabase.SynchThreads # CharacterDatabase.SynchThreads # Description: The amount of MySQL connections spawned to handle. -# Default: 1 - (LoginDatabase.WorkerThreads) -# 1 - (WorldDatabase.WorkerThreads) -# 2 - (CharacterDatabase.WorkerThreads) +# Default: 1 - (LoginDatabase.SynchThreads) +# 1 - (WorldDatabase.SynchThreads) +# 1 - (CharacterDatabase.SynchThreads) LoginDatabase.SynchThreads = 1 WorldDatabase.SynchThreads = 1 -CharacterDatabase.SynchThreads = 2 +CharacterDatabase.SynchThreads = 1 # # MaxPingTime @@ -1040,7 +1040,7 @@ MinWorldUpdateTime = 1 # Default: 10 - (10 minutes) # 1+ -UpdateUptimeInterval = 1 +UpdateUptimeInterval = 10 # # MaxCoreStuckTime @@ -1219,7 +1219,7 @@ Warden.ClientCheckFailAction = 0 # Default: 86400 - (24 hours) # 0 - (Permanent ban) -Warden.BanDuration = 259200 +Warden.BanDuration = 86400 # ################################################################################################### @@ -1277,17 +1277,17 @@ Visibility.GroupMode = 1 # Visibility.Distance.Instances # Visibility.Distance.BGArenas # Description: Visibility distance to see other players or gameobjects. -# Visibility on continents on retail ~90 yards. In BG/Arenas ~180. -# For instances default ~120. +# Visibility on continents on retail ~100 yards. In BG/Arenas ~533. +# For instances default ~170. # Max limited by active player zone: ~ 333 # Min limit is max aggro radius (45) * Rate.Creature.Aggro -# Default: 90 - (Visibility.Distance.Continents) -# 120 - (Visibility.Distance.Instances) -# 180 - (Visibility.Distance.BGArenas) +# Default: 100 - (Visibility.Distance.Continents) +# 170 - (Visibility.Distance.Instances) +# 533 - (Visibility.Distance.BGArenas) -Visibility.Distance.Continents = 90 -Visibility.Distance.Instances = 120 -Visibility.Distance.BGArenas = 180 +Visibility.Distance.Continents = 100 +Visibility.Distance.Instances = 170 +Visibility.Distance.BGArenas = 533 # # Visibility.ObjectSparkles @@ -2540,7 +2540,7 @@ Death.SicknessLevel = 11 # 0 - (Disabled) Death.CorpseReclaimDelay.PvP = 1 -Death.CorpseReclaimDelay.PvE = 0 +Death.CorpseReclaimDelay.PvE = 1 # # Death.Bones.World @@ -3415,7 +3415,7 @@ Wintergrasp.Enable = 1 # Description: Maximum number of players allowed in Wintergrasp. # Default: 100 -Wintergrasp.PlayerMax = 120 +Wintergrasp.PlayerMax = 100 # # Wintergrasp.PlayerMin @@ -3566,14 +3566,14 @@ Battleground.Random.ResetHour = 6 # Default: 0 - (Disabled) # 1 - (Enabled) -Battleground.StoreStatistics.Enable = 1 +Battleground.StoreStatistics.Enable = 0 # Battleground.TrackDeserters.Enable # Description: Track deserters of Battlegrounds. # Default: 0 - (Disabled) # 1 - (Enabled) -Battleground.TrackDeserters.Enable = 1 +Battleground.TrackDeserters.Enable = 0 # # Battleground.InvitationType @@ -4064,7 +4064,7 @@ PartyLevelReq = 1 # Default: 0 - (Disabled, Blizzlike, Channel settings are lost if last person left) # 1 - (Enabled) -PreserveCustomChannels = 1 +PreserveCustomChannels = 0 # # PreserveCustomChannelDuration diff --git a/src/server/database/Database/DatabaseLoader.h b/src/server/database/Database/DatabaseLoader.h index 44aaca199..233b0a5be 100644 --- a/src/server/database/Database/DatabaseLoader.h +++ b/src/server/database/Database/DatabaseLoader.h @@ -32,7 +32,7 @@ class DatabaseWorkerPool; class AC_DATABASE_API DatabaseLoader { public: - DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask = 0, std::string_view modulesList = {}); + DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask = 7, std::string_view modulesList = {}); // Register a database to the loader (lazy implemented) template diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index cfe00b79d..f2fca152a 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -948,7 +948,7 @@ void ObjectMgr::LoadCreatureTemplateAddons() void ObjectMgr::LoadCreatureCustomIDs() { // Hack for modules - std::string stringCreatureIds = sConfigMgr->GetOption("Creatures.CustomIDs", ""); + std::string stringCreatureIds = sConfigMgr->GetOption("Creatures.CustomIDs", "190010,55005,999991,25462,98888,601014,34567,34568"); std::vector CustomCreatures = Acore::Tokenize(stringCreatureIds, ',', false); for (auto& itr : CustomCreatures) diff --git a/src/server/game/Time/UpdateTime.cpp b/src/server/game/Time/UpdateTime.cpp index 75244b19e..3b584a615 100644 --- a/src/server/game/Time/UpdateTime.cpp +++ b/src/server/game/Time/UpdateTime.cpp @@ -151,7 +151,7 @@ void UpdateTime::SortUpdateTimeDataTable() void WorldUpdateTime::LoadFromConfig() { - _recordUpdateTimeInverval = Milliseconds(sConfigMgr->GetOption("RecordUpdateTimeDiffInterval", 60000)); + _recordUpdateTimeInverval = Milliseconds(sConfigMgr->GetOption("RecordUpdateTimeDiffInterval", 300000)); _recordUpdateTimeMin = Milliseconds(sConfigMgr->GetOption("MinRecordUpdateTimeDiff", 100)); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 96cb3dd14..8350e4e72 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -976,15 +976,15 @@ void World::LoadConfigSettings(bool reload) _int_configs[CONFIG_TELEPORT_TIMEOUT_FAR] = sConfigMgr->GetOption("TeleportTimeoutFar", 45); // pussywizard _int_configs[CONFIG_MAX_ALLOWED_MMR_DROP] = sConfigMgr->GetOption("MaxAllowedMMRDrop", 500); // pussywizard _bool_configs[CONFIG_ENABLE_LOGIN_AFTER_DC] = sConfigMgr->GetOption("EnableLoginAfterDC", true); // pussywizard - _bool_configs[CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS] = sConfigMgr->GetOption("DontCacheRandomMovementPaths", true); // pussywizard + _bool_configs[CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS] = sConfigMgr->GetOption("DontCacheRandomMovementPaths", false); _int_configs[CONFIG_SKILL_CHANCE_ORANGE] = sConfigMgr->GetOption("SkillChance.Orange", 100); _int_configs[CONFIG_SKILL_CHANCE_YELLOW] = sConfigMgr->GetOption("SkillChance.Yellow", 75); _int_configs[CONFIG_SKILL_CHANCE_GREEN] = sConfigMgr->GetOption("SkillChance.Green", 25); _int_configs[CONFIG_SKILL_CHANCE_GREY] = sConfigMgr->GetOption("SkillChance.Grey", 0); - _int_configs[CONFIG_SKILL_CHANCE_MINING_STEPS] = sConfigMgr->GetOption("SkillChance.MiningSteps", 75); - _int_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfigMgr->GetOption("SkillChance.SkinningSteps", 75); + _int_configs[CONFIG_SKILL_CHANCE_MINING_STEPS] = sConfigMgr->GetOption("SkillChance.MiningSteps", 0); + _int_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfigMgr->GetOption("SkillChance.SkinningSteps", 0); _bool_configs[CONFIG_SKILL_PROSPECTING] = sConfigMgr->GetOption("SkillChance.Prospecting", false); _bool_configs[CONFIG_SKILL_MILLING] = sConfigMgr->GetOption("SkillChance.Milling", false); @@ -1086,7 +1086,7 @@ void World::LoadConfigSettings(bool reload) _bool_configs[CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL] = sConfigMgr->GetOption("Channel.SilentlyGMJoin", false); _bool_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetOption("TalentsInspecting", true); - _bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetOption("ChatFakeMessagePreventing", false); + _bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetOption("ChatFakeMessagePreventing", true); _int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY] = sConfigMgr->GetOption("ChatStrictLinkChecking.Severity", 0); _int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_KICK] = sConfigMgr->GetOption("ChatStrictLinkChecking.Kick", 0); @@ -1171,10 +1171,10 @@ void World::LoadConfigSettings(bool reload) _bool_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS] = sConfigMgr->GetOption("Arena.AutoDistributePoints", false); _int_configs[CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS] = sConfigMgr->GetOption("Arena.AutoDistributeInterval", 7); // pussywizard: spoiled by implementing constant day and hour, always 7 now _int_configs[CONFIG_ARENA_GAMES_REQUIRED] = sConfigMgr->GetOption("Arena.GamesRequired", 10); - _int_configs[CONFIG_ARENA_SEASON_ID] = sConfigMgr->GetOption("Arena.ArenaSeason.ID", 1); + _int_configs[CONFIG_ARENA_SEASON_ID] = sConfigMgr->GetOption("Arena.ArenaSeason.ID", 8); _int_configs[CONFIG_ARENA_START_RATING] = sConfigMgr->GetOption("Arena.ArenaStartRating", 0); _int_configs[CONFIG_LEGACY_ARENA_POINTS_CALC] = sConfigMgr->GetOption("Arena.LegacyArenaPoints", 0); - _int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetOption("Arena.ArenaStartPersonalRating", 1000); + _int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetOption("Arena.ArenaStartPersonalRating", 0); _int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfigMgr->GetOption("Arena.ArenaStartMatchmakerRating", 1500); _bool_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfigMgr->GetOption("Arena.ArenaSeason.InProgress", true); _float_configs[CONFIG_ARENA_WIN_RATING_MODIFIER_1] = sConfigMgr->GetOption("Arena.ArenaWinRatingModifier1", 48.0f); @@ -1315,8 +1315,8 @@ void World::LoadConfigSettings(bool reload) LOG_INFO("server.loading", "Using DataDir {}", _dataPath); } - _bool_configs[CONFIG_VMAP_INDOOR_CHECK] = sConfigMgr->GetOption("vmap.enableIndoorCheck", 0); bool enableIndoor = sConfigMgr->GetOption("vmap.enableIndoorCheck", true); + _bool_configs[CONFIG_VMAP_INDOOR_CHECK] = enableIndoor; bool enableLOS = sConfigMgr->GetOption("vmap.enableLOS", true); bool enableHeight = sConfigMgr->GetOption("vmap.enableHeight", true); bool enablePetLOS = sConfigMgr->GetOption("vmap.petLOS", true); @@ -1330,7 +1330,7 @@ void World::LoadConfigSettings(bool reload) VMAP::VMapFactory::createOrGetVMapMgr()->setEnableHeightCalc(enableHeight); LOG_INFO("server.loading", "WORLD: VMap support included. LineOfSight:{}, getHeight:{}, indoorCheck:{} PetLOS:{}", enableLOS, enableHeight, enableIndoor, enablePetLOS); - _bool_configs[CONFIG_PET_LOS] = sConfigMgr->GetOption("vmap.petLOS", true); + _bool_configs[CONFIG_PET_LOS] = enablePetLOS; _bool_configs[CONFIG_START_CUSTOM_SPELLS] = sConfigMgr->GetOption("PlayerStart.CustomSpells", false); _int_configs[CONFIG_HONOR_AFTER_DUEL] = sConfigMgr->GetOption("HonorPointsAfterDuel", 0); _bool_configs[CONFIG_START_ALL_EXPLORED] = sConfigMgr->GetOption("PlayerStart.MapsExplored", false); From 221dbd3fdbca4348061a5f6da7eb217118866f8c Mon Sep 17 00:00:00 2001 From: Grimdhex <176165533+Grimdhex@users.noreply.github.com> Date: Tue, 3 Sep 2024 18:02:38 +0200 Subject: [PATCH 40/46] chore(Apps/Codestyle): add new codestyle checks for pointers and range loops (#19841) * chore(Apps/Codestyle): add new codestyle checks for pointers and range loops * revert a typo --- apps/codestyle/codestyle.py | 25 ++++++++++++++++++- src/server/game/Entities/Player/Player.cpp | 2 +- src/server/game/Entities/Player/SocialMgr.cpp | 4 +-- src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/Movement/Spline/Spline.cpp | 2 +- src/server/game/Warden/Warden.h | 4 +-- .../BlackrockDepths/blackrock_depths.cpp | 2 +- .../instance_blackrock_depths.cpp | 2 +- .../boss_solakar_flamewreath.cpp | 4 +-- .../instance_blackrock_spire.cpp | 4 +-- .../Kalimdor/DireMaul/instance_dire_maul.cpp | 2 +- .../Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 4 +-- .../Northrend/Naxxramas/boss_gluth.cpp | 2 +- .../Northrend/Naxxramas/boss_gothik.cpp | 2 +- .../Northrend/Naxxramas/boss_heigan.cpp | 2 +- .../Northrend/Naxxramas/boss_sapphiron.cpp | 4 +-- src/server/scripts/Spells/spell_hunter.cpp | 6 ++--- src/server/shared/Packets/ByteBuffer.h | 8 +++--- 18 files changed, 52 insertions(+), 29 deletions(-) diff --git a/apps/codestyle/codestyle.py b/apps/codestyle/codestyle.py index 50c5fe3dd..ac5af08a5 100644 --- a/apps/codestyle/codestyle.py +++ b/apps/codestyle/codestyle.py @@ -1,6 +1,7 @@ import io import os import sys +import re # Get the src directory of the project src_directory = os.path.join(os.getcwd(), 'src') @@ -11,6 +12,7 @@ results = { "Multiple blank lines check": "Passed", "Trailing whitespace check": "Passed", "GetCounter() check": "Passed", + "Misc codestyle check": "Passed", "GetTypeId() check": "Passed", "NpcFlagHelpers check": "Passed", "ItemFlagHelpers check": "Passed", @@ -29,6 +31,7 @@ def parsing_file(directory: str) -> None: multiple_blank_lines_check(file, file_path) trailing_whitespace_check(file, file_path) get_counter_check(file, file_path) + misc_codestyle_check(file, file_path) if file_name != 'Object.h': get_typeid_check(file, file_path) if file_name != 'Unit.h': @@ -184,7 +187,7 @@ def itemtemplateflag_helpers_check(file: io, file_path: str) -> None: for line_number, line in enumerate(file, start = 1): if 'Flags & ITEM_FLAG' in line: print( - f"Please use HasFlag(ItemFlag) instead of 'Flags & ITEM_FLAG_' {file_path} at line {line_number}") + f"Please use HasFlag(ItemFlag) instead of 'Flags & ITEM_FLAG_': {file_path} at line {line_number}") check_failed = True if 'Flags2 & ITEM_FLAG2' in line: print( @@ -199,5 +202,25 @@ def itemtemplateflag_helpers_check(file: io, file_path: str) -> None: error_handler = True results["ItemTemplateFlagHelpers check"] = "Failed" +# Codestyle patterns checking for various codestyle issues +def misc_codestyle_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'const auto&' in line: + print( + f"Please use 'auto const&' syntax instead of 'const auto&': {file_path} at line {line_number}") + check_failed = True + if re.search(r'\bconst\s+\w+\s*\*\b', line): + print( + f"Please use the syntax 'Class/ObjectType const*' instead of 'const Class/ObjectType*': {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["Misc codestyle check"] = "Failed" + # Main function parsing_file(src_directory) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c1c1e372e..97593309f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7739,7 +7739,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) // remove FD and invisibility at all loots constexpr std::array toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH}; - for (const auto& aura : toRemove) + for (auto const& aura : toRemove) { RemoveAurasByType(aura); } diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index e66f52629..d5b5fdf59 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -29,7 +29,7 @@ PlayerSocial::PlayerSocial(): m_playerGUID() { } uint32 PlayerSocial::GetNumberOfSocialsWithFlag(SocialFlag flag) const { uint32 counter = 0; - for (const auto& itr : m_playerSocialMap) + for (auto const& itr : m_playerSocialMap) { if ((itr.second.Flags & flag) != 0) ++counter; @@ -178,7 +178,7 @@ void PlayerSocial::SendSocialList(Player* player, uint32 flags) bool PlayerSocial::_checkContact(ObjectGuid guid, SocialFlag flags) const { - const auto& itr = m_playerSocialMap.find(guid); + auto const& itr = m_playerSocialMap.find(guid); if (itr != m_playerSocialMap.end()) return (itr->second.Flags & flags) != 0; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9d2e77854..5d0fd1a0c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2657,7 +2657,7 @@ bool Unit::GetMeleeAttackPoint(Unit* attacker, Position& pos) double attackerSize = attacker->GetCollisionRadius(); - for (const auto& otherAttacker: attackers) + for (auto const& otherAttacker: attackers) { // if the otherAttacker is not valid, skip if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() || diff --git a/src/server/game/Movement/Spline/Spline.cpp b/src/server/game/Movement/Spline/Spline.cpp index 601951a20..59086cc1a 100644 --- a/src/server/game/Movement/Spline/Spline.cpp +++ b/src/server/game/Movement/Spline/Spline.cpp @@ -71,7 +71,7 @@ namespace Movement 1.f, 0.f, 0.f, 0.f); /* classic view: - inline void C_Evaluate(const Vector3 *vertice, float t, const float (&matrix)[4][4], Vector3 &position) + inline void C_Evaluate(Vector3 const* vertice, float t, const float (&matrix)[4][4], Vector3 &position) { Vector3 tvec(t*t*t, t*t, t); int i = 0; diff --git a/src/server/game/Warden/Warden.h b/src/server/game/Warden/Warden.h index ba53a54ca..5b256993c 100644 --- a/src/server/game/Warden/Warden.h +++ b/src/server/game/Warden/Warden.h @@ -127,8 +127,8 @@ public: void DecryptData(uint8* buffer, uint32 length); void EncryptData(uint8* buffer, uint32 length); - static bool IsValidCheckSum(uint32 checksum, const uint8 *data, const uint16 length); - static uint32 BuildChecksum(const uint8 *data, uint32 length); + static bool IsValidCheckSum(uint32 checksum, uint8 const* data, const uint16 length); + static uint32 BuildChecksum(uint8 const* data, uint32 length); // If no check is passed, the default action from config is executed void ApplyPenalty(uint16 checkId, std::string const& reason); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 50f7d26fb..214b92355 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -303,7 +303,7 @@ public: bool doReset = false; if (resetTimer > 0) { - for (const auto& sum : summons) + for (auto const& sum : summons) { if (Creature* creature = ObjectAccessor::GetCreature(*me, sum)) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index 014531fa2..1e7dde565 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -471,7 +471,7 @@ public: SetData(TYPE_RING_OF_LAW, NOT_STARTED); break; case DONE: - for (const auto& itr : ArenaSpectators) + for (auto const& itr : ArenaSpectators) { if (Creature* spectator = instance->GetCreature(itr)) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp index f820384c8..39cb7594e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_solakar_flamewreath.cpp @@ -83,7 +83,7 @@ public: } GetCreatureListWithEntryInGrid(nearbyWhelps, me, NPC_ROOKERY_WHELP, RANGE_WHELP_CALL_HELP); - for (const auto& whelp : nearbyWhelps) + for (auto const& whelp : nearbyWhelps) { if (!whelp->IsInCombat()) { @@ -106,7 +106,7 @@ public: minDist = 50; tempDist = 50; me->GetGameObjectListWithEntryInGrid(nearbyEggs, GO_ROOKERY_EGG, 40); - for (const auto& egg : nearbyEggs) + for (auto const& egg : nearbyEggs) { if (egg->isSpawned() && egg->getLootState() == GO_READY) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index fc06b6222..cff24c081 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -401,14 +401,14 @@ public: pile->SetLootState(GO_READY); pile->Respawn(); } - for (const auto& circleGUID : go_urokOgreCirles) + for (auto const& circleGUID : go_urokOgreCirles) { if (GameObject* circle = instance->GetGameObject(circleGUID)) { circle->Delete(); } } - for (const auto& mobGUID : UrokMobs) + for (auto const& mobGUID : UrokMobs) { if (Creature* mob = instance->GetCreature(mobGUID)) { diff --git a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp index fdf47189b..52d569572 100644 --- a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp +++ b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp @@ -120,7 +120,7 @@ public: immol->GetAI()->SetData(1, 1); immol->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); } - for (const auto& guid : HighborneSummoners) + for (auto const& guid : HighborneSummoners) { if (Creature* summoner = instance->GetCreature(guid)) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 0162d8cbb..ec8a985f2 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -386,7 +386,7 @@ struct boss_cthun : public BossAI }, 500ms); //Spawn flesh tentacle - for (const auto& position : FleshTentaclePos) + for (auto const& position : FleshTentaclePos) me->SummonCreature(NPC_FLESH_TENTACLE, position, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); ScheduleTasks(); @@ -501,7 +501,7 @@ struct boss_cthun : public BossAI me->RemoveAurasDueToSpell(SPELL_PURPLE_COLORATION); DoCastSelf(SPELL_CARAPACE_CTHUN, true); //Spawn flesh tentacle - for (const auto& position : FleshTentaclePos) + for (auto const& position : FleshTentaclePos) me->SummonCreature(NPC_FLESH_TENTACLE, position, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); }); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index c3fd79e3a..cea3baccf 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -159,7 +159,7 @@ public: return false; Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto& itr : pList) + for (auto const& itr : pList) { Player* player = itr.GetSource(); if (!player || !player->IsAlive()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index d2ebea1ae..b5211f913 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -387,7 +387,7 @@ public: { bool checklife = false; bool checkdead = false; - for (const auto& i : PlayerList) + for (auto const& i : PlayerList) { Player* player = i.GetSource(); if (player->IsAlive() && diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index 6ed38b2c5..5dd6374b0 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -228,7 +228,7 @@ public: case EVENT_SAFETY_DANCE: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto& itr : pList) + for (auto const& itr : pList) { if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive()) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index acad7283e..8ecc62f56 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -142,7 +142,7 @@ public: if (PlList.IsEmpty()) return; - for (const auto& i : PlList) + for (auto const& i : PlList) { if (Player* player = i.GetSource()) { @@ -400,7 +400,7 @@ public: case EVENT_HUNDRED_CLUB: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto& itr : pList) + for (auto const& itr : pList) { if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance) { diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 378604983..f4bfef0e9 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -671,7 +671,7 @@ class spell_hun_readiness : public SpellScript std::set> spellsToRemove; std::set categoriesToRemove; - for (const auto& [spellId, cooldown] : cooldowns) + for (auto const& [spellId, cooldown] : cooldowns) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (spellInfo @@ -689,9 +689,9 @@ class spell_hun_readiness : public SpellScript } // we can't remove spell cooldowns while iterating. - for (const auto& [spellId, sendToClient] : spellsToRemove) + for (auto const& [spellId, sendToClient] : spellsToRemove) caster->RemoveSpellCooldown(spellId, sendToClient); - for (const auto& category : categoriesToRemove) + for (auto const& category : categoriesToRemove) caster->RemoveCategoryCooldown(category); } diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 308b6d728..1b005826e 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -464,14 +464,14 @@ public: _storage.shrink_to_fit(); } - void append(const char *src, std::size_t cnt) + void append(char const* src, std::size_t cnt) { - return append((const uint8 *)src, cnt); + return append((uint8 const*)src, cnt); } template void append(const T* src, std::size_t cnt) { - return append((const uint8*)src, cnt * sizeof(T)); + return append((uint8 const*)src, cnt * sizeof(T)); } void append(uint8 const* src, std::size_t cnt); @@ -522,7 +522,7 @@ public: } void AppendPackedTime(time_t time); - void put(std::size_t pos, const uint8 *src, std::size_t cnt); + void put(std::size_t pos, uint8 const* src, std::size_t cnt); void print_storage() const; void textlike() const; void hexlike() const; From 9999a80c9644027ebc7c46563711b2d713c32c0d Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Tue, 3 Sep 2024 18:05:23 +0200 Subject: [PATCH 41/46] feat(Core/Achievements): Add possibility to complete achievements and update achievement criteria for offline players. (#19851) --- .../character_achievement_offline_updates.sql | 10 ++ src/common/Common.h | 3 +- .../Implementation/CharacterDatabase.cpp | 3 + .../Implementation/CharacterDatabase.h | 3 + .../game/Achievements/AchievementMgr.cpp | 113 +++++++++++++++++- src/server/game/Achievements/AchievementMgr.h | 33 ++++- .../game/AuctionHouse/AuctionHouseMgr.cpp | 11 +- src/server/game/Entities/Player/Player.h | 67 ++++++----- .../game/Entities/Player/PlayerStorage.cpp | 2 +- .../game/Entities/Player/PlayerUpdates.cpp | 2 +- src/server/game/Handlers/CharacterHandler.cpp | 4 + 11 files changed, 208 insertions(+), 43 deletions(-) create mode 100644 data/sql/updates/pending_db_characters/character_achievement_offline_updates.sql diff --git a/data/sql/updates/pending_db_characters/character_achievement_offline_updates.sql b/data/sql/updates/pending_db_characters/character_achievement_offline_updates.sql new file mode 100644 index 000000000..8dddaeafb --- /dev/null +++ b/data/sql/updates/pending_db_characters/character_achievement_offline_updates.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS `character_achievement_offline_updates`; +CREATE TABLE `character_achievement_offline_updates` ( + `guid` BIGINT UNSIGNED NOT NULL COMMENT 'Character\'s GUID', + `update_type` TINYINT UNSIGNED NOT NULL COMMENT 'Supported types: 1 - COMPLETE_ACHIEVEMENT; 2 - UPDATE_CRITERIA', + `arg1` INT UNSIGNED NOT NULL COMMENT 'For type 1: achievement ID; for type 2: ACHIEVEMENT_CRITERIA_TYPE', + `arg2` INT UNSIGNED DEFAULT NULL COMMENT 'For type 2: miscValue1 for updating achievement criteria', + `arg3` INT UNSIGNED DEFAULT NULL COMMENT 'For type 2: miscValue2 for updating achievement criteria', + INDEX `idx_guid` (`guid`) +) +COMMENT = 'Stores updates to character achievements when the character was offline'; diff --git a/src/common/Common.h b/src/common/Common.h index cd50104c8..9baec924e 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -43,7 +43,8 @@ #define MAX_NETCLIENT_PACKET_SIZE (32767 - 1) // Client hardcap: int16 with trailing zero space otherwise crash on memory free // TimeConstants -constexpr auto MINUTE = 60; +constexpr auto SECOND = 1; +constexpr auto MINUTE = SECOND * 60; constexpr auto HOUR = MINUTE * 60; constexpr auto DAY = HOUR * 24; constexpr auto WEEK = DAY * 7; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index f21af3aa9..6e777a278 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -441,6 +441,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT, "INSERT INTO character_achievement (guid, achievement, date) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, "DELETE FROM character_achievement_progress WHERE guid = ? AND criteria = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, "INSERT INTO character_achievement_offline_updates (guid, update_type, arg1, arg2, arg3) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, "SELECT update_type, arg1, arg2, arg3 FROM character_achievement_offline_updates WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, "DELETE FROM character_achievement_offline_updates WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index ede962b49..c2c906936 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -365,6 +365,9 @@ enum CharacterDatabaseStatements : uint32 CHAR_INS_CHAR_ACHIEVEMENT, CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, + CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, + CHAR_SEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, + CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, CHAR_DEL_CHAR_REPUTATION_BY_FACTION, CHAR_INS_CHAR_REPUTATION_BY_FACTION, CHAR_UPD_CHAR_ARENA_POINTS, diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 6748e0190..52c2ae11f 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -481,6 +481,7 @@ bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, AchievementMgr::AchievementMgr(Player* player) { _player = player; + _offlineUpdatesDelayTimer = 0; } AchievementMgr::~AchievementMgr() @@ -550,6 +551,10 @@ void AchievementMgr::DeleteFromDB(ObjectGuid::LowType lowguid) stmt->SetData(0, lowguid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, lowguid); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); } @@ -609,7 +614,7 @@ void AchievementMgr::SaveToDB(CharacterDatabaseTransaction trans) } } -void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult) +void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult) { if (achievementResult) { @@ -669,6 +674,28 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ progress.changed = false; } while (criteriaResult->NextRow()); } + + if (offlineUpdatesResult) + { + uint32 count = 0; + do + { + Field* fields = offlineUpdatesResult->Fetch(); + + AchievementOfflinePlayerUpdate update; + update.updateType = static_cast(fields[0].Get()); + update.arg1 = fields[1].Get(); + update.arg2 = fields[2].Get(); + update.arg3 = fields[3].Get(); + + _offlineUpdatesQueue.push_back(update); + + ++count; + } while (offlineUpdatesResult->NextRow()); + + if (count > 0) + _offlineUpdatesDelayTimer = 5 * SECOND * IN_MILLISECONDS; + } } void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) const @@ -884,7 +911,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS: case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL: case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION: - case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: /* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_DISENCHANT: @@ -904,7 +931,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: - case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:/* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS: case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: @@ -915,7 +942,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; // std case: high value at miscvalue1 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: - case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED: @@ -2158,6 +2185,22 @@ void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry* entr _criteriaProgress.erase(criteriaProgress); } +void AchievementMgr::Update(uint32 timeDiff) +{ + if (_offlineUpdatesDelayTimer > 0) + { + if (timeDiff >= _offlineUpdatesDelayTimer) + { + _offlineUpdatesDelayTimer = 0; + ProcessOfflineUpdatesQueue(); + } + else + _offlineUpdatesDelayTimer -= timeDiff; + } + + UpdateTimedAchievements(timeDiff); +} + void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) { if (!_timedAchievements.empty()) @@ -2437,6 +2480,46 @@ CompletedAchievementMap const& AchievementMgr::GetCompletedAchievements() return _completedAchievements; } +void AchievementMgr::ProcessOfflineUpdatesQueue() +{ + if (_offlineUpdatesQueue.empty()) + return; + + for (auto const& update : _offlineUpdatesQueue) + ProcessOfflineUpdate(update); + + _offlineUpdatesQueue.clear(); + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, GetPlayer()->GetGUID().GetCounter()); + CharacterDatabase.Execute(stmt); +} + +void AchievementMgr::ProcessOfflineUpdate(AchievementOfflinePlayerUpdate const& update) +{ + switch (update.updateType) + { + case ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT: + { + AchievementEntry const* achievement = sAchievementStore.LookupEntry(update.arg1); + + ASSERT(achievement != NULL, "Not found achievement to complete for offline achievements update. Wrong arg1 ({}) value?", update.arg1); + + CompletedAchievement(achievement); + break; + } + case ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA: + { + AchievementCriteriaTypes criteriaType = static_cast(update.arg1); + UpdateAchievementCriteria(criteriaType, update.arg2, update.arg3); + break; + } + default: + ASSERT(false, "Unknown offline achievement update type ({}) for player - {}", update.updateType, GetPlayer()->GetGUID().GetCounter()); + break; + } +} + AchievementGlobalMgr* AchievementGlobalMgr::instance() { static AchievementGlobalMgr instance; @@ -3054,3 +3137,25 @@ AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementI { return sAchievementStore.LookupEntry(achievementId); } + +void AchievementGlobalMgr::CompletedAchievementForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementEntry const* entry) +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, playerLowGuid); + stmt->SetData(1, uint32(ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT)); + stmt->SetData(2, entry->ID); + stmt->SetData(3, 0); + stmt->SetData(4, 0); + CharacterDatabase.Execute(stmt); +} + +void AchievementGlobalMgr::UpdateAchievementCriteriaForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementCriteriaTypes type, uint32 miscValue1, uint32 miscValue2) +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, playerLowGuid); + stmt->SetData(1, uint32(ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA)); + stmt->SetData(2, type); + stmt->SetData(3, miscValue1); + stmt->SetData(4, miscValue2); + CharacterDatabase.Execute(stmt); +} diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index e05ef8e31..34e79ac4c 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -33,6 +33,20 @@ typedef std::list AchievementEntryList; typedef std::unordered_map AchievementCriteriaListByAchievement; typedef std::map AchievementListByReferencedId; +enum AchievementOfflinePlayerUpdateType +{ + ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT = 1, + ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA = 2 +}; + +struct AchievementOfflinePlayerUpdate +{ + AchievementOfflinePlayerUpdateType updateType; + uint32 arg1; + uint32 arg2; + uint32 arg3; +}; + struct CriteriaProgress { uint32 counter; @@ -284,7 +298,7 @@ public: void Reset(); static void DeleteFromDB(ObjectGuid::LowType lowguid); - void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult); + void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult); void SaveToDB(CharacterDatabaseTransaction trans); void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete = false); void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = nullptr); @@ -294,7 +308,8 @@ public: void SendRespondInspectAchievements(Player* player) const; [[nodiscard]] bool HasAchieved(uint32 achievementId) const; [[nodiscard]] Player* GetPlayer() const { return _player; } - void UpdateTimedAchievements(uint32 timeDiff); + + void Update(uint32 timeDiff); void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements @@ -313,11 +328,23 @@ private: bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement); void BuildAllDataPacket(WorldPacket* data) const; + void UpdateTimedAchievements(uint32 timeDiff); + + // Handles updates when character was offline. + void ProcessOfflineUpdate(AchievementOfflinePlayerUpdate const& update); + void ProcessOfflineUpdatesQueue(); + Player* _player; CriteriaProgressMap _criteriaProgress; CompletedAchievementMap _completedAchievements; typedef std::map TimedAchievementMap; TimedAchievementMap _timedAchievements; // Criteria id/time left in MS + + // Offline updates cannot be processed while players are loading, + // as the player will not be notified of the changes. + // To ensure proper notification, introduce a delay before processing. + uint32 _offlineUpdatesDelayTimer; + std::vector _offlineUpdatesQueue; }; class AchievementGlobalMgr @@ -398,6 +425,8 @@ public: [[nodiscard]] AchievementEntry const* GetAchievement(uint32 achievementId) const; + void CompletedAchievementForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementEntry const* entry); + void UpdateAchievementCriteriaForOfflinePlayer(ObjectGuid::LowType playerLowGuid, AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0); private: AchievementCriteriaDataMap _criteriaDataMap; diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index bdda9b37e..e7cf7ab95 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -318,10 +318,14 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, CharacterDatabas { if (sendNotification) // can be changed in the hook bidder->GetSession()->SendAuctionBidderNotification(auction->GetHouseId(), auction->Id, auction->bidder, 0, 0, auction->item_template); - // FIXME: for offline player need also + if (updateAchievementCriteria) // can be changed in the hook bidder->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1); } + else if (updateAchievementCriteria) + { + sAchievementMgr->UpdateAchievementCriteriaForOfflinePlayer(auction->bidder.GetCounter(), ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1); + } if (sendMail) // can be changed in the hook MailDraft(auction->BuildAuctionMailSubject(AUCTION_WON), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout)) @@ -375,6 +379,11 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, Character if (sendNotification) // can be changed in the hook owner->GetSession()->SendAuctionOwnerNotification(auction); } + else if (updateAchievementCriteria) + { + sAchievementMgr->UpdateAchievementCriteriaForOfflinePlayer(auction->owner.GetCounter(), ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, profit); + sAchievementMgr->UpdateAchievementCriteriaForOfflinePlayer(auction->owner.GetCounter(), ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, auction->bid); + } if (sendMail) // can be changed in the hook MailDraft(auction->BuildAuctionMailSubject(AUCTION_SUCCESSFUL), AuctionEntry::BuildAuctionMailBody(auction->bidder, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut())) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3633ebf3f..2ebf6c8db 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -861,39 +861,40 @@ enum PlayedTimeIndex // used at player loading query list preparing, and later result selection enum PlayerLoginQueryIndex { - PLAYER_LOGIN_QUERY_LOAD_FROM = 0, - PLAYER_LOGIN_QUERY_LOAD_AURAS = 3, - PLAYER_LOGIN_QUERY_LOAD_SPELLS = 4, - PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS = 5, - PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS = 6, - PLAYER_LOGIN_QUERY_LOAD_REPUTATION = 7, - PLAYER_LOGIN_QUERY_LOAD_INVENTORY = 8, - PLAYER_LOGIN_QUERY_LOAD_ACTIONS = 9, - PLAYER_LOGIN_QUERY_LOAD_MAILS = 10, - PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS = 11, - PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST = 13, - PLAYER_LOGIN_QUERY_LOAD_HOME_BIND = 14, - PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS = 15, - PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES = 16, - PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS = 18, - PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS = 19, - PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS = 20, - PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT = 21, - PLAYER_LOGIN_QUERY_LOAD_GLYPHS = 22, - PLAYER_LOGIN_QUERY_LOAD_TALENTS = 23, - PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA = 24, - PLAYER_LOGIN_QUERY_LOAD_SKILLS = 25, - PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS = 26, - PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG = 27, - PLAYER_LOGIN_QUERY_LOAD_BANNED = 28, - PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW = 29, - PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES = 30, - PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS = 31, - PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS = 32, - PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH = 34, - PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION = 35, - PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS = 36, - PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS = 37, + PLAYER_LOGIN_QUERY_LOAD_FROM = 0, + PLAYER_LOGIN_QUERY_LOAD_AURAS = 3, + PLAYER_LOGIN_QUERY_LOAD_SPELLS = 4, + PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS = 5, + PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS = 6, + PLAYER_LOGIN_QUERY_LOAD_REPUTATION = 7, + PLAYER_LOGIN_QUERY_LOAD_INVENTORY = 8, + PLAYER_LOGIN_QUERY_LOAD_ACTIONS = 9, + PLAYER_LOGIN_QUERY_LOAD_MAILS = 10, + PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS = 11, + PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST = 13, + PLAYER_LOGIN_QUERY_LOAD_HOME_BIND = 14, + PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS = 15, + PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES = 16, + PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS = 18, + PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS = 19, + PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS = 20, + PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT = 21, + PLAYER_LOGIN_QUERY_LOAD_GLYPHS = 22, + PLAYER_LOGIN_QUERY_LOAD_TALENTS = 23, + PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA = 24, + PLAYER_LOGIN_QUERY_LOAD_SKILLS = 25, + PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS = 26, + PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG = 27, + PLAYER_LOGIN_QUERY_LOAD_BANNED = 28, + PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW = 29, + PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES = 30, + PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS = 31, + PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS = 32, + PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH = 34, + PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION = 35, + PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS = 36, + PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS = 37, + PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES = 38, MAX_PLAYER_LOGIN_QUERY }; diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index c4d0a7f68..0211a5777 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -5023,7 +5023,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons SetCreationTime(fields[74].Get()); // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria) - m_achievementMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS)); + m_achievementMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES)); uint32 money = fields[8].Get(); if (money > MAX_MONEY_AMOUNT) diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index c97d6b2e9..59079f311 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -159,7 +159,7 @@ void Player::Update(uint32 p_time) } } - m_achievementMgr->UpdateTimedAchievements(p_time); + m_achievementMgr->Update(p_time); if (HasUnitState(UNIT_STATE_MELEE_ATTACKING) && !HasUnitState(UNIT_STATE_CASTING) && !HasUnitState(UNIT_STATE_CHARGING)) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 762d39e22..4021d541f 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -216,6 +216,10 @@ bool LoginQueryHolder::Initialize() stmt->SetData(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES); + stmt->SetData(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES, stmt); + return res; } From b0ddca234d28b69218304870b18e2d30c89de45d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Sep 2024 16:08:30 +0000 Subject: [PATCH 42/46] chore(DB): import pending files Referenced commit(s): 9999a80c9644027ebc7c46563711b2d713c32c0d --- .../2024_09_03_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_characters/character_achievement_offline_updates.sql => db_characters/2024_09_03_00.sql} (94%) diff --git a/data/sql/updates/pending_db_characters/character_achievement_offline_updates.sql b/data/sql/updates/db_characters/2024_09_03_00.sql similarity index 94% rename from data/sql/updates/pending_db_characters/character_achievement_offline_updates.sql rename to data/sql/updates/db_characters/2024_09_03_00.sql index 8dddaeafb..b61491e17 100644 --- a/data/sql/updates/pending_db_characters/character_achievement_offline_updates.sql +++ b/data/sql/updates/db_characters/2024_09_03_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_07_05_00 -> 2024_09_03_00 DROP TABLE IF EXISTS `character_achievement_offline_updates`; CREATE TABLE `character_achievement_offline_updates` ( `guid` BIGINT UNSIGNED NOT NULL COMMENT 'Character\'s GUID', From e3e4133e883f13a880a7281b66488ee529cf392e Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:12:32 -0400 Subject: [PATCH 43/46] fix(Core/Handlers): Only remove emote if player is moving. (#19740) Init. --- src/server/game/Handlers/MovementHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index babfb01fc..fe432e186 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -373,7 +373,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) // Stop emote on move if (Player* plrMover = mover->ToPlayer()) { - if (plrMover->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_ONESHOT_NONE) + if (plrMover->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_ONESHOT_NONE && movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_MOVING)) { plrMover->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); } From 1edac37ac37dfbfdc5f4d1ba36140dc077f06236 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:41:31 -0400 Subject: [PATCH 44/46] refactor(Core): Make more use of helpers. (#19835) * Init. * Reword. * Update codestyle script. Co-Authored-By: Kitzunu <24550914+Kitzunu@users.noreply.github.com> * Add gameobject type ID check, reorder checks. * Add helper/codestyle check for unit type. * `IsUnit()` -> `IsCreature()` * Add `IsUnit()` method. * Use type mask. https: //github.com/TrinityCore/TrinityCore/commit/cc71da35b5dc74abf71f8691161525a23d870bb5 Co-Authored-By: Giacomo Pozzoni Co-Authored-By: Ovahlord <18347559+Ovahlord@users.noreply.github.com> * Replace instances of `isType` with `IsUnit`. --------- Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Co-authored-by: Giacomo Pozzoni Co-authored-by: Ovahlord <18347559+Ovahlord@users.noreply.github.com> --- apps/codestyle/codestyle.py | 18 +- src/server/game/AI/CoreAI/PassiveAI.cpp | 2 +- src/server/game/AI/CoreAI/PetAI.cpp | 2 +- src/server/game/AI/CoreAI/UnitAI.cpp | 2 +- src/server/game/AI/CoreAI/UnitAI.h | 6 +- src/server/game/AI/CreatureAI.cpp | 6 +- .../game/AI/ScriptedAI/ScriptedCreature.h | 2 +- .../game/AI/ScriptedAI/ScriptedEscortAI.cpp | 2 +- .../game/AI/SmartScripts/SmartScript.cpp | 12 +- .../game/Achievements/AchievementMgr.cpp | 12 +- src/server/game/Combat/ThreatMgr.cpp | 4 +- src/server/game/Conditions/DisableMgr.cpp | 2 +- .../game/Entities/Creature/Creature.cpp | 8 +- .../Entities/Creature/TemporarySummon.cpp | 8 +- .../game/Entities/GameObject/GameObject.cpp | 24 +- src/server/game/Entities/Object/Object.cpp | 50 ++-- src/server/game/Entities/Object/Object.h | 10 +- src/server/game/Entities/Object/ObjectGuid.h | 20 +- src/server/game/Entities/Pet/Pet.cpp | 8 +- .../game/Entities/Player/KillRewarder.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 26 +- .../game/Entities/Player/PlayerGossip.cpp | 12 +- .../game/Entities/Player/PlayerQuest.cpp | 4 +- .../game/Entities/Player/PlayerUpdates.cpp | 8 +- src/server/game/Entities/Unit/CharmInfo.cpp | 4 +- src/server/game/Entities/Unit/Unit.cpp | 270 +++++++++--------- src/server/game/Entities/Vehicle/Vehicle.cpp | 32 +-- .../game/Grids/Notifiers/GridNotifiers.h | 12 +- src/server/game/Handlers/ChatHandler.cpp | 2 +- src/server/game/Handlers/MovementHandler.cpp | 2 +- src/server/game/Handlers/PetHandler.cpp | 18 +- src/server/game/Handlers/QuestHandler.cpp | 2 +- src/server/game/Handlers/SpellHandler.cpp | 6 +- src/server/game/Instances/InstanceScript.cpp | 2 +- src/server/game/Maps/Map.cpp | 8 +- src/server/game/Movement/MotionMaster.cpp | 8 +- .../IdleMovementGenerator.cpp | 4 +- .../MovementGenerators/PathGenerator.cpp | 2 +- .../PointMovementGenerator.cpp | 4 +- .../TargetedMovementGenerator.cpp | 6 +- src/server/game/OutdoorPvP/OutdoorPvP.cpp | 4 +- src/server/game/Scripting/MapScripts.cpp | 16 +- .../Scripting/ScriptDefines/VehicleScript.cpp | 12 +- .../game/Spells/Auras/SpellAuraEffects.cpp | 120 ++++---- src/server/game/Spells/Auras/SpellAuras.cpp | 6 +- src/server/game/Spells/Spell.cpp | 98 +++---- src/server/game/Spells/SpellEffects.cpp | 82 +++--- src/server/game/Texts/CreatureTextMgr.cpp | 4 +- src/server/game/Texts/CreatureTextMgr.h | 4 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 8 +- src/server/scripts/Commands/cs_npc.cpp | 2 +- .../boss_ambassador_flamelash.cpp | 2 +- .../BlackwingLair/boss_nefarian.cpp | 4 +- .../BlackwingLair/boss_razorgore.cpp | 2 +- .../MoltenCore/boss_majordomo_executus.cpp | 2 +- .../MoltenCore/molten_core.cpp | 2 +- .../boss_priestess_delrissa.cpp | 2 +- .../ScarletEnclave/chapter2.cpp | 2 +- .../ScarletEnclave/chapter5.cpp | 2 +- .../Scholomance/boss_darkmaster_gandling.cpp | 2 +- .../SunkenTemple/instance_sunken_temple.cpp | 2 +- .../SunwellPlateau/boss_felmyst.cpp | 2 +- .../SunwellPlateau/boss_kiljaeden.cpp | 4 +- .../SunwellPlateau/boss_muru.cpp | 2 +- .../Uldaman/instance_uldaman.cpp | 2 +- .../ZulGurub/boss_mandokir.cpp | 8 +- .../EasternKingdoms/ZulGurub/boss_marli.cpp | 2 +- .../EasternKingdoms/zone_stormwind_city.cpp | 6 +- .../zone_western_plaguelands.cpp | 2 +- src/server/scripts/Events/brewfest.cpp | 2 +- src/server/scripts/Events/midsummer.cpp | 4 +- src/server/scripts/Events/pilgrims_bounty.cpp | 2 +- .../TheBlackMorass/boss_aeonus.cpp | 2 +- .../TheBlackMorass/boss_chrono_lord_deja.cpp | 2 +- .../TheBlackMorass/boss_temporus.cpp | 2 +- .../TempleOfAhnQiraj/boss_bug_trio.cpp | 2 +- src/server/scripts/Kalimdor/zone_durotar.cpp | 2 +- .../scripts/Kalimdor/zone_the_barrens.cpp | 4 +- .../boss_krikthir_the_gatewatcher.cpp | 2 +- .../ahnkahet/boss_herald_volazj.cpp | 6 +- .../ahnkahet/boss_jedoga_shadowseeker.cpp | 2 +- .../ahnkahet/boss_prince_taldaram.cpp | 2 +- .../ObsidianSanctum/boss_sartharion.cpp | 2 +- .../RubySanctum/boss_halion.cpp | 6 +- .../boss_argent_challenge.cpp | 2 +- .../boss_grand_champions.cpp | 2 +- .../instance_trial_of_the_champion.cpp | 2 +- .../boss_anubarak_trial.cpp | 4 +- .../boss_northrend_beasts.cpp | 6 +- .../instance_drak_tharon_keep.cpp | 2 +- .../ForgeOfSouls/boss_devourer_of_souls.cpp | 4 +- .../PitOfSaron/boss_forgemaster_garfrost.cpp | 2 +- .../PitOfSaron/boss_krickandick.cpp | 4 +- .../FrozenHalls/PitOfSaron/pit_of_saron.cpp | 2 +- .../boss_blood_prince_council.cpp | 14 +- .../boss_blood_queen_lana_thel.cpp | 2 +- .../boss_deathbringer_saurfang.cpp | 2 +- .../IcecrownCitadel/boss_festergut.cpp | 6 +- .../boss_icecrown_gunship_battle.cpp | 12 +- .../IcecrownCitadel/boss_lord_marrowgar.cpp | 4 +- .../boss_professor_putricide.cpp | 8 +- .../IcecrownCitadel/boss_rotface.cpp | 8 +- .../IcecrownCitadel/boss_sindragosa.cpp | 4 +- .../IcecrownCitadel/boss_the_lich_king.cpp | 16 +- .../IcecrownCitadel/icecrown_citadel.cpp | 4 +- .../Northrend/Naxxramas/boss_anubrekhan.cpp | 2 +- .../Northrend/Naxxramas/boss_faerlina.cpp | 2 +- .../Naxxramas/boss_four_horsemen.cpp | 2 +- .../Northrend/Naxxramas/boss_gothik.cpp | 2 +- .../Northrend/Naxxramas/boss_heigan.cpp | 2 +- .../Northrend/Naxxramas/boss_kelthuzad.cpp | 4 +- .../scripts/Northrend/Naxxramas/boss_noth.cpp | 2 +- .../Northrend/Naxxramas/boss_patchwerk.cpp | 2 +- .../Northrend/Naxxramas/boss_razuvious.cpp | 2 +- .../Northrend/Naxxramas/boss_thaddius.cpp | 6 +- .../Nexus/Nexus/boss_magus_telestra.cpp | 2 +- .../scripts/Northrend/Nexus/Oculus/oculus.cpp | 4 +- .../HallsOfLightning/boss_bjarngrim.cpp | 2 +- .../Ulduar/HallsOfLightning/boss_ionar.cpp | 2 +- .../Ulduar/HallsOfLightning/boss_loken.cpp | 2 +- .../Ulduar/HallsOfLightning/boss_volkhan.cpp | 2 +- .../Ulduar/boss_algalon_the_observer.cpp | 4 +- .../Ulduar/Ulduar/boss_assembly_of_iron.cpp | 6 +- .../Northrend/Ulduar/Ulduar/boss_auriaya.cpp | 2 +- .../Ulduar/Ulduar/boss_flame_leviathan.cpp | 14 +- .../Northrend/Ulduar/Ulduar/boss_freya.cpp | 2 +- .../Ulduar/Ulduar/boss_general_vezax.cpp | 6 +- .../Northrend/Ulduar/Ulduar/boss_hodir.cpp | 18 +- .../Northrend/Ulduar/Ulduar/boss_ignis.cpp | 2 +- .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 4 +- .../Northrend/Ulduar/Ulduar/boss_mimiron.cpp | 14 +- .../Ulduar/Ulduar/boss_razorscale.cpp | 4 +- .../Northrend/Ulduar/Ulduar/boss_xt002.cpp | 2 +- .../Ulduar/Ulduar/instance_ulduar.cpp | 2 +- .../UtgardePinnacle/boss_palehoof.cpp | 2 +- .../UtgardePinnacle/boss_svala.cpp | 2 +- .../Northrend/VaultOfArchavon/boss_emalon.cpp | 2 +- .../scripts/Northrend/zone_borean_tundra.cpp | 6 +- .../scripts/Northrend/zone_dragonblight.cpp | 12 +- .../scripts/Northrend/zone_grizzly_hills.cpp | 2 +- .../scripts/Northrend/zone_howling_fjord.cpp | 2 +- .../scripts/Northrend/zone_icecrown.cpp | 6 +- .../scripts/Northrend/zone_storm_peaks.cpp | 2 +- .../scripts/OutdoorPvP/OutdoorPvPHP.cpp | 2 +- .../scripts/OutdoorPvP/OutdoorPvPNA.cpp | 4 +- .../scripts/OutdoorPvP/OutdoorPvPZM.cpp | 2 +- .../Outland/BlackTemple/boss_illidan.cpp | 6 +- .../BlackTemple/boss_illidari_council.cpp | 4 +- .../BlackTemple/boss_reliquary_of_souls.cpp | 2 +- .../BlackTemple/boss_teron_gorefiend.cpp | 2 +- .../BloodFurnace/instance_blood_furnace.cpp | 2 +- .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 4 +- src/server/scripts/Spells/spell_dk.cpp | 2 +- src/server/scripts/Spells/spell_generic.cpp | 22 +- src/server/scripts/Spells/spell_hunter.cpp | 6 +- src/server/scripts/Spells/spell_item.cpp | 8 +- src/server/scripts/Spells/spell_mage.cpp | 2 +- src/server/scripts/Spells/spell_paladin.cpp | 2 +- src/server/scripts/Spells/spell_priest.cpp | 2 +- src/server/scripts/Spells/spell_quest.cpp | 12 +- .../scripts/World/boss_emerald_dragons.cpp | 4 +- src/server/scripts/World/go_scripts.cpp | 2 +- .../scripts/World/npc_stave_of_ancients.cpp | 2 +- src/server/scripts/World/npcs_special.cpp | 4 +- 165 files changed, 725 insertions(+), 719 deletions(-) diff --git a/apps/codestyle/codestyle.py b/apps/codestyle/codestyle.py index ac5af08a5..bad3aee1f 100644 --- a/apps/codestyle/codestyle.py +++ b/apps/codestyle/codestyle.py @@ -108,14 +108,20 @@ def get_typeid_check(file: io, file_path: str) -> None: check_failed = False # Parse all the file for line_number, line in enumerate(file, start = 1): - if 'GetTypeId() == TYPEID_PLAYER' in line: - print(f"Please use IsPlayer() instead GetTypeId(): {file_path} at line {line_number}") + if 'GetTypeId() == TYPEID_ITEM' in line or 'GetTypeId() != TYPEID_ITEM' in line: + print(f"Please use IsItem() instead of GetTypeId(): {file_path} at line {line_number}") check_failed = True - if 'GetTypeId() == TYPEID_ITEM' in line: - print(f"Please use IsItem() instead GetTypeId(): {file_path} at line {line_number}") + if 'GetTypeId() == TYPEID_UNIT' in line or 'GetTypeId() != TYPEID_UNIT' in line: + print(f"Please use IsCreature() instead of GetTypeId(): {file_path} at line {line_number}") check_failed = True - if 'GetTypeId() == TYPEID_DYNOBJECT' in line: - print(f"Please use IsDynamicObject() instead GetTypeId(): {file_path} at line {line_number}") + if 'GetTypeId() == TYPEID_PLAYER' in line or 'GetTypeId() != TYPEID_PLAYER' in line: + print(f"Please use IsPlayer() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_GAMEOBJECT' in line or 'GetTypeId() != TYPEID_GAMEOBJECT' in line: + print(f"Please use IsGameObject() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_DYNOBJECT' in line or 'GetTypeId() != TYPEID_DYNOBJECT' in line: + print(f"Please use IsDynamicObject() instead of GetTypeId(): {file_path} at line {line_number}") check_failed = True # Handle the script error and update the result output if check_failed: diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp index 796231e41..a34ce30d8 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.cpp +++ b/src/server/game/AI/CoreAI/PassiveAI.cpp @@ -65,7 +65,7 @@ void PossessedAI::JustDied(Unit* /*u*/) void PossessedAI::KilledUnit(Unit* /*victim*/) { // We killed a creature, disable victim's loot - //if (victim->GetTypeId() == TYPEID_UNIT) + //if (victim->IsCreature()) // victim->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE); } diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 6d1892b0f..3803e815a 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -613,7 +613,7 @@ void PetAI::DoAttack(Unit* target, bool chase) if (_canMeleeAttack()) { - float angle = combatRange == 0.f && target->GetTypeId() != TYPEID_PLAYER && !target->IsPet() ? float(M_PI) : 0.f; + float angle = combatRange == 0.f && !target->IsPlayer() && !target->IsPet() ? float(M_PI) : 0.f; float tolerance = combatRange == 0.f ? float(M_PI_4) : float(M_PI * 2); me->GetMotionMaster()->MoveChase(target, ChaseRange(0.f, combatRange), ChaseAngle(angle, tolerance)); } diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 5240c88e5..710f4a453 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -427,7 +427,7 @@ bool NonTankTargetSelector::operator()(Unit const* target) const if (!target) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (Unit* currentVictim = _source->GetThreatMgr().GetCurrentVictim()) diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 0f7c50163..aefb6a673 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -76,7 +76,7 @@ struct DefaultTargetSelector : public Acore::unary_function if (target == except) return false; - if (m_playerOnly && (target->GetTypeId() != TYPEID_PLAYER)) + if (m_playerOnly && (!target->IsPlayer())) return false; if (m_dist > 0.0f && !me->IsWithinCombatRange(target, m_dist)) @@ -148,7 +148,7 @@ struct PowerUsersSelector : public Acore::unary_function if (target->getPowerType() != _power) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (_dist > 0.0f && !_me->IsWithinCombatRange(target, _dist)) @@ -170,7 +170,7 @@ struct FarthestTargetSelector : public Acore::unary_function if (!_me || !target) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (_maxDist > 0.0f && !_me->IsInRange(target, _minDist, _maxDist)) diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 1f97131cb..52c1da79d 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -107,7 +107,7 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/, float maxRange Map* map = creature->GetMap(); if (!map->IsDungeon()) //use IsDungeon instead of Instanceable, in case battlegrounds will be instantiated { - LOG_ERROR("entities.unit.ai", "DoZoneInCombat call for map {} that isn't a dungeon (creature entry = {})", map->GetId(), creature->GetTypeId() == TYPEID_UNIT ? creature->ToCreature()->GetEntry() : 0); + LOG_ERROR("entities.unit.ai", "DoZoneInCombat call for map {} that isn't a dungeon (creature entry = {})", map->GetId(), creature->IsCreature() ? creature->ToCreature()->GetEntry() : 0); return; } @@ -175,10 +175,10 @@ void CreatureAI::MoveInLineOfSight(Unit* who) void CreatureAI::TriggerAlert(Unit const* who) const { // If there's no target, or target isn't a player do nothing - if (!who || who->GetTypeId() != TYPEID_PLAYER) + if (!who || !who->IsPlayer()) return; // If this unit isn't an NPC, is already distracted, is in combat, is confused, stunned or fleeing, do nothing - if (me->GetTypeId() != TYPEID_UNIT || me->IsEngaged() || me->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED)) + if (!me->IsCreature() || me->IsEngaged() || me->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED)) return; // Only alert for hostiles! if (me->IsCivilian() || me->HasReactState(REACT_PASSIVE) || !me->IsHostileTo(who) || !me->_IsTargetAcceptable(who)) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index b252923ba..69830d815 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -178,7 +178,7 @@ class PlayerOrPetCheck public: bool operator() (WorldObject* unit) const { - if (unit->GetTypeId() != TYPEID_PLAYER) + if (!unit->IsPlayer()) if (!unit->ToUnit()->GetOwnerGUID().IsPlayer()) return true; diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 0319ed5c7..c6aa04a39 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -111,7 +111,7 @@ bool npc_escortAI::AssistPlayerInCombatAgainst(Unit* who) } // or if enemy is in evade mode - if (who->GetTypeId() == TYPEID_UNIT && who->ToCreature()->IsInEvadeMode()) + if (who->IsCreature() && who->ToCreature()->IsInEvadeMode()) { return false; } diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 01bab2e9d..97e6ea164 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -4217,7 +4217,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui { if (!me || !unit) return; - if (e.event.kill.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) + if (e.event.kill.playerOnly && !unit->IsPlayer()) return; if (e.event.kill.creature && unit->GetEntry() != e.event.kill.creature) return; @@ -4254,7 +4254,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui (hostilityMode == SmartEvent::LOSHostilityMode::NotHostile && !me->IsHostileTo(unit)) || (hostilityMode == SmartEvent::LOSHostilityMode::Hostile && me->IsHostileTo(unit))) { - if (e.event.los.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) + if (e.event.los.playerOnly && !unit->IsPlayer()) return; RecalcTimer(e, e.event.los.cooldownMin, e.event.los.cooldownMax); ProcessAction(e, unit); @@ -4278,7 +4278,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui (hostilityMode == SmartEvent::LOSHostilityMode::NotHostile && !me->IsHostileTo(unit)) || (hostilityMode == SmartEvent::LOSHostilityMode::Hostile && me->IsHostileTo(unit))) { - if (e.event.los.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) + if (e.event.los.playerOnly && !unit->IsPlayer()) return; RecalcTimer(e, e.event.los.cooldownMin, e.event.los.cooldownMax); ProcessAction(e, unit); @@ -5269,7 +5269,7 @@ WorldObject* SmartScript::GetLastInvoker(WorldObject* invoker) const bool SmartScript::IsUnit(WorldObject* obj) { - return obj && (obj->GetTypeId() == TYPEID_UNIT || obj->IsPlayer()); + return obj && (obj->IsCreature() || obj->IsPlayer()); } bool SmartScript::IsPlayer(WorldObject* obj) @@ -5279,7 +5279,7 @@ bool SmartScript::IsPlayer(WorldObject* obj) bool SmartScript::IsCreature(WorldObject* obj) { - return obj && obj->GetTypeId() == TYPEID_UNIT; + return obj && obj->IsCreature(); } bool SmartScript::IsCharmedCreature(WorldObject* obj) @@ -5295,7 +5295,7 @@ bool SmartScript::IsCharmedCreature(WorldObject* obj) bool SmartScript::IsGameObject(WorldObject* obj) { - return obj && obj->GetTypeId() == TYPEID_GAMEOBJECT; + return obj && obj->IsGameObject(); } void SmartScript::IncPhase(uint32 p) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 52c2ae11f..9d3626e3d 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -304,11 +304,11 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un case ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE: return true; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE: - if (!target || target->GetTypeId() != TYPEID_UNIT) + if (!target || !target->IsCreature()) return false; return target->GetEntry() == creature.id; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE: - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return false; if (classRace.class_id && classRace.class_id != target->ToPlayer()->getClass()) return false; @@ -316,7 +316,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return false; return true; case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE: - if (!source || source->GetTypeId() != TYPEID_PLAYER) + if (!source || !source->IsPlayer()) return false; if (classRace.class_id && classRace.class_id != source->ToPlayer()->getClass()) return false; @@ -324,7 +324,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return false; return true; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH: - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return false; return !target->HealthAbovePct(health.percent); case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD: @@ -371,7 +371,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return source->GetMap()->GetPlayersCountExceptGMs() <= map_players.maxcount; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM: { - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return false; // DB data compatibility... @@ -1501,7 +1501,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui continue; // map specific case (BG in fact) expected player targeted damage/heal - if (!unit || unit->GetTypeId() != TYPEID_PLAYER) + if (!unit || !unit->IsPlayer()) continue; } diff --git a/src/server/game/Combat/ThreatMgr.cpp b/src/server/game/Combat/ThreatMgr.cpp index 92ca0c049..185ad3f9d 100644 --- a/src/server/game/Combat/ThreatMgr.cpp +++ b/src/server/game/Combat/ThreatMgr.cpp @@ -81,7 +81,7 @@ bool ThreatCalcHelper::isValidProcess(Unit* hatedUnit, Unit* hatingUnit, SpellIn if (threatSpell && threatSpell->HasAttribute(SPELL_ATTR1_NO_THREAT)) return false; - ASSERT(hatingUnit->GetTypeId() == TYPEID_UNIT); + ASSERT(hatingUnit->IsCreature()); return true; } @@ -190,7 +190,7 @@ void HostileReference::updateOnlineStatus() // target is no player or not gamemaster // target is not in flight if (isValid() - && (getTarget()->GetTypeId() != TYPEID_PLAYER || !getTarget()->ToPlayer()->IsGameMaster()) + && (!getTarget()->IsPlayer() || !getTarget()->ToPlayer()->IsGameMaster()) && !getTarget()->IsInFlight() && getTarget()->IsInMap(GetSourceUnit()) && getTarget()->InSamePhase(GetSourceUnit()) diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 5385612ff..0ebcefcee 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -326,7 +326,7 @@ namespace DisableMgr if (unit) { if ((spellFlags & SPELL_DISABLE_PLAYER && unit->IsPlayer()) || - (unit->GetTypeId() == TYPEID_UNIT && ((unit->IsPet() && spellFlags & SPELL_DISABLE_PET) || spellFlags & SPELL_DISABLE_CREATURE))) + (unit->IsCreature() && ((unit->IsPet() && spellFlags & SPELL_DISABLE_PET) || spellFlags & SPELL_DISABLE_CREATURE))) { if (spellFlags & SPELL_DISABLE_MAP) { diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 29086a8dc..33a294531 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1904,7 +1904,7 @@ bool Creature::CanStartAttack(Unit const* who) const return false; // This set of checks is should be done only for creatures - if ((IsImmuneToNPC() && who->GetTypeId() != TYPEID_PLAYER) || // flag is valid only for non player characters + if ((IsImmuneToNPC() && !who->IsPlayer()) || // flag is valid only for non player characters (IsImmuneToPC() && who->IsPlayer())) // immune to PC and target is a player, return false { return false; @@ -1915,7 +1915,7 @@ bool Creature::CanStartAttack(Unit const* who) const return false; // Do not attack non-combat pets - if (who->GetTypeId() == TYPEID_UNIT && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) + if (who->IsCreature() && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) return false; if (!CanFly() && (GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE + m_CombatDistance)) // too much Z difference, skip very costy vmap calculations here @@ -2498,7 +2498,7 @@ bool Creature::CanAssistTo(Unit const* u, Unit const* enemy, bool checkfaction / return false; // pussywizard: or if enemy is in evade mode - if (enemy && enemy->GetTypeId() == TYPEID_UNIT && enemy->ToCreature()->IsInEvadeMode()) + if (enemy && enemy->IsCreature() && enemy->ToCreature()->IsInEvadeMode()) return false; // we don't need help from non-combatant ;) @@ -2636,7 +2636,7 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const return false; // pussywizard: or if enemy is in evade mode - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode()) + if (victim->IsCreature() && victim->ToCreature()->IsInEvadeMode()) return false; // cannot attack if is during 5 second grace period, unless being attacked diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index b080b772e..86ea77673 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -254,14 +254,14 @@ void TempSummon::InitSummon() WorldObject* owner = GetSummoner(); if (owner) { - if (owner->GetTypeId() == TYPEID_UNIT) + if (owner->IsCreature()) { if (owner->ToCreature()->IsAIEnabled) { owner->ToCreature()->AI()->JustSummoned(this); } } - else if (owner->GetTypeId() == TYPEID_GAMEOBJECT) + else if (owner->IsGameObject()) { if (owner->ToGameObject()->AI()) { @@ -304,11 +304,11 @@ void TempSummon::UnSummon(uint32 msTime) if (WorldObject* owner = GetSummoner()) { - if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsAIEnabled) + if (owner->IsCreature() && owner->ToCreature()->IsAIEnabled) { owner->ToCreature()->AI()->SummonedCreatureDespawn(this); } - else if (owner->GetTypeId() == TYPEID_GAMEOBJECT && owner->ToGameObject()->AI()) + else if (owner->IsGameObject() && owner->ToGameObject()->AI()) { owner->ToGameObject()->AI()->SummonedCreatureDespawn(this); } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 4fd9a5cd3..5cf90d71a 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1280,7 +1280,7 @@ bool GameObject::IsAlwaysVisibleFor(WorldObject const* seer) const Unit* owner = GetOwner(); if (owner) { - if (seer->isType(TYPEMASK_UNIT) && owner->IsFriendlyTo(seer->ToUnit())) + if (seer->IsUnit() && owner->IsFriendlyTo(seer->ToUnit())) return true; } } @@ -1521,7 +1521,7 @@ void GameObject::Use(Unit* user) return; case GAMEOBJECT_TYPE_QUESTGIVER: //2 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1550,7 +1550,7 @@ void GameObject::Use(Unit* user) if (!info) return; - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; if (ChairListSlots.empty()) // this is called once at first chair use to make list of available slots @@ -1717,7 +1717,7 @@ void GameObject::Use(Unit* user) if (!info) return; - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1818,7 +1818,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_SUMMONING_RITUAL: //18 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1831,7 +1831,7 @@ void GameObject::Use(Unit* user) if (owner) { - if (owner->GetTypeId() != TYPEID_PLAYER) + if (!owner->IsPlayer()) return; // accept only use by player from same group as owner, excluding owner itself (unique use already added in spell effect) @@ -1908,7 +1908,7 @@ void GameObject::Use(Unit* user) { GameObjectTemplate const* info = GetGOInfo(); - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1934,7 +1934,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_FLAGSTAND: // 24 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1966,7 +1966,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_FISHINGHOLE: // 25 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -1978,7 +1978,7 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_FLAGDROP: // 26 { - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -2036,7 +2036,7 @@ void GameObject::Use(Unit* user) if (!info) return; - if (user->GetTypeId() != TYPEID_PLAYER) + if (!user->IsPlayer()) return; Player* player = user->ToPlayer(); @@ -2063,7 +2063,7 @@ void GameObject::Use(Unit* user) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (!spellInfo) { - if (user->GetTypeId() != TYPEID_PLAYER || !sOutdoorPvPMgr->HandleCustomSpell(user->ToPlayer(), spellId, this)) + if (!user->IsPlayer() || !sOutdoorPvPMgr->HandleCustomSpell(user->ToPlayer(), spellId, this)) LOG_ERROR("entities.gameobject", "WORLD: unknown spell id {} at use action for gameobject (Entry: {} GoType: {})", spellId, GetEntry(), GetGoType()); else LOG_DEBUG("outdoorpvp", "WORLD: {} non-dbc spell was handled by OutdoorPvP", spellId); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d494cd8da..371a776aa 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -226,7 +226,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) } } - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) { if (((Unit*)this)->GetVictim()) flags |= UPDATEFLAG_HAS_TARGET; @@ -275,7 +275,7 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const { ASSERT(target); - if (isType(TYPEMASK_UNIT) || isType(TYPEMASK_PLAYER)) + if (IsUnit() || isType(TYPEMASK_PLAYER)) { if (Battleground* bg = target->GetBattleground()) { @@ -345,7 +345,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const Unit const* unit = nullptr; WorldObject const* object = nullptr; - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) unit = ToUnit(); else object = ((WorldObject*)this); @@ -1101,20 +1101,20 @@ void WorldObject::setActive(bool on) if (on) { - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) map->AddToActive(this->ToCreature()); else if (IsDynamicObject()) map->AddToActive((DynamicObject*)this); - else if (GetTypeId() == TYPEID_GAMEOBJECT) + else if (IsGameObject()) map->AddToActive((GameObject*)this); } else { - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) map->RemoveFromActive(this->ToCreature()); else if (IsDynamicObject()) map->RemoveFromActive((DynamicObject*)this); - else if (GetTypeId() == TYPEID_GAMEOBJECT) + else if (IsGameObject()) map->RemoveFromActive((GameObject*)this); } } @@ -1147,7 +1147,7 @@ void WorldObject::SetPositionDataUpdate() _updatePositionData = true; // Calls immediately for charmed units - if (GetTypeId() == TYPEID_UNIT && ToUnit()->IsCharmedOwnedByPlayerOrPlayer()) + if (IsCreature() && ToUnit()->IsCharmedOwnedByPlayerOrPlayer()) UpdatePositionData(); } @@ -1531,7 +1531,7 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const { float new_z = GetMapHeight(x, y, z); if (new_z > INVALID_HEIGHT) - z = new_z + (isType(TYPEMASK_UNIT) ? static_cast(this)->GetHoverHeight() : 0.0f); + z = new_z + (IsUnit() ? static_cast(this)->GetHoverHeight() : 0.0f); } /** @@ -1634,7 +1634,7 @@ float WorldObject::GetGridActivationRange() const { return ToCreature()->m_SightDistance; } - else if (((GetTypeId() == TYPEID_GAMEOBJECT && ToGameObject()->IsTransport()) || IsDynamicObject()) && isActiveObject()) + else if (((IsGameObject() && ToGameObject()->IsTransport()) || IsDynamicObject()) && isActiveObject()) { return GetMap()->GetVisibilityRange(); } @@ -1644,11 +1644,11 @@ float WorldObject::GetGridActivationRange() const float WorldObject::GetVisibilityRange() const { - if (IsVisibilityOverridden() && GetTypeId() == TYPEID_UNIT) + if (IsVisibilityOverridden() && IsCreature()) { return *m_visibilityDistanceOverride; } - else if (GetTypeId() == TYPEID_GAMEOBJECT) + else if (IsGameObject()) { { if (IsInWintergrasp()) @@ -1677,11 +1677,11 @@ float WorldObject::GetSightRange(WorldObject const* target) const { if (target) { - if (target->IsVisibilityOverridden() && target->GetTypeId() == TYPEID_UNIT) + if (target->IsVisibilityOverridden() && target->IsCreature()) { return *target->m_visibilityDistanceOverride; } - else if (target->GetTypeId() == TYPEID_GAMEOBJECT) + else if (target->IsGameObject()) { if (IsInWintergrasp() && target->IsInWintergrasp()) { @@ -1872,7 +1872,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo bool WorldObject::CanNeverSee(WorldObject const* obj) const { - if (GetTypeId() == TYPEID_UNIT && obj->GetTypeId() == TYPEID_UNIT) + if (IsCreature() && obj->IsCreature()) return GetMap() != obj->GetMap() || (!InSamePhase(obj) && ToUnit()->GetVehicleBase() != obj && this != obj->ToUnit()->GetVehicleBase()); return GetMap() != obj->GetMap() || !InSamePhase(obj); } @@ -1901,7 +1901,7 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool che // xinef: ignore units players have at client, this cant be cheated! if (checkClient) { - if (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->HaveAtClient(obj)) + if (!IsPlayer() || !ToPlayer()->HaveAtClient(obj)) return false; } else @@ -1992,7 +1992,7 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) co float distance = GetExactDist(obj); float combatReach = 0.0f; - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) combatReach = ((Unit*)this)->GetCombatReach(); if (distance < combatReach) @@ -2006,7 +2006,7 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) co if (!(obj->m_stealth.GetFlags() & (1 << i))) continue; - if (isType(TYPEMASK_UNIT)) + if (IsUnit()) if (((Unit*)this)->HasAuraTypeWithMiscvalue(SPELL_AURA_DETECT_STEALTH, i)) return true; @@ -2389,7 +2389,7 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, float x, float y, float if (respawnTime) go->SetSpellId(1); - if (IsPlayer() || (GetTypeId() == TYPEID_UNIT && summonType == GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)) //not sure how to handle this + if (IsPlayer() || (IsCreature() && summonType == GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)) //not sure how to handle this ToUnit()->AddGameObject(go); else go->SetSpawnedByDefault(false); @@ -2406,7 +2406,7 @@ Creature* WorldObject::SummonTrigger(float x, float y, float z, float ang, uint3 return nullptr; //summon->SetName(GetName()); - if (setLevel && (IsPlayer() || GetTypeId() == TYPEID_UNIT)) + if (setLevel && (IsPlayer() || IsCreature())) { summon->SetFaction(((Unit*)this)->GetFaction()); summon->SetLevel(((Unit*)this)->GetLevel()); @@ -2428,9 +2428,9 @@ Creature* WorldObject::SummonTrigger(float x, float y, float z, float ang, uint3 */ void WorldObject::SummonCreatureGroup(uint8 group, std::list* list /*= nullptr*/) { - ASSERT((GetTypeId() == TYPEID_GAMEOBJECT || GetTypeId() == TYPEID_UNIT) && "Only GOs and creatures can summon npc groups!"); + ASSERT((IsGameObject() || IsCreature()) && "Only GOs and creatures can summon npc groups!"); - std::vector const* data = sObjectMgr->GetSummonGroup(GetEntry(), GetTypeId() == TYPEID_GAMEOBJECT ? SUMMONER_TYPE_GAMEOBJECT : SUMMONER_TYPE_CREATURE, group); + std::vector const* data = sObjectMgr->GetSummonGroup(GetEntry(), IsGameObject() ? SUMMONER_TYPE_GAMEOBJECT : SUMMONER_TYPE_CREATURE, group); if (!data) return; @@ -2742,7 +2742,7 @@ void WorldObject::GetContactPoint(WorldObject const* obj, float& x, float& y, fl GetNearPoint(obj, x, y, z, obj->GetObjectSize(), distance2d, GetAngle(obj)); // Exclude gameobjects from LoS calculations - if (std::fabs(this->GetPositionZ() - z) > 3.0f || (GetTypeId() != TYPEID_GAMEOBJECT && !IsWithinLOS(x, y, z))) + if (std::fabs(this->GetPositionZ() - z) > 3.0f || (!IsGameObject() && !IsWithinLOS(x, y, z))) { x = this->GetPositionX(); y = this->GetPositionY(); @@ -2955,7 +2955,7 @@ void WorldObject::DestroyForNearbyPlayers() if (!player->HaveAtClient(this)) continue; - if (isType(TYPEMASK_UNIT) && ((Unit*)this)->GetCharmerGUID() == player->GetGUID()) /// @todo: this is for puppet + if (IsUnit() && ((Unit*)this)->GetCharmerGUID() == player->GetGUID()) /// @todo: this is for puppet continue; DestroyForPlayer(player); @@ -3123,7 +3123,7 @@ float WorldObject::GetMapHeight(float x, float y, float z, bool vmap/* = true*/, float WorldObject::GetMapWaterOrGroundLevel(float x, float y, float z, float* ground/* = nullptr*/) const { return GetMap()->GetWaterOrGroundLevel(GetPhaseMask(), x, y, z, ground, - isType(TYPEMASK_UNIT) ? !static_cast(this)->HasAuraType(SPELL_AURA_WATER_WALK) : false, + IsUnit() ? !static_cast(this)->HasAuraType(SPELL_AURA_WATER_WALK) : false, std::max(GetCollisionHeight(), Z_OFFSET_FIND_HEIGHT)); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 6b439663c..d9d168ed4 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -198,11 +198,13 @@ public: Player* ToPlayer() { if (IsPlayer()) return reinterpret_cast(this); else return nullptr; } [[nodiscard]] Player const* ToPlayer() const { if (IsPlayer()) return reinterpret_cast(this); else return nullptr; } - Creature* ToCreature() { if (GetTypeId() == TYPEID_UNIT) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] Creature const* ToCreature() const { if (GetTypeId() == TYPEID_UNIT) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] inline bool IsCreature() const { return GetTypeId() == TYPEID_UNIT; } + Creature* ToCreature() { if (IsCreature()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] Creature const* ToCreature() const { if (IsCreature()) return reinterpret_cast(this); else return nullptr; } - Unit* ToUnit() { if (GetTypeId() == TYPEID_UNIT || IsPlayer()) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] Unit const* ToUnit() const { if (GetTypeId() == TYPEID_UNIT || IsPlayer()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] inline bool IsUnit() const { return isType(TYPEMASK_UNIT); } + Unit* ToUnit() { if (IsCreature() || IsPlayer()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] Unit const* ToUnit() const { if (IsCreature() || IsPlayer()) return reinterpret_cast(this); else return nullptr; } [[nodiscard]] inline bool IsGameObject() const { return GetTypeId() == TYPEID_GAMEOBJECT; } GameObject* ToGameObject() { if (IsGameObject()) return reinterpret_cast(this); else return nullptr; } diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index eb69c7d12..a8d99fe80 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -181,20 +181,20 @@ class ObjectGuid { switch (high) { - case HighGuid::Item: return TYPEID_ITEM; - //case HighGuid::Container: return TYPEID_CONTAINER; HighGuid::Container == HighGuid::Item currently - case HighGuid::Unit: return TYPEID_UNIT; - case HighGuid::Pet: return TYPEID_UNIT; - case HighGuid::Player: return TYPEID_PLAYER; - case HighGuid::GameObject: return TYPEID_GAMEOBJECT; + case HighGuid::Item: return TYPEID_ITEM; + //case HighGuid::Container: return TYPEID_CONTAINER; HighGuid::Container == HighGuid::Item currently + case HighGuid::Unit: return TYPEID_UNIT; + case HighGuid::Pet: return TYPEID_UNIT; + case HighGuid::Player: return TYPEID_PLAYER; + case HighGuid::GameObject: return TYPEID_GAMEOBJECT; case HighGuid::DynamicObject: return TYPEID_DYNAMICOBJECT; - case HighGuid::Corpse: return TYPEID_CORPSE; - case HighGuid::Mo_Transport: return TYPEID_GAMEOBJECT; - case HighGuid::Vehicle: return TYPEID_UNIT; + case HighGuid::Corpse: return TYPEID_CORPSE; + case HighGuid::Mo_Transport: return TYPEID_GAMEOBJECT; + case HighGuid::Vehicle: return TYPEID_UNIT; // unknown case HighGuid::Instance: case HighGuid::Group: - default: return TYPEID_OBJECT; + default: return TYPEID_OBJECT; } } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index f3228f3cd..c3fa426a5 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -2060,7 +2060,7 @@ void Pet::InitPetCreateSpells() bool Pet::resetTalents() { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return false; if (!sScriptMgr->CanResetTalents(this)) @@ -2228,7 +2228,7 @@ void Pet::InitTalentForLevel() uint32 talentPointsForLevel = GetMaxTalentPointsForLevel(level); Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; // Reset talents in case low level (on level down) or wrong points for level (hunter can unlearn TP increase talent) @@ -2368,7 +2368,7 @@ void Pet::LearnPetPassives() void Pet::CastPetAuras(bool current) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; if (!IsPermanentPetFor(owner->ToPlayer())) @@ -2397,7 +2397,7 @@ void Pet::learnSpellHighRank(uint32 spellid) void Pet::SynchronizeLevelWithOwner() { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; switch (getPetType()) diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index 680aaa43e..1ce4308aa 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -130,7 +130,7 @@ void KillRewarder::_InitXP(Player* player) _xp = Acore::XP::Gain(player, _victim, _isBattleGround); if (_xp && !_isBattleGround && _victim) // pussywizard: npcs with relatively low hp give lower exp - if (_victim->GetTypeId() == TYPEID_UNIT) + if (_victim->IsCreature()) if (const CreatureTemplate* ct = _victim->ToCreature()->GetCreatureTemplate()) if (ct->ModHealth <= 0.75f && ct->ModHealth >= 0.0f) _xp = uint32(_xp * ct->ModHealth); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 97593309f..068eaa8d2 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2385,7 +2385,7 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) return; } - if (victim && victim->GetTypeId() == TYPEID_UNIT && !victim->ToCreature()->hasLootRecipient()) + if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient()) { return; } @@ -6023,7 +6023,7 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool awar // do not reward honor in arenas, but enable onkill spellproc if (InArena()) { - if (!uVictim || uVictim == this || uVictim->GetTypeId() != TYPEID_PLAYER) + if (!uVictim || uVictim == this || !uVictim->IsPlayer()) return false; if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId()) @@ -9256,7 +9256,7 @@ void Player::StopCastingCharm(Aura* except /*= nullptr*/) return; } - if (charm->GetTypeId() == TYPEID_UNIT) + if (charm->IsCreature()) { if (charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_PUPPET)) { @@ -9611,7 +9611,7 @@ void Player::CharmSpellInitialize() } uint8 addlist = 0; - if (charm->GetTypeId() != TYPEID_PLAYER) + if (!charm->IsPlayer()) { //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate(); //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK) @@ -9627,7 +9627,7 @@ void Player::CharmSpellInitialize() data << uint16(0); data << uint32(0); - if (charm->GetTypeId() != TYPEID_PLAYER) + if (!charm->IsPlayer()) data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0); else data << uint32(0); @@ -12622,7 +12622,7 @@ bool Player::isHonorOrXPTarget(Unit* victim) const return false; } - if (victim->GetTypeId() == TYPEID_UNIT) + if (victim->IsCreature()) { if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP)) { @@ -12684,7 +12684,7 @@ void Player::RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewar if (!pRewardSource) return; - ObjectGuid creature_guid = (pRewardSource->GetTypeId() == TYPEID_UNIT) ? pRewardSource->GetGUID() : ObjectGuid::Empty; + ObjectGuid creature_guid = (pRewardSource->IsCreature()) ? pRewardSource->GetGUID() : ObjectGuid::Empty; // prepare data for near group iteration if (Group* group = GetGroup()) @@ -12818,7 +12818,7 @@ void Player::SetClientControl(Unit* target, bool allowMove, bool packetOnly /*= SetMover(target); // Xinef: disable moving if target has disable move flag - if (target->GetTypeId() != TYPEID_UNIT) + if (!target->IsCreature()) return; if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) @@ -12855,12 +12855,12 @@ void Player::SetMover(Unit* target) LOG_INFO("misc", "Player::SetMover (B2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0); } m_mover->m_movedByPlayer = nullptr; - if (m_mover->GetTypeId() == TYPEID_UNIT) + if (m_mover->IsCreature()) m_mover->GetMotionMaster()->Initialize(); m_mover = target; m_mover->m_movedByPlayer = this; - if (m_mover->GetTypeId() == TYPEID_UNIT) + if (m_mover->IsCreature()) m_mover->GetMotionMaster()->Initialize(); } @@ -13105,7 +13105,7 @@ void Player::StopCastingBindSight(Aura* except /*= nullptr*/) { if (WorldObject* target = GetViewpoint()) { - if (target->isType(TYPEMASK_UNIT)) + if (target->IsUnit()) { ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except); ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except); @@ -13129,7 +13129,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply) // farsight dynobj or puppet may be very far away UpdateVisibilityOf(target); - if (target->isType(TYPEMASK_UNIT) && !GetVehicle()) + if (target->IsUnit() && !GetVehicle()) ((Unit*)target)->AddPlayerToVision(this); SetSeer(target); } @@ -13146,7 +13146,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply) return; } - if (target->isType(TYPEMASK_UNIT) && !GetVehicle()) + if (target->IsUnit() && !GetVehicle()) static_cast(target)->RemovePlayerFromVision(this); // must immediately set seer back otherwise may crash diff --git a/src/server/game/Entities/Player/PlayerGossip.cpp b/src/server/game/Entities/Player/PlayerGossip.cpp index 1029ae478..609d9776d 100644 --- a/src/server/game/Entities/Player/PlayerGossip.cpp +++ b/src/server/game/Entities/Player/PlayerGossip.cpp @@ -44,13 +44,13 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool uint32 npcflags = 0; - if (source->GetTypeId() == TYPEID_UNIT) + if (source->IsCreature()) { npcflags = source->ToUnit()->GetNpcFlags(); if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER) PrepareQuestMenu(source->GetGUID()); } - else if (source->GetTypeId() == TYPEID_GAMEOBJECT) + else if (source->IsGameObject()) if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) PrepareQuestMenu(source->GetGUID()); @@ -211,7 +211,7 @@ void Player::SendPreparedGossip(WorldObject* source) if (!source) return; - if (source->GetTypeId() == TYPEID_UNIT) + if (source->IsCreature()) { // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag) if (!source->ToCreature()->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP) && !PlayerTalkClass->GetQuestMenu().Empty()) @@ -220,7 +220,7 @@ void Player::SendPreparedGossip(WorldObject* source) return; } } - else if (source->GetTypeId() == TYPEID_GAMEOBJECT) + else if (source->IsGameObject()) { // probably need to find a better way here if (!PlayerTalkClass->GetGossipMenu().GetMenuId() && !PlayerTalkClass->GetQuestMenu().Empty()) @@ -256,7 +256,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men uint32 gossipOptionId = item->OptionType; ObjectGuid guid = source->GetGUID(); - if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->GetTypeId() == TYPEID_UNIT) + if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->IsCreature()) { if (gossipOptionId == GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT && source->ToUnit()->GetNpcFlags() & UNIT_NPC_FLAG_FLIGHTMASTER) { @@ -272,7 +272,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men } } - if (source->GetTypeId() == TYPEID_GAMEOBJECT) + if (source->IsGameObject()) { if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER) { diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index 44e46fc74..2a95b3e27 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -829,7 +829,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, if (quest->GetRewSpellCast() > 0) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast()); - if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) + if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) { if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) creature->CastSpell(this, quest->GetRewSpellCast(), true); @@ -840,7 +840,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, else if (quest->GetRewSpell() > 0) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell()); - if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) + if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast()) { if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) creature->CastSpell(this, quest->GetRewSpell(), true); diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index 59079f311..e74493499 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -939,7 +939,7 @@ void Player::UpdateWeaponSkill(Unit* victim, WeaponAttackType attType, Item* ite if (GetShapeshiftForm() == FORM_TREE) return; // use weapon but not skill up - if (victim->GetTypeId() == TYPEID_UNIT && + if (victim->IsCreature() && (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_SKILL_GAINS)) return; @@ -1670,7 +1670,7 @@ void Player::UpdateVisibilityOf(WorldObject* target) { if (!CanSeeOrDetect(target, false, true)) { - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) BeforeVisibilityDestroy(target->ToCreature(), this); target->DestroyForPlayer(this); @@ -1687,7 +1687,7 @@ void Player::UpdateVisibilityOf(WorldObject* target) // target aura duration for caster show only if target exist at // caster client send data at target visibility change (adding to // client) - if (target->isType(TYPEMASK_UNIT)) + if (target->IsUnit()) GetInitialVisiblePackets((Unit*) target); } } @@ -1913,7 +1913,7 @@ void Player::UpdateCharmedAI() // Xinef: we should be killed if caster enters evade mode and charm is // infinite - if (charmer->GetTypeId() == TYPEID_UNIT && + if (charmer->IsCreature() && charmer->ToCreature()->IsInEvadeMode()) { AuraEffectList const& auras = diff --git a/src/server/game/Entities/Unit/CharmInfo.cpp b/src/server/game/Entities/Unit/CharmInfo.cpp index d315f01a2..c278bd366 100644 --- a/src/server/game/Entities/Unit/CharmInfo.cpp +++ b/src/server/game/Entities/Unit/CharmInfo.cpp @@ -34,7 +34,7 @@ CharmInfo::CharmInfo(Unit* unit) for (uint8 i = 0; i < MAX_SPELL_CHARM; ++i) _charmspells[i].SetActionAndType(0, ACT_DISABLED); - if (_unit->GetTypeId() == TYPEID_UNIT) + if (_unit->IsCreature()) { _oldReactState = _unit->ToCreature()->GetReactState(); _unit->ToCreature()->SetReactState(REACT_PASSIVE); @@ -76,7 +76,7 @@ void CharmInfo::InitEmptyActionBar(bool withAttack) void CharmInfo::InitPossessCreateSpells() { - if (_unit->GetTypeId() == TYPEID_UNIT) + if (_unit->IsCreature()) { // Adding switch until better way is found. Malcrom // Adding entrys to this switch will prevent COMMAND_ATTACK being added to pet bar. diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5d0fd1a0c..5adb8a875 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -393,7 +393,7 @@ void Unit::Update(uint32 p_time) return; // pussywizard: - if (GetTypeId() != TYPEID_PLAYER || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate)) + if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate)) { if (m_delayed_unit_relocation_timer) { @@ -560,7 +560,7 @@ public: bool operator()(Movement::MoveSpline::UpdateResult result) { if ((result & (Movement::MoveSpline::Result_NextSegment | Movement::MoveSpline::Result_JustArrived)) && - _unit->GetTypeId() == TYPEID_UNIT && _unit->GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE && + _unit->IsCreature() && _unit->GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE && _unit->movespline->GetId() == _unit->GetMotionMaster()->GetCurrentSplineId()) { _unit->ToCreature()->AI()->MovementInform(ESCORT_MOTION_TYPE, _unit->movespline->currentPathIdx() - 1); @@ -595,7 +595,7 @@ void Unit::UpdateSplineMovement(uint32 t_diff) { DisableSpline(); - if (movespline->HasAnimation() && GetTypeId() == TYPEID_UNIT && IsAlive()) + if (movespline->HasAnimation() && IsCreature() && IsAlive()) SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, movespline->GetAnimationType()); } @@ -786,7 +786,7 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons void Unit::DealDamageMods(Unit const* victim, uint32& damage, uint32* absorb) { - if (!victim || !victim->IsAlive() || victim->IsInFlight() || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())) + if (!victim || !victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())) { if (absorb) *absorb += damage; @@ -831,7 +831,7 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage } // Signal the pet it was attacked so the AI can respond if needed - if (victim->GetTypeId() == TYPEID_UNIT && attacker != victim && victim->IsPet() && victim->IsAlive()) + if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive()) victim->ToPet()->AI()->AttackedBy(attacker); if (damagetype != NODAMAGE) @@ -1039,7 +1039,7 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE) victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0); - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) { // Part of Evade mechanics. DoT's and Thorns / Retribution Aura do not contribute to this if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD))) @@ -1432,7 +1432,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss, if (!victim) return; - if (!victim->IsAlive() || victim->IsInFlight() || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())) + if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())) return; SpellInfo const* spellProto = damageInfo->spellInfo; @@ -1525,7 +1525,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { // only players have secondary weapon damage - if (i > 0 && GetTypeId() != TYPEID_PLAYER) + if (i > 0 && !IsPlayer()) { break; } @@ -1819,7 +1819,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) auto canTakeMeleeDamage = [&]() { - return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (victim->GetTypeId() != TYPEID_UNIT || !victim->ToCreature()->IsEvadingAttacks()); + return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks()); }; if (!canTakeMeleeDamage()) @@ -1879,7 +1879,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) // If this is a creature and it attacks from behind it has a probability to daze it's victim if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) && - GetTypeId() != TYPEID_PLAYER && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this) + !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this) && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle())) { // -probability is between 0% and 40% @@ -2125,7 +2125,7 @@ void Unit::CalcAbsorbResist(DamageInfo& dmgInfo, bool Splited) // Magic damage, check for resists // Ignore spells that cant be resisted // Xinef: holy resistance exists for npcs - if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->GetTypeId() == TYPEID_UNIT) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG)))) + if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG)))) { float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim); @@ -2626,7 +2626,7 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType /*= BASE_A if (IsPlayer() && !m_Controlled.empty()) for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) if (Unit* pet = *itr) - if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsAlive() && pet->IsCreature()) pet->ToCreature()->AI()->OwnerAttacked(victim); } } @@ -2770,7 +2770,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const { - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks()) + if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()) { return MELEE_HIT_EVADE; } @@ -2888,7 +2888,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon) if (attType != RANGED_ATTACK && (IsPlayer() || IsPet()) && - victim->GetTypeId() != TYPEID_PLAYER && !victim->IsPet() && + !victim->IsPlayer() && !victim->IsPet() && GetLevel() < victim->getLevelForTarget(this)) { // cap possible value (with bonuses > max skill) @@ -2909,7 +2909,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 && // can be from by creature (if can) or from controlled player that considered as creature !IsControlledByPlayer() && - !(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS)) + !(IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS)) { // when their weapon skill is 15 or more above victim's defense skill tmp = victimDefenseSkill; @@ -2936,7 +2936,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy if (tmp > 0 && roll < (sum += tmp)) { LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum); - if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) + if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) { LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)"); } @@ -3006,7 +3006,7 @@ uint32 Unit::CalculateDamage(WeaponAttackType attType, bool normalized, bool add float Unit::CalculateLevelPenalty(SpellInfo const* spellProto) const { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return 1.0f; if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel) @@ -3073,7 +3073,7 @@ bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttac if (victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION) || victim->HasInArc(M_PI, this)) { // Check creatures flags_extra for disable block - if (victim->GetTypeId() == TYPEID_UNIT && + if (victim->IsCreature() && victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK) return false; @@ -3199,7 +3199,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo } // Check creatures flags_extra for disable parry - if (victim->GetTypeId() == TYPEID_UNIT) + if (victim->IsCreature()) { uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra; // Xinef: no dodge flag @@ -3294,7 +3294,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spellInfo) { // Can`t miss on dead target (on skinning for example) - if (!victim->IsAlive() && victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsAlive() && !victim->IsPlayer()) return SPELL_MISS_NONE; // vehicles cant miss @@ -3314,12 +3314,12 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spellInfo SpellSchoolMask schoolMask = spellInfo->GetSchoolMask(); int32 thisLevel = getLevelForTarget(victim); - if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsTrigger()) + if (IsCreature() && ToCreature()->IsTrigger()) thisLevel = std::max(thisLevel, spellInfo->SpellLevel); int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel; int32 MISS_CHANCE_MULTIPLIER; - if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && GetTypeId() != TYPEID_PLAYER) // keep it as it was originally (7 and 11) + if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11) { MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11; } @@ -3455,7 +3455,7 @@ SpellMissInfo Unit::SpellHitResult(Unit* victim, SpellInfo const* spell, bool Ca return SPELL_MISS_NONE; // Return evade for units in evade mode - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE) + if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE) && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT)) return SPELL_MISS_EVADE; @@ -3530,7 +3530,7 @@ SpellMissInfo Unit::SpellHitResult(Unit* victim, Spell const* spell, bool CanRef } // Return evade for units in evade mode - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && + if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spellInfo->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT)) { return SPELL_MISS_EVADE; @@ -3637,7 +3637,7 @@ float Unit::GetUnitParryChance() const chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE); } } - else if (GetTypeId() == TYPEID_UNIT) + else if (IsCreature()) { if (ToCreature()->isWorldBoss()) chance = 13.4f; // + 0.6 by skill diff @@ -4224,7 +4224,7 @@ void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data) void Unit::ProcessTerrainStatusUpdate() { - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) ToCreature()->UpdateMovementFlags(); if (IsFlying() || (!IsControlledByPlayer())) @@ -4430,7 +4430,7 @@ AuraApplication* Unit::_CreateAuraApplication(Aura* aura, uint8 effMask) // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load) // Xinef: Added IsAllowingDeadTarget check - if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetSession()->PlayerLoading())) + if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading())) return nullptr; Unit* caster = aura->GetCaster(); @@ -6232,11 +6232,11 @@ void Unit::RemoveAllGameObjects() void Unit::SendSpellNonMeleeReflectLog(SpellNonMeleeDamage* log, Unit* attacker) { // Xinef: function for players only, placed in unit because of cosmetics - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return; WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size - //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop + // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop uint32 damage = log->damage; uint32 absorb = log->absorb; if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD)) @@ -6624,7 +6624,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin) case 39446: { - if (GetTypeId() != TYPEID_PLAYER || !IsAlive()) + if (!IsPlayer() || !IsAlive()) return false; // Select class defined buff @@ -6709,7 +6709,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // cast 45428 Arcane Strike if Exalted by Scryers case 45482: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Get Aldor reputation rank @@ -6732,7 +6732,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // cast 45432 Light's Ward if Exalted by Scryers case 45483: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Get Aldor reputation rank @@ -6756,7 +6756,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // cast 45430 Arcane Surge if Exalted by Scryers case 45484: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Get Aldor reputation rank @@ -6815,7 +6815,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } case 71519: // Deathbringer's Will Normal { - if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71484)) + if (!IsPlayer() || HasSpellCooldown(71484)) return false; AddSpellCooldown(71484, 0, cooldown); @@ -6858,7 +6858,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } case 71562: // Deathbringer's Will Heroic { - if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71561)) + if (!IsPlayer() || HasSpellCooldown(71561)) return false; AddSpellCooldown(71561, 0, cooldown); @@ -7044,7 +7044,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Incanter's Regalia set (add trigger chance to Mana Shield) if (dummySpell->SpellFamilyFlags[0] & 0x8000) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; target = this; @@ -7384,7 +7384,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere { if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3) { - if (target && target->GetTypeId() == TYPEID_UNIT) + if (target && target->IsCreature()) { triggered_spell_id = 54820; break; @@ -8225,7 +8225,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Flametongue Weapon (Passive) if (dummySpell->SpellFamilyFlags[0] & 0x200000) { - if (GetTypeId() != TYPEID_PLAYER || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped()) + if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped()) return false; WeaponAttackType attType = WeaponAttackType(Player::GetAttackBySlot(castItem->GetSlot())); @@ -8300,7 +8300,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Lightning Overload if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura { - if(!procSpell || GetTypeId() != TYPEID_PLAYER || !victim) + if(!procSpell || !IsPlayer() || !victim) return false; if (procEx & PROC_EX_CRITICAL_HIT) @@ -8356,7 +8356,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Improved Blood Presence if (dummySpell->SpellIconID == 2636) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; basepoints0 = CalculatePct(int32(damage), triggerAmount); break; @@ -9145,7 +9145,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Item - Hunter T9 4P Bonus (Steady Shot) else if (auraSpellInfo->Id == 67151) { - if (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetPet()) + if (!IsPlayer() || !ToPlayer()->GetPet()) return false; target = ToPlayer()->GetPet(); @@ -9185,7 +9185,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case 67712: // Item - Coliseum 25 Normal Caster Trinket case 67758: // Item - Coliseum 25 Heroic Caster Trinket { - if (!victim || !victim->IsAlive() || GetTypeId() != TYPEID_PLAYER) + if (!victim || !victim->IsAlive() || !IsPlayer()) return false; uint32 stack_spell_id = 0; @@ -9353,7 +9353,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Blood Presence (Improved) else if (auraSpellInfo->Id == 63611) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; trigger_spell_id = 50475; @@ -9401,7 +9401,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case 12849: case 12867: { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK) @@ -9479,7 +9479,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg break; // Ulduar, Hodir, Toasty Fire case 62821: - if (this->GetTypeId() != TYPEID_PLAYER) // spell has Attribute, but persistent area auras ignore it + if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it return false; break; case 15337: // Improved Spirit Tap (Rank 1) @@ -9521,7 +9521,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Item - Death Knight T10 Melee 4P Bonus if (auraSpellInfo->Id == 70656) { - if (GetTypeId() != TYPEID_PLAYER || !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) + if (!IsPlayer() || !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) return false; for (uint8 i = 0; i < MAX_RUNES; ++i) @@ -9541,7 +9541,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Rime else if (auraSpellInfo->SpellIconID == 56) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return false; // Howling Blast @@ -10001,7 +10001,7 @@ FactionTemplateEntry const* Unit::GetFactionTemplateEntry() const void Unit::SetFaction(uint32 faction) { SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, faction); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) ToCreature()->UpdateMoveInLineOfSightState(); } @@ -10309,7 +10309,7 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) AddUnitState(UNIT_STATE_MELEE_ATTACKING); // set position before any AI calls/assistance - //if (GetTypeId() == TYPEID_UNIT) + //if (IsCreature()) // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ()); if (creature && !(IsControllableGuardian() && IsControlledByPlayer())) { @@ -10390,7 +10390,7 @@ void Unit::CombatStop(bool includingCast) ClearInCombat(); // xinef: just in case - if (IsPetInCombat() && GetTypeId() != TYPEID_PLAYER) + if (IsPetInCombat() && !IsPlayer()) ClearInPetCombat(); } @@ -10763,7 +10763,7 @@ void Unit::SetMinion(Minion* minion, bool apply) (*itr)->OutDebugInfo(); ABORT(); } - ASSERT((*itr)->GetTypeId() == TYPEID_UNIT); + ASSERT((*itr)->IsCreature()); if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)) continue; @@ -10792,7 +10792,7 @@ void Unit::GetAllMinionsByEntry(std::list& Minions, uint32 entry) { Unit* unit = *itr; ++itr; - if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT + if (unit->GetEntry() == entry && unit->IsCreature() && unit->ToCreature()->IsSummon()) // minion, actually Minions.push_back(unit->ToCreature()); } @@ -10804,7 +10804,7 @@ void Unit::RemoveAllMinionsByEntry(uint32 entry) { Unit* unit = *itr; ++itr; - if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT + if (unit->GetEntry() == entry && unit->IsCreature() && unit->ToCreature()->IsSummon()) // minion, actually unit->ToTempSummon()->UnSummon(); // i think this is safe because i have never heard that a despawned minion will trigger a same minion @@ -10907,7 +10907,7 @@ int32 Unit::DealHeal(Unit* healer, Unit* victim, uint32 addhealth) Unit* unit = healer; - if (healer && healer->GetTypeId() == TYPEID_UNIT && healer->ToCreature()->IsTotem()) + if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem()) unit = healer->GetOwner(); if (!unit) @@ -11055,7 +11055,7 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius) if (IsPlayer()) player = ToPlayer(); // Should we enable this also for charmed units? - else if (GetTypeId() == TYPEID_UNIT && IsPet()) + else if (IsCreature() && IsPet()) player = GetOwner()->ToPlayer(); if (!player) @@ -11229,7 +11229,7 @@ float Unit::SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, Da return 1.0f; // For totems get damage bonus from owner - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (IsTotem()) { @@ -11560,7 +11560,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin return pdamage; // For totems get damage bonus from owner - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (IsTotem()) { @@ -11581,7 +11581,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype); // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controled Damage - if (GetTypeId() == TYPEID_UNIT && (!ToCreature()->IsPet() || !ToCreature()->IsGuardian() || !ToCreature()->IsControlledByPlayer())) + if (IsCreature() && (!ToCreature()->IsPet() || !ToCreature()->IsGuardian() || !ToCreature()->IsControlledByPlayer())) DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank); // Some spells don't benefit from pct done mods @@ -11932,7 +11932,7 @@ int32 Unit::SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT) float Unit::SpellDoneCritChance(Unit const* /*victim*/, SpellInfo const* spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const { // Mobs can't crit with spells. - if (GetTypeId() == TYPEID_UNIT && !GetSpellModOwner()) + if (IsCreature() && !GetSpellModOwner()) return -100.0f; // not critting spell @@ -12298,7 +12298,7 @@ uint32 Unit::SpellCriticalHealingBonus(Unit const* caster, SpellInfo const* spel float Unit::SpellPctHealingModsDone(Unit* victim, SpellInfo const* spellProto, DamageEffectType damagetype) { // For totems get healing bonus from owner (statue isn't totem in fact) - if (GetTypeId() == TYPEID_UNIT && IsTotem()) + if (IsCreature() && IsTotem()) if (Unit* owner = GetOwner()) return owner->SpellPctHealingModsDone(victim, spellProto, damagetype); @@ -12390,7 +12390,7 @@ float Unit::SpellPctHealingModsDone(Unit* victim, SpellInfo const* spellProto, D uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod, uint32 stack) { // For totems get healing bonus from owner (statue isn't totem in fact) - if (GetTypeId() == TYPEID_UNIT && IsTotem()) + if (IsCreature() && IsTotem()) if (Unit* owner = GetOwner()) return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack); @@ -13014,7 +13014,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType if (!victim || pdamage == 0) return 0; - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { // Dancing Rune Weapon... if (GetEntry() == 27893) @@ -13446,7 +13446,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) // xinef: if we have charmed npc, stun him also if (Unit* charm = player->GetCharm()) - if (charm->GetTypeId() == TYPEID_UNIT) + if (charm->IsCreature()) charm->SetUnitFlag(UNIT_FLAG_STUNNED); WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4); @@ -13511,7 +13511,7 @@ void Unit::Dismount() // xinef: if we have charmed npc, remove stun also if (Unit* charm = player->GetCharm()) - if (charm->GetTypeId() == TYPEID_UNIT && !charm->HasUnitState(UNIT_STATE_STUNNED)) + if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED)) charm->RemoveUnitFlag(UNIT_FLAG_STUNNED); } } @@ -13519,7 +13519,7 @@ void Unit::Dismount() void Unit::SetInCombatWith(Unit* enemy, uint32 duration) { // Xinef: Dont allow to start combat with triggers - if (enemy->GetTypeId() == TYPEID_UNIT && enemy->ToCreature()->IsTrigger()) + if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger()) return; Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf(); @@ -13563,7 +13563,7 @@ void Unit::SetImmuneToNPC(bool apply, bool keepCombat) void Unit::CombatStart(Unit* victim, bool initialAggro) { // Xinef: Dont allow to start combat with triggers - if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsTrigger()) + if (victim->IsCreature() && victim->ToCreature()->IsTrigger()) return; if (initialAggro) @@ -13574,7 +13574,7 @@ void Unit::CombatStart(Unit* victim, bool initialAggro) victim->SetStandState(UNIT_STAND_STATE_STAND); } - if (!victim->IsInCombat() && victim->GetTypeId() != TYPEID_PLAYER && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled) + if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled) { if (victim->IsPet()) victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart() @@ -13629,7 +13629,7 @@ void Unit::CombatStart(Unit* victim, bool initialAggro) SetContestedPvP(who->ToPlayer()); Player* player = GetCharmerOrOwnerPlayerOrPlayerItself(); - if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who)) + if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who)) { player->UpdatePvP(true); player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); @@ -13639,7 +13639,7 @@ void Unit::CombatStart(Unit* victim, bool initialAggro) void Unit::CombatStartOnCast(Unit* target, bool initialAggro, uint32 duration) { // Xinef: Dont allow to start combat with triggers - if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsTrigger()) + if (target->IsCreature() && target->ToCreature()->IsTrigger()) return; if (initialAggro) @@ -13656,7 +13656,7 @@ void Unit::CombatStartOnCast(Unit* target, bool initialAggro, uint32 duration) SetContestedPvP(who->ToPlayer()); Player* player = GetCharmerOrOwnerPlayerOrPlayerItself(); - if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who)) + if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who)) { player->UpdatePvP(true); player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); @@ -13678,7 +13678,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy, uint32 duration) return; // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back - if (GetTypeId() == TYPEID_UNIT && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself()) SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back if (IsInCombat()) @@ -13726,7 +13726,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy, uint32 duration) ++itr; // Xinef: Dont set combat for passive units, they will evade in next update... - if (controlled->GetTypeId() == TYPEID_UNIT && controlled->ToCreature()->HasReactState(REACT_PASSIVE)) + if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE)) continue; controlled->SetInCombatState(PvP, enemy, duration); @@ -13873,10 +13873,10 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo Player* owner = GetAffectingPlayer(); Unit const* const thisUnit = owner ? owner : this; if (!(target->IsPlayer() && thisUnit->IsPlayer()) && - !(target->GetTypeId() == TYPEID_UNIT && thisUnit->GetTypeId() == TYPEID_UNIT)) + !(target->IsCreature() && thisUnit->IsCreature())) { Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer(); - Unit const* creature = target->GetTypeId() == TYPEID_UNIT ? target : thisUnit; + Unit const* creature = target->IsCreature() ? target : thisUnit; if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry()) { @@ -14235,7 +14235,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) } case MOVE_FLIGHT: { - if (GetTypeId() == TYPEID_UNIT && IsControlledByPlayer()) // not sure if good for pet + if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet { main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS); @@ -14280,7 +14280,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) case MOVE_FLIGHT: { // Set creature speed rate - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) { @@ -14341,7 +14341,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED)) { - float base_speed = (GetTypeId() == TYPEID_UNIT ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f); + float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f); float min_speed = base_speed * (minSpeedMod / 100.0f); if (speed < min_speed) speed = min_speed; @@ -14429,7 +14429,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle())) pet = nullptr; - if (pet && pet->GetTypeId() == TYPEID_UNIT && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE) + if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE) pet->UpdateSpeed(mtype, forced); if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID())) critter->UpdateSpeed(mtype, forced); @@ -14544,7 +14544,7 @@ void Unit::setDeathState(DeathState s, bool despawn) bool Unit::CanHaveThreatList() const { // only creatures can have threat list - if (GetTypeId() != TYPEID_UNIT) + if (!IsCreature()) return false; // only alive units can have threat list @@ -14593,7 +14593,7 @@ void Unit::AddThreat(Unit* victim, float fThreat, SpellSchoolMask schoolMask, Sp void Unit::TauntApply(Unit* taunter) { - ASSERT(GetTypeId() == TYPEID_UNIT); + ASSERT(IsCreature()); if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster())) return; @@ -14623,7 +14623,7 @@ void Unit::TauntApply(Unit* taunter) void Unit::TauntFadeOut(Unit* taunter) { - ASSERT(GetTypeId() == TYPEID_UNIT); + ASSERT(IsCreature()); if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster())) return; @@ -14716,7 +14716,7 @@ Unit* Creature::SelectVictim() // it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list // Note: creature does not have targeted movement generator but has attacker in this case for (AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr) - if ((*itr) && CanCreatureAttack(*itr) && (*itr)->GetTypeId() != TYPEID_PLAYER && !(*itr)->ToCreature()->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)) + if ((*itr) && CanCreatureAttack(*itr) && !(*itr)->IsPlayer() && !(*itr)->ToCreature()->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)) return nullptr; if (GetVehicle()) @@ -15000,7 +15000,7 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32& duration, if (group == DIMINISHING_TAUNT) { - if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS)) + if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS)) { DiminishingLevels diminish = Level; switch (diminish) @@ -15027,7 +15027,7 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32& duration, // Some diminishings applies to mobs too (for example, Stun) else if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer())) - || (GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) + || (IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) { DiminishingLevels diminish = Level; @@ -15423,7 +15423,7 @@ void Unit::SetHealth(uint32 val) SetUInt32Value(UNIT_FIELD_HEALTH, val); // mobs that are now or were below 30% need to update their speed - if (GetTypeId() == TYPEID_UNIT && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30))) + if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30))) { UpdateSpeed(MOVE_RUN, false); } @@ -16337,7 +16337,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u case SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK: // Skip melee hits or instant cast spells // xinef: check channeled spells which are affected by haste also - if (procSpellInfo && (procSpellInfo->SpellFamilyName || GetTypeId() != TYPEID_PLAYER) && + if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) && (procSpellInfo->CalcCastTime() > 0 /*|| (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/)) takeCharges = true; @@ -16539,7 +16539,7 @@ Player* Unit::GetSpellModOwner() const void Unit::SendPetActionFeedback(uint8 msg) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; WorldPacket data(SMSG_PET_ACTION_FEEDBACK, 1); @@ -16550,7 +16550,7 @@ void Unit::SendPetActionFeedback(uint8 msg) void Unit::SendPetTalk(uint32 pettalk) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; WorldPacket data(SMSG_PET_ACTION_SOUND, 8 + 4); @@ -16562,7 +16562,7 @@ void Unit::SendPetTalk(uint32 pettalk) void Unit::SendPetAIReaction(ObjectGuid guid) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return; WorldPacket data(SMSG_AI_REACTION, 8 + 4); @@ -17009,7 +17009,7 @@ void Unit::ApplyCastTimePercentMod(float val, bool apply) uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectType damagetype, uint32 CastingTime) const { // Not apply this to creature casted spells with casttime == 0 - if (CastingTime == 0 && GetTypeId() == TYPEID_UNIT && !IsPet()) + if (CastingTime == 0 && IsCreature() && !IsPet()) return 3500; if (CastingTime > 7000) CastingTime = 7000; @@ -17109,7 +17109,7 @@ void Unit::UpdateAuraForGroup(uint8 slot) player->SetAuraUpdateMaskForRaid(slot); } } - else if (GetTypeId() == TYPEID_UNIT && IsPet()) + else if (IsCreature() && IsPet()) { Pet* pet = ((Pet*)this); if (pet->isControlled()) @@ -17148,7 +17148,7 @@ float Unit::CalculateDefaultCoefficient(SpellInfo const* spellInfo, DamageEffect float Unit::GetAPMultiplier(WeaponAttackType attType, bool normalized) { - if (!normalized || GetTypeId() != TYPEID_PLAYER) + if (!normalized || !IsPlayer()) return float(GetAttackTime(attType)) / 1000.0f; Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true); @@ -17216,7 +17216,7 @@ void Unit::SetContestedPvP(Player* attackedPlayer, bool lookForNearContestedGuar void Unit::AddPetAura(PetAura const* petSpell) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return; m_petAuras.insert(petSpell); @@ -17228,7 +17228,7 @@ void Unit::AddPetAura(PetAura const* petSpell) void Unit::RemovePetAura(PetAura const* petSpell) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return; m_petAuras.erase(petSpell); @@ -17257,7 +17257,7 @@ bool Unit::IsPetAura(Aura const* aura) { Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + if (!owner || !owner->IsPlayer()) return false; // if the owner has that pet aura, return true @@ -17270,7 +17270,7 @@ bool Unit::IsPetAura(Aura const* aura) Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget, uint32 spell_id) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return nullptr; Pet* pet = new Pet(ToPlayer(), HUNTER_PET); @@ -17294,7 +17294,7 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget, uint32 spell_id) Pet* Unit::CreateTamedPetFrom(uint32 creatureEntry, uint32 spell_id) { - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return nullptr; CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry); @@ -17828,7 +17828,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp plrVictim->SendDurabilityLoss(); } // Call KilledUnit for creatures - if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled) + if (killer && killer->IsCreature() && killer->IsAIEnabled) killer->ToCreature()->AI()->KilledUnit(victim); // last damage from non duel opponent or opponent controlled creature @@ -17859,7 +17859,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp } // Call KilledUnit for creatures, this needs to be called after the lootable flag is set - if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled) + if (killer && killer->IsCreature() && killer->IsAIEnabled) killer->ToCreature()->AI()->KilledUnit(victim); // Call creature just died function @@ -17925,7 +17925,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp // achievement stuff if (killer && victim->IsPlayer()) { - if (killer->GetTypeId() == TYPEID_UNIT) + if (killer->IsCreature()) victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, killer->GetEntry()); else if (victim != killer && killer->IsPlayer()) victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, killer->ToPlayer()->GetTeamId()); @@ -18013,7 +18013,7 @@ void Unit::SetControlled(bool apply, UnitState state, Unit* source /*= nullptr*/ break; case UNIT_STATE_ROOT: // Prevent creature_template_movement rooted flag from being removed on aura expiration. - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { if (ToCreature()->GetCreatureTemplate()->Movement.Rooted) { @@ -18099,16 +18099,16 @@ void Unit::SetStunned(bool apply) if (IsAlive() && GetVictim()) SetTarget(GetVictim()->GetGUID()); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface) Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted()) + if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted()) RemoveUnitFlag(UNIT_FLAG_STUNNED); // Xinef: same for charmed npcs owner = GetCharmer(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted()) + if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted()) RemoveUnitFlag(UNIT_FLAG_STUNNED); } else @@ -18143,7 +18143,7 @@ void Unit::SetRooted(bool apply, bool isStun) } // Creature specific - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) { if (isStun && movespline->Finalized()) { @@ -18194,7 +18194,7 @@ void Unit::SetRooted(bool apply, bool isStun) void Unit::DisableRotate(bool apply) { - if (GetTypeId() != TYPEID_UNIT) + if (!IsCreature()) return; if (apply) @@ -18359,7 +18359,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au StopAttackingInvalidTarget(); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) { GetMotionMaster()->Clear(false); GetMotionMaster()->MoveIdle(); @@ -18407,7 +18407,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au GetCharmInfo()->InitCharmCreateSpells(); // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers - if (type == CHARM_TYPE_CONVERT && GetTypeId() == TYPEID_UNIT) + if (type == CHARM_TYPE_CONVERT && IsCreature()) ToCreature()->SetReactState(REACT_DEFENSIVE); } } @@ -18431,7 +18431,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au playerCharmer->PossessSpellInitialize(); break; case CHARM_TYPE_CHARM: - if (GetTypeId() == TYPEID_UNIT && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) + if (IsCreature() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) { CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) @@ -18519,7 +18519,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) GetMotionMaster()->InitDefault(); // xinef: remove stunned flag if owner was mounted - if (GetTypeId() == TYPEID_UNIT && !HasUnitState(UNIT_STATE_STUNNED)) + if (IsCreature() && !HasUnitState(UNIT_STATE_STUNNED)) RemoveUnitFlag(UNIT_FLAG_STUNNED); // If charmer still exists @@ -18527,7 +18527,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) return; ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer()); - ASSERT(type != CHARM_TYPE_VEHICLE || (GetTypeId() == TYPEID_UNIT && IsVehicle())); + ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle())); charmer->SetCharm(this, false); @@ -18553,7 +18553,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) ClearUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); break; case CHARM_TYPE_CHARM: - if (GetTypeId() == TYPEID_UNIT && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) + if (IsCreature() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM)) { CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate(); if (cinfo && cinfo->type == CREATURE_TYPE_DEMON) @@ -18608,7 +18608,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) playerCharmer->SendRemoveControlBar(); // xinef: Always delete charm info (restores react state) - if (IsPlayer() || (GetTypeId() == TYPEID_UNIT && !ToCreature()->IsGuardian())) + if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian())) DeleteCharmInfo(); } @@ -18704,11 +18704,11 @@ bool Unit::IsInPartyWith(Unit const* unit) const if (u1->IsPlayer() && u2->IsPlayer()) return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer()); // Xinef: we assume that npcs with the same faction are in party - else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) + else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) return u1->GetFaction() == u2->GetFaction(); // Xinef: creature type_flag should work for party check only if player group is not a raid - else if ((u2->IsPlayer() && u1->GetTypeId() == TYPEID_UNIT && (u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u2->ToPlayer()->GetGroup() && !u2->ToPlayer()->GetGroup()->isRaidGroup()) || - (u1->IsPlayer() && u2->GetTypeId() == TYPEID_UNIT && (u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u1->ToPlayer()->GetGroup() && !u1->ToPlayer()->GetGroup()->isRaidGroup())) + else if ((u2->IsPlayer() && u1->IsCreature() && (u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u2->ToPlayer()->GetGroup() && !u2->ToPlayer()->GetGroup()->isRaidGroup()) || + (u1->IsPlayer() && u2->IsCreature() && (u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) && u1->ToPlayer()->GetGroup() && !u1->ToPlayer()->GetGroup()->isRaidGroup())) return true; else return false; @@ -18727,10 +18727,10 @@ bool Unit::IsInRaidWith(Unit const* unit) const if (u1->IsPlayer() && u2->IsPlayer()) return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer()); // Xinef: we assume that npcs with the same faction are in party - else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) + else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer()) return u1->GetFaction() == u2->GetFaction(); - else if ((u2->IsPlayer() && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) || - (u1->IsPlayer() && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)) + else if ((u2->IsPlayer() && u1->IsCreature() && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) || + (u1->IsPlayer() && u2->IsCreature() && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)) return true; else return false; @@ -18847,13 +18847,13 @@ void Unit::SendPlaySpellImpact(ObjectGuid guid, uint32 id) void Unit::ApplyResilience(Unit const* victim, float* crit, int32* damage, bool isCrit, CombatRating type) { // player mounted on multi-passenger mount is also classified as vehicle - if (victim->IsVehicle() && victim->GetTypeId() != TYPEID_PLAYER) + if (victim->IsVehicle() && !victim->IsPlayer()) return; Unit const* target = nullptr; if (victim->IsPlayer()) target = victim; - else if (victim->GetTypeId() == TYPEID_UNIT) + else if (victim->IsCreature()) { if (Unit* owner = victim->GetOwner()) if (owner->IsPlayer()) @@ -18981,7 +18981,7 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) return; // modify hostile references for new phasemask, some special cases deal with hostile references themselves - if (GetTypeId() == TYPEID_UNIT || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout())) + if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout())) { HostileRefMgr& refMgr = getHostileRefMgr(); HostileReference* ref = refMgr.getFirst(); @@ -18996,7 +18996,7 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) } // modify threat lists for new phasemask - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) { ThreatContainer::StorageType threatList = GetThreatMgr().GetThreatList(); ThreatContainer::StorageType offlineThreatList = GetThreatMgr().GetOfflineThreatList(); @@ -19024,7 +19024,7 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) { Unit* controlled = *itr; ++itr; - if (controlled->GetTypeId() == TYPEID_UNIT) + if (controlled->IsCreature()) { controlled->SetPhaseMask(newPhaseMask, true); } @@ -19310,7 +19310,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const if (formEntry && formEntry->modelID_A) { // Take the alliance modelid as default - if (GetTypeId() != TYPEID_PLAYER) + if (!IsPlayer()) return formEntry->modelID_A; else { @@ -19434,7 +19434,7 @@ Unit* Unit::GetRedirectThreatTarget() const void Unit::JumpTo(float speedXY, float speedZ, bool forward) { float angle = forward ? 0 : M_PI; - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ); else { @@ -19771,7 +19771,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) } // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest - if (GetTypeId() == TYPEID_UNIT && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298)) + if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298)) { GetMotionMaster()->MoveFall(); } @@ -19783,7 +19783,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) { vehicle->Dismiss(); } - else if (vehicleBase->GetTypeId() == TYPEID_UNIT) + else if (vehicleBase->IsCreature()) { vehicle->Uninstall(); vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000)); @@ -19928,7 +19928,7 @@ void Unit::SendTameFailure(uint8 result) void Unit::SendTeleportPacket(Position& pos) { Position oldPos = { GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation() }; - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) Relocate(&pos); if (IsPlayer()) { @@ -19937,7 +19937,7 @@ void Unit::SendTeleportPacket(Position& pos) WorldPacket data2(MSG_MOVE_TELEPORT, 38); data2 << GetPackGUID(); BuildMovementPacket(&data2); - if (GetTypeId() == TYPEID_UNIT) + if (IsCreature()) Relocate(&oldPos); if (IsPlayer()) Relocate(&pos); @@ -20250,7 +20250,7 @@ uint32 Unit::GetResistance(SpellSchoolMask mask) const void Unit::PetSpellFail(SpellInfo const* spellInfo, Unit* target, uint32 result) { CharmInfo* charmInfo = GetCharmInfo(); - if (!charmInfo || GetTypeId() != TYPEID_UNIT) + if (!charmInfo || !IsCreature()) return; if ((DisableMgr::IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target) @@ -20300,7 +20300,7 @@ void Unit::PetSpellFail(SpellInfo const* spellInfo, Unit* target, uint32 result) int32 Unit::CalculateAOEDamageReduction(int32 damage, uint32 schoolMask, Unit* caster) const { damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask)); - if (caster && caster->GetTypeId() == TYPEID_UNIT) + if (caster && caster->IsCreature()) damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE, schoolMask)); return damage; @@ -20592,7 +20592,7 @@ bool Unit::SetHover(bool enable, bool /*packetOnly = false*/, bool /*updateAnima else { RemoveUnitMovementFlag(MOVEMENTFLAG_HOVER); - if (hoverHeight && (!isDying() || GetTypeId() != TYPEID_UNIT)) + if (hoverHeight && (!isDying() || !IsCreature())) { float newZ = std::max(GetFloorZ(), GetPositionZ() - hoverHeight); UpdateAllowedPositionZ(GetPositionX(), GetPositionY(), newZ); @@ -20861,7 +20861,7 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !! }// pussywizard / Callmephil else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() && - (this->IsPlayer() || this->GetTypeId() == TYPEID_UNIT || this->IsDynamicObject())) + (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject())) { valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY } @@ -20879,7 +20879,7 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction())); }// pussywizard / Callmephil else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() && - (this->IsPlayer() || this->GetTypeId() == TYPEID_UNIT || this->IsDynamicObject())) + (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject())) { valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction())); } diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 22952cd67..ca5bbbd34 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -67,7 +67,7 @@ Vehicle::~Vehicle() void Vehicle::Install() { - if (_me->GetTypeId() == TYPEID_UNIT) + if (_me->IsCreature()) { if (PowerDisplayEntry const* powerDisplay = sPowerDisplayStore.LookupEntry(_vehicleInfo->m_powerDisplayId)) _me->setPowerType(Powers(powerDisplay->PowerType)); @@ -76,7 +76,7 @@ void Vehicle::Install() } _status = STATUS_INSTALLED; - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnInstall(this); } @@ -107,7 +107,7 @@ void Vehicle::Uninstall() LOG_DEBUG("vehicles", "Vehicle::Uninstall {}", _me->GetGUID().ToString()); RemoveAllPassengers(); - if (_me && _me->GetTypeId() == TYPEID_UNIT) + if (_me && _me->IsCreature()) { sScriptMgr->OnUninstall(this); } @@ -129,7 +129,7 @@ void Vehicle::Reset(bool evading /*= false*/) _me->SetNpcFlag(UNIT_NPC_FLAG_SPELLCLICK); } - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnReset(this); } @@ -274,8 +274,8 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ // already installed if (passenger->GetEntry() == entry) { - ASSERT(passenger->GetTypeId() == TYPEID_UNIT); - if (_me->GetTypeId() == TYPEID_UNIT) + ASSERT(passenger->IsCreature()); + if (_me->IsCreature()) { if (_me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled) passenger->ToCreature()->AI()->EnterEvadeMode(); @@ -297,7 +297,7 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ return; } - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnInstallAccessory(this, accessory); } } @@ -382,7 +382,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) unit->m_movementInfo.transport.guid = _me->GetGUID(); // xinef: removed seat->first == 0 check... - if (_me->GetTypeId() == TYPEID_UNIT + if (_me->IsCreature() && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) { @@ -424,14 +424,14 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) init.SetTransportEnter(); init.Launch(); - if (_me->GetTypeId() == TYPEID_UNIT) + if (_me->IsCreature()) { if (_me->ToCreature()->IsAIEnabled) _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true); } } - if (GetBase()->GetTypeId() == TYPEID_UNIT) + if (GetBase()->IsCreature()) sScriptMgr->OnAddPassenger(this, unit, seatId); // Remove parachute on vehicle switch @@ -468,7 +468,7 @@ void Vehicle::RemovePassenger(Unit* unit) seat->second.Passenger.Reset(); - if (_me->GetTypeId() == TYPEID_UNIT && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + if (_me->IsCreature() && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) _me->RemoveCharmedBy(unit); if (_me->IsInWorld()) @@ -486,10 +486,10 @@ void Vehicle::RemovePassenger(Unit* unit) if (_me->IsFlying() && !_me->GetInstanceId() && unit->IsPlayer() && !(unit->ToPlayer()->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT) && _me->GetEntry() != 30275 /*NPC_WILD_WYRM*/) _me->CastSpell(unit, VEHICLE_SPELL_PARACHUTE, true); - if (_me->GetTypeId() == TYPEID_UNIT) + if (_me->IsCreature()) sScriptMgr->OnRemovePassenger(this, unit); - if (_me->GetTypeId() == TYPEID_UNIT && _me->ToCreature()->IsAIEnabled) + if (_me->IsCreature() && _me->ToCreature()->IsAIEnabled) _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false); } @@ -520,7 +520,7 @@ void Vehicle::RelocatePassengers() void Vehicle::Dismiss() { - if (GetBase()->GetTypeId() != TYPEID_UNIT) + if (!GetBase()->IsCreature()) return; LOG_DEBUG("vehicles", "Vehicle::Dismiss {}", _me->GetGUID().ToString()); @@ -535,7 +535,7 @@ bool Vehicle::IsVehicleInUse() { if (passenger->IsPlayer()) return true; - else if (passenger->GetTypeId() == TYPEID_UNIT && passenger->GetVehicleKit() && passenger->GetVehicleKit()->IsVehicleInUse()) + else if (passenger->IsCreature() && passenger->GetVehicleKit() && passenger->GetVehicleKit()->IsVehicleInUse()) return true; } @@ -556,7 +556,7 @@ void Vehicle::TeleportVehicle(float x, float y, float z, float ang) passenger->NearTeleportTo(x, y, z, ang, false, true); passenger->ToPlayer()->ScheduleDelayedOperation(DELAYED_VEHICLE_TELEPORT); } - else if (passenger->GetTypeId() == TYPEID_UNIT && passenger->GetVehicleKit()) + else if (passenger->IsCreature() && passenger->GetVehicleKit()) passenger->GetVehicleKit()->TeleportVehicle(x, y, z, ang); } } diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index d3e1e89b2..e238a3061 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -91,7 +91,7 @@ namespace Acore { Unit& i_unit; bool isCreature; - explicit AIRelocationNotifier(Unit& unit) : i_unit(unit), isCreature(unit.GetTypeId() == TYPEID_UNIT) {} + explicit AIRelocationNotifier(Unit& unit) : i_unit(unit), isCreature(unit.IsCreature()) {} template void Visit(GridRefMgr&) {} void Visit(CreatureMapType&); }; @@ -864,7 +864,7 @@ namespace Acore bool operator()(Unit* u) { if (u->IsAlive() && !u->IsCritter() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u) && - (i_funit->GetTypeId() != TYPEID_UNIT || !i_funit->ToCreature()->IsAvoidingAOE())) // pussywizard + (!i_funit->IsCreature() || !i_funit->ToCreature()->IsAvoidingAOE())) // pussywizard return true; else return false; @@ -887,7 +887,7 @@ namespace Acore if (u->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) return false; - if (u->GetTypeId() == TYPEID_UNIT && (u->ToCreature()->IsTotem() || u->ToCreature()->IsTrigger() || u->ToCreature()->IsAvoidingAOE())) // pussywizard: added IsAvoidingAOE() + if (u->IsCreature() && (u->ToCreature()->IsTotem() || u->ToCreature()->IsTrigger() || u->ToCreature()->IsAvoidingAOE())) // pussywizard: added IsAvoidingAOE() return false; if (!u->isTargetableForAttack(false, i_funit)) @@ -918,7 +918,7 @@ namespace Acore return false; } - if (u->GetTypeId() == TYPEID_UNIT && u->ToCreature()->IsTotem()) + if (u->IsCreature() && u->ToCreature()->IsTotem()) { return false; } @@ -930,7 +930,7 @@ namespace Acore uint32 losChecks = LINEOFSIGHT_ALL_CHECKS; Optional collisionHeight = { }; - if (i_obj->GetTypeId() == TYPEID_GAMEOBJECT) + if (i_obj->IsGameObject()) { losChecks &= ~LINEOFSIGHT_CHECK_GOBJECT_M2; collisionHeight = i_owner->GetCollisionHeight(); @@ -1203,7 +1203,7 @@ namespace Acore if (!me->IsValidAttackTarget(u)) return false; - if (i_playerOnly && u->GetTypeId() != TYPEID_PLAYER) + if (i_playerOnly && !u->IsPlayer()) return false; m_range = me->GetDistance(u); // use found unit range as new range limit for next check diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index d1691c325..f5c3df9b8 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -791,7 +791,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, unit); //Send scripted event call - if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI()) + if (unit && unit->IsCreature() && ((Creature*)unit)->AI()) ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote); } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index fe432e186..ef7560e76 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -410,7 +410,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) } movementInfo.pos.Relocate(mover->GetPositionX(), mover->GetPositionY(), mover->GetPositionZ()); - if (mover->GetTypeId() == TYPEID_UNIT) + if (mover->IsCreature()) { movementInfo.transport.guid = mover->m_movementInfo.transport.guid; movementInfo.transport.pos.Relocate(mover->m_movementInfo.transport.pos.GetPositionX(), mover->m_movementInfo.transport.pos.GetPositionY(), mover->m_movementInfo.transport.pos.GetPositionZ()); diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 8368c8723..af53948ca 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -50,7 +50,7 @@ void WorldSession::HandleDismissCritter(WorldPackets::Pet::DismissCritter& packe if (_player->GetCritterGUID() == pet->GetGUID()) { - if (pet->GetTypeId() == TYPEID_UNIT && pet->ToCreature()->IsSummon()) + if (pet->IsCreature() && pet->ToCreature()->IsSummon()) pet->ToTempSummon()->UnSummon(); } } @@ -234,7 +234,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe // Not let attack through obstructions bool checkLos = !DisableMgr::IsPathfindingEnabled(pet->GetMap()) || - (TargetUnit->GetTypeId() == TYPEID_UNIT && (TargetUnit->ToCreature()->isWorldBoss() || TargetUnit->ToCreature()->IsDungeonBoss())); + (TargetUnit->IsCreature() && (TargetUnit->ToCreature()->isWorldBoss() || TargetUnit->ToCreature()->IsDungeonBoss())); if (checkLos && !pet->IsWithinLOSInMap(TargetUnit)) { @@ -252,7 +252,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe { pet->AttackStop(); - if (pet->GetTypeId() != TYPEID_PLAYER && pet->ToCreature()->IsAIEnabled) + if (!pet->IsPlayer() && pet->ToCreature()->IsAIEnabled) { charmInfo->SetIsCommandAttack(true); charmInfo->SetIsAtStay(false); @@ -292,7 +292,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe } else if (pet->GetOwnerGUID() == GetPlayer()->GetGUID()) { - ASSERT(pet->GetTypeId() == TYPEID_UNIT); + ASSERT(pet->IsCreature()); if (pet->IsPet()) { if (pet->ToPet()->getPetType() == HUNTER_PET) @@ -323,7 +323,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe case REACT_DEFENSIVE: //recovery case REACT_AGGRESSIVE: //activete - if (pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsCreature()) pet->ToCreature()->SetReactState(ReactStates(spellId)); else charmInfo->SetPlayerReactState(ReactStates(spellId)); @@ -491,7 +491,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe if (pet->GetVictim()) pet->AttackStop(); - if (pet->GetTypeId() != TYPEID_PLAYER && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) + if (!pet->IsPlayer() && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) { charmInfo->SetIsCommandAttack(true); charmInfo->SetIsAtStay(false); @@ -537,7 +537,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe else victim = nullptr; - if (pet->GetTypeId() != TYPEID_PLAYER && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) + if (!pet->IsPlayer() && pet->ToCreature() && pet->ToCreature()->IsAIEnabled) { pet->StopMoving(); pet->GetMotionMaster()->Clear(); @@ -775,7 +775,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData) //sign for autocast if (act_state == ACT_ENABLED) { - if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet()) + if (pet->IsCreature() && pet->IsPet()) { ((Pet*)pet)->ToggleAutocast(spellInfo, true); } @@ -793,7 +793,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData) //sign for no/turn off autocast else if (act_state == ACT_DISABLED) { - if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet()) + if (pet->IsCreature() && pet->IsPet()) { ((Pet*)pet)->ToggleAutocast(spellInfo, false); } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 120424711..4933dc6ef 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -123,7 +123,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData) Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM | TYPEMASK_PLAYER); // no or incorrect quest giver - if (!object || object == _player || (object->GetTypeId() != TYPEID_PLAYER && !object->hasQuest(questId)) || + if (!object || object == _player || (!object->IsPlayer() && !object->hasQuest(questId)) || (object->IsPlayer() && !object->ToPlayer()->CanShareQuest(questId))) { _player->PlayerTalkClass->SendCloseGossip(); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index a373d5bf7..e93215587 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -409,7 +409,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if (Vehicle* veh = mover->GetVehicleKit()) if (const VehicleSeatEntry* seat = veh->GetSeatForPassenger(_player)) if (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK || spellInfo->Effects[EFFECT_0].Effect == SPELL_EFFECT_OPEN_LOCK /*allow looting from vehicle, but only if player has required spell (all necessary opening spells are in playercreateinfo_spell)*/) - if ((mover->GetTypeId() == TYPEID_UNIT && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) // the creature can't cast that spell, check player instead + if ((mover->IsCreature() && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) // the creature can't cast that spell, check player instead { if( !(spellInfo->Targets & TARGET_FLAG_GAMEOBJECT_ITEM) && (!_player->HasActiveSpell (spellId) || spellInfo->IsPassive()) ) { @@ -419,12 +419,12 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) } // at this point, player is a valid caster - // swapping the mover will stop the check below at == TYPEID_UNIT, so everything works fine + // swapping the mover will stop the check below at IsUnit, so everything works fine mover = _player; } // not have spell in spellbook or spell passive and not casted by client - if ((mover->GetTypeId() == TYPEID_UNIT && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) + if ((mover->IsCreature() && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) { //cheater? kick? ban? recvPacket.rfinish(); // prevent spam at ignore packet diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 0c0581192..122257c15 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -679,7 +679,7 @@ void InstanceScript::DoCastSpellOnPlayer(Player* player, uint32 spell, bool incl for (auto itr2 = player->m_Controlled.begin(); itr2 != player->m_Controlled.end(); ++itr2) { if (Unit* controlled = *itr2) - if (controlled->IsInWorld() && controlled->GetTypeId() == TYPEID_UNIT) + if (controlled->IsInWorld() && controlled->IsCreature()) controlled->CastSpell(player, spell, true); } } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index f2d298624..ec3dffb8f 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -587,7 +587,7 @@ bool Map::AddToMap(T* obj, bool checkTransport) obj->AddToWorld(); if (checkTransport) - if (!(obj->GetTypeId() == TYPEID_GAMEOBJECT && obj->ToGameObject()->IsTransport())) // dont add transport to transport ;d + if (!(obj->IsGameObject() && obj->ToGameObject()->IsTransport())) // dont add transport to transport ;d if (Transport* transport = GetTransportForPos(obj->GetPhaseMask(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj)) transport->AddPassenger(obj, true); @@ -602,7 +602,7 @@ bool Map::AddToMap(T* obj, bool checkTransport) // Xinef: little hack for vehicles, accessories have to be added after visibility update so they wont fall off the vehicle, moved from Creature::AIM_Initialize // Initialize vehicle, this is done only for summoned npcs, DB creatures are handled by grid loaders - if (obj->GetTypeId() == TYPEID_UNIT) + if (obj->IsCreature()) if (Vehicle* vehicle = obj->ToCreature()->GetVehicleKit()) vehicle->Reset(); return true; @@ -2662,8 +2662,8 @@ void Map::AddObjectToSwitchList(WorldObject* obj, bool on) { ASSERT(obj->GetMapId() == GetId() && obj->GetInstanceId() == GetInstanceId()); // i_objectsToSwitch is iterated only in Map::RemoveAllObjectsInRemoveList() and it uses - // the contained objects only if GetTypeId() == TYPEID_UNIT , so we can return in all other cases - if (obj->GetTypeId() != TYPEID_UNIT && obj->GetTypeId() != TYPEID_GAMEOBJECT) + // the contained objects only if IsCreature() , so we can return in all other cases + if (!obj->IsCreature() && !obj->IsGameObject()) return; std::map::iterator itr = i_objectsToSwitch.find(obj); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 84167be22..39b8aa717 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -244,7 +244,7 @@ void MotionMaster::MoveRandom(float wanderDistance) if (_owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) return; - if (_owner->GetTypeId() == TYPEID_UNIT) + if (_owner->IsCreature()) { LOG_DEBUG("movement.motionmaster", "Creature ({}) start moving random", _owner->GetGUID().ToString()); Mutate(new RandomMovementGenerator(wanderDistance), MOTION_SLOT_IDLE); @@ -260,12 +260,12 @@ void MotionMaster::MoveTargetedHome(bool walk /*= false*/) { Clear(false); - if (_owner->GetTypeId() == TYPEID_UNIT && !_owner->ToCreature()->GetCharmerOrOwnerGUID()) + if (_owner->IsCreature() && !_owner->ToCreature()->GetCharmerOrOwnerGUID()) { LOG_DEBUG("movement.motionmaster", "Creature ({}) targeted home", _owner->GetGUID().ToString()); Mutate(new HomeMovementGenerator(walk), MOTION_SLOT_ACTIVE); } - else if (_owner->GetTypeId() == TYPEID_UNIT && _owner->ToCreature()->GetCharmerOrOwnerGUID()) + else if (_owner->IsCreature() && _owner->ToCreature()->GetCharmerOrOwnerGUID()) { _owner->ClearUnitState(UNIT_STATE_EVADE); @@ -645,7 +645,7 @@ void MotionMaster::MoveFall(uint32 id /*=0*/, bool addFlagForNPC) _owner->m_movementInfo.SetFallTime(0); _owner->ToPlayer()->SetFallInformation(GameTime::GetGameTime().count(), _owner->GetPositionZ()); } - else if (_owner->GetTypeId() == TYPEID_UNIT && addFlagForNPC) // pussywizard + else if (_owner->IsCreature() && addFlagForNPC) // pussywizard { _owner->RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING); _owner->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY); diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp index 5f64daef3..c1505f9af 100644 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp @@ -72,7 +72,7 @@ bool RotateMovementGenerator::Update(Unit* owner, uint32 diff) void RotateMovementGenerator::Finalize(Unit* unit) { unit->ClearUnitState(UNIT_STATE_ROTATING); - if (unit->GetTypeId() == TYPEID_UNIT) + if (unit->IsCreature()) unit->ToCreature()->AI()->MovementInform(ROTATE_MOTION_TYPE, 0); } @@ -90,7 +90,7 @@ void DistractMovementGenerator::Finalize(Unit* owner) owner->ClearUnitState(UNIT_STATE_DISTRACTED); // If this is a creature, then return orientation to original position (for idle movement creatures) - if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()) + if (owner->IsCreature() && owner->ToCreature()) { float angle = owner->ToCreature()->GetHomePosition().GetOrientation(); owner->SetFacingTo(angle); diff --git a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp index ebe4934f8..4ec46038c 100644 --- a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp @@ -636,7 +636,7 @@ void PathGenerator::CreateFilter() uint16 includeFlags = 0; uint16 excludeFlags = 0; - if (_source->GetTypeId() == TYPEID_UNIT) + if (_source->IsCreature()) { Creature* creature = (Creature*)_source; if (creature->CanWalk()) diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index b3b43a572..e77fd9107 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -231,10 +231,10 @@ bool EffectMovementGenerator::Update(Unit* unit, uint32) void EffectMovementGenerator::Finalize(Unit* unit) { - if (unit->GetTypeId() != TYPEID_UNIT) + if (!unit->IsCreature()) return; - if (unit->GetTypeId() == TYPEID_UNIT && unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) && unit->movespline->isFalling()) // pussywizard + if (unit->IsCreature() && unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) && unit->movespline->isFalling()) // pussywizard unit->RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); // Need restore previous movement since we have no proper states system diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 015f93650..59a97bc9e 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -305,7 +305,7 @@ void ChaseMovementGenerator::DoReset(T* owner) template void ChaseMovementGenerator::MovementInform(T* owner) { - if (owner->GetTypeId() != TYPEID_UNIT) + if (!owner->IsCreature()) return; // Pass back the GUIDLow of the target. If it is pet's owner then PetAI will handle @@ -385,7 +385,7 @@ bool FollowMovementGenerator::PositionOkay(Unit* target, bool isPlayerPet, bo float exactDistSq = target->GetExactDistSq(_lastTargetPosition->GetPositionX(), _lastTargetPosition->GetPositionY(), _lastTargetPosition->GetPositionZ()); float distanceTolerance = 0.25f; // For creatures, increase tolerance - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) { distanceTolerance += _range + _range; } @@ -554,7 +554,7 @@ void FollowMovementGenerator::DoReset(T* owner) template void FollowMovementGenerator::MovementInform(T* owner) { - if (owner->GetTypeId() != TYPEID_UNIT) + if (!owner->IsCreature()) return; // Pass back the GUIDLow of the target. If it is pet's owner then PetAI will handle diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 44df2047c..2fc354e01 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -513,7 +513,7 @@ void OutdoorPvP::HandleKill(Player* killer, Unit* killed) // creature kills must be notified, even if not inside objective / not outdoor pvp active // player kills only count if active and inside objective - if ((groupGuy->IsOutdoorPvPActive() && IsInsideObjective(groupGuy)) || killed->GetTypeId() == TYPEID_UNIT) + if ((groupGuy->IsOutdoorPvPActive() && IsInsideObjective(groupGuy)) || killed->IsCreature()) { HandleKillImpl(groupGuy, killed); } @@ -522,7 +522,7 @@ void OutdoorPvP::HandleKill(Player* killer, Unit* killed) else { // creature kills must be notified, even if not inside objective / not outdoor pvp active - if ((killer->IsOutdoorPvPActive() && IsInsideObjective(killer)) || killed->GetTypeId() == TYPEID_UNIT) + if ((killer->IsOutdoorPvPActive() && IsInsideObjective(killer)) || killed->IsCreature()) { HandleKillImpl(killer, killed); } diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index fe945d719..ebf2d3daa 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -157,7 +157,7 @@ inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, const ScriptInfo* s Unit* unit = nullptr; if (!obj) LOG_ERROR("maps.script", "{} {} object is nullptr.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target"); - else if (!obj->isType(TYPEMASK_UNIT)) + else if (!obj->IsUnit()) LOG_ERROR("maps.script", "{} {} object is not unit (TypeId: {}, Entry: {}, GUID: {}), skipping.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target", obj->GetTypeId(), obj->GetEntry(), obj->GetGUID().ToString()); else @@ -236,7 +236,7 @@ inline void Map::_ScriptProcessDoor(Object* source, Object* target, const Script LOG_ERROR("maps.script", "{} door guid is not specified.", scriptInfo->GetDebugInfo()); else if (!source) LOG_ERROR("maps.script", "{} source object is nullptr.", scriptInfo->GetDebugInfo()); - else if (!source->isType(TYPEMASK_UNIT)) + else if (!source->IsUnit()) LOG_ERROR("maps.script", "{} source object is not unit ({}), skipping.", scriptInfo->GetDebugInfo(), source->GetGUID().ToString()); else { @@ -510,7 +510,7 @@ void Map::ScriptsProcess() Player* player = target->ToPlayer(); if (player) { - if (source->GetTypeId() != TYPEID_UNIT && source->GetTypeId() != TYPEID_GAMEOBJECT && source->GetTypeId() != TYPEID_PLAYER) + if (!source->IsCreature() && !source->IsGameObject() && !source->IsPlayer()) { LOG_ERROR("maps.script", "{} source is not unit, gameobject or player ({}), skipping.", step.script->GetDebugInfo(), source->GetGUID().ToString()); break; @@ -522,7 +522,7 @@ void Map::ScriptsProcess() player = source->ToPlayer(); if (player) { - if (target->GetTypeId() != TYPEID_UNIT && target->GetTypeId() != TYPEID_GAMEOBJECT && target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsCreature() && !target->IsGameObject() && !target->IsPlayer()) { LOG_ERROR("maps.script", "{} target is not unit, gameobject or player ({}), skipping.", step.script->GetDebugInfo(), target->GetGUID().ToString()); break; @@ -538,7 +538,7 @@ void Map::ScriptsProcess() } // quest id and flags checked at script loading - if ((worldObject->GetTypeId() != TYPEID_UNIT || ((Unit*)worldObject)->IsAlive()) && + if ((!worldObject->IsCreature() || ((Unit*)worldObject)->IsAlive()) && (step.script->QuestExplored.Distance == 0 || worldObject->IsWithinDistInMap(player, float(step.script->QuestExplored.Distance)))) player->GroupEventHappens(step.script->QuestExplored.QuestID, worldObject); else @@ -641,7 +641,7 @@ void Map::ScriptsProcess() break; } - if (target->GetTypeId() != TYPEID_GAMEOBJECT) + if (!target->IsGameObject()) { LOG_ERROR("maps.script", "{} target object is not gameobject ({}), skipping.", step.script->GetDebugInfo(), target->GetGUID().ToString()); break; @@ -697,13 +697,13 @@ void Map::ScriptsProcess() break; } - if (!uSource || !uSource->isType(TYPEMASK_UNIT)) + if (!uSource || !uSource->IsUnit()) { LOG_ERROR("maps.script", "{} no source unit found for spell {}", step.script->GetDebugInfo(), step.script->CastSpell.SpellID); break; } - if (!uTarget || !uTarget->isType(TYPEMASK_UNIT)) + if (!uTarget || !uTarget->IsUnit()) { LOG_ERROR("maps.script", "{} no target unit found for spell {}", step.script->GetDebugInfo(), step.script->CastSpell.SpellID); break; diff --git a/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp b/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp index ae58a8cd5..590050f4d 100644 --- a/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp @@ -22,7 +22,7 @@ void ScriptMgr::OnInstall(Vehicle* veh) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) { @@ -33,7 +33,7 @@ void ScriptMgr::OnInstall(Vehicle* veh) void ScriptMgr::OnUninstall(Vehicle* veh) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) { @@ -44,7 +44,7 @@ void ScriptMgr::OnUninstall(Vehicle* veh) void ScriptMgr::OnReset(Vehicle* veh) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) { @@ -55,7 +55,7 @@ void ScriptMgr::OnReset(Vehicle* veh) void ScriptMgr::OnInstallAccessory(Vehicle* veh, Creature* accessory) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); ASSERT(accessory); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) @@ -67,7 +67,7 @@ void ScriptMgr::OnInstallAccessory(Vehicle* veh, Creature* accessory) void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); ASSERT(passenger); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) @@ -79,7 +79,7 @@ void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId) void ScriptMgr::OnRemovePassenger(Vehicle* veh, Unit* passenger) { ASSERT(veh); - ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT); + ASSERT(veh->GetBase()->IsCreature()); ASSERT(passenger); if (auto tempScript = ScriptRegistry::GetScriptById(veh->GetBase()->ToCreature()->GetScriptId())) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 92a3021a1..acb108952 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -798,7 +798,7 @@ void AuraEffect::HandleEffect(Unit* target, uint8 mode, bool apply) void AuraEffect::ApplySpellMod(Unit* target, bool apply) { - if (!m_spellmod || target->GetTypeId() != TYPEID_PLAYER) + if (!m_spellmod || !target->IsPlayer()) return; target->ToPlayer()->AddSpellMod(m_spellmod, apply); @@ -951,7 +951,7 @@ void AuraEffect::UpdatePeriodic(Unit* caster) case 49472: // Drink Coffee case 57073: case 61830: - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; // Get SPELL_AURA_MOD_POWER_REGEN aura from spell if (AuraEffect* aurEff = GetBase()->GetEffect(0)) @@ -1712,7 +1712,7 @@ void AuraEffect::HandleDetectAmore(AuraApplication const* aurApp, uint8 mode, bo } Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) { return; } @@ -1744,7 +1744,7 @@ void AuraEffect::HandleSpiritOfRedemption(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // prepare spirit state @@ -1779,7 +1779,7 @@ void AuraEffect::HandleAuraGhost(AuraApplication const* aurApp, uint8 mode, bool Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (apply) @@ -2178,7 +2178,7 @@ void AuraEffect::HandleAuraTransform(AuraApplication const* aurApp, uint8 mode, // Orb of Deception case 16739: { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; switch (target->getRace()) @@ -2237,7 +2237,7 @@ void AuraEffect::HandleAuraTransform(AuraApplication const* aurApp, uint8 mode, // Corsair Costume case 51926: { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; switch (target->getRace()) @@ -2811,7 +2811,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (Player* targetPlayer = target->ToPlayer()) @@ -2842,7 +2842,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo if ((*iter)->GetCurrentSpell(i) && (*iter)->GetCurrentSpell(i)->m_targets.GetUnitTargetGUID() == target->GetGUID()) { SpellInfo const* si = (*iter)->GetCurrentSpell(i)->GetSpellInfo(); - if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->GetTypeId() == TYPEID_UNIT) + if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->IsCreature()) { Creature* c = (*iter)->ToCreature(); if ((!c->IsPet() && c->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS) || c->isWorldBoss() || c->IsDungeonBoss()) @@ -3009,7 +3009,7 @@ void AuraEffect::HandleAuraModDisarm(AuraApplication const* aurApp, uint8 mode, if (apply) target->SetFlag(field, flag); - if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->GetCurrentEquipmentId()) + if (target->IsCreature() && target->ToCreature()->GetCurrentEquipmentId()) target->UpdateDamagePhysical(attType); } @@ -3112,7 +3112,7 @@ void AuraEffect::HandleAuraTrackCreatures(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (apply) @@ -3128,7 +3128,7 @@ void AuraEffect::HandleAuraTrackResources(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (apply) @@ -3144,7 +3144,7 @@ void AuraEffect::HandleAuraTrackStealthed(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (!(apply)) @@ -3206,7 +3206,7 @@ void AuraEffect::HandleAuraModPetTalentsPoints(AuraApplication const* aurApp, ui Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Recalculate pet talent points @@ -3220,7 +3220,7 @@ void AuraEffect::HandleAuraModSkill(AuraApplication const* aurApp, uint8 mode, b return; Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; uint32 prot = GetMiscValue(); @@ -3318,7 +3318,7 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode target->SetCanFly(apply); - if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) + if (!apply && target->IsCreature() && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } @@ -3444,7 +3444,7 @@ void AuraEffect::HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); - if (!target->IsAlive() || target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsAlive() || !target->IsPlayer()) return; Unit* caster = GetCaster(); @@ -3547,7 +3547,7 @@ void AuraEffect::HandleModPossess(AuraApplication const* aurApp, uint8 mode, boo Unit* caster = GetCaster(); // no support for posession AI yet - if (caster && caster->GetTypeId() == TYPEID_UNIT) + if (caster && caster->IsCreature()) { HandleModCharm(aurApp, mode, apply); return; @@ -3567,7 +3567,7 @@ void AuraEffect::HandleModPossessPet(AuraApplication const* aurApp, uint8 mode, return; Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; //seems it may happen that when removing it is no longer owner's pet @@ -3575,7 +3575,7 @@ void AuraEffect::HandleModPossessPet(AuraApplication const* aurApp, uint8 mode, // return; Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT || !target->IsPet()) + if (!target->IsCreature() || !target->IsPet()) return; Pet* pet = target->ToPet(); @@ -3675,7 +3675,7 @@ void AuraEffect::HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 m if (GetId() == 53111) // Devour Humanoid { Unit::Kill(target, caster); - if (caster->GetTypeId() == TYPEID_UNIT) + if (caster->IsCreature()) caster->ToCreature()->RemoveCorpse(); } @@ -3725,7 +3725,7 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, { target->SetCanFly(apply); - if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) + if (!apply && target->IsCreature() && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } @@ -4464,8 +4464,8 @@ void AuraEffect::HandleModPercentStat(AuraApplication const* aurApp, uint8 mode, return; } - // only players have base stats - if (target->GetTypeId() != TYPEID_PLAYER) + // only players currently use base stats + if (!target->IsPlayer()) return; for (int32 i = STAT_STRENGTH; i < MAX_STATS; ++i) @@ -4482,7 +4482,7 @@ void AuraEffect::HandleModSpellDamagePercentFromStat(AuraApplication const* aurA Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Magic damage modifiers implemented in Unit::SpellDamageBonus @@ -4498,7 +4498,7 @@ void AuraEffect::HandleModSpellHealingPercentFromStat(AuraApplication const* aur Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Recalculate bonus @@ -4512,7 +4512,7 @@ void AuraEffect::HandleModSpellDamagePercentFromAttackPower(AuraApplication cons Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Magic damage modifiers implemented in Unit::SpellDamageBonus @@ -4528,7 +4528,7 @@ void AuraEffect::HandleModSpellHealingPercentFromAttackPower(AuraApplication con Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Recalculate bonus @@ -4542,7 +4542,7 @@ void AuraEffect::HandleModHealingDone(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // implemented in Unit::SpellHealingBonus // this information is for client side only @@ -4613,7 +4613,7 @@ void AuraEffect::HandleAuraModResistenceOfStatPercent(AuraApplication const* aur Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (GetMiscValue() != SPELL_SCHOOL_MASK_NORMAL) @@ -4635,7 +4635,7 @@ void AuraEffect::HandleAuraModExpertise(AuraApplication const* aurApp, uint8 mod Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ToPlayer()->UpdateExpertise(BASE_ATTACK); @@ -4652,7 +4652,7 @@ void AuraEffect::HandleModPowerRegen(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Update manaregen value @@ -4675,7 +4675,7 @@ void AuraEffect::HandleModManaRegen(AuraApplication const* aurApp, uint8 mode, b Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; //Note: an increase in regen does NOT cause threat. @@ -4815,7 +4815,7 @@ void AuraEffect::HandleAuraModParryPercent(AuraApplication const* aurApp, uint8 Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (!target->ToPlayer()->CanParry()) @@ -4831,7 +4831,7 @@ void AuraEffect::HandleAuraModDodgePercent(AuraApplication const* aurApp, uint8 Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ToPlayer()->UpdateDodgePercentage(); @@ -4844,7 +4844,7 @@ void AuraEffect::HandleAuraModBlockPercent(AuraApplication const* aurApp, uint8 Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ToPlayer()->UpdateBlockPercentage(); @@ -4862,7 +4862,7 @@ void AuraEffect::HandleAuraModWeaponCritPercent(AuraApplication const* aurApp, u Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; for (int i = 0; i < MAX_ATTACK; ++i) @@ -4937,7 +4937,7 @@ void AuraEffect::HandleModSpellCritChanceShool(AuraApplication const* aurApp, ui Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; for (int school = SPELL_SCHOOL_NORMAL; school < MAX_SPELL_SCHOOL; ++school) @@ -4952,7 +4952,7 @@ void AuraEffect::HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) { target->m_baseSpellCritChance += (apply) ? GetAmount() : -GetAmount(); return; @@ -5051,7 +5051,7 @@ void AuraEffect::HandleRangedAmmoHaste(AuraApplication const* aurApp, uint8 mode Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->ApplyAttackTimePercentMod(RANGED_ATTACK, (float)GetAmount(), apply); @@ -5068,7 +5068,7 @@ void AuraEffect::HandleModRating(AuraApplication const* aurApp, uint8 mode, bool Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating) @@ -5083,7 +5083,7 @@ void AuraEffect::HandleModRatingFromStat(AuraApplication const* aurApp, uint8 mo Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // Just recalculate ratings @@ -5202,7 +5202,7 @@ void AuraEffect::HandleModDamageDone(AuraApplication const* aurApp, uint8 mode, if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) != 0 && sScriptMgr->CanModAuraEffectDamageDone(this, target, aurApp, mode, apply)) { // apply generic physical damage bonuses including wand case - if (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER) + if (GetSpellInfo()->EquippedItemClass == -1 || !target->IsPlayer()) { target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(GetAmount()), apply); target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(GetAmount()), apply); @@ -5279,7 +5279,7 @@ void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8 target->ToPlayer()->_ApplyWeaponDependentAuraDamageMod(item, WeaponAttackType(i), this, apply); } - if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER)) + if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || !target->IsPlayer())) { target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(GetAmount()), apply); target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(GetAmount()), apply); @@ -5373,7 +5373,7 @@ void AuraEffect::HandleNoReagentUseAura(AuraApplication const* aurApp, uint8 mod Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; flag96 mask; @@ -5393,7 +5393,7 @@ void AuraEffect::HandleAuraRetainComboPoints(AuraApplication const* aurApp, uint Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // combo points was added in SPELL_EFFECT_ADD_COMBO_POINTS handler @@ -5609,7 +5609,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool break; case 43681: // Inactive { - if (target->GetTypeId() != TYPEID_PLAYER || aurApp->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + if (!target->IsPlayer() || aurApp->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; if (target->GetMap()->IsBattleground()) @@ -5643,7 +5643,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool break; case 46374: // quest The Power of the Elements (11893) { - if (target->isDead() && GetBase() && target->GetTypeId() == TYPEID_UNIT && target->GetEntry() == 24601) + if (target->isDead() && GetBase() && target->IsCreature() && target->GetEntry() == 24601) { auto caster2 = GetBase()->GetCaster(); if (caster2 && caster2->IsPlayer()) @@ -5716,7 +5716,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool case 57821: // Champion of the Kirin Tor case 57822: // Wyrmrest Champion { - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) break; uint32 FactionID = 0; @@ -5860,7 +5860,7 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; Player* plCaster = caster->ToPlayer(); @@ -5904,7 +5904,7 @@ void AuraEffect::HandleBindSight(AuraApplication const* aurApp, uint8 mode, bool Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; caster->ToPlayer()->SetViewpoint(target, apply); @@ -5918,7 +5918,7 @@ void AuraEffect::HandleFarSight(AuraApplication const* /*aurApp*/, uint8 mode, b } Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) { return; } @@ -5943,7 +5943,7 @@ void AuraEffect::HandleForceReaction(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; Player* player = target->ToPlayer(); @@ -6023,7 +6023,7 @@ void AuraEffect::HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; Player* player = target->ToPlayer(); @@ -6095,7 +6095,7 @@ void AuraEffect::HandleAuraOpenStable(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER || !target->IsInWorld()) + if (!target->IsPlayer() || !target->IsInWorld()) return; if (apply) @@ -6154,7 +6154,7 @@ void AuraEffect::HandleAuraSetVehicle(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER || !target->IsInWorld()) + if (!target->IsPlayer() || !target->IsInWorld()) return; uint32 vehicleId = GetMiscValue(); @@ -6184,7 +6184,7 @@ void AuraEffect::HandlePreventResurrection(AuraApplication const* aurApp, uint8 if (!(mode & AURA_EFFECT_HANDLE_REAL)) return; - if (aurApp->GetTarget()->GetTypeId() != TYPEID_PLAYER) + if (!aurApp->GetTarget()->IsPlayer()) return; if (apply) @@ -6270,7 +6270,7 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const // Death Rune Mastery if (GetSpellInfo()->SpellIconID == 3041 || GetSpellInfo()->SpellIconID == 22 || GetSpellInfo()->SpellIconID == 2622) { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (!target->ToPlayer()->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) return; @@ -6355,7 +6355,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) return; // Inoculate Nestlewood Owlkin case 29528: - if (target->GetTypeId() != TYPEID_UNIT) // prevent error reports in case ignored player target + if (!target->IsCreature()) // prevent error reports in case ignored player target return; break; // Feed Captured Animal @@ -6367,7 +6367,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) { // move loot to player inventory and despawn target if (caster && caster->IsPlayer() && - target->GetTypeId() == TYPEID_UNIT && + target->IsCreature() && target->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_GAS_CLOUD) { Player* player = caster->ToPlayer(); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 051c30310..0a4e6e7c4 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -380,7 +380,7 @@ Aura* Aura::Create(SpellInfo const* spellproto, uint8 effMask, WorldObject* owne casterGUID = caster->GetGUID(); // check if aura can be owned by owner - if (owner->isType(TYPEMASK_UNIT)) + if (owner->IsUnit()) if (!owner->IsInWorld() || ((Unit*)owner)->IsDuringRemoveFromWorld()) // owner not in world so don't allow to own not self casted single target auras if (casterGUID != owner->GetGUID() && spellproto->IsSingleTarget()) @@ -1789,7 +1789,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b { if (removeMode != AURA_REMOVE_BY_EXPIRE) break; - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) break; Player* player = caster->ToPlayer(); @@ -1860,7 +1860,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b { if (!GetEffect(0) || GetEffect(0)->GetAuraType() != SPELL_AURA_PERIODIC_DUMMY) break; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) break; if (!target->ToPlayer()->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) break; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 60d153f9d..24d07cc94 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -743,7 +743,7 @@ void Spell::InitExplicitTargets(SpellCastTargets const& targets) unit = selectedUnit; } // try to use attacked unit as a target - else if ((m_caster->GetTypeId() == TYPEID_UNIT) && neededTargets & (TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT)) + else if ((m_caster->IsCreature()) && neededTargets & (TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT)) unit = m_caster->GetVictim(); // didn't find anything - let's use self as target @@ -1788,7 +1788,7 @@ void Spell::SelectImplicitCasterObjectTargets(SpellEffIndex effIndex, SpellImpli case TARGET_UNIT_PASSENGER_5: case TARGET_UNIT_PASSENGER_6: case TARGET_UNIT_PASSENGER_7: - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsVehicle()) + if (m_caster->IsCreature() && m_caster->ToCreature()->IsVehicle()) target = m_caster->GetVehicleKit()->GetPassenger(targetType.GetTarget() - TARGET_UNIT_PASSENGER_0); break; default: @@ -2365,7 +2365,7 @@ void Spell::prepareDataForTriggerSystem(AuraEffect const* /*triggeredByAura*/) m_procEx |= PROC_EX_INTERNAL_TRIGGERED; } // Totem casts require spellfamilymask defined in spell_proc_event to proc - if (m_originalCaster && m_caster != m_originalCaster && m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsTotem() && m_caster->IsControlledByPlayer()) + if (m_originalCaster && m_caster != m_originalCaster && m_caster->IsCreature() && m_caster->ToCreature()->IsTotem() && m_caster->IsControlledByPlayer()) m_procEx |= PROC_EX_INTERNAL_REQ_FAMILY; } @@ -2692,7 +2692,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) { spellHitTarget = m_caster; unitTarget = m_caster; - if (m_caster->GetTypeId() == TYPEID_UNIT) + if (m_caster->IsCreature()) m_caster->ToCreature()->LowerPlayerDamageReq(target->damage); } } @@ -2919,7 +2919,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) } // Failed Pickpocket, reveal rogue - if (missInfo == SPELL_MISS_RESIST && m_spellInfo->HasAttribute(SPELL_ATTR0_CU_PICKPOCKET) && unitTarget->GetTypeId() == TYPEID_UNIT && m_caster) + if (missInfo == SPELL_MISS_RESIST && m_spellInfo->HasAttribute(SPELL_ATTR0_CU_PICKPOCKET) && unitTarget->IsCreature() && m_caster) { m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK); if (unitTarget->ToCreature()->IsAIEnabled) @@ -2965,19 +2965,19 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) } // Check for SPELL_ATTR7_CAN_CAUSE_INTERRUPT - if (m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_CAUSE_INTERRUPT) && effectUnit->GetTypeId() != TYPEID_PLAYER) + if (m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_CAUSE_INTERRUPT) && !effectUnit->IsPlayer()) caster->CastSpell(effectUnit, SPELL_INTERRUPT_NONPLAYER, true); if (spellHitTarget) { //AI functions - if (spellHitTarget->GetTypeId() == TYPEID_UNIT) + if (spellHitTarget->IsCreature()) { if (spellHitTarget->ToCreature()->IsAIEnabled) spellHitTarget->ToCreature()->AI()->SpellHit(m_caster, m_spellInfo); } - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsAIEnabled) + if (m_caster->IsCreature() && m_caster->ToCreature()->IsAIEnabled) m_caster->ToCreature()->AI()->SpellHitTarget(spellHitTarget, m_spellInfo); // Needs to be called after dealing damage/healing to not remove breaking on damage auras @@ -3053,7 +3053,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA // Xinef: Also check evade state if (m_spellInfo->Speed > 0.0f) { - if (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->IsInEvadeMode()) + if (unit->IsCreature() && unit->ToCreature()->IsInEvadeMode()) return SPELL_MISS_EVADE; if (unit->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE) && unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID()) @@ -3101,12 +3101,12 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA // Xinef: Do not increase diminishing level for self cast m_diminishGroup = GetDiminishingReturnsGroupForSpell(m_spellInfo, m_triggeredByAuraSpell.spellInfo); // xinef: do not increase diminish level for bosses (eg. Void Reaver silence is never diminished) - if (((m_spellFlags & SPELL_FLAG_REFLECTED) && !(unit->HasAuraType(SPELL_AURA_REFLECT_SPELLS))) || (aura_effmask && m_diminishGroup && unit != m_caster && (m_caster->GetTypeId() != TYPEID_UNIT || !m_caster->ToCreature()->isWorldBoss()))) + if (((m_spellFlags & SPELL_FLAG_REFLECTED) && !(unit->HasAuraType(SPELL_AURA_REFLECT_SPELLS))) || (aura_effmask && m_diminishGroup && unit != m_caster && (!m_caster->IsCreature() || !m_caster->ToCreature()->isWorldBoss()))) { m_diminishLevel = unit->GetDiminishing(m_diminishGroup); DiminishingReturnsType type = GetDiminishingReturnsGroupType(m_diminishGroup); - uint32 flagsExtra = unit->GetTypeId() == TYPEID_UNIT ? unit->ToCreature()->GetCreatureTemplate()->flags_extra : 0; + uint32 flagsExtra = unit->IsCreature() ? unit->ToCreature()->GetCreatureTemplate()->flags_extra : 0; // Increase Diminishing on unit, current informations for actually casts will use values above if ((type == DRTYPE_PLAYER && (unit->IsCharmedOwnedByPlayerOrPlayer() || flagsExtra & CREATURE_FLAG_EXTRA_ALL_DIMINISH || @@ -3685,7 +3685,7 @@ SpellCastResult Spell::prepare(SpellCastTargets const* targets, AuraEffect const // set target for proper facing if ((m_casttime || m_spellInfo->IsChanneled()) && !HasTriggeredCastFlag(TRIGGERED_IGNORE_SET_FACING)) { - if (m_caster->GetTypeId() == TYPEID_UNIT && !m_caster->ToCreature()->IsInEvadeMode() && + if (m_caster->IsCreature() && !m_caster->ToCreature()->IsInEvadeMode() && ((m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) || m_spellInfo->IsPositive())) { // Xinef: Creature should focus to cast target if there is explicit target or self if casting positive spell @@ -3838,14 +3838,14 @@ void Spell::_cast(bool skipCheck) if (!playerCaster->m_Controlled.empty()) for (Unit::ControlSet::iterator itr = playerCaster->m_Controlled.begin(); itr != playerCaster->m_Controlled.end(); ++itr) if (Unit* pet = *itr) - if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsAlive() && pet->IsCreature()) pet->ToCreature()->AI()->OwnerAttacked(m_targets.GetUnitTarget()); } SetExecutedCurrently(true); if (!HasTriggeredCastFlag(TRIGGERED_IGNORE_SET_FACING)) - if (m_caster->GetTypeId() == TYPEID_UNIT && m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) + if (m_caster->IsCreature() && m_targets.GetObjectTarget() && m_caster != m_targets.GetObjectTarget()) m_caster->SetInFront(m_targets.GetObjectTarget()); CallScriptBeforeCastHandlers(); @@ -4087,7 +4087,7 @@ void Spell::_cast(bool skipCheck) // handle this here, in other places SpellHitTarget can be set to nullptr, if there is an error in this function if (m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_CAUSE_INTERRUPT)) if (Unit* target = m_targets.GetUnitTarget()) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) m_caster->CastSpell(target, 32747, true); // xinef: start combat at cast for delayed spells, only for explicit target @@ -4346,7 +4346,7 @@ void Spell::_handle_finish_phase() void Spell::SendSpellCooldown() { // xinef: properly add creature cooldowns - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) { if (!HasTriggeredCastFlag(TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)) { @@ -4489,7 +4489,7 @@ void Spell::finish(bool ok) if (m_spellInfo->IsChanneled() && m_caster->IsPlayer()) { if (Unit* charm = m_caster->GetCharm()) - if (charm->GetTypeId() == TYPEID_UNIT + if (charm->IsCreature() && charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_PUPPET) && charm->GetUInt32Value(UNIT_CREATED_BY_SPELL) == m_spellInfo->Id) ((Puppet*)charm)->UnSummon(); @@ -4521,7 +4521,7 @@ void Spell::finish(bool ok) if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_ENCOUNTER_REWARD) && m_caster->FindMap()) m_caster->FindMap()->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, m_spellInfo->Id, m_caster); - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsSummon()) + if (m_caster->IsCreature() && m_caster->ToCreature()->IsSummon()) { // Unsummon statue uint32 spell = m_caster->GetUInt32Value(UNIT_CREATED_BY_SPELL); @@ -4673,7 +4673,7 @@ void Spell::SendCastResult(SpellCastResult result) if (result == SPELL_CAST_OK) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER || m_caster->IsCharmed()) + if (!m_caster->IsPlayer() || m_caster->IsCharmed()) return; if (m_caster->ToPlayer()->GetSession()->PlayerLoading()) // don't send cast results at loading time @@ -5242,7 +5242,7 @@ void Spell::SendResurrectRequest(Player* target) void Spell::TakeCastItem() { - if (!m_CastItem || m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_CastItem || !m_caster->IsPlayer()) return; // not remove cast item at triggered spell (equipping, weapon damage, etc) @@ -5401,7 +5401,7 @@ SpellCastResult Spell::CheckRuneCost(uint32 RuneCostID) if (m_spellInfo->PowerType != POWER_RUNE || !RuneCostID) return SPELL_CAST_OK; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_CAST_OK; Player* player = m_caster->ToPlayer(); @@ -5452,7 +5452,7 @@ SpellCastResult Spell::CheckRuneCost(uint32 RuneCostID) void Spell::TakeRunePower(bool didHit) { - if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_caster->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) + if (!m_caster->IsPlayer() || !m_caster->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY)) return; SpellRuneCostEntry const* runeCostData = sSpellRuneCostStore.LookupEntry(m_spellInfo->RuneCostID); @@ -5521,7 +5521,7 @@ void Spell::TakeRunePower(bool didHit) void Spell::TakeReagents() { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; ItemTemplate const* castItemTemplate = m_CastItem ? m_CastItem->GetTemplate() : nullptr; @@ -5680,7 +5680,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->ToPlayer()->GetLastPotionId() && m_CastItem && (m_CastItem->IsPotion() || m_spellInfo->IsCooldownStartedOnEvent())) return SPELL_FAILED_NOT_READY; } - else if (!IsTriggered() && m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsSpellProhibited(m_spellInfo->GetSchoolMask())) + else if (!IsTriggered() && m_caster->IsCreature() && m_caster->ToCreature()->IsSpellProhibited(m_spellInfo->GetSchoolMask())) return SPELL_FAILED_NOT_READY; } @@ -5987,7 +5987,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_NOT_IN_ARENA; // zone check - if (m_caster->GetTypeId() == TYPEID_UNIT || !m_caster->ToPlayer()->IsGameMaster()) + if (m_caster->IsCreature() || !m_caster->ToPlayer()->IsGameMaster()) { uint32 zone, area; m_caster->GetZoneAndAreaId(zone, area); @@ -6114,7 +6114,7 @@ SpellCastResult Spell::CheckCast(bool strict) { case SPELL_EFFECT_LEARN_SPELL: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_PET) @@ -6140,7 +6140,7 @@ SpellCastResult Spell::CheckCast(bool strict) // check target only for unit target case if (Unit* unitTarget = m_targets.GetUnitTarget()) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; Pet* pet = unitTarget->ToPet(); @@ -6167,7 +6167,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_FEED_PET: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; Item* foodItem = m_targets.GetItemTarget(); @@ -6260,7 +6260,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_SKINNING: { - if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_targets.GetUnitTarget() || m_targets.GetUnitTarget()->GetTypeId() != TYPEID_UNIT) + if (!m_caster->IsPlayer() || !m_targets.GetUnitTarget() || !m_targets.GetUnitTarget()->IsCreature()) return SPELL_FAILED_BAD_TARGETS; if (!(m_targets.GetUnitTarget()->GetUnitFlags() & UNIT_FLAG_SKINNABLE)) @@ -6286,7 +6286,7 @@ SpellCastResult Spell::CheckCast(bool strict) m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM_TARGET) break; - if (m_caster->GetTypeId() != TYPEID_PLAYER // only players can open locks, gather etc. + if (!m_caster->IsPlayer() // only players can open locks, gather etc. // we need a go target in case of TARGET_GAMEOBJECT_TARGET || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget())) return SPELL_FAILED_BAD_TARGETS; @@ -6410,7 +6410,7 @@ SpellCastResult Spell::CheckCast(bool strict) { if (m_targets.GetUnitTarget()) { - if (m_targets.GetUnitTarget()->GetTypeId() != TYPEID_PLAYER) + if (!m_targets.GetUnitTarget()->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (m_targets.GetUnitTarget()->GetPetGUID()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; @@ -6472,7 +6472,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_SUMMON_PLAYER: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (!m_caster->GetTarget()) return SPELL_FAILED_BAD_TARGETS; @@ -6507,7 +6507,7 @@ SpellCastResult Spell::CheckCast(bool strict) // RETURN HERE case SPELL_EFFECT_SUMMON_RAF_FRIEND: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; Player* playerCaster = m_caster->ToPlayer(); @@ -6602,7 +6602,7 @@ SpellCastResult Spell::CheckCast(bool strict) break; case SPELL_AURA_MOD_POSSESS_PET: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_NO_PET; Pet* pet = m_caster->ToPlayer()->GetPet(); @@ -6637,7 +6637,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (Unit* target = m_targets.GetUnitTarget()) { - if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsVehicle()) + if (target->IsCreature() && target->ToCreature()->IsVehicle()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; if (target->IsMounted()) @@ -6719,7 +6719,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_spellInfo->Effects[i].IsTargetingArea()) break; - if (m_caster->GetTypeId() != TYPEID_PLAYER || m_CastItem) + if (!m_caster->IsPlayer() || m_CastItem) break; if (!m_targets.GetUnitTarget()) @@ -6757,7 +6757,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_CastItem) return SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_NOT_TRADING; TradeData* my_trade = m_caster->ToPlayer()->GetTradeData(); @@ -7058,7 +7058,7 @@ SpellCastResult Spell::CheckRange(bool strict) float min_range = m_caster->GetSpellMinRangeForTarget(target, m_spellInfo); // xinef: hack for npc shooters - if (min_range && GetCaster()->GetTypeId() == TYPEID_UNIT && !GetCaster()->GetOwnerGUID().IsPlayer() && min_range <= 6.0f) + if (min_range && GetCaster()->IsCreature() && !GetCaster()->GetOwnerGUID().IsPlayer() && min_range <= 6.0f) range_type = SPELL_RANGE_RANGED; if (Player* modOwner = m_caster->GetSpellModOwner()) @@ -7076,7 +7076,7 @@ SpellCastResult Spell::CheckRange(bool strict) if (range_type == SPELL_RANGE_MELEE) { float real_max_range = max_range; - if (m_caster->GetTypeId() != TYPEID_UNIT && m_caster->isMoving() && target->isMoving() && !m_caster->IsWalking() && !target->IsWalking()) + if (!m_caster->IsCreature() && m_caster->isMoving() && target->isMoving() && !m_caster->IsWalking() && !target->IsWalking()) real_max_range -= MIN_MELEE_REACH; // Because of lag, we can not check too strictly here (is only used if both caster and target are moving) else real_max_range -= 2 * MIN_MELEE_REACH; @@ -7255,7 +7255,7 @@ SpellCastResult Spell::CheckItems() // check target item if (m_targets.GetItemTargetGUID()) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_BAD_TARGETS; if (!m_targets.GetItemTarget()) @@ -7606,7 +7606,7 @@ SpellCastResult Spell::CheckItems() case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return SPELL_FAILED_TARGET_NOT_PLAYER; if (m_attackType != RANGED_ATTACK) @@ -7760,7 +7760,7 @@ SpellCastResult Spell::CheckSpellFocus() void Spell::Delayed() // only called in DealDamage() { - if (!m_caster)// || m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster)// || !m_caster->IsPlayer()) return; //if (m_spellState == SPELL_STATE_DELAYED) @@ -7805,7 +7805,7 @@ void Spell::Delayed() // only called in DealDamage() void Spell::DelayedChannel() { - if (!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER || getState() != SPELL_STATE_CASTING) + if (!m_caster || !m_caster->IsPlayer() || getState() != SPELL_STATE_CASTING) return; if (isDelayableNoMore()) // Spells may only be delayed twice @@ -7919,7 +7919,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff) const case SPELL_AURA_MOD_CHARM: case SPELL_AURA_MOD_POSSESS_PET: case SPELL_AURA_AOE_CHARM: - if (target->GetTypeId() == TYPEID_UNIT && target->IsVehicle()) + if (target->IsCreature() && target->IsVehicle()) return false; if (target->IsMounted()) return false; @@ -7935,7 +7935,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff) const // xinef: skip los checking if spell has appropriate attribute, or target requires specific entry // this is only for target addition and target has to have unselectable flag, this is valid for FLAG_EXTRA_TRIGGER and quest triggers however there are some without this flag, used not_selectable - if (m_spellInfo->HasAttribute(SPELL_ATTR2_IGNORE_LINE_OF_SIGHT) || (target->GetTypeId() == TYPEID_UNIT && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE) && (m_spellInfo->Effects[eff].TargetA.GetCheckType() == TARGET_CHECK_ENTRY || m_spellInfo->Effects[eff].TargetB.GetCheckType() == TARGET_CHECK_ENTRY))) + if (m_spellInfo->HasAttribute(SPELL_ATTR2_IGNORE_LINE_OF_SIGHT) || (target->IsCreature() && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE) && (m_spellInfo->Effects[eff].TargetA.GetCheckType() == TARGET_CHECK_ENTRY || m_spellInfo->Effects[eff].TargetB.GetCheckType() == TARGET_CHECK_ENTRY))) return true; // if spell is triggered, need to check for LOS disable on the aura triggering it and inherit that behaviour @@ -7992,7 +7992,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff) const } break; case SPELL_EFFECT_SUMMON_RAF_FRIEND: - if (m_caster->GetTypeId() != TYPEID_PLAYER || target->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer() || !target->IsPlayer()) return false; if (m_caster->ToPlayer()->GetSession()->IsARecruiter() && target->ToPlayer()->GetSession()->GetRecruiterId() != m_caster->ToPlayer()->GetSession()->GetAccountId()) return false; @@ -8385,7 +8385,7 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk reqSkillValue = lockInfo->Skill[j]; // castitem check: rogue using skeleton keys. the skill values should not be added in this case. - skillValue = m_CastItem || m_caster->GetTypeId() != TYPEID_PLAYER ? + skillValue = m_CastItem || !m_caster->IsPlayer() ? 0 : m_caster->ToPlayer()->GetSkillValue(skillId); // skill bonus provided by casting spell (mostly item spells) @@ -9035,14 +9035,14 @@ namespace Acore bool WorldObjectSpellAreaTargetCheck::operator()(WorldObject* target) { - if (target->GetTypeId() == TYPEID_GAMEOBJECT) + if (target->IsGameObject()) { if (!target->ToGameObject()->IsInRange(_position->GetPositionX(), _position->GetPositionY(), _position->GetPositionZ(), _range)) return false; } else if (!target->IsWithinDist3d(_position, _range)) return false; - else if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsAvoidingAOE()) // pussywizard + else if (target->IsCreature() && target->ToCreature()->IsAvoidingAOE()) // pussywizard return false; return WorldObjectSpellTargetCheck::operator ()(target); } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 293557bd2..aab419f79 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -257,7 +257,7 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) if (!unitTarget || unitTarget->IsAlive()) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; if (!unitTarget->IsInWorld()) @@ -435,7 +435,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) // Shadow Bite else if (m_spellInfo->SpellFamilyFlags[1] & 0x400000) { - if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->IsPet()) + if (m_caster->IsCreature() && m_caster->IsPet()) { if (Player* owner = m_caster->GetOwner()->ToPlayer()) { @@ -776,7 +776,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) { sScriptMgr->OnDummyEffect(m_caster, m_spellInfo->Id, effIndex, gameObjTarget); } - else if (unitTarget && unitTarget->GetTypeId() == TYPEID_UNIT) + else if (unitTarget && unitTarget->IsCreature()) { sScriptMgr->OnDummyEffect(m_caster, m_spellInfo->Id, effIndex, unitTarget->ToCreature()); } @@ -2065,7 +2065,7 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) { LOG_DEBUG("spells.aura", "WORLD: Open Lock - No Player Caster!"); return; @@ -2182,7 +2182,7 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* player = m_caster->ToPlayer(); @@ -2291,7 +2291,7 @@ void Spell::EffectProficiency(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_target = m_caster->ToPlayer(); @@ -2524,7 +2524,7 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex) if (!unitTarget) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) { if (unitTarget->ToPet()) EffectLearnPetSpell(effIndex); @@ -2686,7 +2686,7 @@ void Spell::EffectPickPocket(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; m_caster->ToPlayer()->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING); @@ -2697,7 +2697,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; float radius = m_spellInfo->Effects[effIndex].CalcRadius(); @@ -2751,7 +2751,7 @@ void Spell::EffectLearnSkill(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; if (damage < 0) @@ -2767,7 +2767,7 @@ void Spell::EffectAddHonor(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; // not scale value for item based reward (/10 value expected) @@ -2801,7 +2801,7 @@ void Spell::EffectTradeSkill(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; // uint32 skillid = m_spellInfo->Effects[i].MiscValue; // uint16 skillmax = unitTarget->ToPlayer()->(skillid); @@ -2813,7 +2813,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!itemTarget) return; @@ -2869,7 +2869,7 @@ void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!itemTarget) return; @@ -2923,7 +2923,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); @@ -3070,7 +3070,7 @@ void Spell::EffectTameCreature(SpellEffIndex /*effIndex*/) if (!unitTarget) return; - if (unitTarget->GetTypeId() != TYPEID_UNIT) + if (!unitTarget->IsCreature()) return; Creature* creatureTarget = unitTarget->ToCreature(); @@ -3199,7 +3199,7 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex) if (!pet) return; - if (m_caster->GetTypeId() == TYPEID_UNIT) + if (m_caster->IsCreature()) { if (m_caster->ToCreature()->IsTotem()) pet->SetReactState(REACT_AGGRESSIVE); @@ -3831,7 +3831,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) /*// Mug Transformation case 41931: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; uint8 bag = 19; @@ -3874,12 +3874,12 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) } case 52173: // Coyote Spirit Despawn case 60243: // Blood Parrot Despawn - if (unitTarget->GetTypeId() == TYPEID_UNIT && unitTarget->ToCreature()->IsSummon()) + if (unitTarget->IsCreature() && unitTarget->ToCreature()->IsSummon()) unitTarget->ToTempSummon()->UnSummon(); return; case 57347: // Retrieving (Wintergrasp RP-GG pickup spell) { - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || m_caster->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget || !unitTarget->IsCreature() || !m_caster->IsPlayer()) return; unitTarget->ToCreature()->DespawnOrUnsummon(); @@ -3888,7 +3888,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) } case 57349: // Drop RP-GG (Wintergrasp RP-GG at death drop spell) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; // Delete item from inventory at death @@ -3899,7 +3899,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 58418: // Portal to Orgrimmar case 58420: // Portal to Stormwind { - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || effIndex != 0) + if (!unitTarget || !unitTarget->IsPlayer() || effIndex != 0) return; uint32 spellID = m_spellInfo->Effects[EFFECT_0].CalcValue(); @@ -4041,7 +4041,7 @@ void Spell::EffectSanctuary(SpellEffIndex /*effIndex*/) if ((*iter)->GetCurrentSpell(i) && (*iter)->GetCurrentSpell(i)->m_targets.GetUnitTargetGUID() == unitTarget->GetGUID()) { SpellInfo const* si = (*iter)->GetCurrentSpell(i)->GetSpellInfo(); - if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->GetTypeId() == TYPEID_UNIT) + if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->IsCreature()) { Creature* c = (*iter)->ToCreature(); if ((!c->IsPet() && c->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS) || c->isWorldBoss() || c->IsDungeonBoss()) @@ -4085,7 +4085,7 @@ void Spell::EffectDuel(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || m_caster->GetTypeId() != TYPEID_PLAYER || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget || !m_caster->IsPlayer() || !unitTarget->IsPlayer()) return; Player* caster = m_caster->ToPlayer(); @@ -4161,7 +4161,7 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* target = m_caster->ToPlayer(); @@ -4311,7 +4311,7 @@ void Spell::EffectApplyGlyph(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER || m_glyphIndex >= MAX_GLYPH_SLOT_INDEX) + if (!m_caster->IsPlayer() || m_glyphIndex >= MAX_GLYPH_SLOT_INDEX) return; Player* player = m_caster->ToPlayer(); @@ -4770,7 +4770,7 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) // xinef: we should also force pets to remove us from current target Unit::AttackerSet attackerSet; for (Unit::AttackerSet::const_iterator itr = m_caster->getAttackers().begin(); itr != m_caster->getAttackers().end(); ++itr) - if ((*itr)->GetTypeId() == TYPEID_UNIT && !(*itr)->CanHaveThreatList()) + if ((*itr)->IsCreature() && !(*itr)->CanHaveThreatList()) attackerSet.insert(*itr); for (Unit::AttackerSet::const_iterator itr = attackerSet.begin(); itr != attackerSet.end(); ++itr) @@ -4801,7 +4801,7 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) if (spell->m_targets.GetUnitTargetGUID() == m_caster->GetGUID()) { SpellInfo const* si = spell->GetSpellInfo(); - if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->GetTypeId() == TYPEID_UNIT) + if (si->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && (*iter)->IsCreature()) { Creature* c = (*iter)->ToCreature(); if ((!c->IsPet() && c->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS) || c->isWorldBoss() || c->IsDungeonBoss()) @@ -4832,7 +4832,7 @@ void Spell::EffectSelfResurrect(SpellEffIndex effIndex) if (!m_caster || m_caster->IsAlive()) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!m_caster->IsInWorld()) return; @@ -4870,9 +4870,9 @@ void Spell::EffectSkinning(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (unitTarget->GetTypeId() != TYPEID_UNIT) + if (!unitTarget->IsCreature()) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Creature* creature = unitTarget->ToCreature(); @@ -5472,7 +5472,7 @@ void Spell::EffectProspecting(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); @@ -5497,7 +5497,7 @@ void Spell::EffectMilling(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); @@ -5535,7 +5535,7 @@ void Spell::EffectSpiritHeal(SpellEffIndex /*effIndex*/) return; /* - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget->IsPlayer()) return; if (!unitTarget->IsInWorld()) return; @@ -5554,7 +5554,7 @@ void Spell::EffectSkinPlayerCorpse(SpellEffIndex /*effIndex*/) return; LOG_DEBUG("spells.aura", "Effect: SkinPlayerCorpse"); - if ((m_caster->GetTypeId() != TYPEID_PLAYER) || (unitTarget->GetTypeId() != TYPEID_PLAYER) || (unitTarget->IsAlive())) + if ((!m_caster->IsPlayer()) || (!unitTarget->IsPlayer()) || (unitTarget->IsAlive())) return; unitTarget->ToPlayer()->RemovedInsignia(m_caster->ToPlayer()); @@ -5747,7 +5747,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* player = m_caster->ToPlayer(); @@ -5820,7 +5820,7 @@ void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || unitTarget->GetPetGUID() || !unitTarget->IsClass(CLASS_HUNTER, CLASS_CONTEXT_PET)) + if (!unitTarget || !unitTarget->IsPlayer() || unitTarget->GetPetGUID() || !unitTarget->IsClass(CLASS_HUNTER, CLASS_CONTEXT_PET)) return; uint32 creatureEntry = m_spellInfo->Effects[effIndex].MiscValue; @@ -6088,7 +6088,7 @@ void Spell::EffectRenamePet(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || + if (!unitTarget || !unitTarget->IsCreature() || !unitTarget->IsPet() || unitTarget->ToPet()->getPetType() != HUNTER_PET) return; @@ -6199,7 +6199,7 @@ void Spell::EffectCastButtons(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; Player* p_caster = m_caster->ToPlayer(); @@ -6242,7 +6242,7 @@ void Spell::EffectRechargeManaGem(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!unitTarget || !unitTarget->IsPlayer()) return; Player* player = m_caster->ToPlayer(); @@ -6319,7 +6319,7 @@ void Spell::EffectSummonRaFFriend(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (!m_caster->IsPlayer()) return; if (!unitTarget) diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 78fd3ce63..aad55356b 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -343,9 +343,9 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: { - if (range == TEXT_RANGE_NORMAL)//ignores team and gmOnly + if (range == TEXT_RANGE_NORMAL) // ignores team and GM only { - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return; target->ToPlayer()->GetSession()->SendPacket(data); diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index c90a6300e..91ad59fe1 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -189,9 +189,9 @@ void CreatureTextMgr::SendChatPacket(WorldObject* source, Builder const& builder case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: { - if (range == TEXT_RANGE_NORMAL) //ignores team and gmOnly + if (range == TEXT_RANGE_NORMAL) // ignores team and GM only { - if (!target || target->GetTypeId() != TYPEID_PLAYER) + if (!target || !target->IsPlayer()) return; localizer(const_cast(target->ToPlayer())); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 852c79a3a..93fe67cc3 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -263,7 +263,7 @@ public: Unit* unit = handler->getSelectedUnit(); Player* player = nullptr; - if (!unit || (unit->GetTypeId() != TYPEID_PLAYER)) + if (!unit || (!unit->IsPlayer())) { player = handler->GetSession()->GetPlayer(); } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index b80a48f74..5d6898979 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1142,7 +1142,7 @@ public: { if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE)) { - if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard + if (target->IsCreature() && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard { target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth()); } @@ -2393,7 +2393,7 @@ public: Unit* target = handler->getSelectedUnit(); if (player->GetTarget() && target) { - if (target->GetTypeId() != TYPEID_UNIT || target->IsPet()) + if (!target->IsCreature() || target->IsPet()) { handler->SendErrorMessage(LANG_SELECT_CREATURE); return false; @@ -2745,7 +2745,7 @@ public: } case HOME_MOTION_TYPE: { - if (unit->GetTypeId() == TYPEID_UNIT) + if (unit->IsCreature()) { handler->PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z); } @@ -2816,7 +2816,7 @@ public: if (!target->IsAlive() || !damage) return true; - if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard + if (target->IsCreature() && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth()); if (percent) diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index c06d9a3d9..a7daa3024 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -336,7 +336,7 @@ public: return false; Unit* unit = handler->getSelectedUnit(); - if (!unit || unit->GetTypeId() != TYPEID_UNIT) + if (!unit || !unit->IsCreature()) { handler->SendErrorMessage(LANG_SELECT_CREATURE); return false; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp index 51f19f74b..63219693b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp @@ -221,7 +221,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_UNIT) + if (!summoner->IsCreature()) { return; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index a356db01a..e5ca5f2aa 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -212,7 +212,7 @@ struct ClassCallSelector : public Acore::unary_function bool operator()(Unit const* target) const { - if (!_me || !target || target->GetTypeId() != TYPEID_PLAYER) + if (!_me || !target || !target->IsPlayer()) { return false; } @@ -1114,7 +1114,7 @@ class spell_class_call_polymorph : public SpellScript { targets.remove_if([&](WorldObject const* target) -> bool { - return target->GetTypeId() != TYPEID_PLAYER || target->ToPlayer()->IsGameMaster() || target->ToPlayer()->HasAura(SPELL_POLYMORPH); + return !target->IsPlayer() || target->ToPlayer()->IsGameMaster() || target->ToPlayer()->HasAura(SPELL_POLYMORPH); }); if (!targets.empty()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 7265ab78e..c837cfc81 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -110,7 +110,7 @@ public: bool CanAIAttack(Unit const* target) const override { - if (target->GetTypeId() == TYPEID_UNIT && !secondPhase) + if (target->IsCreature() && !secondPhase) { return false; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index eee82b933..7cccc6479 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -587,7 +587,7 @@ class spell_hate_to_zero : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleHit(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp index 9abac7475..9d1d0033e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp @@ -129,7 +129,7 @@ class spell_mc_play_dead_aura : public AuraScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 305091957..e93336e13 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -155,7 +155,7 @@ struct boss_priestess_delrissa : public ScriptedAI void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; if (PlayersKilled < SAY_DEATH) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index eb9e7777b..1b3df4fd4 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -678,7 +678,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (PlayerGUID || who->GetTypeId() != TYPEID_PLAYER || !who->IsWithinDist(me, INTERACTION_DISTANCE)) + if (PlayerGUID || !who->IsPlayer() || !who->IsWithinDist(me, INTERACTION_DISTANCE)) return; if (MeetQuestCondition(who->ToPlayer())) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index c018ba6a8..39de1d1c0 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -458,7 +458,7 @@ public: { Position pos = LightOfDawnFightPos[urand(0, 9)]; if (Unit* target = cr->SelectNearbyTarget(nullptr, 10.0f)) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->GetMotionMaster()->MoveCharge(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), me->GetSpeed(MOVE_RUN)); cr->GetMotionMaster()->MoveCharge(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), me->GetSpeed(MOVE_RUN)); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 87a22ba7c..0c068d070 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -389,7 +389,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_UNIT) + if (!summoner->IsCreature()) { return; } diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp index 4ed70e573..ce5bd7764 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp @@ -64,7 +64,7 @@ public: void OnUnitDeath(Unit* unit) override { - if (unit->GetTypeId() == TYPEID_UNIT && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS) + if (unit->IsCreature() && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS) _dragonkinList.remove(unit->GetGUID()); if (unit->GetEntry() == NPC_JAMMAL_AN_THE_PROPHET) { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index d832b3088..bce86175d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -533,7 +533,7 @@ class DoorsGuidCheck public: bool operator()(WorldObject* object) const { - if (object->GetTypeId() != TYPEID_UNIT) + if (!object->IsCreature()) return true; Creature* cr = object->ToCreature(); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 163b60d6d..ecf69c19f 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -1088,7 +1088,7 @@ class spell_kiljaeden_sinister_reflection_clone : public SpellScript WorldObject* target = targets.front(); targets.clear(); - if (target && target->GetTypeId() == TYPEID_UNIT) + if (target && target->IsCreature()) { target->ToCreature()->AI()->SetData(1, GetCaster()->getClass()); targets.push_back(target); @@ -1133,7 +1133,7 @@ class spell_kiljaeden_darkness_aura : public AuraScript void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - if (GetUnitOwner()->GetTypeId() == TYPEID_UNIT) + if (GetUnitOwner()->IsCreature()) GetUnitOwner()->ToCreature()->AI()->DoAction(ACTION_NO_KILL_TALK); GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE, true); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 03268f04e..ade6501fa 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -393,7 +393,7 @@ class spell_entropius_negative_energy : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void FilterTargets(std::list& targets) diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp index 7e597eada..6b9916e2a 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp @@ -183,7 +183,7 @@ public: bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT && GetUnitOwner()->GetMapId() == MAP_ULDAMAN; + return GetUnitOwner()->IsCreature() && GetUnitOwner()->GetMapId() == MAP_ULDAMAN; } void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 1d14f0ff0..4698c81db 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -209,7 +209,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; reviveGUID = victim->GetGUID(); @@ -449,7 +449,7 @@ public: { if (!me || !target) return false; - if (target->GetTypeId() != TYPEID_PLAYER || !me->IsWithinLOSInMap(target)) + if (!target->IsPlayer() || !me->IsWithinLOSInMap(target)) return false; return true; })) @@ -540,7 +540,7 @@ public: void JustEngagedWith(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; _scheduler.Schedule(6s, 12s, [this](TaskContext context) @@ -557,7 +557,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; reviveGUID = victim->GetGUID(); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index 60ae3fa1c..f9bd23b6a 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -217,7 +217,7 @@ private: { Unit* target = SelectTarget(SelectTargetMethod::Random, 0, [this](Unit* target) -> bool { - if (target->GetTypeId() != TYPEID_PLAYER || target->getPowerType() != Powers::POWER_MANA) + if (!target->IsPlayer() || target->getPowerType() != Powers::POWER_MANA) return false; if (me->IsWithinMeleeRange(target) || me->GetVictim() == target) return false; diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 244d503b7..103c17bb9 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -239,7 +239,7 @@ public: { if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) { - if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive() && !summoner->IsInCombat()) + if (summoner->IsCreature() && summoner->IsAlive() && !summoner->IsInCombat()) summoner->ToCreature()->AI()->AttackStart(who); } } @@ -253,7 +253,7 @@ public: { if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) { - if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive()) + if (summoner->IsCreature() && summoner->IsAlive()) summoner->ToCreature()->DisappearAndDie(); } } @@ -267,7 +267,7 @@ public: if (me->IsSummon()) { Unit* summoner = me->ToTempSummon()->GetSummonerUnit(); - if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAIEnabled) + if (summoner && summoner->IsCreature() && summoner->IsAIEnabled) { npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI* ai = CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, summoner->GetAI()); diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 6e888f622..ad8d4a73c 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -140,7 +140,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (!who || who->GetTypeId() != TYPEID_PLAYER) + if (!who || !who->IsPlayer()) return; if (me->FindNearestGameObject(GO_BEACON_TORCH, 10.0f)) diff --git a/src/server/scripts/Events/brewfest.cpp b/src/server/scripts/Events/brewfest.cpp index b04f32701..4a0c96b4a 100644 --- a/src/server/scripts/Events/brewfest.cpp +++ b/src/server/scripts/Events/brewfest.cpp @@ -1584,7 +1584,7 @@ struct npc_coren_direbrew : public ScriptedAI void MoveInLineOfSight(Unit* who) override { - if (!_events.IsInPhase(PHASE_ALL) || who->GetTypeId() != TYPEID_PLAYER) + if (!_events.IsInPhase(PHASE_ALL) || !who->IsPlayer()) { return; } diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp index 3e4eacfc1..314235ab1 100644 --- a/src/server/scripts/Events/midsummer.cpp +++ b/src/server/scripts/Events/midsummer.cpp @@ -332,7 +332,7 @@ struct npc_midsummer_bonfire : public ScriptedAI void SpellHit(Unit* caster, SpellInfo const* spellInfo) override { - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) return; switch (spellInfo->Id) @@ -1172,7 +1172,7 @@ class spell_midsummer_juggling_torch : public SpellScript void HandleFinish() { Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; if (const WorldLocation* loc = GetExplTargetDest()) diff --git a/src/server/scripts/Events/pilgrims_bounty.cpp b/src/server/scripts/Events/pilgrims_bounty.cpp index 86e7ed523..0a5ee60d4 100644 --- a/src/server/scripts/Events/pilgrims_bounty.cpp +++ b/src/server/scripts/Events/pilgrims_bounty.cpp @@ -571,7 +571,7 @@ class spell_pilgrims_bounty_serve_generic : public AuraScript void OnAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp index 2a21d7205..5081432e5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp @@ -90,7 +90,7 @@ struct boss_aeonus : public BossAI void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) + if (who->IsCreature() && who->GetEntry() == NPC_TIME_KEEPER) { if (me->IsWithinDistInMap(who, 20.0f)) { diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp index 3f2aaaf13..c835be08e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp @@ -79,7 +79,7 @@ enum Spells void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) + if (who->IsCreature() && who->GetEntry() == NPC_TIME_KEEPER) { if (me->IsWithinDistInMap(who, 20.0f)) { diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp index b5ec43ce7..35b7f2654 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp @@ -90,7 +90,7 @@ struct boss_temporus : public BossAI void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) + if (who->IsCreature() && who->GetEntry() == NPC_TIME_KEEPER) { if (me->IsWithinDistInMap(who, 20.0f)) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index 184037492..f7ec9c838 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -367,7 +367,7 @@ struct boss_vem : public boss_bug_trio { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, [this](Unit* target) -> bool { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (me->IsWithinMeleeRange(target) || target == me->GetVictim()) return false; diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index b7206f9d9..14076a4d5 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -180,7 +180,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_UNIT || !victim->IsSummon()) + if (!victim->IsCreature() || !victim->IsSummon()) return; if (Unit* vehSummoner = victim->ToTempSummon()->GetSummonerUnit()) diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 6d4fc105e..477bbea29 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -124,7 +124,7 @@ public: return; //only aggro text if not player and only in this area - if (who->GetTypeId() != TYPEID_PLAYER && me->GetAreaId() == AREA_MERCHANT_COAST) + if (!who->IsPlayer() && me->GetAreaId() == AREA_MERCHANT_COAST) { //appears to be pretty much random (possible only if escorter not in combat with who yet?) Talk(SAY_GIL_AGGRO, who); @@ -325,7 +325,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (!who->IsAlive() || EventInProgress || who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsAlive() || EventInProgress || !who->IsPlayer()) return; if (me->IsWithinDistInMap(who, 10.0f) && who->ToPlayer()->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE) diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index d599c462c..c32f6490c 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -95,7 +95,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (!_initTalk) diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp index 54a382f5b..f386515dc 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp @@ -347,7 +347,7 @@ class spell_herald_volzaj_insanity : public SpellScript { PrepareSpellScript(spell_herald_volzaj_insanity); - bool Load() override { return GetCaster()->GetTypeId() == TYPEID_UNIT; } + bool Load() override { return GetCaster()->IsCreature(); } void HandleDummyEffect(std::list& targets) { @@ -362,7 +362,7 @@ class spell_herald_volzaj_insanity : public SpellScript { targets.remove_if([this](WorldObject* targetObj) -> bool { - return !targetObj || targetObj->GetTypeId() != TYPEID_PLAYER || !targetObj->ToPlayer()->IsInCombatWith(GetCaster()) || + return !targetObj || !targetObj->IsPlayer() || !targetObj->ToPlayer()->IsInCombatWith(GetCaster()) || targetObj->GetDistance(GetCaster()) >= (MAX_VISIBILITY_DISTANCE * 2); }); } @@ -466,7 +466,7 @@ class spell_volazj_whisper : public SpellScript }); } - bool Load() override { return GetCaster()->GetTypeId() == TYPEID_UNIT; } + bool Load() override { return GetCaster()->IsCreature(); } void HandleScriptEffect(SpellEffIndex /* effIndex */) { diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp index 934e4b3e7..574db0338 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp @@ -333,7 +333,7 @@ struct boss_jedoga_shadowseeker : public BossAI void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) { return; } diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp index 2bf096992..c8e970d07 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp @@ -307,7 +307,7 @@ struct boss_taldaram : public BossAI void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) { return; } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index fe4ad7c8a..6428031cf 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -925,7 +925,7 @@ struct boss_sartharion_dragonAI : public BossAI void KilledUnit(Unit* victim) final { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) { return; } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 7e4e3d92a..a63f52bda 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1053,7 +1053,7 @@ class spell_halion_twilight_phasing : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void Phase() @@ -1116,7 +1116,7 @@ class spell_halion_twilight_realm_aura : public AuraScript return; target->RemoveAurasDueToSpell(SPELL_FIERY_COMBUSTION, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL); - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + if (!GetTarget()->IsPlayer()) return; GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); } @@ -1149,7 +1149,7 @@ class spell_halion_leave_twilight_realm_aura : public AuraScript { GetTarget()->RemoveAurasDueToSpell(SPELL_TWILIGHT_REALM); - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + if (!GetTarget()->IsPlayer()) return; GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 554ae002c..63b002435 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -765,7 +765,7 @@ class spell_toc5_light_rain : public SpellScript { for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) { - if ((*itr)->GetTypeId() == TYPEID_UNIT) + if ((*itr)->IsCreature()) if ((*itr)->ToCreature()->GetEntry() == NPC_FOUNTAIN_OF_LIGHT) { targets.erase(itr); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index cb8d3be45..7ed03a36d 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -691,7 +691,7 @@ public: if( me->GetExactDist(plr) <= 5.0f ) if( Vehicle* v = plr->GetVehicle() ) if( Unit* c = v->GetBase() ) - if( c->GetTypeId() == TYPEID_UNIT && c->ToCreature()->GetEntry() == (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? VEHICLE_ARGENT_BATTLEWORG : VEHICLE_ARGENT_WARHORSE) ) + if( c->IsCreature() && c->ToCreature()->GetEntry() == (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? VEHICLE_ARGENT_BATTLEWORG : VEHICLE_ARGENT_WARHORSE) ) { me->GetMotionMaster()->MovementExpired(); me->GetMotionMaster()->MoveIdle(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp index 746728d3e..76b54fe59 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp @@ -1156,7 +1156,7 @@ public: { NPC_BlackKnightGUID = bk->GetGUID(); bk->SendMovementFlagUpdate(); // put him on vehicle visually - if( bk->GetTypeId() == TYPEID_UNIT ) + if( bk->IsCreature() ) bk->ToCreature()->SetReactState(REACT_PASSIVE); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 6dfdf56a0..bb41e7eee 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -400,7 +400,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDistSq(who) > 6400.0f) // 80yd*80yd + if (!who->IsPlayer() || me->GetExactDistSq(who) > 6400.0f) // 80yd*80yd return; if (me->getStandState() != UNIT_STAND_STATE_STAND) @@ -846,7 +846,7 @@ public: { target->UpdatePosition(*c, false); target->CastCustomSpell(SPELL_SPIKE_FAIL, SPELLVALUE_MAX_TARGETS, 1); - if( target->GetTypeId() == TYPEID_UNIT ) + if( target->IsCreature() ) target->ToCreature()->AI()->DoAction(-1); Remove(); return; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 5423cf881..01a4a7203 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -172,7 +172,7 @@ public: break; case EVENT_SPELL_FIRE_BOMB: { - if( t->GetTypeId() != TYPEID_PLAYER && pInstance ) + if( !t->IsPlayer() && pInstance ) { GuidVector validPlayers; Map::PlayerList const& pl = me->GetMap()->GetPlayers(); @@ -342,7 +342,7 @@ public: if( Vehicle* vk = me->GetVehicleKit() ) if( Unit* snobold = vk->GetPassenger(4) ) { - if( snobold->GetTypeId() == TYPEID_UNIT ) + if( snobold->IsCreature() ) { CAST_AI(npc_snobold_vassal::npc_snobold_vassalAI, snobold->ToCreature()->AI())->TargetGUID = PlayerGUID; snobold->ToCreature()->AI()->AttackStart(p); @@ -357,7 +357,7 @@ public: { events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, 5s); if( Unit* snobold = vk->GetPassenger(4) ) - if( snobold->GetTypeId() == TYPEID_UNIT ) + if( snobold->IsCreature() ) { bool needDespawn = true; for( uint8 i = 0; i < 4; ++i ) diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index 2710c6063..8e872f2ec 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -84,7 +84,7 @@ class spell_dtk_raise_dead_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index 70e2fb391..076d0c4ac 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -258,7 +258,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; int32 textId = 0; @@ -347,7 +347,7 @@ class spell_wailing_souls_periodic_aura : public AuraScript { t->SetControlled(false, UNIT_STATE_ROOT); t->DisableRotate(false); - if (t->GetTypeId() == TYPEID_UNIT) + if (t->IsCreature()) t->ToCreature()->SetReactState(REACT_AGGRESSIVE); if (t->GetVictim()) { diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 12fc5a6f0..12eb4361c 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -333,7 +333,7 @@ class spell_garfrost_permafrost : public SpellScript if (valid) { if (Aura* aur = target->ToUnit()->GetAura(70336)) - if (aur->GetStackAmount() >= 10 && caster->GetTypeId() == TYPEID_UNIT) + if (aur->GetStackAmount() >= 10 && caster->IsCreature()) caster->ToCreature()->AI()->SetData(1, aur->GetStackAmount()); targetList.push_back(*itrU); } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index d2babe69a..3148377a6 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -470,7 +470,7 @@ class spell_krick_explosive_barrage_aura : public AuraScript { PreventDefaultAction(); if (Unit* caster = GetCaster()) - if (caster->GetTypeId() == TYPEID_UNIT) + if (caster->IsCreature()) { Map::PlayerList const& players = caster->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) @@ -505,7 +505,7 @@ class spell_exploding_orb_auto_grow_aura : public AuraScript target->RemoveAurasDueToSpell(SPELL_HASTY_GROW); target->RemoveAurasDueToSpell(SPELL_AUTO_GROW); target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB_VISUAL); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->DespawnOrUnsummon(2000); } } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 3dcfa3e42..a4cdb0670 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -1405,7 +1405,7 @@ class spell_pos_rimefang_frost_nova : public SpellScript if (Unit* caster = GetCaster()) { Unit::Kill(caster, target); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->DespawnOrUnsummon(30000); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index c1193e442..b344f352f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -343,7 +343,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (damage > RAID_MODE(23000, 25000, 23000, 25000)) @@ -613,7 +613,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (damage > RAID_MODE(23000, 25000, 23000, 25000)) @@ -907,7 +907,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; if (damage > RAID_MODE(23000, 25000, 23000, 25000)) @@ -1102,7 +1102,7 @@ public: if (_introDone) return; - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 100.0f) + if (!who->IsPlayer() || me->GetExactDist2d(who) > 100.0f) { return; } @@ -1335,7 +1335,7 @@ public: void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) { return; } @@ -1506,7 +1506,7 @@ class spell_taldaram_summon_flame_ball : public SpellScript bool Load() override { - if (GetCaster()->GetTypeId() != TYPEID_UNIT) + if (!GetCaster()->IsCreature()) { return false; } @@ -1573,7 +1573,7 @@ class spell_valanar_kinetic_bomb_aura : public AuraScript void HandleDummyTick(AuraEffect const* /*aurEff*/) { Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) + if (!target->IsCreature()) return; if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 7686841c6..57239edd3 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -823,7 +823,7 @@ class spell_blood_queen_vampiric_bite : public SpellScript return; } - if (GetCaster()->GetTypeId() != TYPEID_PLAYER || GetCaster()->GetMapId() != 631) + if (!GetCaster()->IsPlayer() || GetCaster()->GetMapId() != 631) return; InstanceScript* instance = GetCaster()->GetInstanceScript(); if (!instance || instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != IN_PROGRESS) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index eb84105c7..78f23ff95 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -1259,7 +1259,7 @@ class spell_deathbringer_boiling_blood : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void FilterTargets(std::list& targets) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 0073e7cb5..52b5095a9 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -290,13 +290,13 @@ class spell_festergut_pungent_blight : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_UNIT) + if (!caster->IsCreature()) return; // Get Inhaled Blight id for our difficulty @@ -383,7 +383,7 @@ public: bool OnCheck(Player* /*source*/, Unit* target, uint32 /*criteria_id*/) override { - if (target && target->GetTypeId() == TYPEID_UNIT) + if (target && target->IsCreature()) return target->ToCreature()->AI()->GetData(DATA_INOCULATED_STACK) < 3; return false; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index cac357457..c70c69018 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -602,7 +602,7 @@ public: Transport::PassengerSet const& passengers = t->GetStaticPassengers(); for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != NPC_GUNSHIP_HULL) + if (!(*itr)->IsCreature() || (*itr)->GetEntry() != NPC_GUNSHIP_HULL) continue; (*itr)->ToCreature()->CastSpell((*itr)->ToCreature(), explosionSpell, true); } @@ -615,7 +615,7 @@ public: Transport::PassengerSet const& passengers = t->GetStaticPassengers(); for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != cannonEntry) + if (!(*itr)->IsCreature() || (*itr)->GetEntry() != cannonEntry) continue; Creature* cannon = (*itr)->ToCreature(); cannon->CastSpell(cannon, SPELL_EJECT_ALL_PASSENGERS, true); @@ -661,7 +661,7 @@ public: Transport::PassengerSet const& passengers = t->GetPassengers(); for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - if ((*itr)->GetTypeId() != TYPEID_UNIT) + if (!(*itr)->IsCreature()) continue; Creature* c = (*itr)->ToCreature(); if (c->GetEntry() == NPC_SKYBREAKER_MARINE || c->GetEntry() == NPC_SKYBREAKER_SERGEANT || c->GetEntry() == NPC_KOR_KRON_REAVER || c->GetEntry() == NPC_KOR_KRON_SERGEANT) @@ -2080,7 +2080,7 @@ class spell_igb_check_for_players : public SpellScript bool Load() override { _playerCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void CountTargets(std::list& targets) @@ -2302,7 +2302,7 @@ class spell_igb_cannon_blast : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void CalculatePower() @@ -2467,7 +2467,7 @@ public: bool operator()(WorldObject* unit) { - return unit->GetTypeId() != TYPEID_PLAYER || unit->GetPositionZ() > 478.0f || !unit->GetTransport() || unit->GetTransport()->GetEntry() != _entry + return !unit->IsPlayer() || unit->GetPositionZ() > 478.0f || !unit->GetTransport() || unit->GetTransport()->GetEntry() != _entry || unit->GetMapHeight(unit->GetPhaseMask(), unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ()) < 465.0f; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 17d68df61..f67ad6333 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -84,7 +84,7 @@ public: if (target->GetExactDist(_source) > 175.0f) return false; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (target->GetPositionX() > -337.0f) @@ -415,7 +415,7 @@ public: { if (Unit* u = v->GetBase()) { - if (u->GetEntry() == NPC_BONE_SPIKE && u->GetTypeId() == TYPEID_UNIT) + if (u->GetEntry() == NPC_BONE_SPIKE && u->IsCreature()) { u->ToCreature()->AI()->DoAction(-1337); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 8753fefb4..64852ccb6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -209,7 +209,7 @@ public: bool operator()(Unit const* target) const { - if (!me || !target || target->GetTypeId() != TYPEID_PLAYER) + if (!me || !target || !target->IsPlayer()) return false; if (me->IsWithinCombatRange(target, 7.0f)) @@ -952,7 +952,7 @@ class spell_putricide_unstable_experiment : public SpellScript void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - if (GetCaster()->GetTypeId() != TYPEID_UNIT) + if (!GetCaster()->IsCreature()) return; Creature* creature = GetCaster()->ToCreature(); @@ -1044,7 +1044,7 @@ class spell_putricide_ooze_channel : public SpellScript bool Load() override { _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void SelectTarget(std::list& targets) @@ -1318,7 +1318,7 @@ class spell_putricide_mutation_init : public SpellScript if (!GetExplTargetUnit()) return SPELL_FAILED_BAD_TARGETS; - if (GetExplTargetUnit()->GetTypeId() != TYPEID_PLAYER) + if (!GetExplTargetUnit()->IsPlayer()) return SPELL_FAILED_TARGET_NOT_PLAYER; SpellCustomErrors extension = SPELL_CUSTOM_ERROR_NONE; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index b0b845e3d..e9e7acfbd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -360,7 +360,7 @@ public: if (!summoner) return; - if (summoner->GetTypeId() != TYPEID_UNIT) + if (!summoner->IsCreature()) { return; } @@ -651,7 +651,7 @@ class spell_rotface_large_ooze_combine : public SpellScript if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_ROTFACE))) if (rotface->IsAlive()) { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); } @@ -708,7 +708,7 @@ class spell_rotface_large_ooze_buff_combine : public SpellScript if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_ROTFACE))) if (rotface->IsAlive()) { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); } @@ -792,7 +792,7 @@ class spell_rotface_unstable_ooze_explosion_suicide_aura : public AuraScript { PreventDefaultAction(); Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) + if (!target->IsCreature()) return; target->SetVisible(false); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 1295c9d1a..85a564b39 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -252,7 +252,7 @@ public: if (target->GetExactDist(_source) > 80.0f) return false; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (target->HasAura(SPELL_FROST_IMBUED_BLADE)) @@ -1154,7 +1154,7 @@ class spell_sindragosa_soul_preservation_aura : public AuraScript { s->CastSpell(s, 72466, true); s->RemoveAurasDueToSpell(72424); - if (s->GetTypeId() == TYPEID_UNIT) s->ToCreature()->SetLootMode(3); + if (s->IsCreature()) s->ToCreature()->SetLootMode(3); SetDuration(1); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 6285b3500..2b99e1127 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -386,7 +386,7 @@ public: return false; if (!target->IsAlive()) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (_maxDist && _source->GetExactDist(target) > _maxDist) return false; @@ -412,7 +412,7 @@ public: return false; if (!target->IsAlive()) return false; - if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) + if (_playerOnly && !target->IsPlayer()) return false; if (target == _source->GetVictim()) return false; @@ -446,7 +446,7 @@ public: return false; if (!target->IsAlive()) return false; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return false; if (_source->GetExactDist(target) > 100.0f) return false; @@ -600,7 +600,7 @@ public: bool operator()(Unit* unit) const { - if (!unit || unit->GetTypeId() != TYPEID_PLAYER || unit == _sourceObj || _sourceObj->GetVictim() == unit || !unit->isTargetableForAttack()) + if (!unit || !unit->IsPlayer() || unit == _sourceObj || _sourceObj->GetVictim() == unit || !unit->isTargetableForAttack()) return false; if (unit->HasAura(SPELL_PLAGUE_AVOIDANCE) || unit->HasAura(SPELL_BOSS_HITTIN_YA_AURA) || unit->HasAura(_notAura1) || unit->HasAura(_notAura2)) return false; @@ -2078,7 +2078,7 @@ class spell_the_lich_king_shadow_trap_periodic : public SpellScript GetCaster()->CastSpell((Unit*)nullptr, SPELL_SHADOW_TRAP_KNOCKBACK, true); if (Aura* a = GetCaster()->GetAura(SPELL_SHADOW_TRAP_AURA)) a->SetDuration(0); - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->DespawnOrUnsummon(3000); } @@ -2102,7 +2102,7 @@ class spell_the_lich_king_ice_burst_target_search : public SpellScript if (unitList.empty()) return; - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) GetCaster()->ToCreature()->AI()->DoAction(-1); } @@ -2336,7 +2336,7 @@ class VehicleCheck public: bool operator()(WorldObject* unit) { - return (unit->GetTypeId() != TYPEID_UNIT && unit->GetTypeId() != TYPEID_PLAYER) || unit->ToUnit()->GetVehicle(); + return (!unit->IsCreature() && !unit->IsPlayer()) || unit->ToUnit()->GetVehicle(); } }; @@ -2804,7 +2804,7 @@ class spell_the_lich_king_vile_spirit_move_target_search : public SpellScript bool Load() override { _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void SelectTarget(std::list& targets) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 86adf4725..df7969c4c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -967,7 +967,7 @@ public: bool CanAIAttack(Unit const* target) const override { // do not see targets inside Frostwing Halls when we are not there - return target->GetTypeId() != TYPEID_PLAYER && (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && target->GetEntry() != NPC_SINDRAGOSA; + return !target->IsPlayer() && (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && target->GetEntry() != NPC_SINDRAGOSA; } private: @@ -1757,7 +1757,7 @@ public: void SpellHitTarget(Unit* c, SpellInfo const* spell) override { - if (spell->Id == 71306 && c->GetTypeId() == TYPEID_UNIT) // Twisted Winds + if (spell->Id == 71306 && c->IsCreature()) // Twisted Winds { Position myPos = me->GetPosition(); me->NearTeleportTo(c->GetPositionX(), c->GetPositionY(), c->GetPositionZ(), c->GetOrientation()); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index f4f6ca1d6..57edeb32f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -146,7 +146,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index db38740c3..ad9c534a6 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -143,7 +143,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (!urand(0, 3)) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 3ba4157b5..556371bb2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -258,7 +258,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index b5211f913..ba1e94e1a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -323,7 +323,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_KILL); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index 5dd6374b0..c91f67ba7 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -97,7 +97,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 725e0c0f1..72588d466 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -263,7 +263,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); @@ -565,7 +565,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER && !who->IsPet()) + if (!who->IsPlayer() && !who->IsPet()) return; ScriptedAI::MoveInLineOfSight(who); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index be528f529..c461384fd 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -206,7 +206,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index 0ae9feaf5..aa61c5fb1 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -78,7 +78,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (!urand(0, 3)) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp index 53a488598..77a687572 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp @@ -222,7 +222,7 @@ public: void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override { // Damage done by the controlled Death Knight understudies should also count toward damage done by players - if(who && who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_DEATH_KNIGHT_UNDERSTUDY) + if(who && who->IsCreature() && who->GetEntry() == NPC_DEATH_KNIGHT_UNDERSTUDY) { me->LowerPlayerDamageReq(damage); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index 58ec8e4ce..dd25921e9 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -210,7 +210,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_SLAY); @@ -490,7 +490,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (pInstance) @@ -648,7 +648,7 @@ class spell_thaddius_pos_neg_charge : public SpellScript if (!target) return; - if (target->HasAura(GetTriggeringSpell()->Id) || target->GetTypeId() != TYPEID_PLAYER) + if (target->HasAura(GetTriggeringSpell()->Id) || !target->IsPlayer()) { SetHitDamage(0); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index c3efec7bf..162579292 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -245,7 +245,7 @@ class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 958af9464..0e54a5e37 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -354,7 +354,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner->IsPlayer()) { return; } @@ -392,7 +392,7 @@ public: void PassengerBoarded(Unit* passenger, int8 /*seatid*/, bool add) override { - if (passenger->GetTypeId() != TYPEID_PLAYER) + if (!passenger->IsPlayer()) return; if (add) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 919cdbcc8..9435ba649 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -197,7 +197,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index 2624f55ad..0524fd43f 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -132,7 +132,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index e41c57ace..0ad61d242 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -162,7 +162,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 3de2a1263..c64594b11 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -183,7 +183,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 3374fad99..9eec77e62 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -401,7 +401,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) return; Talk(SAY_ALGALON_KILL); @@ -1018,7 +1018,7 @@ public: void SpellHit(Unit* caster, SpellInfo const* spell) override { - if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || caster->GetTypeId() != TYPEID_UNIT) + if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || !caster->IsCreature()) return; if (InstanceScript* instance = me->GetInstanceScript()) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index aaef1709b..8007e94d9 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -310,7 +310,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; if (_phase == 3) @@ -488,7 +488,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER) + if (!who->IsPlayer()) return; Talk(SAY_MOLGEIM_SLAY); @@ -706,7 +706,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!who->IsPlayer() || urand(0, 2)) return; Talk(SAY_BRUNDIR_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index b1b8fb589..101116798 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -194,7 +194,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 471f6784d..7b1ebde90 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -447,7 +447,7 @@ public: case EVENT_REINSTALL: for (uint8 i = RAID_MODE(0, 2); i < 4; ++i) if (Unit* seat = vehicle->GetPassenger(i)) - if (seat->GetTypeId() == TYPEID_UNIT) + if (seat->IsCreature()) seat->ToCreature()->AI()->EnterEvadeMode(); Talk(FLAME_LEVIATHAN_EMOTE_REACTIVATE); return; @@ -758,7 +758,7 @@ public: void PassengerBoarded(Unit* who, int8 seatId, bool apply) override { - if (who->GetTypeId() != TYPEID_PLAYER || !me->GetVehicle()) + if (!who->IsPlayer() || !me->GetVehicle()) return; who->ApplySpellImmune(63847, IMMUNITY_ID, 63847, apply); // SPELL_FLAME_VENTS_TRIGGER @@ -780,7 +780,7 @@ public: { turret->ReplaceAllUnitFlags(UNIT_FLAG_NOT_SELECTABLE); turret->SetImmuneToAll(true); - if (turret->GetTypeId() == TYPEID_UNIT) + if (turret->IsCreature()) turret->ToCreature()->AI()->EnterEvadeMode(); } } @@ -829,7 +829,7 @@ public: bool CanAIAttack(Unit const* who) const override { - if (!who || who->GetTypeId() != TYPEID_PLAYER || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) + if (!who || !who->IsPlayer() || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) return false; return true; } @@ -1231,7 +1231,7 @@ public: { if (!_lock) { - if (who->GetTypeId() != TYPEID_PLAYER && !who->IsVehicle()) + if (!who->IsPlayer() && !who->IsVehicle()) return; // MIMIRON @@ -1753,7 +1753,7 @@ class spell_vehicle_grab_pyrite : public SpellScript GetCaster()->CastSpell(parent, SPELL_ADD_PYRITE, true); target->CastSpell(seat, GetEffectValue()); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->DespawnOrUnsummon(1300); } } @@ -1927,7 +1927,7 @@ class spell_demolisher_ride_vehicle : public SpellScript SpellCastResult CheckCast() { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + if (!GetCaster()->IsPlayer()) return SPELL_CAST_OK; Unit* target = this->GetExplTargetUnit(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 92581c758..aa4419540 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -307,7 +307,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + if (!victim->IsPlayer() || urand(0, 2)) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 872d9340d..be71517da 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -486,7 +486,7 @@ class spell_aura_of_despair_aura : public AuraScript if (Unit* caster = GetCaster()) if (Unit* target = GetTarget()) { - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; target->CastSpell(target, SPELL_AURA_OF_DESPAIR_2, true); @@ -614,7 +614,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_VEZAX && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(1); + return target && target->GetEntry() == NPC_VEZAX && target->IsCreature() && target->ToCreature()->AI()->GetData(1); } }; @@ -625,7 +625,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_VEZAX && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(2); + return target && target->GetEntry() == NPC_VEZAX && target->IsCreature() && target->ToCreature()->AI()->GetData(2); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index e526e3299..7c1dbd136 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -578,7 +578,7 @@ public: { if (t->IsPlayer()) return !t->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER); - else if (t->GetTypeId() == TYPEID_UNIT) + else if (t->IsCreature()) return !t->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC); return true; @@ -702,7 +702,7 @@ public: { if (Unit* s = me->ToTempSummon()->GetSummonerUnit()) { - if ((s->IsPlayer() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) || (s->GetTypeId() == TYPEID_UNIT && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))) + if ((s->IsPlayer() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) || (s->IsCreature() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))) me->DespawnOrUnsummon(2000); else if (s->IsPlayer()) if (InstanceScript* instanceScript = me->GetInstanceScript()) @@ -1354,14 +1354,14 @@ class spell_hodir_flash_freeze_aura : public AuraScript { Unit* target = GetTarget(); Unit* caster = GetCaster(); - if (!target || !caster || caster->GetTypeId() != TYPEID_UNIT) + if (!target || !caster || !caster->IsCreature()) return; if (Aura* aur = target->GetAura(target->IsPlayer() ? SPELL_FLASH_FREEZE_TRAPPED_PLAYER : SPELL_FLASH_FREEZE_TRAPPED_NPC)) { if (Unit* caster2 = aur->GetCaster()) { - if (caster2->GetTypeId() == TYPEID_UNIT) + if (caster2->IsCreature()) { caster2->ToCreature()->DespawnOrUnsummon(); } @@ -1378,7 +1378,7 @@ class spell_hodir_flash_freeze_aura : public AuraScript caster->ToCreature()->AI()->JustSummoned(c); } } - else if (target->GetTypeId() == TYPEID_UNIT) + else if (target->IsCreature()) { if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_NPC, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000) ) { @@ -1483,7 +1483,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(1); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(1); } }; @@ -1494,7 +1494,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(2); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(2); } }; @@ -1505,7 +1505,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(3); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(3); } }; @@ -1516,7 +1516,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_HODIR && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(4); + return target && target->GetEntry() == NPC_HODIR && target->IsCreature() && target->ToCreature()->AI()->GetData(4); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index 7277c0257..f44e278d4 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -542,7 +542,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - if (!target || target->GetTypeId() != TYPEID_UNIT) + if (!target || !target->IsCreature()) return false; return !!target->ToCreature()->AI()->GetData(1337); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index f9210e80c..fdbebae70 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -707,7 +707,7 @@ public: if (target == _victim && _me->GetThreatMgr().GetThreatListSize() > 1) return true; - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return true; return false; @@ -724,7 +724,7 @@ class spell_ulduar_stone_grip_cast_target : public SpellScript bool Load() override { - if (GetCaster()->GetTypeId() != TYPEID_UNIT) + if (!GetCaster()->IsCreature()) return false; return true; } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index a80545c36..5ced2828d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -1342,7 +1342,7 @@ public: if( Vehicle* vk = me->GetVehicleKit() ) for (uint8 i = 0; i < 2; ++i) if (Unit* r = vk->GetPassenger(5 + i)) - if (r->GetTypeId() == TYPEID_UNIT) + if (r->IsCreature()) r->ToCreature()->DespawnOrUnsummon(1); } @@ -1438,7 +1438,7 @@ public: exitPos.m_positionZ += 2.0f * Phase; r->_ExitVehicle(&exitPos); me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE, r->GetGUID()); - if (r->GetTypeId() == TYPEID_UNIT) + if (r->IsCreature()) r->ToCreature()->AI()->SetData(0, 0); } } @@ -2155,7 +2155,7 @@ class spell_mimiron_p3wx2_laser_barrage_aura : public AuraScript { if (Unit* caster = GetCaster()) { - if (caster->GetTypeId() != TYPEID_UNIT) + if (!caster->IsCreature()) return; uint32 diff = getMSTimeDiff(_lastMSTime, GameTime::GetGameTimeMS().count()); if (_lastOrientation == -1.0f) @@ -2466,7 +2466,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(1); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && target->ToCreature()->AI()->GetData(1); } }; @@ -2477,7 +2477,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->AI()->GetData(11); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && !target->ToCreature()->AI()->GetData(11); } }; @@ -2488,7 +2488,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->AI()->GetData(12); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && !target->ToCreature()->AI()->GetData(12); } }; @@ -2499,7 +2499,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetEntry() == NPC_MIMIRON && target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->AI()->GetData(13); + return target && target->GetEntry() == NPC_MIMIRON && target->IsCreature() && !target->ToCreature()->AI()->GetData(13); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 1baf2d1dd..985c014da 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -711,7 +711,7 @@ public: if (_introSpoken) return; - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 15.0f) + if (!who->IsPlayer() || me->GetExactDist2d(who) > 15.0f) return; _introSpoken = true; @@ -1153,7 +1153,7 @@ public: bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { - return target && target->GetTypeId() == TYPEID_UNIT && target->GetEntry() == NPC_RAZORSCALE && target->ToCreature()->AI()->GetData(1); + return target && target->IsCreature() && target->GetEntry() == NPC_RAZORSCALE && target->ToCreature()->AI()->GetData(1); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 98e944888..c67299d86 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -427,7 +427,7 @@ public: { summons.Summon(cr); if (Unit* owner = me->GetVehicleBase()) - if (owner->GetTypeId() == TYPEID_UNIT) + if (owner->IsCreature()) owner->ToCreature()->AI()->JustSummoned(cr); } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index df26adcb6..bf51c0556 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -1103,7 +1103,7 @@ public: if (Creature* algalon = instance->GetCreature(m_uiAlgalonGUID)) algalon->AI()->DoAction(ACTION_FEEDS_ON_TEARS_FAILED); } - else if (unit->GetTypeId() == TYPEID_UNIT && unit->GetAreaId() == 4656 /*Conservatory of Life*/) + else if (unit->IsCreature() && unit->GetAreaId() == 4656 /*Conservatory of Life*/) { if (GameTime::GetGameTime().count() > (m_conspeedatoryAttempt + DAY)) { diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index c196312e4..5222dcae7 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -328,7 +328,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (!victim->IsPlayer()) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index aa7d0e250..35409dd8b 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -404,7 +404,7 @@ class spell_svala_ritual_strike : public SpellScript { if (Unit* unitTarget = GetHitUnit()) { - if (unitTarget->GetTypeId() != TYPEID_UNIT) + if (!unitTarget->IsCreature()) return; Unit::DealDamage(GetCaster(), unitTarget, 7000, nullptr, DIRECT_DAMAGE); diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 001b2dfb2..6b02fe826 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -217,7 +217,7 @@ public: void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) { Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_UNIT && GetAura()->GetStackAmount() >= 10) + if (target->IsCreature() && GetAura()->GetStackAmount() >= 10) { target->CastSpell(target, SPELL_OVERCHARGED_BLAST, true); Unit::Kill(target, target, false); diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 4355e2109..8798a5691 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -45,7 +45,7 @@ class spell_q11919_q11940_drake_hunt_aura : public AuraScript bool Load() override { - return GetOwner()->GetTypeId() == TYPEID_UNIT; + return GetOwner()->IsCreature(); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -217,7 +217,7 @@ public: { ScriptedAI::MoveInLineOfSight(who); - if (who->GetTypeId() != TYPEID_UNIT) + if (!who->IsCreature()) return; if (who->GetEntry() == NPC_ORPHANED_MAMMOTH_CALF && me->IsWithinDistInMap(who, 10.0f)) @@ -314,7 +314,7 @@ public: void JustDied(Unit* killer) override { - if (!killer || killer->GetTypeId() != TYPEID_PLAYER) + if (!killer || !killer->IsPlayer()) { return; } diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 9d0a4f893..c3525a4cd 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -694,7 +694,7 @@ public: if (Vehicle* gryphon = me->GetVehicleKit()) if (Unit* villager = gryphon->GetPassenger(1)) { - if (villager->GetTypeId() != TYPEID_UNIT) + if (!villager->IsCreature()) return; if (Creature* seat = villager->ToCreature()) @@ -1296,7 +1296,7 @@ public: if (Unit* vb = c->GetVehicleBase()) { if (Unit* pass = vb->GetVehicleKit()->GetPassenger(0)) - if (pass->GetTypeId() == TYPEID_UNIT) + if (pass->IsCreature()) pass->ToCreature()->DespawnOrUnsummon(1); vb->RemoveAllAuras(); vb->ToCreature()->DespawnOrUnsummon(1); @@ -1323,7 +1323,7 @@ public: void SpellHitTarget(Unit* target, SpellInfo const* spell) override { - if (spell->Id == SPELL_SAC_REPEL_HAMMER && target->GetTypeId() == TYPEID_UNIT) + if (spell->Id == SPELL_SAC_REPEL_HAMMER && target->IsCreature()) { target->CastSpell((Unit*)nullptr, SPELL_SAC_THROW_HAMMER, true); target->ToCreature()->DespawnOrUnsummon(1); @@ -1469,7 +1469,7 @@ public: explicit GhoulTargetCheck(bool alive) : _alive(alive) {} bool operator()(WorldObject* object) const { - return _alive ^ (object->GetTypeId() != TYPEID_UNIT || ((Unit*)object)->GetDisplayId() != 11686); + return _alive ^ (!object->IsCreature() || ((Unit*)object)->GetDisplayId() != 11686); } private: bool _alive; @@ -1489,7 +1489,7 @@ class spell_q24545_aod_special : public SpellScript { PreventHitDefaultEffect(effIndex); if (Unit* target = GetHitUnit()) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id == 70790 ? -2 : -1); } @@ -1648,7 +1648,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (!summoner || summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner || !summoner->IsPlayer()) return; uint8 id = GetSpeachId(); diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 06974fad7..4f925cfef 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -967,7 +967,7 @@ class spell_shredder_delivery : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScript(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 79cfb26da..e36fe45b5 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -139,7 +139,7 @@ public: void setphase(short newPhase) { Unit* summoner = me->ToTempSummon() ? me->ToTempSummon()->GetSummonerUnit() : nullptr; - if (!summoner || summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner || !summoner->IsPlayer()) return; switch (newPhase) diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 684b6a58b..ab3e63295 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -51,7 +51,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER || me->GetDistance(who) > 8.0f || who->ToPlayer()->GetQuestStatus(QUEST_BLACK_KNIGHT_CURSE) != QUEST_STATUS_INCOMPLETE) + if (!who->IsPlayer() || me->GetDistance(who) > 8.0f || who->ToPlayer()->GetQuestStatus(QUEST_BLACK_KNIGHT_CURSE) != QUEST_STATUS_INCOMPLETE) return; if (me->FindNearestCreature(NPC_CULT_ASSASSIN, 30.0f)) @@ -1248,7 +1248,7 @@ public: if (!summoner) return; - if (summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner->IsPlayer()) return; Player* player = summoner->ToPlayer(); @@ -1493,7 +1493,7 @@ public: if (me->GetAreaId() != AREA_SUNREAVER_PAVILION && me->GetAreaId() != AREA_SILVER_COVENANT_PAVILION) return; - if (!who || who->GetTypeId() != TYPEID_PLAYER || !me->IsHostileTo(who) || !me->isInBackInMap(who, 5.0f)) + if (!who || !who->IsPlayer() || !me->IsHostileTo(who) || !me->isInBackInMap(who, 5.0f)) return; if (who->HasAura(SPELL_TRESPASSER_H) || who->HasAura(SPELL_TRESPASSER_A)) diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index 8ab42c3f9..5c82da7a9 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -875,7 +875,7 @@ public: for (uint8 i = 1; i < 4; ++i) if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i)) { - if (prisoner->GetTypeId() != TYPEID_UNIT) + if (!prisoner->IsCreature()) return; prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true); prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true); diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp index 403fafd97..1fb4a1231 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp @@ -322,7 +322,7 @@ void OPvPCapturePointHP::HandlePlayerLeave(Player* player) void OutdoorPvPHP::HandleKillImpl(Player* player, Unit* killed) { - if (killed->GetTypeId() != TYPEID_PLAYER) + if (!killed->IsPlayer()) return; if (player->GetTeamId() == TEAM_ALLIANCE && killed->ToPlayer()->GetTeamId() != TEAM_ALLIANCE) diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp index f8b8664d7..6db94e287 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp @@ -56,7 +56,7 @@ void OutdoorPvPNA::HandleKill(Player* killer, Unit* killed) // creature kills must be notified, even if not inside objective / not outdoor pvp active // player kills only count if active and inside objective - if ((groupGuy->IsOutdoorPvPActive() && groupGuy->GetAreaId() == NA_HALAA_ZONE_ID) || killed->GetTypeId() == TYPEID_UNIT) + if ((groupGuy->IsOutdoorPvPActive() && groupGuy->GetAreaId() == NA_HALAA_ZONE_ID) || killed->IsCreature()) { HandleKillImpl(groupGuy, killed); } @@ -65,7 +65,7 @@ void OutdoorPvPNA::HandleKill(Player* killer, Unit* killed) else { // creature kills must be notified, even if not inside objective / not outdoor pvp active - if (killer && ((killer->IsOutdoorPvPActive() && killer->ToPlayer()->GetAreaId() == NA_HALAA_ZONE_ID) || killed->GetTypeId() == TYPEID_UNIT)) + if (killer && ((killer->IsOutdoorPvPActive() && killer->ToPlayer()->GetAreaId() == NA_HALAA_ZONE_ID) || killed->IsCreature())) { HandleKillImpl(killer, killed); } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp index ab0325b9b..3ecf6d9e7 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp @@ -199,7 +199,7 @@ bool OutdoorPvPZM::SetupOutdoorPvP() void OutdoorPvPZM::HandleKillImpl(Player* player, Unit* killed) { - if (killed->GetTypeId() != TYPEID_PLAYER) + if (!killed->IsPlayer()) return; if (player->GetTeamId() == TEAM_ALLIANCE && killed->ToPlayer()->GetTeamId() != TEAM_ALLIANCE) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 70e1c3fa0..7c165d68e 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1194,7 +1194,7 @@ class spell_illidan_demon_transform1_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void OnPeriodic(AuraEffect const* /*aurEff*/) @@ -1222,7 +1222,7 @@ class spell_illidan_demon_transform2_aura : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void OnPeriodic(AuraEffect const* aurEff) @@ -1313,7 +1313,7 @@ class spell_illidan_cage_trap : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScriptEffect(SpellEffIndex effIndex) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 807bc0d73..407506228 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -607,7 +607,7 @@ class spell_illidari_council_empyreal_balance : public SpellScript bool Load() override { _targetCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleDummy(SpellEffIndex effIndex) @@ -652,7 +652,7 @@ class spell_illidari_council_empyreal_equivalency : public SpellScript bool Load() override { _targetCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleDummy(SpellEffIndex effIndex) diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 50b6f7359..79d68ebfa 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -141,7 +141,7 @@ public: void MoveInLineOfSight(Unit* who) override { - if (!who || me->getStandState() != UNIT_STAND_STATE_SLEEP || who->GetTypeId() != TYPEID_PLAYER || me->GetDistance2d(who) > 90.0f || who->ToPlayer()->IsGameMaster()) + if (!who || me->getStandState() != UNIT_STAND_STATE_SLEEP || !who->IsPlayer() || me->GetDistance2d(who) > 90.0f || who->ToPlayer()->IsGameMaster()) return; me->SetInCombatWithZone(); diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 91ee4a3ae..392cbecde 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -264,7 +264,7 @@ class spell_teron_gorefiend_shadowy_construct : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp index e98daa3e1..d429e6d84 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -82,7 +82,7 @@ public: void OnUnitDeath(Unit* unit) override { - if (unit && unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == NPC_NASCENT_FEL_ORC) + if (unit && unit->IsCreature() && unit->GetEntry() == NPC_NASCENT_FEL_ORC) PrisonerDied(unit->GetGUID()); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 825b21ed0..23226e225 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -1078,7 +1078,7 @@ class spell_kaelthas_kael_phase_two : public SpellScript bool Load() override { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (GetCaster()->IsCreature()) if (InstanceScript* instance = GetCaster()->GetInstanceScript()) if (Creature* kael = instance->GetCreature(DATA_KAELTHAS)) kael->AI()->SummonedCreatureDies(GetCaster()->ToCreature(), nullptr); @@ -1196,7 +1196,7 @@ class spell_kaelthas_flame_strike : public AuraScript bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->IsCreature(); } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 4134a6931..b16a931ef 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -606,7 +606,7 @@ class spell_dk_dancing_rune_weapon : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) + if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || !eventInfo.GetActor()->IsPlayer()) return false; SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 3bca70883..35488441d 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -136,7 +136,7 @@ class spell_the_flag_of_ownership : public SpellScript void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) return; Player* target = GetHitPlayer(); if (!target) @@ -155,7 +155,7 @@ class spell_the_flag_of_ownership : public SpellScript { for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) { - if ((*itr)->GetTypeId() != TYPEID_PLAYER || (*itr)->ToPlayer()->IsAlive()) + if (!(*itr)->IsPlayer() || (*itr)->ToPlayer()->IsAlive()) { targets.erase(itr); itr = targets.begin(); @@ -1835,7 +1835,7 @@ class spell_gen_feign_death_all_flags : public AuraScript target->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->SetUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->SetReactState(REACT_PASSIVE); } @@ -1846,7 +1846,7 @@ class spell_gen_feign_death_all_flags : public AuraScript target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->RemoveUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->InitializeReactState(); } @@ -1870,7 +1870,7 @@ class spell_gen_feign_death_no_dyn_flag : public AuraScript target->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->SetUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->SetReactState(REACT_PASSIVE); } @@ -1880,7 +1880,7 @@ class spell_gen_feign_death_no_dyn_flag : public AuraScript target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->RemoveUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->InitializeReactState(); } @@ -1903,7 +1903,7 @@ class spell_gen_feign_death_no_prevent_emotes : public AuraScript target->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->SetUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->SetReactState(REACT_PASSIVE); } @@ -1913,7 +1913,7 @@ class spell_gen_feign_death_no_prevent_emotes : public AuraScript target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); target->RemoveUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT); - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->ToCreature()->InitializeReactState(); } @@ -1944,7 +1944,7 @@ class spell_gen_teleporting : public SpellScript void HandleScript(SpellEffIndex /* effIndex */) { Unit* target = GetHitUnit(); - if (target->GetTypeId() != TYPEID_PLAYER) + if (!target->IsPlayer()) return; // return from top @@ -2504,7 +2504,7 @@ class spell_gen_vehicle_scaling_aura: public AuraScript bool Load() override { - return GetCaster() && GetCaster()->IsPlayer() && GetOwner()->GetTypeId() == TYPEID_UNIT; + return GetCaster() && GetCaster()->IsPlayer() && GetOwner()->IsCreature(); } void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) @@ -3729,7 +3729,7 @@ class spell_gen_despawn_self : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleDummy(SpellEffIndex effIndex) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index f4bfef0e9..284e52654 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -950,7 +950,7 @@ class spell_hun_tame_beast : public SpellScript SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) return SPELL_FAILED_DONT_REPORT; Player* player = GetCaster()->ToPlayer(); @@ -1136,7 +1136,7 @@ class spell_hun_volley_trigger : public SpellScript { if (Unit* pet = *itr) { - if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT) + if (pet->IsAlive() && pet->IsCreature()) { pet->ToCreature()->AI()->OwnerAttacked(_target->ToUnit()); } @@ -1295,7 +1295,7 @@ class spell_hun_bestial_wrath : public SpellScript SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) { return SPELL_FAILED_NO_VALID_TARGETS; } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 343a5d514..5bf697b96 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -401,7 +401,7 @@ class spell_item_lil_phylactery : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetActionTarget() && (eventInfo.GetActionTarget()->GetTypeId() != TYPEID_UNIT || eventInfo.GetActionTarget()->ToCreature()->isWorldBoss()); + return eventInfo.GetActionTarget() && (!eventInfo.GetActionTarget()->IsCreature() || eventInfo.GetActionTarget()->ToCreature()->isWorldBoss()); } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) @@ -501,7 +501,7 @@ class spell_item_lil_xt : public SpellScript Creature* target = GetHitCreature(); if (!target) return; - if (GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->ToCreature()->AI()) + if (GetCaster()->IsCreature() && GetCaster()->ToCreature()->AI()) GetCaster()->ToCreature()->AI()->Talk(2); target->DespawnOrUnsummon(500); } @@ -2291,7 +2291,7 @@ class spell_item_unsated_craving : public AuraScript bool CheckProc(ProcEventInfo& procInfo) { Unit* caster = procInfo.GetActor(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + if (!caster || !caster->IsPlayer()) { return false; } @@ -2302,7 +2302,7 @@ class spell_item_unsated_craving : public AuraScript return true; } - if (!target || target->GetTypeId() != TYPEID_UNIT || target->IsCritter() || target->IsSummon()) + if (!target || !target->IsCreature() || target->IsCritter() || target->IsSummon()) { return false; } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 13fbefcdd..a708c8044 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -884,7 +884,7 @@ class spell_mage_polymorph_cast_visual : public SpellScript void HandleDummy(SpellEffIndex /*effIndex*/) { if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->CastSpell(target, PolymorhForms[urand(0, 5)], true); } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 155c6276b..5345782ac 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -1021,7 +1021,7 @@ class spell_pal_righteous_defense : public SpellScript SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_PLAYER) + if (!caster->IsPlayer()) return SPELL_FAILED_DONT_REPORT; if (Unit* target = GetExplTargetUnit()) diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 0d02279f2..9253d5287 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -379,7 +379,7 @@ class spell_pri_lightwell : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScriptEffect(SpellEffIndex /* effIndex */) diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index cfcad45ee..94b2f6dd7 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -691,7 +691,7 @@ class spell_q11653_youre_not_so_big_now : public SpellScript { PreventHitDefaultEffect(effIndex); Unit* target = GetHitUnit(); - if (!target || target->GetTypeId() != TYPEID_UNIT) + if (!target || !target->IsCreature()) return; static uint32 const spellPlayer[5] = @@ -809,7 +809,7 @@ class spell_q1846_bending_shinbone : public SpellScript { Item* target = GetHitItem(); Unit* caster = GetCaster(); - if (!target && caster->GetTypeId() != TYPEID_PLAYER) + if (!target && !caster->IsPlayer()) return; uint32 const spellId = roll_chance_i(20) ? SPELL_BENDING_SHINBONE1 : SPELL_BENDING_SHINBONE2; @@ -1014,7 +1014,7 @@ class spell_q11396_11399_scourging_crystal_controller_dummy : public SpellScript void HandleDummy(SpellEffIndex /*effIndex*/) { if (Unit* target = GetHitUnit()) - if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsCreature()) target->RemoveAurasDueToSpell(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3); } @@ -1704,7 +1704,7 @@ class spell_q12277_wintergarde_mine_explosion : public SpellScript { if (Unit* caster = GetCaster()) { - if (caster->GetTypeId() == TYPEID_UNIT) + if (caster->IsCreature()) { if (Unit* owner = caster->GetOwner()) { @@ -2018,7 +2018,7 @@ enum BearFlankMaster bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleScript(SpellEffIndex /*effIndex*/) @@ -2079,7 +2079,7 @@ class spell_q12690_burst_at_the_seams : public SpellScript bool Load() override { - return GetCaster()->GetTypeId() == TYPEID_UNIT; + return GetCaster()->IsCreature(); } void HandleKnockBack(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 2cf818614..4a1a28325 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -464,10 +464,8 @@ public: if (!summoner) return; - if (summoner->GetTypeId() != TYPEID_UNIT) - { + if (!summoner->IsCreature()) return; - } _summonerGuid = summoner->GetGUID(); me->GetMotionMaster()->MoveFollow(summoner->ToUnit(), 0.0f, 0.0f); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 18c16a4c2..92782ae39 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -1513,7 +1513,7 @@ public: return true; } - if (owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer())) + if (!owner->IsPlayer() || !player->IsInSameRaidWith(owner->ToPlayer())) { if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(stoneSpell)) { diff --git a/src/server/scripts/World/npc_stave_of_ancients.cpp b/src/server/scripts/World/npc_stave_of_ancients.cpp index bf80e6bd5..fede7e6fa 100644 --- a/src/server/scripts/World/npc_stave_of_ancients.cpp +++ b/src/server/scripts/World/npc_stave_of_ancients.cpp @@ -200,7 +200,7 @@ void NPCStaveQuestAI::StoreAttackerGuidValue(Unit* attacker) bool isGUIDPresent = std::find(attackerGuids.begin(), attackerGuids.end(), guidValue) != attackerGuids.end(); // don't store snaketrap's snakes and trap triggers - if (isGUIDPresent || (IsAllowedEntry(attacker->GetEntry()) && attacker->GetTypeId() != TYPEID_PLAYER)) + if (isGUIDPresent || (IsAllowedEntry(attacker->GetEntry()) && !attacker->IsPlayer())) { return; } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index be36753cd..440738f96 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2538,7 +2538,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_PLAYER) + if (!summoner->IsPlayer()) { return; } @@ -2625,7 +2625,7 @@ public: void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() == TYPEID_UNIT || summoner->IsPlayer()) + if (summoner->IsCreature() || summoner->IsPlayer()) me->GetMotionMaster()->MoveFollow(summoner->ToUnit(), PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } From bf18b9bdfb26fd94cd4dfbd6a911ebae5db98569 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:08:56 -0400 Subject: [PATCH 45/46] fix(Core/AI): Improve creature leashing behavior. (#19751) * Init. https: //github.com/vmangos/core/commit/7d2f1e2923734ea1b983eeaa0208cfd158d4af02 Co-Authored-By: ratkosrb <35845488+ratkosrb@users.noreply.github.com> * Hackfix for pets. * Whoops. * Correct evade uses. * Conflict. * Actually fix grace timer. * Add visibility distance check. Creatures should always fail combat checks in the open world if they're outside of visibility distance, might not be the case for worldbosses. --------- Co-authored-by: ratkosrb <35845488+ratkosrb@users.noreply.github.com> --- src/server/game/AI/CreatureAI.cpp | 2 +- .../game/Entities/Creature/Creature.cpp | 63 ++++++++++--------- src/server/game/Entities/Creature/Creature.h | 13 ++-- src/server/game/Entities/Unit/Unit.cpp | 9 +-- .../TargetedMovementGenerator.cpp | 9 +++ .../TargetedMovementGenerator.h | 3 +- .../FrozenHalls/PitOfSaron/pit_of_saron.cpp | 2 +- src/server/scripts/Pet/pet_hunter.cpp | 2 +- 8 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 52c1da79d..17daed82d 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -307,7 +307,7 @@ bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/) me->LoadCreaturesAddon(true); me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); - me->SetLastDamagedTime(0); + me->ClearLastLeashExtensionTimePtr(); me->SetCannotReachTarget(); if (ZoneScript* zoneScript = me->GetZoneScript() ? me->GetZoneScript() : (ZoneScript*)me->GetInstanceScript()) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 33a294531..d9e0dc574 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -220,9 +220,6 @@ bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { if (Unit* victim = ObjectAccessor::GetUnit(*m_owner, m_victim)) { - // Initialize last damage timer if it doesn't exist - m_owner->SetLastDamagedTime(GameTime::GetGameTime().count() + MAX_AGGRO_RESET_TIME); - while (!m_assistants.empty()) { Creature* assistant = ObjectAccessor::GetCreature(*m_owner, *m_assistants.begin()); @@ -233,9 +230,14 @@ bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) assistant->SetNoCallAssistance(true); assistant->CombatStart(victim); if (assistant->IsAIEnabled) + { assistant->AI()->AttackStart(victim); - assistant->SetLastDamagedTimePtr(m_owner->GetLastDamagedTimePtr()); + // When nearby mobs aggro from another mob's initial call for assistance + // their leash timers become linked and attacking one will keep the rest from evading. + if (assistant->GetVictim()) + assistant->SetLastLeashExtensionTimePtr(m_owner->GetLastLeashExtensionTimePtr()); + } } } } @@ -272,7 +274,7 @@ Creature::Creature(bool isWorldObject): Unit(isWorldObject), MovableMapObject(), m_transportCheckTimer(1000), lootPickPocketRestoreTime(0), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_regenHealth(true), m_regenPower(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_moveInLineOfSightDisabled(false), m_moveInLineOfSightStrictlyDisabled(false), - m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_detectionDistance(20.0f), m_waypointID(0), m_path_id(0), m_formation(nullptr), _lastDamagedTime(nullptr), m_cannotReachTimer(0), + m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_detectionDistance(20.0f), m_waypointID(0), m_path_id(0), m_formation(nullptr), m_lastLeashExtensionTime(nullptr), m_cannotReachTimer(0), _isMissingSwimmingFlagOutOfCombat(false), m_assistanceTimer(0), _playerDamageReq(0), _damagedByPlayer(false), _isCombatMovementAllowed(true) { m_regenTimer = CREATURE_REGEN_INTERVAL; @@ -1961,8 +1963,6 @@ void Creature::setDeathState(DeathState state, bool despawn) if (state == DeathState::JustDied) { - _lastDamagedTime.reset(); - m_corpseRemoveTime = GameTime::GetGameTime().count() + m_corpseDelay; m_respawnTime = GameTime::GetGameTime().count() + m_respawnDelay + m_corpseDelay; @@ -2640,7 +2640,7 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const return false; // cannot attack if is during 5 second grace period, unless being attacked - if (m_respawnedTime && (GameTime::GetGameTime().count() - m_respawnedTime) < 5 && !GetLastDamagedTime()) + if (m_respawnedTime && (GameTime::GetGameTime().count() - m_respawnedTime) < 5 && !IsEngagedBy(victim)) { return false; } @@ -2656,9 +2656,15 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const if (GetMap()->IsDungeon()) return true; + float visibility = std::max(GetVisibilityRange(), victim->GetVisibilityRange()); + + // if outside visibility + if (!IsWithinDist(victim, visibility)) + return false; + // pussywizard: don't check distance to home position if recently damaged (allow kiting away from spawnpoint!) // xinef: this should include taunt auras - if (!isWorldBoss() && (GetLastDamagedTime() > GameTime::GetGameTime().count() || HasAuraType(SPELL_AURA_MOD_TAUNT))) + if (!isWorldBoss() && (GetLastLeashExtensionTime() + 12 > GameTime::GetGameTime().count() || HasAuraType(SPELL_AURA_MOD_TAUNT))) return true; } @@ -2666,10 +2672,13 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const return true; // xinef: added size factor for huge npcs - float dist = std::min(GetMap()->GetVisibilityRange() + GetObjectSize() * 2, 150.0f); + float dist = std::min(GetDetectionRange() + GetObjectSize() * 2, 150.0f); if (Unit* unit = GetCharmerOrOwner()) + { + dist = std::min(GetMap()->GetVisibilityRange() + GetObjectSize() * 2, 150.0f); return victim->IsWithinDist(unit, dist); + } else { // to prevent creatures in air ignore attacks because distance is already too high... @@ -3666,35 +3675,31 @@ bool Creature::IsNotReachableAndNeedRegen() const return false; } -time_t Creature::GetLastDamagedTime() const +std::shared_ptr const& Creature::GetLastLeashExtensionTimePtr() const { - if (!_lastDamagedTime) - return time_t(0); - - return *_lastDamagedTime; + if (m_lastLeashExtensionTime == nullptr) + m_lastLeashExtensionTime = std::make_shared(time(nullptr)); + return m_lastLeashExtensionTime; } -std::shared_ptr const& Creature::GetLastDamagedTimePtr() const +void Creature::SetLastLeashExtensionTimePtr(std::shared_ptr const& timer) { - return _lastDamagedTime; + m_lastLeashExtensionTime = timer; } -void Creature::SetLastDamagedTime(time_t val) +void Creature::ClearLastLeashExtensionTimePtr() { - if (val > 0) - { - if (_lastDamagedTime) - *_lastDamagedTime = val; - else - _lastDamagedTime = std::make_shared(val); - } - else - _lastDamagedTime.reset(); + m_lastLeashExtensionTime.reset(); } -void Creature::SetLastDamagedTimePtr(std::shared_ptr const& val) +time_t Creature::GetLastLeashExtensionTime() const { - _lastDamagedTime = val; + return *GetLastLeashExtensionTimePtr(); +} + +void Creature::UpdateLeashExtensionTime() +{ + (*GetLastLeashExtensionTimePtr()) = time(nullptr); } bool Creature::CanPeriodicallyCallForAssistance() const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 52f51dcdb..1c1aa3321 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -381,10 +381,11 @@ public: [[nodiscard]] bool IsMovementPreventedByCasting() const override; // Part of Evade mechanics - [[nodiscard]] time_t GetLastDamagedTime() const; - [[nodiscard]] std::shared_ptr const& GetLastDamagedTimePtr() const; - void SetLastDamagedTime(time_t val); - void SetLastDamagedTimePtr(std::shared_ptr const& val); + std::shared_ptr const& GetLastLeashExtensionTimePtr() const; + void SetLastLeashExtensionTimePtr(std::shared_ptr const& timer); + void ClearLastLeashExtensionTimePtr(); + time_t GetLastLeashExtensionTime() const; + void UpdateLeashExtensionTime(); bool IsFreeToMove(); static constexpr uint32 MOVE_CIRCLE_CHECK_INTERVAL = 3000; @@ -500,7 +501,9 @@ private: CreatureGroup* m_formation; bool TriggerJustRespawned; - mutable std::shared_ptr _lastDamagedTime; // Part of Evade mechanics + // Shared timer between mobs who assist another. + // Damaging one extends leash range on all of them. + mutable std::shared_ptr m_lastLeashExtensionTime; ObjectGuid m_cannotReachTarget; uint32 m_cannotReachTimer; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5adb8a875..8d843c062 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1041,10 +1041,6 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage if (!victim->IsPlayer()) { - // Part of Evade mechanics. DoT's and Thorns / Retribution Aura do not contribute to this - if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD))) - victim->ToCreature()->SetLastDamagedTime(GameTime::GetGameTime().count() + MAX_AGGRO_RESET_TIME); - if (attacker) { if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker)) @@ -10387,6 +10383,8 @@ void Unit::CombatStop(bool includingCast) RemoveAllAttackers(); if (IsPlayer()) ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel + if (Creature* pCreature = ToCreature()) + pCreature->ClearLastLeashExtensionTimePtr(); ClearInCombat(); // xinef: just in case @@ -13539,6 +13537,9 @@ void Unit::SetInCombatWith(Unit* enemy, uint32 duration) return; } } + if (Creature* pCreature = ToCreature()) + pCreature->UpdateLeashExtensionTime(); + SetInCombatState(false, enemy, duration); } diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 59a97bc9e..4dc2f55bd 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -148,6 +148,15 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) owner->ClearUnitState(UNIT_STATE_CHASE_MOVE); owner->SetInFront(target); MovementInform(owner); + + // Mobs should chase you infinitely if you stop and wait every few seconds. + i_leashExtensionTimer.Update(time_diff); + if (i_leashExtensionTimer.Passed()) + { + i_leashExtensionTimer.Reset(5000); + if (Creature* creature = owner->ToCreature()) + creature->UpdateLeashExtensionTime(); + } } // if the target moved, we have to consider whether to adjust diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index 41678c471..4e7df89db 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -39,7 +39,7 @@ class ChaseMovementGenerator : public MovementGeneratorMedium range = {}, Optional angle = {}) - : TargetedMovementGeneratorBase(target), i_path(nullptr), i_recheckDistance(0), i_recalculateTravel(true), _range(range), _angle(angle) {} + : TargetedMovementGeneratorBase(target), i_leashExtensionTimer(0), i_path(nullptr), i_recheckDistance(0), i_recalculateTravel(true), _range(range), _angle(angle) {} ~ChaseMovementGenerator() { } MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; } @@ -59,6 +59,7 @@ public: bool HasLostTarget(Unit* unit) const { return unit->GetVictim() != this->GetTarget(); } private: + TimeTrackerSmall i_leashExtensionTimer; std::unique_ptr i_path; TimeTrackerSmall i_recheckDistance; bool i_recalculateTravel; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index a4cdb0670..515476bfd 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -1130,7 +1130,7 @@ public: me->LoadCreaturesAddon(true); me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); - me->SetLastDamagedTime(0); + me->UpdateLeashExtensionTime(); } }; diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 5864a928b..3f973ba59 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -58,7 +58,7 @@ struct npc_pet_hunter_snake_trap : public ScriptedAI me->LoadCreaturesAddon(true); me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); - me->SetLastDamagedTime(0); + me->ClearLastLeashExtensionTimePtr(); me->AddUnitState(UNIT_STATE_EVADE); me->GetMotionMaster()->MoveTargetedHome(); From e5e514bbbedd0bab114177fffc8b632e667dd751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefano=20Borz=C3=AC?= Date: Wed, 4 Sep 2024 15:33:38 +0200 Subject: [PATCH 46/46] feat(Core/Scripting): add OnBeforeArenaCheckWinConditions hook for mod-arena-replay compatibility (#19856) --- src/server/game/Battlegrounds/Arena.cpp | 3 +++ src/server/game/Scripting/ScriptDefines/ArenaScript.cpp | 5 +++++ src/server/game/Scripting/ScriptDefines/ArenaScript.h | 3 +++ src/server/game/Scripting/ScriptMgr.h | 1 + 4 files changed, 12 insertions(+) diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp index 1c58679fb..b0ecc3ab5 100644 --- a/src/server/game/Battlegrounds/Arena.cpp +++ b/src/server/game/Battlegrounds/Arena.cpp @@ -192,6 +192,9 @@ void Arena::RemovePlayerAtLeave(Player* player) void Arena::CheckWinConditions() { + if (!sScriptMgr->OnBeforeArenaCheckWinConditions(this)) + return; + if (!GetAlivePlayersCountByTeam(TEAM_ALLIANCE) && GetPlayersCountByTeam(TEAM_HORDE)) EndBattleground(TEAM_HORDE); else if (GetPlayersCountByTeam(TEAM_ALLIANCE) && !GetAlivePlayersCountByTeam(TEAM_HORDE)) diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp index fd3a8dcdf..35baeb271 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp @@ -34,6 +34,11 @@ bool ScriptMgr::CanSaveToDB(ArenaTeam* team) CALL_ENABLED_BOOLEAN_HOOKS(ArenaScript, ARENAHOOK_CAN_SAVE_TO_DB, !script->CanSaveToDB(team)); } +bool ScriptMgr::OnBeforeArenaCheckWinConditions(Battleground* const bg) +{ + CALL_ENABLED_BOOLEAN_HOOKS(ArenaScript, ARENAHOOK_ON_BEFORE_CHECK_WIN_CONDITION, !script->OnBeforeArenaCheckWinConditions(bg)); +} + ArenaScript::ArenaScript(const char* name, std::vector enabledHooks) : ScriptObject(name, ARENAHOOK_END) { diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.h b/src/server/game/Scripting/ScriptDefines/ArenaScript.h index bbc18e2b2..c50a96449 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.h @@ -27,6 +27,7 @@ enum ArenaHook ARENAHOOK_CAN_ADD_MEMBER, ARENAHOOK_ON_GET_POINTS, ARENAHOOK_CAN_SAVE_TO_DB, + ARENAHOOK_ON_BEFORE_CHECK_WIN_CONDITION, ARENAHOOK_END }; @@ -44,6 +45,8 @@ public: virtual void OnGetPoints(ArenaTeam* /*team*/, uint32 /*memberRating*/, float& /*points*/) { } + [[nodiscard]] virtual bool OnBeforeArenaCheckWinConditions(Battleground* const /* bg */) { return true; } + [[nodiscard]] virtual bool CanSaveToDB(ArenaTeam* /*team*/) { return true; } }; diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 5096b9919..a81bda71f 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -646,6 +646,7 @@ public: /* ArenaScript */ bool CanAddMember(ArenaTeam* team, ObjectGuid PlayerGuid); void OnGetPoints(ArenaTeam* team, uint32 memberRating, float& points); bool CanSaveToDB(ArenaTeam* team); + bool OnBeforeArenaCheckWinConditions(Battleground* const bg); public: /* MiscScript */