diff --git a/src/game/Object/SpellMgr.cpp b/src/game/Object/SpellMgr.cpp index 6d74e950..c857275e 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: @@ -1993,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 53f617f7..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())) @@ -1183,6 +1185,8 @@ void Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool isReflected) case 9901: case 8955: case 2908: + // Gnomish Mind Control Cap + case 13180: break; default: { @@ -3973,7 +3977,20 @@ 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; + + // 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 } } @@ -4258,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/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..4df441ac 100644 --- a/src/game/WorldHandlers/SpellEffects.cpp +++ b/src/game/WorldHandlers/SpellEffects.cpp @@ -508,6 +508,70 @@ 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) + { 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 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) @@ -742,7 +806,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