Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Баг-репорты

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

Баг-репорты Описываем проблемы и ошибки работы ядра

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

Есть спелл 40958, который триггерит 40962.
Последний спелл требует реагенты, но при касте они не забираются.
Каст 40958 осуществляется госсипом у го.

Написал патч на спелл 40962:
Код:
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index c566fd1..caca0e6 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -1288,6 +1288,22 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx)
                     DoCreateItem(eff_idx, newitemid);
                     return;
                 }
+                case 40962:                                 // Blade's Edge Terrace Demon Boss Summon Branch
+                {
+                    if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
+                        return;
+
+                    uint32 spell_id = 0;
+                    switch (urand(1,4))
+                    {
+                        case 1: spell_id = 40957; break;    // Blade's Edge Terrace Demon Boss Summon 1
+                        case 2: spell_id = 40959; break;    // Blade's Edge Terrace Demon Boss Summon 2
+                        case 3: spell_id = 40960; break;    // Blade's Edge Terrace Demon Boss Summon 3
+                        case 4: spell_id = 40961; break;    // Blade's Edge Terrace Demon Boss Summon 4
+                    }
+                    unitTarget->CastSpell(unitTarget, spell_id, true, NULL, NULL, unitTarget->GetObjectGuid(), m_spellInfo);
+                    return;
+                }
                 case 42287:                                 // Salvage Wreckage
                 {
                     if (m_caster->GetTypeId() != TYPEID_PLAYER)
Сначала использовал m_caster, т.к. по словам НФ это предпочтительнее, если таргет=кастер.
Потом сделал, как в коммите https://github.com/mangos/mangos/com...0122e399ea5d4a

В итоге реагенты так и остались в инвентаре.

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

Надо в конце-концов что-то делать с таргетом 25. Если в 40958 оригиналкастером будет игрок, то и реагенты заберутся правильно...
Кста, что-то я в ДБЦ никакого требования реагентов на 40962 не вижу. Следовательно все равно надо хакать.
rsa вне форума   Ответить с цитированием
Старый 01.04.2011, 10:05   #3
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Если в `gossip_scripts` указать каст спелла 40962, то реагенты забираются, а в случае с 40958 - нет.
Тип каста равен 1, т.к. все остальные варианты дают ошибку в логе.

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

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

Спеллворк не показал требования реагентов.

Решил проверить спеллы 43723 и 43753, при касте которых в конечном итоге реагенты забираются, но в спеллворке не увидел данных по требуемым итемам.

У го есть спеллфокус, у госсипа прописано требование итема в количестве 35 штук.

Если не спелл 40962 забирает реагенты, то кто + в чем тогда разница между кастом спелла напрямую и через основной спелл в таком случае?
virusav вне форума   Ответить с цитированием
Старый 01.04.2011, 20:57   #6
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Не пробовал

unitTarget->CastSpell(unitTarget, spell_id, false, NULL, NULL, unitTarget->GetObjectGuid(), m_spellInfo);


Для триггерных спеллов вроде не берутся реагенты
MaS0n вне форума   Ответить с цитированием
Старый 02.04.2011, 00:07   #7
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

Цитата:
Сообщение от virusav Посмотреть сообщение
У го есть спеллфокус, у госсипа прописано требование итема в количестве 35 штук.

Если не спелл 40962 забирает реагенты, то кто + в чем тогда разница между кастом спелла напрямую и через основной спелл в таком случае?
вывод - реагенты забирает госсип при успешном касте спелла. осталось только выяснить, почему каст 40962 считается успешным, а предыдущего по цепочке - нет. все остальное трогать не надо, уже работает.
rsa вне форума   Ответить с цитированием
Старый 06.04.2011, 17:29   #9
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Если не ошибаюсь, то госсип не может забирать реагенты.

Спелл 40962 требует итемы, это можно увидеть в обновленном спеллворке:
Reagents: 32569x35
virusav вне форума   Ответить с цитированием
Старый 26.05.2011, 10:51   #10
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

У спелла 40958 эффект SPELL_EFFECT_FORCE_CAST.
В Spell::EffectForceCast каст происходит таким образом:
Код:
unitTarget->CastSpell(unitTarget, spellInfo, true, NULL, NULL, m_originalCasterGUID);
Чтобы реагенты триггерных спеллов забирались, нужно (взято и коммита НФ):
Код:
unitTarget->CastSpell(unitTarget, spell_id, true, NULL, NULL, unitTarget->GetObjectGuid(), m_spellInfo)
1. Чем может быть чревата замена каста в Spell::EffectForceCast на:
Код:
unitTarget->CastSpell(unitTarget, spellInfo->Id, true, NULL, NULL, m_originalCasterGUID, spellInfo);
т.е. чтобы реагенты забирались сразу при касте триггерных спеллов?
Возможно, косяк будет, если кастер итем, хз.
2. Почему в Spell::EffectForceCast каст всегда идет тартетом на себя, а не кастером на таргет?
virusav вне форума   Ответить с цитированием
Старый 26.05.2011, 12:01   #11
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

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

Раз уж речь о триггерных спеллах: 47722 триггерит 47724, у которого SPELL_EFFECT_SCRIPT_EFFECT=каст 50239 на себя (создание итема).
Определенное время назад в конечном итоге у игрока в инвентаре оказывался итем после каста 50239.
После какого-то коммита целью 50239 является нпц, на которого идет каст 47722.
virusav вне форума   Ответить с цитированием
Старый 27.06.2011, 23:28   #13
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Проблему решил таким образом:
Код:
void Spell::EffectForceCast(SpellEffectIndex eff_idx)
...
-    unitTarget->CastSpell(unitTarget, spellInfo, true, NULL, NULL, m_originalCasterGUID);
+    unitTarget->CastSpell(unitTarget, spellInfo, true, NULL, NULL, m_originalCasterGUID, m_spellInfo);
Для триггерных спеллов как раз и применяется такой прием, т.к. именно при таком касте реагенты забираются.

Только все равно интересно, почему кастует именно таргет на таргет, а не кастер на таргет.
virusav вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Laise (28.06.2011), Vladimir (28.06.2011)
Старый 28.06.2011, 14:55   #14
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Поправлено в [11693]. Спасибо.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 28.06.2011, 20:54   #15
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Все-таки остался открытым вопрос о том, что триггерный спелл кастует таргет, а не кастер.
Код:
unitTarget->CastSpell(unitTarget, spellInfo, true, NULL, NULL, m_originalCasterGUID, m_spellInfo);
Из-за этого не работают спеллы с:
Код:
Attributes: 0x20000000 (SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY)
TargetAuraState = 13 (AURA_STATE_HEALTHLESS_35_PERCENT)

47679 Blood Draw
47702 Unholy Union
47722 Frost Draw
50251 Blood Draw
Для примера возьмем спелл 47722:
Код:
Effect 0: Id 6 (SPELL_EFFECT_APPLY_AURA)
BasePoints = 1
Targets (25, 0) (TARGET_DUELVSPLAYER, NO_TARGET)
Aura Id 23 (SPELL_AURA_PERIODIC_TRIGGER_SPELL), value = 1, misc = 0 (0), miscB = 0, periodic = 8000
   Trigger spell (47724) Frost Draw. Chance = 101
Сейчас его кастует игрок с помощью итема на нпц, который в итоге кастует триггерный спелл 47724:
Код:
Effect 0: Id 77 (SPELL_EFFECT_SCRIPT_EFFECT)
BasePoints = 50239
Targets (1, 0) (TARGET_SELF, NO_TARGET)

Effect 1: Id 1 (SPELL_EFFECT_INSTAKILL)
BasePoints = 1
Targets (25, 0) (TARGET_DUELVSPLAYER, NO_TARGET)
У 47724 эффект каста спелла 50239, который создает итем, но т.к. кастер нпц, а таргет TARGET_SELF, то игрок ничего не получает.

Если бы триггерные спеллы кастовал не таргет, а кастер, то: игрок кастует 47722, он же кастует 47724 и он же кастует 50239, поэтому получает итем.

Посмотрел выборочно другие спеллы с кастом триггерных спеллов на случай смены кастера, чтобы ничего не поломалось, но проблем не нашел.

Чем чревата замена
Код:
unitTarget->CastSpell(unitTarget, spellInfo, true, NULL, NULL, m_originalCasterGUID, m_spellInfo);
на
Код:
кастер->CastSpell(unitTarget, spellInfo, true, NULL, NULL, m_originalCasterGUID, m_spellInfo);
?
virusav вне форума   Ответить с цитированием
Старый 28.06.2011, 21:28   #16
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

ну например в вышеприведенном 47724 игрок вместе с итемом получит еще и EFFECT_INSTAKILL здесь в общем не совсем о том разговор, цепочка кривостей начинается с 47722, который должен каститься явно в обратном направлении. как я уже не раз писал, таргет 25 - совсем не то что у нас сейчас имеется, а скорее нечто вроде SCRIPT_TARGET, сильно зависящий от условий каста.
rsa вне форума   Ответить с цитированием
Старый 28.06.2011, 22:32   #17
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Насчет 47724 не согласен.
Если кастует игрок, то:
1. SPELL_EFFECT_SCRIPT_EFFECT и TARGET_SELF, т.е. эффект на себя.
2. SPELL_EFFECT_INSTAKILL и TARGET_DUELVSPLAYER, т.е. убить цель, противоположную кастеру, а это нпц, который является таргетом.
virusav вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каст триггерных спеллов virusav Баг-репорты 1 08.12.2010 16:54
Маски спеллов fedr Новичкам 2 13.09.2010 22:42
Обработка эффектов спеллов virusav Баг-репорты 6 27.08.2010 10:50
Каст спеллов объектами virusav Запросы 9 30.05.2010 10:01
Реализация спеллов бомб и т.д frenk Баг-репорты 0 20.03.2010 00:32


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


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