• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Сияние квестовых объектов и персонажей
Stormtrooper
Командир
Привет всем
Есть вопросик - подскажите пожалуйста, где в ядре прописано сияние квестовых объектов и персов?
Имеется ввиду сияние предметов и персонажей когда у игрока взят квест в котором они задействованы
Если помог, ставь плюсик в репу :)

Сообщение # 1 написано 07.07.2016 в 21:20
darkteam1959
Скаут
Stormtrooper, Ты про знаки вопросов разного цвета когда взял и сделал квест это в клиенте.
Сообщение # 2 написано 08.07.2016 в 10:47
Stormtrooper
Командир
Нет не про знаки вопроса

Например ты взял квест где надо собирать валяющие на земле предметы - и вот эти предметы подсвечиваются золотистой аурой (на Дреноре) или сияющими звёздочками на БК
Если помог, ставь плюсик в репу :)

Сообщение # 3 написано 08.07.2016 в 11:33
Shkrest
Сержант
Ну это в dbc файлике ставится. Я не когда не пробовал это делать. Есть шанс что без патча для клиента не заработает.
Сообщение # 4 написано 19.08.2016 в 02:52
Stormtrooper
Командир
Даже рискну спросиь В КАКОМ файлике?
Если ты это написал значит ты знаешь это
А если нет то зачем писать было?
Если помог, ставь плюсик в репу :)

Сообщение # 5 написано 19.08.2016 в 09:52
r0m1ntik
Центурион
На самом деле все довольно просто, и не какой патч не нужен.

Шаг 1: Создать обьект (gameobject_template) и в колонке QuestItem1 поставить ид вашего итема который будет падать при луте обьекта.
Шаг 2: Все еще в gameobject_template в data0 поставить 57 а в data1 поставить ид лута.
Шаг 3: Создать сам итем и в табличке class поставить 12.
Шаг 4: Создать сам квест в котором нужно будет собрать итем(указаный в шаг 3).

Думаю что все это хватит для того чтобы при обьект блестел при взятие квеста.
Сообщение # 6 написано 20.08.2016 в 12:32
Stormtrooper
Командир
r0m1ntik, позвольте поинтересоваться К ЧЕМУ вы это написали?
Я спросил как ИЗМЕНИТЬ СИЯНИЕ а не как добавить квест со сбором лута с ГО
Сейчас при взятии квеста в котором есть взаимодействие с ГО, вокруг этого ГО появляются звёздочки - так вот я хочу чтобы вместо звёздочек появлялся например столб света - ну это так к примеру
Если помог, ставь плюсик в репу :)

Сообщение # 7 написано 20.08.2016 в 15:35
r0m1ntik
Центурион
Stormtrooper, плохо прочел biggrin ну все равно не помешает тем кто будет читать smile
Сообщение # 8 написано 20.08.2016 в 20:48
Stormtrooper
Командир
Скажу больше
Я нашёл флаг который отвечает за сияние
GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle

Вот только не пойму как поменять спелл или анимацию этого флага
Если помог, ставь плюсик в репу :)

Сообщение # 9 написано 20.08.2016 в 21:07
Pallam
Рыцарь
Варианты решения:
Простой: заменить анимацию патчем в клиент.
Сложный:
пойти в код
Файл GameObject.cpp

 
Код
case GAMEOBJECT_TYPE_GOOBER:
                        if (ActivateToQuest(target))
                            dynFlags |= GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE;
                        else if (targetIsGM)
                            dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
                        break;
                    case GAMEOBJECT_TYPE_GENERIC:
                        if (ActivateToQuest(target))
                            dynFlags |= GO_DYNFLAG_LO_SPARKLE;
                        break;


Ну и дальше играть с созданием новых спелов/гобов/мобов видимых только конкретному игроку.
Сообщение # 10 написано 22.08.2016 в 03:55
Stormtrooper
Командир
Обожаю такие советы
Как я уже сказал выше - флаг я нашёл и знаю где он используется - но в этом разделе невозможно заменить этот флаг на кастование спелла
Если бы это было так просто я бы не спрашивал
Если помог, ставь плюсик в репу :)

