Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Новичкам

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

Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.03.2010, 20:43   #1
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию Поиск всех нпц в радиусе + проверка актуальности цели

В разных точках находятся нпц с кодами А, Б и В.
Используем итем - засчитывается точка.
Если вешать скрипт на итем, то нужно в момент использования найти одного из трех нпц.

С помощью GetClosestCreatureWithEntry можно найти нпц с определенным кодом.
Можно 3 раза данную вызвать функцию, но, как мне кажется, это нецелесообразно.

Возможно, поиск всех нпц в радиусе, а потом сравнение кодов с нужными будет более правильно.

Нашел веселые конструкции вида MaNGOS::NearestCreatureEntryWithLiveStateInObjectR angeCheck и т.д., но там тоже, вроде, привязка к коду, т.е. можно найти всех нпц, но одного кода.

1. Каким образом можно найти всех нпц в радиусе?
2. До кучи: как проверить, нпц/го/итем все еще является целью квеста или нет?
virusav вне форума   Ответить с цитированием
Старый 13.03.2010, 22:12   #2
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

1. Был поисковик всех юнитов, завтра напишу точнее. В конце концов можно написать свой.
2. Если нпц - килл-кредиты, то их можно убивать, насчет го/итема не совсем понял
MaS0n вне форума   Ответить с цитированием
Старый 13.03.2010, 22:13   #3
YuruY
YTDB Dev
 
Аватар для YuruY
 
Регистрация: 01.02.2010
Сообщений: 288
Сказал(а) спасибо: 125
Поблагодарили 97 раз(а) в 53 сообщениях
YuruY Скоро придёт к известностиYuruY Скоро придёт к известности
По умолчанию

И конкретный пример-бы наверно всем не помешал-бы.
__________________
http://ytdb.ru/
http://svn2.assembla.com/svn/ytdbase/
YuruY вне форума   Ответить с цитированием
Старый 13.03.2010, 22:28   #4
zevgen
Новичок
 
Регистрация: 13.03.2010
Сообщений: 16
Сказал(а) спасибо: 6
Поблагодарили 19 раз(а) в 5 сообщениях
zevgen На верном пути
По умолчанию Предлагаю такую вот конструкцию

В Object.cpp
Код:
ifier, *aMap, *this, aMap->GetVisibilityDistance());
 
     ClearUpdateMask(false);
 }
