Core/Spells: Move cloning spells to SpellScript

This commit is contained in:
kaelima
2011-04-17 16:37:10 +03:00
committed by Shocker
parent 19721514c3
commit 6ad2278ff5
4 changed files with 167 additions and 45 deletions

View File

@@ -1885,6 +1885,18 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
( 61177, 'spell_gen_profession_research'),
( 61288, 'spell_gen_profession_research'),
( 61756, 'spell_gen_profession_research'),
( 45785, 'spell_generic_clone'),
( 49889, 'spell_generic_clone'),
( 50218, 'spell_generic_clone'),
( 51719, 'spell_generic_clone'),
( 57528, 'spell_generic_clone'),
( 69828, 'spell_generic_clone'),
( 41055, 'spell_generic_clone_weapon'),
( 63416, 'spell_generic_clone_weapon'),
( 69891, 'spell_generic_clone_weapon'),
( 45206, 'spell_generic_clone_weapon'),
( 69892, 'spell_generic_clone_weapon'),
( 57593, 'spell_generic_clone_weapon'),
-- instances
-- Black Temple
( 41475, 'spell_boss_lady_malande_shield'),

View File

@@ -0,0 +1,14 @@
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_generic_clone', 'spell_generic_clone_weapon');
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(45785, 'spell_generic_clone'),
(49889, 'spell_generic_clone'),
(50218, 'spell_generic_clone'),
(51719, 'spell_generic_clone'),
(57528, 'spell_generic_clone'),
(69828, 'spell_generic_clone'),
(41055, 'spell_generic_clone_weapon'),
(63416, 'spell_generic_clone_weapon'),
(69891, 'spell_generic_clone_weapon'),
(45206, 'spell_generic_clone_weapon'),
(69892, 'spell_generic_clone_weapon'),
(57593, 'spell_generic_clone_weapon');

View File

@@ -4402,53 +4402,8 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
return;
}
case 45204: // Clone Me!
case 45785: // Sinister Reflection Clone
case 49889: // Mystery of the Infinite: Future You's Mirror Image Aura
case 50218: // The Cleansing: Your Inner Turmoil's Mirror Image Aura
case 51719: // Altar of Quetz'lun: Material You's Mirror Image Aura
case 57528: // Nightmare Figment Mirror Image
case 69828: // Halls of Reflection Clone
m_caster->CastSpell(unitTarget, damage, true);
break;
case 41055: // Copy Weapon
case 63416:
case 69891:
m_caster->CastSpell(unitTarget, damage, true);
if (unitTarget->GetTypeId() == TYPEID_PLAYER)
break;
if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
if (Item * mainItem = m_caster->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))
unitTarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, mainItem->GetEntry());
}
else
unitTarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, m_caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID));
break;
case 45206: // Copy Off-hand Weapon
case 69892:
m_caster->CastSpell(unitTarget, damage, true);
if (unitTarget->GetTypeId() == TYPEID_PLAYER)
break;
if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
if (Item * offItem = m_caster->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
unitTarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, offItem->GetEntry());
}
else
unitTarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, m_caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1));
break;
case 57593: // Copy Ranged Weapon
m_caster->CastSpell(unitTarget, damage, true);
if (unitTarget->GetTypeId() == TYPEID_PLAYER)
break;
if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
if (Item * rangedItem = m_caster->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED))
unitTarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, rangedItem->GetEntry());
}
else
unitTarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, m_caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2));
break;
case 55693: // Remove Collapsing Cave Aura
if (!unitTarget)
return;

View File

@@ -799,6 +799,145 @@ class spell_gen_profession_research : public SpellScriptLoader
}
};
class spell_generic_clone : public SpellScriptLoader
{
public:
spell_generic_clone() : SpellScriptLoader("spell_generic_clone") { }
class spell_generic_clone_SpellScript : public SpellScript
{
PrepareSpellScript(spell_generic_clone_SpellScript);
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
Unit* caster = GetCaster();
uint32 spellId = uint32(SpellMgr::CalculateSpellEffectAmount(GetSpellInfo(), effIndex));
if (Unit* target = GetHitUnit())
target->CastSpell(caster, spellId, true);
}
void Register()
{
OnEffect += SpellEffectFn(spell_generic_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
OnEffect += SpellEffectFn(spell_generic_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_generic_clone_SpellScript();
}
};
enum CloneWeaponSpells
{
SPELL_COPY_WEAPON = 41055,
SPELL_COPY_WEAPON_2 = 63416,
SPELL_COPY_WEAPON_3 = 69891,
SPELL_COPY_OFFHAND = 45206,
SPELL_COPY_OFFHAND_2 = 69892,
SPELL_COPY_RANGED = 57593
};
class spell_generic_clone_weapon : public SpellScriptLoader
{
public:
spell_generic_clone_weapon() : SpellScriptLoader("spell_generic_clone_weapon") { }
class spell_generic_clone_weapon_SpellScript : public SpellScript
{
PrepareSpellScript(spell_generic_clone_weapon_SpellScript);
bool Validate(SpellEntry const* /*spellEntry*/)
{
if (!sSpellStore.LookupEntry(SPELL_COPY_WEAPON))
return false;
if (!sSpellStore.LookupEntry(SPELL_COPY_WEAPON_2))
return false;
if (!sSpellStore.LookupEntry(SPELL_COPY_WEAPON_3))
return false;
if (!sSpellStore.LookupEntry(SPELL_COPY_OFFHAND))
return false;
if (!sSpellStore.LookupEntry(SPELL_COPY_OFFHAND_2))
return false;
if (!sSpellStore.LookupEntry(SPELL_COPY_RANGED))
return false;
return true;
}
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
Unit* caster = GetCaster();
Unit* target = GetHitUnit();
if (!target)
return;
uint32 spellId = uint32(SpellMgr::CalculateSpellEffectAmount(GetSpellInfo(), EFFECT_0));
target->CastSpell(caster, spellId, true);
if (target->GetTypeId() == TYPEID_PLAYER)
return;
switch (GetSpellInfo()->Id)
{
case SPELL_COPY_WEAPON:
case SPELL_COPY_WEAPON_2:
case SPELL_COPY_WEAPON_3:
{
if (Player* plrCaster = caster->ToPlayer())
{
if (Item* mainItem = plrCaster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))
target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, mainItem->GetEntry());
}
else
target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID));
break;
}
case SPELL_COPY_OFFHAND:
case SPELL_COPY_OFFHAND_2:
{
if (Player* plrCaster = caster->ToPlayer())
{
if (Item* offItem = plrCaster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, offItem->GetEntry());
}
else
target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1));
break;
}
case SPELL_COPY_RANGED:
{
if (Player* plrCaster = caster->ToPlayer())
{
if (Item* rangedItem = plrCaster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED))
target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, rangedItem->GetEntry());
}
else
target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2));
break;
}
default:
break;
}
}
void Register()
{
OnEffect += SpellEffectFn(spell_generic_clone_weapon_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_generic_clone_weapon_SpellScript();
}
};
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -819,4 +958,6 @@ void AddSC_generic_spell_scripts()
new spell_gen_gunship_portal();
new spell_gen_dungeon_credit();
new spell_gen_profession_research();
new spell_generic_clone();
new spell_generic_clone_weapon();
}