From 4cc0cd2d5169c704d7dfc10007cd903a7a333374 Mon Sep 17 00:00:00 2001 From: H0zen Date: Sun, 7 Feb 2016 03:54:58 +0200 Subject: [PATCH 1/4] Fix Cannibalize - Fixes [issue 911](https://www.getmangos.eu/issue.php?issueid=911) --- src/game/WorldHandlers/Spell.cpp | 6 +++++- src/game/WorldHandlers/SpellAuras.cpp | 5 ----- src/game/WorldHandlers/SpellEffects.cpp | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/game/WorldHandlers/Spell.cpp b/src/game/WorldHandlers/Spell.cpp index 53f617f7..dd8528fc 100644 --- a/src/game/WorldHandlers/Spell.cpp +++ b/src/game/WorldHandlers/Spell.cpp @@ -3973,7 +3973,11 @@ void Spell::CastTriggerSpells() { for (SpellInfoList::const_iterator si = m_TriggerSpells.begin(); si != m_TriggerSpells.end(); ++si) { - Spell* spell = new Spell(m_caster, (*si), true, m_originalCasterGUID); + bool _triggered = true; + if ((*si)->Id == 20578) // Cannibalize healing effect + { _triggered = false; } + + Spell* spell = new Spell(m_caster, (*si), _triggered, m_originalCasterGUID); spell->prepare(&m_targets); // use original spell original targets } } diff --git a/src/game/WorldHandlers/SpellAuras.cpp b/src/game/WorldHandlers/SpellAuras.cpp index 5d65833f..b4b77b78 100644 --- a/src/game/WorldHandlers/SpellAuras.cpp +++ b/src/game/WorldHandlers/SpellAuras.cpp @@ -4751,11 +4751,6 @@ void Aura::PeriodicTick() // eating anim target->HandleEmoteCommand(EMOTE_ONESHOT_EAT); } - else if (GetId() == 20577) - { - // cannibalize anim - target->HandleEmoteCommand(EMOTE_STATE_CANNIBALIZE); - } // Anger Management // amount = 1+ 16 = 17 = 3,4*5 = 10,2*5/3 diff --git a/src/game/WorldHandlers/SpellEffects.cpp b/src/game/WorldHandlers/SpellEffects.cpp index 96d36d61..438e5c7e 100644 --- a/src/game/WorldHandlers/SpellEffects.cpp +++ b/src/game/WorldHandlers/SpellEffects.cpp @@ -742,7 +742,7 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) case 20577: // Cannibalize { if (unitTarget) - { m_caster->CastSpell(m_caster, 20578, true, NULL); } + { AddTriggeredSpell(20578); } return; } case 21147: // Arcane Vacuum From 3cc509f55826635071c595bbcd90968435c353af Mon Sep 17 00:00:00 2001 From: H0zen Date: Sun, 7 Feb 2016 13:47:25 +0200 Subject: [PATCH 2/4] Fix Gnomish Mind control cap - Issue [910](https://www.getmangos.eu/issue.php?issueid=910) --- src/game/WorldHandlers/Spell.cpp | 15 +++++++++++++-- src/game/WorldHandlers/SpellEffects.cpp | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/game/WorldHandlers/Spell.cpp b/src/game/WorldHandlers/Spell.cpp index dd8528fc..f2aa52e3 100644 --- a/src/game/WorldHandlers/Spell.cpp +++ b/src/game/WorldHandlers/Spell.cpp @@ -1183,6 +1183,8 @@ void Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool isReflected) case 9901: case 8955: case 2908: + // Gnomish Mind Control Cap + case 13180: break; default: { @@ -3974,8 +3976,17 @@ void Spell::CastTriggerSpells() for (SpellInfoList::const_iterator si = m_TriggerSpells.begin(); si != m_TriggerSpells.end(); ++si) { bool _triggered = true; - if ((*si)->Id == 20578) // Cannibalize healing effect - { _triggered = false; } + + // ignore triggered status for certain spells + switch ((*si)->Id) + { + case 13181: // Gnomish MC cap + case 20578: // Cannibalize healing effect + _triggered = false; + break; + default: + break; + } Spell* spell = new Spell(m_caster, (*si), _triggered, m_originalCasterGUID); spell->prepare(&m_targets); // use original spell original targets diff --git a/src/game/WorldHandlers/SpellEffects.cpp b/src/game/WorldHandlers/SpellEffects.cpp index 438e5c7e..a72e8d24 100644 --- a/src/game/WorldHandlers/SpellEffects.cpp +++ b/src/game/WorldHandlers/SpellEffects.cpp @@ -508,6 +508,22 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) m_caster->CastSpell(unitTarget, spell_id, true, NULL); return; } + case 13180: // Gnomish mind control cap + { + if (!unitTarget) + { return; } + + uint32 roll = urand(0,99); + + if (roll < 5) // 5% victim MC the caster (off-like chance unknown) + { unitTarget->CastSpell(m_caster, 13181, true, NULL); } + else if (roll < 35) // 30% fail (off-like chance unknown) + { return; } + else // 65% caster MC the victim (off-like chance unknown) + { AddTriggeredSpell(13181); } + + return; + } case 13535: // Tame Beast { if (!m_originalCaster || m_originalCaster->GetTypeId() != TYPEID_PLAYER) From 0fd23fb68066edff06dbabf1a77eeb097b2328c4 Mon Sep 17 00:00:00 2001 From: H0zen Date: Mon, 8 Feb 2016 03:13:48 +0200 Subject: [PATCH 3/4] Fix Gnomish Ray Shrink. - Not all possible side-effects implemented --- src/game/Object/SpellMgr.cpp | 10 +++++++++ src/game/WorldHandlers/SpellEffects.cpp | 30 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/game/Object/SpellMgr.cpp b/src/game/Object/SpellMgr.cpp index 6d74e950..f407ff9f 100644 --- a/src/game/Object/SpellMgr.cpp +++ b/src/game/Object/SpellMgr.cpp @@ -676,6 +676,16 @@ bool IsExplicitNegativeTarget(uint32 targetA) bool IsPositiveEffect(SpellEntry const* spellproto, SpellEffectIndex effIndex) { + //fast returns in some special cases + switch (spellproto->Id) + { + case 13003: + case 13010: + return false; + default: + break; + } + switch (spellproto->Effect[effIndex]) { case SPELL_EFFECT_DUMMY: diff --git a/src/game/WorldHandlers/SpellEffects.cpp b/src/game/WorldHandlers/SpellEffects.cpp index a72e8d24..68ecd3ad 100644 --- a/src/game/WorldHandlers/SpellEffects.cpp +++ b/src/game/WorldHandlers/SpellEffects.cpp @@ -508,6 +508,36 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) m_caster->CastSpell(unitTarget, spell_id, true, NULL); return; } + case 13006: // Gnomish Shrink Ray + { + if (!unitTarget) + { return; } + + uint32 roll = urand(0,99); + uint32 inner_roll = urand(1,3); + + if (roll < 5) // 5% negative backfire + { + switch (inner_roll) + { + case 1: + m_caster->CastSpell(m_caster, 13003, true, m_CastItem); // -250 AP + shrink caster + break; + case 2: + m_caster->CastSpell(m_caster, 13010, true, m_CastItem); // -250AP + shrink all caster's party + break; + default: + unitTarget->CastSpell(unitTarget, 13004, true, NULL); // +250AP + grow victim + break; + } + } + else if (roll < 25) // 20% positive backfire + { m_caster->CastSpell(m_caster, 13004, true, m_CastItem); } // +250AP + grow caster's party + else + { m_caster->CastSpell(unitTarget, 13003, true, m_CastItem); } // -250AP + shrink victim + + return; + } case 13180: // Gnomish mind control cap { if (!unitTarget) From c7f8748e6912695a385c2ec8ed85fcfdf8ccb978 Mon Sep 17 00:00:00 2001 From: H0zen Date: Mon, 8 Feb 2016 17:54:35 +0200 Subject: [PATCH 4/4] Fix Gnomish Death Ray. - The Gnomish Death Ray now properly charges and deals damage. - TODO: more research on dmg/crit/dr --- src/game/Object/SpellMgr.cpp | 4 ++++ src/game/WorldHandlers/Spell.cpp | 8 +++++++- src/game/WorldHandlers/SpellEffects.cpp | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/game/Object/SpellMgr.cpp b/src/game/Object/SpellMgr.cpp index f407ff9f..c857275e 100644 --- a/src/game/Object/SpellMgr.cpp +++ b/src/game/Object/SpellMgr.cpp @@ -2003,6 +2003,10 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2) cons // Allow stack passive and not passive spells if (spellInfo_1->HasAttribute(SPELL_ATTR_PASSIVE) != spellInfo_2->HasAttribute(SPELL_ATTR_PASSIVE)) { return false; } + + // Gnomish Death Ray + if (spellInfo_1->Id == 13278 || spellInfo_2->Id == 13278) + { return false; } // Specific spell family spells switch (spellInfo_1->SpellFamilyName) diff --git a/src/game/WorldHandlers/Spell.cpp b/src/game/WorldHandlers/Spell.cpp index f2aa52e3..b391a455 100644 --- a/src/game/WorldHandlers/Spell.cpp +++ b/src/game/WorldHandlers/Spell.cpp @@ -444,7 +444,9 @@ void Spell::FillTargetMap() { case TARGET_NONE: // Fill Target based on A only // Arcane Missiles have strange targeting for auras - if (m_spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && m_spellInfo->SpellFamilyFlags & UI64LIT(0x00000800)) + // Gnomish Death Ray triggered 13280 + if ((m_spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && m_spellInfo->SpellFamilyFlags & UI64LIT(0x00000800)) || + (m_spellInfo->Id == 13280)) { if (m_caster->GetTypeId() == TYPEID_PLAYER) if (Unit* target = ObjectAccessor::Instance().GetUnit(*m_caster, ((Player*)m_caster)->GetSelectionGuid())) @@ -4273,6 +4275,10 @@ SpellCastResult Spell::CheckCast(bool strict) m_caster == target) { return SPELL_FAILED_BAD_TARGETS; } + // Gnomish Death Ray self cast forbidden + if (m_spellInfo->Id == 13278 && m_caster == target) + { return SPELL_FAILED_BAD_TARGETS; } + m_targets.setUnitTarget(target); } } diff --git a/src/game/WorldHandlers/SpellEffects.cpp b/src/game/WorldHandlers/SpellEffects.cpp index 68ecd3ad..4df441ac 100644 --- a/src/game/WorldHandlers/SpellEffects.cpp +++ b/src/game/WorldHandlers/SpellEffects.cpp @@ -554,6 +554,24 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) return; } + case 13278: // Gnomish Death Ray charging + { + if (unitTarget) + { m_caster->CastSpell(m_caster, 13493, true, NULL); } + + return; + } + case 13280: // Gnomish Death Ray ending charge + { + if (unitTarget) + { + uint32 roll = urand(0,7); + int32 dmg[8] = {900, 1200, 1500, 1800, 2100, 2400, 2700, 3000}; + + m_caster->CastCustomSpell(unitTarget, 13279, &dmg[roll], NULL, NULL, true); + } + return; + } case 13535: // Tame Beast { if (!m_originalCaster || m_originalCaster->GetTypeId() != TYPEID_PLAYER)