PageRenderTime 83ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/EQEmuServer/world/AdventureManager.cpp

http://projecteqemu.googlecode.com/
C++ | 2278 lines | 2032 code | 204 blank | 42 comment | 357 complexity | 51e576ed105848b8245d889e8789586a MD5 | raw file
Possible License(s): GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. #include "../common/debug.h"
  2. #include "../common/MiscFunctions.h"
  3. #include "../common/servertalk.h"
  4. #include "../common/rulesys.h"
  5. #include "Adventure.h"
  6. #include "AdventureManager.h"
  7. #include "worlddb.h"
  8. #include "zonelist.h"
  9. #include "clientlist.h"
  10. #include "cliententry.h"
  11. #include <sstream>
  12. #include <stdio.h>
  13. extern ZSList zoneserver_list;
  14. extern ClientList client_list;
  15. AdventureManager::AdventureManager()
  16. {
  17. process_timer = new Timer(500);
  18. save_timer = new Timer(90000);
  19. leaderboard_info_timer = new Timer(180000);
  20. }
  21. AdventureManager::~AdventureManager()
  22. {
  23. safe_delete(process_timer);
  24. safe_delete(save_timer);
  25. safe_delete(leaderboard_info_timer);
  26. }
  27. void AdventureManager::Process()
  28. {
  29. if(process_timer->Check())
  30. {
  31. list<Adventure*>::iterator iter = adventure_list.begin();
  32. while(iter != adventure_list.end())
  33. {
  34. if(!(*iter)->Process())
  35. {
  36. Adventure *adv = (*iter);
  37. iter = adventure_list.erase(iter);
  38. GetAdventureData(adv);
  39. delete adv;
  40. continue;
  41. }
  42. iter++;
  43. }
  44. }
  45. if(leaderboard_info_timer->Check())
  46. {
  47. LoadLeaderboardInfo();
  48. }
  49. if(save_timer->Check())
  50. {
  51. Save();
  52. }
  53. }
  54. void AdventureManager::CalculateAdventureRequestReply(const char *data)
  55. {
  56. ServerAdventureRequest_Struct *sar = (ServerAdventureRequest_Struct*)data;
  57. ClientListEntry *leader = client_list.FindCharacter(sar->leader);
  58. if(!leader)
  59. {
  60. return;
  61. }
  62. /**
  63. * This block checks to see if we actually have any adventures for the requested theme.
  64. */
  65. map<uint32, list<AdventureTemplate*> >::iterator adv_list_iter = adventure_entries.find(sar->template_id);
  66. if(adv_list_iter == adventure_entries.end())
  67. {
  68. ServerPacket *pack = new ServerPacket(ServerOP_AdventureRequestDeny, sizeof(ServerAdventureRequestDeny_Struct));
  69. ServerAdventureRequestDeny_Struct *deny = (ServerAdventureRequestDeny_Struct*)pack->pBuffer;
  70. strcpy(deny->leader, sar->leader);
  71. strcpy(deny->reason, "There are currently no adventures set for this theme.");
  72. pack->Deflate();
  73. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  74. delete pack;
  75. return;
  76. }
  77. /**
  78. * This block checks to see if our requested group has anyone with an "Active" adventure
  79. * Active being in progress, finished adventures that are still waiting to expire do not count
  80. * Though they will count against you for which new adventure you can get.
  81. */
  82. list<Adventure*>::iterator iter = adventure_list.begin();
  83. while(iter != adventure_list.end())
  84. {
  85. Adventure* current = (*iter);
  86. if(current->IsActive())
  87. {
  88. for(int i = 0; i < sar->member_count; ++i)
  89. {
  90. if(current->PlayerExists((data + sizeof(ServerAdventureRequest_Struct) + (64 * i))))
  91. {
  92. ServerPacket *pack = new ServerPacket(ServerOP_AdventureRequestDeny, sizeof(ServerAdventureRequestDeny_Struct));
  93. ServerAdventureRequestDeny_Struct *deny = (ServerAdventureRequestDeny_Struct*)pack->pBuffer;
  94. strcpy(deny->leader, sar->leader);
  95. stringstream ss(stringstream::out | stringstream::in);
  96. ss << (data + sizeof(ServerAdventureRequest_Struct) + (64 * i)) << " is already apart of an active adventure.";
  97. strcpy(deny->reason, ss.str().c_str());
  98. pack->Deflate();
  99. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  100. delete pack;
  101. return;
  102. }
  103. }
  104. }
  105. iter++;
  106. }
  107. /**
  108. * Now we need to get every available adventure for our selected theme and exclude ones we can't use.
  109. * ie. the ones that would cause overlap issues for new adventures with the old unexpired adventures.
  110. */
  111. list<AdventureZones> excluded_zones;
  112. list<AdventureZoneIn> excluded_zone_ins;
  113. for(int i = 0; i < sar->member_count; ++i)
  114. {
  115. int finished_adventures_count;
  116. Adventure **finished_adventures = GetFinishedAdventures((data + sizeof(ServerAdventureRequest_Struct) + (64 * i)), finished_adventures_count);
  117. for(int i = 0; i < finished_adventures_count; ++i)
  118. {
  119. if(!IsInExcludedZoneList(excluded_zones, finished_adventures[i]->GetTemplate()->zone, finished_adventures[i]->GetTemplate()->zone_version))
  120. {
  121. AdventureZones adv;
  122. adv.zone = finished_adventures[i]->GetTemplate()->zone;
  123. adv.version = finished_adventures[i]->GetTemplate()->zone_version;
  124. excluded_zones.push_back(adv);
  125. }
  126. if(!IsInExcludedZoneInList(excluded_zone_ins, finished_adventures[i]->GetTemplate()->zone_in_zone_id,
  127. finished_adventures[i]->GetTemplate()->zone_in_object_id))
  128. {
  129. AdventureZoneIn adv;
  130. adv.door_id = finished_adventures[i]->GetTemplate()->zone_in_object_id;
  131. adv.zone_id = finished_adventures[i]->GetTemplate()->zone_in_zone_id;
  132. excluded_zone_ins.push_back(adv);
  133. }
  134. }
  135. safe_delete_array(finished_adventures);
  136. }
  137. list<AdventureTemplate*> eligible_adventures = adventure_entries[sar->template_id];
  138. /**
  139. * Remove zones from eligible zones based on their difficulty and type.
  140. * ie only use difficult zones for difficult, collect for collect, etc.
  141. */
  142. list<AdventureTemplate*>::iterator ea_iter = eligible_adventures.begin();
  143. while(ea_iter != eligible_adventures.end())
  144. {
  145. if((*ea_iter)->is_hard != ((sar->risk == 2) ? true : false))
  146. {
  147. ea_iter = eligible_adventures.erase(ea_iter);
  148. continue;
  149. }
  150. if(sar->type != 0 && sar->type != (*ea_iter)->type)
  151. {
  152. ea_iter = eligible_adventures.erase(ea_iter);
  153. continue;
  154. }
  155. ea_iter++;
  156. }
  157. /**
  158. * Get levels for this group.
  159. */
  160. int valid_count = 0;
  161. int avg_level = 0;
  162. int min_level = 40000;
  163. int max_level = 0;
  164. for(int i = 0; i < sar->member_count; ++i)
  165. {
  166. ClientListEntry *current = client_list.FindCharacter((data + sizeof(ServerAdventureRequest_Struct) + (64 * i)));
  167. if(current)
  168. {
  169. int lvl = current->level();
  170. if(lvl != 0)
  171. {
  172. avg_level += lvl;
  173. valid_count++;
  174. if(lvl < min_level)
  175. {
  176. min_level = lvl;
  177. }
  178. if(lvl > max_level)
  179. {
  180. max_level = lvl;
  181. }
  182. }
  183. else
  184. {
  185. if(database.GetCharacterLevel((data + sizeof(ServerAdventureRequest_Struct) + (64 * i)), lvl))
  186. {
  187. avg_level += lvl;
  188. valid_count++;
  189. if(lvl < min_level)
  190. {
  191. min_level = lvl;
  192. }
  193. if(lvl > max_level)
  194. {
  195. max_level = lvl;
  196. }
  197. }
  198. }
  199. }
  200. else
  201. {
  202. int lvl = 0;
  203. if(database.GetCharacterLevel((data + sizeof(ServerAdventureRequest_Struct) + (64 * i)), lvl))
  204. {
  205. avg_level += lvl;
  206. valid_count++;
  207. if(lvl < min_level)
  208. {
  209. min_level = lvl;
  210. }
  211. if(lvl > max_level)
  212. {
  213. max_level = lvl;
  214. }
  215. }
  216. }
  217. }
  218. if(valid_count == 0)
  219. {
  220. ServerPacket *pack = new ServerPacket(ServerOP_AdventureRequestDeny, sizeof(ServerAdventureRequestDeny_Struct));
  221. ServerAdventureRequestDeny_Struct *deny = (ServerAdventureRequestDeny_Struct*)pack->pBuffer;
  222. strcpy(deny->leader, sar->leader);
  223. strcpy(deny->reason, "The number of found players for this adventure was zero.");
  224. pack->Deflate();
  225. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  226. delete pack;
  227. return;
  228. }
  229. avg_level = avg_level / valid_count;
  230. if(max_level - min_level > RuleI(Adventure, MaxLevelRange))
  231. {
  232. ServerPacket *pack = new ServerPacket(ServerOP_AdventureRequestDeny, sizeof(ServerAdventureRequestDeny_Struct));
  233. ServerAdventureRequestDeny_Struct *deny = (ServerAdventureRequestDeny_Struct*)pack->pBuffer;
  234. strcpy(deny->leader, sar->leader);
  235. stringstream ss(stringstream::out | stringstream::in);
  236. ss << "The maximum level range for this adventure is " << RuleI(Adventure, MaxLevelRange);
  237. ss << " but the level range calculated was " << (max_level - min_level) << ".";
  238. strcpy(deny->reason, ss.str().c_str());
  239. pack->Deflate();
  240. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  241. delete pack;
  242. return;
  243. }
  244. /**
  245. * Remove the zones from our eligible zones based on the exclusion above
  246. */
  247. list<AdventureZones>::iterator ez_iter = excluded_zones.begin();
  248. while(ez_iter != excluded_zones.end())
  249. {
  250. list<AdventureTemplate*>::iterator ea_iter = eligible_adventures.begin();
  251. while(ea_iter != eligible_adventures.end())
  252. {
  253. if((*ez_iter).zone.compare((*ea_iter)->zone) == 0 && (*ez_iter).version == (*ea_iter)->zone_version)
  254. {
  255. ea_iter = eligible_adventures.erase(ea_iter);
  256. continue;
  257. }
  258. ea_iter++;
  259. }
  260. ez_iter++;
  261. }
  262. list<AdventureZoneIn>::iterator ezi_iter = excluded_zone_ins.begin();
  263. while(ezi_iter != excluded_zone_ins.end())
  264. {
  265. list<AdventureTemplate*>::iterator ea_iter = eligible_adventures.begin();
  266. while(ea_iter != eligible_adventures.end())
  267. {
  268. if((*ezi_iter).zone_id == (*ea_iter)->zone_in_zone_id && (*ezi_iter).door_id == (*ea_iter)->zone_in_object_id)
  269. {
  270. ea_iter = eligible_adventures.erase(ea_iter);
  271. continue;
  272. }
  273. ea_iter++;
  274. }
  275. ezi_iter++;
  276. }
  277. /**
  278. * Remove Zones based on level
  279. */
  280. ea_iter = eligible_adventures.begin();
  281. while(ea_iter != eligible_adventures.end())
  282. {
  283. if((*ea_iter)->min_level > avg_level)
  284. {
  285. ea_iter = eligible_adventures.erase(ea_iter);
  286. continue;
  287. }
  288. if((*ea_iter)->max_level < avg_level)
  289. {
  290. ea_iter = eligible_adventures.erase(ea_iter);
  291. continue;
  292. }
  293. ea_iter++;
  294. }
  295. if(eligible_adventures.size() > 0)
  296. {
  297. ea_iter = eligible_adventures.begin();
  298. int c_index = MakeRandomInt(0, (eligible_adventures.size()-1));
  299. for(int i = 0; i < c_index; ++i)
  300. {
  301. ea_iter++;
  302. }
  303. ServerPacket *pack = new ServerPacket(ServerOP_AdventureRequestAccept, sizeof(ServerAdventureRequestAccept_Struct) + (sar->member_count * 64));
  304. ServerAdventureRequestAccept_Struct *sra = (ServerAdventureRequestAccept_Struct*)pack->pBuffer;
  305. strcpy(sra->leader, sar->leader);
  306. strcpy(sra->text, (*ea_iter)->text);
  307. sra->theme = sar->template_id;
  308. sra->id = (*ea_iter)->id;
  309. sra->member_count = sar->member_count;
  310. memcpy((pack->pBuffer + sizeof(ServerAdventureRequestAccept_Struct)), (data + sizeof(ServerAdventureRequest_Struct)), (sar->member_count * 64));
  311. pack->Deflate();
  312. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  313. delete pack;
  314. return;
  315. }
  316. else
  317. {
  318. ServerPacket *pack = new ServerPacket(ServerOP_AdventureRequestDeny, sizeof(ServerAdventureRequestDeny_Struct));
  319. ServerAdventureRequestDeny_Struct *deny = (ServerAdventureRequestDeny_Struct*)pack->pBuffer;
  320. strcpy(deny->leader, sar->leader);
  321. strcpy(deny->reason, "The number of adventures returned was zero.");
  322. pack->Deflate();
  323. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  324. delete pack;
  325. return;
  326. }
  327. }
  328. void AdventureManager::TryAdventureCreate(const char *data)
  329. {
  330. ServerAdventureRequestCreate_Struct *src = (ServerAdventureRequestCreate_Struct*)data;
  331. ClientListEntry *leader = client_list.FindCharacter(src->leader);
  332. if(!leader)
  333. {
  334. return;
  335. }
  336. AdventureTemplate *adv_template = GetAdventureTemplate(src->theme, src->id);
  337. if(!adv_template)
  338. {
  339. ServerPacket *pack = new ServerPacket(ServerOP_AdventureCreateDeny, 64);
  340. strcpy((char*)pack->pBuffer, src->leader);
  341. pack->Deflate();
  342. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  343. delete pack;
  344. return;
  345. }
  346. Adventure *adv = new Adventure(adv_template);
  347. if(!adv->CreateInstance())
  348. {
  349. ServerPacket *pack = new ServerPacket(ServerOP_AdventureCreateDeny, 64);
  350. strcpy((char*)pack->pBuffer, src->leader);
  351. pack->Deflate();
  352. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  353. delete pack;
  354. delete adv;
  355. return;
  356. }
  357. for(int i = 0; i < src->member_count; ++i)
  358. {
  359. Adventure *a = GetActiveAdventure((data + sizeof(ServerAdventureRequestCreate_Struct) + (64 * i)));
  360. if(a)
  361. {
  362. ServerPacket *pack = new ServerPacket(ServerOP_AdventureCreateDeny, 64);
  363. strcpy((char*)pack->pBuffer, src->leader);
  364. pack->Deflate();
  365. zoneserver_list.SendPacket(leader->zone(), leader->instance(), pack);
  366. delete pack;
  367. delete adv;
  368. return;
  369. }
  370. adv->AddPlayer((data + sizeof(ServerAdventureRequestCreate_Struct) + (64 * i)));
  371. }
  372. //Need to send adventure data to zone server for each client.
  373. for(int i = 0; i < src->member_count; ++i)
  374. {
  375. ClientListEntry *player = client_list.FindCharacter((data + sizeof(ServerAdventureRequestCreate_Struct) + (64 * i)));
  376. if(player)
  377. {
  378. int f_count = 0;
  379. Adventure** finished_adventures = GetFinishedAdventures((data + sizeof(ServerAdventureRequestCreate_Struct) + (64 * i)), f_count);
  380. ServerPacket *pack = new ServerPacket(ServerOP_AdventureData, sizeof(ServerSendAdventureData_Struct)
  381. + (sizeof(ServerFinishedAdventures_Struct) * f_count));
  382. ServerSendAdventureData_Struct *sca = (ServerSendAdventureData_Struct*)pack->pBuffer;
  383. strcpy(sca->player, (data + sizeof(ServerAdventureRequestCreate_Struct) + (64 * i)));
  384. strcpy(sca->text, adv_template->text);
  385. sca->time_left = adv_template->zone_in_time;
  386. sca->time_to_enter = adv_template->zone_in_time;
  387. sca->risk = adv_template->is_hard ? 1 : 0;
  388. sca->x = adv_template->zone_in_x;
  389. sca->y = adv_template->zone_in_y;
  390. sca->zone_in_id = adv_template->zone_in_zone_id;
  391. sca->zone_in_object = adv_template->zone_in_object_id;
  392. sca->instance_id = adv->GetInstanceID();
  393. sca->count = 0;
  394. sca->total = adv_template->type_count;
  395. sca->finished_adventures = f_count;
  396. for(int f = 0; f < f_count; ++f)
  397. {
  398. ServerFinishedAdventures_Struct *sfa = (ServerFinishedAdventures_Struct*)(pack->pBuffer
  399. + sizeof(ServerSendAdventureData_Struct)
  400. + (sizeof(ServerFinishedAdventures_Struct) * f));
  401. sfa->zone_in_id = finished_adventures[f]->GetTemplate()->zone_in_zone_id;
  402. sfa->zone_in_object = finished_adventures[f]->GetTemplate()->zone_in_object_id;
  403. }
  404. pack->Deflate();
  405. zoneserver_list.SendPacket(player->zone(), player->instance(), pack);
  406. safe_delete_array(finished_adventures);
  407. delete pack;
  408. }
  409. }
  410. adventure_list.push_back(adv);
  411. }
  412. void AdventureManager::GetAdventureData(Adventure *adv)
  413. {
  414. list<string> player_list = adv->GetPlayers();
  415. list<string>::iterator iter = player_list.begin();
  416. while(iter != player_list.end())
  417. {
  418. GetAdventureData((*iter).c_str());
  419. iter++;
  420. }
  421. }
  422. void AdventureManager::GetAdventureData(const char *name)
  423. {
  424. ClientListEntry *player = client_list.FindCharacter(name);
  425. if(player)
  426. {
  427. int f_count = 0;
  428. Adventure** finished_adventures = GetFinishedAdventures(name, f_count);
  429. Adventure *current = GetActiveAdventure(name);
  430. ServerPacket *pack = new ServerPacket(ServerOP_AdventureData, sizeof(ServerSendAdventureData_Struct)
  431. + (sizeof(ServerFinishedAdventures_Struct) * f_count));
  432. ServerSendAdventureData_Struct *sca = (ServerSendAdventureData_Struct*)pack->pBuffer;
  433. if(current)
  434. {
  435. const AdventureTemplate *adv_template = current->GetTemplate();
  436. strcpy(sca->player, name);
  437. strcpy(sca->text, adv_template->text);
  438. sca->risk = adv_template->is_hard ? 1 : 0;
  439. sca->x = adv_template->zone_in_x;
  440. sca->y = adv_template->zone_in_y;
  441. sca->zone_in_id = adv_template->zone_in_zone_id;
  442. sca->zone_in_object = adv_template->zone_in_object_id;
  443. sca->count = current->GetCount();
  444. sca->total = adv_template->type_count;
  445. sca->time_left = current->GetRemainingTime();
  446. if(current->GetStatus() == AS_WaitingForZoneIn)
  447. {
  448. sca->time_to_enter = sca->time_left;
  449. }
  450. }
  451. else
  452. {
  453. //We have no mission and no finished missions
  454. //Delete our stuff and return instead of sending a blank packet.
  455. if(f_count == 0)
  456. {
  457. delete pack;
  458. ServerPacket *pack = new ServerPacket(ServerOP_AdventureDataClear, 64);
  459. strcpy((char*)pack->pBuffer, name);
  460. pack->Deflate();
  461. zoneserver_list.SendPacket(player->zone(), player->instance(), pack);
  462. delete pack;
  463. delete[] finished_adventures;
  464. return;
  465. }
  466. }
  467. sca->finished_adventures = f_count;
  468. for(int i = 0; i < f_count; ++i)
  469. {
  470. ServerFinishedAdventures_Struct *sfa = (ServerFinishedAdventures_Struct*)(pack->pBuffer
  471. + sizeof(ServerSendAdventureData_Struct)
  472. + (sizeof(ServerFinishedAdventures_Struct) * i));
  473. sfa->zone_in_id = finished_adventures[i]->GetTemplate()->zone_in_zone_id;
  474. sfa->zone_in_object = finished_adventures[i]->GetTemplate()->zone_in_object_id;
  475. }
  476. pack->Deflate();
  477. zoneserver_list.SendPacket(player->zone(), player->instance(), pack);
  478. safe_delete_array(finished_adventures);
  479. delete pack;
  480. delete[] finished_adventures;
  481. }
  482. }
  483. bool AdventureManager::IsInExcludedZoneList(list<AdventureZones> excluded_zones, string zone_name, int version)
  484. {
  485. list<AdventureZones>::iterator iter = excluded_zones.begin();
  486. while(iter != excluded_zones.end())
  487. {
  488. if(((*iter).zone.compare(zone_name) == 0) && ((*iter).version == version))
  489. {
  490. return true;
  491. }
  492. iter++;
  493. }
  494. return false;
  495. }
  496. bool AdventureManager::IsInExcludedZoneInList(list<AdventureZoneIn> excluded_zone_ins, int zone_id, int door_object)
  497. {
  498. list<AdventureZoneIn>::iterator iter = excluded_zone_ins.begin();
  499. while(iter != excluded_zone_ins.end())
  500. {
  501. if(((*iter).zone_id == zone_id) && ((*iter).door_id == door_object))
  502. {
  503. return true;
  504. }
  505. iter++;
  506. }
  507. return false;
  508. }
  509. Adventure **AdventureManager::GetFinishedAdventures(const char *player, int &count)
  510. {
  511. Adventure **ret = NULL;
  512. count = 0;
  513. list<Adventure*>::iterator iter = adventure_list.begin();
  514. while(iter != adventure_list.end())
  515. {
  516. if((*iter)->PlayerExists(player))
  517. {
  518. if(!(*iter)->IsActive())
  519. {
  520. if(ret)
  521. {
  522. Adventure **t = new Adventure*[count + 1];
  523. for(int i = 0; i < count; i++)
  524. {
  525. t[i] = ret[i];
  526. }
  527. t[count] = (*iter);
  528. delete[] ret;
  529. ret = t;
  530. }
  531. else
  532. {
  533. ret = new Adventure*[1];
  534. ret[0] = (*iter);
  535. }
  536. count++;
  537. }
  538. }
  539. iter++;
  540. }
  541. return ret;
  542. }
  543. Adventure *AdventureManager::GetActiveAdventure(const char *player)
  544. {
  545. list<Adventure*>::iterator iter = adventure_list.begin();
  546. while(iter != adventure_list.end())
  547. {
  548. if((*iter)->PlayerExists(player) && (*iter)->IsActive())
  549. {
  550. return (*iter);
  551. }
  552. iter++;
  553. }
  554. return NULL;
  555. }
  556. AdventureTemplate *AdventureManager::GetAdventureTemplate(int theme, int id)
  557. {
  558. map<uint32, list<AdventureTemplate*> >::iterator iter = adventure_entries.find(theme);
  559. if(iter == adventure_entries.end())
  560. {
  561. return NULL;
  562. }
  563. list<AdventureTemplate*>::iterator l_iter = (*iter).second.begin();
  564. while(l_iter != (*iter).second.end())
  565. {
  566. if((*l_iter)->id == id)
  567. {
  568. return (*l_iter);
  569. }
  570. l_iter++;
  571. }
  572. return NULL;
  573. }
  574. AdventureTemplate *AdventureManager::GetAdventureTemplate(int id)
  575. {
  576. map<uint32, AdventureTemplate*>::iterator iter = adventure_templates.find(id);
  577. if(iter == adventure_templates.end())
  578. {
  579. return NULL;
  580. }
  581. return iter->second;
  582. }
  583. bool AdventureManager::LoadAdventureTemplates()
  584. {
  585. char errbuf[MYSQL_ERRMSG_SIZE];
  586. char* query = 0;
  587. MYSQL_RES *result;
  588. MYSQL_ROW row;
  589. if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, zone, zone_version, "
  590. "is_hard, min_level, max_level, type, type_data, type_count, assa_x, "
  591. "assa_y, assa_z, assa_h, text, duration, zone_in_time, win_points, lose_points, "
  592. "theme, zone_in_zone_id, zone_in_x, zone_in_y, zone_in_object_id, dest_x, dest_y,"
  593. " dest_z, dest_h, graveyard_zone_id, graveyard_x, graveyard_y, graveyard_z, "
  594. "graveyard_radius FROM adventure_template"), errbuf, &result))
  595. {
  596. while((row = mysql_fetch_row(result)))
  597. {
  598. uint8 x = 0;
  599. AdventureTemplate *t = new AdventureTemplate;
  600. t->id = atoi(row[x++]);
  601. strcpy(t->zone, row[x++]);
  602. t->zone_version = atoi(row[x++]);
  603. t->is_hard = atoi(row[x++]);
  604. t->min_level = atoi(row[x++]);
  605. t->max_level = atoi(row[x++]);
  606. t->type = atoi(row[x++]);
  607. t->type_data = atoi(row[x++]);
  608. t->type_count = atoi(row[x++]);
  609. t->assa_x = atof(row[x++]);
  610. t->assa_y = atof(row[x++]);
  611. t->assa_z = atof(row[x++]);
  612. t->assa_h = atof(row[x++]);
  613. strn0cpy(t->text, row[x++], sizeof(t->text));
  614. t->duration = atoi(row[x++]);
  615. t->zone_in_time = atoi(row[x++]);
  616. t->win_points = atoi(row[x++]);
  617. t->lose_points = atoi(row[x++]);
  618. t->theme = atoi(row[x++]);
  619. t->zone_in_zone_id = atoi(row[x++]);
  620. t->zone_in_x = atof(row[x++]);
  621. t->zone_in_y = atof(row[x++]);
  622. t->zone_in_object_id = atoi(row[x++]);
  623. t->dest_x = atof(row[x++]);
  624. t->dest_y = atof(row[x++]);
  625. t->dest_z = atof(row[x++]);
  626. t->dest_h = atof(row[x++]);
  627. t->graveyard_zone_id = atoi(row[x++]);
  628. t->graveyard_x = atof(row[x++]);
  629. t->graveyard_y = atof(row[x++]);
  630. t->graveyard_z = atof(row[x++]);
  631. t->graveyard_radius = atof(row[x++]);
  632. adventure_templates[t->id] = t;
  633. }
  634. mysql_free_result(result);
  635. safe_delete_array(query);
  636. return true;
  637. }
  638. else
  639. {
  640. LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::LoadAdventures: %s (%s)", query, errbuf);
  641. safe_delete_array(query);
  642. return false;
  643. }
  644. return false;
  645. }
  646. bool AdventureManager::LoadAdventureEntries()
  647. {
  648. char errbuf[MYSQL_ERRMSG_SIZE];
  649. char* query = 0;
  650. MYSQL_RES *result;
  651. MYSQL_ROW row;
  652. if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, template_id FROM adventure_template_entry"), errbuf, &result))
  653. {
  654. while((row = mysql_fetch_row(result)))
  655. {
  656. int id = atoi(row[0]);
  657. int template_id = atoi(row[1]);
  658. AdventureTemplate* tid = NULL;
  659. map<uint32, AdventureTemplate*>::iterator t_iter = adventure_templates.find(template_id);
  660. if(t_iter == adventure_templates.end())
  661. {
  662. continue;
  663. }
  664. else
  665. {
  666. tid = adventure_templates[template_id];
  667. }
  668. list<AdventureTemplate*> temp;
  669. map<uint32, list<AdventureTemplate*> >::iterator iter = adventure_entries.find(id);
  670. if(iter == adventure_entries.end())
  671. {
  672. temp.push_back(tid);
  673. adventure_entries[id] = temp;
  674. }
  675. else
  676. {
  677. temp = adventure_entries[id];
  678. temp.push_back(tid);
  679. adventure_entries[id] = temp;
  680. }
  681. }
  682. mysql_free_result(result);
  683. safe_delete_array(query);
  684. return true;
  685. }
  686. else
  687. {
  688. LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::LoadAdventureEntries: %s (%s)", query, errbuf);
  689. safe_delete_array(query);
  690. return false;
  691. }
  692. return false;
  693. }
  694. void AdventureManager::PlayerClickedDoor(const char *player, int zone_id, int door_id)
  695. {
  696. list<Adventure*>::iterator iter = adventure_list.begin();
  697. while(iter != adventure_list.end())
  698. {
  699. const AdventureTemplate *t = (*iter)->GetTemplate();
  700. if(t->zone_in_zone_id == zone_id && t->zone_in_object_id == door_id)
  701. {
  702. if((*iter)->PlayerExists(player))
  703. {
  704. ClientListEntry *pc = client_list.FindCharacter(player);
  705. if(pc)
  706. {
  707. ServerPacket *pack = new ServerPacket(ServerOP_AdventureClickDoorReply, sizeof(ServerPlayerClickedAdventureDoorReply_Struct));
  708. ServerPlayerClickedAdventureDoorReply_Struct *sr = (ServerPlayerClickedAdventureDoorReply_Struct*)pack->pBuffer;
  709. strcpy(sr->player, player);
  710. sr->zone_id = database.GetZoneID(t->zone);
  711. sr->instance_id = (*iter)->GetInstanceID();
  712. sr->x = t->dest_x;
  713. sr->y = t->dest_y;
  714. sr->z = t->dest_z;
  715. sr->h = t->dest_h;
  716. if((*iter)->GetStatus() == AS_WaitingForZoneIn)
  717. {
  718. (*iter)->SetStatus(AS_WaitingForPrimaryEndTime);
  719. }
  720. pack->Deflate();
  721. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  722. safe_delete(pack);
  723. }
  724. return;
  725. }
  726. }
  727. iter++;
  728. }
  729. ClientListEntry *pc = client_list.FindCharacter(player);
  730. if(pc)
  731. {
  732. ServerPacket *pack = new ServerPacket(ServerOP_AdventureClickDoorError, 64);
  733. strcpy((char*)pack->pBuffer, player);
  734. pack->Deflate();
  735. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  736. safe_delete(pack);
  737. }
  738. }
  739. void AdventureManager::LeaveAdventure(const char *name)
  740. {
  741. ClientListEntry *pc = client_list.FindCharacter(name);
  742. if(pc)
  743. {
  744. Adventure *current = GetActiveAdventure(name);
  745. if(current)
  746. {
  747. if(pc->instance() != 0 && pc->instance() == current->GetInstanceID())
  748. {
  749. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaveDeny, 64);
  750. strcpy((char*)pack->pBuffer, name);
  751. pack->Deflate();
  752. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  753. safe_delete(pack);
  754. }
  755. else
  756. {
  757. if(current->GetStatus() != AS_WaitingForZoneIn)
  758. {
  759. database.UpdateAdventureStatsEntry(database.GetCharacterID(name), current->GetTemplate()->theme, false);
  760. }
  761. current->RemovePlayer(name);
  762. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaveReply, 64);
  763. strcpy((char*)pack->pBuffer, name);
  764. pack->Deflate();
  765. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  766. safe_delete(pack);
  767. }
  768. }
  769. else
  770. {
  771. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaveReply, 64);
  772. strcpy((char*)pack->pBuffer, name);
  773. pack->Deflate();
  774. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  775. safe_delete(pack);
  776. }
  777. }
  778. }
  779. void AdventureManager::IncrementCount(uint16 instance_id)
  780. {
  781. list<Adventure*>::iterator iter = adventure_list.begin();
  782. Adventure *current = NULL;
  783. while(iter != adventure_list.end())
  784. {
  785. if((*iter)->GetInstanceID() == instance_id)
  786. {
  787. current = (*iter);
  788. break;
  789. }
  790. iter++;
  791. }
  792. if(current)
  793. {
  794. current->IncrementCount();
  795. list<string> slist = current->GetPlayers();
  796. list<string>::iterator siter = slist.begin();
  797. ServerPacket *pack = new ServerPacket(ServerOP_AdventureCountUpdate, sizeof(ServerAdventureCountUpdate_Struct));
  798. ServerAdventureCountUpdate_Struct *ac = (ServerAdventureCountUpdate_Struct*)pack->pBuffer;
  799. ac->count = current->GetCount();
  800. ac->total = current->GetTemplate()->type_count;
  801. while(siter != slist.end())
  802. {
  803. ClientListEntry *pc = client_list.FindCharacter((*siter).c_str());
  804. if(pc)
  805. {
  806. memset(ac->player, 0, 64);
  807. strcpy(ac->player, (*siter).c_str());
  808. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  809. }
  810. siter++;
  811. }
  812. delete pack;
  813. }
  814. }
  815. void AdventureManager::IncrementAssassinationCount(uint16 instance_id)
  816. {
  817. list<Adventure*>::iterator iter = adventure_list.begin();
  818. Adventure *current = NULL;
  819. while(iter != adventure_list.end())
  820. {
  821. if((*iter)->GetInstanceID() == instance_id)
  822. {
  823. current = (*iter);
  824. break;
  825. }
  826. iter++;
  827. }
  828. if(current)
  829. {
  830. current->IncrementAssassinationCount();
  831. }
  832. }
  833. void AdventureManager::GetZoneData(uint16 instance_id)
  834. {
  835. list<Adventure*>::iterator iter = adventure_list.begin();
  836. Adventure *current = NULL;
  837. while(iter != adventure_list.end())
  838. {
  839. if((*iter)->GetInstanceID() == instance_id)
  840. {
  841. current = (*iter);
  842. break;
  843. }
  844. iter++;
  845. }
  846. if(current)
  847. {
  848. ServerPacket *pack = new ServerPacket(ServerOP_AdventureZoneData, sizeof(ServerZoneAdventureDataReply_Struct));
  849. ServerZoneAdventureDataReply_Struct *zd = (ServerZoneAdventureDataReply_Struct*)pack->pBuffer;
  850. const AdventureTemplate* temp = current->GetTemplate();
  851. zd->instance_id = instance_id;
  852. zd->count = current->GetCount();
  853. zd->total = temp->type_count;
  854. zd->type = temp->type;
  855. zd->data_id = temp->type_data;
  856. zd->assa_count = current->GetAssassinationCount();
  857. zd->assa_x = temp->assa_x;
  858. zd->assa_y = temp->assa_y;
  859. zd->assa_z = temp->assa_z;
  860. zd->assa_h = temp->assa_h;
  861. zd->dest_x = temp->dest_x;
  862. zd->dest_y = temp->dest_y;
  863. zd->dest_z = temp->dest_z;
  864. zd->dest_h = temp->dest_h;
  865. zoneserver_list.SendPacket(0, instance_id, pack);
  866. delete pack;
  867. }
  868. }
  869. // Sort the leaderboard by wins.
  870. bool pred_sort_by_win_count(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  871. {
  872. return lbi1.wins > lbi2.wins;
  873. }
  874. // Sort the leaderboard by win percentage.
  875. bool pred_sort_by_win_percentage(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  876. {
  877. int per1 = 10000;
  878. int per2 = 10000;
  879. if(lbi1.wins + lbi1.losses != 0)
  880. {
  881. per1 = (lbi1.wins * 10000 / (lbi1.wins + lbi1.losses));
  882. }
  883. if(lbi2.wins + lbi2.losses != 0)
  884. {
  885. per1 = (lbi2.wins * 10000 / (lbi2.wins + lbi2.losses));
  886. }
  887. return per1 > per2;
  888. }
  889. // Sort the leaderboard by wins(guk).
  890. bool pred_sort_by_win_count_guk(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  891. {
  892. return lbi1.guk_wins > lbi2.guk_wins;
  893. }
  894. // Sort the leaderboard by win percentage(guk).
  895. bool pred_sort_by_win_percentage_guk(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  896. {
  897. int per1 = 10000;
  898. int per2 = 10000;
  899. if(lbi1.guk_wins + lbi1.guk_losses != 0)
  900. {
  901. per1 = (lbi1.guk_wins * 10000 / (lbi1.guk_wins + lbi1.guk_losses));
  902. }
  903. if(lbi2.guk_wins + lbi2.guk_losses != 0)
  904. {
  905. per1 = (lbi2.guk_wins * 10000 / (lbi2.guk_wins + lbi2.guk_losses));
  906. }
  907. return per1 > per2;
  908. }
  909. // Sort the leaderboard by wins(mir).
  910. bool pred_sort_by_win_count_mir(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  911. {
  912. return lbi1.mir_wins > lbi2.mir_wins;
  913. }
  914. // Sort the leaderboard by win percentage(mir).
  915. bool pred_sort_by_win_percentage_mir(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  916. {
  917. int per1 = 10000;
  918. int per2 = 10000;
  919. if(lbi1.mir_wins + lbi1.mir_losses != 0)
  920. {
  921. per1 = (lbi1.mir_wins * 10000 / (lbi1.mir_wins + lbi1.mir_losses));
  922. }
  923. if(lbi2.mir_wins + lbi2.mir_losses != 0)
  924. {
  925. per1 = (lbi2.mir_wins * 10000 / (lbi2.mir_wins + lbi2.mir_losses));
  926. }
  927. return per1 > per2;
  928. }
  929. // Sort the leaderboard by wins(mmc).
  930. bool pred_sort_by_win_count_mmc(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  931. {
  932. return lbi1.mmc_wins > lbi2.mmc_wins;
  933. }
  934. // Sort the leaderboard by win percentage(mmc).
  935. bool pred_sort_by_win_percentage_mmc(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  936. {
  937. int per1 = 10000;
  938. int per2 = 10000;
  939. if(lbi1.mmc_wins + lbi1.mmc_losses != 0)
  940. {
  941. per1 = (lbi1.mmc_wins * 10000 / (lbi1.mmc_wins + lbi1.mmc_losses));
  942. }
  943. if(lbi2.mmc_wins + lbi2.mmc_losses != 0)
  944. {
  945. per1 = (lbi2.mmc_wins * 10000 / (lbi2.mmc_wins + lbi2.mmc_losses));
  946. }
  947. return per1 > per2;
  948. }
  949. // Sort the leaderboard by wins(ruj).
  950. bool pred_sort_by_win_count_ruj(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  951. {
  952. return lbi1.ruj_wins > lbi2.ruj_wins;
  953. }
  954. // Sort the leaderboard by win percentage(ruj).
  955. bool pred_sort_by_win_percentage_ruj(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  956. {
  957. int per1 = 10000;
  958. int per2 = 10000;
  959. if(lbi1.ruj_wins + lbi1.ruj_losses != 0)
  960. {
  961. per1 = (lbi1.ruj_wins * 10000 / (lbi1.ruj_wins + lbi1.ruj_losses));
  962. }
  963. if(lbi2.ruj_wins + lbi2.ruj_losses != 0)
  964. {
  965. per1 = (lbi2.ruj_wins * 10000 / (lbi2.ruj_wins + lbi2.ruj_losses));
  966. }
  967. return per1 > per2;
  968. }
  969. // Sort the leaderboard by wins(tak).
  970. bool pred_sort_by_win_count_tak(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  971. {
  972. return lbi1.tak_wins > lbi2.tak_wins;
  973. }
  974. // Sort the leaderboard by win percentage(tak).
  975. bool pred_sort_by_win_percentage_tak(const LeaderboardInfo &lbi1, const LeaderboardInfo &lbi2)
  976. {
  977. int per1 = 10000;
  978. int per2 = 10000;
  979. if(lbi1.tak_wins + lbi1.tak_losses != 0)
  980. {
  981. per1 = (lbi1.tak_wins * 10000 / (lbi1.tak_wins + lbi1.tak_losses));
  982. }
  983. if(lbi2.tak_wins + lbi2.tak_losses != 0)
  984. {
  985. per1 = (lbi2.tak_wins * 10000 / (lbi2.tak_wins + lbi2.tak_losses));
  986. }
  987. return per1 > per2;
  988. }
  989. void AdventureManager::LoadLeaderboardInfo()
  990. {
  991. leaderboard_info_wins.clear();
  992. leaderboard_info_percentage.clear();
  993. leaderboard_info_wins_guk.clear();
  994. leaderboard_info_percentage_guk.clear();
  995. leaderboard_info_wins_mir.clear();
  996. leaderboard_info_percentage_mir.clear();
  997. leaderboard_info_wins_mmc.clear();
  998. leaderboard_info_percentage_mmc.clear();
  999. leaderboard_info_wins_ruj.clear();
  1000. leaderboard_info_percentage_ruj.clear();
  1001. leaderboard_info_wins_tak.clear();
  1002. leaderboard_info_percentage_tak.clear();
  1003. char errbuf[MYSQL_ERRMSG_SIZE];
  1004. char* query = 0;
  1005. MYSQL_RES *result;
  1006. MYSQL_ROW row;
  1007. if(database.RunQuery(query,MakeAnyLenString(&query,"select ch.name, ch.id, adv_stats.* from adventure_stats "
  1008. "AS adv_stats ""left join character_ AS ch on adv_stats.player_id = ch.id;"), errbuf, &result))
  1009. {
  1010. while((row = mysql_fetch_row(result)))
  1011. {
  1012. if(row[0])
  1013. {
  1014. LeaderboardInfo lbi;
  1015. lbi.name = row[0];
  1016. lbi.wins = atoi(row[3]);
  1017. lbi.guk_wins = atoi(row[3]);
  1018. lbi.wins += atoi(row[4]);
  1019. lbi.mir_wins = atoi(row[4]);
  1020. lbi.wins += atoi(row[5]);
  1021. lbi.mmc_wins = atoi(row[5]);
  1022. lbi.wins += atoi(row[6]);
  1023. lbi.ruj_wins = atoi(row[6]);
  1024. lbi.wins += atoi(row[7]);
  1025. lbi.tak_wins = atoi(row[7]);
  1026. lbi.losses = atoi(row[8]);
  1027. lbi.guk_losses = atoi(row[8]);
  1028. lbi.losses += atoi(row[9]);
  1029. lbi.mir_losses = atoi(row[9]);
  1030. lbi.losses += atoi(row[10]);
  1031. lbi.mmc_losses = atoi(row[10]);
  1032. lbi.losses += atoi(row[11]);
  1033. lbi.ruj_losses = atoi(row[11]);
  1034. lbi.losses += atoi(row[12]);
  1035. lbi.tak_losses = atoi(row[12]);
  1036. leaderboard_info_wins.push_back(lbi);
  1037. leaderboard_info_percentage.push_back(lbi);
  1038. leaderboard_info_wins_guk.push_back(lbi);
  1039. leaderboard_info_percentage_guk.push_back(lbi);
  1040. leaderboard_info_wins_mir.push_back(lbi);
  1041. leaderboard_info_percentage_mir.push_back(lbi);
  1042. leaderboard_info_wins_mmc.push_back(lbi);
  1043. leaderboard_info_percentage_mmc.push_back(lbi);
  1044. leaderboard_info_wins_ruj.push_back(lbi);
  1045. leaderboard_info_percentage_ruj.push_back(lbi);
  1046. leaderboard_info_wins_tak.push_back(lbi);
  1047. leaderboard_info_percentage_tak.push_back(lbi);
  1048. leaderboard_sorted_wins = false;
  1049. leaderboard_sorted_percentage = false;
  1050. leaderboard_sorted_wins_guk = false;
  1051. leaderboard_sorted_percentage_guk = false;
  1052. leaderboard_sorted_wins_mir = false;
  1053. leaderboard_sorted_percentage_mir = false;
  1054. leaderboard_sorted_wins_mmc = false;
  1055. leaderboard_sorted_percentage_mmc = false;
  1056. leaderboard_sorted_wins_ruj = false;
  1057. leaderboard_sorted_percentage_ruj = false;
  1058. leaderboard_sorted_wins_tak = false;
  1059. leaderboard_sorted_percentage_tak = false;
  1060. }
  1061. }
  1062. mysql_free_result(result);
  1063. safe_delete_array(query);
  1064. return;
  1065. }
  1066. else
  1067. {
  1068. LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::GetLeaderboardInfo: %s (%s)", query, errbuf);
  1069. safe_delete_array(query);
  1070. return;
  1071. }
  1072. return;
  1073. };
  1074. void AdventureManager::DoLeaderboardRequest(const char* player, uint8 type)
  1075. {
  1076. switch(type)
  1077. {
  1078. case 1:
  1079. if(!leaderboard_sorted_wins)
  1080. {
  1081. leaderboard_info_wins.sort(pred_sort_by_win_count);
  1082. leaderboard_sorted_wins = true;
  1083. }
  1084. DoLeaderboardRequestWins(player);
  1085. break;
  1086. case 2:
  1087. if(!leaderboard_sorted_percentage)
  1088. {
  1089. leaderboard_info_percentage.sort(pred_sort_by_win_percentage);
  1090. leaderboard_sorted_percentage = true;
  1091. }
  1092. DoLeaderboardRequestPercentage(player);
  1093. break;
  1094. case 3:
  1095. if(!leaderboard_sorted_wins_guk)
  1096. {
  1097. leaderboard_info_wins_guk.sort(pred_sort_by_win_count_guk);
  1098. leaderboard_sorted_wins_guk = true;
  1099. }
  1100. DoLeaderboardRequestWinsGuk(player);
  1101. break;
  1102. case 4:
  1103. if(!leaderboard_sorted_percentage_guk)
  1104. {
  1105. leaderboard_info_percentage_guk.sort(pred_sort_by_win_percentage_guk);
  1106. leaderboard_sorted_percentage_guk = true;
  1107. }
  1108. DoLeaderboardRequestPercentageGuk(player);
  1109. break;
  1110. case 5:
  1111. if(!leaderboard_sorted_wins_mir)
  1112. {
  1113. leaderboard_info_wins_mir.sort(pred_sort_by_win_count_mir);
  1114. leaderboard_sorted_wins_mir = true;
  1115. }
  1116. DoLeaderboardRequestWinsMir(player);
  1117. break;
  1118. case 6:
  1119. if(!leaderboard_sorted_percentage_mir)
  1120. {
  1121. leaderboard_info_percentage_mir.sort(pred_sort_by_win_percentage_mir);
  1122. leaderboard_sorted_percentage_mir = true;
  1123. }
  1124. DoLeaderboardRequestPercentageMir(player);
  1125. break;
  1126. case 7:
  1127. if(!leaderboard_sorted_wins_mmc)
  1128. {
  1129. leaderboard_info_wins_mmc.sort(pred_sort_by_win_count_mmc);
  1130. leaderboard_sorted_wins_mmc = true;
  1131. }
  1132. DoLeaderboardRequestWinsMmc(player);
  1133. break;
  1134. case 8:
  1135. if(!leaderboard_sorted_percentage_mmc)
  1136. {
  1137. leaderboard_info_percentage_mmc.sort(pred_sort_by_win_percentage_mmc);
  1138. leaderboard_sorted_percentage_mmc = true;
  1139. }
  1140. DoLeaderboardRequestPercentageMmc(player);
  1141. break;
  1142. case 9:
  1143. if(!leaderboard_sorted_wins_ruj)
  1144. {
  1145. leaderboard_info_wins_ruj.sort(pred_sort_by_win_count_ruj);
  1146. leaderboard_sorted_wins_ruj = true;
  1147. }
  1148. DoLeaderboardRequestWinsRuj(player);
  1149. break;
  1150. case 10:
  1151. if(!leaderboard_sorted_percentage_ruj)
  1152. {
  1153. leaderboard_info_percentage_ruj.sort(pred_sort_by_win_percentage_ruj);
  1154. leaderboard_sorted_percentage_ruj = true;
  1155. }
  1156. DoLeaderboardRequestPercentageRuj(player);
  1157. break;
  1158. case 11:
  1159. if(!leaderboard_sorted_wins_tak)
  1160. {
  1161. leaderboard_info_wins_tak.sort(pred_sort_by_win_count_tak);
  1162. leaderboard_sorted_wins_tak = true;
  1163. }
  1164. DoLeaderboardRequestWinsTak(player);
  1165. break;
  1166. case 12:
  1167. if(!leaderboard_sorted_percentage_tak)
  1168. {
  1169. leaderboard_info_percentage_tak.sort(pred_sort_by_win_percentage_tak);
  1170. leaderboard_sorted_percentage_tak = true;
  1171. }
  1172. DoLeaderboardRequestPercentageTak(player);
  1173. break;
  1174. }
  1175. }
  1176. void AdventureManager::DoLeaderboardRequestWins(const char* player)
  1177. {
  1178. ClientListEntry *pc = client_list.FindCharacter(player);
  1179. if(pc)
  1180. {
  1181. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1182. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1183. strcpy((char*)pack->pBuffer, player);
  1184. int place = -1;
  1185. int our_successes;
  1186. int our_failures;
  1187. int i = 0;
  1188. list<LeaderboardInfo>::iterator iter = leaderboard_info_wins.begin();
  1189. while(i < 100 && iter != leaderboard_info_wins.end())
  1190. {
  1191. LeaderboardInfo li = (*iter);
  1192. if(li.name.compare(player) == 0)
  1193. {
  1194. place = i;
  1195. our_successes = li.wins;
  1196. our_failures = li.losses;
  1197. }
  1198. al->entries[i].success = li.wins;
  1199. al->entries[i].failure = li.losses;
  1200. strcpy(al->entries[i].name, li.name.c_str());
  1201. i++;
  1202. iter++;
  1203. }
  1204. if(place == -1 && iter != leaderboard_info_wins.end())
  1205. {
  1206. while(iter != leaderboard_info_wins.end())
  1207. {
  1208. LeaderboardInfo li = (*iter);
  1209. if(li.name.compare(player) == 0)
  1210. {
  1211. place = i;
  1212. our_successes = li.wins;
  1213. our_failures = li.losses;
  1214. break;
  1215. }
  1216. i++;
  1217. iter++;
  1218. }
  1219. }
  1220. if(place == -1)
  1221. {
  1222. al->our_rank = leaderboard_info_wins.size() + 1;
  1223. al->success = 0;
  1224. al->failure = 0;
  1225. }
  1226. else
  1227. {
  1228. al->our_rank = place;
  1229. al->success = our_successes;
  1230. al->failure = our_failures;
  1231. }
  1232. pack->Deflate();
  1233. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  1234. delete pack;
  1235. }
  1236. }
  1237. void AdventureManager::DoLeaderboardRequestPercentage(const char* player)
  1238. {
  1239. ClientListEntry *pc = client_list.FindCharacter(player);
  1240. if(pc)
  1241. {
  1242. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1243. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1244. strcpy((char*)pack->pBuffer, player);
  1245. int place = -1;
  1246. int our_successes;
  1247. int our_failures;
  1248. int i = 0;
  1249. list<LeaderboardInfo>::iterator iter = leaderboard_info_percentage.begin();
  1250. while(i < 100 && iter != leaderboard_info_percentage.end())
  1251. {
  1252. LeaderboardInfo li = (*iter);
  1253. if(li.name.compare(player) == 0)
  1254. {
  1255. place = i;
  1256. our_successes = li.wins;
  1257. our_failures = li.losses;
  1258. }
  1259. al->entries[i].success = li.wins;
  1260. al->entries[i].failure = li.losses;
  1261. strcpy(al->entries[i].name, li.name.c_str());
  1262. i++;
  1263. iter++;
  1264. }
  1265. if(place == -1 && iter != leaderboard_info_percentage.end())
  1266. {
  1267. while(iter != leaderboard_info_percentage.end())
  1268. {
  1269. LeaderboardInfo li = (*iter);
  1270. if(li.name.compare(player) == 0)
  1271. {
  1272. place = i;
  1273. our_successes = li.wins;
  1274. our_failures = li.losses;
  1275. break;
  1276. }
  1277. i++;
  1278. iter++;
  1279. }
  1280. }
  1281. if(place == -1)
  1282. {
  1283. al->our_rank = leaderboard_info_percentage.size() + 1;
  1284. al->success = 0;
  1285. al->failure = 0;
  1286. }
  1287. else
  1288. {
  1289. al->our_rank = place;
  1290. al->success = our_successes;
  1291. al->failure = our_failures;
  1292. }
  1293. pack->Deflate();
  1294. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  1295. delete pack;
  1296. }
  1297. }
  1298. void AdventureManager::DoLeaderboardRequestWinsGuk(const char* player)
  1299. {
  1300. ClientListEntry *pc = client_list.FindCharacter(player);
  1301. if(pc)
  1302. {
  1303. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1304. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1305. strcpy((char*)pack->pBuffer, player);
  1306. int place = -1;
  1307. int our_successes;
  1308. int our_failures;
  1309. int i = 0;
  1310. list<LeaderboardInfo>::iterator iter = leaderboard_info_wins_guk.begin();
  1311. while(i < 100 && iter != leaderboard_info_wins_guk.end())
  1312. {
  1313. LeaderboardInfo li = (*iter);
  1314. if(li.name.compare(player) == 0)
  1315. {
  1316. place = i;
  1317. our_successes = li.guk_wins;
  1318. our_failures = li.guk_losses;
  1319. }
  1320. al->entries[i].success = li.guk_wins;
  1321. al->entries[i].failure = li.guk_losses;
  1322. strcpy(al->entries[i].name, li.name.c_str());
  1323. i++;
  1324. iter++;
  1325. }
  1326. if(place == -1 && iter != leaderboard_info_wins_guk.end())
  1327. {
  1328. while(iter != leaderboard_info_wins_guk.end())
  1329. {
  1330. LeaderboardInfo li = (*iter);
  1331. if(li.name.compare(player) == 0)
  1332. {
  1333. place = i;
  1334. our_successes = li.guk_wins;
  1335. our_failures = li.guk_losses;
  1336. break;
  1337. }
  1338. i++;
  1339. iter++;
  1340. }
  1341. }
  1342. if(place == -1)
  1343. {
  1344. al->our_rank = leaderboard_info_wins_guk.size() + 1;
  1345. al->success = 0;
  1346. al->failure = 0;
  1347. }
  1348. else
  1349. {
  1350. al->our_rank = place;
  1351. al->success = our_successes;
  1352. al->failure = our_failures;
  1353. }
  1354. pack->Deflate();
  1355. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  1356. delete pack;
  1357. }
  1358. }
  1359. void AdventureManager::DoLeaderboardRequestPercentageGuk(const char* player)
  1360. {
  1361. ClientListEntry *pc = client_list.FindCharacter(player);
  1362. if(pc)
  1363. {
  1364. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1365. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1366. strcpy((char*)pack->pBuffer, player);
  1367. int place = -1;
  1368. int our_successes;
  1369. int our_failures;
  1370. int i = 0;
  1371. list<LeaderboardInfo>::iterator iter = leaderboard_info_percentage_guk.begin();
  1372. while(i < 100 && iter != leaderboard_info_percentage_guk.end())
  1373. {
  1374. LeaderboardInfo li = (*iter);
  1375. if(li.name.compare(player) == 0)
  1376. {
  1377. place = i;
  1378. our_successes = li.guk_wins;
  1379. our_failures = li.guk_losses;
  1380. }
  1381. al->entries[i].success = li.guk_wins;
  1382. al->entries[i].failure = li.guk_losses;
  1383. strcpy(al->entries[i].name, li.name.c_str());
  1384. i++;
  1385. iter++;
  1386. }
  1387. if(place == -1 && iter != leaderboard_info_percentage_guk.end())
  1388. {
  1389. while(iter != leaderboard_info_percentage_guk.end())
  1390. {
  1391. LeaderboardInfo li = (*iter);
  1392. if(li.name.compare(player) == 0)
  1393. {
  1394. place = i;
  1395. our_successes = li.guk_wins;
  1396. our_failures = li.guk_losses;
  1397. break;
  1398. }
  1399. i++;
  1400. iter++;
  1401. }
  1402. }
  1403. if(place == -1)
  1404. {
  1405. al->our_rank = leaderboard_info_percentage_guk.size() + 1;
  1406. al->success = 0;
  1407. al->failure = 0;
  1408. }
  1409. else
  1410. {
  1411. al->our_rank = place;
  1412. al->success = our_successes;
  1413. al->failure = our_failures;
  1414. }
  1415. pack->Deflate();
  1416. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  1417. delete pack;
  1418. }
  1419. }
  1420. void AdventureManager::DoLeaderboardRequestWinsMir(const char* player)
  1421. {
  1422. ClientListEntry *pc = client_list.FindCharacter(player);
  1423. if(pc)
  1424. {
  1425. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1426. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1427. strcpy((char*)pack->pBuffer, player);
  1428. int place = -1;
  1429. int our_successes;
  1430. int our_failures;
  1431. int i = 0;
  1432. list<LeaderboardInfo>::iterator iter = leaderboard_info_wins_mir.begin();
  1433. while(i < 100 && iter != leaderboard_info_wins_mir.end())
  1434. {
  1435. LeaderboardInfo li = (*iter);
  1436. if(li.name.compare(player) == 0)
  1437. {
  1438. place = i;
  1439. our_successes = li.mir_wins;
  1440. our_failures = li.mir_losses;
  1441. }
  1442. al->entries[i].success = li.mir_wins;
  1443. al->entries[i].failure = li.mir_losses;
  1444. strcpy(al->entries[i].name, li.name.c_str());
  1445. i++;
  1446. iter++;
  1447. }
  1448. if(place == -1 && iter != leaderboard_info_wins_mir.end())
  1449. {
  1450. while(iter != leaderboard_info_wins_mir.end())
  1451. {
  1452. LeaderboardInfo li = (*iter);
  1453. if(li.name.compare(player) == 0)
  1454. {
  1455. place = i;
  1456. our_successes = li.mir_wins;
  1457. our_failures = li.mir_losses;
  1458. break;
  1459. }
  1460. i++;
  1461. iter++;
  1462. }
  1463. }
  1464. if(place == -1)
  1465. {
  1466. al->our_rank = leaderboard_info_wins_mir.size() + 1;
  1467. al->success = 0;
  1468. al->failure = 0;
  1469. }
  1470. else
  1471. {
  1472. al->our_rank = place;
  1473. al->success = our_successes;
  1474. al->failure = our_failures;
  1475. }
  1476. pack->Deflate();
  1477. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  1478. delete pack;
  1479. }
  1480. }
  1481. void AdventureManager::DoLeaderboardRequestPercentageMir(const char* player)
  1482. {
  1483. ClientListEntry *pc = client_list.FindCharacter(player);
  1484. if(pc)
  1485. {
  1486. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1487. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1488. strcpy((char*)pack->pBuffer, player);
  1489. int place = -1;
  1490. int our_successes;
  1491. int our_failures;
  1492. int i = 0;
  1493. list<LeaderboardInfo>::iterator iter = leaderboard_info_percentage_mir.begin();
  1494. while(i < 100 && iter != leaderboard_info_percentage_mir.end())
  1495. {
  1496. LeaderboardInfo li = (*iter);
  1497. if(li.name.compare(player) == 0)
  1498. {
  1499. place = i;
  1500. our_successes = li.mir_wins;
  1501. our_failures = li.mir_losses;
  1502. }
  1503. al->entries[i].success = li.mir_wins;
  1504. al->entries[i].failure = li.mir_losses;
  1505. strcpy(al->entries[i].name, li.name.c_str());
  1506. i++;
  1507. iter++;
  1508. }
  1509. if(place == -1 && iter != leaderboard_info_percentage_mir.end())
  1510. {
  1511. while(iter != leaderboard_info_percentage_mir.end())
  1512. {
  1513. LeaderboardInfo li = (*iter);
  1514. if(li.name.compare(player) == 0)
  1515. {
  1516. place = i;
  1517. our_successes = li.mir_wins;
  1518. our_failures = li.mir_losses;
  1519. break;
  1520. }
  1521. i++;
  1522. iter++;
  1523. }
  1524. }
  1525. if(place == -1)
  1526. {
  1527. al->our_rank = leaderboard_info_percentage_mir.size() + 1;
  1528. al->success = 0;
  1529. al->failure = 0;
  1530. }
  1531. else
  1532. {
  1533. al->our_rank = place;
  1534. al->success = our_successes;
  1535. al->failure = our_failures;
  1536. }
  1537. pack->Deflate();
  1538. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  1539. delete pack;
  1540. }
  1541. }
  1542. void AdventureManager::DoLeaderboardRequestWinsMmc(const char* player)
  1543. {
  1544. ClientListEntry *pc = client_list.FindCharacter(player);
  1545. if(pc)
  1546. {
  1547. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1548. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1549. strcpy((char*)pack->pBuffer, player);
  1550. int place = -1;
  1551. int our_successes;
  1552. int our_failures;
  1553. int i = 0;
  1554. list<LeaderboardInfo>::iterator iter = leaderboard_info_wins_mmc.begin();
  1555. while(i < 100 && iter != leaderboard_info_wins_mmc.end())
  1556. {
  1557. LeaderboardInfo li = (*iter);
  1558. if(li.name.compare(player) == 0)
  1559. {
  1560. place = i;
  1561. our_successes = li.mmc_wins;
  1562. our_failures = li.mmc_losses;
  1563. }
  1564. al->entries[i].success = li.mmc_wins;
  1565. al->entries[i].failure = li.mmc_losses;
  1566. strcpy(al->entries[i].name, li.name.c_str());
  1567. i++;
  1568. iter++;
  1569. }
  1570. if(place == -1 && iter != leaderboard_info_wins_mmc.end())
  1571. {
  1572. while(iter != leaderboard_info_wins_mmc.end())
  1573. {
  1574. LeaderboardInfo li = (*iter);
  1575. if(li.name.compare(player) == 0)
  1576. {
  1577. place = i;
  1578. our_successes = li.mmc_wins;
  1579. our_failures = li.mmc_losses;
  1580. break;
  1581. }
  1582. i++;
  1583. iter++;
  1584. }
  1585. }
  1586. if(place == -1)
  1587. {
  1588. al->our_rank = leaderboard_info_wins_mmc.size() + 1;
  1589. al->success = 0;
  1590. al->failure = 0;
  1591. }
  1592. else
  1593. {
  1594. al->our_rank = place;
  1595. al->success = our_successes;
  1596. al->failure = our_failures;
  1597. }
  1598. pack->Deflate();
  1599. zoneserver_list.SendPacket(pc->zone(), pc->instance(), pack);
  1600. delete pack;
  1601. }
  1602. }
  1603. void AdventureManager::DoLeaderboardRequestPercentageMmc(const char* player)
  1604. {
  1605. ClientListEntry *pc = client_list.FindCharacter(player);
  1606. if(pc)
  1607. {
  1608. ServerPacket *pack = new ServerPacket(ServerOP_AdventureLeaderboard, 64 + sizeof(AdventureLeaderboard_Struct));
  1609. AdventureLeaderboard_Struct *al = (AdventureLeaderboard_Struct*)(pack->pBuffer + 64);
  1610. strcpy((char*)pack->pBuffer, player);
  1611. int place = -1;
  1612. int our_successes;
  1613. int our_failures;
  1614. int i = 0;
  1615. list<LeaderboardInfo>::iterator iter = leaderboard_info_percentage_mmc.begin();
  1616. while(i < 100 && iter != leaderboard_info_percentage_mmc.end())
  1617. {
  1618. LeaderboardInfo li = (*iter);
  1619. if(li.name.compare(player) == 0)
  1620. {
  1621. place = i;
  1622. our_successes = li.mmc_wins;
  1623. our_failures = li.mmc_losses;
  1624. }
  1625. al->entries[i].success = li.mmc_wins;
  1626. al->entries[i].failure = li.mmc_losses;
  1627. strcpy(al->entries[i].name, li.name.c_str());
  1628. i++;
  1629. iter++;
  1630. }
  1631. if(place == -1 && iter != leaderboard_info_percentage_mmc.end())
  1632. {
  1633. while(iter != leaderboar

Large files files are truncated, but you can click here to view the full file