diff options
| author | kaelima <kaelima@live.se> | 2011-04-17 16:37:10 +0300 |
|---|---|---|
| committer | Shocker <shocker@freakz.ro> | 2011-04-17 16:44:45 +0300 |
| commit | 6ad2278ff59cbfa6ff37dcf697123e8f0c2012a1 (patch) | |
| tree | d0b3adaa7ec5138a69c9be59cd5647535d9140e0 /src/server | |
| parent | 19721514c3899153f6c58b234b4ba8e85d906b05 (diff) | |
Core/Spells: Move cloning spells to SpellScript
Diffstat (limited to 'src/server')
| -rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 45 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 141 |
2 files changed, 141 insertions, 45 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 7569d68c5eb..507f974e2c8 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -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; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 63df688b92f..4ddb39bbebf 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -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(); } |
