Advertisement
Mithos

Crossfaction BG Updated and Fixed TDB 58

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