Сообщение # 11 написано 22.08.2016 в 09:05
Pallam
Рыцарь
Цитата Stormtrooper ()
но в этом разделе невозможно заменить этот флаг на кастование спелла
Вообще, ты работаешь с копией объекта. Объекты могут кастовать заклинания и даже определять их область видимости. Просто нужно постараться.
Сообщение # 12 написано 22.08.2016 в 14:39
Stormtrooper
Командир
уж поверь старался
во-первых на 2.4.3 объекты не кастовали
во-вторых CastSpell() и DoCast() не относятся к Object* а относятся к Unit* а потому неприменимы
Если помог, ставь плюсик в репу :)

Сообщение # 13 написано 22.08.2016 в 14:45
Pallam
Рыцарь
Цитата Stormtrooper ()
во-первых на 2.4.3 объекты не кастовали
во-вторых CastSpell() и DoCast() не относятся к Object* а относятся к Unit* а потому неприменимы

Религия триггер вызвать не позволяет?)
Сообщение # 14 написано 22.08.2016 в 14:54
Stormtrooper
Командир
для ВСЕХ объектов триггер вызывать? да ещё как-то надо писать условие чтобы видел его только тот у кого есть СООТВЕТСТВУЮЩИЙ квест а не все подряд
Если помог, ставь плюсик в репу :)

Сообщение # 15 написано 22.08.2016 в 15:01
Pallam
Рыцарь
Проверка на то, что у нас есть конкретный таргет и у него есть нужный квест. Посредством самой трини -
Код
if (dynFlags & GO_DYNFLAG_LO_SPARKLE)

А дальше плаваем как хотим - Хотим, вызываем тригер и делаем нашего человека в одной фазе с этим триггером, это из простой схемы.
Не лень копаться - работаем с глобальными worldobject, переводя уровни видимости на нужные нам.
Да, ядро придется покопать, но что поделать?

Если не хочется сильно замарачиваться, советую на тригер наложить owner гуид именно таргета. Тогда он всегда видим будет для персонажа...
Сообщение # 16 отредактировано Pallam - Понедельник, 22.08.2016, 15:10
gratural
Капрал
Stormtrooper, в БК не знаю, в лк за анимацию у лута, квестовых го и контейнеров отвечает Particle\Lootfx.m2
Соответсветнно чтобы ее изменить, нужно делать патч в клиент, который будет содержать анимированную модель с этим именем.
Вот например так:
Сообщение # 17 отредактировано gratural - Вторник, 23.08.2016, 08:08
Stormtrooper
Командир
Как я уже писал выше - в данном случае не нужно писать патч
Я знаю что и где отвечает за сияние но я не могу заставить объект кастовать что-то другое
В БК нет фазирования вообще и в БК объекты не умели использовать CastSpell и DoCast
Использование триггера не реально так как сияние должен видеть только игрок имеющий квест но если сделать как вы предлагаете то триггер будет появляться и видеть его будут все если рядом есть игрок с квестом
кроме того как сделать так чтобы он пропадал а не торчал бесконечно или не вызывался каждый раз как будет подходить игрок с квестом?
Вобщем вопросов слишком много при использовании триггера
Если помог, ставь плюсик в репу :)

Сообщение # 18 написано 23.08.2016 в 09:14
Pallam
Рыцарь
Цитата Stormtrooper ()
В БК нет фазирования вообще

Ага, а невидимости мага тоже не было.
Цитата Stormtrooper ()
Использование триггера не реально так как сияние должен видеть только игрок имеющий квест но если сделать как вы предлагаете то триггер будет появляться и видеть его будут все если рядом есть игрок с квестом

Перечитай сообщение. Укажи область видимости. Не можешь - забей тогда.
Цитата Stormtrooper ()
кроме того как сделать так чтобы он пропадал а не торчал бесконечно или не вызывался каждый раз как будет подходить игрок с квестом?

Наверное, любой вариант отловли нужного кричера зависимого от игрока?

Добавлено (23.08.2016, 12:44)
---------------------------------------------

Цитата Stormtrooper ()
Я знаю что и где отвечает за сияние но я не могу заставить объект кастовать что-то другое
На клиент отправляется пакет, отвечающий, за то, что бы клиент вызывал сияние объекта.. Остальное - 100% хардкод.

Добавлено (23.08.2016, 13:01)
---------------------------------------------
Объясняю более доступно.

