1. /*
  2. © EmuDev's Premium System ©
  3. By slp13at420 `The Mad Scientist` of EmuDevs.com ©
  4. with the community of EmuDevs.com,
  5. for the community of EmuDevs.com.
  6. project info:
  7. Type : CPP
  8. started : 04/20/2016
  9. finished : unfinished Public Release
  10. public released : 04/20/2016
  11. lead programmer : slp13at420
  12. ideas provided by : Portals, Kaev, Vitrex, jonmii, slp13at420.
  13. scripting provided by : slp13at420.
  14. scripting guideance provided by : GrandElf, Rochet2.
  15. This is a CPP Premium System.
  16. This allows for either account Premium
  17. rank or character Premium rank.
  18. allows for permenant Premium rank
  19. or timed based duration Premium rank.
  20. © This is an EmuDevs.com only release. ©
  21. © do not remove or change credits above ©
  22. © dont share this System without prior approval ©
  23. © Dont re-release as yours or anothers work ©
  24. */
  25. #include "Premium_System.h"
  26. #include "ScriptMgr.h"
  27. #include "Player.h"
  28. #include "Chat.h"
  29. #include "Config.h"
  30. #include "Guild.h"
  31. #include "Unit.h"
  32. #include "World.h"
  33. int Buffs[24] = { 24752, 48074, 43223, 36880, 467, 48469, 48162, 48170, 16877, 10220, 13033, 11735, 10952, 23948, 26662, 47440, 53307, 132, 23737, 48470, 43002, 26393, 24705, 69994 };
  34. int Debuffs[4] = { 57724, 57723, 80354, 95809 };
  35. PremiumSystemMgr::PremiumSystemMgr()
  36. {
  37. premiumTimerDuration = (((1 * 60) * 60) * 24); // Defining day in ms.
  38. }
  39. PremiumSystemMgr::~PremiumSystemMgr()
  40. {
  41. for (std::unordered_map<uint32, PremiumElements>::iterator itr = Premium.begin(); itr != Premium.end(); ++itr)
  42. delete &itr->second;
  43. for (std::unordered_map<uint32, PremiumItemElements>::iterator itr = PremiumItem.begin(); itr != PremiumItem.end(); ++itr)
  44. delete &itr->second;
  45. for (std::unordered_map<uint32, PremiumLocationElements>::iterator itr = PremiumLocations.begin(); itr != PremiumLocations.end(); ++itr)
  46. delete &itr->second;
  47. for (std::unordered_map<uint32, PremiumLocationElements>::iterator itr = PremiumMallLocations.begin(); itr != PremiumMallLocations.end(); ++itr)
  48. delete &itr->second;
  49. for (std::unordered_map<uint32, PremiumLocationElements>::iterator itr = PremiumPublicMallLocations.begin(); itr != PremiumPublicMallLocations.end(); ++itr)
  50. delete &itr->second;
  51. for (std::unordered_map<uint32, PremiumPlayerLocationElements>::iterator itr = PremiumPlayerLocations.begin(); itr != PremiumPlayerLocations.end(); ++itr)
  52. delete &itr->second;
  53. for (std::unordered_map<uint32, PremiumTeamLocationElements>::iterator itr = PremiumTeamLocations.begin(); itr != PremiumTeamLocations.end(); ++itr)
  54. delete &itr->second;
  55. Premium.clear();
  56. PremiumItem.clear();
  57. PremiumLocations.clear();
  58. PremiumMallLocations.clear();
  59. PremiumPublicMallLocations.clear();
  60. PremiumPlayerLocations.clear();
  61. PremiumTeamLocations.clear();
  62. }
  63. PremiumSystemMgr* PremiumSystemMgr::instance()
  64. {
  65. static PremiumSystemMgr instance;
  66. return &instance;
  67. }
  68. void SendPremiumMessage(std::string msg, uint8 team_id)
  69. {
  70. SessionMap sessions = sWorld->GetAllSessions();
  71. for (SessionMap::iterator itr = sessions.begin(); itr != sessions.end(); ++itr)
  72. {
  73. if (!itr->second)
  74. continue;
  75. Player* player = itr->second->GetPlayer();
  76. if (!player)
  77. continue;
  78. if (player->IsGameMaster() || (sPremiumSystemMgr->IsPlayerPremium(player) && ((player->GetTeamId() == team_id) || ((player->GetTeamId() != team_id) && ((sPremiumSystemMgr->GetChatTeam()) || team_id == 2)))))
  79. ChatHandler(player->GetSession()).SendSysMessage(msg.c_str());
  80. }
  81. }
  82. uint64 PremiumSystemMgr::ConvertStringToNumber(std::string arg)
  83. {
  84. uint64 Value64;
  85. std::istringstream(arg) >> Value64;
  86. return Value64;
  87. }
  88. std::string PremiumSystemMgr::ConvertNumberToString(uint64 numberX)
  89. {
  90. auto number = numberX;
  91. std::stringstream convert;
  92. std::string number32_to_string;
  93. convert << number;
  94. number32_to_string = convert.str();
  95. return number32_to_string;
  96. }
  97. std::string PremiumSystemMgr::GetAmountInString(uint32 amount)
  98. {
  99. uint64 tmp;
  100. std::string output = "";
  101. if (amount > 9999)
  102. {
  103. tmp = floor(amount / 10000);
  104. amount = amount - (tmp * 10000);
  105. output = output + ConvertNumberToString(tmp) + " Gold, ";
  106. }
  107. if (amount > 99)
  108. {
  109. tmp = floor(amount / 100);
  110. amount = amount - (tmp * 100);
  111. output = output + ConvertNumberToString(tmp) + " Silver, ";
  112. }
  113. if (amount <= 99)
  114. {
  115. tmp = (amount);
  116. amount = amount - (tmp);
  117. output = output + ConvertNumberToString(tmp) + " Copper";
  118. }
  119. return output;
  120. }
  121. uint32 PremiumSystemMgr::GetPlayerPremiumId(Player* player)
  122. {
  123. if (GetPremiumType() == 0)
  124. return player->GetSession()->GetAccountId();
  125. else
  126. return player->GetSession()->GetGUIDLow();
  127. return 0;
  128. }
  129. void PremiumSystemMgr::AddPremiumToPlayer(Player* player)
  130. {
  131. uint32 id = GetPlayerPremiumId(player);
  132. uint32 maxPower = IncreaseValueWithModifier(player, Premium[id].power_max);
  133. if (GetTitleId() > 0)
  134. {
  135. if (!player->HasTitle(GetTitleId()))
  136. {
  137. CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(GetTitleId());
  138. if (titleEntry)
  139. player->SetTitle(titleEntry, false);
  140. }
  141. player->SetUInt32Value(PLAYER_CHOSEN_TITLE, GetTitleMaskId());
  142. }
  143. if (IsHealthPointBonusEnabled())
  144. {
  145. uint32 MaxHP = IncreaseValueWithModifier(player, Premium[id].hp);
  146. player->SetMaxHealth(MaxHP);
  147. }
  148. if(player->getPowerType() == POWER_MANA && IsManaPointBonusEnabled())
  149. player->SetMaxPower(POWER_MANA, maxPower);
  150. if (player->getPowerType() == POWER_RAGE && IsRagePointBonusEnabled())
  151. player->SetMaxPower(POWER_RAGE, maxPower);
  152. ChatHandler(player->GetSession()).SendSysMessage("player:PremiumRankAdded.");
  153. }
  154. void PremiumSystemMgr::RemovePremiumFromPlayer(Player* player)
  155. {
  156. uint32 id = GetPlayerPremiumId(player);
  157. player->SetMaxHealth(Premium[id].hp);
  158. player->ResetTalents(false);
  159. if (GetTitleId() > 0)
  160. {
  161. if (player->GetUInt32Value(PLAYER_CHOSEN_TITLE) == GetTitleMaskId())
  162. player->SetUInt32Value(PLAYER_CHOSEN_TITLE, -1);
  163. }
  164. if (player->HasTitle(GetTitleId()))
  165. {
  166. CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(GetTitleId());
  167. if (titleEntry)
  168. player->SetTitle(titleEntry, true);
  169. }
  170. if (player->getPowerType() == POWER_MANA && IsManaPointBonusEnabled())
  171. player->SetMaxPower(POWER_MANA, Premium[id].power_max);
  172. if (player->getPowerType() == POWER_RAGE && IsRagePointBonusEnabled())
  173. player->SetMaxPower(POWER_RAGE, Premium[id].power_max);
  174. DeletePremium(player);
  175. ChatHandler(player->GetSession()).SendSysMessage("player:PremiumRankRemoved.");
  176. }
  177. bool PremiumSystemMgr::IsPlayerPremium(Player* player)
  178. {
  179. uint32 id = GetPlayerPremiumId(player);
  180. return Premium[id].premium != 0;
  181. }
  182. void PremiumSystemMgr::UpdatePlayerCustomHomeTeleport(uint32 guid, uint32 map_id, float x, float y, float z, float o)
  183. {
  184. WorldDatabase.PExecute("REPLACE INTO `premium_player_teleports` SET guid=%u, `map_id`='%u', `x`='%f', `y`='%f', `z`='%f', `o`='%f';", guid, map_id, x, y, z, o);
  185. PremiumPlayerLocationElements& data = PremiumPlayerLocations[guid];
  186. data.guid = guid;
  187. data.map_id = map_id;
  188. data.x = x;
  189. data.y = y;
  190. data.z = z;
  191. data.o = o;
  192. }
  193. void PremiumSystemMgr::UpdatePlayerPremiumValue(Player* player, uint8 value, uint64 time)
  194. {
  195. uint32 id = GetPlayerPremiumId(player);
  196. if (GetPremiumType() == 0)
  197. LoginDatabase.PExecute("UPDATE `account` SET `premium`='%u', `premium_time`='%u' WHERE id=%u;", value, time, id);
  198. else if (GetPremiumType() > 0)
  199. CharacterDatabase.PExecute("UPDATE `characters` SET `premium`='%u', `premium_time`='%u' WHERE guid=%u;", value, time, id);
  200. if (value == 0)
  201. {
  202. Premium[id].premium = 0;
  203. Premium[id].time = 0;
  204. RemovePremiumFromPlayer(player);
  205. }
  206. else if (value > 0)
  207. {
  208. Premium[id].premium = 1;
  209. Premium[id].time = time;
  210. AddPremiumToPlayer(player);
  211. }
  212. }
  213. uint64 PremiumSystemMgr::GetPlayerPremiumStartTimeInSeconds(Player* player)
  214. {
  215. return Premium[GetPlayerPremiumId(player)].time;
  216. }
  217. uint64 PremiumSystemMgr::GetPlayerPremiumRemainingTimeInSeconds(Player* player)
  218. {
  219. uint32 id = GetPlayerPremiumId(player);
  220. uint64 duration = GetDurationInSeconds();
  221. uint64 current_time = sWorld->GetGameTime();
  222. uint64 player_time = Premium[id].time;
  223. return ((player_time + duration) - current_time);
  224. }
  225. std::string PremiumSystemMgr::GetPlayerPremiumTimeLeftInString(Player* player)
  226. {
  227. uint64 remaining = GetPlayerPremiumRemainingTimeInSeconds(player);
  228. uint64 tmp = 0;
  229. std::string output = "";
  230. if (remaining >= 2592000)
  231. {
  232. tmp = floor(remaining / 2592000); // (((((remaining / 1000) / 60) / 60) / 24) / 30);
  233. remaining = remaining - (tmp * 2592000);
  234. output = output + ConvertNumberToString(tmp) + " Months, ";
  235. }
  236. if (remaining >= 86400)
  237. {
  238. tmp = floor(remaining / 86400); // ((((remaining / 1000) / 60) / 60) / 24);
  239. remaining = remaining - (tmp * 86400);
  240. output = output + ConvertNumberToString(tmp) + " Days, ";
  241. }
  242. if (remaining >= 3600)
  243. {
  244. tmp = floor(remaining / 3600); // (((remaining / 1000) / 60) / 60);
  245. remaining = remaining - (tmp * 3600);
  246. output = output + ConvertNumberToString(tmp) + " Hours, ";
  247. }
  248. if (remaining >= 60)
  249. {
  250. tmp = floor(remaining / 60); // ((remaining / 1000) / 60);
  251. remaining = remaining - (tmp * 60);
  252. output = output + ConvertNumberToString(tmp) + " Minutes, ";
  253. }
  254. if (remaining < 60)
  255. {
  256. tmp = (remaining / 1);
  257. remaining = remaining - (tmp * 1);
  258. output = output + ConvertNumberToString(tmp) + " Seconds";
  259. }
  260. return output;
  261. }
  262. uint32 PremiumSystemMgr::GetPlayerPremiumTimeInDays(Player* player)
  263. {
  264. uint32 id = GetPlayerPremiumId(player);
  265. return (((Premium[id].time / 60) / 60) / 24);
  266. }
  267. void PremiumSystemMgr::DepositGoldToPlayerGuildBank(Player* player, uint32 amount)
  268. {
  269. Guild* guild = player->GetGuild();
  270. if (!guild)
  271. return;
  272. uint32 Deposit_Amount = ceil(amount * GetModifier());
  273. std::string money = GetAmountInString(Deposit_Amount);
  274. guild->HandleMemberDepositMoney(player->GetSession(), Deposit_Amount);
  275. ChatHandler(player->GetSession()).PSendSysMessage("%s of your loot get's deposited into your Guild's bank.", money.c_str());
  276. player->ModifyMoney((0 - Deposit_Amount));
  277. }
  278. uint32 PremiumSystemMgr::IncreaseValueWithModifier(Player* player, uint32 value)
  279. {
  280. if (IsPlayerPremium(player))
  281. value += ceil(value * GetModifier());
  282. return value;
  283. }
  284. uint32 PremiumSystemMgr::DecreaseValueWithModifier(Player* player, uint32 value)
  285. {
  286. if (IsPlayerPremium(player))
  287. value -= ceil(value * GetModifier());
  288. return value;
  289. }
  290. void PremiumSystemMgr::RemoveItem(uint32 id, Player* player)
  291. {
  292. player->DestroyItemCount(uint32(id), 1, true);
  293. }
  294. bool PremiumSystemMgr::IsItemPremium(Item* item)
  295. {
  296. if (!item)
  297. return false;
  298. uint32 id = item->GetEntry();
  299. if (!PremiumItem[id].premium)
  300. PremiumItem[id].premium = 0;
  301. return PremiumItem[id].premium != 0;
  302. }
  303. void PremiumSystemMgr::UpdateItemPremiumValue(uint32 item_id, uint8 value)
  304. {
  305. WorldDatabase.PExecute("UPDATE `item_template` SET `premium`='%u' WHERE `entry`=%u;", value, item_id);
  306. PremiumItem[item_id].premium = value;
  307. }
  308. bool PremiumSystemMgr::CheckIfPlayerInCombatOrDead(Player* player)
  309. {
  310. if (player->isFrozen())
  311. {
  312. ChatHandler(player->GetSession()).SendSysMessage("Erm, you're frozen!");
  313. return false;
  314. }
  315. if (player->isDying())
  316. {
  317. ChatHandler(player->GetSession()).SendSysMessage("Erm, you're dying!");
  318. return false;
  319. }
  320. if (player->isDead())
  321. {
  322. ChatHandler(player->GetSession()).SendSysMessage("Erm, you're dead!");
  323. return false;
  324. }
  325. if (player->InArena())
  326. {
  327. ChatHandler(player->GetSession()).SendSysMessage("You are in an arena.");
  328. return false;
  329. }
  330. if (player->IsInCombat())
  331. {
  332. ChatHandler(player->GetSession()).SendSysMessage("You are in combat.");
  333. return false;
  334. }
  335. if (player->InBattleground())
  336. {
  337. ChatHandler(player->GetSession()).SendSysMessage("You are in a battleground.");
  338. return false;
  339. }
  340. return true;
  341. }
  342. void PremiumSystemMgr::TeleportPlayer(Player* player, uint8 id)
  343. {
  344. auto team_id = player->GetTeamId();
  345. uint32 guid = player->GetGUID();
  346. if (!IsPlayerPremium(player))
  347. ChatHandler(player->GetSession()).SendSysMessage("You don't have a Premium rank. You must have a Premium rank to use this command.");
  348. else
  349. {
  350. if (CheckIfPlayerInCombatOrDead(player))
  351. {
  352. switch (id)
  353. {
  354. case 1:
  355. if (PremiumLocations.size() != 2)
  356. ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
  357. else
  358. player->TeleportTo(PremiumLocations[team_id].map_id, PremiumLocations[team_id].x, PremiumLocations[team_id].y, PremiumLocations[team_id].z, PremiumLocations[team_id].o);
  359. break;
  360. case 2:
  361. if (PremiumMallLocations.size() != 2)
  362. ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
  363. else
  364. player->TeleportTo(PremiumMallLocations[team_id].map_id, PremiumMallLocations[team_id].x, PremiumMallLocations[team_id].y, PremiumMallLocations[team_id].z, PremiumMallLocations[team_id].o);
  365. break;
  366. case 3:
  367. if (PremiumPlayerLocations[guid].guid != 0)
  368. player->TeleportTo(PremiumPlayerLocations[guid].map_id, PremiumPlayerLocations[guid].x, PremiumPlayerLocations[guid].y, PremiumPlayerLocations[guid].z, PremiumPlayerLocations[guid].o);
  369. else
  370. ChatHandler(player->GetSession()).SendSysMessage("You must set a location as home first.");
  371. break;
  372. case 4:
  373. if (PremiumTeamLocations.size() != 2)
  374. ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
  375. else
  376. player->TeleportTo(PremiumTeamLocations[team_id].map_id, PremiumTeamLocations[team_id].x, PremiumTeamLocations[team_id].y, PremiumTeamLocations[team_id].z, PremiumTeamLocations[team_id].o);
  377. break;
  378. case 5:
  379. if (PremiumPublicMallLocations.size() != 2)
  380. ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
  381. else
  382. player->TeleportTo(PremiumPublicMallLocations[team_id].map_id, PremiumPublicMallLocations[team_id].x, PremiumPublicMallLocations[team_id].y, PremiumPublicMallLocations[team_id].z, PremiumPublicMallLocations[team_id].o);
  383. break;
  384. }
  385. }
  386. }
  387. }
  388. void PremiumSystemMgr::DeletePremium(Player* player)
  389. {
  390. if (!player)
  391. return;
  392. Premium.erase(GetPlayerPremiumId(player));
  393. }
  394. class PremiumSystemConf : public WorldScript
  395. {
  396. public:
  397. PremiumSystemConf() : WorldScript("PremiumSystemConf") { }
  398. void OnConfigLoad(bool /*reload*/) override
  399. {
  400. TC_LOG_INFO("server.loading", "Loading EmuDevs.com Premium System");
  401. sPremiumSystemMgr->SetPremiumType(sConfigMgr->GetBoolDefault("PREM.TYPE", false)); // 0 = acct, 1 = character.
  402. sPremiumSystemMgr->SetTimerEnabled(sConfigMgr->GetBoolDefault("PREM.TIMED", false)); // 0 = no, 1 = yes duration - Premium will reset after x days..
  403. sPremiumSystemMgr->SetTimerDuration(sConfigMgr->GetIntDefault("PREM.DURATION", 30)); // x in days.
  404. sPremiumSystemMgr->SetGMMinRank(sConfigMgr->GetIntDefault("PREM.GM_MINIMUM_RANK", 3));
  405. sPremiumSystemMgr->SetUpgradeItem(sConfigMgr->GetIntDefault("PREM.UPGRADE_ITEM", 64000));
  406. sPremiumSystemMgr->SetItemEnabled(sConfigMgr->GetBoolDefault("PREM.ITEMS", false));
  407. sPremiumSystemMgr->SetModifier(sConfigMgr->GetFloatDefault("PREM.MODIFIER", 0.2f));
  408. sPremiumSystemMgr->SetChatDelay(sConfigMgr->GetIntDefault("PREM.CHAT_TIMER", 5)); // in seconds, 5 = 5 seconds.
  409. sPremiumSystemMgr->SetChatTeam(sConfigMgr->GetIntDefault("PREM.CHAT_TEAM", 0)); // 0 = team chat only, 1 world chat
  410. sPremiumSystemMgr->SetTPEnabled(sConfigMgr->GetBoolDefault("PREM.TP_ENABLE", false));
  411. sPremiumSystemMgr->SetTPBonus(sConfigMgr->GetIntDefault("PREM.TP_BONUS", 14));
  412. sPremiumSystemMgr->SetHPEnabled(sConfigMgr->GetBoolDefault("PREM.HP_ENABLE", false));
  413. sPremiumSystemMgr->SetManaEnabled(sConfigMgr->GetBoolDefault("PREM.MANA_ENABLE", false));
  414. sPremiumSystemMgr->SetRageEnabled(sConfigMgr->GetBoolDefault("PREM.RAGE_ENABLE", false));
  415. sPremiumSystemMgr->SetTitleId(sConfigMgr->GetIntDefault("PREM.TITLE_ID", 500));
  416. sPremiumSystemMgr->SetTitleMaskId(sConfigMgr->GetIntDefault("PREM.TITLE_MASK_ID", 156));
  417. sPremiumSystemMgr->SetWaterBreathe(sConfigMgr->GetIntDefault("PREM.WATER_BREATHE", 0));
  418. sPremiumSystemMgr->SetSpellCostDecrease(sConfigMgr->GetIntDefault("PREM.SPELL_COST_DECREASE", 0));
  419. if (sPremiumSystemMgr->IsItemsEnabled())
  420. {
  421. QueryResult ItemQery = WorldDatabase.PQuery("SELECT `entry`, `premium` FROM `item_template` WHERE premium='1'");
  422. if (ItemQery)
  423. {
  424. do
  425. {
  426. Field* fields = ItemQery->Fetch();
  427. uint32 item_id = fields[0].GetUInt32();
  428. uint32 premium = fields[1].GetUInt8();
  429. PremiumItemElements& data1 = sPremiumSystemMgr->PremiumItem[item_id];
  430. data1.id = item_id;
  431. data1.premium = premium;
  432. } while (ItemQery->NextRow());
  433. }
  434. }
  435. QueryResult PremLocQry = WorldDatabase.Query("SELECT * FROM premium_locations");
  436. if (PremLocQry)
  437. {
  438. do
  439. {
  440. Field *fields = PremLocQry->Fetch();
  441. uint8 id = fields[0].GetUInt8();
  442. uint32 map_id = fields[1].GetUInt32();
  443. float x = fields[2].GetFloat();
  444. float y = fields[3].GetFloat();
  445. float z = fields[4].GetFloat();
  446. float o = fields[5].GetFloat();
  447. PremiumLocationElements& data2 = sPremiumSystemMgr->PremiumLocations[id];
  448. data2.id = id;
  449. data2.map_id = map_id;
  450. data2.x = x;
  451. data2.y = y;
  452. data2.z = z;
  453. data2.o = o;
  454. } while (PremLocQry->NextRow());
  455. }
  456. QueryResult PremMallLocQry = WorldDatabase.Query("SELECT * FROM premium_Mall_locations");
  457. if (PremMallLocQry)
  458. {
  459. do
  460. {
  461. Field *fields = PremMallLocQry->Fetch();
  462. uint8 id = fields[0].GetUInt8();
  463. uint32 map_id = fields[1].GetUInt32();
  464. float x = fields[2].GetFloat();
  465. float y = fields[3].GetFloat();
  466. float z = fields[4].GetFloat();
  467. float o = fields[5].GetFloat();
  468. PremiumLocationElements& data3 = sPremiumSystemMgr->PremiumMallLocations[id];
  469. data3.id = id;
  470. data3.map_id = map_id;
  471. data3.x = x;
  472. data3.y = y;
  473. data3.z = z;
  474. data3.o = o;
  475. } while (PremMallLocQry->NextRow());
  476. }
  477. QueryResult PremPlayerLocQry = WorldDatabase.Query("SELECT * FROM premium_player_teleports");
  478. if (PremPlayerLocQry)
  479. {
  480. do
  481. {
  482. Field *fields = PremPlayerLocQry->Fetch();
  483. uint32 guid = fields[0].GetUInt32();
  484. uint32 map_id = fields[1].GetUInt32();
  485. float x = fields[2].GetFloat();
  486. float y = fields[3].GetFloat();
  487. float z = fields[4].GetFloat();
  488. float o = fields[5].GetFloat();
  489. PremiumPlayerLocationElements& data4 = sPremiumSystemMgr->PremiumPlayerLocations[guid];
  490. data4.guid = guid;
  491. data4.map_id = map_id;
  492. data4.x = x;
  493. data4.y = y;
  494. data4.z = z;
  495. data4.o = o;
  496. } while (PremPlayerLocQry->NextRow());
  497. }
  498. QueryResult PremTeamLocQry = WorldDatabase.Query("SELECT * FROM premium_team_teleports");
  499. if (PremTeamLocQry)
  500. {
  501. do
  502. {
  503. Field *fields = PremTeamLocQry->Fetch();
  504. uint32 team = fields[0].GetUInt32();
  505. uint32 map_id = fields[1].GetUInt32();
  506. float x = fields[2].GetFloat();
  507. float y = fields[3].GetFloat();
  508. float z = fields[4].GetFloat();
  509. float o = fields[5].GetFloat();
  510. PremiumTeamLocationElements& data5 = sPremiumSystemMgr->PremiumTeamLocations[team];
  511. data5.team = team;
  512. data5.map_id = map_id;
  513. data5.x = x;
  514. data5.y = y;
  515. data5.z = z;
  516. data5.o = o;
  517. } while (PremTeamLocQry->NextRow());
  518. }
  519. QueryResult PremPublicMallLocQry = WorldDatabase.Query("SELECT * FROM premium_Mall_locations");
  520. if (PremPublicMallLocQry)
  521. {
  522. do
  523. {
  524. Field *fields = PremPublicMallLocQry->Fetch();
  525. uint8 id = fields[0].GetUInt8();
  526. uint32 map_id = fields[1].GetUInt32();
  527. float x = fields[2].GetFloat();
  528. float y = fields[3].GetFloat();
  529. float z = fields[4].GetFloat();
  530. float o = fields[5].GetFloat();
  531. PremiumLocationElements& data6 = sPremiumSystemMgr->PremiumPublicMallLocations[id];
  532. data6.id = id;
  533. data6.map_id = map_id;
  534. data6.x = x;
  535. data6.y = y;
  536. data6.z = z;
  537. data6.o = o;
  538. } while (PremPublicMallLocQry->NextRow());
  539. }
  540. TC_LOG_INFO("server.loading", "Loading Premium System Completed. Premium rank upgrade item id: %u", sPremiumSystemMgr->GetUpgradeItem());
  541. }
  542. };
  543. class Premium_Reset_Timer : public BasicEvent
  544. {
  545. public:
  546. Premium_Reset_Timer(Player* player) : player(player)
  547. {
  548. uint32 id = sPremiumSystemMgr->GetPlayerPremiumId(player);
  549. uint64 current_time = sWorld->GetGameTime();
  550. uint64 player_premium_time = sPremiumSystemMgr->Premium[id].time;
  551. uint64 duration = sPremiumSystemMgr->GetDurationInSeconds();
  552. uint64 cycle_duration = ((player_premium_time + duration) - current_time);
  553. player->m_Events.AddEvent(this, player->m_Events.CalculateTime(cycle_duration * 1000));
  554. }
  555. bool Execute(uint64, uint32) override
  556. {
  557. if (player->IsInWorld())
  558. {
  559. ChatHandler(player->GetSession()).SendSysMessage("Your Premium rank has expired.");
  560. sPremiumSystemMgr->UpdatePlayerPremiumValue(player, 0, 0);
  561. }
  562. return true;
  563. }
  564. private:
  565. Player* player;
  566. };
  567. class Premium_Coin_Script : public ItemScript
  568. {
  569. public:
  570. Premium_Coin_Script() : ItemScript("Premium_Coin_Script") { }
  571. bool OnUse(Player* player, Item* item, SpellCastTargets const& targets) override
  572. {
  573. uint32 id = sPremiumSystemMgr->GetPlayerPremiumId(player);
  574. if (sPremiumSystemMgr->IsPlayerPremium(player)) // @TODO: I may just remove this and let players update while they still are Premium ranked.
  575. {
  576. std::string output = sPremiumSystemMgr->GetPlayerPremiumTimeLeftInString(player);
  577. ChatHandler(player->GetSession()).SendSysMessage("You allready have the Premium rank.");
  578. ChatHandler(player->GetSession()).PSendSysMessage("Your Premium Rank will expire in %s.", output.c_str());
  579. }
  580. else
  581. {
  582. sPremiumSystemMgr->RemoveItem(item->GetEntry(), player);
  583. sPremiumSystemMgr->UpdatePlayerPremiumValue(player, 1, sWorld->GetGameTime());
  584. ChatHandler(player->GetSession()).SendSysMessage("Congratulations! You have been awarded the Premium Rank.");
  585. if (sPremiumSystemMgr->IsTimed())
  586. {
  587. std::string output = sPremiumSystemMgr->GetPlayerPremiumTimeLeftInString(player);
  588. ChatHandler(player->GetSession()).PSendSysMessage("Your Premium Rank will expire in %u days.", output.c_str());
  589. }
  590. }
  591. return true;
  592. }
  593. };
  594. class Player_Premium_Engine : public PlayerScript
  595. {
  596. public:
  597. Player_Premium_Engine() : PlayerScript("Player_Premium_Engine") { }
  598. void OnLogout(Player* player) override
  599. {
  600. sPremiumSystemMgr->RemovePremiumFromPlayer(player);
  601. }
  602. void OnLogin(Player* player, bool /*firstLogin*/) override
  603. {
  604. uint32 id = sPremiumSystemMgr->GetPlayerPremiumId(player);
  605. QueryResult premiumQuery = nullptr;
  606. if (sPremiumSystemMgr->GetPremiumType() == 0)
  607. premiumQuery = LoginDatabase.PQuery("SELECT premium, premium_time FROM account WHERE id=%u", id);
  608. else
  609. premiumQuery = CharacterDatabase.PQuery("SELECT premium , premium_time FROM characters WHERE guid=%u", id);
  610. if (premiumQuery)
  611. {
  612. Field* fields = premiumQuery->Fetch();
  613. uint8 premium = fields[0].GetUInt8();
  614. uint32 premium_time = fields[1].GetUInt64();
  615. PremiumElements& data = sPremiumSystemMgr->Premium[id];
  616. data.id = id;
  617. data.premium = premium;
  618. data.time = premium_time;
  619. data.hp = player->GetMaxHealth();
  620. data.power_max = player->GetMaxPower(player->getPowerType());
  621. data.chat = 0;
  622. data.chat_time = 0;
  623. }
  624. if (sPremiumSystemMgr->IsPlayerPremium(player))
  625. {
  626. ChatHandler(player->GetSession()).PSendSysMessage("Greetings %s. You are ranked Premium.", player->GetName());
  627. sPremiumSystemMgr->AddPremiumToPlayer(player);
  628. }
  629. else
  630. {
  631. ChatHandler(player->GetSession()).PSendSysMessage("Greetings %s.You can donate to recieve the Premium rank.", player->GetName());
  632. sPremiumSystemMgr->RemovePremiumFromPlayer(player);
  633. }
  634. }
  635. void OnDuelEnd(Player* killer, Player* victim, DuelCompleteType /*type*/) override
  636. {
  637. if (sPremiumSystemMgr->IsPlayerPremium(killer))
  638. {
  639. killer->SetHealth(killer->GetMaxHealth());
  640. if (killer->getPowerType() == POWER_MANA)
  641. killer->SetPower(POWER_MANA, killer->GetMaxPower(POWER_MANA));
  642. for (uint32 i = 0; i < sizeof(Debuffs) / sizeof(Debuffs); i++)
  643. {
  644. if (killer->HasAura(Debuffs[i]))
  645. killer->RemoveAura(Debuffs[i]);
  646. }
  647. }
  648. if (sPremiumSystemMgr->IsPlayerPremium(victim))
  649. {
  650. victim->SetHealth(victim->GetMaxHealth());
  651. if (victim->getPowerType() == POWER_MANA)
  652. victim->SetPower(POWER_MANA, victim->GetMaxPower(POWER_MANA));
  653. for (uint32 i = 0; i < sizeof(Debuffs) / sizeof(Debuffs); i++)
  654. {
  655. if (victim->HasAura(Debuffs[i]))
  656. victim->RemoveAura(Debuffs[i]);
  657. }
  658. }
  659. }
  660. void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg) override
  661. {
  662. uint64 current_time = sWorld->GetGameTime();
  663. PremiumElements premium = sPremiumSystemMgr->Premium[sPremiumSystemMgr->GetPlayerPremiumId(player)];
  664. std::string PCMSG = "";
  665. std::string ChannelColor = "|cff808080";
  666. std::string TeamColor[2] = { "|cff0080FF", "|cffCC0000" };
  667. if (player->IsGameMaster())
  668. {
  669. premium.time = current_time - sPremiumSystemMgr->GetChatDelay();
  670. premium.last_message = "";
  671. }
  672. if ((msg != "" || msg != "Away") && lang != LANG_ADDON && player->CanSpeak() && premium.chat == 1)
  673. {
  674. if (current_time < (premium.time + sPremiumSystemMgr->GetChatDelay()) || premium.last_message == msg)
  675. ChatHandler(player->GetSession()).SendSysMessage("Spam detect triggered");
  676. else
  677. {
  678. premium.last_message = msg;
  679. premium.time = current_time;
  680. uint8 team_id = player->GetTeamId();
  681. PCMSG += "[" + ChannelColor + "Premium|r][" + TeamColor[team_id] + player->GetName() + "|r]";
  682. if (player->IsGameMaster())
  683. {
  684. PCMSG += "[GM]";
  685. team_id = 2;
  686. }
  687. PCMSG += ":" + msg;
  688. SendPremiumMessage(PCMSG, team_id);
  689. msg = "";
  690. }
  691. }
  692. }
  693. void OnGiveXP(Player* player, uint32& amount, Unit* /*victim*/) override
  694. {
  695. amount = sPremiumSystemMgr->IncreaseValueWithModifier(player, amount);
  696. }
  697. void OnReputationChange(Player* player, uint32 /*factionId*/, int32& standing, bool /*incremental*/) override
  698. {
  699. standing = sPremiumSystemMgr->IncreaseValueWithModifier(player, standing);
  700. }
  701. };
  702. class Unit_Premium_Engine : public UnitScript
  703. {
  704. public:
  705. Unit_Premium_Engine() : UnitScript("Unit_Premium_Engine") { }
  706. void OnHeal(Unit* healer, Unit* reciever, uint32& gain) override
  707. {
  708. Player* healerPlayer = healer->ToPlayer();
  709. if (healerPlayer)
  710. sPremiumSystemMgr->IncreaseValueWithModifier(healerPlayer, gain);
  711. Player* target = reciever->ToPlayer();
  712. if (target)
  713. gain = sPremiumSystemMgr->IncreaseValueWithModifier(target, gain);
  714. }
  715. void OnDamage(Unit* attacker, Unit* victim, uint32& damage) override
  716. {
  717. Player* attackerPlayer = attacker->ToPlayer();
  718. if (attackerPlayer)
  719. damage = sPremiumSystemMgr->IncreaseValueWithModifier(attackerPlayer, damage);
  720. Player* target = victim->ToPlayer();
  721. if (target)
  722. damage = sPremiumSystemMgr->DecreaseValueWithModifier(target, damage);
  723. }
  724. void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage) override
  725. {
  726. Player* attackerPlayer = attacker->ToPlayer();
  727. if (attackerPlayer)
  728. damage = sPremiumSystemMgr->IncreaseValueWithModifier(attackerPlayer, damage);
  729. Player* targetPlayer = target->ToPlayer();
  730. if (targetPlayer)
  731. damage = sPremiumSystemMgr->DecreaseValueWithModifier(targetPlayer, damage);
  732. }
  733. void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage) override
  734. {
  735. Player* attackerPlayer = attacker->ToPlayer();
  736. if (attackerPlayer)
  737. damage = sPremiumSystemMgr->IncreaseValueWithModifier(attackerPlayer, damage);
  738. Player* targetPlayer = target->ToPlayer();
  739. if (targetPlayer)
  740. damage = sPremiumSystemMgr->DecreaseValueWithModifier(targetPlayer, damage);
  741. }
  742. };
  743. class Premium_Commands : public CommandScript
  744. {
  745. public:
  746. Premium_Commands() : CommandScript("Premium_Commands") { }
  747. std::vector<ChatCommand> GetCommands() const
  748. {
  749. static std::vector<ChatCommand> SetPlayerPremiumCommandTable =
  750. {
  751. { "on", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumSetPlayerRankTrueCommand, "allows the Admin to set a players Premium rank to 1." },
  752. { "off", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumSetPlayerRankFalseCommand, "allows the Admin to set a players Premium rank to 0." },
  753. };
  754. static std::vector<ChatCommand> SetItemPremiumCommandTable =
  755. {
  756. { "on", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumSetItemRankTrueCommand, "allows the Admin to set an items Premium rank to 1." },
  757. { "off", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumSetItemRankFalseCommand, "allows the Admin to set an items Premium rank to 0." },
  758. };
  759. static std::vector<ChatCommand> SetPremiumCommandSetTable =
  760. {
  761. { "player", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Player Premium set sub command tree.", SetPlayerPremiumCommandTable },
  762. { "item", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Item Premium set sub command tree.", SetItemPremiumCommandTable },
  763. };
  764. static std::vector<ChatCommand> ResetPremiumCommandTable =
  765. {
  766. { "tp", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumResetTPCommand, "allows the player to reset there talent points without cost." },
  767. };
  768. static std::vector<ChatCommand> SetPremiumCommandChangeTable =
  769. {
  770. { "home", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumSetHomeTeleport, "allows the player to set there custom teleport location." },
  771. { "drink", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumDrinkCommand, "allows the player to increase +5 to Drunk." },
  772. { "drunk", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumDrunkCommand, "allows the player become 100 drunk." },
  773. { "sober", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumSoborCommand, "allows the player to become sobor." },
  774. { "premium", rbac::RBAC_PERM_COMMAND_SERVER, true, NULL, "Premium set sub command tree.", SetPremiumCommandSetTable },
  775. };
  776. static std::vector<ChatCommand> CharacterPremiumCommandChangeTable =
  777. {
  778. { "race", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumChangeRaceCommand, "allows the player to change there race during next login." },
  779. { "faction", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumChangeFactionCommand, "allows the player to change there faction during next login." },
  780. { "customize", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumCustomizeCommand, "allows the player to re-costumize there character during next login." },
  781. };
  782. static std::vector<ChatCommand> ChatPremiumCommandChangeTable =
  783. {
  784. { "on", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumChatOnCommand, "allows the player to set there /s channel to a Premium only chat channel.." },
  785. { "off", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumChatOffCommand, "allows the player to reset there /say to normal function." },
  786. };
  787. static std::vector<ChatCommand> PremiumTeleportLocations =
  788. {
  789. { "location", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumLocationTeleport, "allows the player to teleport to custom Premium only location." },
  790. { "mall", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumMallTeleport, "allows the player to teleport to custom Premium mall location." },
  791. };
  792. static std::vector<ChatCommand> PremiumTeleportTable =
  793. {
  794. { "home", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumTeleportHome, "allows the player to teleport to there personal custom location." },
  795. { "base", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumTeleportBase, "allows the player to teleport to there team base location." },
  796. { "mall", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumTeleportMall, "allows the player to teleport to a public mall custom location." },
  797. { "premium", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Premium locations sub location tree.", PremiumTeleportLocations },
  798. };
  799. static std::vector<ChatCommand> PremiumCommandTable =
  800. {
  801. { "chat", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Premium Chat sub command tree.", ChatPremiumCommandChangeTable },
  802. { "buff", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumBuffCommand, "Premium Command used to Buff your character." },
  803. { "maxskills", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumMaxSkillsCommand, "Premium Command used to repair all items without cost." },
  804. { "morph", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumMorphPlayerCommand, "Premium Command used to morph." },
  805. { "demorph", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumDeMorphPlayerCommand, "Premium Command used to demorph." },
  806. { "repair", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumRepairCommand, "Premium Command used to repair all items without cost." },
  807. { "reset", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Premium reset sub command tree.", ResetPremiumCommandTable },
  808. { "teleport", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Premium set sub command tree.", PremiumTeleportTable },
  809. { "set", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Premium set sub command tree.", SetPremiumCommandChangeTable },
  810. { "character", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Premium Character customizing commands.", CharacterPremiumCommandChangeTable },
  811. { "on", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumOnCommand, "Fast activate Premium Title." },
  812. { "off", rbac::RBAC_IN_GRANTED_LIST, true, &HandlePremiumOffCommand, "Fast un-activate Premium Title." },
  813. };
  814. static std::vector<ChatCommand> commandTable =
  815. {
  816. { "premium", rbac::RBAC_IN_GRANTED_LIST, true, NULL, "Premium custom commands.", PremiumCommandTable },
  817. };
  818. return commandTable;
  819. }
  820. static bool HandlePremiumRepairCommand(ChatHandler* handler, const char* args)
  821. {
  822. Player* player = handler->GetSession()->GetPlayer();
  823. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  824. {
  825. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  826. return false;
  827. }
  828. player->DurabilityRepairAll(0, 0, false);
  829. handler->SendSysMessage("Done.");
  830. return true;
  831. }
  832. static bool HandlePremiumBuffCommand(ChatHandler* handler, const char* args)
  833. {
  834. Player* player = handler->GetSession()->GetPlayer();
  835. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  836. {
  837. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  838. return false;
  839. }
  840. for (uint8 i = 0; i < sizeof(Buffs) / sizeof(*Buffs); i++)
  841. player->AddAura(Buffs[i], player);
  842. return true;
  843. }
  844. static bool HandlePremiumResetTPCommand(ChatHandler* handler, const char* args)
  845. {
  846. Player* player = handler->GetSession()->GetPlayer();
  847. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  848. {
  849. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  850. return false;
  851. }
  852. player->ResetTalents(true);
  853. uint32 tp = player->GetFreeTalentPoints();
  854. uint32 extratp = sPremiumSystemMgr->GetTalentPointBonus();
  855. player->SetFreeTalentPoints(tp + extratp);
  856. player->SendTalentsInfoData(false);
  857. ChatHandler(player->GetSession()).SendSysMessage("Your Talent Points have been reset.");
  858. ChatHandler(player->GetSession()).PSendSysMessage("+ %utp.", extratp);
  859. return true;
  860. }
  861. static bool HandlePremiumDrinkCommand(ChatHandler* handler, const char* args)
  862. {
  863. Player* player = handler->GetSession()->GetPlayer();
  864. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  865. {
  866. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  867. return false;
  868. }
  869. uint8 drink = player->GetDrunkValue() + 5;
  870. player->SetDrunkValue(drink);
  871. handler->SendSysMessage("Down the hatch!");
  872. return true;
  873. }
  874. static bool HandlePremiumDrunkCommand(ChatHandler* handler, const char* args)
  875. {
  876. Player* player = handler->GetSession()->GetPlayer();
  877. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  878. {
  879. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  880. return false;
  881. }
  882. player->SetDrunkValue(100);
  883. handler->SendSysMessage("You're drunk!");
  884. return true;
  885. }
  886. static bool HandlePremiumSoborCommand(ChatHandler* handler, const char* args)
  887. {
  888. Player* player = handler->GetSession()->GetPlayer();
  889. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  890. {
  891. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  892. return false;
  893. }
  894. player->SetDrunkValue(1);
  895. handler->SendSysMessage("You're now sobor..");
  896. return true;
  897. }
  898. static bool HandlePremiumChangeRaceCommand(ChatHandler* handler, const char* args)
  899. {
  900. Player* player = handler->GetSession()->GetPlayer();
  901. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  902. {
  903. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  904. return false;
  905. }
  906. player->SetAtLoginFlag(AT_LOGIN_CHANGE_RACE);
  907. handler->SendSysMessage("Relog to change race of your character.");
  908. return true;
  909. }
  910. static bool HandlePremiumChangeFactionCommand(ChatHandler* handler, const char* args)
  911. {
  912. Player* player = handler->GetSession()->GetPlayer();
  913. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  914. {
  915. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  916. return false;
  917. }
  918. player->SetAtLoginFlag(AT_LOGIN_CHANGE_FACTION);
  919. handler->SendSysMessage("Relog to change faction of your character.");
  920. return true;
  921. }
  922. static bool HandlePremiumCustomizeCommand(ChatHandler* handler, const char* args)
  923. {
  924. Player* player = handler->GetSession()->GetPlayer();
  925. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  926. {
  927. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  928. return false;
  929. }
  930. player->SetAtLoginFlag(AT_LOGIN_CUSTOMIZE);
  931. handler->SendSysMessage("Relog to customize your character.");
  932. return true;
  933. }
  934. static bool HandlePremiumChatOnCommand(ChatHandler* handler, const char* args)
  935. {
  936. Player* player = handler->GetSession()->GetPlayer();
  937. if (!sPremiumSystemMgr->IsPlayerPremium(player) || !player->IsGameMaster())
  938. {
  939. handler->PSendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  940. return false;
  941. }
  942. PremiumElements premium = sPremiumSystemMgr->Premium[sPremiumSystemMgr->GetPlayerPremiumId(player)];
  943. premium.chat = true;
  944. premium.chat_time = sWorld->GetGameTime() - sPremiumSystemMgr->GetChatDelay();
  945. handler->SendSysMessage("Premium Chat on.");
  946. handler->SendSysMessage("now switch to `/s` and chat away.");
  947. return true;
  948. }
  949. static bool HandlePremiumChatOffCommand(ChatHandler* handler, const char* args)
  950. {
  951. Player* player = handler->GetSession()->GetPlayer();
  952. if (!sPremiumSystemMgr->IsPlayerPremium(player) || !player->IsGameMaster())
  953. {
  954. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  955. return false;
  956. }
  957. uint32 id = sPremiumSystemMgr->GetPlayerPremiumId(player);
  958. sPremiumSystemMgr->Premium[id].chat = false;
  959. ChatHandler(player->GetSession()).SendSysMessage("Premium Chat off.");
  960. return false;
  961. }
  962. static bool HandlePremiumMorphPlayerCommand(ChatHandler* handler, const char* args)
  963. {
  964. Player* player = handler->GetSession()->GetPlayer();
  965. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  966. {
  967. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  968. return false;
  969. }
  970. player->SetDisplayId((uint32)atol((char*)args));
  971. return true;
  972. }
  973. static bool HandlePremiumDeMorphPlayerCommand(ChatHandler* handler, const char* args)
  974. {
  975. Player* player = handler->GetSession()->GetPlayer();
  976. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  977. {
  978. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  979. return false;
  980. }
  981. player->RestoreDisplayId();
  982. return true;
  983. }
  984. static bool HandlePremiumMaxSkillsCommand(ChatHandler* handler, const char* args)
  985. {
  986. Player* player = handler->GetSession()->GetPlayer();
  987. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  988. {
  989. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  990. return false;
  991. }
  992. player->UpdateSkillsToMaxSkillsForLevel();
  993. handler->SendSysMessage("Your skills have been maxed.");
  994. return true;
  995. }
  996. static bool HandlePremiumOnCommand(ChatHandler* handler, const char* args)
  997. {
  998. Player* player = handler->GetSession()->GetPlayer();
  999. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  1000. {
  1001. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  1002. return false;
  1003. }
  1004. if (sPremiumSystemMgr->GetTitleId() == 0)
  1005. {
  1006. handler->SendSysMessage("The Admin hasn't added a custom title yet.");
  1007. return false;
  1008. }
  1009. if (!player->HasTitle(sPremiumSystemMgr->GetTitleId()))
  1010. player->SetTitle(sCharTitlesStore.LookupEntry(sPremiumSystemMgr->GetTitleId()), false);
  1011. player->SetUInt32Value(PLAYER_CHOSEN_TITLE, sPremiumSystemMgr->GetTitleMaskId());
  1012. return true;
  1013. }
  1014. static bool HandlePremiumOffCommand(ChatHandler* handler, const char* args)
  1015. {
  1016. Player* player = handler->GetSession()->GetPlayer();
  1017. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  1018. {
  1019. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  1020. return false;
  1021. }
  1022. if (sPremiumSystemMgr->GetTitleId() == 0)
  1023. {
  1024. handler->PSendSysMessage("The Admin hasn't added a custom title yet.");
  1025. return false;
  1026. }
  1027. player->SetUInt32Value(PLAYER_CHOSEN_TITLE, -1);
  1028. return true;
  1029. }
  1030. static bool HandlePremiumSetPlayerRankTrueCommand(ChatHandler* handler, const char* args)
  1031. {
  1032. Player* player = handler->GetSession()->GetPlayer();
  1033. Player* target = player->GetSelectedPlayer();
  1034. uint64 game_time = sWorld->GetGameTime();
  1035. if (player->GetSession()->GetSecurity() >= sPremiumSystemMgr->GetGMMinRank())
  1036. {
  1037. if (target)
  1038. {
  1039. sPremiumSystemMgr->UpdatePlayerPremiumValue(target, 1, game_time);
  1040. ChatHandler(player->GetSession()).PSendSysMessage("You have added the Premium rank to %s.", target->GetName().c_str());
  1041. }
  1042. else
  1043. ChatHandler(player->GetSession()).SendSysMessage("Please target a player.");
  1044. }
  1045. return true;
  1046. }
  1047. static bool HandlePremiumSetPlayerRankFalseCommand(ChatHandler* handler, const char* args)
  1048. {
  1049. Player* player = handler->GetSession()->GetPlayer();
  1050. Player* target = player->GetSelectedPlayer();
  1051. uint64 game_time = sWorld->GetGameTime();
  1052. std::string arg = args;
  1053. if (player->GetSession()->GetSecurity() >= sPremiumSystemMgr->GetGMMinRank())
  1054. {
  1055. if (target)
  1056. {
  1057. sPremiumSystemMgr->UpdatePlayerPremiumValue(target, 0, 0);
  1058. ChatHandler(player->GetSession()).PSendSysMessage("You have removed %s`s Premium rank.", target->GetName().c_str());
  1059. }
  1060. else
  1061. ChatHandler(player->GetSession()).SendSysMessage("Please target a player.");
  1062. }
  1063. return true;
  1064. }
  1065. static bool HandlePremiumSetItemRankTrueCommand(ChatHandler* handler, const char* args)
  1066. {
  1067. Player* player = handler->GetSession()->GetPlayer();
  1068. std::string arg = args;
  1069. if (player->GetSession()->GetSecurity() >= sPremiumSystemMgr->GetGMMinRank())
  1070. {
  1071. if (arg != "")
  1072. {
  1073. sPremiumSystemMgr->UpdateItemPremiumValue(sPremiumSystemMgr->ConvertStringToNumber(arg), 1);
  1074. ChatHandler(player->GetSession()).PSendSysMessage("Item %u set to %u", sPremiumSystemMgr->ConvertStringToNumber(arg), 1);
  1075. }
  1076. else
  1077. ChatHandler(player->GetSession()).SendSysMessage("enter an item id.");
  1078. }
  1079. return true;
  1080. }
  1081. static bool HandlePremiumSetItemRankFalseCommand(ChatHandler* handler, const char* args)
  1082. {
  1083. Player* player = handler->GetSession()->GetPlayer();
  1084. std::string arg = args;
  1085. if (player->GetSession()->GetSecurity() >= sPremiumSystemMgr->GetGMMinRank())
  1086. {
  1087. if (arg != "")
  1088. {
  1089. sPremiumSystemMgr->UpdateItemPremiumValue(sPremiumSystemMgr->ConvertStringToNumber(arg), 0);
  1090. ChatHandler(player->GetSession()).PSendSysMessage("Item %u set to %u", sPremiumSystemMgr->ConvertStringToNumber(arg), 0);
  1091. }
  1092. else
  1093. ChatHandler(player->GetSession()).SendSysMessage("Enter an item id!");
  1094. }
  1095. return true;
  1096. }
  1097. static bool HandlePremiumLocationTeleport(ChatHandler* handler, const char* args)
  1098. {
  1099. Player* player = handler->GetSession()->GetPlayer();
  1100. sPremiumSystemMgr->TeleportPlayer(player, 1);
  1101. return true;
  1102. }
  1103. static bool HandlePremiumMallTeleport(ChatHandler* handler, const char* args)
  1104. {
  1105. Player* player = handler->GetSession()->GetPlayer();
  1106. sPremiumSystemMgr->TeleportPlayer(player, 2);
  1107. return true;
  1108. }
  1109. static bool HandlePremiumTeleportHome(ChatHandler* handler, const char* args)
  1110. {
  1111. Player* player = handler->GetSession()->GetPlayer();
  1112. sPremiumSystemMgr->TeleportPlayer(player, 3);
  1113. return true;
  1114. }
  1115. static bool HandlePremiumTeleportBase(ChatHandler* handler, const char* args)
  1116. {
  1117. Player* player = handler->GetSession()->GetPlayer();
  1118. sPremiumSystemMgr->TeleportPlayer(player, 4);
  1119. return true;
  1120. }
  1121. static bool HandlePremiumTeleportMall(ChatHandler* handler, const char* args)
  1122. {
  1123. Player* player = handler->GetSession()->GetPlayer();
  1124. sPremiumSystemMgr->TeleportPlayer(player, 5);
  1125. return true;
  1126. }
  1127. static bool HandlePremiumSetHomeTeleport(ChatHandler* handler, const char* args)
  1128. {
  1129. Player* player = handler->GetSession()->GetPlayer();
  1130. if (!sPremiumSystemMgr->IsPlayerPremium(player))
  1131. {
  1132. handler->SendSysMessage("You dont have the Premium rank. You must have the Premium rank to use this command.");
  1133. return false;
  1134. }
  1135. sPremiumSystemMgr->UpdatePlayerCustomHomeTeleport(player->GetGUID(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation());
  1136. handler->SendSysMessage("Location set.");
  1137. return true;
  1138. }
  1139. };
  1140. void AddSC_Premium_System()
  1141. {
  1142. new PremiumSystemConf;
  1143. new Unit_Premium_Engine;
  1144. new Player_Premium_Engine;
  1145. new Premium_Coin_Script;
  1146. new Premium_Commands;
  1147. }