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 | |
| parent | b8edb89028b28e7d8c4ab2da289f22bedd7f096b (diff) | |
Scripts/World: New target dummy AI, because I don't trust the existing one in light of #21187.
| -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 |
