aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Spell.cpp23
-rw-r--r--src/game/Unit.cpp10
2 files changed, 23 insertions, 10 deletions
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?