Advertisement
NoffearrDeathProjecT

Crossfaction BG - Last Rev TrinityCore

May 18th, 2015
1,845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 66.81 KB | None | 0 0
  1. From 4622d722c6dae54fd819b61b515d8d92ef87c50d Mon Sep 17 00:00:00 2001
  2. From: Noffearr <noffearrdeathproject@gmail.com>
  3. Date: Mon, 18 May 2015 10:49:46 -0400
  4. Subject: [PATCH] * Patch CrossFaction
  5.  
  6. * Atualizado e Fixado
  7. ---
  8.  src/server/game/Battlegrounds/Arena.cpp            |   4 +-
  9.  src/server/game/Battlegrounds/Battleground.cpp     |  55 ++--
  10.  src/server/game/Battlegrounds/Battleground.h       |   2 +-
  11.  src/server/game/Battlegrounds/BattlegroundMgr.cpp  |   2 +-
  12.  .../game/Battlegrounds/BattlegroundQueue.cpp       |  83 +++--
  13.  src/server/game/Battlegrounds/BattlegroundQueue.h  |  11 +-
  14.  .../game/Battlegrounds/Zones/BattlegroundAB.cpp    |   2 +-
  15.  .../game/Battlegrounds/Zones/BattlegroundAV.cpp    |  19 +-
  16.  .../game/Battlegrounds/Zones/BattlegroundWS.cpp    |   3 +-
  17.  src/server/game/CMakeLists.txt                     |   2 +
  18.  src/server/game/Cfbg/Cfbg.cpp                      | 347 +++++++++++++++++++++
  19.  src/server/game/Cfbg/Cfbg.h                        |  44 +++
  20.  src/server/game/Entities/Player/Player.cpp         |  97 ++++--
  21.  src/server/game/Entities/Player/Player.h           |  36 ++-
  22.  src/server/game/Entities/Unit/Unit.cpp             |  15 +
  23.  src/server/game/Entities/Unit/Unit.h               |   4 +-
  24.  src/server/game/Handlers/BattleGroundHandler.cpp   |   2 +-
  25.  src/server/game/Handlers/CharacterHandler.cpp      |   3 +
  26.  src/server/game/Handlers/ChatHandler.cpp           |   4 +
  27.  src/server/game/Handlers/MiscHandler.cpp           |  15 +
  28.  src/server/game/Handlers/QueryHandler.cpp          |   2 +-
  29.  src/server/game/World/World.cpp                    |   2 +
  30.  src/server/game/World/World.h                      |   1 +
  31.  src/server/worldserver/worldserver.conf.dist       |  12 +
  32.  24 files changed, 666 insertions(+), 101 deletions(-)
  33.  create mode 100644 src/server/game/Cfbg/Cfbg.cpp
  34.  create mode 100644 src/server/game/Cfbg/Cfbg.h
  35.  
  36. diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp
  37. index dc7f5b2..4defea7 100644
  38. --- a/src/server/game/Battlegrounds/Arena.cpp
  39. +++ b/src/server/game/Battlegrounds/Arena.cpp
  40. @@ -40,9 +40,9 @@ Arena::Arena()
  41.  void Arena::AddPlayer(Player* player)
  42.  {
  43.      Battleground::AddPlayer(player);
  44. -    PlayerScores[player->GetGUIDLow()] = new ArenaScore(player->GetGUID(), player->GetBGTeam());
  45. +    PlayerScores[player->GetGUIDLow()] = new ArenaScore(player->GetGUID(), player->GetTeam());
  46.  
  47. -    if (player->GetBGTeam() == ALLIANCE)        // gold
  48. +    if (player->GetTeam() == ALLIANCE)        // gold
  49.      {
  50.          if (player->GetTeam() == HORDE)
  51.              player->CastSpell(player, SPELL_HORDE_GOLD_FLAG, true);
  52. diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
  53. index e3ff372..6c67d2f 100644
  54. --- a/src/server/game/Battlegrounds/Battleground.cpp
  55. +++ b/src/server/game/Battlegrounds/Battleground.cpp
  56. @@ -286,7 +286,7 @@ inline void Battleground::_CheckSafePositions(uint32 diff)
  57.              if (Player* player = ObjectAccessor::FindPlayer(itr->first))
  58.              {
  59.                  Position pos = player->GetPosition();
  60. -                Position const* startPos = GetTeamStartPosition(Battleground::GetTeamIndexByTeamId(player->GetBGTeam()));
  61. +                Position const* startPos = GetTeamStartPosition(Battleground::GetTeamIndexByTeamId(player->GetTeam()));
  62.                  if (pos.GetExactDistSq(startPos) > maxDist)
  63.                  {
  64.                      TC_LOG_DEBUG("bg.battleground", "BATTLEGROUND: Sending %s back to start location (map: %u) (possible exploit)", player->GetName().c_str(), GetMapId());
  65. @@ -502,7 +502,7 @@ inline void Battleground::_ProcessJoin(uint32 diff)
  66.                      WorldPacket status;
  67.                      BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType());
  68.                      uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId);
  69. -                    sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, queueSlot, STATUS_IN_PROGRESS, 0, GetStartTime(), GetArenaType(), player->GetBGTeam());
  70. +                    sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, queueSlot, STATUS_IN_PROGRESS, 0, GetStartTime(), GetArenaType(), player->GetTeam());
  71.                      player->SendDirectMessage(&status);
  72.  
  73.                      player->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION);
  74. @@ -672,23 +672,34 @@ void Battleground::RewardHonorToTeam(uint32 Honor, uint32 TeamID)
  75.              UpdatePlayerScore(player, SCORE_BONUS_HONOR, Honor);
  76.  }
  77.  
  78. -void Battleground::RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID)
  79. +void Battleground::RewardReputationToTeam(uint32 a_faction_id, uint32 h_faction_id, uint32 Reputation, uint32 TeamID)
  80.  {
  81. -    FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id);
  82. -    if (!factionEntry)
  83. -        return;
  84. +   FactionEntry const* a_factionEntry = sFactionStore.LookupEntry(a_faction_id);
  85. +   FactionEntry const* h_factionEntry = sFactionStore.LookupEntry(h_faction_id);
  86.  
  87. -    for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
  88. -    {
  89. -        Player* player = _GetPlayerForTeam(TeamID, itr, "RewardReputationToTeam");
  90. -        if (!player)
  91. -            continue;
  92. +   if (!a_factionEntry || !h_factionEntry)
  93. +       return;
  94.  
  95. -        uint32 repGain = Reputation;
  96. -        AddPct(repGain, player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
  97. -        AddPct(repGain, player->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction_id));
  98. -        player->GetReputationMgr().ModifyReputation(factionEntry, repGain);
  99. -    }
  100. +   for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
  101. +   {
  102. +       if (itr->second.OfflineRemoveTime)
  103. +           continue;
  104. +
  105. +       Player* player = ObjectAccessor::FindPlayer(itr->first);
  106. +
  107. +       if (!player)
  108. +       {
  109. +           TC_LOG_ERROR("bg.battleground", "BattleGround:RewardReputationToTeam: %u not found!", itr->first);
  110. +           continue;
  111. +       }
  112. +       uint32 team = player->GetTeam();
  113. +       if (team == TeamID)
  114. +
  115. +       if (Player* player = _GetPlayerForTeam(TeamID, itr, "RewardReputationToTeam"))
  116. +       {
  117. +           player->GetReputationMgr().ModifyReputation(player->GetCFSTeam() == ALLIANCE ? a_factionEntry : h_factionEntry, Reputation);
  118. +       }
  119. +   }
  120.  }
  121.  
  122.  void Battleground::UpdateWorldState(uint32 Field, uint32 Value)
  123. @@ -840,7 +851,7 @@ void Battleground::EndBattleground(uint32 winner)
  124.          player->SendDirectMessage(&pvpLogData);
  125.  
  126.          WorldPacket data;
  127. -        sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType(), player->GetBGTeam());
  128. +        sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType(), player->GetTeam());
  129.          player->SendDirectMessage(&data);
  130.          player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1);
  131.      }
  132. @@ -956,6 +967,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
  133.  
  134.      if (player)
  135.      {
  136. +       player->FitPlayerInTeam(false, this);
  137.          // Do next only if found in battleground
  138.          player->SetBattlegroundId(0, BATTLEGROUND_TYPE_NONE);  // We're not in BG.
  139.          // reset destination bg team
  140. @@ -1024,7 +1036,7 @@ void Battleground::AddPlayer(Player* player)
  141.  
  142.      // score struct must be created in inherited class
  143.  
  144. -    uint32 team = player->GetBGTeam();
  145. +   uint32 team = player->GetTeam();
  146.  
  147.      BattlegroundPlayer bp;
  148.      bp.OfflineRemoveTime = 0;
  149. @@ -1075,6 +1087,7 @@ void Battleground::AddPlayer(Player* player)
  150.      // setup BG group membership
  151.      PlayerAddedToBGCheckIfBGIsRunning(player);
  152.      AddOrSetPlayerToCorrectBgGroup(player, team);
  153. +   player->FitPlayerInTeam(true, this);
  154.  }
  155.  
  156.  // this method adds player to his team's bg group, or sets his correct group if player is already in bg group
  157. @@ -1144,8 +1157,8 @@ void Battleground::EventPlayerLoggedOut(Player* player)
  158.  
  159.          // 1 player is logging out, if it is the last, then end arena!
  160.          if (isArena())
  161. -            if (GetAlivePlayersCountByTeam(player->GetBGTeam()) <= 1 && GetPlayersCountByTeam(GetOtherTeam(player->GetBGTeam())))
  162. -                EndBattleground(GetOtherTeam(player->GetBGTeam()));
  163. +           if (GetAlivePlayersCountByTeam(player->GetTeam()) <= 1 && GetPlayersCountByTeam(GetOtherTeam(player->GetTeam())))
  164. +               EndBattleground(GetOtherTeam(player->GetTeam()));
  165.      }
  166.  }
  167.  
  168. @@ -1758,7 +1771,7 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player)
  169.      BuildPvPLogDataPacket(data);
  170.      player->SendDirectMessage(&data);
  171.  
  172. -    sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, GetEndTime(), GetStartTime(), GetArenaType(), player->GetBGTeam());
  173. +    sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, GetEndTime(), GetStartTime(), GetArenaType(), player->GetTeam());
  174.      player->SendDirectMessage(&data);
  175.  }
  176.  
  177. diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
  178. index 19414e6..715ae82 100644
  179. --- a/src/server/game/Battlegrounds/Battleground.h
  180. +++ b/src/server/game/Battlegrounds/Battleground.h
  181. @@ -355,7 +355,7 @@ class Battleground
  182.          void CastSpellOnTeam(uint32 SpellID, uint32 TeamID);
  183.          void RemoveAuraOnTeam(uint32 SpellID, uint32 TeamID);
  184.          void RewardHonorToTeam(uint32 Honor, uint32 TeamID);
  185. -        void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID);
  186. +       void RewardReputationToTeam(uint32 a_faction_id, uint32 h_faction_id, uint32 Reputation, uint32 TeamID);
  187.          void UpdateWorldState(uint32 Field, uint32 Value);
  188.          void UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player* player);
  189.          virtual void EndBattleground(uint32 winner);
  190. diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  191. index 3a95f58..faa72e3 100644
  192. --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  193. +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  194. @@ -693,7 +693,7 @@ void BattlegroundMgr::SendToBattleground(Player* player, uint32 instanceId, Batt
  195.      if (Battleground* bg = GetBattleground(instanceId, bgTypeId))
  196.      {
  197.          uint32 mapid = bg->GetMapId();
  198. -        uint32 team = player->GetBGTeam();
  199. +        uint32 team = player->GetTeam();
  200.          if (team == 0)
  201.              team = player->GetTeam();
  202.  
  203. diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
  204. index 1006b5e..06bbf63 100644
  205. --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp
  206. +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
  207. @@ -154,6 +154,10 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr
  208.          index += BG_TEAMS_COUNT;
  209.      if (ginfo->Team == HORDE)
  210.          index++;
  211. +
  212. +   if (sWorld->getBoolConfig(CROSSFACTION_SYSTEM_BATTLEGROUNDS) && ArenaType == 0)
  213. +       index = BG_QUEUE_CROSSFACTION;
  214. +
  215.      TC_LOG_DEBUG("bg.battleground", "Adding Group to BattlegroundQueue bgTypeId : %u, bracket_id : %u, index : %u", BgTypeId, bracketId, index);
  216.  
  217.      uint32 lastOnlineTime = getMSTime();
  218. @@ -198,30 +202,57 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr
  219.          {
  220.              if (Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(ginfo->BgTypeId))
  221.              {
  222. -                uint32 MinPlayers = bg->GetMinPlayersPerTeam();
  223. -                uint32 qHorde = 0;
  224. -                uint32 qAlliance = 0;
  225. -                uint32 q_min_level = bracketEntry->minLevel;
  226. -                uint32 q_max_level = bracketEntry->maxLevel;
  227. -                GroupsQueueType::const_iterator itr;
  228. -                for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)
  229. -                    if (!(*itr)->IsInvitedToBGInstanceGUID)
  230. -                        qAlliance += (*itr)->Players.size();
  231. -                for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].end(); ++itr)
  232. -                    if (!(*itr)->IsInvitedToBGInstanceGUID)
  233. -                        qHorde += (*itr)->Players.size();
  234. -
  235. -                // Show queue status to player only (when joining queue)
  236. -                if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
  237. +               if (sWorld->getBoolConfig(CROSSFACTION_SYSTEM_BATTLEGROUNDS))
  238.                  {
  239. -                    ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, bg->GetName().c_str(), q_min_level, q_max_level,
  240. -                        qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  241. +                   char const* bgName = bg->GetName().c_str();
  242. +                   uint32 MinPlayers = bg->GetMinPlayersPerTeam() * 2;
  243. +                   uint32 qPlayers = 0;
  244. +                   uint32 q_min_level = bracketEntry->minLevel;
  245. +                   uint32 q_max_level = bracketEntry->maxLevel;
  246. +                   for (GroupsQueueType::const_iterator itr = m_QueuedGroups[bracketId][BG_QUEUE_CROSSFACTION].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_CROSSFACTION].end(); ++itr)
  247. +                   if (!(*itr)->IsInvitedToBGInstanceGUID)
  248. +                       qPlayers += (*itr)->Players.size();
  249. +
  250. +                   if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
  251. +                   {
  252. +                       ChatHandler(leader->GetSession()).PSendSysMessage("Queue status for %s (Lvl: %u to %u) Queued players: %u (Need at least %u more)", bgName, q_min_level, q_max_level, qPlayers, MinPlayers - qPlayers);
  253. +                   }
  254. +                   else
  255. +                   {
  256. +                       std::ostringstream ss;
  257. +                       ss << "|cffff0000[BG Queue Announcer]:|r " << bgName << " -- [" << q_min_level << "-" << q_max_level << "] " << qPlayers << "/" << MinPlayers;
  258. +                       sWorld->SendGlobalText(ss.str().c_str(), NULL);
  259. +                   }
  260.                  }
  261. -                // System message
  262.                  else
  263.                  {
  264. -                    sWorld->SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bg->GetName().c_str(), q_min_level, q_max_level,
  265. -                        qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  266. +                   //  std::string bgName = bg->GetName().c_str();
  267. +                   char const* bgName = bg->GetName().c_str();
  268. +                   uint32 MinPlayers = bg->GetMinPlayersPerTeam();
  269. +                   uint32 qHorde = 0;
  270. +                   uint32 qAlliance = 0;
  271. +                   uint32 q_min_level = bracketEntry->minLevel;
  272. +                   uint32 q_max_level = bracketEntry->maxLevel;
  273. +                   GroupsQueueType::const_iterator itr;
  274. +                   for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)
  275. +                   if (!(*itr)->IsInvitedToBGInstanceGUID)
  276. +                       qAlliance += (*itr)->Players.size();
  277. +                   for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].end(); ++itr)
  278. +                   if (!(*itr)->IsInvitedToBGInstanceGUID)
  279. +                       qHorde += (*itr)->Players.size();
  280. +
  281. +                   // Show queue status to player only (when joining queue)
  282. +                   if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
  283. +                   {
  284. +                       ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, bgName, q_min_level, q_max_level, //******
  285. +                           qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  286. +                   }
  287. +                   // System message
  288. +                   else
  289. +                   {
  290. +                       sWorld->SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bgName, q_min_level, q_max_level, //*******
  291. +                           qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  292. +                   }
  293.                  }
  294.              }
  295.          }
  296. @@ -308,7 +339,7 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
  297.      {
  298.          //we must check premade and normal team's queue - because when players from premade are joining bg,
  299.          //they leave groupinfo so we can't use its players size to find out index
  300. -        for (uint32 j = index; j < BG_QUEUE_GROUP_TYPES_COUNT; j += BG_TEAMS_COUNT)
  301. +       for (uint8 j = 0; j < BG_QUEUE_GROUP_TYPES_COUNT; ++j)
  302.          {
  303.              GroupsQueueType::iterator k = m_QueuedGroups[bracket_id_tmp][j].begin();
  304.              for (; k != m_QueuedGroups[bracket_id_tmp][j].end(); ++k)
  305. @@ -497,6 +528,10 @@ void BattlegroundQueue::FillPlayersToBG(Battleground* bg, BattlegroundBracketId
  306.      int32 hordeFree = bg->GetFreeSlotsForTeam(HORDE);
  307.      int32 aliFree   = bg->GetFreeSlotsForTeam(ALLIANCE);
  308.  
  309. +   if (!bg->isArena())
  310. +   if (FillXPlayersToBG(bracket_id, bg, false))
  311. +       return;
  312. +
  313.      //iterator for iterating through bg queue
  314.      GroupsQueueType::const_iterator Ali_itr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].begin();
  315.      //count of groups in queue - used to stop cycles
  316. @@ -745,7 +780,8 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp
  317.      if (m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty() &&
  318.          m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty() &&
  319.          m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].empty() &&
  320. -        m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].empty())
  321. +       m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].empty() &&
  322. +       m_QueuedGroups[bracket_id][BG_QUEUE_CROSSFACTION].empty())
  323.          return;
  324.  
  325.      // battleground with free slot for player should be always in the beggining of the queue
  326. @@ -836,7 +872,8 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp
  327.      {
  328.          // if there are enough players in pools, start new battleground or non rated arena
  329.          if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
  330. -            || (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
  331. +           || (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam))
  332. +           || CheckCrossFactionMatch(bracket_id, bg_template))
  333.          {
  334.              // we successfully created a pool
  335.              Battleground* bg2 = sBattlegroundMgr->CreateNewBattleground(bgTypeId, bracketEntry, arenaType, false);
  336. diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h
  337. index b3b7fb3..466678f 100644
  338. --- a/src/server/game/Battlegrounds/BattlegroundQueue.h
  339. +++ b/src/server/game/Battlegrounds/BattlegroundQueue.h
  340. @@ -42,6 +42,7 @@ struct GroupQueueInfo                                       // stores informatio
  341.  {
  342.      std::map<ObjectGuid, PlayerQueueInfo*> Players;         // player queue info map
  343.      uint32  Team;                                           // Player team (ALLIANCE/HORDE)
  344. +   uint32  CFSTeam;                                          // Player team (ALLIANCE/HORDE)
  345.      BattlegroundTypeId BgTypeId;                            // battleground type id
  346.      bool    IsRated;                                        // rated
  347.      uint8   ArenaType;                                      // 2v2, 3v3, 5v5 or 0 when BG
  348. @@ -60,9 +61,10 @@ enum BattlegroundQueueGroupTypes
  349.      BG_QUEUE_PREMADE_ALLIANCE   = 0,
  350.      BG_QUEUE_PREMADE_HORDE      = 1,
  351.      BG_QUEUE_NORMAL_ALLIANCE    = 2,
  352. -    BG_QUEUE_NORMAL_HORDE       = 3
  353. +   BG_QUEUE_NORMAL_HORDE       = 3,
  354. +   BG_QUEUE_CROSSFACTION       = 4
  355.  };
  356. -#define BG_QUEUE_GROUP_TYPES_COUNT 4
  357. +#define BG_QUEUE_GROUP_TYPES_COUNT 5
  358.  
  359.  class Battleground;
  360.  class BattlegroundQueue
  361. @@ -74,6 +76,11 @@ class BattlegroundQueue
  362.          void BattlegroundQueueUpdate(uint32 diff, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, uint8 arenaType = 0, bool isRated = false, uint32 minRating = 0);
  363.          void UpdateEvents(uint32 diff);
  364.  
  365. +       bool FillXPlayersToBG(BattlegroundBracketId bracket_id, Battleground* bg, bool start = false);
  366. +       typedef std::multimap<int32, GroupQueueInfo*> QueuedGroupMap;
  367. +       int32 PreAddPlayers(QueuedGroupMap m_PreGroupMap, int32 MaxAdd, uint32 MaxInTeam);
  368. +       bool CheckCrossFactionMatch(BattlegroundBracketId bracket_id, Battleground* bg);
  369. +
  370.          void FillPlayersToBG(Battleground* bg, BattlegroundBracketId bracket_id);
  371.          bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam);
  372.          bool CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers);
  373. diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
  374. index 01acd78..d5560dc 100644
  375. --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
  376. +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
  377. @@ -139,7 +139,7 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff)
  378.  
  379.                  if (m_ReputationScoreTics[team] >= m_ReputationTics)
  380.                  {
  381. -                    (team == TEAM_ALLIANCE) ? RewardReputationToTeam(509, 10, ALLIANCE) : RewardReputationToTeam(510, 10, HORDE);
  382. +                   RewardReputationToTeam(509, 510, 10, team == ALLIANCE ? ALLIANCE : HORDE);
  383.                      m_ReputationScoreTics[team] -= m_ReputationTics;
  384.                  }
  385.  
  386. diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
  387. index 016a113..060097e 100644
  388. --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
  389. +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
  390. @@ -88,7 +88,7 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)
  391.      if (entry == BG_AV_CreatureInfo[AV_NPC_A_BOSS])
  392.      {
  393.          CastSpellOnTeam(23658, HORDE); //this is a spell which finishes a quest where a player has to kill the boss
  394. -        RewardReputationToTeam(729, BG_AV_REP_BOSS, HORDE);
  395. +       RewardReputationToTeam(729, 730, BG_AV_REP_BOSS, killer->GetTeam() == ALLIANCE ? ALLIANCE : HORDE);
  396.          RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), HORDE);
  397.          EndBattleground(HORDE);
  398.          DelCreature(AV_CPLACE_TRIGGER17);
  399. @@ -96,7 +96,7 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)
  400.      else if (entry == BG_AV_CreatureInfo[AV_NPC_H_BOSS])
  401.      {
  402.          CastSpellOnTeam(23658, ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss
  403. -        RewardReputationToTeam(730, BG_AV_REP_BOSS, ALLIANCE);
  404. +       RewardReputationToTeam(729, 730, BG_AV_REP_BOSS, killer->GetTeam() == ALLIANCE ? ALLIANCE : HORDE);
  405.          RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), ALLIANCE);
  406.          EndBattleground(ALLIANCE);
  407.          DelCreature(AV_CPLACE_TRIGGER19);
  408. @@ -109,7 +109,7 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)
  409.              return;
  410.          }
  411.          m_CaptainAlive[0]=false;
  412. -        RewardReputationToTeam(729, BG_AV_REP_CAPTAIN, HORDE);
  413. +       RewardReputationToTeam(729, 730, BG_AV_REP_CAPTAIN, killer->GetTeam() == ALLIANCE ? ALLIANCE : HORDE);
  414.          RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), HORDE);
  415.          UpdateScore(ALLIANCE, (-1)*BG_AV_RES_CAPTAIN);
  416.          //spawn destroyed aura
  417. @@ -128,7 +128,7 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)
  418.              return;
  419.          }
  420.          m_CaptainAlive[1]=false;
  421. -        RewardReputationToTeam(730, BG_AV_REP_CAPTAIN, ALLIANCE);
  422. +       RewardReputationToTeam(729, 730, BG_AV_REP_CAPTAIN, killer->GetTeam() == ALLIANCE ? ALLIANCE : HORDE);
  423.          RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), ALLIANCE);
  424.          UpdateScore(HORDE, (-1)*BG_AV_RES_CAPTAIN);
  425.          //spawn destroyed aura
  426. @@ -150,6 +150,7 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
  427.      if (GetStatus() != STATUS_IN_PROGRESS)
  428.          return;//maybe we should log this, cause this must be a cheater or a big bug
  429.      uint8 team = GetTeamIndexByTeamId(player->GetTeam());
  430. +   uint8 CFSteam = GetTeamIndexByTeamId(GetOtherTeam(player->GetTeam()));
  431.      /// @todo add reputation, events (including quest not available anymore, next quest available, go/npc de/spawning)and maybe honor
  432.      TC_LOG_DEBUG("bg.battleground", "BG_AV Quest %i completed", questid);
  433.      switch (questid)
  434. @@ -174,21 +175,21 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
  435.          case AV_QUEST_A_COMMANDER1:
  436.          case AV_QUEST_H_COMMANDER1:
  437.              m_Team_QuestStatus[team][1]++;
  438. -            RewardReputationToTeam(team, 1, player->GetTeam());
  439. +           RewardReputationToTeam(team, CFSteam, 1, player->GetTeam());
  440.              if (m_Team_QuestStatus[team][1] == 30)
  441.                  TC_LOG_DEBUG("bg.battleground", "BG_AV Quest %i completed (need to implement some events here", questid);
  442.              break;
  443.          case AV_QUEST_A_COMMANDER2:
  444.          case AV_QUEST_H_COMMANDER2:
  445.              m_Team_QuestStatus[team][2]++;
  446. -            RewardReputationToTeam(team, 1, player->GetTeam());
  447. +           RewardReputationToTeam(team, CFSteam, 1, player->GetTeam());
  448.              if (m_Team_QuestStatus[team][2] == 60)
  449.                  TC_LOG_DEBUG("bg.battleground", "BG_AV Quest %i completed (need to implement some events here", questid);
  450.              break;
  451.          case AV_QUEST_A_COMMANDER3:
  452.          case AV_QUEST_H_COMMANDER3:
  453.              m_Team_QuestStatus[team][3]++;
  454. -            RewardReputationToTeam(team, 1, player->GetTeam());
  455. +           RewardReputationToTeam(team, CFSteam, 1, player->GetTeam());
  456.              if (m_Team_QuestStatus[team][3] == 120)
  457.                  TC_LOG_DEBUG("bg.battleground", "BG_AV Quest %i completed (need to implement some events here", questid);
  458.              break;
  459. @@ -470,7 +471,7 @@ void BattlegroundAV::EndBattleground(uint32 winner)
  460.              rep[i]   += BG_AV_REP_SURVIVING_CAPTAIN;
  461.          }
  462.          if (rep[i] != 0)
  463. -            RewardReputationToTeam(i == 0 ? 730 : 729, rep[i], i == 0 ? ALLIANCE : HORDE);
  464. +           RewardReputationToTeam(729, 730, 10, i == ALLIANCE ? ALLIANCE : HORDE);
  465.          if (kills[i] != 0)
  466.              RewardHonorToTeam(GetBonusHonorFromKill(kills[i]), i == 0 ? ALLIANCE : HORDE);
  467.      }
  468. @@ -575,7 +576,7 @@ void BattlegroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node)
  469.              SpawnBGObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH + i + (tmp * 10), RESPAWN_IMMEDIATELY);
  470.  
  471.          UpdateScore((owner == ALLIANCE) ? HORDE : ALLIANCE, -1 * BG_AV_RES_TOWER);
  472. -        RewardReputationToTeam(owner == ALLIANCE ? 730 : 729, BG_AV_REP_TOWER, owner);
  473. +       RewardReputationToTeam(729, 730, BG_AV_REP_TOWER, owner);
  474.          RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_TOWER), owner);
  475.  
  476.          SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+GetTeamIndexByTeamId(owner)+(2*tmp), RESPAWN_ONE_DAY);
  477. diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
  478. index ef02b24..7a0f325 100644
  479. --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
  480. +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
  481. @@ -307,7 +307,6 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player)
  482.          if (GetTeamScore(TEAM_ALLIANCE) < BG_WS_MAX_TEAM_SCORE)
  483.              AddPoint(ALLIANCE, 1);
  484.          PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE);
  485. -        RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE);
  486.      }
  487.      else
  488.      {
  489. @@ -326,8 +325,8 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player)
  490.          if (GetTeamScore(TEAM_HORDE) < BG_WS_MAX_TEAM_SCORE)
  491.              AddPoint(HORDE, 1);
  492.          PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE);
  493. -        RewardReputationToTeam(889, m_ReputationCapture, HORDE);
  494.      }
  495. +   RewardReputationToTeam(890, 889, m_ReputationCapture, player->GetTeam());
  496.      //for flag capture is reward 2 honorable kills
  497.      RewardHonorToTeam(GetBonusHonorFromKill(2), player->GetTeam());
  498.  
  499. diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt
  500. index b604209..ff39e7f 100644
  501. --- a/src/server/game/CMakeLists.txt
  502. +++ b/src/server/game/CMakeLists.txt
  503. @@ -50,6 +50,7 @@ file(GLOB_RECURSE sources_Tickets Tickets/*.cpp Tickets/*.h)
  504.  file(GLOB_RECURSE sources_Warden Warden/*.cpp Warden/*.h)
  505.  file(GLOB_RECURSE sources_Weather Weather/*.cpp Weather/*.h)
  506.  file(GLOB_RECURSE sources_World World/*.cpp World/*.h)
  507. +file(GLOB_RECURSE sources_Cfbg Cfbg/*.cpp Cfbg/*.h)
  508.  
  509.  # Create game-libary
  510.  
  511. @@ -102,6 +103,7 @@ set(game_STAT_SRCS
  512.    ${sources_Warden}
  513.    ${sources_Weather}
  514.    ${sources_World}
  515. +  ${sources_Cfbg}
  516.  )
  517.  
  518.  include_directories(
  519. diff --git a/src/server/game/Cfbg/Cfbg.cpp b/src/server/game/Cfbg/Cfbg.cpp
  520. new file mode 100644
  521. index 0000000..b02db1c
  522. --- /dev/null
  523. +++ b/src/server/game/Cfbg/Cfbg.cpp
  524. @@ -0,0 +1,347 @@
  525. +/*
  526. + * Copyright (C) 2013-2015 DeathCore <http://www.noffearrdeathproject.net/>
  527. + *
  528. + * This program is free software; you can redistribute it and/or modify it
  529. + * under the terms of the GNU General Public License as published by the
  530. + * Free Software Foundation; either version 2 of the License, or (at your
  531. + * option) any later version.
  532. + *
  533. + * This program is distributed in the hope that it will be useful, but WITHOUT
  534. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  535. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  536. + * more details.
  537. + *
  538. + * You should have received a copy of the GNU General Public License along
  539. + * with this program. If not, see <http://www.gnu.org/licenses/>.
  540. +*/
  541. +
  542. +
  543. +#include "Cfbg.h"
  544. +#include "Battleground.h"
  545. +#include "BattlegroundMgr.h"
  546. +#include "Player.h"
  547. +#include "Chat.h"
  548. +#include "BattlegroundQueue.h"
  549. +
  550. +/*####################################################################################
  551. +###############################CROSSFACTION BATTLEGROUNDS#############################
  552. +####################################################################################*/
  553. +
  554. +uint8 Unit::getRace(bool forceoriginal) const
  555. +{
  556. +   if (GetTypeId() == TYPEID_PLAYER)
  557. +   {
  558. +       Player* pPlayer = ((Player*)this);
  559. +
  560. +       if (forceoriginal)
  561. +           return pPlayer->getCFSRace();
  562. +
  563. +       if (pPlayer->InArena())
  564. +           return GetByteValue(UNIT_FIELD_BYTES_0, 0);
  565. +
  566. +       if (!pPlayer->IsPlayingNative())
  567. +           return pPlayer->getFRace();
  568. +   }
  569. +
  570. +   return GetByteValue(UNIT_FIELD_BYTES_0, 0);
  571. +}
  572. +
  573. +bool Player::SendRealNameQuery()
  574. +{
  575. +   if (IsPlayingNative())
  576. +       return false;
  577. +
  578. +   WorldPacket data(SMSG_NAME_QUERY_RESPONSE, (8 + 1 + 1 + 1 + 1 + 1 + 10));
  579. +   data.appendPackGUID(GetGUID());                             // player guid
  580. +   data << uint8(0);                                       // added in 3.1; if > 1, then end of packet
  581. +   data << GetName();                                   // played name
  582. +   data << uint8(0);                                       // realm name for cross realm BG usage
  583. +   data << uint8(getCFSRace());
  584. +   data << uint8(getGender());
  585. +   data << uint8(getClass());
  586. +   data << uint8(0);                                   // is not declined
  587. +   GetSession()->SendPacket(&data);
  588. +
  589. +   return true;
  590. +}
  591. +
  592. +void Player::SetFakeRaceAndMorph()
  593. +{
  594. +   if (getClass() == CLASS_DRUID)
  595. +   {
  596. +       if (GetCFSTeam() == ALLIANCE)
  597. +       {
  598. +           m_FakeMorph = getGender() == GENDER_MALE ? FAKE_M_TAUREN : FAKE_F_TAUREN;
  599. +           m_FakeRace = RACE_TAUREN;
  600. +       }
  601. +       else if (getGender() == GENDER_MALE) // HORDE PLAYER, ONLY HAVE MALE NELF ID
  602. +       {
  603. +           m_FakeMorph = FAKE_M_NELF;
  604. +           m_FakeRace = RACE_NIGHTELF;
  605. +       }
  606. +       else
  607. +           m_FakeRace = GetCFSTeam() == ALLIANCE ? RACE_BLOODELF : RACE_HUMAN;
  608. +   }
  609. +   else if (getClass() == CLASS_SHAMAN && GetCFSTeam() == HORDE && getGender() == GENDER_FEMALE)
  610. +   {
  611. +       m_FakeMorph = FAKE_F_DRAENEI; // Female Draenei
  612. +       m_FakeRace = RACE_DRAENEI;
  613. +   }
  614. +   else
  615. +   {
  616. +       m_FakeRace = GetCFSTeam() == ALLIANCE ? RACE_BLOODELF : RACE_HUMAN;
  617. +
  618. +       if (GetCFSTeam() == HORDE)
  619. +       {
  620. +           if (getGender() == GENDER_MALE)
  621. +               m_FakeMorph = 19723;
  622. +           else
  623. +               m_FakeMorph = 19724;
  624. +       }
  625. +       else
  626. +       {
  627. +           if (getGender() == GENDER_MALE)
  628. +               m_FakeMorph = 20578;
  629. +           else
  630. +               m_FakeMorph = 20579;
  631. +       }
  632. +   }
  633. +}
  634. +
  635. +bool Player::SendBattleGroundChat(uint32 msgtype, std::string message)
  636. +{
  637. +   // Select distance to broadcast to.
  638. +   float distance = msgtype == CHAT_MSG_SAY ? sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY) : sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL);
  639. +
  640. +   if (Battleground* pBattleGround = GetBattleground())
  641. +   {
  642. +       if (pBattleGround->isArena()) // Only fake chat in BG's. CFBG should not interfere with arenas.
  643. +           return false;
  644. +
  645. +       for (Battleground::BattlegroundPlayerMap::const_iterator itr = pBattleGround->GetPlayers().begin(); itr != pBattleGround->GetPlayers().end(); ++itr)
  646. +       {
  647. +           if (Player* pPlayer = ObjectAccessor::FindPlayer(itr->first))
  648. +           {
  649. +               if (GetDistance2d(pPlayer->GetPositionX(), pPlayer->GetPositionY()) <= distance)
  650. +               {
  651. +                   WorldPacket data(SMSG_MESSAGECHAT, 200);
  652. +
  653. +                   if (GetTeam() == pPlayer->GetTeam())
  654. +                   {
  655. +                       WorldPacket data;
  656. +                       ChatHandler::BuildChatPacket(data, ChatMsg(msgtype), LANG_UNIVERSAL, pPlayer, NULL, message);
  657. +                       pPlayer->GetSession()->SendPacket(&data);
  658. +                   }
  659. +                   else if (msgtype != CHAT_MSG_EMOTE)
  660. +                   {
  661. +                       WorldPacket data;
  662. +                       ChatHandler::BuildChatPacket(data, ChatMsg(msgtype), pPlayer->GetTeam() == ALLIANCE ? LANG_ORCISH : LANG_COMMON, pPlayer, NULL, message);
  663. +                       pPlayer->GetSession()->SendPacket(&data);
  664. +                   }
  665. +                   pPlayer->GetSession()->SendPacket(&data);
  666. +               }
  667. +           }
  668. +       }
  669. +       return true;
  670. +   }
  671. +   else
  672. +       return false;
  673. +}
  674. +
  675. +void Player::MorphFit(bool value)
  676. +{
  677. +   if (!IsPlayingNative() && value)
  678. +   {
  679. +       SetDisplayId(GetFakeMorph());
  680. +       SetNativeDisplayId(GetFakeMorph());
  681. +   }
  682. +   else
  683. +       InitDisplayIds();
  684. +}
  685. +
  686. +void Player::FitPlayerInTeam(bool action, Battleground* pBattleGround)
  687. +{
  688. +   if (!pBattleGround)
  689. +       pBattleGround = GetBattleground();
  690. +
  691. +   if ((!pBattleGround || pBattleGround->isArena()) && action)
  692. +       return;
  693. +
  694. +   if (!IsPlayingNative() && action)
  695. +       setFactionForRace(getRace());
  696. +   else
  697. +       setFactionForRace(getCFSRace());
  698. +
  699. +   if (action)
  700. +       SetForgetBGPlayers(true);
  701. +   else
  702. +       SetForgetInListPlayers(true);
  703. +
  704. +   MorphFit(action);
  705. +
  706. +   if (pBattleGround && action)
  707. +       SendChatMessage("%sYou are playing for the %s%s in this %s", MSG_COLOR_WHITE, GetTeam() == ALLIANCE ? MSG_COLOR_DARKBLUE"alliance" : MSG_COLOR_RED"horde", MSG_COLOR_WHITE, pBattleGround->GetName().c_str());
  708. +}
  709. +
  710. +void Player::DoForgetPlayersInList()
  711. +{
  712. +   // m_FakePlayers is filled from a vector within the battleground
  713. +   // they were in previously so all players that have been in that BG will be invalidated.
  714. +   for (FakePlayers::const_iterator itr = m_FakePlayers.begin(); itr != m_FakePlayers.end(); ++itr)
  715. +   {
  716. +       WorldPacket data(SMSG_INVALIDATE_PLAYER, 8);
  717. +       data << *itr;
  718. +       GetSession()->SendPacket(&data);
  719. +       if (Player* pPlayer = ObjectAccessor::FindPlayer(ObjectGuid(*itr)))
  720. +   //  if (Player* pPlayer = ObjectAccessor::FindPlayer(*itr))
  721. +           GetSession()->SendNameQueryOpcode(pPlayer->GetGUID());
  722. +   }
  723. +   m_FakePlayers.clear();
  724. +}
  725. +
  726. +void Player::DoForgetPlayersInBG(Battleground* pBattleGround)
  727. +{
  728. +   for (Battleground::BattlegroundPlayerMap::const_iterator itr = pBattleGround->GetPlayers().begin(); itr != pBattleGround->GetPlayers().end(); ++itr)
  729. +   {
  730. +       // Here we invalidate players in the bg to the added player
  731. +       WorldPacket data1(SMSG_INVALIDATE_PLAYER, 8);
  732. +       data1 << itr->first;
  733. +       GetSession()->SendPacket(&data1);
  734. +
  735. +       if (Player* pPlayer = ObjectAccessor::FindPlayer(itr->first))
  736. +       {
  737. +           GetSession()->SendNameQueryOpcode(pPlayer->GetGUID()); // Send namequery answer instantly if player is available
  738. +           // Here we invalidate the player added to players in the bg
  739. +           WorldPacket data2(SMSG_INVALIDATE_PLAYER, 8);
  740. +           data2 << GetGUID();
  741. +           pPlayer->GetSession()->SendPacket(&data2);
  742. +           pPlayer->GetSession()->SendNameQueryOpcode(GetGUID());
  743. +       }
  744. +   }
  745. +}
  746. +
  747. +bool BattlegroundQueue::CheckCrossFactionMatch(BattlegroundBracketId bracket_id, Battleground* bg)
  748. +{
  749. +   if (!sWorld->getBoolConfig(CROSSFACTION_SYSTEM_BATTLEGROUNDS) || bg->isArena())
  750. +       return false; // Only do this if crossbg's are enabled.
  751. +
  752. +   // Here we will add all players to selectionpool, later we check if there are enough and launch a bg.
  753. +   FillXPlayersToBG(bracket_id, bg, true);
  754. +
  755. +   if (sBattlegroundMgr->isTesting() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount()))
  756. +       return true;
  757. +
  758. +   uint8 MPT = bg->GetMinPlayersPerTeam();
  759. +   if (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() < MPT || m_SelectionPools[TEAM_HORDE].GetPlayerCount() < MPT)
  760. +       return false;
  761. +
  762. +   return true;
  763. +}
  764. +
  765. +// This function will invite players in the least populated faction, which makes battleground queues much faster.
  766. +// This function will return true if cross faction battlegrounds are enabled, otherwise return false,
  767. +// which is useful in FillPlayersToBG. Because then we can interrupt the regular invitation if cross faction bg's are enabled.
  768. +bool BattlegroundQueue::FillXPlayersToBG(BattlegroundBracketId bracket_id, Battleground* bg, bool start)
  769. +{
  770. +   uint8 queuedPeople = 0;
  771. +   for (GroupsQueueType::const_iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_CROSSFACTION].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_CROSSFACTION].end(); ++itr)
  772. +       if (!(*itr)->IsInvitedToBGInstanceGUID)
  773. +           queuedPeople += (*itr)->Players.size();
  774. +
  775. +       if (sWorld->getBoolConfig(CROSSFACTION_SYSTEM_BATTLEGROUNDS) && (sBattlegroundMgr->isTesting() || queuedPeople >= bg->GetMinPlayersPerTeam() * 2 || !start))
  776. +   {
  777. +       int32 aliFree = start ? bg->GetMaxPlayersPerTeam() : bg->GetFreeSlotsForTeam(ALLIANCE);
  778. +       int32 hordeFree = start ? bg->GetMaxPlayersPerTeam() : bg->GetFreeSlotsForTeam(HORDE);
  779. +       // Empty selection pools. They will be refilled from queued groups.
  780. +       m_SelectionPools[TEAM_ALLIANCE].Init();
  781. +       m_SelectionPools[TEAM_HORDE].Init();
  782. +       int32 valiFree = aliFree;
  783. +       int32 vhordeFree = hordeFree;
  784. +       int32 diff = 0;
  785. +
  786. +
  787. +       // Add teams to their own factions as far as possible.
  788. +       if (start)
  789. +       {
  790. +           QueuedGroupMap m_PreGroupMap_a, m_PreGroupMap_h;
  791. +           int32 m_SmallestOfTeams = 0;
  792. +           int32 queuedAlliance = 0;
  793. +           int32 queuedHorde = 0;
  794. +
  795. +           for (GroupsQueueType::const_iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_CROSSFACTION].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_CROSSFACTION].end(); ++itr)
  796. +           {
  797. +               if ((*itr)->IsInvitedToBGInstanceGUID)
  798. +                   continue;
  799. +
  800. +               bool alliance = (*itr)->CFSTeam == ALLIANCE;
  801. +
  802. +               if (alliance)
  803. +               {
  804. +                   m_PreGroupMap_a.insert(std::make_pair((*itr)->Players.size(), *itr));
  805. +                   queuedAlliance += (*itr)->Players.size();
  806. +               }
  807. +               else
  808. +               {
  809. +                   m_PreGroupMap_h.insert(std::make_pair((*itr)->Players.size(), *itr));
  810. +                   queuedHorde += (*itr)->Players.size();
  811. +               }
  812. +           }
  813. +
  814. +           m_SmallestOfTeams = std::min(std::min(aliFree, queuedAlliance), std::min(hordeFree, queuedHorde));
  815. +
  816. +           valiFree -= PreAddPlayers(m_PreGroupMap_a, m_SmallestOfTeams, aliFree);
  817. +           vhordeFree -= PreAddPlayers(m_PreGroupMap_h, m_SmallestOfTeams, hordeFree);
  818. +       }
  819. +
  820. +       QueuedGroupMap m_QueuedGroupMap;
  821. +
  822. +       for (GroupsQueueType::const_iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_CROSSFACTION].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_CROSSFACTION].end(); ++itr)
  823. +           m_QueuedGroupMap.insert(std::make_pair((*itr)->Players.size(), *itr));
  824. +
  825. +       for (QueuedGroupMap::reverse_iterator itr = m_QueuedGroupMap.rbegin(); itr != m_QueuedGroupMap.rend(); ++itr)
  826. +       {
  827. +           GroupsQueueType allypool = m_SelectionPools[TEAM_ALLIANCE].SelectedGroups;
  828. +           GroupsQueueType hordepool = m_SelectionPools[TEAM_HORDE].SelectedGroups;
  829. +
  830. +           GroupQueueInfo* ginfo = itr->second;
  831. +
  832. +           // If player already was invited via pre adding (add to own team first) or he was already invited to a bg, skip.
  833. +           if (ginfo->IsInvitedToBGInstanceGUID ||
  834. +               std::find(allypool.begin(), allypool.end(), ginfo) != allypool.end() ||
  835. +               std::find(hordepool.begin(), hordepool.end(), ginfo) != hordepool.end() ||
  836. +               (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= bg->GetMinPlayersPerTeam() &&
  837. +               m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= bg->GetMinPlayersPerTeam()))
  838. +               continue;
  839. +
  840. +           diff = abs(valiFree - vhordeFree);
  841. +           bool moreAli = valiFree < vhordeFree;
  842. +
  843. +           if (diff > 0)
  844. +               ginfo->Team = moreAli ? HORDE : ALLIANCE;
  845. +
  846. +           bool alliance = ginfo->Team == ALLIANCE;
  847. +
  848. +           if (m_SelectionPools[alliance ? TEAM_ALLIANCE : TEAM_HORDE].AddGroup(ginfo, alliance ? aliFree : hordeFree))
  849. +               alliance ? valiFree -= ginfo->Players.size() : vhordeFree -= ginfo->Players.size();
  850. +       }
  851. +
  852. +       return true;
  853. +   }
  854. +   return false;
  855. +}
  856. +
  857. +int32 BattlegroundQueue::PreAddPlayers(QueuedGroupMap m_PreGroupMap, int32 MaxAdd, uint32 MaxInTeam)
  858. +{
  859. +   int32 LeftToAdd = MaxAdd;
  860. +   uint32 Added = 0;
  861. +
  862. +   for (QueuedGroupMap::reverse_iterator itr = m_PreGroupMap.rbegin(); itr != m_PreGroupMap.rend(); ++itr)
  863. +   {
  864. +       int32 PlayerSize = itr->first;
  865. +       bool alliance = itr->second->CFSTeam == ALLIANCE;
  866. +
  867. +       if (PlayerSize <= LeftToAdd && m_SelectionPools[alliance ? TEAM_ALLIANCE : TEAM_HORDE].AddGroup(itr->second, MaxInTeam))
  868. +           LeftToAdd -= PlayerSize, Added -= PlayerSize;
  869. +   }
  870. +
  871. +   return LeftToAdd;
  872. +}
  873. +
  874. +void Player::SendChatMessage(const char *format, ...)
  875. +{
  876. +   if (!IsInWorld())
  877. +       return;
  878. +
  879. +   if (format)
  880. +   {
  881. +       va_list ap;
  882. +       char str[2048];
  883. +       va_start(ap, format);
  884. +       vsnprintf(str, 2048, format, ap);
  885. +       va_end(ap);
  886. +
  887. +       ChatHandler(GetSession()).SendSysMessage(str);
  888. +   }
  889. +}
  890. \ No newline at end of file
  891. diff --git a/src/server/game/Cfbg/Cfbg.h b/src/server/game/Cfbg/Cfbg.h
  892. new file mode 100644
  893. index 0000000..3f8285d
  894. --- /dev/null
  895. +++ b/src/server/game/Cfbg/Cfbg.h
  896. @@ -0,0 +1,44 @@
  897. +/*
  898. + * Copyright (C) 2013-2015 DeathCore <http://www.noffearrdeathproject.net/>
  899. + *
  900. + * This program is free software; you can redistribute it and/or modify it
  901. + * under the terms of the GNU General Public License as published by the
  902. + * Free Software Foundation; either version 2 of the License, or (at your
  903. + * option) any later version.
  904. + *
  905. + * This program is distributed in the hope that it will be useful, but WITHOUT
  906. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  907. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  908. + * more details.
  909. + *
  910. + * You should have received a copy of the GNU General Public License along
  911. + * with this program. If not, see <http://www.gnu.org/licenses/>.
  912. +*/
  913. +
  914. +
  915. +#ifndef _CUSTOM_H
  916. +#define _CUSTOM_H
  917. +
  918. +#define MSG_COLOR_LIGHTRED     "|cffff6060"
  919. +#define MSG_COLOR_LIGHTBLUE    "|cff00ccff"
  920. +#define MSG_COLOR_ANN_GREEN    "|c1f40af20"
  921. +#define MSG_COLOR_RED          "|cffff0000"
  922. +#define MSG_COLOR_GOLD         "|cffffcc00"
  923. +#define MSG_COLOR_SUBWHITE     "|cffbbbbbb"
  924. +#define MSG_COLOR_MAGENTA      "|cffff00ff"
  925. +#define MSG_COLOR_YELLOW       "|cffffff00"
  926. +#define MSG_COLOR_CYAN         "|cff00ffff"
  927. +#define MSG_COLOR_DARKBLUE     "|cff0000ff"
  928. +
  929. +#define MSG_COLOR_GREY         "|cff9d9d9d"
  930. +#define MSG_COLOR_WHITE        "|cffffffff"
  931. +#define MSG_COLOR_GREEN        "|cff1eff00"
  932. +#define MSG_COLOR_BLUE         "|cff0080ff"
  933. +#define MSG_COLOR_PURPLE       "|cffb048f8"
  934. +#define MSG_COLOR_ORANGE       "|cffff8000"
  935. +
  936. +#define MSG_COLOR_DRUID        "|cffff7d0a"
  937. +#define MSG_COLOR_HUNTER       "|cffabd473"
  938. +#define MSG_COLOR_MAGE         "|cff69ccf0"
  939. +#define MSG_COLOR_PALADIN      "|cfff58cba"
  940. +#define MSG_COLOR_PRIEST       "|cffffffff"
  941. +#define MSG_COLOR_ROGUE        "|cfffff569"
  942. +#define MSG_COLOR_SHAMAN       "|cff0070de"
  943. +#define MSG_COLOR_WARLOCK      "|cff9482c9"
  944. +#define MSG_COLOR_WARRIOR      "|cffc79c6e"
  945. +#define MSG_COLOR_DEATH_KNIGHT "|cffc41f3b"
  946. +#define MSG_COLOR_MONK         "|cff00ff96"
  947. +
  948. +#define LIMIT_UINT32 2147483647
  949. +
  950. +enum FakeMorphs
  951. +{
  952. +   FAKE_F_TAUREN = 20584,
  953. +   FAKE_M_TAUREN = 20585,
  954. +   FAKE_M_NELF = 20318,
  955. +   FAKE_F_DRAENEI = 20323,
  956. +};
  957. +
  958. +#endif
  959. \ No newline at end of file
  960. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  961. index 8d7c800..52b6afb 100644
  962. --- a/src/server/game/Entities/Player/Player.cpp
  963. +++ b/src/server/game/Entities/Player/Player.cpp
  964. @@ -659,6 +659,12 @@ void KillRewarder::Reward()
  965.  
  966.  Player::Player(WorldSession* session): Unit(true)
  967.  {
  968. +   m_FakeRace = 0;
  969. +   m_RealRace = 0;
  970. +   m_FakeMorph = 0;
  971. +   m_ForgetBGPlayers = false;
  972. +   m_ForgetInListPlayers = false;
  973. +
  974.      m_speakTime = 0;
  975.      m_speakCount = 0;
  976.  
  977. @@ -1017,6 +1023,12 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo)
  978.      uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16);
  979.  
  980.      SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
  981. +
  982. +   SetCFSRace();
  983. +   m_team = TeamForRace(getCFSRace());
  984. +   SetFakeRaceAndMorph(); // m_team must be set before this can be used.
  985. +   setFactionForRace(getCFSRace());
  986. +
  987.      InitDisplayIds();
  988.      if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
  989.      {
  990. @@ -3055,7 +3067,7 @@ void Player::GiveLevel(uint8 level)
  991.          guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level);
  992.  
  993.      PlayerLevelInfo info;
  994. -    sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), level, &info);
  995. +   sObjectMgr->GetPlayerLevelInfo(getCFSRace(), getClass(), level, &info);
  996.  
  997.      PlayerClassLevelInfo classInfo;
  998.      sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo);
  999. @@ -3193,7 +3205,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
  1000.      sObjectMgr->GetPlayerClassLevelInfo(getClass(), getLevel(), &classInfo);
  1001.  
  1002.      PlayerLevelInfo info;
  1003. -    sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), getLevel(), &info);
  1004. +    sObjectMgr->GetPlayerLevelInfo(getCFSRace(), getClass(), getLevel(), &info);
  1005.  
  1006.      SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
  1007.      SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(getLevel()));
  1008. @@ -5256,7 +5268,7 @@ void Player::CreateCorpse()
  1009.          return;
  1010.      }
  1011.  
  1012. -    _uf = GetUInt32Value(UNIT_FIELD_BYTES_0);
  1013. +   _uf = getCFSRace();
  1014.      _pb = GetUInt32Value(PLAYER_BYTES);
  1015.      _pb2 = GetUInt32Value(PLAYER_BYTES_2);
  1016.  
  1017. @@ -6940,10 +6952,10 @@ uint32 Player::TeamForRace(uint8 race)
  1018.  
  1019.  void Player::setFactionForRace(uint8 race)
  1020.  {
  1021. -    m_team = TeamForRace(race);
  1022. +   SetBGTeam(TeamForRace(race));
  1023.  
  1024.      ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
  1025. -    setFaction(rEntry ? rEntry->FactionID : 0);
  1026. +   setFaction(rEntry ? rEntry->FactionID : getFaction());
  1027.  }
  1028.  
  1029.  ReputationRank Player::GetReputationRank(uint32 faction) const
  1030. @@ -7045,6 +7057,27 @@ void Player::RewardReputation(Unit* victim, float rate)
  1031.      if (!Rep)
  1032.          return;
  1033.  
  1034. +   uint32 repfaction1 = Rep->RepFaction1;
  1035. +   uint32 repfaction2 = Rep->RepFaction2;
  1036. +
  1037. +   if (!IsPlayingNative())
  1038. +   {
  1039. +       if (GetCFSTeam() == ALLIANCE)
  1040. +       {
  1041. +           if (repfaction1 == 729)
  1042. +               repfaction1 = 730;
  1043. +           if (repfaction2 == 729)
  1044. +               repfaction2 = 730;
  1045. +       }
  1046. +       else
  1047. +       {
  1048. +           if (repfaction1 == 730)
  1049. +               repfaction1 = 729;
  1050. +           if (repfaction2 == 730)
  1051. +               repfaction2 = 729;
  1052. +       }
  1053. +   }
  1054. +
  1055.      uint32 ChampioningFaction = 0;
  1056.  
  1057.      if (GetChampioningFaction())
  1058. @@ -7059,23 +7092,23 @@ void Player::RewardReputation(Unit* victim, float rate)
  1059.  
  1060.      uint32 team = GetTeam();
  1061.  
  1062. -    if (Rep->RepFaction1 && (!Rep->TeamDependent || team == ALLIANCE))
  1063. +   if (repfaction1 && (!Rep->TeamDependent || team == ALLIANCE))
  1064.      {
  1065. -        int32 donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rep->RepValue1, ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
  1066. +       int32 donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rep->RepValue1, ChampioningFaction ? ChampioningFaction : repfaction1);
  1067.          donerep1 = int32(donerep1 * rate);
  1068.  
  1069. -        FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
  1070. +       FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : repfaction1);
  1071.          uint32 current_reputation_rank1 = GetReputationMgr().GetRank(factionEntry1);
  1072.          if (factionEntry1 && current_reputation_rank1 <= Rep->ReputationMaxCap1)
  1073.              GetReputationMgr().ModifyReputation(factionEntry1, donerep1);
  1074.      }
  1075.  
  1076. -    if (Rep->RepFaction2 && (!Rep->TeamDependent || team == HORDE))
  1077. +   if (repfaction2 && (!Rep->TeamDependent || team == HORDE))
  1078.      {
  1079. -        int32 donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rep->RepValue2, ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
  1080. +       int32 donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rep->RepValue2, ChampioningFaction ? ChampioningFaction : repfaction2);
  1081.          donerep2 = int32(donerep2 * rate);
  1082.  
  1083. -        FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
  1084. +       FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : repfaction2);
  1085.          uint32 current_reputation_rank2 = GetReputationMgr().GetRank(factionEntry2);
  1086.          if (factionEntry2 && current_reputation_rank2 <= Rep->ReputationMaxCap2)
  1087.              GetReputationMgr().ModifyReputation(factionEntry2, donerep2);
  1088. @@ -7170,7 +7203,7 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto
  1089.          if (!victim || victim == this || victim->GetTypeId() != TYPEID_PLAYER)
  1090.              return false;
  1091.  
  1092. -        if (GetBGTeam() == victim->ToPlayer()->GetBGTeam())
  1093. +       if (GetTeam() == victim->ToPlayer()->GetTeam())
  1094.              return false;
  1095.  
  1096.          return true;
  1097. @@ -12055,13 +12088,13 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const
  1098.      if (!proto)
  1099.          return EQUIP_ERR_ITEM_NOT_FOUND;
  1100.  
  1101. -    if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeam() != HORDE)
  1102. +   if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetCFSTeam() != HORDE)
  1103.          return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
  1104.  
  1105. -    if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeam() != ALLIANCE)
  1106. +   if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetCFSTeam() != ALLIANCE)
  1107.          return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
  1108.  
  1109. -    if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
  1110. +   if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getCFSRaceMask()) == 0)
  1111.          return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
  1112.  
  1113.      if (proto->RequiredSkill != 0)
  1114. @@ -17321,6 +17354,11 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
  1115.      bytes0 |= gender << 16;                                 // gender
  1116.      SetUInt32Value(UNIT_FIELD_BYTES_0, bytes0);
  1117.  
  1118. +   SetCFSRace(); //**** umisteni ****
  1119. +   m_team = TeamForRace(getCFSRace());
  1120. +   SetFakeRaceAndMorph(); // m_team must be set before this can be used.
  1121. +   setFactionForRace(getCFSRace());//Need to call it to initialize m_team (m_team can be calculated from race)
  1122. +
  1123.      // check if race/class combination is valid
  1124.      PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
  1125.      if (!info)
  1126. @@ -17389,10 +17427,6 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
  1127.      TC_LOG_DEBUG("entities.player.loading", "Load Basic value of player %s is: ", m_name.c_str());
  1128.      outDebugValues();
  1129.  
  1130. -    //Need to call it to initialize m_team (m_team can be calculated from race)
  1131. -    //Other way is to saves m_team into characters table.
  1132. -    setFactionForRace(getRace());
  1133. -
  1134.      // load home bind and check in same time class/race pair, it used later for restore broken positions
  1135.      if (!_LoadHomeBind(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_HOME_BIND)))
  1136.          return false;
  1137. @@ -19220,7 +19254,7 @@ void Player::AddInstanceEnterTime(uint32 instanceId, time_t enterTime)
  1138.  
  1139.  bool Player::_LoadHomeBind(PreparedQueryResult result)
  1140.  {
  1141. -    PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
  1142. +   PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getCFSRace(), getClass());
  1143.      if (!info)
  1144.      {
  1145.          TC_LOG_ERROR("entities.player", "Player (Name %s) has incorrect race/class pair. Can't be loaded.", GetName().c_str());
  1146. @@ -19313,7 +19347,7 @@ void Player::SaveToDB(bool create /*=false*/)
  1147.          stmt->setUInt32(index++, GetGUIDLow());
  1148.          stmt->setUInt32(index++, GetSession()->GetAccountId());
  1149.          stmt->setString(index++, GetName());
  1150. -        stmt->setUInt8(index++, getRace());
  1151. +       stmt->setUInt8(index++, getCFSRace());
  1152.          stmt->setUInt8(index++, getClass());
  1153.          stmt->setUInt8(index++, getGender());
  1154.          stmt->setUInt8(index++, getLevel());
  1155. @@ -19418,7 +19452,7 @@ void Player::SaveToDB(bool create /*=false*/)
  1156.          // Update query
  1157.          stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER);
  1158.          stmt->setString(index++, GetName());
  1159. -        stmt->setUInt8(index++, getRace());
  1160. +        stmt->setUInt8(index++, getCFSRace());
  1161.          stmt->setUInt8(index++, getClass());
  1162.          stmt->setUInt8(index++, getGender());
  1163.          stmt->setUInt8(index++, getLevel());
  1164. @@ -21682,22 +21716,26 @@ void Player::InitDataForForm(bool reapplyMods)
  1165.  
  1166.  void Player::InitDisplayIds()
  1167.  {
  1168. -    PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
  1169. +   PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getCFSRace(), getClass());
  1170.      if (!info)
  1171.      {
  1172.          TC_LOG_ERROR("entities.player", "Player %u has incorrect race/class pair. Can't init display ids.", GetGUIDLow());
  1173.          return;
  1174.      }
  1175.  
  1176. +   bool isMorphed = GetNativeDisplayId() != GetDisplayId();
  1177. +
  1178.      uint8 gender = getGender();
  1179.      switch (gender)
  1180.      {
  1181.          case GENDER_FEMALE:
  1182. -            SetDisplayId(info->displayId_f);
  1183. +           if (!isMorphed)
  1184. +               SetDisplayId(info->displayId_f);
  1185.              SetNativeDisplayId(info->displayId_f);
  1186.              break;
  1187.          case GENDER_MALE:
  1188. -            SetDisplayId(info->displayId_m);
  1189. +           if (!isMorphed)
  1190. +               SetDisplayId(info->displayId_m);
  1191.              SetNativeDisplayId(info->displayId_m);
  1192.              break;
  1193.          default:
  1194. @@ -22496,11 +22534,6 @@ void Player::SetBGTeam(uint32 team)
  1195.      SetByteValue(PLAYER_BYTES_3, 3, uint8(team == ALLIANCE ? 1 : 0));
  1196.  }
  1197.  
  1198. -uint32 Player::GetBGTeam() const
  1199. -{
  1200. -    return m_bgData.bgTeam ? m_bgData.bgTeam : GetTeam();
  1201. -}
  1202. -
  1203.  void Player::LeaveBattleground(bool teleportToEntryPoint)
  1204.  {
  1205.      if (Battleground* bg = GetBattleground())
  1206. @@ -22576,7 +22609,7 @@ void Player::ReportedAfkBy(Player* reporter)
  1207.  
  1208.  WorldLocation Player::GetStartPosition() const
  1209.  {
  1210. -    PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
  1211. +   PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getCFSRace(), getClass());
  1212.      uint32 mapId = info->mapId;
  1213.      if (getClass() == CLASS_DEATH_KNIGHT && HasSpell(50977))
  1214.          mapId = 0;
  1215. @@ -23261,7 +23294,7 @@ void Player::LearnCustomSpells()
  1216.      for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr)
  1217.      {
  1218.          uint32 tspell = *itr;
  1219. -        TC_LOG_DEBUG("entities.player.loading", "PLAYER (Class: %u Race: %u): Adding initial spell, id = %u", uint32(getClass()), uint32(getRace()), tspell);
  1220. +       TC_LOG_DEBUG("entities.player.loading", "PLAYER (Class: %u Race: %u): Adding initial spell, id = %u", uint32(getClass()), uint32(getCFSRace()), tspell);
  1221.          if (!IsInWorld())                                    // will send in INITIAL_SPELLS in list anyway at map add
  1222.              AddSpell(tspell, true, true, true, false);
  1223.          else                                                // but send in normal spell in game learn case
  1224. diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
  1225. index 313937a..0a4a939 100644
  1226. --- a/src/server/game/Entities/Player/Player.h
  1227. +++ b/src/server/game/Entities/Player/Player.h
  1228. @@ -1121,6 +1121,36 @@ class Player : public Unit, public GridObject<Player>
  1229.          explicit Player(WorldSession* session);
  1230.          ~Player();
  1231.  
  1232. +   private:
  1233. +       bool m_ForgetBGPlayers;
  1234. +       bool m_ForgetInListPlayers;
  1235. +       uint8 m_FakeRace;
  1236. +       uint8 m_RealRace;
  1237. +       uint32 m_FakeMorph;
  1238. +   public:
  1239. +       typedef std::vector<uint64> FakePlayers;
  1240. +       void SendChatMessage(const char *format, ...);
  1241. +       void FitPlayerInTeam(bool action, Battleground* pBattleGround = NULL);      // void FitPlayerInTeam(bool action, Battleground* bg = NULL);
  1242. +       void DoForgetPlayersInList();
  1243. +       void DoForgetPlayersInBG(Battleground* pBattleGround);                      // void DoForgetPlayersInBG(Battleground* bg);
  1244. +       uint8 getCFSRace() const { return m_RealRace; }
  1245. +       void SetCFSRace() { m_RealRace = GetByteValue(UNIT_FIELD_BYTES_0, 0); }; // SHOULD ONLY BE CALLED ON LOGIN
  1246. +       void SetFakeRace(); // SHOULD ONLY BE CALLED ON LOGIN
  1247. +       void SetFakeRaceAndMorph(); // SHOULD ONLY BE CALLED ON LOGIN
  1248. +       uint32 GetFakeMorph() { return m_FakeMorph; };
  1249. +       uint8 getFRace() const { return m_FakeRace; }
  1250. +       void SetForgetBGPlayers(bool value) { m_ForgetBGPlayers = value; }
  1251. +       bool ShouldForgetBGPlayers() { return m_ForgetBGPlayers; }
  1252. +       void SetForgetInListPlayers(bool value) { m_ForgetInListPlayers = value; }
  1253. +       bool ShouldForgetInListPlayers() { return m_ForgetInListPlayers; }
  1254. +       bool SendBattleGroundChat(uint32 msgtype, std::string message);
  1255. +       void MorphFit(bool value);
  1256. +       bool IsPlayingNative() const { return GetTeam() == m_team; }
  1257. +       uint32 GetCFSTeam() const { return m_team; }
  1258. +       uint32 GetTeam() const { return m_bgData.bgTeam && GetBattleground() ? m_bgData.bgTeam : m_team; }
  1259. +       bool SendRealNameQuery();
  1260. +       FakePlayers m_FakePlayers;
  1261. +
  1262.          void CleanupsBeforeDelete(bool finalCleanup = true) override;
  1263.  
  1264.          void AddToWorld() override;
  1265. @@ -1174,7 +1204,7 @@ class Player : public Unit, public GridObject<Player>
  1266.          PlayerSocial *GetSocial() { return m_social; }
  1267.  
  1268.          PlayerTaxi m_taxi;
  1269. -        void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
  1270. +       void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getCFSRace(), getClass(), getLevel()); }
  1271.          bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = NULL, uint32 spellid = 0);
  1272.          bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 0);
  1273.          void CleanupAfterTaxiFlight();
  1274. @@ -1952,8 +1982,7 @@ class Player : public Unit, public GridObject<Player>
  1275.          void CheckAreaExploreAndOutdoor(void);
  1276.  
  1277.          static uint32 TeamForRace(uint8 race);
  1278. -        uint32 GetTeam() const { return m_team; }
  1279. -        TeamId GetTeamId() const { return m_team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
  1280. +       TeamId GetTeamId() const { return GetTeam() == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
  1281.          void setFactionForRace(uint8 race);
  1282.  
  1283.          void InitDisplayIds();
  1284. @@ -2098,7 +2127,6 @@ class Player : public Unit, public GridObject<Player>
  1285.          void SetBattlegroundEntryPoint();
  1286.  
  1287.          void SetBGTeam(uint32 team);
  1288. -        uint32 GetBGTeam() const;
  1289.  
  1290.          void LeaveBattleground(bool teleportToEntryPoint = true);
  1291.          bool CanJoinToBattleground(Battleground const* bg) const;
  1292. diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
  1293. index 37f6950..0f7a4d3 100644
  1294. --- a/src/server/game/Entities/Unit/Unit.cpp
  1295. +++ b/src/server/game/Entities/Unit/Unit.cpp
  1296. @@ -16773,6 +16773,21 @@ uint32 Unit::GetModelForTotem(PlayerTotemType totemType)
  1297.              }
  1298.              break;
  1299.          }
  1300. +       default: // One standard for other races.
  1301. +       {
  1302. +           switch (totemType)
  1303. +           {
  1304. +               case SUMMON_TYPE_TOTEM_FIRE:    // fire
  1305. +                   return 4589;
  1306. +               case SUMMON_TYPE_TOTEM_EARTH:   // earth
  1307. +                   return 4588;
  1308. +               case SUMMON_TYPE_TOTEM_WATER:   // water
  1309. +                   return 4587;
  1310. +               case SUMMON_TYPE_TOTEM_AIR:     // air
  1311. +                   return 4590;
  1312. +           }
  1313. +           break;
  1314. +       }
  1315.      }
  1316.      return 0;
  1317.  }
  1318. diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
  1319. index 20344fb..566d755 100644
  1320. --- a/src/server/game/Entities/Unit/Unit.h
  1321. +++ b/src/server/game/Entities/Unit/Unit.h
  1322. @@ -1356,8 +1356,10 @@ class Unit : public WorldObject
  1323.          uint8 getLevel() const { return uint8(GetUInt32Value(UNIT_FIELD_LEVEL)); }
  1324.          uint8 getLevelForTarget(WorldObject const* /*target*/) const override { return getLevel(); }
  1325.          void SetLevel(uint8 lvl);
  1326. -        uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, 0); }
  1327. +       uint8 getRace(bool forceoriginal = false) const;
  1328. +       uint8 getCFSRace() { return getRace(true); }
  1329.          uint32 getRaceMask() const { return 1 << (getRace()-1); }
  1330. +       uint32 getCFSRaceMask() const { return 1 << (getRace(true) - 1); }
  1331.          uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
  1332.          uint32 getClassMask() const { return 1 << (getClass()-1); }
  1333.          uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); }
  1334. diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
  1335. index 7f28fc8..be9285d 100644
  1336. --- a/src/server/game/Handlers/BattleGroundHandler.cpp
  1337. +++ b/src/server/game/Handlers/BattleGroundHandler.cpp
  1338. @@ -543,7 +543,7 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recvData*/)
  1339.              {
  1340.                  // this line is checked, i only don't know if GetStartTime is changing itself after bg end!
  1341.                  // send status in Battleground
  1342. -                sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, i, STATUS_IN_PROGRESS, bg->GetEndTime(), bg->GetStartTime(), arenaType, _player->GetBGTeam());
  1343. +                sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, i, STATUS_IN_PROGRESS, bg->GetEndTime(), bg->GetStartTime(), arenaType, _player->GetTeam());
  1344.                  SendPacket(&data);
  1345.                  continue;
  1346.              }
  1347. diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
  1348. index 7df4065..970af65 100644
  1349. --- a/src/server/game/Handlers/CharacterHandler.cpp
  1350. +++ b/src/server/game/Handlers/CharacterHandler.cpp
  1351. @@ -994,6 +994,9 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
  1352.      sScriptMgr->OnPlayerLogin(pCurrChar, firstLogin);
  1353.  
  1354.      delete holder;
  1355. +
  1356. +   if (pCurrChar->GetTeam() != pCurrChar->GetCFSTeam())
  1357. +       pCurrChar->FitPlayerInTeam(pCurrChar->GetBattleground() && !pCurrChar->GetBattleground()->isArena() ? true : false, pCurrChar->GetBattleground());
  1358.  }
  1359.  
  1360.  void WorldSession::HandleSetFactionAtWar(WorldPacket& recvData)
  1361. diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
  1362. index a583133..a6e04d9 100644
  1363. --- a/src/server/game/Handlers/ChatHandler.cpp
  1364. +++ b/src/server/game/Handlers/ChatHandler.cpp
  1365. @@ -252,6 +252,10 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
  1366.                  return;
  1367.              }
  1368.  
  1369. +           if (!GetPlayer()->IsGameMaster())
  1370. +           if (GetPlayer()->SendBattleGroundChat(type, msg))
  1371. +               return;
  1372. +
  1373.              if (type == CHAT_MSG_SAY)
  1374.                  sender->Say(msg, Language(lang));
  1375.              else if (type == CHAT_MSG_EMOTE)
  1376. diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
  1377. index 49f251e..959df74 100644
  1378. --- a/src/server/game/Handlers/MiscHandler.cpp
  1379. +++ b/src/server/game/Handlers/MiscHandler.cpp
  1380. @@ -1421,6 +1421,21 @@ void WorldSession::HandleSetTitleOpcode(WorldPacket& recvData)
  1381.  
  1382.  void WorldSession::HandleTimeSyncResp(WorldPacket& recvData)
  1383.  {
  1384. +   Battleground* bg = _player->GetBattleground();
  1385. +   if (bg)
  1386. +   {
  1387. +       if (_player->ShouldForgetBGPlayers() && bg)
  1388. +       {
  1389. +           _player->DoForgetPlayersInBG(bg);
  1390. +           _player->SetForgetBGPlayers(false);
  1391. +       }
  1392. +   }
  1393. +   else if (_player->ShouldForgetInListPlayers())
  1394. +   {
  1395. +       _player->DoForgetPlayersInList();
  1396. +       _player->SetForgetInListPlayers(false);
  1397. +   }
  1398. +
  1399.      TC_LOG_DEBUG("network", "CMSG_TIME_SYNC_RESP");
  1400.  
  1401.      uint32 counter, clientTicks;
  1402. diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
  1403. index 9e2b497..dbb01f1 100644
  1404. --- a/src/server/game/Handlers/QueryHandler.cpp
  1405. +++ b/src/server/game/Handlers/QueryHandler.cpp
  1406. @@ -46,7 +46,7 @@ void WorldSession::SendNameQueryOpcode(ObjectGuid guid)
  1407.      data << uint8(0);                               // name known
  1408.      data << nameData->m_name;                       // played name
  1409.      data << uint8(0);                               // realm name - only set for cross realm interaction (such as Battlegrounds)
  1410. -    data << uint8(nameData->m_race);
  1411. +   data << uint8(player ? player->getRace() : nameData->m_race);
  1412.      data << uint8(nameData->m_gender);
  1413.      data << uint8(nameData->m_class);
  1414.  
  1415. diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
  1416. index e28b74d..bc9534f 100644
  1417. --- a/src/server/game/World/World.cpp
  1418. +++ b/src/server/game/World/World.cpp
  1419. @@ -1058,6 +1058,8 @@ void World::LoadConfigSettings(bool reload)
  1420.  
  1421.      m_bool_configs[CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN]            = sConfigMgr->GetBoolDefault("OffhandCheckAtSpellUnlearn", true);
  1422.  
  1423. +   m_bool_configs[CROSSFACTION_SYSTEM_BATTLEGROUNDS] = sConfigMgr->GetBoolDefault("CrossFactionSystem.Battlegrounds", true);
  1424. +
  1425.      m_int_configs[CONFIG_CREATURE_PICKPOCKET_REFILL] = sConfigMgr->GetIntDefault("Creature.PickPocketRefillDelay", 10 * MINUTE);
  1426.  
  1427.      if (int32 clientCacheId = sConfigMgr->GetIntDefault("ClientCacheVersion", 0))
  1428. diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
  1429. index 26d6029..7ece36e 100644
  1430. --- a/src/server/game/World/World.h
  1431. +++ b/src/server/game/World/World.h
  1432. @@ -86,6 +86,7 @@ enum WorldTimers
  1433.  enum WorldBoolConfigs
  1434.  {
  1435.      CONFIG_DURABILITY_LOSS_IN_PVP = 0,
  1436. +   CROSSFACTION_SYSTEM_BATTLEGROUNDS,
  1437.      CONFIG_ADDON_CHANNEL,
  1438.      CONFIG_ALLOW_PLAYER_COMMANDS,
  1439.      CONFIG_CLEAN_CHARACTER_DB,
  1440. diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
  1441. index 08983a5..b037b5f 100644
  1442. --- a/src/server/worldserver/worldserver.conf.dist
  1443. +++ b/src/server/worldserver/worldserver.conf.dist
  1444. @@ -3412,3 +3412,15 @@ PacketSpoof.BanDuration = 86400
  1445.  
  1446.  #
  1447.  ###################################################################################################
  1448. +
  1449. +###################################################################################################
  1450. +#
  1451. +# CROSSFACTION SYSTEM
  1452. +#
  1453. +#    CrossFactionSystem.Battlegrounds = 1 - Mixed battleground enabled.
  1454. +#    CrossFactionSystem.Battlegrounds = 0 - Mixed battleground disabled.
  1455. +
  1456. +CrossFactionSystem.Battlegrounds = 1
  1457. +
  1458. +#
  1459. +###################################################################################################
  1460. \ No newline at end of file
  1461. --
  1462. 1.9.4.msysgit.2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement