aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/scripts/world_scripts_full.sql12
-rw-r--r--sql/updates/world/2011_04_17_03_world_spell_script_names.sql14
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp45
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp141
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();
}