diff options
| -rw-r--r-- | sql/scripts/world_scripts_full.sql | 12 | ||||
| -rw-r--r-- | sql/updates/world/2011_04_17_03_world_spell_script_names.sql | 14 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 45 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 141 |
4 files changed, 167 insertions, 45 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql index 4fac2b8b212..ed801b2a860 100644 --- a/sql/scripts/world_scripts_full.sql +++ b/sql/scripts/world_scripts_full.sql @@ -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'), diff --git a/sql/updates/world/2011_04_17_03_world_spell_script_names.sql b/sql/updates/world/2011_04_17_03_world_spell_script_names.sql new file mode 100644 index 00000000000..87d7778b456 --- /dev/null +++ b/sql/updates/world/2011_04_17_03_world_spell_script_names.sql @@ -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'); 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(); } |
