From fd27f0020d5575adb2debe886f9b56155beb95d1 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Wed, 10 Aug 2022 19:14:19 +0200 Subject: [PATCH] Core/Units: defined all faction template flags and properly implemented FactionTemplateFlags::HatesAllExceptFriends *refactored FactionTemplateEntry helpers to use pointers instead of references since we use datastore pointers in all cases so there is no need to create references --- .../game/AuctionHouse/AuctionHouseMgr.cpp | 12 ++-- src/server/game/DataStores/DBCEnums.h | 34 +++++++---- src/server/game/DataStores/DBCStructure.h | 56 ++++++++++--------- .../game/Entities/Creature/Creature.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 16 +++--- src/server/game/Spells/SpellEffects.cpp | 2 +- 7 files changed, 69 insertions(+), 55 deletions(-) diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index db90ccfd08..37ff3d31dd 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -62,12 +62,12 @@ AuctionHouseObject* AuctionHouseMgr::GetAuctionsMap(uint32 factionTemplateId) return &mNeutralAuctions; // teams have linked auction houses - FactionTemplateEntry const* uEntry = sFactionTemplateStore.LookupEntry(factionTemplateId); - if (!uEntry) + FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(factionTemplateId); + if (!factionTemplate) return &mNeutralAuctions; - else if (uEntry->FactionGroup & FACTION_MASK_ALLIANCE) + else if (factionTemplate->FactionGroup & FACTION_GROUP_MASK_ALLIANCE) return &mAllianceAuctions; - else if (uEntry->FactionGroup & FACTION_MASK_HORDE) + else if (factionTemplate->FactionGroup & FACTION_GROUP_MASK_HORDE) return &mHordeAuctions; else return &mNeutralAuctions; @@ -578,9 +578,9 @@ AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTem FactionTemplateEntry const* u_entry = sFactionTemplateStore.LookupEntry(factionTemplateId); if (!u_entry) houseid = AUCTIONHOUSE_NEUTRAL; // goblin auction house - else if (u_entry->FactionGroup & FACTION_MASK_ALLIANCE) + else if (u_entry->FactionGroup & FACTION_GROUP_MASK_ALLIANCE) houseid = AUCTIONHOUSE_ALLIANCE; // human auction house - else if (u_entry->FactionGroup & FACTION_MASK_HORDE) + else if (u_entry->FactionGroup & FACTION_GROUP_MASK_HORDE) houseid = AUCTIONHOUSE_HORDE; // orc auction house else houseid = AUCTIONHOUSE_NEUTRAL; // goblin auction house diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 0c89147138..cc859e80b2 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -430,20 +430,34 @@ enum SpawnMask SPAWNMASK_RAID_ALL = (SPAWNMASK_RAID_NORMAL_ALL | SPAWNMASK_RAID_HEROIC_ALL) }; -enum FactionTemplateFlags +enum class FactionTemplateFlags : uint32 { - FACTION_TEMPLATE_FLAG_PVP = 0x00000800, // flagged for PvP - FACTION_TEMPLATE_FLAG_CONTESTED_GUARD = 0x00001000, // faction will attack players that were involved in PvP combats - FACTION_TEMPLATE_FLAG_HOSTILE_BY_DEFAULT= 0x00002000 + None = 0x0000, + RespondToCallForHelp = 0x0001, + BroadcastToEnemiesLowPriority = 0x0002, + BroadcastToEnemiesMedPriority = 0x0004, + BroadcastToEnemiesHighPriority = 0x0008, + SearchForEnemiesLowPriority = 0x0010, + SearchForEnemiesMedPriority = 0x0020, + SearchForEnemiesHighPriority = 0x0040, + SearchForFriendsLowPriority = 0x0080, + SearchForFriendsMedPriority = 0x0100, + SearchForFriendsHighPriority = 0x0200, + FleeFromCallForHelp = 0x0400, + AssistPlayers = 0x0800, // flagged for PvP + AttackPvPActivePlayers = 0x1000, // faction will attack players that were involved in PvP combats + HatesAllExceptFriends = 0x2000 }; -enum FactionMasks +DEFINE_ENUM_FLAG(FactionTemplateFlags); + +enum FactionGroupMasks : uint8 { - FACTION_MASK_PLAYER = 1, // any player - FACTION_MASK_ALLIANCE = 2, // player or creature from alliance team - FACTION_MASK_HORDE = 4, // player or creature from horde team - FACTION_MASK_MONSTER = 8 // aggressive creature from monster team - // if none flags set then non-aggressive creature + FACTION_GROUP_MASK_NONE = 0x0, // none = neutral + FACTION_GROUP_MASK_PLAYER = 0x1, // any player + FACTION_GROUP_MASK_ALLIANCE = 0x2, // player or creature from alliance team + FACTION_GROUP_MASK_HORDE = 0x4, // player or creature from horde team + FACTION_GROUP_MASK_MONSTER = 0x8 // aggressive creature from monster team }; enum MapTypes // Lua_IsInInstance diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index cff0b2e7a4..2d30a02bf4 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -706,51 +706,53 @@ struct FactionTemplateEntry uint32 Enemies[MAX_FACTION_RELATIONS]; // 6 uint32 Friend[MAX_FACTION_RELATIONS]; // 10 + EnumFlag GetFlags() const { return static_cast(Flags); } + // helpers - bool IsFriendlyTo(FactionTemplateEntry const& entry) const + bool IsFriendlyTo(FactionTemplateEntry const* entry) const { - if (ID == entry.ID) + if (ID == entry->ID) return true; - if (entry.Faction) - { - for (uint8 i = 0; i < MAX_FACTION_RELATIONS; ++i) - if (Enemies[i] == entry.Faction) - return false; - for (uint8 i = 0; i < MAX_FACTION_RELATIONS; ++i) - if (Friend[i] == entry.Faction) - return true; - } - return (FriendGroup & entry.FactionGroup) || (FactionGroup & entry.FriendGroup); + for (uint8 i = 0; i < MAX_FACTION_RELATIONS; ++i) + if (Friend[i] == entry->Faction) + return true; + + if (FactionGroup > 0 && (FactionGroup & entry->FriendGroup) != 0) + return true; + + return false; } - bool IsHostileTo(FactionTemplateEntry const& entry) const + + bool IsHostileTo(FactionTemplateEntry const* entry) const { - if (ID == entry.ID) + if (ID == entry->ID) return false; - if (entry.Faction) - { - for (uint8 i = 0; i < MAX_FACTION_RELATIONS; i++) - if (Enemies[i] == entry.Faction) - return true; + if (GetFlags().HasFlag(FactionTemplateFlags::HatesAllExceptFriends) && !IsFriendlyTo(entry)) + return true; - for (uint8 i = 0; i < MAX_FACTION_RELATIONS; i++) - if (Friend[i] == entry.Faction) - return false; - } - return (EnemyGroup & entry.FactionGroup) != 0; + for (uint8 i = 0; i < MAX_FACTION_RELATIONS; ++i) + if (Enemies[i] == entry->Faction) + return true; + + if (FactionGroup > 0 && (FactionGroup & entry->EnemyGroup) != 0) + return true; + + return false; } - bool IsHostileToPlayers() const { return (EnemyGroup & FACTION_MASK_PLAYER) != 0; } + bool IsHostileToPlayers() const { return (EnemyGroup & FACTION_GROUP_MASK_PLAYER) != 0; } + bool IsHostileToPvpActivePlayers() const { return GetFlags().HasFlag(FactionTemplateFlags::AttackPvPActivePlayers); } + bool IsNeutralToAll() const { for (uint8 i = 0; i < MAX_FACTION_RELATIONS; i++) if (Enemies[i] != 0) return false; - return EnemyGroup == 0 && FriendGroup == 0; + return EnemyGroup == FACTION_GROUP_MASK_NONE && FriendGroup == FACTION_GROUP_MASK_NONE; } - bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; } }; struct GameObjectArtKitEntry diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 45d9a08ce0..56acd6bc4d 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -623,7 +623,7 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, // checked and error show at loading templates if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(cInfo->faction)) - SetPvP((factionTemplate->Flags & FACTION_TEMPLATE_FLAG_PVP) != 0); + SetPvP(factionTemplate->GetFlags().HasFlag(FactionTemplateFlags::AssistPlayers)); // updates spell bars for vehicles and set player's faction - should be called here, to overwrite faction that is set from the new template if (IsVehicle()) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 585cd1ae77..665dd4255e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25293,7 +25293,7 @@ bool Player::CanUseBattlegroundObject(GameObject* gameobject) const FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry(); FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetFaction()); - if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction)) + if (playerFaction && faction && !playerFaction->IsFriendlyTo(faction)) return false; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 53becf51b0..6da95d16de 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5522,7 +5522,7 @@ ReputationRank Unit::GetReactionTo(Unit const* target) const if (targetFactionEntry->CanHaveReputation()) { // check contested flags - if (targetFactionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD + if (targetFactionTemplateEntry->IsHostileToPvpActivePlayers() && selfPlayerOwner->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP)) return REP_HOSTILE; @@ -5552,7 +5552,7 @@ ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTem if (Player const* targetPlayerOwner = target->GetAffectingPlayer()) { // check contested flags - if (factionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD + if (factionTemplateEntry->IsHostileToPvpActivePlayers() && targetPlayerOwner->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP)) return REP_HOSTILE; if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry)) @@ -5574,14 +5574,12 @@ ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTem } // common faction based check - if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry)) + if (factionTemplateEntry->IsHostileTo(targetFactionTemplateEntry)) return REP_HOSTILE; - if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry)) + if (factionTemplateEntry->IsFriendlyTo(targetFactionTemplateEntry)) return REP_FRIENDLY; - if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry)) + if (targetFactionTemplateEntry->IsFriendlyTo(factionTemplateEntry)) return REP_FRIENDLY; - if (factionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_HOSTILE_BY_DEFAULT) - return REP_HOSTILE; // neutral by default return REP_NEUTRAL; } @@ -12671,7 +12669,7 @@ void Unit::GetPartyMembers(std::list &TagUnitMap) bool Unit::IsContestedGuard() const { if (FactionTemplateEntry const* entry = GetFactionTemplateEntry()) - return entry->IsContestedGuardFaction(); + return entry->IsHostileToPvpActivePlayers(); return false; } @@ -14750,7 +14748,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) { FactionTemplateEntry const* ft1 = GetFactionTemplateEntry(); FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry(); - if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2)) + if (ft1 && ft2 && !ft1->IsFriendlyTo(ft2)) { if (index == UNIT_FIELD_BYTES_2) // Allow targetting opposite faction in party when enabled in config diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 8913099acd..6476a9b14f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5314,7 +5314,7 @@ void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/) FactionTemplateEntry const* casterFaction = caster->GetFactionTemplateEntry(); FactionTemplateEntry const* targetFaction = sFactionTemplateStore.LookupEntry(gameObjTarget->GetFaction()); // Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons) - if (!targetFaction || (casterFaction && !casterFaction->IsFriendlyTo(*targetFaction))) + if (!targetFaction || (casterFaction && !casterFaction->IsFriendlyTo(targetFaction))) gameObjTarget->ModifyHealth(-damage, caster, GetSpellInfo()->Id); }