fix(Core/Spells): Mind Control can be dispelled from friendly target. (#9689)

Fixes #9629
This commit is contained in:
UltraNix
2021-12-15 08:29:22 +01:00
committed by GitHub
parent 8490893647
commit 1cc9ea83ab
2 changed files with 36 additions and 5 deletions

View File

@@ -5113,7 +5113,7 @@ void Unit::GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelCharges
if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
dispelMask &= ~(1 << DISPEL_DISEASE);
ReputationRank rank = GetReactionTo(caster);
ReputationRank rank = GetReactionTo(caster, IsCharmed());
bool positive = rank >= REP_FRIENDLY;
// Neutral unit not at war with caster should be treated as a friendly unit
@@ -9514,7 +9514,7 @@ void Unit::SetFaction(uint32 faction)
}
// function based on function Unit::UnitReaction from 13850 client
ReputationRank Unit::GetReactionTo(Unit const* target) const
ReputationRank Unit::GetReactionTo(Unit const* target, bool checkOriginalFaction /*= false*/) const
{
// always friendly to self
if (this == target)
@@ -9596,11 +9596,42 @@ ReputationRank Unit::GetReactionTo(Unit const* target) const
}
ReputationRank repRank = REP_HATED;
if (!sScriptMgr->IfNormalReaction(this, target, repRank))
{
return ReputationRank(repRank);
}
FactionTemplateEntry const* factionTemplateEntry = nullptr;
if (checkOriginalFaction)
{
if (GetTypeId() == TYPEID_PLAYER)
{
if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
{
factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
}
}
else
{
Unit* owner = GetOwner();
if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
{
factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
}
else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
{
factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
}
}
}
if (!factionTemplateEntry)
{
factionTemplateEntry = GetFactionTemplateEntry();
}
// do checks dependant only on our faction
return GetFactionReactionTo(GetFactionTemplateEntry(), target);
return GetFactionReactionTo(factionTemplateEntry, target);
}
ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTemplateEntry, Unit const* target) const