|
|
Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help Сияние квестовых объектов и персонажей (C++) |
Сияние квестовых объектов и персонажей |
Привет всем
Есть вопросик - подскажите пожалуйста, где в ядре прописано сияние квестовых объектов и персов? Имеется ввиду сияние предметов и персонажей когда у игрока взят квест в котором они задействованы
Если помог, ставь плюсик в репу :)
Сообщение # 1 написано 07.07.2016 в 21:20
|
Нет не про знаки вопроса
Например ты взял квест где надо собирать валяющие на земле предметы - и вот эти предметы подсвечиваются золотистой аурой (на Дреноре) или сияющими звёздочками на БК
Если помог, ставь плюсик в репу :)
Сообщение # 3 написано 08.07.2016 в 11:33
|
На самом деле все довольно просто, и не какой патч не нужен.
Шаг 1: Создать обьект (gameobject_template) и в колонке QuestItem1 поставить ид вашего итема который будет падать при луте обьекта. Шаг 2: Все еще в gameobject_template в data0 поставить 57 а в data1 поставить ид лута. Шаг 3: Создать сам итем и в табличке class поставить 12. Шаг 4: Создать сам квест в котором нужно будет собрать итем(указаный в шаг 3). Думаю что все это хватит для того чтобы при обьект блестел при взятие квеста.
Сообщение # 6 написано 20.08.2016 в 12:32
|
r0m1ntik, позвольте поинтересоваться К ЧЕМУ вы это написали?
Я спросил как ИЗМЕНИТЬ СИЯНИЕ а не как добавить квест со сбором лута с ГО Сейчас при взятии квеста в котором есть взаимодействие с ГО, вокруг этого ГО появляются звёздочки - так вот я хочу чтобы вместо звёздочек появлялся например столб света - ну это так к примеру
Если помог, ставь плюсик в репу :)
Сообщение # 7 написано 20.08.2016 в 15:35
|
Варианты решения:
Простой: заменить анимацию патчем в клиент. Сложный: пойти в код Файл 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
|
Обожаю такие советы
Как я уже сказал выше - флаг я нашёл и знаю где он используется - но в этом разделе невозможно заменить этот флаг на кастование спелла Если бы это было так просто я бы не спрашивал
Если помог, ставь плюсик в репу :)
Сообщение # 11 написано 22.08.2016 в 09:05
|
Сообщение # 12 написано 22.08.2016 в 14:39
|
Проверка на то, что у нас есть конкретный таргет и у него есть нужный квест. Посредством самой трини -
Код if (dynFlags & GO_DYNFLAG_LO_SPARKLE) А дальше плаваем как хотим - Хотим, вызываем тригер и делаем нашего человека в одной фазе с этим триггером, это из простой схемы. Не лень копаться - работаем с глобальными worldobject, переводя уровни видимости на нужные нам. Да, ядро придется покопать, но что поделать? Если не хочется сильно замарачиваться, советую на тригер наложить owner гуид именно таргета. Тогда он всегда видим будет для персонажа... |
Stormtrooper, в БК не знаю, в лк за анимацию у лута, квестовых го и контейнеров отвечает Particle\Lootfx.m2
Соответсветнно чтобы ее изменить, нужно делать патч в клиент, который будет содержать анимированную модель с этим именем. Вот например так: |
Как я уже писал выше - в данном случае не нужно писать патч
Я знаю что и где отвечает за сияние но я не могу заставить объект кастовать что-то другое В БК нет фазирования вообще и в БК объекты не умели использовать CastSpell и DoCast Использование триггера не реально так как сияние должен видеть только игрок имеющий квест но если сделать как вы предлагаете то триггер будет появляться и видеть его будут все если рядом есть игрок с квестом кроме того как сделать так чтобы он пропадал а не торчал бесконечно или не вызывался каждый раз как будет подходить игрок с квестом? Вобщем вопросов слишком много при использовании триггера
Если помог, ставь плюсик в репу :)
Сообщение # 18 написано 23.08.2016 в 09:14
|
Ага, а невидимости мага тоже не было. Использование триггера не реально так как сияние должен видеть только игрок имеющий квест но если сделать как вы предлагаете то триггер будет появляться и видеть его будут все если рядом есть игрок с квестом Перечитай сообщение. Укажи область видимости. Не можешь - забей тогда. кроме того как сделать так чтобы он пропадал а не торчал бесконечно или не вызывался каждый раз как будет подходить игрок с квестом? Наверное, любой вариант отловли нужного кричера зависимого от игрока? Добавлено (23.08.2016, 12:44) Я знаю что и где отвечает за сияние но я не могу заставить объект кастовать что-то другое Добавлено (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
|
Во-первых вы тупо повторили то что уже сказано а во-вторых вы не читали мои комментарии - изменить МОЖНО так как есть в ядре место которое отвечает за это и я привёл это место в комментариях - GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle
Так вот если убрать это из кода ядра то сияние пропадёт - а значит и заменить его можно - вопрос КАК
Если помог, ставь плюсик в репу :)
Сообщение # 23 написано 31.08.2016 в 11:00
|
С чего Вы так уверенно говорите МОЖНО? Не думали о том, что отправляется некий пакет, как сигнал клиенту и объект начинает сиять и допустим в клиенте есть только одно такое место, которое принимает это и другого может не быть?
Сообщение # 24 написано 31.08.2016 в 12:17
|
изменить МОЖНО так как есть в ядре место которое отвечает за это и я привёл это место в комментариях - GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle Ты передаешь клиенту dynFlags в отдельном пакете. Отдельный бит там - наличие флага "сияния". То есть клиент САМ подсвечивает. Без сервера. Сервер никак на это не влияет. То есть абсолютно. Он говорит клиенту: Слышь, братишь, я тебе завернул в пакет флаг GO_DYNFLAG_LO_SPARKLE, будь добр, подсвети объектик у себя на стороне. Клиент: Да не вопрос! (Ушел обрабатывать сияние)
Сообщение # 25 написано 31.08.2016 в 12:42
|
Ребят ну вы поражаете меня - пространственное мышление ну просто по нулям
Вот кусок кода который ТОЧНО отвечает за появление сияния: Код 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
Если помог, ставь плюсик в репу :)
|
Класс 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
|
изменить МОЖНО так как есть в ядре место которое отвечает за это и я привёл это место в комментариях - GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle Так вот если убрать это из кода ядра то сияние пропадёт - а значит и заменить его можно - вопрос КАК Еще раз объясняю, более доступно: Нужно ли подсвечивать объект - решает сервер. Как именно его подсвечивать - решает клиент. Это дефолтная механика работы этой системы у близзов. Для того чтобы заменить сияние (с учетом того, что объекты НЕ МОГУТ кастовать спеллы и быть таргетом аур), тебе нужно спавнить триггерного невидимого НПЦ с нужной аурой, и решить вопрос с тем, чтобы этот триггер был "видим" только для нужных игроков. Реализовать это несомненно можно, и я перечислил это в своих вариантах решения проблемы в предыдущем посте. Но это вопрос не из разряда "поменять одну строчку / добавить каст", поэтому без глубокого понимания взаимодействия клиента и сервера (у вас его, я так понял, нет) лучше не тратить свое время. P.S Ни в коем случае не удаляйте указанную Вами строку Код *data << uint16(GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE); Этим Вы серьезно нарушаете структуру отправляемого клиенту пакета. Последствия могут быть не заметны сразу, но они обязательно будут и возможно будут катастрофическими. Лучше заменить ее на: Код *data << uint16(0); Если хотите убрать отправку этих данных клиенту. |
| |||
| |||