+void WorldObject::GetCreatureListWithEntryInGrid(std::list<Creature*>& lList, uint32 uiEntry, float fMaxSearchRange)
+{
+    CellPair pair(MaNGOS::ComputeCellPair(this->GetPositionX(), this->GetPositionY()));
+    Cell cell(pair);
+    cell.data.Part.reserved = ALL_DISTRICT;
+    cell.SetNoCreate();
+
+    MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck check(*this, uiEntry, true, fMaxSearchRange);
+    MaNGOS::CreatureListSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(this, lList, check);
+    TypeContainerVisitor<MaNGOS::CreatureListSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> visitor(searcher);
+
+    cell.Visit(pair, visitor, *(this->GetMap()));
+}
 
 bool WorldObject::IsControlledByPlayer() const
 {
     switch (GetTypeId())
     {
В Object.h
Код:
@@ -497,10 +497,11 @@ class MANGOS_DLL_SPEC WorldObject : public Object
         void BuildUpdateData(UpdateDataMapType &);
 
         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 GetCreatureListWithEntryInGrid(std::list<Creature*>& lList, uint32 uiEntry, float fMaxSearchRange);
 
     protected:
         explicit WorldObject();
 
         //these functions are used mostly for Relocate() and Corpse/Player specific stuff...
Воспользовался логикой из Trinity переписал функцию, так как, если мне не изменяет память стандартными средствами требуемая задача не решается.

Далее пример как с таким работать. Я использую у себя в скрипте на Игниса. Создаем список
Код:
std::list<Creature*> CreatureList;
m_creature->GetCreatureListWithEntryInGrid(CreatureList,ТО-ЧТО-ИЩЕМ,РАДИУСf);
И перебираем циклом
Код:
for (std::list<Creature*>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr)
            {
				(*itr)->Действаия
            }
zevgen вне форума   Ответить с цитированием
Старый 13.03.2010, 22:47   #5
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

GetCreatureListWithEntryInGrid - это поиск всех нпц с указанным кодом в радиусе.

Поясню: есть квесты http://ru.wowhead.com/?quest=5097/5098, в которых надо использовать итем в 4 точках, при этом суммонится го (факел).

Насколько я помню, квесты никогда не работали.

Написал скрипт, выполнил квест, все в порядке, но это на скорую руку, поэтому использовал 4 раза вызов GetClosestCreatureWithEntry, что нерационально.
Как мне кажется, было бы лучше найти всех нпц в радиусе, прокрутить их в цикле и сравнивать с кодами имеющихся нпц.

Для этой цели мне и нужен поиск всех мобов в радиусе.
virusav вне форума   Ответить с цитированием
Старый 13.03.2010, 23:04   #6
zevgen
Новичок
 
Регистрация: 13.03.2010
Сообщений: 16
Сказал(а) спасибо: 6
Поблагодарили 19 раз(а) в 5 сообщениях
zevgen На верном пути
По умолчанию

Так в чем проблема. Есть функция для поиска всех объектов в радиусе, создавайте списки 1 - с котором хранятся указатели на все объекты в заданом радиусе и во втором нужные entry и работайте с ними в цикле. Я просто не могу вкурить в чем проблема.
zevgen вне форума   Ответить с цитированием
Старый 13.03.2010, 23:11   #7
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Есть функция поиска всех нпц с определенным кодом.
Т.е. я не могу с помощью них взять всех нпц и, прокрутив один раз цикл, найти нужных.

Мне нужно взять сразу всех независимо от кода, чтобы прокрутить цикл один раз.
virusav вне форума   Ответить с цитированием
Старый 13.03.2010, 23:17   #8
zevgen
Новичок
 
Регистрация: 13.03.2010
Сообщений: 16
Сказал(а) спасибо: 6
Поблагодарили 19 раз(а) в 5 сообщениях
zevgen На верном пути
По умолчанию

Прууу что есть код? Entry ?
zevgen вне форума   Ответить с цитированием
Старый 13.03.2010, 23:22   #9
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Да.
Есть нпц с кодами=entry А, Б, В и Г.
Надо найти в радиусе ВСЕХ нпц одним методом/функцией, чтобы потом можно было прокрутить цикл и найти одного из них.
virusav вне форума   Ответить с цитированием
Старый 15.03.2010, 08:10   #10
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Вот такой симпатичный поисковичок
GridNotifiers.h
Код:
AnyUnitInObjectRangeCheck
По-моему, раз мы собрались использовать ее только в скриптах, обьявление в Object не требуется)

sc_creature.cpp
Код:
std::list<Creature*> ScriptedAI::GetCreatureList(float fRange)
{
    CellPair p(MaNGOS::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
    Cell cell(p);
    cell.data.Part.reserved = ALL_DISTRICT;
    cell.SetNoCreate();

    std::list<Creature*> pList;

    MaNGOS::AnyUnitInObjectRangeCheck u_check(m_creature, fRange);
    MaNGOS::CreatureListSearcher<MaNGOS::AnyUnitInObjectRangeCheck> searcher(m_creature, pList, u_check);

    TypeContainerVisitor<MaNGOS::CreatureListSearcher<MaNGOS::AnyUnitInObjectRangeCheck>, GridTypeMapContainer >  grid_creature_searcher(searcher);

    CellLock<GridReadGuard> cell_lock(cell, p);
    cell_lock->Visit(cell_lock, grid_creature_searcher, *(m_creature->GetMap()));

    return pList;
}
sc_creature.h
Код:
    //Returns a list of all units within range
    std::list<Creature*> GetCreatureList(float fRange);
ищет любых ЖИВЫХ мобов в определенном радиусе

В скриптах испотльзовать
Код:
std::list<Creature*> CreatureList = m_creature->GetCreatureList(10.0f(радиус));
и перебираем листик циклом, как у zevgen'a

Если потребуется специфический поисковичок - напиши что надо, выложу
MaS0n вне форума   Ответить с цитированием
Старый 15.03.2010, 09:25   #11
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Такой же, как и http://ru-mangos.ru/showthread.php?t=291?

Было бы неплохо увидеть реализацию в ядре или СД2, чтобы не тягать каждый раз класс за собой.
В патчи для ядра уже выложен.
virusav вне форума   Ответить с цитированием
Старый 15.03.2010, 09:54   #12
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

патч фактически не нужен, это уже есть в мангосе, я брал с чистых свежих сорцов
Хотя все-таки отличается, патч zevgen'a считает всех мобов, которые в радиусе и на линии видимости
Стандартный мангосовский - считает только живых и просто в радиусе, не считаясь с линией видимости

Надо более точно определить задачи этого поисковика, если он не будет использоватся в ядре, зачем его туда добавлять, достаточно в скриптах.
MaS0n вне форума   Ответить с цитированием
Старый 15.03.2010, 10:16   #13
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Нужно искать всех мобов в радиусе (вокруг), мертвых можно определить в цикле.
virusav вне форума   Ответить с цитированием
Старый 15.03.2010, 10:45   #14
zevgen
Новичок
 
Регистрация: 13.03.2010
Сообщений: 16
Сказал(а) спасибо: 6
Поблагодарили 19 раз(а) в 5 сообщениях
zevgen На верном пути
По умолчанию

А вы уверены что в методе AnyUnitInObjectRangeCheck первым аргументом может быть m_creature?
zevgen вне форума   Ответить с цитированием
Старый 15.03.2010, 12:47   #15
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Мне кажется, вопрос немного шире, чем предложил virusav. При этом он сам это говорил на мангос-конференции и при личном общении в аське.
В первую очередь нужно бы реализовать spell_effect ActivateObject... А потом уже и пытаться реализовать подобные квесты...
KiriX вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[patch/dev] комбопойнты для всех ;) rsa Патчи 5 02.01.2011 10:27
Поиск всех объектов в радиусе virusav Прочая документация 5 05.08.2010 13:06
[patch]Спеллы, учитывающие пол цели virusav Принятые патчи 1 15.07.2010 05:32
[patch] Поиск всех юнитов в радиусе zevgen Патчи на рассмотрении 1 15.03.2010 20:55
Цели на карте xmolex Запросы 4 07.03.2010 11:37


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


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