Ru-MaNGOS

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

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

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

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

Есть квесты, где дается пет для собирания итемов или киллкредитов для игрока.
Если цель спелла TARGET_MASTER, то кастовать его должен пет.

Написал скрипт: нпц умирает, ищет в радиусе действия спелла нпц (квестовый пет игрока) и заставляет того кастовать спелл на себя.

GetCreatureListWithEntryInGrid не находит пета, т.к. поиск идет по Creature*
Если поставить нпц-пета с тем же кодом в мир, то функция его найдет.

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

Таким образом петы попадают в поиск:
Код:
        std::list<Creature*> tempTargetUnitMap;
        MaNGOS::AnyUnitInObjectRangeCheck u_check(m_creature, radius);
        MaNGOS::CreatureListSearcher<MaNGOS::AnyUnitInObjectRangeCheck> searcher(tempTargetUnitMap, u_check);
        Cell::VisitAllObjects(m_creature, searcher, radius);
Отдельного поисковика для петов пока не нашел.
virusav вне форума   Ответить с цитированием
Старый 18.11.2010, 22:37   #3
Aleee2
Гость
 
Сообщений: n/a
По умолчанию

Помнится, тоже задавался таким вопросом, и в конце концов (просто потому что нуб) пришел к имитации смерти с последующим использованием MoveInLineOfSight.
Было бы интересно увидеть рациональное решение.
  Ответить с цитированием
Старый 18.11.2010, 23:24   #4
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

не очень понятно зачем искать пета через гридсерчеры, у них другое назначение немного. пета надо брать либо через owner->GetPet() либо GetMap()->GetPet(). случай мультипетов не рассматривается, но их в чистом ядре и нету.
rsa вне форума   Ответить с цитированием
Старый 19.11.2010, 09:02   #5
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

http://ru.wowhead.com/quest=10924
С помощью квестового итема призываем пета, потом убиваем нпц, который ищет в радиусе действия спелла призванного игроком пета и заставляет того кастовать спелл c киллкредитом.

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

Скрипт СД2 я написал, работает, но через пример из поста 2.
Есть еще подобные квесты, т.е. будет одинаковый код копироваться с места на место.

По всем правилам должна быть функция поиска.
virusav вне форума   Ответить с цитированием
Старый 19.11.2010, 11:12   #6
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Ошибка в идеологии. Пет - это не специальный вид кричи, это функция (атрибут) юнита. Крича с одним идом может быть как петом так и нет (в теории). Так что поиск через гридсерчер все равно придется пропускать через фильтр хозяин-пет. Есть ли смысл 2 раза делать одну работу - непонятно.
Кроме того, ваш поиск найдет петов, которые уже перестали быть таковыми - например удрали от игрока...
Так что IMHO алгоритм должен быть - ищем игроков, берем их петов и кастим. Проще, вернее в теории и куда менее ресурсоемко.
rsa вне форума   Ответить с цитированием
Старый 19.11.2010, 11:27   #7
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Этот вариант (поиск игроков) я рассматривал, но пока оставил, т.к. в СД2 есть готовая функция поиска нпц, поэтому стал пробовать делать через нее.

Главное - определить, кого и как правильно искать, т.к. надо будет, как я понимаю, писать новую функцию для СД2 и использовать ее в подобных квестах.
virusav вне форума   Ответить с цитированием
Старый 19.11.2010, 12:01   #8
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Пет protector?
https://github.com/mangos/mangos/com...4cbafe3568c444
zergtmn вне форума   Ответить с цитированием
Старый 19.11.2010, 12:16   #9
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

OwnerKilledUnit вчера видел, но не факт, что скриптованного нпц убьет игрок.
Это может сделать неквестовый пет игрока, другой нпц, если его контролят и т.д.

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

В итоге получается 2 вопроса:
1. Кого правильнее искать в подобных ситуациях: петов или игроков?
2. Каким образом найти петов или игроков в радиусе?
virusav вне форума   Ответить с цитированием
Старый 20.11.2010, 04:32   #11
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Этот вариант (поиск игроков) я рассматривал, но пока оставил, т.к. в СД2 есть готовая функция поиска нпц, поэтому стал пробовать делать через нее.

Главное - определить, кого и как правильно искать, т.к. надо будет, как я понимаю, писать новую функцию для СД2 и использовать ее в подобных квестах.
Странный подход - используете тяжелую по ресурсам функцию поиска по грид потому что есть вместо того чтобы простканировать группу на наличие нужных петов
где выборка идет по значительно более быстрому поиску по гуидам.

Вот после таких решений появляется непреодолимое желание ограничить максимально доступ изскриптом к максимальнойму количеству функций, во избежание появления решений... что и делаем по мере возможностей. Ибо нефиг.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 20.11.2010, 13:29   #12
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

1. Если бы я написал патч с указанной мной функцией и стал бы навязывать его для принятия в репозитарий, то это был бы "странный подход". На текущий момент я выясняю, как правильнее поступать в таких ситуациях, о чем не раз писал.
2. Я не знаю, о чем идет речь в "простканировать группу на наличие нужных петов". Может, просто формулировку не понял или не в курсе, что есть такая функция, поэтому и задал вопрос, чтобы знающие люди подсказали и направили на правильный путь.

Цитата:
Сообщение от Vladimir Посмотреть сообщение
Вот после таких решений появляется непреодолимое желание ограничить максимально доступ изскриптом к максимальнойму количеству функций, во избежание появления решений... что и делаем по мере возможностей. Ибо нефиг.
Мной нигде не было указано готовое решение, просто был приведен пример.
Я сам против самопальных, тяжелых по ресурсам решений.

