· 7 years ago · Nov 12, 2018, 03:54 PM
1From 9f69e2096ac48903b95300201e2a7eff4bb62bda Mon Sep 17 00:00:00 2001
2From: sun <ownedned123@gmail.com>
3Date: Sun, 11 Nov 2018 13:24:24 -0500
4Subject: [PATCH 1/1] Scripts/PlayedTime: implement PlayedTime /!SQLTOAPPLY!/
5
6---
7 .../characters/11_11_18_character_played_time.sql | 6 +
8 sql/custom/world/11_11_18_z_playedtime_reward.sql | 28 ++
9 src/server/scripts/Custom/Artamedes/PlayedTime.cpp | 378 +++++++++++++++++++++
10 src/server/scripts/Custom/Artamedes/PlayedTime.hpp | 53 +++
11 4 files changed, 465 insertions(+)
12 create mode 100644 sql/custom/characters/11_11_18_character_played_time.sql
13 create mode 100644 sql/custom/world/11_11_18_z_playedtime_reward.sql
14 create mode 100644 src/server/scripts/Custom/Artamedes/PlayedTime.hpp
15
16diff --git a/sql/custom/characters/11_11_18_character_played_time.sql b/sql/custom/characters/11_11_18_character_played_time.sql
17new file mode 100644
18index 0000000..d076656
19--- /dev/null
20+++ b/sql/custom/characters/11_11_18_character_played_time.sql
21@@ -0,0 +1,6 @@
22+-- Dumping structure for table characters_orginal255.z_playtime_rewarded_players
23+CREATE TABLE IF NOT EXISTS `z_playtime_rewarded_players` (
24+ `guid` int(11) NOT NULL DEFAULT '0',
25+ `redeems` text NOT NULL,
26+ PRIMARY KEY (`guid`)
27+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
28diff --git a/sql/custom/world/11_11_18_z_playedtime_reward.sql b/sql/custom/world/11_11_18_z_playedtime_reward.sql
29new file mode 100644
30index 0000000..b1259e9
31--- /dev/null
32+++ b/sql/custom/world/11_11_18_z_playedtime_reward.sql
33@@ -0,0 +1,28 @@
34+
35+-- Dumping structure for table worldcs.z_playtime_reward
36+CREATE TABLE IF NOT EXISTS `z_playtime_reward` (
37+ `id` int(11) NOT NULL DEFAULT '0',
38+ `requiredPlayedTime` int(11) NOT NULL DEFAULT '0',
39+ `GossipMessage` text NOT NULL,
40+ `RewardItemId1` int(11) NOT NULL DEFAULT '0',
41+ `RewardItemId2` int(11) NOT NULL DEFAULT '0',
42+ `RewardItemId3` int(11) NOT NULL DEFAULT '0',
43+ `RewardItemId4` int(11) NOT NULL DEFAULT '0',
44+ `RewardItemId5` int(11) NOT NULL DEFAULT '0',
45+ `RewardItemId6` int(11) NOT NULL DEFAULT '0',
46+ `RewardItemCount1` int(11) NOT NULL DEFAULT '0',
47+ `RewardItemCount2` int(11) NOT NULL DEFAULT '0',
48+ `RewardItemCount3` int(11) NOT NULL DEFAULT '0',
49+ `RewardItemCount4` int(11) NOT NULL DEFAULT '0',
50+ `RewardItemCount5` int(11) NOT NULL DEFAULT '0',
51+ `RewardItemCount6` int(11) NOT NULL DEFAULT '0',
52+ `RewardVotePoints` int(11) NOT NULL DEFAULT '0',
53+ `RewardDonationPoints` int(11) NOT NULL DEFAULT '0',
54+ PRIMARY KEY (`id`)
55+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
56+
57+DELETE from `npc_text` WHERE `ID` IN (951832, 951831, 951830);
58+INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `BroadcastTextID0`, `lang0`, `Probability0`, `em0_0`, `em0_1`, `em0_2`, `em0_3`, `em0_4`, `em0_5`, `text1_0`, `text1_1`, `BroadcastTextID1`, `lang1`, `Probability1`, `em1_0`, `em1_1`, `em1_2`, `em1_3`, `em1_4`, `em1_5`, `text2_0`, `text2_1`, `BroadcastTextID2`, `lang2`, `Probability2`, `em2_0`, `em2_1`, `em2_2`, `em2_3`, `em2_4`, `em2_5`, `text3_0`, `text3_1`, `BroadcastTextID3`, `lang3`, `Probability3`, `em3_0`, `em3_1`, `em3_2`, `em3_3`, `em3_4`, `em3_5`, `text4_0`, `text4_1`, `BroadcastTextID4`, `lang4`, `Probability4`, `em4_0`, `em4_1`, `em4_2`, `em4_3`, `em4_4`, `em4_5`, `text5_0`, `text5_1`, `BroadcastTextID5`, `lang5`, `Probability5`, `em5_0`, `em5_1`, `em5_2`, `em5_3`, `em5_4`, `em5_5`, `text6_0`, `text6_1`, `BroadcastTextID6`, `lang6`, `Probability6`, `em6_0`, `em6_1`, `em6_2`, `em6_3`, `em6_4`, `em6_5`, `text7_0`, `text7_1`, `BroadcastTextID7`, `lang7`, `Probability7`, `em7_0`, `em7_1`, `em7_2`, `em7_3`, `em7_4`, `em7_5`, `VerifiedBuild`) VALUES
59+(951830, '|cff0055FFAll great achievements require time', '|cff0055FFAll great achievements require time', 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
60+(951831, '|cff0055FFAll great achievements require time', '|cff0055FFAll great achievements require time', 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
61+(951832, '|cff0055FFAll great achievements require time', '|cff0055FFAll great achievements require time', 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
62diff --git a/src/server/scripts/Custom/Artamedes/PlayedTime.cpp b/src/server/scripts/Custom/Artamedes/PlayedTime.cpp
63index e69de29..55adc25 100644
64--- a/src/server/scripts/Custom/Artamedes/PlayedTime.cpp
65+++ b/src/server/scripts/Custom/Artamedes/PlayedTime.cpp
66@@ -0,0 +1,378 @@
67+#include "PlayedTime.hpp"
68+
69+#include "Player.h"
70+#include "ScriptMgr.h"
71+#include "ScriptedGossip.h"
72+#include "GossipDef.h"
73+
74+#include <time.h>
75+
76+void PlayedTimeMgr::LoadFromDatabase(bool p_Reload)
77+{
78+ if(p_Reload)
79+ m_PTContainer.clear();
80+ else
81+ {
82+ ///Loading from Char DB
83+
84+ QueryResult l_Result = CharacterDatabase.PQuery("SELECT guid, redeems FROM z_playtime_rewarded_players");
85+
86+ if (l_Result)
87+ {
88+ do
89+ {
90+ Field* l_Fields = l_Result->Fetch();
91+
92+ uint32 l_DBGUid = l_Fields[0].GetUInt32();
93+ Tokenizer l_Tokens(l_Fields[1].GetString(), ' ');
94+
95+ ObjectGuid l_Guid = ObjectGuid(HighGuid::Player, l_DBGUid);
96+
97+ for (auto const& l_Token : l_Tokens)
98+ {
99+ uint32 l_PlayedTimeId = atol(l_Token);
100+
101+ m_RedeemedPlayedTimeRewardContainer[l_Guid].emplace_back(l_PlayedTimeId);
102+ }
103+
104+ } while (l_Result->NextRow());
105+ }
106+ }
107+ //0 1 2 3 4 5 6 7 8 9 10 11 12 `13 14 15 16
108+ QueryResult l_Result = WorldDatabase.PQuery("SELECT id, requiredPlayedTime, GossipMessage, RewardItemId1, RewardItemId2, RewardItemId3, RewardItemId4, RewardItemId5, RewardItemId6, RewardItemCount1, RewardItemCount2, RewardItemCount3, RewardItemCount4, RewardItemCount5, RewardItemCount6, RewardVotePoints, RewardDonationPoints FROM z_playtime_reward");
109+
110+ if (!l_Result)
111+ return;
112+
113+ do
114+ {
115+ Field* l_Fields = l_Result->Fetch();
116+
117+ PlayedTimeTable l_Table;
118+
119+ l_Table.RequiredPlayedTime = l_Fields[1].GetUInt32();
120+ l_Table.GossipMessage = l_Fields[2].GetString();
121+
122+ for (int i = 0; i < 6; ++i)
123+ {
124+ l_Table.RewardItemId[i] = l_Fields[3 + i].GetUInt32();
125+ l_Table.RewardItemCount[i] = l_Fields[9 + i].GetUInt32();
126+ }
127+
128+ l_Table.RewardVotePoints = l_Fields[15].GetUInt32();
129+ l_Table.RewardDonationPoints = l_Fields[16].GetUInt32();
130+
131+ m_PTContainer[l_Fields[0].GetUInt32()] = l_Table;
132+
133+ } while (l_Result->NextRow());
134+}
135+
136+bool PlayedTimeMgr::IsAllowedToRedeem(ObjectGuid p_Guid, uint32 p_PlayedTimeId) const
137+{
138+ if (m_PTContainer.find(p_PlayedTimeId) == m_PTContainer.end())
139+ return false;
140+
141+ if (m_RedeemedPlayedTimeRewardContainer.find(p_Guid) == m_RedeemedPlayedTimeRewardContainer.end())
142+ return true;
143+
144+ auto const& l_PlayerRewarded = m_RedeemedPlayedTimeRewardContainer.at(p_Guid);
145+
146+ return std::find(l_PlayerRewarded.begin(), l_PlayerRewarded.end(), p_PlayedTimeId) == l_PlayerRewarded.end();
147+}
148+
149+void PlayedTimeMgr::ReedeemPlayedTime(Player * p_Player, uint32 p_PlayedTimeId)
150+{
151+ auto ApplyRecordToDatabase([](uint32 p_GuidLow, std::vector<uint32> p_PlayedTimeIds) -> void
152+ {
153+ std::ostringstream l_SS;
154+
155+ for (uint32 const& l_Data : p_PlayedTimeIds)
156+ l_SS << l_Data << " ";
157+
158+ CharacterDatabase.PQuery("REPLACE INTO z_playtime_rewarded_players (guid, redeems) VALUES (%u, '%s')", p_GuidLow, l_SS.str().c_str());
159+ });
160+
161+ m_RedeemedPlayedTimeRewardContainer[p_Player->GetGUID()].emplace_back(p_PlayedTimeId);
162+
163+ auto const& l_PlayerRewarded = m_RedeemedPlayedTimeRewardContainer.at(p_Player->GetGUID());
164+
165+ ApplyRecordToDatabase(p_Player->GetGUID().GetCounter(), l_PlayerRewarded);
166+}
167+
168+class PlayedTime_WorldScript : public WorldScript
169+{
170+public:
171+ PlayedTime_WorldScript() : WorldScript("PlayedTime_WorldScript") { }
172+
173+ void OnStartup()
174+ {
175+ sPlayedTimeMgr->LoadFromDatabase();
176+ }
177+};
178+
179+class npc_playedtime : public CreatureScript
180+{
181+public:
182+ npc_playedtime() : CreatureScript("npc_playedtime") { }
183+
184+ enum eSenders
185+ {
186+ SenderMenu,
187+ SenderReward
188+ };
189+
190+ enum eActions
191+ {
192+ ActionMenuPlayedGift = 1,
193+ ActionMenuPlayedTimeRanking,
194+ ActionGoBackToGossipHello,
195+ };
196+
197+ enum eNpcTextIds
198+ {
199+ TextGossipHello = 951830,
200+ TextPlayedGift,
201+ TextPlayuedTimeRanking,
202+ };
203+
204+ bool OnGossipHello(Player* p_Player, Creature* p_Creature) override
205+ {
206+ p_Player->PlayerTalkClass->ClearMenus();
207+
208+ p_Player->ADD_GOSSIP_ITEM(0, "Played Gifts", SenderMenu, ActionMenuPlayedGift);
209+ p_Player->ADD_GOSSIP_ITEM(0, "Played Time Ranking", SenderMenu, ActionMenuPlayedTimeRanking);
210+
211+ p_Player->SEND_GOSSIP_MENU(TextGossipHello, p_Creature->GetGUID());
212+
213+ return true;
214+ }
215+
216+ bool OnGossipSelect(Player* p_Player, Creature* p_Creature, uint32 p_Sender, uint32 p_Action) override
217+ {
218+ p_Player->PlayerTalkClass->ClearMenus();
219+
220+ switch (p_Sender)
221+ {
222+ case SenderMenu:
223+
224+ switch (p_Action)
225+ {
226+ case ActionMenuPlayedGift:
227+ return _ShowMenuPlayedGift(p_Player, p_Creature);
228+
229+ case ActionMenuPlayedTimeRanking:
230+ return _ShowMenuPlayedTimeRanking(p_Player, p_Creature);
231+
232+ case ActionGoBackToGossipHello:
233+ return OnGossipHello(p_Player, p_Creature);
234+ }
235+
236+ break;
237+
238+ case SenderReward:
239+ return _TryAndReward(p_Player, p_Creature, p_Action);
240+ }
241+
242+ return true;
243+ }
244+
245+private:
246+
247+ std::string _TimeParser(uint32 p_TotalTime) const
248+ {
249+ uint32 l_Days = p_TotalTime / 216000;
250+ p_TotalTime %= 216000;
251+ uint32 l_Hours = p_TotalTime / 3600;
252+ p_TotalTime %= 3600;
253+ uint32 l_Minutes = p_TotalTime / 60;
254+ p_TotalTime %= 60;
255+ uint32 l_Seconds = p_TotalTime / 1;
256+
257+ std::ostringstream l_SS;
258+
259+ if (l_Days)
260+ l_SS << l_Days << " days, ";
261+
262+ if (l_Hours)
263+ l_SS << l_Hours << " hours, ";
264+
265+ if (l_Minutes)
266+ l_SS << l_Minutes << " minutes, ";
267+
268+ if (l_Seconds)
269+ l_SS << l_Seconds << " seconds.";
270+
271+ return l_SS.str();
272+ }
273+
274+ std::string _GetClassIcon(uint32 p_Class) const
275+ {
276+ switch (p_Class)
277+ {
278+ case CLASS_WARRIOR:
279+ return "inv_sword_27";
280+ case CLASS_PALADIN:
281+ return "ability_thunderbolt";
282+ case CLASS_HUNTER:
283+ return "inv_weapon_bow_07";
284+ case CLASS_ROGUE:
285+ return "inv_throwingknife_04";
286+ case CLASS_PRIEST:
287+ return "inv_staff_30";
288+ case CLASS_MAGE:
289+ return "inv_staff_13";
290+ case CLASS_DRUID:
291+ return "inv_misc_monsterclaw_04";
292+ case CLASS_WARLOCK:
293+ return "spell_nature_drowsy";
294+ case CLASS_DEATH_KNIGHT:
295+ return "spell_deathknight_classicon";
296+ case CLASS_SHAMAN:
297+ return "inv_jewelry_talisman_04";
298+ }
299+
300+ return "inv_misc_questionmark";
301+ }
302+
303+ std::string _GetClassColor(uint32 p_Class) const
304+ {
305+ switch (p_Class)
306+ {
307+ case CLASS_WARRIOR:
308+ return "|cffC79C6E";
309+ case CLASS_PALADIN:
310+ return "|cffF58CBA";
311+ case CLASS_HUNTER:
312+ return "|cffABD473";
313+ case CLASS_ROGUE:
314+ return "|cffFFF569";
315+ case CLASS_PRIEST:
316+ return "|cffFFFFFF";
317+ case CLASS_MAGE:
318+ return "|cff40C7EB";
319+ case CLASS_DRUID:
320+ return "|cffFF7D0A";
321+ case CLASS_WARLOCK:
322+ return "|cff8787ED";
323+ case CLASS_DEATH_KNIGHT:
324+ return "|cffC41F3B";
325+ case CLASS_SHAMAN:
326+ return "|cff0070DE";
327+ }
328+
329+ return "|cFF000000";
330+ }
331+
332+ bool _ShowMenuPlayedGift(Player* p_Player, Creature* p_Creature) const
333+ {
334+ p_Player->PlayerTalkClass->ClearMenus();
335+
336+ std::ostringstream l_SS;
337+
338+ for (auto const& l_Itr : sPlayedTimeMgr->GetAllPlayedTimeEntries())
339+ {
340+ auto const& l_Entry = l_Itr.second;
341+
342+ l_SS << _TimeParser(l_Entry.RequiredPlayedTime) << "of /played: ";
343+
344+ if (p_Player->GetTotalPlayedTime() >= l_Entry.RequiredPlayedTime)
345+ l_SS << (sPlayedTimeMgr->IsAllowedToRedeem(p_Player->GetGUID(), l_Itr.first) ? "|cff3EFF00REDEEMABLE" : "|cff00C5FFREDEEMED");
346+ else
347+ l_SS << "|cffFF0000IN PROGRESS";
348+
349+ std::string const& l_GossipMessage = l_Entry.GossipMessage;
350+
351+ if (l_GossipMessage.empty())
352+ p_Player->ADD_GOSSIP_ITEM(0, l_SS.str(), SenderReward, l_Itr.first);
353+ else
354+ p_Player->ADD_GOSSIP_ITEM_EXTENDED(0, l_SS.str(), SenderReward, l_Itr.first, l_GossipMessage, 0, false);
355+
356+ l_SS.clear();
357+ l_SS.str("");
358+ }
359+
360+ p_Player->ADD_GOSSIP_ITEM(0, "Previous", SenderMenu, ActionMenuPlayedTimeRanking);
361+
362+ p_Player->SEND_GOSSIP_MENU(TextPlayedGift, p_Creature->GetGUID());
363+ return true;
364+ }
365+
366+ bool _ShowMenuPlayedTimeRanking(Player* p_Player, Creature* p_Creature) const
367+ {
368+ p_Player->PlayerTalkClass->ClearMenus();
369+
370+ ///!TODO fix or convert to async or add timer..
371+ QueryResult l_Result = CharacterDatabase.PQuery("select name, totaltime, class from characters ORDER by totaltime desc LIMIT 10");
372+
373+ std::ostringstream l_SS;
374+
375+ uint32 l_I = 0;
376+
377+ do
378+ {
379+ Field* l_Fields = l_Result->Fetch();
380+
381+ std::string l_Name = l_Fields[0].GetString();
382+ uint32 l_TotalTime = l_Fields[1].GetUInt32();
383+ uint32 l_Class = l_Fields[2].GetUInt32();
384+
385+ l_SS << ++l_I << ". |TInterface/Icons/" << _GetClassIcon(l_Class) << ":30|t " << _GetClassColor(l_Class) << l_Name << "|R " << _TimeParser(l_TotalTime);
386+
387+ p_Player->ADD_GOSSIP_ITEM(0, l_SS.str(), SenderMenu, ActionMenuPlayedTimeRanking);
388+
389+ l_SS.clear();
390+ l_SS.str("");
391+
392+ } while (l_Result->NextRow());
393+
394+ p_Player->ADD_GOSSIP_ITEM(0, "Previous", SenderMenu, ActionMenuPlayedTimeRanking);
395+
396+ p_Player->SEND_GOSSIP_MENU(TextPlayuedTimeRanking, p_Creature->GetGUID());
397+
398+ return true;
399+ }
400+
401+ bool _TryAndReward(Player* p_Player, Creature* p_Creature, uint32 p_ID) const
402+ {
403+ p_Player->CLOSE_GOSSIP_MENU();
404+
405+ if (sPlayedTimeMgr->IsAllowedToRedeem(p_Player->GetGUID(), p_ID))
406+ {
407+ auto l_Rewards = sPlayedTimeMgr->GetRewardFromId(p_ID);
408+
409+ ///Add Items
410+ for (int l_I = 0; l_I < 6; ++l_I)
411+ {
412+ if (l_Rewards.RewardItemId[l_I] && sObjectMgr->GetItemTemplate(l_Rewards.RewardItemId[l_I]))
413+ if (!p_Player->AddItem(l_Rewards.RewardItemId[l_I], l_Rewards.RewardItemCount[l_I]))
414+ p_Player->SendItemRetrievalMail(l_Rewards.RewardItemId[l_I], l_Rewards.RewardItemCount[l_I]);
415+ }
416+
417+ ///Add VP
418+ if (uint32 const& l_Point = l_Rewards.RewardVotePoints)
419+ {
420+ LoginDatabase.PExecute("UPDATE newsites.account_data SET vp = VP + %u WHERE id = %u", l_Point, p_Player->GetSession()->GetAccountId());
421+ ChatHandler(p_Player->GetSession()).PSendSysMessage("+%u VP", l_Point);
422+ }
423+
424+ ///Add DP
425+ if (uint32 const& l_Point = l_Rewards.RewardDonationPoints)
426+ {
427+ LoginDatabase.PExecute("UPDATE newsites.account_data SET dp = dp + %u WHERE id = %u", l_Point, p_Player->GetSession()->GetAccountId());
428+ ChatHandler(p_Player->GetSession()).PSendSysMessage("+%u DP", l_Point);
429+ }
430+
431+ sPlayedTimeMgr->ReedeemPlayedTime(p_Player, p_ID);
432+ }
433+ else
434+ ChatHandler(p_Player->GetSession()).SendSysMessage("You already redeemed this!");
435+
436+ return true;
437+ }
438+};
439+
440+void AddSC_PlayedTime()
441+{
442+ new PlayedTime_WorldScript();
443+ new npc_playedtime();
444+}
445\ No newline at end of file
446diff --git a/src/server/scripts/Custom/Artamedes/PlayedTime.hpp b/src/server/scripts/Custom/Artamedes/PlayedTime.hpp
447new file mode 100644
448index 0000000..e8e3da3
449--- /dev/null
450+++ b/src/server/scripts/Custom/Artamedes/PlayedTime.hpp
451@@ -0,0 +1,53 @@
452+#pragma once
453+
454+#include "Define.h"
455+
456+class ObjectGuid;
457+class Player;
458+
459+struct PlayedTimeTable
460+{
461+ uint32 RequiredPlayedTime;
462+
463+ std::string GossipMessage;
464+
465+ uint32 RewardItemId[6];
466+ uint32 RewardItemCount[6];
467+ uint32 RewardVotePoints;
468+ uint32 RewardDonationPoints;
469+};
470+
471+typedef std::unordered_map<uint32, PlayedTimeTable> PlayedTimeContainer;
472+typedef std::unordered_map<ObjectGuid, std::vector<uint32>> RedeemedPlayTimeRewardContainer;
473+
474+class PlayedTimeMgr
475+{
476+public:
477+
478+ static PlayedTimeMgr* instance()
479+ {
480+ static PlayedTimeMgr l_Instance;
481+ return &l_Instance;
482+ }
483+
484+ void LoadFromDatabase(bool p_Reload = false);
485+
486+ bool IsAllowedToRedeem(ObjectGuid p_Guid, uint32 p_PlayedTimeId) const;
487+ void ReedeemPlayedTime(Player* p_Player, uint32 p_PlayedTimeId);
488+
489+ PlayedTimeContainer GetAllPlayedTimeEntries()
490+ {
491+ return m_PTContainer;
492+ }
493+
494+ PlayedTimeTable GetRewardFromId(uint32 p_ID)
495+ {
496+ return m_PTContainer[p_ID];
497+ }
498+
499+private:
500+ PlayedTimeContainer m_PTContainer;
501+ RedeemedPlayTimeRewardContainer m_RedeemedPlayedTimeRewardContainer;
502+};
503+
504+#define sPlayedTimeMgr PlayedTimeMgr::instance()
505\ No newline at end of file
506--
5072.16.2.windows.1