diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2018-01-09 23:34:30 +0100 | 
|---|---|---|
| committer | Treeston <treeston.mmoc@gmail.com> | 2018-01-09 23:34:50 +0100 | 
| commit | a23c97a0fcc53e5da0bee5fc033dd3748774c337 (patch) | |
| tree | 3e797d9b1bb6ec3ed9e053453634c84cb611c1a8 /src | |
| parent | b8edb89028b28e7d8c4ab2da289f22bedd7f096b (diff) | |
Scripts/World: New target dummy AI, because I don't trust the existing one in light of #21187.
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/scripts/World/npcs_special.cpp | 89 | 
1 files changed, 33 insertions, 56 deletions
| diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 402761b9a6c..f6fb881b07e 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1746,10 +1746,7 @@ class npc_brewfest_reveler : public CreatureScript  enum TrainingDummy  {      NPC_ADVANCED_TARGET_DUMMY                  = 2674, -    NPC_TARGET_DUMMY                           = 2673, - -    EVENT_TD_CHECK_COMBAT                      = 1, -    EVENT_TD_DESPAWN                           = 2 +    NPC_TARGET_DUMMY                           = 2673  };  class npc_training_dummy : public CreatureScript @@ -1757,27 +1754,21 @@ class npc_training_dummy : public CreatureScript  public:      npc_training_dummy() : CreatureScript("npc_training_dummy") { } -    struct npc_training_dummyAI : ScriptedAI +    struct npc_training_dummyAI : PassiveAI      { -        npc_training_dummyAI(Creature* creature) : ScriptedAI(creature) +        npc_training_dummyAI(Creature* creature) : PassiveAI(creature), _combatCheckTimer(500)          { -            SetCombatMovement(false); +            uint32 const entry = me->GetEntry(); +            if (entry == NPC_TARGET_DUMMY || entry == NPC_ADVANCED_TARGET_DUMMY) +            { +                _combatCheckTimer = 0; +                me->DespawnOrUnsummon(16s); +            }          } -        EventMap _events; -        std::unordered_map<ObjectGuid, time_t> _damageTimes; -          void Reset() override          { -            // TODO: solve this in a different way! setting them as stunned prevents dummies from parrying -            me->SetControlled(true, UNIT_STATE_STUNNED);//disable rotate - -            _events.Reset();              _damageTimes.clear(); -            if (me->GetEntry() != NPC_ADVANCED_TARGET_DUMMY && me->GetEntry() != NPC_TARGET_DUMMY) -                _events.ScheduleEvent(EVENT_TD_CHECK_COMBAT, 1000); -            else -                _events.ScheduleEvent(EVENT_TD_DESPAWN, 15000);          }          void EnterEvadeMode(EvadeReason why) override @@ -1790,61 +1781,47 @@ public:          void DamageTaken(Unit* doneBy, uint32& damage) override          { -            AddThreat(doneBy, float(damage));    // just to create threat reference              _damageTimes[doneBy->GetGUID()] = GameTime::GetGameTime();              damage = 0;          }          void UpdateAI(uint32 diff) override          { -            if (!me->IsInCombat()) +            if (!_combatCheckTimer || !me->IsInCombat())                  return; -            if (!me->HasUnitState(UNIT_STATE_STUNNED)) -                me->SetControlled(true, UNIT_STATE_STUNNED);//disable rotate +            if (diff < _combatCheckTimer) +            { +                _combatCheckTimer -= diff; +                return; +            } -            _events.Update(diff); +            _combatCheckTimer = 500; -            if (uint32 eventId = _events.ExecuteEvent()) +            time_t const now = GameTime::GetGameTime(); +            auto const& pveRefs = me->GetCombatManager().GetPvECombatRefs(); +            for (auto itr = _damageTimes.begin(); itr != _damageTimes.end();)              { -                switch (eventId) +                // If unit has not dealt damage to training dummy for 5 seconds, remove him from combat +                if (itr->second < now - 5)                  { -                    case EVENT_TD_CHECK_COMBAT: -                    { -                        time_t const now = GameTime::GetGameTime(); -                        auto const& pveRefs = me->GetCombatManager().GetPvECombatRefs(); -                        for (auto itr = _damageTimes.begin(); itr != _damageTimes.end();) -                        { -                            // If unit has not dealt damage to training dummy for 5 seconds, remove him from combat -                            if (itr->second < now - 5) -                            { -                                auto it = pveRefs.find(itr->first); -                                if (it != pveRefs.end()) -                                    it->second->EndCombat(); +                    auto it = pveRefs.find(itr->first); +                    if (it != pveRefs.end()) +                        it->second->EndCombat(); -                                itr = _damageTimes.erase(itr); -                            } -                            else -                                ++itr; -                        } - -                        for (auto const& pair : pveRefs) -                            if (_damageTimes.find(pair.first) == _damageTimes.end()) -                                _damageTimes[pair.first] = now; - -                        _events.Repeat(1s); -                        break; -                    } -                    case EVENT_TD_DESPAWN: -                        me->DespawnOrUnsummon(1); -                        break; -                    default: -                        break; +                    itr = _damageTimes.erase(itr);                  } +                else +                    ++itr;              } + +            for (auto const& pair : pveRefs) +                if (_damageTimes.find(pair.first) == _damageTimes.end()) +                    _damageTimes[pair.first] = now;          } -        void MoveInLineOfSight(Unit* /*who*/) override { } +        std::unordered_map<ObjectGuid, time_t> _damageTimes; +        uint32 _combatCheckTimer;      };      CreatureAI* GetAI(Creature* creature) const override | 
