|
Патчи на рассмотрении Рассматриваемые к принятию патчи |
|
Опции темы | Поиск в этой теме | Опции просмотра |
14.03.2010, 11:42 | #1 |
Новичок
Регистрация: 13.03.2010
Сообщений: 16
Сказал(а) спасибо: 6
Поблагодарили 19 раз(а) в 5 сообщениях
|
[patch] Поиск всех юнитов в радиусе
*Ошибся в названии темы - поиск всех юнитов в радиусе.
Сделано по заказу http://ru-mangos.ru/showthread.php?t=281 Более простого способа не нашел. Код:
commit 0b88b201fc342bdc9f410a37dbaa75a53d926c30 Author: zevgen <zevgen@vdonsk.ru> Date: Sun Mar 14 12:36:30 2010 +0300 New Func diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h index d05c73a..f3f5059 100644 --- a/src/game/GridNotifiers.h +++ b/src/game/GridNotifiers.h @@ -1012,6 +1012,32 @@ namespace MaNGOS float i_range; }; + class AnyCreatureInRangeCheck + { + public: + AnyCreatureInRangeCheck(Unit* funit, float range) + : i_funit(funit), i_range(range) + { + } + bool operator()(Creature* u) + { + if(u == i_funit) + return false; + + // too far + if( !i_funit->IsWithinDistInMap(u, i_range) ) + return false; + + if( !i_funit->IsWithinLOSInMap(u) ) + return false; + + return true; + } + private: + Unit* const i_funit; + float i_range; + }; + class NearestAssistCreatureInCreatureRangeCheck { public: diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 9d10cd5..5def096 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -2019,6 +2019,19 @@ void WorldObject::BuildUpdateData( UpdateDataMapType & update_players) ClearUpdateMask(false); } +void WorldObject::GetCreatureListInGrid(Unit* u_searcher, std::list<Creature*>& lList, float fMaxSearchRange) +{ + CellPair pair(MaNGOS::ComputeCellPair(this->GetPositionX(), this->GetPositionY())); + Cell cell(pair); + cell.data.Part.reserved = ALL_DISTRICT; + cell.SetNoCreate(); + + MaNGOS::AnyCreatureInRangeCheck check(u_searcher, fMaxSearchRange); + MaNGOS::CreatureListSearcher<MaNGOS::AnyCreatureInRangeCheck> searcher(this, lList, check); + TypeContainerVisitor<MaNGOS::CreatureListSearcher<MaNGOS::AnyCreatureInRangeCheck>, GridTypeMapContainer> visitor(searcher); + + cell.Visit(pair, visitor, *(this->GetMap())); +} bool WorldObject::IsControlledByPlayer() const { diff --git a/src/game/Object.h b/src/game/Object.h index 947d433..1ea1536 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -499,6 +499,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object Creature* SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime); Vehicle* SummonVehicle(uint32 id, float x, float y, float z, float ang, uint32 vehicleId = NULL); GameObject* SummonGameobject(uint32 id, float x, float y, float z, float ang, uint32 despwTime); + void GetCreatureListInGrid(Unit* u_searcher, std::list<Creature*>& lList, float fMaxSearchRange); protected: explicit WorldObject(); Код:
std::list<Creature*> CreatureList; m_creature->GetCreatureListInGrid(UnitSearcher,CreatureList,radius); Код:
for (std::list<Creature*>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr) { (*itr)->Действаия } Последний раз редактировалось zevgen; 14.03.2010 в 13:53. |
15.03.2010, 20:55 | #2 |
Ученый
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
|
Вообще-то класс для поиска всех юнитов в радиусе объекта уже есть. Это AnyUnitInObjectRangeCheck.
А насчет функции типа void WorldObject::GetCreatureListInGrid - их принято делать в движке скриптов. В sc_grid_searchers.cpp. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[patch/dev] комбопойнты для всех ;) | rsa | Патчи | 5 | 02.01.2011 10:27 |
Поиск всех объектов в радиусе | virusav | Прочая документация | 5 | 05.08.2010 13:06 |
Поиск подземелий | zerwih | Флудильня | 9 | 18.06.2010 15:46 |
Поиск подземелья | Chestarfild | Опкоды | 15 | 24.05.2010 22:43 |
Поиск всех нпц в радиусе + проверка актуальности цели | virusav | Новичкам | 14 | 15.03.2010 12:47 |