На текущий момент интересуют ответы на вопросы из поста 10 для правки нерабочих квестов.
virusav вне форума   Ответить с цитированием
Старый 21.11.2010, 16:39   #13
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Я прореагировал на
Цитата:
т.к. в СД2 есть готовая функция
Просто это плохой повод использовать заведомо более медленную реализацию - в разы более медленную.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 21.11.2010, 17:39   #14
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Если честно, я не разбираюсь в гридах и поисках, поэтому стал пробовать сначала готовое по образу и подобию в других скриптах СД2.

Если не сложно, подскажите на примере, как решить проблему?
virusav вне форума   Ответить с цитированием
Старый 21.11.2010, 20:09   #15
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

поскольку "для всех игроков" наверняка ошибка, я не слышал чтобы на оффе так квесты комплитились, наверняка "для всех в пати", то надо сделать так - берем киллера, если он не плеер - то ближайшего плеера, обходим его группу если он в пати, выбираем всех петов в радиусе и кастим. что я собственно уже писал выше.
rsa вне форума   Ответить с цитированием
Старый 21.11.2010, 20:33   #16
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Крек как-то писал, что на офе завершил квест, пролетая на маунте над точкой, где кто-то выполнил тот же квест, так что на офе есть комплит квеста независимо от нахождения в группе.

В данном случае я проверять буду именно игроков из группы, если такая есть.

Проверять надо дистанцию до пета, а не до игрока.
Например, радиус спелла 20, 2 игрока попадают, третий в радиусе 21 нет, хотя его пет в радиусе 19.
При этом у первого игрока пет в радиусе 21, хотя сам игрок в радиусе 19.
Поэтому писал о необходимости искать именно петов, чтобы отсеять ошибки.

НФ писал про ScriptedAI::GetPlayerAtMinimumRange, но данная функция может выбрать игрока неправильно, если нпц был убит с дальней дистанции, а рядом находился игрок, например, из другой группы.

Перебирать m_creature->GetMap()->GetPlayers(), как мне кажется, будет тяжелым по ресурсам вариантом, точно не могу сказать.

Есть примеры поиска игроков или петов, не сильно тяжелые по ресурсам?
virusav вне форума   Ответить с цитированием
Старый 23.11.2010, 11:07   #17
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Возможно вопрос и глупый, но на самого Зеппита скрипт не повесить?
KiriX вне форума   Ответить с цитированием
Старый 23.11.2010, 11:29   #18
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

Спросил у игрока с офа: зачет будет идти тому, кто первым нанес урон, и его группе.
Следовательно, с помощью GetCharmerOrOwnerPlayerOrPlayerItself ищем игрока, потом его группу, проверяем у всех наличие петов и сравниваем расстояние.
Правда, с функцией проверки расстояния пока еще не определился, т.к. их там несколько.
virusav вне форума   Ответить с цитированием
Старый 23.11.2010, 11:42   #19
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Мне кажется, не стоит, т.к. ему постоянно придется сканировать местность на наличие только что убитых нпц.

Спросил у игрока с офа: зачет будет идти тому, кто первым нанес урон, и его группе.
Следовательно, с помощью GetCharmerOrOwnerPlayerOrPlayerItself ищем игрока, потом его группу, проверяем у всех наличие петов и сравниваем расстояние.
Правда, с функцией проверки расстояния пока еще не определился, т.к. их там несколько.
Может и не стоит, однако это будет, как мне кажется, в разы менее ресурсоёмко...
KiriX вне форума   Ответить с цитированием
Старый 23.11.2010, 13:00   #20
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Если скрипт на нпц, то в момент смерти нпц ищем и кастуем на нужные цели.
Если скрипт на пете, то у каждого игрока будет бегать сканер, который постоянно будет выполнять поиск.
virusav вне форума   Ответить с цитированием
Старый 23.11.2010, 15:36   #21
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

А на игрока при вызове пета не вешается случайно никакой баф? Можно было бы просто повесить скрипт на моба и в JustDied проверять наличие ауры на килире. Если нету то мимо, если есть - килл кредит\квест компилт\каст спелла

add:

Помнится аура все же есть. Вспомнил квест в низине на оффе проходил.Аура точно была

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

Создавал тему на форуме СД2 и писал НФ, что к чему, т.к. не было нужной реализации.

В итоге в последних коммитах ядра появился новый класс и тип реакции пета на смерть нпц. В таком варианте скрипт можно вешать на нпц.
В последнем коммите СД2 НФ для примера реализовал квест, о котором я писал.

Только теперь ситуация меняется, т.к. надо брать не того, кто убил, а того, кто атаковал первым и должен являться счастливым обладателем лута, опыта и киллкредита.
Как я понимаю, все-таки надо вешать скрипт на нпц, которого надо убивать.
В момент смерти он должен брать из агролиста первого атаковавшего, его группу, перебирать петов группы, проверять дистанцию и заставлять петов кастовать на себя.
virusav вне форума   Ответить с цитированием
Старый 23.11.2010, 16:20   #23
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Дак JustDied(Unit* killer) - killer будет вроде бы только тот, кто первым ударил, или я жутко ошибаюсь?
Lordronn вне форума   Ответить с цитированием
Старый 23.11.2010, 16:24   #24
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Обычно killer - это тот, кто убил.
virusav вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск потерянного DeusModus Флудильня 37 09.07.2010 12:26
Поиск подземелий zerwih Флудильня 9 18.06.2010 15:46
Поиск подземелья Chestarfild Опкоды 15 24.05.2010 22:43
Поиск знатока Archon64 Флудильня 9 04.05.2010 10:28
Поиск хака на spell 52462 DiffuSer Патчи 3 24.03.2010 12:37


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


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