diff options
-rw-r--r-- | sql/FULL/world_spell_full.sql | 1 | ||||
-rw-r--r-- | sql/updates/4615_world.sql | 5 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 13 | ||||
-rw-r--r-- | src/game/Unit.cpp | 16 | ||||
-rw-r--r-- | src/game/Unit.h | 1 |
5 files changed, 36 insertions, 0 deletions
diff --git a/sql/FULL/world_spell_full.sql b/sql/FULL/world_spell_full.sql index 85d602ca07f..08ae9073047 100644 --- a/sql/FULL/world_spell_full.sql +++ b/sql/FULL/world_spell_full.sql @@ -71,6 +71,7 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm (48396, 50172, 2, 'Improved Moonkin Form'), ( 20594, 65116, 0, 'Stoneform'), ( 49039, 50397, 2, 'Lichborne - shapeshift'), +( 64382, 64380, 0, 'Shattering Throw'), -- Creature ( 36574, 36650, 0, 'Apply Phase Slip Vulnerability'), diff --git a/sql/updates/4615_world.sql b/sql/updates/4615_world.sql new file mode 100644 index 00000000000..8b5ad1ac379 --- /dev/null +++ b/sql/updates/4615_world.sql @@ -0,0 +1,5 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN(47585, 64382); +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES +( 47585, 60069, 2, 'Dispersion (transform/regen)'), +( 64382, 64380, 0, 'Shattering Throw'), +( 47585, 63230, 2, 'Dispersion (immunity)'); diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index f36d7048efe..25ea3015f41 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -5480,6 +5480,19 @@ void Spell::EffectScriptEffect(uint32 effIndex) } break; } + case SPELLFAMILY_WARRIOR: + { + // Shattering Throw + if ( m_spellInfo->SpellFamilyFlags[1] & 0x1 ) + { + if(!unitTarget) + return; + // remove shields, will still display immune to damage part + unitTarget->RemoveAurasWithMechanic(1<<MECHANIC_IMMUNE_SHIELD); + return; + } + break; + } } // normal DB scripted effect diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 69f42896dbd..2b4c320fbeb 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -553,6 +553,22 @@ void Unit::RemoveAurasWithFamily(uint32 family, uint32 familyFlag1, uint32 famil } } +void Unit::RemoveAurasWithMechanic(uint32 mechanic_mask, uint32 except) +{ + for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end();) + { + if (!except || iter->second->GetId() != except) + { + if(GetAllSpellMechanicMask(iter->second->GetSpellProto()) & mechanic_mask) + { + RemoveAura(iter, AURA_REMOVE_BY_ENEMY_SPELL); + continue; + } + } + ++iter; + } +} + void Unit::UpdateInterruptMask() { m_interruptMask = 0; diff --git a/src/game/Unit.h b/src/game/Unit.h index 6d8f8838cf3..22fe4ccc687 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1450,6 +1450,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except = NULL); void RemoveAurasWithFamily(uint32 family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, uint64 casterGUID); void RemoveMovementImpairingAuras(); + void RemoveAurasWithMechanic(uint32 mechanic_mask, uint32 except=0); void RemoveAllAuras(); void RemoveArenaAuras(bool onleave = false); void RemoveAllAurasOnDeath(); |