diff options
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Battlefield/Battlefield.h | 1 | ||||
| -rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/Battlegrounds/Battleground.h | 1 | ||||
| -rw-r--r-- | src/server/game/Chat/Channels/ChannelMgr.cpp | 23 | ||||
| -rw-r--r-- | src/server/game/Chat/Channels/ChannelMgr.h | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Taxi/TaxiPathGraph.cpp | 13 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 14 | ||||
| -rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 51 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 7 |
13 files changed, 118 insertions, 40 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 048c57c5c84..156d92e1a30 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -505,9 +505,20 @@ void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievem //! Since no common attributes were found, (not even in titleRewardFlags field) //! we explicitly check by ID. Maybe in the future we could move the achievement_reward //! condition fields to the condition system. - if (uint32 titleId = reward->TitleId[achievement->ID == 1793 ? _owner->GetNativeGender() : (_owner->GetTeam() == ALLIANCE ? 0 : 1)]) - if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) - _owner->SetTitle(titleEntry); + int32 titleId = [&] + { + if (achievement->ID == 1793) + return reward->TitleId[_owner->GetNativeGender()]; + switch (_owner->GetTeam()) + { + case ALLIANCE: return reward->TitleId[0]; + case HORDE: return reward->TitleId[1]; + default: break; + } + return 0u; + }(); + if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) + _owner->SetTitle(titleEntry); // mail if (reward->SenderCreatureId) diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index 4d293eeaf5c..a80b9018560 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -218,7 +218,6 @@ class TC_GAME_API Battlefield : public ZoneScript // Battlefield - generic methods TeamId GetDefenderTeam() const { return m_DefenderTeam; } TeamId GetAttackerTeam() const { return TeamId(1 - m_DefenderTeam); } - TeamId GetOtherTeam(TeamId team) const { return (team == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE); } void SetDefenderTeam(TeamId team) { m_DefenderTeam = team; } // Group methods diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index fff4ceebca7..edd00f0f041 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1705,11 +1705,6 @@ Team Battleground::GetPlayerTeam(ObjectGuid guid) const return TEAM_OTHER; } -Team Battleground::GetOtherTeam(Team team) const -{ - return team ? ((team == ALLIANCE) ? HORDE : ALLIANCE) : TEAM_OTHER; -} - bool Battleground::IsPlayerInBattleground(ObjectGuid guid) const { BattlegroundPlayerMap::const_iterator itr = m_Players.find(guid); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index b01152636e5..2feb0fd9305 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -461,7 +461,6 @@ class TC_GAME_API Battleground : public ZoneScript // since arenas can be AvA or Hvh, we have to get the "temporary" team of a player Team GetPlayerTeam(ObjectGuid guid) const; - Team GetOtherTeam(Team team) const; bool IsPlayerInBattleground(ObjectGuid guid) const; bool IsPlayerMercenaryInBattleground(ObjectGuid guid) const; diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index 396e1e20254..7b05b344f65 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -69,7 +69,7 @@ ChannelMgr::~ChannelMgr() { Field* fields = result->Fetch(); std::string dbName = fields[0].GetString(); - uint32 team = fields[1].GetUInt32(); + Team team = Team(fields[1].GetUInt32()); bool dbAnnounce = fields[2].GetBool(); bool dbOwnership = fields[3].GetBool(); std::string dbPass = fields[4].GetString(); @@ -111,19 +111,26 @@ ChannelMgr::~ChannelMgr() TC_LOG_INFO("server.loading", ">> Loaded {} custom chat channels in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); } -/*static*/ ChannelMgr* ChannelMgr::ForTeam(uint32 team) +/*static*/ ChannelMgr* ChannelMgr::ForTeam(Team team) { static ChannelMgr allianceChannelMgr(ALLIANCE); static ChannelMgr hordeChannelMgr(HORDE); + static ChannelMgr neutralChannelMgr(PANDARIA_NEUTRAL); if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL)) - return &allianceChannelMgr; // cross-faction + return &neutralChannelMgr; // cross-faction - if (team == ALLIANCE) - return &allianceChannelMgr; - - if (team == HORDE) - return &hordeChannelMgr; + switch (team) + { + case HORDE: + return &hordeChannelMgr; + case ALLIANCE: + return &allianceChannelMgr; + case PANDARIA_NEUTRAL: + return &neutralChannelMgr; + default: + break; + } return nullptr; } diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index 72dc50c0fcd..e9e379b3005 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -19,6 +19,7 @@ #include "Define.h" #include "ObjectGuid.h" +#include "SharedDefines.h" #include <string> #include <unordered_map> @@ -32,7 +33,7 @@ class TC_GAME_API ChannelMgr typedef std::unordered_map<ObjectGuid, Channel*> BuiltinChannelContainer; protected: - explicit ChannelMgr(uint32 team) : _team(team), _guidGenerator(HighGuid::ChatChannel) { } + explicit ChannelMgr(Team team) : _team(team), _guidGenerator(HighGuid::ChatChannel) { } ~ChannelMgr(); public: @@ -42,7 +43,7 @@ class TC_GAME_API ChannelMgr ChannelMgr& operator=(ChannelMgr&& right) = delete; static void LoadFromDB(); - static ChannelMgr* ForTeam(uint32 team); + static ChannelMgr* ForTeam(Team team); static Channel* GetChannelForPlayerByNamePart(std::string const& namePart, Player* playerSearcher); static Channel* GetChannelForPlayerByGuid(ObjectGuid channelGuid, Player* playerSearcher); static AreaTableEntry const* SpecialLinkedArea; @@ -57,7 +58,7 @@ class TC_GAME_API ChannelMgr private: CustomChannelContainer _customChannels; BuiltinChannelContainer _channels; - uint32 const _team; + Team const _team; ObjectGuidGenerator _guidGenerator; static void SendNotOnChannelNotify(Player const* player, std::string const& name); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 66e11c8f1fc..bacbf420efe 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2802,10 +2802,15 @@ void Creature::LoadCreaturesSparringHealth(bool force /*= false*/) /// Send a message to LocalDefense channel for players opposition team in the zone void Creature::SendZoneUnderAttackMessage(Player* attacker) { - uint32 enemy_team = attacker->GetTeam(); WorldPackets::Misc::ZoneUnderAttack packet; packet.AreaID = GetAreaId(); - sWorld->SendGlobalMessage(packet.Write(), nullptr, (enemy_team == ALLIANCE ? HORDE : ALLIANCE)); + packet.Write(); + + Team enemyTeam = attacker->GetTeam(); + if (enemyTeam != ALLIANCE) + sWorld->SendGlobalMessage(packet.GetRawPacket(), nullptr, ALLIANCE); + if (enemyTeam != HORDE) + sWorld->SendGlobalMessage(packet.GetRawPacket(), nullptr, HORDE); } void Creature::SetCanMelee(bool canMelee, bool fleeFromMelee /*= false*/) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fe649eb31eb..5f8c11f9434 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2141,7 +2141,7 @@ bool Player::IsGroupVisibleFor(Player const* p) const { default: return IsInSameGroupWith(p); case 1: return IsInSameRaidWith(p); - case 2: return GetTeam() == p->GetTeam(); + case 2: return GetEffectiveTeam() == p->GetEffectiveTeam(); case 3: return false; } } @@ -7646,7 +7646,7 @@ void Player::DuelComplete(DuelCompleteType type) case DUEL_FLED: // if initiator and opponent are on the same team // or initiator and opponent are not PvP enabled, forcibly stop attacking - if (GetTeam() == opponent->GetTeam()) + if (GetEffectiveTeam() == opponent->GetEffectiveTeam()) { AttackStop(); opponent->AttackStop(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c2f8df1f92e..650ab6e6278 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2210,11 +2210,11 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> static TeamId TeamIdForRace(uint8 race); static uint8 GetFactionGroupForRace(uint8 race); Team GetTeam() const { return m_team; } - TeamId GetTeamId() const { return m_team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } + TeamId GetTeamId() const { return GetTeamIdForTeam(m_team); } void SetFactionForRace(uint8 race); - Team GetEffectiveTeam() const { return HasPlayerFlagEx(PLAYER_FLAGS_EX_MERCENARY_MODE) ? (GetTeam() == ALLIANCE ? HORDE : ALLIANCE) : Team(GetTeam()); } - TeamId GetEffectiveTeamId() const { return GetEffectiveTeam() == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } + Team GetEffectiveTeam() const { return HasPlayerFlagEx(PLAYER_FLAGS_EX_MERCENARY_MODE) ? GetOtherTeam(GetTeam()) : GetTeam(); } + TeamId GetEffectiveTeamId() const { return GetTeamIdForTeam(GetEffectiveTeam()); } void InitDisplayIds(); diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp index 2ef20331ff0..a5395bbdc68 100644 --- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp +++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp @@ -33,8 +33,17 @@ struct EdgeCost uint32 Distance; uint32 EvaluateDistance(Player const* player) const { - TaxiNodeFlags requireFlag = (player->GetTeam() == ALLIANCE) ? TaxiNodeFlags::ShowOnAllianceMap : TaxiNodeFlags::ShowOnHordeMap; - if (!To->GetFlags().HasFlag(requireFlag)) + bool isVisibleForFaction = [&] + { + switch (player->GetTeam()) + { + case HORDE: return To->GetFlags().HasFlag(TaxiNodeFlags::ShowOnHordeMap); + case ALLIANCE: return To->GetFlags().HasFlag(TaxiNodeFlags::ShowOnAllianceMap); + default: break; + } + return false; + }(); + if (!isVisibleForFaction) return std::numeric_limits<uint16>::max(); if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(To->ConditionID)) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index a40f31552f0..b159761a915 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6671,10 +6671,20 @@ uint32 ObjectMgr::GetNearestTaxiNode(float x, float y, float z, uint32 mapid, ui float dist = 10000; uint32 id = 0; - TaxiNodeFlags requireFlag = (team == ALLIANCE) ? TaxiNodeFlags::ShowOnAllianceMap : TaxiNodeFlags::ShowOnHordeMap; + auto isVisibleForFaction = [&](TaxiNodesEntry const* node) + { + switch (team) + { + case HORDE: return node->GetFlags().HasFlag(TaxiNodeFlags::ShowOnHordeMap); + case ALLIANCE: return node->GetFlags().HasFlag(TaxiNodeFlags::ShowOnAllianceMap); + default: break; + } + return false; + }; + for (TaxiNodesEntry const* node : sTaxiNodesStore) { - if (!node || node->ContinentID != mapid || !node->GetFlags().HasFlag(requireFlag) || node->GetFlags().HasFlag(TaxiNodeFlags::IgnoreForFindNearest)) + if (!node || node->ContinentID != mapid || !isVisibleForFaction(node) || node->GetFlags().HasFlag(TaxiNodeFlags::IgnoreForFindNearest)) continue; uint32 field = uint32((node->ID - 1) / 8); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 822cd5ce54e..7bbd2b7ceff 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1129,19 +1129,58 @@ enum TeamId TEAM_NEUTRAL }; +constexpr TeamId GetOtherTeam(TeamId team) +{ + switch (team) + { + case TEAM_ALLIANCE: + return TEAM_HORDE; + case TEAM_HORDE: + return TEAM_ALLIANCE; + default: + break; + } + return TEAM_NEUTRAL; +} + enum Team { HORDE = 67, ALLIANCE = 469, - //TEAM_STEAMWHEEDLE_CARTEL = 169, // not used in code - //TEAM_ALLIANCE_FORCES = 891, - //TEAM_HORDE_FORCES = 892, - //TEAM_SANCTUARY = 936, - //TEAM_OUTLAND = 980, PANDARIA_NEUTRAL = 1249, // Starting pandas should have this team - TEAM_OTHER = 0 // if ReputationListId > 0 && Flags != FACTION_FLAG_TEAM_HEADER + TEAM_OTHER = 0 // if ReputationListId > 0 && Flags != FACTION_FLAG_TEAM_HEADER }; +constexpr Team GetOtherTeam(Team team) +{ + switch (team) + { + case HORDE: + return ALLIANCE; + case ALLIANCE: + return HORDE; + case PANDARIA_NEUTRAL: + return PANDARIA_NEUTRAL; + default: + break; + } + return TEAM_OTHER; +} + +constexpr TeamId GetTeamIdForTeam(Team team) +{ + switch (team) + { + case HORDE: + return TEAM_HORDE; + case ALLIANCE: + return TEAM_ALLIANCE; + default: + break; + } + return TEAM_NEUTRAL; +} + enum SpellEffectName { SPELL_EFFECT_NONE = 0, diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index d610816f574..b5533279bae 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2598,11 +2598,14 @@ void World::Update(uint32 diff) if (getBoolConfig(CONFIG_PRESERVE_CUSTOM_CHANNELS)) { TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Save custom channels")); - ChannelMgr* mgr1 = ASSERT_NOTNULL(ChannelMgr::ForTeam(ALLIANCE)); + ChannelMgr* mgr1 = ASSERT_NOTNULL(ChannelMgr::ForTeam(PANDARIA_NEUTRAL)); mgr1->SaveToDB(); - ChannelMgr* mgr2 = ASSERT_NOTNULL(ChannelMgr::ForTeam(HORDE)); + ChannelMgr* mgr2 = ASSERT_NOTNULL(ChannelMgr::ForTeam(ALLIANCE)); if (mgr1 != mgr2) mgr2->SaveToDB(); + ChannelMgr* mgr3 = ASSERT_NOTNULL(ChannelMgr::ForTeam(HORDE)); + if (mgr1 != mgr3) + mgr3->SaveToDB(); } } |
