Advertisement
Guest User

Script #1

a guest
Mar 11th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.70 KB | None | 0 0
  1.  
  2.  
  3. #include "ScriptMgr.h"
  4. #include "ArenaTeamMgr.h"
  5. #include "Common.h"
  6. #include "DisableMgr.h"
  7. #include "BattlegroundMgr.h"
  8. #include "Battleground.h"
  9. #include "ArenaTeam.h"
  10. #include "Language.h"
  11. #include "npc_solo3v3.h"
  12. #include "BattlegroundQueue.h"
  13.  
  14.  
  15. class npc_solo3v3 : public CreatureScript
  16. {
  17. public:
  18. npc_solo3v3() : CreatureScript("npc_solo3v3")
  19. {
  20. for (int i = 0; i < MAX_TALENT_CAT; i++)
  21. cache3v3Queue[i] = 0;
  22.  
  23. lastFetchQueueList = 0;
  24. }
  25.  
  26. bool OnGossipHello(Player* player, Creature* me)
  27. {
  28. if(!player || !me)
  29. return true;
  30.  
  31. if (sWorld->getBoolConfig(CONFIG_SOLO_3V3_ENABLE) == false)
  32. {
  33. ChatHandler(player->GetSession()).SendSysMessage("Arena disabled!");
  34. return true;
  35. }
  36.  
  37. fetchQueueList();
  38. std::stringstream infoQueue;
  39. infoQueue << "Solo 3vs3 Arena\n";
  40. infoQueue << "Queued Players: " << (cache3v3Queue[MELEE] + cache3v3Queue[RANGE] + cache3v3Queue[HEALER]);
  41.  
  42. if (sWorld->getBoolConfig(CONFIG_SOLO_3V3_FILTER_TALENTS))
  43. {
  44. infoQueue << "\n\n";
  45. infoQueue << "Queued Melees: " << cache3v3Queue[MELEE] << " (Longer Queues!)" << "\n";
  46. infoQueue << "Queued Casters: " << cache3v3Queue[RANGE] << " (Longer Queues!)" << "\n";
  47. infoQueue << "Queued Healers: " << cache3v3Queue[HEALER] << " (Bonus Rewards!)" << "\n";
  48. }
  49.  
  50. if (player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5)
  51. || player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_3v3_SOLO))
  52. player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Leave Solo queue", GOSSIP_SENDER_MAIN, 3, "Are you sure you want to remove the solo queue?", 0, false);
  53.  
  54. if(player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_5v5)) == NULL)
  55. player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Create new Solo arena team", GOSSIP_SENDER_MAIN, 1, "Create new solo arena team?", sWorld->getIntConfig(CONFIG_SOLO_3V3_COSTS), false);
  56. else
  57. {
  58. if (player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5) == false &&
  59. player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_3v3_SOLO) == false)
  60. {
  61. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "Queue up for 1vs1 Wargame\n", GOSSIP_SENDER_MAIN, 20);
  62. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "Queue up for 3vs3 Arena Solo\n", GOSSIP_SENDER_MAIN, 2);
  63. }
  64. }
  65.  
  66. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, infoQueue.str().c_str(), GOSSIP_SENDER_MAIN, 0);
  67. player->SEND_GOSSIP_MENU(60015, me->GetGUID());
  68. return true;
  69. }
  70.  
  71.  
  72.  
  73. bool OnGossipSelect(Player* player, Creature* me, uint32 /*uiSender*/, uint32 uiAction)
  74. {
  75. if(!player || !me)
  76. return true;
  77.  
  78. player->PlayerTalkClass->ClearMenus();
  79.  
  80. switch (uiAction)
  81. {
  82. case 1: // Create new Arenateam
  83. {
  84. if (sWorld->getIntConfig(CONFIG_SOLO_3V3_MIN_LEVEL) <= player->getLevel())
  85. {
  86. if (player->GetMoney() >= sWorld->getIntConfig(CONFIG_SOLO_3V3_COSTS) && CreateArenateam(player, me))
  87. player->ModifyMoney(sWorld->getIntConfig(CONFIG_SOLO_3V3_COSTS) * -1);
  88. }
  89. else
  90. {
  91. ChatHandler(player->GetSession()).PSendSysMessage("You need level %u+ to create an arena team.", sWorld->getIntConfig(CONFIG_SOLO_3V3_MIN_LEVEL));
  92. player->CLOSE_GOSSIP_MENU();
  93. return true;
  94. }
  95. }
  96. break;
  97.  
  98. case 2: // 3v3 Join Queue Arena (rated)
  99. {
  100. // check Deserter debuff
  101. if (player->HasAura(26013) &&
  102. (sWorld->getBoolConfig(CONFIG_SOLO_3V3_CAST_DESERTER_ON_AFK) || sWorld->getBoolConfig(CONFIG_SOLO_3V3_CAST_DESERTER_ON_LEAVE)))
  103. {
  104. WorldPacket data;
  105. sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS);
  106. player->GetSession()->SendPacket(&data);
  107. }
  108. else
  109. if (ArenaCheckFullEquipAndTalents(player)
  110. && JoinQueueArena(player, me, true, ARENA_TYPE_3v3_SOLO) == false)
  111. ChatHandler(player->GetSession()).SendSysMessage("Something went wrong while joining queue. Already in another queue?");
  112.  
  113. player->CLOSE_GOSSIP_MENU();
  114. return true;
  115. }
  116.  
  117. case 20: // 1v1 Join Queue Arena (rated)
  118. {
  119. if (ArenaCheckFullEquipAndTalents(player) && Arena1v1CheckTalents(player)
  120. && JoinQueueArena(player, me, true, ARENA_TYPE_5v5) == false)
  121. ChatHandler(player->GetSession()).SendSysMessage("Something went wrong while joining queue. Already in another queue?");
  122.  
  123. player->CLOSE_GOSSIP_MENU();
  124. return true;
  125. }
  126.  
  127. case 3: // Leave Queue
  128. {
  129. uint8 arenaType = ARENA_TYPE_5v5;
  130. if (player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_3v3_SOLO))
  131. arenaType = ARENA_TYPE_3v3_SOLO;
  132.  
  133. WorldPacket Data;
  134. Data << arenaType << (uint8)0x0 << (uint32)BATTLEGROUND_AA << (uint16)0x0 << (uint8)0x0;
  135. player->GetSession()->HandleBattleFieldPortOpcode(Data);
  136. player->CLOSE_GOSSIP_MENU();
  137. return true;
  138. }
  139. }
  140.  
  141. OnGossipHello(player, me);
  142. return true;
  143. }
  144.  
  145. private:
  146. int cache3v3Queue[MAX_TALENT_CAT];
  147. uint32 lastFetchQueueList;
  148.  
  149. bool ArenaCheckFullEquipAndTalents(Player* player)
  150. {
  151. if (!player)
  152. return false;
  153.  
  154. if (sWorld->getBoolConfig(CONFIG_ARENA_CHECK_EQUIP_AND_TALENTS) == false)
  155. return true;
  156.  
  157. std::stringstream err;
  158.  
  159. if (player->GetFreeTalentPoints() > 0)
  160. err << "You have currently " << player->GetFreeTalentPoints() << " free talent points. Please spend all your talent points before queueing arena.\n";
  161.  
  162. Item* newItem = NULL;
  163. for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
  164. {
  165. if (slot == EQUIPMENT_SLOT_OFFHAND || slot == EQUIPMENT_SLOT_RANGED || slot == EQUIPMENT_SLOT_TABARD || slot == EQUIPMENT_SLOT_BODY)
  166. continue;
  167.  
  168. newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
  169. if (newItem == NULL)
  170. {
  171. err << "Your character is not fully equipped.\n";
  172. break;
  173. }
  174. }
  175.  
  176. if (err.str().length() > 0)
  177. {
  178. ChatHandler(player->GetSession()).SendSysMessage(err.str().c_str());
  179. return false;
  180. }
  181. return true;
  182. }
  183.  
  184. bool JoinQueueArena(Player* player, Creature* me, bool isRated, uint8 arenatype)
  185. {
  186. if (!player || !me)
  187. return false;
  188.  
  189. if (sWorld->getIntConfig(CONFIG_SOLO_3V3_MIN_LEVEL) > player->getLevel())
  190. return false;
  191.  
  192. uint64 guid = player->GetGUID();
  193. uint8 arenaslot = ArenaTeam::GetSlotByType(ARENA_TEAM_5v5);
  194. uint32 arenaRating = 0;
  195. uint32 matchmakerRating = 0;
  196.  
  197. // ignore if we already in BG or BG queue
  198. if (player->InBattleground() || player->InBattlegroundQueue())
  199. return false;
  200.  
  201. //check existance
  202. Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA);
  203. if (!bg)
  204. return false;
  205.  
  206. if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, BATTLEGROUND_AA, NULL))
  207. {
  208. ChatHandler(player->GetSession()).PSendSysMessage(LANG_ARENA_DISABLED);
  209. return false;
  210. }
  211.  
  212. BattlegroundTypeId bgTypeId = bg->GetTypeID();
  213. BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype);
  214. PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), player->getLevel());
  215. if (!bracketEntry)
  216. return false;
  217.  
  218. // check if already in queue
  219. if (player->GetBattlegroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES)
  220. //player is already in this queue
  221. return false;
  222. // check if has free queue slots
  223. if (!player->HasFreeBattlegroundQueueId())
  224. return false;
  225.  
  226. uint32 ateamId = 0;
  227.  
  228. if (isRated)
  229. {
  230. ateamId = player->GetArenaTeamId(arenaslot);
  231. ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId);
  232. if (!at)
  233. {
  234. player->GetSession()->SendNotInArenaTeamPacket(arenatype);
  235. return false;
  236. }
  237.  
  238. // get the team rating for queueing
  239. arenaRating = at->GetRating();
  240. matchmakerRating = at->GetAverageMMR();
  241. // the arenateam id must match for everyone in the group
  242.  
  243. if (arenaRating <= 0)
  244. arenaRating = 1;
  245. }
  246.  
  247. //BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
  248. BattlegroundQueue &bgQueue = sBattlegroundMgr->m_BattlegroundQueues[bgQueueTypeId];
  249. bg->SetRated(isRated);
  250.  
  251. GroupQueueInfo* ginfo = bgQueue.AddGroup(player, NULL, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, matchmakerRating, ateamId);
  252. uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
  253. uint32 queueSlot = player->AddBattlegroundQueueId(bgQueueTypeId);
  254.  
  255. WorldPacket data;
  256. // send status packet (in queue)
  257. sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype, 0);
  258. player->GetSession()->SendPacket(&data);
  259.  
  260. sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
  261.  
  262. return true;
  263. }
  264.  
  265. bool CreateArenateam(Player* player, Creature* me)
  266. {
  267. if (!player || !me)
  268. return false;
  269.  
  270. uint8 slot = ArenaTeam::GetSlotByType(ARENA_TEAM_5v5);
  271. if (slot >= MAX_ARENA_SLOT)
  272. return false;
  273.  
  274. // Check if player is already in an arena team
  275. if (player->GetArenaTeamId(slot))
  276. {
  277. player->GetSession()->SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, player->GetName(), "", ERR_ALREADY_IN_ARENA_TEAM);
  278. return false;
  279. }
  280.  
  281. // Teamname = playername
  282. // if team name exist, we have to choose another name (playername + number)
  283. int i = 1;
  284. std::stringstream teamName;
  285. //teamName << "3vs3 Solo - " << player->GetName();
  286. teamName << player->GetName();
  287. do
  288. {
  289. if (sArenaTeamMgr->GetArenaTeamByName(teamName.str()) != NULL) // teamname exist, so choose another name
  290. {
  291. teamName.str(std::string());
  292. teamName << player->GetName() << i++;
  293. }
  294. else
  295. break;
  296. } while (i < 100); // should never happen
  297.  
  298. // Create arena team
  299. ArenaTeam* arenaTeam = new ArenaTeam();
  300.  
  301. if (!arenaTeam->Create(player->GetGUID(), ARENA_TEAM_5v5, teamName.str(), 4283124816, 45, 4294242303, 5, 4294705149))
  302. {
  303. delete arenaTeam;
  304. return false;
  305. }
  306.  
  307. // Register arena team
  308. sArenaTeamMgr->AddArenaTeam(arenaTeam);
  309. arenaTeam->AddMember(player->GetGUID());
  310.  
  311. ChatHandler(player->GetSession()).SendSysMessage("Arena team successful created!");
  312.  
  313. return true;
  314. }
  315.  
  316. void fetchQueueList()
  317. {
  318. if (GetMSTimeDiffToNow(lastFetchQueueList) < 1000)
  319. return; // prevent spamming
  320. lastFetchQueueList = getMSTime();
  321.  
  322. //BattlegroundQueue* queue = &sBattlegroundMgr->GetBattlegroundQueue(BATTLEGROUND_QUEUE_3v3_SOLO);
  323. BattlegroundQueue* queue = &sBattlegroundMgr->m_BattlegroundQueues[BATTLEGROUND_QUEUE_3v3_SOLO];
  324.  
  325. for (int i = 0; i < MAX_TALENT_CAT; i++)
  326. cache3v3Queue[i] = 0;
  327.  
  328. for (int i = BG_BRACKET_ID_FIRST; i <= BG_BRACKET_ID_LAST; i++)
  329. for (int j = 0; j < 2; j++)
  330. {
  331. for (BattlegroundQueue::GroupsQueueType::iterator itr = queue->m_QueuedGroups[i][j].begin(); itr != queue->m_QueuedGroups[i][j].end(); itr++)
  332. {
  333. if ((*itr)->IsInvitedToBGInstanceGUID) // Skip when invited
  334. continue;
  335.  
  336. std::map<uint64, PlayerQueueInfo*> *grpPlr = &(*itr)->Players;
  337. for (std::map<uint64, PlayerQueueInfo*>::iterator grpPlrItr = grpPlr->begin(); grpPlrItr != grpPlr->end(); grpPlrItr++)
  338. {
  339. Player* plr = sObjectAccessor->FindPlayer(grpPlrItr->first);
  340. if (!plr)
  341. continue;
  342.  
  343. Solo3v3TalentCat plrCat = GetTalentCatForSolo3v3(plr); // get talent cat
  344. cache3v3Queue[plrCat]++;
  345. }
  346. }
  347. }
  348. }
  349. };
  350.  
  351.  
  352. void AddSC_npc_solo3v3()
  353. {
  354. new npc_solo3v3();
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement