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/scripts/Spells | |
| parent | 19721514c3899153f6c58b234b4ba8e85d906b05 (diff) | |
Core/Spells: Move cloning spells to SpellScript
Diffstat (limited to 'src/server/scripts/Spells')
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 141 | 
1 files changed, 141 insertions, 0 deletions
| 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();  } | 
