PDA

Просмотр полной версии : Map::GetCreature


virusav
27.05.2010, 15:16
Есть запуск такси, у которого есть несколько эвентов, в которых нпц должен произносить фразы, но текущая реализация команды SCRIPT_COMMAND_TALK позволяет искать ближайшего нпц по коду и в определенном радиусе.
В случае с такси игрок оказывается далеко, поэтому часть фраз говорит игрок, т.к. нпц не находится.

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

В Map.cpp есть:
Creature* Map::GetCreature(ObjectGuid guid)
{
return m_objectsStore.find<Creature>(guid.GetRawValue(), (Creature*)NULL);
}


В том же файле:
Creature* pBuddy = NULL; // строка уже есть
pBuddy = GetCreature(step.script->datalong4); // добавляю, где step.script->datalong4 = гуид нпц

В итоге ничего не находится.
Отладчик выдает такой же результат.

НПЦ должен находиться данной функцией независимо от расстояния до него от игрока?

LordJZ
27.05.2010, 15:23
Делайте так: GetCreature(ObjectGuid(HIGHGUID_CREATURE, entry, guid))
(порядок параметров не помню)

virusav
27.05.2010, 15:36
Этот пример видел, но в том же файле есть обычный вызов функции с одним параметром.
Интересно, почему не ищется по гуиду.

Или здесь учитывается абсолютный гуид, который присвоен нпц в игровом мире, а не тот, что в базе?

LordJZ
27.05.2010, 15:59
Именно так, в базе лишь counter.

virusav
27.05.2010, 16:03
GetCreature(ObjectGuid(HIGHGUID_CREATURE, entry, guid))
Если надо найти нпц по гуиду, но в случае неудачи не выполнять поиск по коду в радиусе, то значения кода и радиуса будут равны 0.

Для использования функции выше обязательно нужен код нпц.

Есть ли варианты поиска нпц только по гуиду?

LordJZ
27.05.2010, 16:07
Если под "кодом" вы имеете ввиду entry, то, я думаю, нет.

virusav
27.05.2010, 16:08
Да, код - это entry.
Как я понимаю, должна быть некая таблица (в памяти) связей гуидов из базы с абсолютными гуидами в игре.

LordJZ
27.05.2010, 16:39
"Гуид в базе" - это m_counter из ObjectGuid.
"Абсолютный гуид", т.е. ObjectGuid, создается описанным мной методом из entry+counter.

А что мешает в скрипте хранить и entry, и гуид? Пусть если есть гуид, ищет по entry+counter через Map::GetWorldObject, а если нет -- по entry используя текущую реализацию.

Прочем, насколько мне известно, скриптами занимается NoFantasy, а он, как мне кажется, не сильно любит переговоров насчет введения новых скриптофич, предпочитая все делать самостоятельно.

virusav
27.05.2010, 16:46
Параметры:
step.script->datalong2 - entry
step.script->datalong3 - радиус
step.script->datalong4 - гуид

Если по гуиду ничего не найдено, то будет искать по entry в радиусе, если entry задан.

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

LordJZ
27.05.2010, 16:51
А вы сделайте чтобы искало в радиусе если по гуиду не нашлось... вообще это ошибка

virusav
27.05.2010, 17:26
Я так хочу сделать:
1. Ищем по гуиду, если он указан.
2. Если в п. 1 ничего не нашлось и entry указан, то ищем по entry в радиусе.

LordJZ
27.05.2010, 17:49
Делайте.

virusav
27.05.2010, 23:34
http://getmangos.com/community/showthread.php?14058-patch-SCRIPT_COMMAND_TALK-extended-search