Показать сообщение отдельно
Старый 28.05.2010, 13:59   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию [patch/dev] Heart of the Phoenix (Сердце Феникса)

Суть проблемы:
1) спел кастуется даже если пет живой, такого быть не должно
2) спел не кастуется когда пет мертв
3) спел не вызывает второй эффект, который как раз и должен воскрешать
4) эффект SPELL_EFFECT_SUMMON_DEAD_PET с режимом TARGET_DUELVSPLAYER_COORDINATES имеет проблему с неверной выборкой цели. Возможно её нужно задавать принудительно, где именно пока я не разобрался. Эта проблема не актуальна если всё таки окажеться что верный вариант патча Часть 2 вариант Б.
5) панель мертвого пета полностью заблокирована что препятствует использованию спонобности, я пока не отследил откуда это :/ может быть SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); так влияет

Часть 1. Реализация необходимого нам флага
Код:
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 5b105ee..a8c8a7a 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -5317,9 +5317,12 @@ SpellCastResult Spell::CheckCast(bool strict)
 
 SpellCastResult Spell::CheckPetCast(Unit* target)
 {
-    if(!m_caster->isAlive())
+    if(!m_caster->isAlive() && !(m_spellInfo->Attributes & SPELL_ATTR_CASTABLE_WHILE_DEAD))
         return SPELL_FAILED_CASTER_DEAD;
 
+    if (m_caster->isAlive() && (m_spellInfo->Attributes & SPELL_ATTR_CASTABLE_WHILE_DEAD))
+        return SPELL_FAILED_TARGET_NOT_DEAD;
+
     if(m_caster->IsNonMeleeSpellCasted(false))              //prevent spellcast interruption by another spellcast
         return SPELL_FAILED_SPELL_IN_PROGRESS;
     if(m_caster->isInCombat() && IsNonCombatSpell(m_spellInfo))
Часть 2. Реализация эффекта
Код:
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 4ef16e1..d7ddd91 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -6362,6 +6364,14 @@ void Spell::EffectScriptEffect(SpellEffectIndex eff_idx)
                     unitTarget->CastSpell(unitTarget, 62305, true);
                     return;
                 }
+                case 55709:                                 // Heart of the Phoenix
+                {
+                    if (!unitTarget && unitTarget->isAlive())
+                        return;
+
+                    unitTarget->CastSpell(unitTarget, 54114, true);
+                    return;
+                }
                 default:
                     break;
             }
Как я уже говорил - проблема патча в П4 (пункт 4). Кто поможет?

Возможно это неверная реализация, например я незнаю кто же всё таки должен кастовать способность - хозяин или пет сам на себя? Получается какой-то бред если хозяин, т.к. появляется полоска каста, которую может заменить любой другой кастуемый спел. Зато в этом случае надобность вправлять П4 (пункт 4) отпадает

Часть 2 вариант Б. Колдуем от лица самого охотника
Код:
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 9c8373f..955f8de 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -6395,6 +6395,18 @@ void Spell::EffectScriptEffect(SpellEffectIndex eff_idx)
                     unitTarget->CastSpell(unitTarget, 62305, true);
                     return;
                 }
+                case 55709:                                 // Heart of the Phoenix
+                {
+                    if (!unitTarget)
+                        return;
+
+                    Unit *owner = unitTarget->GetOwner();
+                    if (!owner)
+                        return;
+
+                    owner->CastSpell(owner, 54114, true);
+                    return;
+                }
                 default:
                     break;
             }
Может есть какой-то флаг скрывающий отображение полоски каста и предотвращающий замену кастуемого заклинания другим?

Последний раз редактировалось Insider42; 28.05.2010 в 14:14.
Insider42 вне форума   Ответить с цитированием