|
Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь |
|
Опции темы | Поиск в этой теме | Опции просмотра |
18.11.2010, 21:41 | #1 |
Администратор
|
Поиск петов
Есть квесты, где дается пет для собирания итемов или киллкредитов для игрока.
Если цель спелла TARGET_MASTER, то кастовать его должен пет. Написал скрипт: нпц умирает, ищет в радиусе действия спелла нпц (квестовый пет игрока) и заставляет того кастовать спелл на себя. GetCreatureListWithEntryInGrid не находит пета, т.к. поиск идет по Creature* Если поставить нпц-пета с тем же кодом в мир, то функция его найдет. Каким образом можно найти пета игрока в радиусе? |
18.11.2010, 22:16 | #2 |
Администратор
|
Таким образом петы попадают в поиск:
Код:
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); |
18.11.2010, 22:37 | #3 |
Гость
Сообщений: n/a
|
Помнится, тоже задавался таким вопросом, и в конце концов (просто потому что нуб) пришел к имитации смерти с последующим использованием MoveInLineOfSight.
Было бы интересно увидеть рациональное решение. |
18.11.2010, 23:24 | #4 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
не очень понятно зачем искать пета через гридсерчеры, у них другое назначение немного. пета надо брать либо через owner->GetPet() либо GetMap()->GetPet(). случай мультипетов не рассматривается, но их в чистом ядре и нету.
|
19.11.2010, 09:02 | #5 |
Администратор
|
http://ru.wowhead.com/quest=10924
С помощью квестового итема призываем пета, потом убиваем нпц, который ищет в радиусе действия спелла призванного игроком пета и заставляет того кастовать спелл c киллкредитом. Есть информация, что зачет должен идти всем игрокам, призвавшим квестовых петов и находящимся в радиусе действия спелла. Скрипт СД2 я написал, работает, но через пример из поста 2. Есть еще подобные квесты, т.е. будет одинаковый код копироваться с места на место. По всем правилам должна быть функция поиска. |
19.11.2010, 11:12 | #6 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Ошибка в идеологии. Пет - это не специальный вид кричи, это функция (атрибут) юнита. Крича с одним идом может быть как петом так и нет (в теории). Так что поиск через гридсерчер все равно придется пропускать через фильтр хозяин-пет. Есть ли смысл 2 раза делать одну работу - непонятно.
Кроме того, ваш поиск найдет петов, которые уже перестали быть таковыми - например удрали от игрока... Так что IMHO алгоритм должен быть - ищем игроков, берем их петов и кастим. Проще, вернее в теории и куда менее ресурсоемко. |
19.11.2010, 11:27 | #7 |
Администратор
|
Этот вариант (поиск игроков) я рассматривал, но пока оставил, т.к. в СД2 есть готовая функция поиска нпц, поэтому стал пробовать делать через нее.
Главное - определить, кого и как правильно искать, т.к. надо будет, как я понимаю, писать новую функцию для СД2 и использовать ее в подобных квестах. |
19.11.2010, 12:01 | #8 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Пет protector?
https://github.com/mangos/mangos/com...4cbafe3568c444 |
19.11.2010, 12:16 | #9 |
Администратор
|
OwnerKilledUnit вчера видел, но не факт, что скриптованного нпц убьет игрок.
Это может сделать неквестовый пет игрока, другой нпц, если его контролят и т.д. Кроме того, зачет должен идти всем игрокам, у кого призван квестовый пет. Да и я не знаю, протектор призванный пет или нет. |
19.11.2010, 21:12 | #10 |
Администратор
|
В итоге получается 2 вопроса:
1. Кого правильнее искать в подобных ситуациях: петов или игроков? 2. Каким образом найти петов или игроков в радиусе? |
20.11.2010, 04:32 | #11 | |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Цитата:
где выборка идет по значительно более быстрому поиску по гуидам. Вот после таких решений появляется непреодолимое желание ограничить максимально доступ изскриптом к максимальнойму количеству функций, во избежание появления решений... что и делаем по мере возможностей. Ибо нефиг.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
20.11.2010, 13:29 | #12 | |
Администратор
|
1. Если бы я написал патч с указанной мной функцией и стал бы навязывать его для принятия в репозитарий, то это был бы "странный подход". На текущий момент я выясняю, как правильнее поступать в таких ситуациях, о чем не раз писал.
2. Я не знаю, о чем идет речь в "простканировать группу на наличие нужных петов". Может, просто формулировку не понял или не в курсе, что есть такая функция, поэтому и задал вопрос, чтобы знающие люди подсказали и направили на правильный путь. Цитата:
Я сам против самопальных, тяжелых по ресурсам решений. На текущий момент интересуют ответы на вопросы из поста 10 для правки нерабочих квестов. |
|
21.11.2010, 16:39 | #13 | |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Я прореагировал на
Цитата:
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
21.11.2010, 17:39 | #14 |
Администратор
|
Если честно, я не разбираюсь в гридах и поисках, поэтому стал пробовать сначала готовое по образу и подобию в других скриптах СД2.
Если не сложно, подскажите на примере, как решить проблему? |
21.11.2010, 20:09 | #15 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
поскольку "для всех игроков" наверняка ошибка, я не слышал чтобы на оффе так квесты комплитились, наверняка "для всех в пати", то надо сделать так - берем киллера, если он не плеер - то ближайшего плеера, обходим его группу если он в пати, выбираем всех петов в радиусе и кастим. что я собственно уже писал выше.
|
21.11.2010, 20:33 | #16 |
Администратор
|
Крек как-то писал, что на офе завершил квест, пролетая на маунте над точкой, где кто-то выполнил тот же квест, так что на офе есть комплит квеста независимо от нахождения в группе.
В данном случае я проверять буду именно игроков из группы, если такая есть. Проверять надо дистанцию до пета, а не до игрока. Например, радиус спелла 20, 2 игрока попадают, третий в радиусе 21 нет, хотя его пет в радиусе 19. При этом у первого игрока пет в радиусе 21, хотя сам игрок в радиусе 19. Поэтому писал о необходимости искать именно петов, чтобы отсеять ошибки. НФ писал про ScriptedAI::GetPlayerAtMinimumRange, но данная функция может выбрать игрока неправильно, если нпц был убит с дальней дистанции, а рядом находился игрок, например, из другой группы. Перебирать m_creature->GetMap()->GetPlayers(), как мне кажется, будет тяжелым по ресурсам вариантом, точно не могу сказать. Есть примеры поиска игроков или петов, не сильно тяжелые по ресурсам? |
23.11.2010, 11:29 | #18 |
Администратор
|
Мне кажется, не стоит, т.к. ему постоянно придется сканировать местность на наличие только что убитых нпц.
Спросил у игрока с офа: зачет будет идти тому, кто первым нанес урон, и его группе. Следовательно, с помощью GetCharmerOrOwnerPlayerOrPlayerItself ищем игрока, потом его группу, проверяем у всех наличие петов и сравниваем расстояние. Правда, с функцией проверки расстояния пока еще не определился, т.к. их там несколько. |
23.11.2010, 11:42 | #19 | |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
Цитата:
|
|
23.11.2010, 13:00 | #20 |
Администратор
|
Если скрипт на нпц, то в момент смерти нпц ищем и кастуем на нужные цели.
Если скрипт на пете, то у каждого игрока будет бегать сканер, который постоянно будет выполнять поиск. |
23.11.2010, 15:36 | #21 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
А на игрока при вызове пета не вешается случайно никакой баф? Можно было бы просто повесить скрипт на моба и в JustDied проверять наличие ауры на килире. Если нету то мимо, если есть - килл кредит\квест компилт\каст спелла
add: Помнится аура все же есть. Вспомнил квест в низине на оффе проходил.Аура точно была Последний раз редактировалось Lordronn; 23.11.2010 в 15:41. |
23.11.2010, 16:15 | #22 |
Администратор
|
Создавал тему на форуме СД2 и писал НФ, что к чему, т.к. не было нужной реализации.
В итоге в последних коммитах ядра появился новый класс и тип реакции пета на смерть нпц. В таком варианте скрипт можно вешать на нпц. В последнем коммите СД2 НФ для примера реализовал квест, о котором я писал. Только теперь ситуация меняется, т.к. надо брать не того, кто убил, а того, кто атаковал первым и должен являться счастливым обладателем лута, опыта и киллкредита. Как я понимаю, все-таки надо вешать скрипт на нпц, которого надо убивать. В момент смерти он должен брать из агролиста первого атаковавшего, его группу, перебирать петов группы, проверять дистанцию и заставлять петов кастовать на себя. |
23.11.2010, 16:20 | #23 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Дак JustDied(Unit* killer) - killer будет вроде бы только тот, кто первым ударил, или я жутко ошибаюсь?
|
23.11.2010, 16:24 | #24 |
Администратор
|
Обычно killer - это тот, кто убил.
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск потерянного | 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 |