diff options
-rw-r--r-- | sql/updates/4401_world_spell_proc_event.sql | 2 | ||||
-rw-r--r-- | src/game/Spell.cpp | 23 | ||||
-rw-r--r-- | src/game/Unit.cpp | 10 |
3 files changed, 24 insertions, 11 deletions
diff --git a/sql/updates/4401_world_spell_proc_event.sql b/sql/updates/4401_world_spell_proc_event.sql index 834c39d0c82..c2f993e6eb2 100644 --- a/sql/updates/4401_world_spell_proc_event.sql +++ b/sql/updates/4401_world_spell_proc_event.sql @@ -1,4 +1,4 @@ -DELETE FROM `spell_proc_event` WHERE `entry` IN (49223, 49599); +DELETE FROM `spell_proc_event` WHERE `entry` IN (49223, 49599,49188 , 56822, 59057, 55666, 55667, 55668, 55669, 55670, 58616); INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES ( 49223, 0x00, 15, 0x00000011, 0x08020000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Dirge ( 49599, 0x00, 15, 0x00000011, 0x08020000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Dirge diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index e5c0550d239..610e6af6b06 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4998,17 +4998,22 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_ALREADY_HAVE_CHARM; } - Unit *target = m_targets.getUnitTarget(); - if(!target || target->GetTypeId() == TYPEID_UNIT - && ((Creature*)target)->isVehicle()) - return SPELL_FAILED_BAD_IMPLICIT_TARGETS; + // Skip TARGET_UNIT_PET - pet is always valid + if (m_spellInfo->EffectImplicitTargetA[i] != TARGET_UNIT_PET + && m_spellInfo->EffectImplicitTargetB[i] != TARGET_UNIT_PET) + { + Unit *target = m_targets.getUnitTarget(); + if(!target || target->GetTypeId() == TYPEID_UNIT + && ((Creature*)target)->isVehicle()) + return SPELL_FAILED_BAD_IMPLICIT_TARGETS; - if(target->GetCharmerGUID()) - return SPELL_FAILED_CHARMED; + if(target->GetCharmerGUID()) + return SPELL_FAILED_CHARMED; - int32 damage = CalculateDamage(i, target); - if(damage && int32(target->getLevel()) > damage) - return SPELL_FAILED_HIGHLEVEL; + int32 damage = CalculateDamage(i, target); + if(damage && int32(target->getLevel()) > damage) + return SPELL_FAILED_HIGHLEVEL; + } break; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 3b88fa9c399..d17d536f468 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -14033,6 +14033,10 @@ void Unit::SetCharmedBy(Unit* charmer, CharmType type) if(GetTypeId() == TYPEID_PLAYER && ((Player*)this)->GetTransport()) return; + // Already charmed + if(GetCharmerGUID()) + return; + CastStop(); CombatStop(); //TODO: CombatStop(true) may cause crash (interrupt spells) DeleteThreatList(); @@ -14122,7 +14126,7 @@ void Unit::SetCharmedBy(Unit* charmer, CharmType type) case CHARM_TYPE_CONVERT: break; } - } + } } void Unit::RemoveCharmedBy(Unit *charmer) @@ -14130,6 +14134,10 @@ void Unit::RemoveCharmedBy(Unit *charmer) if(!isCharmed()) return; + // Charm was not set for unit - return + if (charmer && charmer->m_Controlled.find(this) == charmer->m_Controlled.end()) + return; + if(!charmer) charmer = GetCharmer(); else if(charmer != GetCharmer()) // one aura overrides another? |