diff options
author | Keader <keader.android@gmail.com> | 2016-11-27 20:28:06 -0200 |
---|---|---|
committer | DoctorKraft <DoctorKraft@users.noreply.github.com> | 2018-03-11 16:42:26 +0100 |
commit | e65ddccd1b82ed3e2b49a7032d7ed4b69ff2276b (patch) | |
tree | e5c6feef19098108fc1f66df08ecf6635e95272a | |
parent | 203ec72ecc387e2d5d4b26450087798a6c8f31cc (diff) |
Core/AI: Added new method for search friendly targets with certain entry and hp pct below a value (#18310)
(cherry picked from commit e7024f8a4c514eb4d8466383f8b5367ad7bab630)
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 58 | ||||
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.h | 3 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 22 |
3 files changed, 35 insertions, 48 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index f6462e7f842..f937c32c0a3 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -360,6 +360,16 @@ Unit* ScriptedAI::DoSelectLowestHpFriendly(float range, uint32 minHPDiff) return unit; } +Unit* ScriptedAI::DoSelectBelowHpPctFriendlyWithEntry(uint32 entry, float range, uint8 minHPDiff, bool excludeSelf) +{ + Unit* unit = nullptr; + Trinity::FriendlyBelowHpPctEntryInRange u_check(me, entry, range, minHPDiff, excludeSelf); + Trinity::UnitLastSearcher<Trinity::FriendlyBelowHpPctEntryInRange> searcher(me, unit, u_check); + Cell::VisitAllObjects(me, searcher, range); + + return unit; +} + std::list<Creature*> ScriptedAI::DoFindFriendlyCC(float range) { std::list<Creature*> list; @@ -422,54 +432,6 @@ enum NPCs NPC_SARTHARION = 28860 }; -// Hacklike storage used for misc creatures that are expected to evade of outside of a certain area. -// It is assumed the information is found elswehere and can be handled by the core. So far no luck finding such information/way to extract it. -/*bool ScriptedAI::EnterEvadeIfOutOfCombatArea(uint32 const diff) -{ - if (_evadeCheckCooldown <= diff) - _evadeCheckCooldown = 2500; - else - { - _evadeCheckCooldown -= diff; - return false; - } - - if (me->IsInEvadeMode() || !me->GetVictim()) - return false; - - float x = me->GetPositionX(); - float y = me->GetPositionY(); - float z = me->GetPositionZ(); - - switch (me->GetEntry()) - { - case NPC_BROODLORD: // broodlord (not move down stairs) - if (z > 448.60f) - return false; - break; - case NPC_VOID_REAVER: // void reaver (calculate from center of room) - if (me->GetDistance2d(432.59f, 371.93f) < 105.0f) - return false; - break; - case NPC_JAN_ALAI: // jan'alai (calculate by Z) - if (z > 12.0f) - return false; - break; - case NPC_SARTHARION: // sartharion (calculate box) - if (x > 3218.86f && x < 3275.69f && y < 572.40f && y > 484.68f) - return false; - break; - default: // For most of creatures that certain area is their home area. - TC_LOG_INFO("misc", "TSCR: EnterEvadeIfOutOfCombatArea used for creature entry %u, but does not have any definition. Using the default one.", me->GetEntry()); - uint32 homeAreaId = me->GetMap()->GetAreaId(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY(), me->GetHomePosition().GetPositionZ()); - if (me->GetAreaId() == homeAreaId) - return false; - } - - EnterEvadeMode(); - return true; -}*/ - // BossAI - for instanced bosses BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature), instance(creature->GetInstanceScript()), diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 4ffde824307..6b0e853e6cc 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -223,6 +223,9 @@ struct TC_GAME_API ScriptedAI : public CreatureAI //Returns friendly unit with the most amount of hp missing from max hp Unit* DoSelectLowestHpFriendly(float range, uint32 minHPDiff = 1); + //Returns friendly unit with hp pct below specified and with specified entry + Unit* DoSelectBelowHpPctFriendlyWithEntry(uint32 entry, float range, uint8 hpPct = 1, bool excludeSelf = true); + //Returns a list of friendly CC'd units within range std::list<Creature*> DoFindFriendlyCC(float range); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index f2611edab14..4635f16042a 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -804,6 +804,28 @@ namespace Trinity uint64 i_hp; }; + class FriendlyBelowHpPctEntryInRange + { + public: + FriendlyBelowHpPctEntryInRange(Unit const* obj, uint32 entry, float range, uint8 pct, bool excludeSelf) : i_obj(obj), i_entry(entry), i_range(range), i_pct(pct), i_excludeSelf(excludeSelf) { } + + bool operator()(Unit* u) + { + if (i_excludeSelf && i_obj->GetGUID() == u->GetGUID()) + return false; + if (u->GetEntry() == i_entry && u->IsAlive() && u->IsInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->HealthBelowPct(i_pct)) + return true; + return false; + } + + private: + Unit const* i_obj; + uint32 i_entry; + float i_range; + uint8 i_pct; + bool i_excludeSelf; + }; + class FriendlyCCedInRange { public: |