Код
//Отправка пакета с dynFlags на клиент
if (dynFlags & GO_DYNFLAG_LO_SPARKLE)
{
    Creature* trigger = SummonCreature(MY_ID_FOR_SPARKLES, GetPosition());
    trigger->SetOwnerGUID(target->GetGUID());
    trigger->SetVisible(false);
    trigger->AddAura(MY_AURA_FOR_SPARKLES, trigger);
}
Сообщение # 19 написано 23.08.2016 в 13:01
Stormtrooper
Командир
Вобщем вариант с триггером это НЕ вариант для меня
Если помог, ставь плюсик в репу :)

Сообщение # 20 написано 23.08.2016 в 14:49
Pallam
Рыцарь
Цитата Stormtrooper ()
Вобщем вариант с триггером это НЕ вариант для меня

Тогда забудь и делай патч. Ну можешь проассемблить клиент. Тож вариант.
Сообщение # 21 написано 23.08.2016 в 16:36
Incorrect
Капрал
Дэфолтное свечение со стороны сервера изменить невозможно. Сервер лишь передает клиенту данные нужно или нет подсвечивать объект.

Варианты - копать клиент или хакать с помощью триггеров.
Сообщение # 22 написано 30.08.2016 в 03:43
Stormtrooper
Командир
Во-первых вы тупо повторили то что уже сказано а во-вторых вы не читали мои комментарии - изменить МОЖНО так как есть в ядре место которое отвечает за это и я привёл это место в комментариях - GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle
Так вот если убрать это из кода ядра то сияние пропадёт - а значит и заменить его можно - вопрос КАК
Если помог, ставь плюсик в репу :)

Сообщение # 23 написано 31.08.2016 в 11:00
Ranege
Чемпион
С чего Вы так уверенно говорите МОЖНО? Не думали о том, что отправляется некий пакет, как сигнал клиенту и объект начинает сиять и допустим в клиенте есть только одно такое место, которое принимает это и другого может  не быть?
Сообщение # 24 написано 31.08.2016 в 12:17
Pallam
Рыцарь
Цитата Stormtrooper ()
изменить МОЖНО так как есть в ядре место которое отвечает за это и я привёл это место в комментариях - GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle
...
Ты передаешь клиенту dynFlags в отдельном пакете. Отдельный бит там - наличие флага "сияния". То есть клиент САМ подсвечивает. Без сервера. Сервер никак на это не влияет. То есть абсолютно.
Он говорит клиенту:
Слышь, братишь, я тебе завернул в пакет флаг GO_DYNFLAG_LO_SPARKLE, будь добр, подсвети объектик  у себя на стороне.
Клиент:
Да не вопрос! (Ушел обрабатывать сияние)
Сообщение # 25 написано 31.08.2016 в 12:42
Stormtrooper
Командир
Ребят ну вы поражаете меня - пространственное мышление ну просто по нулям
Вот кусок кода который ТОЧНО отвечает за появление сияния:

Код
if (index == GAMEOBJECT_DYN_FLAGS)
                {
                    if (IsActivateToQuest)
                    {
                        switch (((GameObject*)this)->GetGoType())
                        {
                        case GAMEOBJECT_TYPE_CHEST:
                        case GAMEOBJECT_TYPE_GOOBER:
                            *data << uint16(GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE);  <---------------- ВОТ ОНО
                            *data << uint16(-1);
                            break;
                        default:
                            *data << uint32(0);         // unknown, not happen.
                            break;
                        }
                    }
                    else
                        *data << uint32(0);                 // disable quest object
                }
                else
                    *data << m_uint32Values[ index ];       // other cases


Я проверял - если убрать эту часть то сияния у квестовых объектов не будет
А теперь включаем пространственное мышление и представим что я взял и вместо этой строки написал код который заставляет объект кастовать какую-то ауру - получаем нужный результат
Единственное чего я не знаю это КАК заставить ОБЪЕКТ кастовать - CastSpell() и DoCast() объект не принимает. AddAura() и SetAura() так же не принимаются

Добавлено (01.09.2016, 10:59)
---------------------------------------------
Пробовал сделать так (чисто ради теста) - получил краш :(
Надежда была на то что при обнаружении кветового объекта сам игрок начнёт кастовать (так я хотел проверить возможность реагирования спеллом на персонажа с квестом)


Код
if (index == GAMEOBJECT_DYN_FLAGS)
                {
                    if (IsActivateToQuest)
                    {
                        switch (((GameObject*)this)->GetGoType())
                        {
                        case GAMEOBJECT_TYPE_CHEST:
                        case GAMEOBJECT_TYPE_GOOBER:
                            *data << uint16(GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE);  <---------------- ВОТ ОНО
                            target->CastSpell(target, 12257, false);  // target объявлен в viod как Player* target <----------- не прокатило
                            *data << uint16(-1);
                            break;
                        default:
                            *data << uint32(0);         // unknown, not happen.
                            break;
                        }
                    }
                    else
                        *data << uint32(0);                 // disable quest object
                }
                else
                    *data << m_uint32Values[ index ];       // other cases


Код

void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* updateMask, Player* target) const
Если помог, ставь плюсик в репу :)

