From 0c3db399c565401dc1f771f14370421c320c555b Mon Sep 17 00:00:00 2001 From: Neo2003 Date: Sun, 5 Oct 2008 11:56:30 -0500 Subject: [PATCH] [svn] * Moved Script grid_searchers to core * Moved an enum from sc_creature.h to CreatureAI.h --HG-- branch : trunk --- src/bindings/scripts/Makefile.am | 2 +- src/bindings/scripts/VC71/71ScriptDev2.vcproj | 3 - src/bindings/scripts/VC80/80ScriptDev2.vcproj | 4 - src/bindings/scripts/VC90/90ScriptDev2.vcproj | 4 - src/bindings/scripts/include/precompiled.h | 7 +- src/bindings/scripts/include/sc_creature.cpp | 18 +-- src/bindings/scripts/include/sc_creature.h | 33 ----- .../scripts/include/sc_grid_searchers.h | 131 ------------------ .../zone/black_temple/boss_shade_of_akama.cpp | 7 +- .../zone/caverns_of_time/hyjal/hyjalAI.cpp | 12 +- src/game/CreatureAI.h | 33 +++++ src/game/GridNotifiers.h | 129 +++++++++++++++++ 12 files changed, 187 insertions(+), 196 deletions(-) delete mode 100644 src/bindings/scripts/include/sc_grid_searchers.h diff --git a/src/bindings/scripts/Makefile.am b/src/bindings/scripts/Makefile.am index 22f4725e2f..1507899259 100644 --- a/src/bindings/scripts/Makefile.am +++ b/src/bindings/scripts/Makefile.am @@ -40,7 +40,6 @@ include/precompiled.h \ include/sc_creature.cpp \ include/sc_creature.h \ include/sc_gossip.h \ -include/sc_grid_searchers.h \ include/sc_instance.h \ include/sc_item.h \ scripts/areatrigger/areatrigger_scripts.cpp \ @@ -419,3 +418,4 @@ install-data-hook: fi; \ done + diff --git a/src/bindings/scripts/VC71/71ScriptDev2.vcproj b/src/bindings/scripts/VC71/71ScriptDev2.vcproj index 02269074eb..38368d48de 100644 --- a/src/bindings/scripts/VC71/71ScriptDev2.vcproj +++ b/src/bindings/scripts/VC71/71ScriptDev2.vcproj @@ -1567,9 +1567,6 @@ - - diff --git a/src/bindings/scripts/VC80/80ScriptDev2.vcproj b/src/bindings/scripts/VC80/80ScriptDev2.vcproj index f850a86588..d23e8dcbc7 100644 --- a/src/bindings/scripts/VC80/80ScriptDev2.vcproj +++ b/src/bindings/scripts/VC80/80ScriptDev2.vcproj @@ -2308,10 +2308,6 @@ RelativePath="..\include\sc_gossip.h" > - - diff --git a/src/bindings/scripts/VC90/90ScriptDev2.vcproj b/src/bindings/scripts/VC90/90ScriptDev2.vcproj index b9800effbe..0492d923dd 100644 --- a/src/bindings/scripts/VC90/90ScriptDev2.vcproj +++ b/src/bindings/scripts/VC90/90ScriptDev2.vcproj @@ -2306,10 +2306,6 @@ RelativePath="..\include\sc_gossip.h" > - - diff --git a/src/bindings/scripts/include/precompiled.h b/src/bindings/scripts/include/precompiled.h index dda4d672f3..275947e0e4 100644 --- a/src/bindings/scripts/include/precompiled.h +++ b/src/bindings/scripts/include/precompiled.h @@ -6,9 +6,14 @@ #define SC_PRECOMPILED_H #include "../ScriptMgr.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "Unit.h" +#include "GameObject.h" #include "sc_creature.h" #include "sc_gossip.h" -#include "sc_grid_searchers.h" #include "sc_instance.h" #ifdef WIN32 diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp index 9910eafc5b..4c9f7a385a 100644 --- a/src/bindings/scripts/include/sc_creature.cpp +++ b/src/bindings/scripts/include/sc_creature.cpp @@ -513,14 +513,14 @@ Unit* ScriptedAI::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff) Unit* pUnit = NULL; - MostHPMissingInRange u_check(m_creature, range, MinHPDiff); - MaNGOS::UnitLastSearcher searcher(pUnit, u_check); + MaNGOS::MostHPMissingInRange u_check(m_creature, range, MinHPDiff); + MaNGOS::UnitLastSearcher searcher(pUnit, u_check); /* typedef TYPELIST_4(GameObject, Creature*except pets*, DynamicObject, Corpse*Bones*) AllGridObjectTypes; This means that if we only search grid then we cannot possibly return pets or players so this is safe */ - TypeContainerVisitor, GridTypeMapContainer > grid_unit_searcher(searcher); + TypeContainerVisitor, GridTypeMapContainer > grid_unit_searcher(searcher); CellLock cell_lock(cell, p); cell_lock->Visit(cell_lock, grid_unit_searcher, *(m_creature->GetMap())); @@ -536,10 +536,10 @@ std::list ScriptedAI::DoFindFriendlyCC(float range) std::list pList; - FriendlyCCedInRange u_check(m_creature, range); - MaNGOS::CreatureListSearcher searcher(pList, u_check); + MaNGOS::FriendlyCCedInRange u_check(m_creature, range); + MaNGOS::CreatureListSearcher searcher(pList, u_check); - TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); + TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); CellLock cell_lock(cell, p); cell_lock->Visit(cell_lock, grid_creature_searcher, *(m_creature->GetMap())); @@ -556,10 +556,10 @@ std::list ScriptedAI::DoFindFriendlyMissingBuff(float range, uint32 s std::list pList; - FriendlyMissingBuffInRange u_check(m_creature, range, spellid); - MaNGOS::CreatureListSearcher searcher(pList, u_check); + MaNGOS::FriendlyMissingBuffInRange u_check(m_creature, range, spellid); + MaNGOS::CreatureListSearcher searcher(pList, u_check); - TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); + TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); CellLock cell_lock(cell, p); cell_lock->Visit(cell_lock, grid_creature_searcher, *(m_creature->GetMap())); diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h index 13d57a6e78..9433a6b733 100644 --- a/src/bindings/scripts/include/sc_creature.h +++ b/src/bindings/scripts/include/sc_creature.h @@ -8,39 +8,6 @@ #include "CreatureAI.h" #include "Creature.h" -//Spell targets used by SelectSpell -enum SelectTarget -{ - SELECT_TARGET_DONTCARE = 0, //All target types allowed - - SELECT_TARGET_SELF, //Only Self casting - - SELECT_TARGET_SINGLE_ENEMY, //Only Single Enemy - SELECT_TARGET_AOE_ENEMY, //Only AoE Enemy - SELECT_TARGET_ANY_ENEMY, //AoE or Single Enemy - - SELECT_TARGET_SINGLE_FRIEND, //Only Single Friend - SELECT_TARGET_AOE_FRIEND, //Only AoE Friend - SELECT_TARGET_ANY_FRIEND, //AoE or Single Friend -}; - -//Spell Effects used by SelectSpell -enum SelectEffect -{ - SELECT_EFFECT_DONTCARE = 0, //All spell effects allowed - SELECT_EFFECT_DAMAGE, //Spell does damage - SELECT_EFFECT_HEALING, //Spell does healing - SELECT_EFFECT_AURA, //Spell applies an aura -}; - -//Selection method used by SelectTarget -enum SelectAggroTarget -{ - SELECT_TARGET_RANDOM = 0, //Just selects a random target - SELECT_TARGET_TOPAGGRO, //Selects targes from top aggro to bottom - SELECT_TARGET_BOTTOMAGGRO, //Selects targets from bottom aggro to top -}; - struct MANGOS_DLL_DECL ScriptedAI : public CreatureAI { ScriptedAI(Creature* creature) : m_creature(creature), InCombat(false) {} diff --git a/src/bindings/scripts/include/sc_grid_searchers.h b/src/bindings/scripts/include/sc_grid_searchers.h deleted file mode 100644 index 750f1d42fb..0000000000 --- a/src/bindings/scripts/include/sc_grid_searchers.h +++ /dev/null @@ -1,131 +0,0 @@ -/* Copyright (C) 2006 - 2008 ScriptDev2 -* This program is free software licensed under GPL version 2 -* Please see the included DOCS/LICENSE.TXT for more information */ - -#ifndef SC_GRIDSEARCH_H -#define SC_GRIDSEARCH_H - -#include "Unit.h" -#include "GameObject.h" - -#include "Cell.h" -#include "CellImpl.h" -#include "GridNotifiers.h" -#include "GridNotifiersImpl.h" - -//Used in: -//sc_creature.cpp - DoSelectLowestHpFriendly() -class MostHPMissingInRange -{ -public: - MostHPMissingInRange(Unit const* obj, float range, uint32 hp) : i_obj(obj), i_range(range), i_hp(hp) {} - bool operator()(Unit* u) - { - if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->GetMaxHealth() - u->GetHealth() > i_hp) - { - i_hp = u->GetMaxHealth() - u->GetHealth(); - return true; - } - return false; - } -private: - Unit const* i_obj; - float i_range; - uint32 i_hp; -}; - -//Used in: -//sc_creature.cpp - DoFindFriendlyCC() -class FriendlyCCedInRange -{ -public: - FriendlyCCedInRange(Unit const* obj, float range) : i_obj(obj), i_range(range) {} - bool operator()(Unit* u) - { - if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && - (u->isFeared() || u->isCharmed() || u->isFrozen() || u->hasUnitState(UNIT_STAT_STUNDED) || u->hasUnitState(UNIT_STAT_STUNDED) || u->hasUnitState(UNIT_STAT_CONFUSED))) - { - return true; - } - return false; - } -private: - Unit const* i_obj; - float i_range; -}; - -//Used in: -//sc_creature.cpp - DoFindFriendlyMissingBuff() -class FriendlyMissingBuffInRange -{ -public: - FriendlyMissingBuffInRange(Unit const* obj, float range, uint32 spellid) : i_obj(obj), i_range(range), i_spell(spellid) {} - bool operator()(Unit* u) - { - if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && - !(u->HasAura(i_spell, 0) || u->HasAura(i_spell, 1) || u->HasAura(i_spell, 2))) - { - return true; - } - return false; - } -private: - Unit const* i_obj; - float i_range; - uint32 i_spell; -}; - -//Used in: -//hyjalAI.cpp -class AllFriendlyCreaturesInGrid -{ -public: - AllFriendlyCreaturesInGrid(Unit const* obj) : pUnit(obj) {} - bool operator() (Unit* u) - { - if(u->isAlive() && u->GetVisibility() == VISIBILITY_ON && u->IsFriendlyTo(pUnit)) - return true; - - return false; - } - -private: - Unit const* pUnit; -}; - -//Used in: -//hyjalAI.cpp -class AllGameObjectsWithEntryInGrid -{ -public: - AllGameObjectsWithEntryInGrid(uint32 ent) : entry(ent) {} - bool operator() (GameObject* g) - { - if(g->GetEntry() == entry) - return true; - - return false; - } -private: - uint32 entry; -}; - -class AllCreaturesOfEntryInRange -{ -public: - AllCreaturesOfEntryInRange(Unit const* obj, uint32 ent, float ran) : pUnit(obj), entry(ent), range(ran) {} - bool operator() (Unit* u) - { - if(u->GetEntry() == entry && pUnit->IsWithinDistInMap(u, range)) - return true; - - return false; - } - -private: - Unit const* pUnit; - uint32 entry; - float range; -}; - -#endif diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp index 803c7f7863..7e40cd6017 100644 --- a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp +++ b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp @@ -23,7 +23,6 @@ EndScriptData */ #include "precompiled.h" #include "def_black_temple.h" -#include "sc_grid_searchers.h" struct Location { @@ -327,9 +326,9 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI std::list ChannelerList; - AllCreaturesOfEntryInRange check(m_creature, CREATURE_CHANNELER, 50); - MaNGOS::CreatureListSearcher searcher(ChannelerList, check); - TypeContainerVisitor, GridTypeMapContainer> visitor(searcher); + MaNGOS::AllCreaturesOfEntryInRange check(m_creature, CREATURE_CHANNELER, 50); + MaNGOS::CreatureListSearcher searcher(ChannelerList, check); + TypeContainerVisitor, GridTypeMapContainer> visitor(searcher); CellLock cell_lock(cell, pair); cell_lock->Visit(cell_lock, visitor, *(m_creature->GetMap())); diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp index d1db61148e..d4a0522f70 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp @@ -316,18 +316,18 @@ void hyjalAI::Retreat() // First get all creatures. std::list creatures; - AllFriendlyCreaturesInGrid creature_check(m_creature); - MaNGOS::CreatureListSearcher creature_searcher(creatures, creature_check); + MaNGOS::AllFriendlyCreaturesInGrid creature_check(m_creature); + MaNGOS::CreatureListSearcher creature_searcher(creatures, creature_check); TypeContainerVisitor - , + , GridTypeMapContainer> creature_visitor(creature_searcher); // Then get all Ancient Gem Veins. NOTE: Grid Search will only be able to find those in the grid. std::list goList; - AllGameObjectsWithEntryInGrid go_check(185557); - MaNGOS::GameObjectListSearcher go_search(goList, go_check); + MaNGOS::AllGameObjectsWithEntryInGrid go_check(185557); + MaNGOS::GameObjectListSearcher go_search(goList, go_check); TypeContainerVisitor - , GridTypeMapContainer> go_visit(go_search); + , GridTypeMapContainer> go_visit(go_search); CellLock cell_lock(cell, pair); // Get Creatures diff --git a/src/game/CreatureAI.h b/src/game/CreatureAI.h index 185fb571bb..540a2e408b 100644 --- a/src/game/CreatureAI.h +++ b/src/game/CreatureAI.h @@ -32,6 +32,39 @@ struct SpellEntry; #define TIME_INTERVAL_LOOK 5000 #define VISIBILITY_RANGE 10000 +//Spell targets used by SelectSpell +enum SelectTarget +{ + SELECT_TARGET_DONTCARE = 0, //All target types allowed + + SELECT_TARGET_SELF, //Only Self casting + + SELECT_TARGET_SINGLE_ENEMY, //Only Single Enemy + SELECT_TARGET_AOE_ENEMY, //Only AoE Enemy + SELECT_TARGET_ANY_ENEMY, //AoE or Single Enemy + + SELECT_TARGET_SINGLE_FRIEND, //Only Single Friend + SELECT_TARGET_AOE_FRIEND, //Only AoE Friend + SELECT_TARGET_ANY_FRIEND, //AoE or Single Friend +}; + +//Spell Effects used by SelectSpell +enum SelectEffect +{ + SELECT_EFFECT_DONTCARE = 0, //All spell effects allowed + SELECT_EFFECT_DAMAGE, //Spell does damage + SELECT_EFFECT_HEALING, //Spell does healing + SELECT_EFFECT_AURA, //Spell applies an aura +}; + +//Selection method used by SelectTarget +enum SelectAggroTarget +{ + SELECT_TARGET_RANDOM = 0, //Just selects a random target + SELECT_TARGET_TOPAGGRO, //Selects targes from top aggro to bottom + SELECT_TARGET_BOTTOMAGGRO, //Selects targets from bottom aggro to top +}; + class MANGOS_DLL_SPEC CreatureAI { public: diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h index 98e2585763..70d5d7c892 100644 --- a/src/game/GridNotifiers.h +++ b/src/game/GridNotifiers.h @@ -709,6 +709,31 @@ namespace MaNGOS Unit* const i_funit; }; + class NearestAssistCreatureInCreatureRangeCheck + { + public: + NearestAssistCreatureInCreatureRangeCheck(Creature* obj,Unit* enemy, float range) + : i_obj(obj), i_enemy(enemy), i_range(range) {} + + bool operator()(Creature* u) + { + if(u->getFaction() == i_obj->getFaction() && !u->isInCombat() && !u->GetCharmerOrOwnerGUID() && u->IsHostileTo(i_enemy) && u->isAlive()&& i_obj->IsWithinDistInMap(u, i_range) && i_obj->IsWithinLOSInMap(u)) + { + i_range = i_obj->GetDistance(u); // use found unit range as new range limit for next check + return true; + } + return false; + } + float GetLastRange() const { return i_range; } + private: + Creature* const i_obj; + Unit* const i_enemy; + float i_range; + + // prevent clone this object + NearestAssistCreatureInCreatureRangeCheck(NearestAssistCreatureInCreatureRangeCheck const&); + }; + class AnyAssistCreatureInRangeCheck { public: @@ -800,6 +825,110 @@ namespace MaNGOS float i_range; }; + // Searchers used by ScriptedAI + class MostHPMissingInRange + { + public: + MostHPMissingInRange(Unit const* obj, float range, uint32 hp) : i_obj(obj), i_range(range), i_hp(hp) {} + bool operator()(Unit* u) + { + if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->GetMaxHealth() - u->GetHealth() > i_hp) + { + i_hp = u->GetMaxHealth() - u->GetHealth(); + return true; + } + return false; + } + private: + Unit const* i_obj; + float i_range; + uint32 i_hp; + }; + + class FriendlyCCedInRange + { + public: + FriendlyCCedInRange(Unit const* obj, float range) : i_obj(obj), i_range(range) {} + bool operator()(Unit* u) + { + if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && + (u->isFeared() || u->isCharmed() || u->isFrozen() || u->hasUnitState(UNIT_STAT_STUNDED) || u->hasUnitState(UNIT_STAT_STUNDED) || u->hasUnitState(UNIT_STAT_CONFUSED))) + { + return true; + } + return false; + } + private: + Unit const* i_obj; + float i_range; + }; + + class FriendlyMissingBuffInRange + { + public: + FriendlyMissingBuffInRange(Unit const* obj, float range, uint32 spellid) : i_obj(obj), i_range(range), i_spell(spellid) {} + bool operator()(Unit* u) + { + if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && + !(u->HasAura(i_spell, 0) || u->HasAura(i_spell, 1) || u->HasAura(i_spell, 2))) + { + return true; + } + return false; + } + private: + Unit const* i_obj; + float i_range; + uint32 i_spell; + }; + + class AllFriendlyCreaturesInGrid + { + public: + AllFriendlyCreaturesInGrid(Unit const* obj) : pUnit(obj) {} + bool operator() (Unit* u) + { + if(u->isAlive() && u->GetVisibility() == VISIBILITY_ON && u->IsFriendlyTo(pUnit)) + return true; + + return false; + } + private: + Unit const* pUnit; + }; + + class AllGameObjectsWithEntryInGrid + { + public: + AllGameObjectsWithEntryInGrid(uint32 ent) : entry(ent) {} + bool operator() (GameObject* g) + { + if(g->GetEntry() == entry) + return true; + + return false; + } + private: + uint32 entry; + }; + + class AllCreaturesOfEntryInRange + { + public: + AllCreaturesOfEntryInRange(Unit const* obj, uint32 ent, float ran) : pUnit(obj), entry(ent), range(ran) {} + bool operator() (Unit* u) + { + if(u->GetEntry() == entry && pUnit->IsWithinDistInMap(u, range)) + return true; + + return false; + } + private: + Unit const* pUnit; + uint32 entry; + float range; + }; + #ifndef WIN32 template<> void PlayerRelocationNotifier::Visit(CreatureMapType &); template<> void PlayerRelocationNotifier::Visit(PlayerMapType &);