Advertisement
Ladrek

Untitled

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