Core/Entities: use Unit::GetReactionTo in Unit::IsFriendlyTo and Unit::IsHostileTo
This commit is contained in:
@@ -9329,234 +9329,12 @@ ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTem
|
|||||||
|
|
||||||
bool Unit::IsHostileTo(Unit const* unit) const
|
bool Unit::IsHostileTo(Unit const* unit) const
|
||||||
{
|
{
|
||||||
if (!unit)
|
return GetReactionTo(unit) <= REP_HOSTILE;
|
||||||
return false;
|
|
||||||
// always non-hostile to self
|
|
||||||
if (unit == this)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// always non-hostile to GM in GM mode
|
|
||||||
if (unit->GetTypeId() == TYPEID_PLAYER && ((Player const*)unit)->isGameMaster())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// always hostile to enemy
|
|
||||||
if (getVictim() == unit || unit->getVictim() == this)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// test pet/charm masters instead pers/charmeds
|
|
||||||
Unit const* testerOwner = GetCharmerOrOwner();
|
|
||||||
Unit const* targetOwner = unit->GetCharmerOrOwner();
|
|
||||||
|
|
||||||
// always hostile to owner's enemy
|
|
||||||
if (testerOwner && (testerOwner->getVictim() == unit || unit->getVictim() == testerOwner))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// always hostile to enemy owner
|
|
||||||
if (targetOwner && (getVictim() == targetOwner || targetOwner->getVictim() == this))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// always hostile to owner of owner's enemy
|
|
||||||
if (testerOwner && targetOwner && (testerOwner->getVictim() == targetOwner || targetOwner->getVictim() == testerOwner))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
Unit const* tester = testerOwner ? testerOwner : this;
|
|
||||||
Unit const* target = targetOwner ? targetOwner : unit;
|
|
||||||
|
|
||||||
// always non-hostile to target with common owner, or to owner/pet
|
|
||||||
if (tester == target)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// special cases (Duel, etc)
|
|
||||||
if (tester->GetTypeId() == TYPEID_PLAYER && target->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
{
|
|
||||||
Player const* pTester = (Player const*)tester;
|
|
||||||
Player const* pTarget = (Player const*)target;
|
|
||||||
|
|
||||||
// Duel
|
|
||||||
if (pTester->duel && pTester->duel->opponent == pTarget && pTester->duel->startTime != 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Group
|
|
||||||
if (pTester->GetGroup() && pTester->GetGroup() == pTarget->GetGroup())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Sanctuary
|
|
||||||
if (pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY) && pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// PvP FFA state
|
|
||||||
if (pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) && pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// = PvP states
|
|
||||||
// Green/Blue (can't attack)
|
|
||||||
if (!pTester->HasAuraType(SPELL_AURA_MOD_FACTION) && !pTarget->HasAuraType(SPELL_AURA_MOD_FACTION))
|
|
||||||
{
|
|
||||||
if (pTester->GetTeam() == pTarget->GetTeam())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Red (can attack) if true, Blue/Yellow (can't attack) in another case
|
|
||||||
return pTester->IsPvP() && pTarget->IsPvP();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// faction base cases
|
|
||||||
FactionTemplateEntry const*tester_faction = tester->getFactionTemplateEntry();
|
|
||||||
FactionTemplateEntry const*target_faction = target->getFactionTemplateEntry();
|
|
||||||
if (!tester_faction || !target_faction)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (target->isAttackingPlayer() && tester->IsContestedGuard())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// PvC forced reaction and reputation case
|
|
||||||
if (tester->GetTypeId() == TYPEID_PLAYER && !tester->HasAuraType(SPELL_AURA_MOD_FACTION))
|
|
||||||
{
|
|
||||||
// forced reaction
|
|
||||||
if (target_faction->faction)
|
|
||||||
{
|
|
||||||
if (ReputationRank const* force = tester->ToPlayer()->GetReputationMgr().GetForcedRankIfAny(target_faction))
|
|
||||||
return *force <= REP_HOSTILE;
|
|
||||||
|
|
||||||
// if faction have reputation then hostile state for tester at 100% dependent from at_war state
|
|
||||||
if (FactionEntry const* raw_target_faction = sFactionStore.LookupEntry(target_faction->faction))
|
|
||||||
if (FactionState const* factionState = tester->ToPlayer()->GetReputationMgr().GetState(raw_target_faction))
|
|
||||||
return (factionState->Flags & FACTION_FLAG_AT_WAR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// CvP forced reaction and reputation case
|
|
||||||
else if (target->GetTypeId() == TYPEID_PLAYER && !target->HasAuraType(SPELL_AURA_MOD_FACTION))
|
|
||||||
{
|
|
||||||
// forced reaction
|
|
||||||
if (tester_faction->faction)
|
|
||||||
{
|
|
||||||
if (ReputationRank const* force = target->ToPlayer()->GetReputationMgr().GetForcedRankIfAny(tester_faction))
|
|
||||||
return *force <= REP_HOSTILE;
|
|
||||||
|
|
||||||
// apply reputation state
|
|
||||||
FactionEntry const* raw_tester_faction = sFactionStore.LookupEntry(tester_faction->faction);
|
|
||||||
if (raw_tester_faction && raw_tester_faction->reputationListID >= 0)
|
|
||||||
return ((Player const*)target)->GetReputationMgr().GetRank(raw_tester_faction) <= REP_HOSTILE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// common faction based case (CvC, PvC, CvP)
|
|
||||||
return tester_faction->IsHostileTo(*target_faction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::IsFriendlyTo(Unit const* unit) const
|
bool Unit::IsFriendlyTo(Unit const* unit) const
|
||||||
{
|
{
|
||||||
// always friendly to self
|
return GetReactionTo(unit) >= REP_FRIENDLY;
|
||||||
if (unit == this)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// always friendly to GM in GM mode
|
|
||||||
if (unit->GetTypeId() == TYPEID_PLAYER && ((Player const*)unit)->isGameMaster())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// always non-friendly to enemy
|
|
||||||
if (getVictim() == unit || unit->getVictim() == this)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// test pet/charm masters instead pers/charmeds
|
|
||||||
Unit const* testerOwner = GetCharmerOrOwner();
|
|
||||||
Unit const* targetOwner = unit->GetCharmerOrOwner();
|
|
||||||
|
|
||||||
// always non-friendly to owner's enemy
|
|
||||||
if (testerOwner && (testerOwner->getVictim() == unit || unit->getVictim() == testerOwner))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// always non-friendly to enemy owner
|
|
||||||
if (targetOwner && (getVictim() == targetOwner || targetOwner->getVictim() == this))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// always non-friendly to owner of owner's enemy
|
|
||||||
if (testerOwner && targetOwner && (testerOwner->getVictim() == targetOwner || targetOwner->getVictim() == testerOwner))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
Unit const* tester = testerOwner ? testerOwner : this;
|
|
||||||
Unit const* target = targetOwner ? targetOwner : unit;
|
|
||||||
|
|
||||||
// always friendly to target with common owner, or to owner/pet
|
|
||||||
if (tester == target)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// special cases (Duel)
|
|
||||||
if (tester->GetTypeId() == TYPEID_PLAYER && target->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
{
|
|
||||||
Player const* pTester = (Player const*)tester;
|
|
||||||
Player const* pTarget = (Player const*)target;
|
|
||||||
|
|
||||||
// Duel
|
|
||||||
if (pTester->duel && pTester->duel->opponent == target && pTester->duel->startTime != 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Group
|
|
||||||
if (pTester->GetGroup() && pTester->GetGroup() == pTarget->GetGroup())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Sanctuary
|
|
||||||
if (pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY) && pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// PvP FFA state
|
|
||||||
if (pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) && pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// = PvP states
|
|
||||||
// Green/Blue (non-attackable)
|
|
||||||
if (!pTester->HasAuraType(SPELL_AURA_MOD_FACTION) && !pTarget->HasAuraType(SPELL_AURA_MOD_FACTION))
|
|
||||||
{
|
|
||||||
if (pTester->GetTeam() == pTarget->GetTeam())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Blue (friendly/non-attackable) if not PVP, or Yellow/Red in another case (attackable)
|
|
||||||
return !pTarget->IsPvP();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// faction base cases
|
|
||||||
FactionTemplateEntry const* tester_faction = tester->getFactionTemplateEntry();
|
|
||||||
FactionTemplateEntry const* target_faction = target->getFactionTemplateEntry();
|
|
||||||
if (!tester_faction || !target_faction)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (target->isAttackingPlayer() && tester->IsContestedGuard())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// PvC forced reaction and reputation case
|
|
||||||
if (tester->GetTypeId() == TYPEID_PLAYER && !tester->HasAuraType(SPELL_AURA_MOD_FACTION))
|
|
||||||
{
|
|
||||||
// forced reaction
|
|
||||||
if (target_faction->faction)
|
|
||||||
{
|
|
||||||
if (ReputationRank const* force = tester->ToPlayer()->GetReputationMgr().GetForcedRankIfAny(target_faction))
|
|
||||||
return *force >= REP_FRIENDLY;
|
|
||||||
|
|
||||||
// if faction have reputation then friendly state for tester at 100% dependent from at_war state
|
|
||||||
if (FactionEntry const* raw_target_faction = sFactionStore.LookupEntry(target_faction->faction))
|
|
||||||
if (FactionState const* factionState = tester->ToPlayer()->GetReputationMgr().GetState(raw_target_faction))
|
|
||||||
return !(factionState->Flags & FACTION_FLAG_AT_WAR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// CvP forced reaction and reputation case
|
|
||||||
else if (target->GetTypeId() == TYPEID_PLAYER && !target->HasAuraType(SPELL_AURA_MOD_FACTION))
|
|
||||||
{
|
|
||||||
// forced reaction
|
|
||||||
if (tester_faction->faction)
|
|
||||||
{
|
|
||||||
if (ReputationRank const* force = target->ToPlayer()->GetReputationMgr().GetForcedRankIfAny(tester_faction))
|
|
||||||
return *force >= REP_FRIENDLY;
|
|
||||||
|
|
||||||
// apply reputation state
|
|
||||||
if (FactionEntry const* raw_tester_faction = sFactionStore.LookupEntry(tester_faction->faction))
|
|
||||||
if (raw_tester_faction->reputationListID >= 0)
|
|
||||||
return ((Player const*)target)->GetReputationMgr().GetRank(raw_tester_faction) >= REP_FRIENDLY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// common faction based case (CvC, PvC, CvP)
|
|
||||||
return tester_faction->IsFriendlyTo(*target_faction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::IsHostileToPlayers() const
|
bool Unit::IsHostileToPlayers() const
|
||||||
@@ -12461,7 +12239,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// can't assist invisible
|
// can't assist invisible
|
||||||
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target))
|
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target, bySpell && bySpell->IsAOE()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// can't assist dead
|
// can't assist dead
|
||||||
|
|||||||
Reference in New Issue
Block a user