aboutsummaryrefslogtreecommitdiff
path: root/src/game/World.cpp
diff options
context:
space:
mode:
authorn0n4m3 <none@none>2010-04-15 08:26:30 +0400
committern0n4m3 <none@none>2010-04-15 08:26:30 +0400
commit8abcca0a06d48d4c9d7039bf7a6b27c57f7eb878 (patch)
tree849deb42364506716453fd34131d4fea0af972f8 /src/game/World.cpp
parent6bcb297de4d5231373a3e2bf2b40e527b91cdf46 (diff)
Another fix quest flags, Implement support weekly quests cooldowns(Original patch by GriffonHeart), also code cleanups.
--HG-- branch : trunk
Diffstat (limited to 'src/game/World.cpp')
-rw-r--r--src/game/World.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 057e3489216..7419e65772d 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -105,6 +105,7 @@ World::World()
m_MaxPlayerCount = 0;
m_resultQueue = NULL;
m_NextDailyQuestReset = 0;
+ m_NextWeeklyQuestReset = 0;
m_scheduledScripts = 0;
m_defaultDbcLocale = LOCALE_enUS;
@@ -1680,6 +1681,9 @@ void World::SetInitialWorldSettings()
sLog.outString("Calculate next daily quest reset time...");
InitDailyQuestResetTime();
+ sLog.outString("Calculate next weekly quest reset time..." );
+ InitWeeklyQuestResetTime();
+
sLog.outString("Starting objects Pooling system...");
poolhandler.Initialize();
@@ -1844,6 +1848,12 @@ void World::Update(uint32 diff)
m_NextDailyQuestReset += DAY;
}
+ if (m_gameTime > m_NextWeeklyQuestReset)
+ {
+ ResetWeeklyQuests();
+ m_NextWeeklyQuestReset += WEEK;
+ }
+
/// <ul><li> Handle auctions when the timer has passed
if (m_timers[WUPDATE_AUCTIONS].Passed())
{
@@ -2486,6 +2496,25 @@ void World::_UpdateRealmCharCount(QueryResult_AutoPtr resultCharCount, uint32 ac
}
}
+void World::InitWeeklyQuestResetTime()
+{
+ QueryResult_AutoPtr result = CharacterDatabase.Query("SELECT NextWeeklyQuestResetTime FROM worldstates");
+ if (!result)
+ {
+ m_NextWeeklyQuestReset = time_t(m_gameTime + WEEK);
+ CharacterDatabase.PExecute("INSERT INTO worldstates (NextWeeklyQuestResetTime) VALUES ('"UI64FMTD"')", uint64(m_NextWeeklyQuestReset));
+ }
+ else
+ {
+ m_NextWeeklyQuestReset = time_t((*result)[0].GetUInt64());
+
+ // move to just before if need
+ time_t cur = time(NULL);
+ if (m_NextWeeklyQuestReset < cur)
+ m_NextWeeklyQuestReset += WEEK * ((cur - m_NextWeeklyQuestReset) / WEEK);
+ }
+}
+
void World::InitDailyQuestResetTime()
{
time_t mostRecentQuestTime;
@@ -2543,6 +2572,17 @@ void World::UpdateAllowedSecurity()
}
}
+void World::ResetWeeklyQuests()
+{
+ CharacterDatabase.Execute("DELETE FROM character_queststatus_weekly");
+ for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
+ if (itr->second->GetPlayer())
+ itr->second->GetPlayer()->ResetWeeklyQuestStatus();
+
+ m_NextWeeklyQuestReset = time_t(m_NextWeeklyQuestReset + WEEK);
+ CharacterDatabase.PExecute("UPDATE worldstates SET NextWeeklyQuestResetTime = '"UI64FMTD"'", uint64(m_NextWeeklyQuestReset));
+}
+
void World::SetPlayerLimit(int32 limit, bool needUpdate)
{
m_playerLimit = limit;