aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp17
-rw-r--r--src/server/game/Battlefield/Battlefield.h1
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp5
-rw-r--r--src/server/game/Battlegrounds/Battleground.h1
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.cpp23
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.h7
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp9
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.h6
-rw-r--r--src/server/game/Entities/Taxi/TaxiPathGraph.cpp13
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp14
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h51
-rw-r--r--src/server/game/World/World.cpp7
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();
}
}