aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorkaelima <kaelima@live.se>2011-04-17 16:37:10 +0300
committerShocker <shocker@freakz.ro>2011-04-17 16:44:45 +0300
commit6ad2278ff59cbfa6ff37dcf697123e8f0c2012a1 (patch)
treed0b3adaa7ec5138a69c9be59cd5647535d9140e0 /src/server
parent19721514c3899153f6c58b234b4ba8e85d906b05 (diff)
Core/Spells: Move cloning spells to SpellScript
Diffstat (limited to 'src/server')
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp45
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp141
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();
}