Сообщение # 26 отредактировано Stormtrooper - Четверг, 01.09.2016, 11:00
Ranege
Чемпион
Класс Gameobject не является наследником Unit, насколько мне известно, поэтому не обладает его методами, у класса есть свои методы и методы его предка.

Цитата
Пробовал сделать так (чисто ради теста) - получил краш :(
Надежда была на то что при обнаружении кветового объекта сам игрок начнёт кастовать (так я хотел проверить возможность реагирования спеллом на персонажа с квестом)


У класса есть метод CastSpell с двумя параметрами, на кого каст(Unit*) и ID спела(это на 3.3.5, за 2.4.3 не смотрел, не знаю). Объект возможно сам не себя ничего кастовать не может, но можно же поставить в объект, к примеру, невидимого нпц и бафать на него ауру.

Добавлено (01.09.2016, 15:50)
---------------------------------------------
Если тебя не понимает один человек, возможно он тугой, но если тебя будут не понимать много людей, то значит ты не достаточно объясняешь или не так выражаешься в чём-то.

По поводу темы - даже если ты влепишь туда что-то, какой-то каст, ауру или ещё что-то какими-то "заумными" способами, то это будут видеть, я так понимаю, все игроки, а не те, у кого есть квест, т.к ты просто повесишь ауру и всё. Тот же принцип с невидимым нпц, повесить на него ауру, которую ты хочешь. Ты бы сказал - а как сделать, чтобы видели его или ауру только те, у кого есть кв? Типа плохой подход, но такой же и плохой подход будет если ты заменишь 
   

Цитата
*data << uint16(GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE);  <---------------- ВОТ ОНО
вот это на что-то своё, видеть это будут все. Как сделать, чтобы видели только некоторые? Делать как сделано в самом ядре, отправлять данные в клиент, но клиент понимает только то, что в нём есть, красное сияние или ещё какое-то не будет чтобы ты туда не отправил(если его нету в клиенте, оно никак не появится). Или делать какие-то хардкорные системы, чтобы один видел, другой нет, но для этого проект надо очень сильно разобрать, чтобы разбираться во всём этом.

ВВозможно в чём-то я и ошибаюсь, но это сугубо моё мнение судя по личному опыту
Сообщение # 27 написано 01.09.2016 в 15:50
Incorrect
Капрал
Цитата Stormtrooper ()
изменить МОЖНО так как есть в ядре место которое отвечает за это и я привёл это место в комментариях - GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle
Так вот если убрать это из кода ядра то сияние пропадёт - а значит и заменить его можно - вопрос КАК

Цитата Incorrect ()
Сервер лишь передает клиенту данные нужно или нет подсвечивать объект.




Еще раз объясняю, более доступно:

Нужно ли подсвечивать объект - решает сервер.
Как именно его подсвечивать - решает клиент.

Это дефолтная механика работы этой системы у близзов.

Для того чтобы заменить сияние (с учетом того, что объекты НЕ МОГУТ кастовать спеллы и быть таргетом аур), тебе нужно спавнить триггерного невидимого НПЦ с нужной аурой, и решить вопрос с тем, чтобы этот триггер был "видим" только для нужных игроков. Реализовать это несомненно можно, и я перечислил это в своих вариантах решения проблемы в предыдущем посте. Но это вопрос не из разряда "поменять одну строчку / добавить каст", поэтому без глубокого понимания взаимодействия клиента и сервера (у вас его, я так понял, нет) лучше не тратить свое время.

P.S Ни в коем случае не удаляйте указанную Вами строку


Код
*data << uint16(GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE);

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

Лучше заменить ее на:


Код
*data << uint16(0);

Если хотите убрать отправку этих данных клиенту.
Сообщение # 28 отредактировано Incorrect - Пятница, 02.09.2016, 04:45
  • Страница 1 из 1
  • 1
Поиск: