Advertisement
EmuDevs

C++ CrossfactionBG Setup Guide

Jan 4th, 2014
449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.62 KB | None | 0 0
  1. I want you to read this very carefully, as it is a nice long process. I will be as specific as I can be with this, so bare with me here. Don't blame me if I miss something. :P
  2.  
  3. [INDENT][SIZE=3][COLOR="#0066ff"]#1. Configuration Option[/COLOR][/SIZE][/INDENT]
  4. [INDENT]
  5. Go into World.h and add: CONFIG_CROSSFACTIONBG inside of:
  6.  
  7. [CODE]
  8. enum WorldBoolConfigs
  9. [/CODE]
  10.  
  11. Now head into your World.cpp and add:
  12.  
  13. [CODE]
  14. m_bool_configs[CONFIG_CROSSFACTIONBG] = ConfigMgr::GetBoolDefault("MixedBGs", true);
  15. [/CODE]
  16.  
  17. Around line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/World/World.cpp#L1191"]#1191[/URL] where all the other options are loading.
  18. [/INDENT]
  19.  
  20.  
  21. [INDENT][SIZE=3][COLOR="#0066ff"]#2. Player source & header file[/COLOR][/SIZE][/INDENT]
  22.  
  23. [INDENT]We will be doing the Player files. To start, open up Player.h and Player.cpp. Once you have those opened;
  24.  
  25. Go on line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Entities/Player/Player.h#L1061"]#1061[/URL] and above line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Entities/Player/Player.h#L1066"]#1066[/URL] add:
  26.  
  27. [CODE]
  28. //CROSSFACION BG START
  29. private:
  30. bool m_ForgetBGPlayers;
  31. bool m_ForgetInListPlayers;
  32. public:
  33. typedef std::vector<uint64> FakePlayers;
  34. void FitPlayerInTeam(bool action);
  35. void DoForgetPlayersInList();
  36. void DoForgetPlayersInBG(Battleground* pBattleGround);
  37. uint8 GetFakeRaceOrRace();
  38. void SetForgetBGPlayers(bool tralse) { m_ForgetBGPlayers = tralse; }
  39. bool ShouldForgetBGPlayers() { return m_ForgetBGPlayers; }
  40. void SetForgetInListPlayers(bool tralse) { m_ForgetInListPlayers = tralse; }
  41. bool ShouldForgetInListPlayers() { return m_ForgetInListPlayers; }
  42. bool SendBattleGroundChat(uint32 msgtype, std::string message);
  43. void MorphFit(bool value);
  44. bool TeamIsBGTeam() { return GetBGTeam() == GetTeam(); }
  45. FakePlayers m_FakePlayers;
  46. //CROSSFACION BG END
  47. [/CODE]
  48.  
  49. Now go to line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Entities/Player/Player.h#L1887"]#1887[/URL] and above that add:
  50.  
  51. [CODE]
  52. TeamId GetBGTeamId() const { return GetBGTeam() == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
  53. [/CODE]
  54.  
  55. That should be all of Player.h. [COLOR="#FF8C00"]Go to Player.cpp..[/COLOR]
  56.  
  57. I guess on any line under a function of your choice add: (In Player.cpp)
  58.  
  59. [CODE]
  60. /*####################################################################################
  61. ###############################CROSSFACTION BATTLEGROUNDS#############################
  62. ####################################################################################*/
  63.  
  64. void Player::FitPlayerInTeam(bool action)
  65. {
  66. ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(GetFakeRaceOrRace());
  67. if(rEntry && !TeamIsBGTeam() && action)
  68. setFaction(rEntry->FactionID);
  69. else
  70. setFactionForRace(getRace());
  71.  
  72. if (action)
  73. SetForgetBGPlayers(true);
  74. else
  75. SetForgetInListPlayers(true);
  76.  
  77. MorphFit(action);
  78.  
  79. if (GetBattleground() && action)
  80. ChatHandler(GetSession()).PSendSysMessage("%sYou are playing for the %s%s in this %s", MSG_COLOR_WHITE, GetBGTeam() == ALLIANCE ? MSG_COLOR_DARKBLUE"alliance" : MSG_COLOR_RED"horde", MSG_COLOR_WHITE, GetBattleground()->GetName());
  81. }
  82.  
  83. uint8 Player::GetFakeRaceOrRace()
  84. {
  85. if(!TeamIsBGTeam())
  86. return GetBGTeam() == ALLIANCE ? RACE_HUMAN : RACE_BLOODELF;
  87. else
  88. return getRace();
  89. }
  90.  
  91. void Player::DoForgetPlayersInList()
  92. {
  93. // m_FakePlayers is filled from a vector within the battleground
  94. // they were in previously so all players that have been in that BG will be invalidated.
  95. for (FakePlayers::const_iterator itr = m_FakePlayers.begin(); itr != m_FakePlayers.end(); ++itr)
  96. {
  97. WorldPacket data(SMSG_INVALIDATE_PLAYER, 8);
  98. data << *itr;
  99. GetSession()->SendPacket(&data);
  100. if (Player* pPlayer = ObjectAccessor::FindPlayer(*itr))
  101. GetSession()->SendNameQueryOpcode(*itr);
  102. }
  103. m_FakePlayers.clear();
  104. }
  105.  
  106. void Player::DoForgetPlayersInBG(Battleground* pBattleGround)
  107. {
  108. if (!pBattleGround || pBattleGround->isArena())
  109. return;
  110.  
  111. for (Battleground::BattlegroundPlayerMap::const_iterator itr = pBattleGround->GetPlayers().begin(); itr != pBattleGround->GetPlayers().end(); ++itr)
  112. {
  113. // Here we invalidate players in the bg to the added player
  114. WorldPacket data1(SMSG_INVALIDATE_PLAYER, 8);
  115. data1 << itr->first;
  116. GetSession()->SendPacket(&data1);
  117. GetSession()->SendNameQueryOpcode(itr->first);
  118.  
  119. if (Player* pPlayer = ObjectAccessor::FindPlayer(itr->first))
  120. {
  121. // Here we invalidate the player added to players in the bg
  122. WorldPacket data2(SMSG_INVALIDATE_PLAYER, 8);
  123. data2 << GetGUID();
  124. pPlayer->GetSession()->SendPacket(&data2);
  125. pPlayer->GetSession()->SendNameQueryOpcode(GetGUID());
  126. }
  127. }
  128. }
  129.  
  130. bool BattlegroundQueue::CheckCrossFactionMatch(BattlegroundBracketId bracket_id, Battleground* bg)
  131. {
  132. sLog->outDebug(LOG_FILTER_GENERAL, "BattleGroundQueue::CheckCrossFactionMatch");
  133. if (bg->isArena())
  134. return false; // Only do this if crossbg's are enabled.
  135.  
  136. // Here we will add all players to selectionpool, later we check if there are enough and launch a bg.
  137. FillXPlayersToBG(bracket_id, bg, true);
  138.  
  139. uint8 MPT = bg->GetMinPlayersPerTeam();
  140. if (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() < MPT || m_SelectionPools[TEAM_HORDE].GetPlayerCount() < MPT)
  141. {
  142. sLog->outDebug(LOG_FILTER_GENERAL, "Not enough players. Has: %u Need: %u", m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() + m_SelectionPools[TEAM_HORDE].GetPlayerCount(), MPT * 2);
  143. return false;
  144. }
  145. return true;
  146. }
  147.  
  148. // This function will invite players in the least populated faction, which makes battleground queues much faster.
  149. // This function will return true if cross faction battlegrounds are enabled, otherwise return false,
  150. // which is useful in FillPlayersToBG. Because then we can interrupt the regular invitation if cross faction bg's are enabled.
  151. bool BattlegroundQueue::FillXPlayersToBG(BattlegroundBracketId bracket_id, Battleground* bg, bool start)
  152. {
  153. if (sWorld->getBoolConfig(CONFIG_CROSSFACTIONBG))
  154. {
  155. int32 aliFree = start ? bg->GetMinPlayersPerTeam() : bg->GetFreeSlotsForTeam(ALLIANCE);
  156. int32 hordeFree = start ? bg->GetMinPlayersPerTeam() : bg->GetFreeSlotsForTeam(HORDE);
  157. // Empty selection pools. They will be refilled from queued groups.
  158. m_SelectionPools[TEAM_ALLIANCE].Init();
  159. m_SelectionPools[TEAM_HORDE].Init();
  160. int32 valiFree = aliFree;
  161. int32 vhordeFree = hordeFree;
  162. int32 diff = 0;
  163.  
  164. sLog->outDebug(LOG_FILTER_GENERAL, "valiFree: %u vhordeFree: %u", valiFree, vhordeFree);
  165.  
  166. for (GroupsQueueType::iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_MIXED].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_MIXED].end(); ++itr)
  167. {
  168. if ((*itr)->IsInvitedToBGInstanceGUID)
  169. continue;
  170.  
  171. diff = abs(valiFree - vhordeFree);
  172. bool moreAli = valiFree < vhordeFree;
  173.  
  174. sLog->outDebug(LOG_FILTER_GENERAL, "moreAli: %s", moreAli ? "true" : "false");
  175. sLog->outDebug(LOG_FILTER_GENERAL, "diff: %u", diff);
  176.  
  177. if (diff > 0)
  178. (*itr)->Team = moreAli ? HORDE : ALLIANCE;
  179.  
  180. bool alliance = (*itr)->Team == ALLIANCE;
  181.  
  182. sLog->outDebug(LOG_FILTER_GENERAL, "Team: %s", alliance ? "ali" : "horde");
  183.  
  184. if (m_SelectionPools[alliance ? TEAM_ALLIANCE : TEAM_HORDE].AddGroup((*itr), alliance ? aliFree : hordeFree))
  185. {
  186. uint8 GSize = (*itr)->Players.size();
  187. sLog->outDebug(LOG_FILTER_GENERAL, "Size: %u", GSize);
  188. alliance ? valiFree -= GSize : vhordeFree -= GSize;
  189. }
  190. }
  191. return true;
  192. }
  193. return false;
  194. }
  195.  
  196. bool Player::SendBattleGroundChat(uint32 msgtype, std::string message)
  197. {
  198. float distance = msgtype == CHAT_MSG_SAY ? sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY) : sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL);
  199.  
  200. if (Battleground* pBattleGround = GetBattleground())
  201. {
  202. for (Battleground::BattlegroundPlayerMap::const_iterator itr = pBattleGround->GetPlayers().begin(); itr != pBattleGround->GetPlayers().end(); ++itr)
  203. {
  204. if (Player* pPlayer = ObjectAccessor::FindPlayer(itr->first))
  205. {
  206. if (GetDistance2d(pPlayer->GetPositionX(), pPlayer->GetPositionY()) <= distance)
  207. {
  208. if (GetBGTeam() == pPlayer->GetBGTeam())
  209. {
  210. WorldPacket data(SMSG_MESSAGECHAT, 200);
  211. BuildPlayerChat(&data, msgtype, message, LANG_UNIVERSAL);
  212. pPlayer->GetSession()->SendPacket(&data);
  213. }
  214. else if (msgtype != CHAT_MSG_EMOTE)
  215. {
  216. WorldPacket data(SMSG_MESSAGECHAT, 200);
  217. BuildPlayerChat(&data, msgtype, message, pPlayer->GetTeam() == ALLIANCE ? LANG_ORCISH : LANG_COMMON);
  218. pPlayer->GetSession()->SendPacket(&data);
  219. }
  220. }
  221. }
  222. }
  223. return true;
  224. }
  225. else
  226. return false;
  227. }
  228.  
  229. void Player::MorphFit(bool value)
  230. {
  231. if (!TeamIsBGTeam() && value)
  232. {
  233. if (GetBGTeam() == ALLIANCE)
  234. {
  235. if (getGender() == GENDER_MALE)
  236. {
  237. SetDisplayId(19723);
  238. SetNativeDisplayId(19723);
  239. }
  240. else
  241. {
  242. SetDisplayId(19724);
  243. SetNativeDisplayId(19724);
  244. }
  245. }
  246. else
  247. {
  248. if (getGender() == GENDER_MALE)
  249. {
  250. SetDisplayId(20578);
  251. SetNativeDisplayId(20578);
  252. }
  253. else
  254. {
  255. SetDisplayId(20579);
  256. SetNativeDisplayId(20579);
  257. }
  258. }
  259. }
  260. else
  261. InitDisplayIds();
  262. }
  263. [/CODE]
  264.  
  265. [/INDENT]
  266.  
  267. [INDENT][SIZE=3][COLOR="#0066ff"]#3. Unit.cpp & [URL="https://github.com/TrinityCore/TrinityCore/tree/master/src/server/game/Handlers"]Handlers[/URL][/COLOR][/SIZE][/INDENT]
  268.  
  269. [INDENT]
  270.  
  271. [COLOR="#FF8C00"][B]QueryHandler.cpp[/B][/COLOR]
  272.  
  273. In QueryHandler.cpp under [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/QueryHandler.cpp#L34"]SendNameQueryOpcode(uint64 guid)[/URL], change:
  274.  
  275. (On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/QueryHandler.cpp#L51"]#51[/URL])
  276.  
  277. [CODE]data << uint8(nameData->m_race);[/CODE]
  278.  
  279. to:
  280.  
  281. [CODE]data << uint8(player ? player->GetFakeRaceOrRace() : nameData->m_race);[/CODE]
  282.  
  283. [COLOR="#FF8C00"][B]MiscHandler.cpp[/B][/COLOR]
  284.  
  285. Under [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/MiscHandler.cpp#L1416"]void WorldSession::HandleTimeSyncResp(WorldPacket& recvData)[/URL] add:
  286.  
  287. [CODE]
  288. Battleground* bg = _player->GetBattleground();
  289. if (bg)
  290. {
  291. if (_player->ShouldForgetBGPlayers())
  292. {
  293. _player->DoForgetPlayersInBG(bg);
  294. _player->SetForgetBGPlayers(false);
  295. }
  296. }
  297. else if (_player->ShouldForgetInListPlayers())
  298. {
  299. _player->DoForgetPlayersInList();
  300. _player->SetForgetInListPlayers(false);
  301. }
  302. [/CODE]
  303.  
  304. Above or below line: [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/MiscHandler.cpp#L1418"]#1418[/URL]
  305.  
  306. [COLOR="#FF8C00"][B]ChatHandler.cpp[/B][/COLOR]
  307.  
  308. Inside of [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/ChatHandler.cpp#L43"]void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)[/URL] add:
  309.  
  310. [CODE]
  311. if (!GetPlayer()->isGameMaster())
  312. if (GetPlayer()->SendBattleGroundChat(type, msg))
  313. return;
  314. [/CODE]
  315.  
  316. Above line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/ChatHandler.cpp#L251"]#251[/URL]
  317.  
  318. [COLOR="#FF8C00"][B]CharacterHandler.cpp[/B][/COLOR]
  319.  
  320. Inside of [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/CharacterHandler.cpp#L798"]void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)[/URL]
  321.  
  322. Under line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Handlers/CharacterHandler.cpp#L1031"]#1031[/URL] add:
  323.  
  324. [CODE]
  325. if (sWorld->getBoolConfig(CONFIG_CROSSFACTIONBG))
  326. {
  327. float x = pCurrChar->GetPositionX();
  328. float y = pCurrChar->GetPositionY();
  329. float z = pCurrChar->GetPositionZ();
  330. uint32 hm = pCurrChar->m_homebindMapId;
  331. float hx = pCurrChar->m_homebindX;
  332. float hy = pCurrChar->m_homebindX;
  333. float hz = pCurrChar->m_homebindX;
  334. if (z+1 < pCurrChar->GetMap()->GetHeight(x, y, MAX_HEIGHT) && pCurrChar->GetMap()->IsOutdoors(x, y, z))
  335. pCurrChar->TeleportTo(hm, hx, hy, hz, 0);
  336. }
  337.  
  338. if (pCurrChar->GetBattleground() && !pCurrChar->GetBattleground()->isArena())
  339. pCurrChar->FitPlayerInTeam(true);
  340. else
  341. pCurrChar->FitPlayerInTeam(false);
  342. [/CODE]
  343.  
  344. [COLOR="Lime"][B]Unit.cpp[/B][/COLOR]
  345.  
  346. Inside of [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Entities/Unit/Unit.cpp#L15918"]void Unit::RestoreFaction()[/URL]
  347.  
  348. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Entities/Unit/Unit.cpp#L15921"]#15921[/URL], replace:
  349.  
  350. [CODE]ToPlayer()->setFactionForRace(getRace());[/CODE]
  351.  
  352. with
  353.  
  354. [CODE]ToPlayer()->setFactionForRace(ToPlayer()->GetFakeRaceOrRace());[/CODE]
  355.  
  356. [/INDENT]
  357.  
  358. [INDENT][SIZE=3][COLOR="#0066ff"]#4. BattlegroundQueue.cpp & BattlegroundQueue.h[/COLOR][/SIZE][/INDENT]
  359. [INDENT]
  360.  
  361. Open BattlegroundQueue.h..
  362.  
  363. Inside of [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.h#L58"]enum BattlegroundQueueGroupTypes[/URL] under [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.h#L63"]BG_QUEUE_NORMAL_HORDE = 3[/URL], add:
  364.  
  365. [CODE]BG_QUEUE_MIXED = 4[/CODE]
  366.  
  367. It should look like this now:
  368.  
  369. [CODE]
  370. enum BattlegroundQueueGroupTypes
  371. {
  372. BG_QUEUE_PREMADE_ALLIANCE = 0,
  373. BG_QUEUE_PREMADE_HORDE = 1,
  374. BG_QUEUE_NORMAL_ALLIANCE = 2,
  375. BG_QUEUE_NORMAL_HORDE = 3,
  376. BG_QUEUE_MIXED = 4
  377. };
  378. [/CODE]
  379.  
  380. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.h#L65"]#65[/URL] replace #define [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.h#L65"]BG_QUEUE_GROUP_TYPES_COUNT 4[/URL] with:
  381.  
  382. (Just change the 4 to a 5)
  383.  
  384. [CODE]
  385. #define BG_QUEUE_GROUP_TYPES_COUNT 5
  386. [/CODE]
  387.  
  388. Now, under line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.h#L75"]#75[/URL] add:
  389.  
  390. [CODE]
  391. bool FillXPlayersToBG(BattlegroundBracketId bracket_id, Battleground* bg, bool start = false);
  392. bool CheckCrossFactionMatch(BattlegroundBracketId bracket_id, Battleground* bg);
  393. [/CODE]
  394.  
  395. You're done with BattlegroundQueue.h. [COLOR="#FF8C00"]Open up and go to BattlegroundQueue.cpp..[/COLOR]
  396.  
  397. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L840"]#840[/URL], replace:
  398.  
  399. [CODE]
  400. if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
  401. || (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
  402. [/CODE]
  403.  
  404. with:
  405.  
  406. [CODE]
  407. if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
  408. || (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam))
  409. || CheckCrossFactionMatch(bracket_id, bg_template))
  410. [/CODE]
  411.  
  412.  
  413. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L747"]#747[/URL], replace:
  414.  
  415. [CODE]
  416. if (m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty() &&
  417. m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty() &&
  418. m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].empty() &&
  419. m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].empty())
  420. return;
  421. [/CODE]
  422.  
  423. with:
  424.  
  425. [CODE]
  426. if (m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty() &&
  427. m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty() &&
  428. m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].empty() &&
  429. m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].empty() &&
  430. m_QueuedGroups[bracket_id][BG_QUEUE_MIXED].empty())
  431. return;
  432. [/CODE]
  433.  
  434. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L501"]#501[/URL] add:
  435.  
  436. [CODE]
  437. if (!bg->isArena())
  438. if (FillXPlayersToBG(bracket_id, bg, false))
  439. return;
  440. [/CODE]
  441.  
  442. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L313"]#313[/URL], replace:
  443.  
  444. [CODE]
  445. for (uint32 j = index; j < BG_QUEUE_GROUP_TYPES_COUNT; j += BG_TEAMS_COUNT)
  446. [/CODE]
  447.  
  448. with:
  449.  
  450. [CODE]
  451. for (uint32 j = 0; j < BG_QUEUE_GROUP_TYPES_COUNT; ++j)
  452. [/CODE]
  453.  
  454. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L298"]#298[/URL], replace:
  455.  
  456. [CODE]
  457. TC_LOG_ERROR("bg.battleground", "BattlegroundQueue: couldn't find player %s (GUID: %u)", playerName.c_str(), GUID_LOPART(guid));
  458. [/CODE]
  459.  
  460. with:
  461.  
  462. [CODE]
  463. TC_LOG_DEBUG("bg.battleground", "BattlegroundQueue: couldn't find player %s (GUID: %u)", playerName.c_str(), GUID_LOPART(guid));
  464. [/CODE]
  465.  
  466. [COLOR="#00FF00"]READ CAREFULLY:[/COLOR]
  467.  
  468. Inside of [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L130"]GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, BattlegroundTypeId BgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid)[/URL]
  469.  
  470. On line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L143"]#143[/URL] replace:
  471.  
  472. [CODE] ginfo->Team = leader->GetTeam();[/CODE]
  473.  
  474. with:
  475.  
  476. [CODE]ginfo->Team = leader->GetBGTeam();[/CODE]
  477.  
  478. Above line [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L157"]#157[/URL] add:
  479.  
  480. [CODE]
  481. if (sWorld->getBoolConfig(CONFIG_CROSSFACTIONBG) && ArenaType == 0)
  482. index = BG_QUEUE_MIXED;
  483. [/CODE]
  484.  
  485. ON LINE [URL="https://github.com/TrinityCore/TrinityCore/blob/master/src/server/game/Battlegrounds/BattlegroundQueue.cpp#L200"]#200[/URL] replace:
  486.  
  487. [CODE]
  488. if (Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(ginfo->BgTypeId))
  489. {
  490. char const* bgName = bg->GetName();
  491. uint32 MinPlayers = bg->GetMinPlayersPerTeam();
  492. uint32 qHorde = 0;
  493. uint32 qAlliance = 0;
  494. uint32 q_min_level = bracketEntry->minLevel;
  495. uint32 q_max_level = bracketEntry->maxLevel;
  496. GroupsQueueType::const_iterator itr;
  497. for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)
  498. if (!(*itr)->IsInvitedToBGInstanceGUID)
  499. qAlliance += (*itr)->Players.size();
  500. for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].end(); ++itr)
  501. if (!(*itr)->IsInvitedToBGInstanceGUID)
  502. qHorde += (*itr)->Players.size();
  503.  
  504. // Show queue status to player only (when joining queue)
  505. if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
  506. {
  507. ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, bgName, q_min_level, q_max_level,
  508. qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  509. }
  510. // System message
  511. else
  512. {
  513. sWorld->SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bgName, q_min_level, q_max_level,
  514. qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  515. }
  516. }
  517. [/CODE]
  518.  
  519. with:
  520.  
  521. [CODE]
  522. if (Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(ginfo->BgTypeId))
  523. {
  524. if (sWorld->getBoolConfig(CONFIG_CROSSFACTIONBG))
  525. {
  526. char const* bgName = bg->GetName();
  527. uint32 MinPlayers = bg->GetMinPlayersPerTeam()*2;
  528. uint32 qPlayers = 0;
  529. uint32 q_min_level = bracketEntry->minLevel;
  530. uint32 q_max_level = bracketEntry->maxLevel;
  531. for (GroupsQueueType::const_iterator itr = m_QueuedGroups[bracketId][BG_QUEUE_MIXED].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_MIXED].end(); ++itr)
  532. if (!(*itr)->IsInvitedToBGInstanceGUID)
  533. qPlayers += (*itr)->Players.size();
  534.  
  535. if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
  536. {
  537. 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);
  538. }
  539. else
  540. {
  541. std::ostringstream ss;
  542. ss << "|cffff0000[BG Queue Announcer]:|r " << bgName << " -- [" << q_min_level << "-" << q_max_level << "]" << qPlayers << "/" << MinPlayers;
  543. sWorld->SendGlobalText(ss.str().c_str(), NULL);
  544. }
  545. }
  546. else
  547. {
  548. char const* bgName = bg->GetName();
  549. uint32 MinPlayers = bg->GetMinPlayersPerTeam();
  550. uint32 qHorde = 0;
  551. uint32 qAlliance = 0;
  552. uint32 q_min_level = bracketEntry->minLevel;
  553. uint32 q_max_level = bracketEntry->maxLevel;
  554. GroupsQueueType::const_iterator itr;
  555. for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)
  556. if (!(*itr)->IsInvitedToBGInstanceGUID)
  557. qAlliance += (*itr)->Players.size();
  558. for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].end(); ++itr)
  559. if (!(*itr)->IsInvitedToBGInstanceGUID)
  560. qHorde += (*itr)->Players.size();
  561.  
  562. // Show queue status to player only (when joining queue)
  563. if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
  564. {
  565. ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, bgName, q_min_level, q_max_level,
  566. qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  567. }
  568. // System message
  569. else
  570. {
  571. sWorld->SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bgName, q_min_level, q_max_level,
  572. qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
  573. }
  574. }
  575. }
  576. [/CODE]
  577.  
  578. [/INDENT]
  579.  
  580.  
  581. And that should be it! Enjoy. :)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement