Залить в базу :
Code
DELETE FROM spell_script_names WHERE spell_id=-47540 AND ScriptName='spell_pri_penance';
DELETE FROM spell_script_names WHERE spell_id=53005 AND ScriptName='spell_pri_penance';
DELETE FROM spell_script_names WHERE spell_id=53006 AND ScriptName='spell_pri_penance';
DELETE FROM spell_script_names WHERE spell_id=53007 AND ScriptName='spell_pri_penance';
INSERT INTO spell_script_names (spell_id, ScriptName) VALUES
(-47540,'spell_pri_penance'),
(53005,'spell_pri_penance'),
(53006,'spell_pri_penance'),
(53007,'spell_pri_penance');
Код:
Code
diff -ur a/spell_priest.cpp b/spell_priest.cpp
--- a/spell_priest.cpp 2010-08-13 12:24:45.000000000 +0400
+++ b/spell_priest.cpp 2010-08-13 12:13:14.000000000 +0400
@@ -29,6 +29,16 @@
PRIEST_SPELL_PENANCE_R1 = 47540,
PRIEST_SPELL_PENANCE_R1_DAMAGE = 47758,
PRIEST_SPELL_PENANCE_R1_HEAL = 47757,
+ PRIEST_SPELL_PENANCE_R2 = 53005,
+ PRIEST_SPELL_PENANCE_R2_DAMAGE = 53001,
+ PRIEST_SPELL_PENANCE_R2_HEAL = 52986,
+ PRIEST_SPELL_PENANCE_R3 = 53006,
+ PRIEST_SPELL_PENANCE_R3_DAMAGE = 53002,
+ PRIEST_SPELL_PENANCE_R3_HEAL = 52987,
+ PRIEST_SPELL_PENANCE_R4 = 53007,
+ PRIEST_SPELL_PENANCE_R4_DAMAGE = 53003,
+ PRIEST_SPELL_PENANCE_R4_HEAL = 52988,
+
};
class spell_pri_pain_and_suffering_proc : public SpellHandlerScript
@@ -68,36 +78,76 @@
{
bool Validate(SpellEntry const * spellEntry)
{
- if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R1))
- return false;
- // can't use other spell than this penance due to spell_ranks dependency
- if (sSpellMgr.GetFirstSpellInChain(PRIEST_SPELL_PENANCE_R1) != sSpellMgr.GetFirstSpellInChain(spellEntry->Id))
- return false;
-
- uint8 rank = sSpellMgr.GetSpellRank(spellEntry->Id);
- if (!sSpellMgr.GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_DAMAGE, rank, true))
- return false;
- if (!sSpellMgr.GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_HEAL, rank, true))
- return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R1))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R1_DAMAGE))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R1_HEAL))
+ return false;
+
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R2))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R2_DAMAGE))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R2_HEAL))
+ return false;
+
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R3))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R3_DAMAGE))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R3_HEAL))
+ return false;
+
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R4))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R4_DAMAGE))
+ return false;
+ if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R4_HEAL))
+ return false;
return true;
}
void HandleDummy(SpellEffIndex effIndex)
{
- Unit *unitTarget = GetHitUnit();
- if (!unitTarget || !unitTarget->isAlive())
- return;
-
- Unit *caster = GetCaster();
-
- uint8 rank = sSpellMgr.GetSpellRank(GetSpellInfo()->Id);
-
- if (caster->IsFriendlyTo(unitTarget))
- caster->CastSpell(unitTarget, sSpellMgr.GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_HEAL, rank), false, 0);
- else
- caster->CastSpell(unitTarget, sSpellMgr.GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_DAMAGE, rank), false, 0);
- }
+ Unit *unitTarget = GetHitUnit();
+ if (!unitTarget || !unitTarget->isAlive())
+ return;
+
+ Unit *caster = GetCaster();
+ SpellEntry const *spellInfo = GetSpellInfo();
+
+ int hurt = 0;
+ int heal = 0;
+ switch(spellInfo->Id)
+ {
+ case PRIEST_SPELL_PENANCE_R1:
+ hurt = PRIEST_SPELL_PENANCE_R1_DAMAGE;
+ heal = PRIEST_SPELL_PENANCE_R1_HEAL;
+ break;
+ case PRIEST_SPELL_PENANCE_R2:
+ hurt = PRIEST_SPELL_PENANCE_R2_DAMAGE;
+ heal = PRIEST_SPELL_PENANCE_R2_HEAL;
+ break;
+ case PRIEST_SPELL_PENANCE_R3:
+ hurt = PRIEST_SPELL_PENANCE_R3_DAMAGE;
+ heal = PRIEST_SPELL_PENANCE_R3_HEAL;
+ break;
+ case PRIEST_SPELL_PENANCE_R4:
+ hurt = PRIEST_SPELL_PENANCE_R4_DAMAGE;
+ heal = PRIEST_SPELL_PENANCE_R4_HEAL;
+ break;
+ default:
+ sLog.outError("spell_pri_penance_SpellScript::HandleDummy: Spell %u Penance need set correct heal/damage spell", spellInfo->Id);
+ return;
+ }
+
+ if (caster->IsFriendlyTo(unitTarget))
+ caster->CastSpell(unitTarget, heal, false, 0);
+ else
+ caster->CastSpell(unitTarget, hurt, false, 0);
+ }
void Register()
{
penance_all_ranks_patch.diff
penance_all_ranks_fix.sql