Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Баг-репорты (http://mangos.ytdb.ru/forumdisplay.php?f=27)
-   -   Реагенты триггерных спеллов (http://mangos.ytdb.ru/showthread.php?t=4020)

virusav 30.03.2011 23:21

Реагенты триггерных спеллов
 
Есть спелл 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 может забрать реагенты у кастера?

rsa 01.04.2011 07:45

Надо в конце-концов что-то делать с таргетом 25. Если в 40958 оригиналкастером будет игрок, то и реагенты заберутся правильно...
Кста, что-то я в ДБЦ никакого требования реагентов на 40962 не вижу. Следовательно все равно надо хакать.

virusav 01.04.2011 10:05

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

Какие еще варианты?

rsa 01.04.2011 12:36

ни в 40962 ни в его триггерных ингридиенты не забираются. так что сначала выясните кто же у вас их забирает, тогда будет ясно что делать :)

virusav 01.04.2011 13:09

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

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

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

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

MaS0n 01.04.2011 20:57

Не пробовал

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


Для триггерных спеллов вроде не берутся реагенты

virusav 02.04.2011 00:07

Недавно был коммит, где триггерный спелл забирал реагенты, ссылка в первом посте, но не прокатило.
Если не прокатит с true, то тогда буду пробовать с false, но не уверен, что так должно быть в случае каста триггероного спелла.

rsa 02.04.2011 13:31

Цитата:

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

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

вывод - реагенты забирает госсип при успешном касте спелла. осталось только выяснить, почему каст 40962 считается успешным, а предыдущего по цепочке - нет. все остальное трогать не надо, уже работает.

virusav 06.04.2011 17:29

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

Спелл 40962 требует итемы, это можно увидеть в обновленном спеллворке:
Reagents: 32569x35

virusav 26.05.2011 10:51

У спелла 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 каст всегда идет тартетом на себя, а не кастером на таргет?

rsa 26.05.2011 12:01

1. почти наверняка ничем. там где могут быть проблемы, этот аргумент не используется.
2. цели должны выбираться по дбц, так что там в общем достаточно все равно кто на что кастит. так просто меньше проблем с обходом избыточных ограничений в CheckCast

virusav 26.05.2011 12:34

Раз уж речь о триггерных спеллах: 47722 триггерит 47724, у которого SPELL_EFFECT_SCRIPT_EFFECT=каст 50239 на себя (создание итема).
Определенное время назад в конечном итоге у игрока в инвентаре оказывался итем после каста 50239.
После какого-то коммита целью 50239 является нпц, на которого идет каст 47722.

virusav 27.06.2011 23:28

Проблему решил таким образом:
Код:

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);

Для триггерных спеллов как раз и применяется такой прием, т.к. именно при таком касте реагенты забираются.

Только все равно интересно, почему кастует именно таргет на таргет, а не кастер на таргет.:)

Vladimir 28.06.2011 14:55

Поправлено в [11693]. Спасибо.

virusav 28.06.2011 20:54

Все-таки остался открытым вопрос о том, что триггерный спелл кастует таргет, а не кастер.
Код:

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);
?

rsa 28.06.2011 21:28

ну например в вышеприведенном 47724 игрок вместе с итемом получит еще и EFFECT_INSTAKILL :) здесь в общем не совсем о том разговор, цепочка кривостей начинается с 47722, который должен каститься явно в обратном направлении. как я уже не раз писал, таргет 25 - совсем не то что у нас сейчас имеется, а скорее нечто вроде SCRIPT_TARGET, сильно зависящий от условий каста.

virusav 28.06.2011 22:32

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


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

ru-mangos.ru - Русское сообщество MaNGOS