aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-01-09 23:34:30 +0100
committerShauren <shauren.trinity@gmail.com>2021-05-17 00:02:27 +0200
commit4a65dcaecb103f62b9ee005e334de6a59d39368b (patch)
tree320d12523b5f0be57486c50d9dc75bb1d682d09d
parentfdbc88e3de11d8811f60f0b6ed1c93fe9ea88d04 (diff)
Scripts/World: New target dummy AI, because I don't trust the existing one in light of #21187.
(cherry picked from commit a23c97a0fcc53e5da0bee5fc033dd3748774c337)
-rw-r--r--src/server/scripts/World/npcs_special.cpp89
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 9c62ed9ce88..575c566da85 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -1741,10 +1741,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
@@ -1752,27 +1749,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
@@ -1785,61 +1776,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