Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Патчи на рассмотрении

Важная информация

Патчи на рассмотрении Рассматриваемые к принятию патчи

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2010, 11:42   #1
zevgen
Новичок
 
Регистрация: 13.03.2010
Сообщений: 16
Сказал(а) спасибо: 6
Поблагодарили 19 раз(а) в 5 сообщениях
zevgen На верном пути
Радость [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.
zevgen вне форума   Ответить с цитированием
9 пользователя(ей) сказали cпасибо:
ANTOMA (16.03.2010), Den (06.01.2011), Fear (14.03.2010), Hantet (14.03.2010), KiriX (14.03.2010), PSZ (15.03.2010), Ranger (14.03.2010), virusav (14.03.2010)
Старый 15.03.2010, 20:55   #2
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию

Вообще-то класс для поиска всех юнитов в радиусе объекта уже есть. Это AnyUnitInObjectRangeCheck.
А насчет функции типа void WorldObject::GetCreatureListInGrid - их принято делать в движке скриптов. В sc_grid_searchers.cpp.
PSZ вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[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


Текущее время: 11:25. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot