diff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp index aac44a396c..92f3edbab2 100644 --- a/src/server/game/Combat/CombatManager.cpp +++ b/src/server/game/Combat/CombatManager.cpp @@ -342,7 +342,7 @@ bool CombatManager::UpdateOwnerCombatState() const { _owner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); _owner->AtExitCombat(); - if (_owner->IsEngaged() && !(_owner->ToCreature() && _owner->ToCreature()->IsAIEnabled())) + if (_owner->IsEngaged() && !(_owner->ToCreature() && _owner->ToCreature()->IsAIEnabled)) _owner->AtDisengage(); } diff --git a/src/server/game/Combat/CombatManager.h b/src/server/game/Combat/CombatManager.h index 5f3c115212..010a72665b 100644 --- a/src/server/game/Combat/CombatManager.h +++ b/src/server/game/Combat/CombatManager.h @@ -103,7 +103,6 @@ class TC_GAME_API CombatManager ~CombatManager(); void Update(uint32 tdiff); // called from Unit::Update - Unit* GetOwner() const { return _owner; } Unit* GetOwner() const { return _owner; } bool HasCombat() const { return HasPvECombat() || HasPvPCombat(); } bool HasPvECombat() const { return !_pveRefs.empty(); } diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 42172e802d..23631b4dae 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -292,13 +292,6 @@ void ThreatManager::EvaluateSuppressed(bool canExpire) } } -static void SaveCreatureHomePositionIfNeed(Creature* c) -{ - MovementGeneratorType const movetype = c->GetMotionMaster()->GetCurrentMovementGeneratorType(); - if (movetype == WAYPOINT_MOTION_TYPE || movetype == POINT_MOTION_TYPE || (c->IsAIEnabled && c->AI()->IsEscorted())) - c->SetHomePosition(c->GetPosition()); -} - void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell, bool ignoreModifiers, bool ignoreRedirects) { // step 1: we can shortcut if the spell has one of the NO_THREAT attrs set - nothing will happen @@ -402,12 +395,6 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell { _owner->AtEngage(target); UpdateVictim(); - - SaveCreatureHomePositionIfNeed(cOwner); - if (cOwner->IsAIEnabled) - cOwner->AI()->JustEngagedWith(target); - if (CreatureGroup* formation = cOwner->GetFormation()) - formation->MemberEngagingTarget(cOwner, target); } } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 33c72610a5..44b6747242 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1232,10 +1232,10 @@ class TC_GAME_API Unit : public WorldObject /// ====================== THREAT & COMBAT ==================== bool CanHaveThreatList() const { return m_threatManager.CanHaveThreatList(); } - // For NPCs with threat list: Whether there are any enemies on our threat list - // For other units: Whether we're in combat - // This value is different from IsInCombat when a projectile spell is midair (combat on launch - threat+aggro on impact) - bool IsEngaged() const { return CanHaveThreatList() ? m_threatManager.IsEngaged() : IsInCombat(); } + // This value can be different from IsInCombat: + // - when a projectile spell is midair against a creature (combat on launch - threat+aggro on impact) + // - when the creature has no targets left, but the AI has not yet ceased engaged logic + bool IsEngaged() const { return m_isEngaged; } bool IsEngagedBy(Unit const* who) const { return CanHaveThreatList() ? IsThreatenedBy(who) : IsInCombatWith(who); } void EngageWithTarget(Unit* who); // Adds target to threat list if applicable, otherwise just sets combat state // Combat handling diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index e271451a55..bd9a316ade 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2700,8 +2700,8 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) // spellHitTarget can be null if spell is missed in DoSpellHitOnUnit if (missInfo != SPELL_MISS_EVADE && spellHitTarget && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL))) { - if (Unit* unitCaster = spell->m_caster->ToUnit()) - unitCaster->AtTargetAttacked(unit, spell->m_spellInfo->HasInitialAggro()); + if (Unit* unitCaster = m_caster->ToUnit()) + unitCaster->AtTargetAttacked(unit, m_spellInfo->HasInitialAggro()); if (!unit->IsStandState()) unit->SetStandState(UNIT_STAND_STATE_STAND); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 6e03c5079c..8f15f2561e 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -997,7 +997,7 @@ public: for (auto const& outerPair : redirectRegistry) // (spellId, (guid, pct)) { SpellInfo const* const spell = sSpellMgr->GetSpellInfo(outerPair.first); - handler->PSendSysMessage(" |-- #%06u %s (%zu entries):", outerPair.first, spell ? spell->SpellName[0] : "", outerPair.second.size()); + handler->PSendSysMessage(" |-- #%06u %s (%zu entries):", outerPair.first, spell ? spell->SpellName : "", outerPair.second.size()); for (auto const& innerPair : outerPair.second) // (guid, pct) { Unit* unit = ObjectAccessor::GetUnit(*target, innerPair.first); diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index 7a58d4c7f0..78c6ceb2e6 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -207,8 +207,14 @@ public: } //Teleport group to given game_tele.entry - static bool HandleTeleGroupCommand(ChatHandler* handler, GameTele const* tele) + static bool HandleTeleGroupCommand(ChatHandler* handler, char const* args) { + if (!*args) + return false; + + // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r + GameTele const* tele = handler->extractGameTeleFromLink((char*)args); + if (!tele) { handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); @@ -285,7 +291,7 @@ public: return true; } - static bool HandleTeleCommand(ChatHandler* handler, GameTele const* tele) + static bool HandleTeleCommand(ChatHandler* handler, char const* args) { if (!*args) return false; diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp index 7f4ff43efe..33756ce966 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -182,7 +182,7 @@ class npc_harbinger_of_flame : public CreatureScript void JustEngagedWith(Unit* /*target*/) override { if (Creature* bird = ObjectAccessor::GetCreature(*me, me->GetChannelObjectGuid())) - DoZoneInCombat(bird, 200.0f); + DoZoneInCombat(bird); me->InterruptSpell(CURRENT_CHANNELED_SPELL); _events.Reset(); diff --git a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp index cfc81dc8cd..8983cd1b79 100644 --- a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp +++ b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp @@ -30,7 +30,7 @@ class DelayedAttackStartEvent : public BasicEvent bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override { - _owner->AI()->DoZoneInCombat(_owner, 200.0f); + _owner->AI()->DoZoneInCombat(_owner); return true; } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 03e678865f..e9126e4c6a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -608,7 +608,7 @@ class boss_razorscale : public CreatureScript case ACTION_EVENT_START: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); - DoZoneInCombat(me, 150.0f); + DoZoneInCombat(me); break; } } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 43163cb5d9..6b0291c858 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1713,7 +1713,15 @@ class npc_brewfest_reveler : public CreatureScript enum TrainingDummy { NPC_ADVANCED_TARGET_DUMMY = 2674, - NPC_TARGET_DUMMY = 2673 + NPC_TARGET_DUMMY = 2673, + NPC_SPELL_PRACTICE_CREDIT = 44175, + SPELL_CHARGE = 100, + SPELL_JUDGEMENT = 29271, + SPELL_STEADY_SHOT = 56641, + SPELL_EVISCERATE = 2098, + SPELL_PRIMAL_STRIKE = 73899, + SPELL_IMMOLATE = 348, + SPELL_ARCANE_MISSILES = 5143, }; class npc_training_dummy : public CreatureScript