mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 04:37:00 +00:00
[9687] Add to mangos.conf options for daily/weekly reset time.
* Quests.Daily.ResetHour (0..23) for daily quests * Quests.Weekly.ResetWeekDay (0..6) and Quests.Weekly.ResetHour (0..23) for weekly quests. * Drop time from character_queststatus_daily and use same way as weekly quest reset time store.
This commit is contained in:
parent
fdddf9188a
commit
d78117bbc8
11 changed files with 83 additions and 53 deletions
|
|
@ -678,6 +678,10 @@ void World::LoadConfigSettings(bool reload)
|
|||
if (getConfig(CONFIG_UINT32_QUEST_HIGH_LEVEL_HIDE_DIFF) > MAX_LEVEL)
|
||||
setConfig(CONFIG_UINT32_QUEST_HIGH_LEVEL_HIDE_DIFF, MAX_LEVEL);
|
||||
|
||||
setConfigMinMax(CONFIG_UINT32_QUEST_DAILY_RESET_HOUR, "Quests.Daily.ResetHour", 6, 0, 23);
|
||||
setConfigMinMax(CONFIG_UINT32_QUEST_WEEKLY_RESET_WEEK_DAY, "Quests.Weekly.ResetWeekDay", 3, 0, 6);
|
||||
setConfigMinMax(CONFIG_UINT32_QUEST_WEEKLY_RESET_HOUR, "Quests.Weekly.ResetHour", 6, 0 , 23);
|
||||
|
||||
setConfig(CONFIG_BOOL_DETECT_POS_COLLISION, "DetectPosCollision", true);
|
||||
|
||||
setConfig(CONFIG_BOOL_RESTRICTED_LFG_CHANNEL, "Channel.RestrictedLfg", true);
|
||||
|
|
@ -1888,60 +1892,65 @@ void World::InitWeeklyQuestResetTime()
|
|||
{
|
||||
QueryResult * result = CharacterDatabase.Query("SELECT NextWeeklyQuestResetTime FROM saved_variables");
|
||||
if (!result)
|
||||
{
|
||||
m_NextWeeklyQuestReset = time_t(m_gameTime + WEEK);
|
||||
CharacterDatabase.PExecute("INSERT INTO saved_variables (NextWeeklyQuestResetTime) VALUES ('"UI64FMTD"')", uint64(m_NextWeeklyQuestReset));
|
||||
}
|
||||
m_NextWeeklyQuestReset = time_t(time(NULL)); // game time not yet init
|
||||
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);
|
||||
// generate time by config
|
||||
time_t curTime = time(NULL);
|
||||
tm localTm = *localtime(&curTime);
|
||||
|
||||
int week_day_offset = localTm.tm_wday - int(getConfig(CONFIG_UINT32_QUEST_WEEKLY_RESET_WEEK_DAY));
|
||||
|
||||
// current week reset time
|
||||
localTm.tm_hour = getConfig(CONFIG_UINT32_QUEST_WEEKLY_RESET_HOUR);
|
||||
localTm.tm_min = 0;
|
||||
localTm.tm_sec = 0;
|
||||
time_t nextWeekResetTime = mktime(&localTm);
|
||||
nextWeekResetTime -= week_day_offset * DAY; // move time to proper day
|
||||
|
||||
// next reset time before current moment
|
||||
if (curTime >= nextWeekResetTime)
|
||||
nextWeekResetTime += WEEK;
|
||||
|
||||
// normalize reset time
|
||||
m_NextWeeklyQuestReset = m_NextWeeklyQuestReset < curTime ? nextWeekResetTime - WEEK : nextWeekResetTime;
|
||||
|
||||
if (!result)
|
||||
CharacterDatabase.PExecute("INSERT INTO saved_variables (NextWeeklyQuestResetTime) VALUES ('"UI64FMTD"')", uint64(m_NextWeeklyQuestReset));
|
||||
else
|
||||
delete result;
|
||||
}
|
||||
}
|
||||
|
||||
void World::InitDailyQuestResetTime()
|
||||
{
|
||||
time_t mostRecentQuestTime;
|
||||
|
||||
QueryResult* result = CharacterDatabase.Query("SELECT MAX(time) FROM character_queststatus_daily");
|
||||
if(result)
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
mostRecentQuestTime = (time_t)fields[0].GetUInt64();
|
||||
delete result;
|
||||
}
|
||||
QueryResult * result = CharacterDatabase.Query("SELECT NextDailyQuestResetTime FROM saved_variables");
|
||||
if (!result)
|
||||
m_NextDailyQuestReset = time_t(time(NULL)); // game time not yet init
|
||||
else
|
||||
mostRecentQuestTime = 0;
|
||||
m_NextWeeklyQuestReset = time_t((*result)[0].GetUInt64());
|
||||
|
||||
// client built-in time for reset is 6:00 AM
|
||||
// FIX ME: client not show day start time
|
||||
// generate time by config
|
||||
time_t curTime = time(NULL);
|
||||
tm localTm = *localtime(&curTime);
|
||||
localTm.tm_hour = 6;
|
||||
localTm.tm_hour = getConfig(CONFIG_UINT32_QUEST_DAILY_RESET_HOUR);
|
||||
localTm.tm_min = 0;
|
||||
localTm.tm_sec = 0;
|
||||
|
||||
// current day reset time
|
||||
time_t curDayResetTime = mktime(&localTm);
|
||||
time_t nextDayResetTime = mktime(&localTm);
|
||||
|
||||
// last reset time before current moment
|
||||
time_t resetTime = (curTime < curDayResetTime) ? curDayResetTime - DAY : curDayResetTime;
|
||||
// next reset time before current moment
|
||||
if (curTime >= nextDayResetTime)
|
||||
nextDayResetTime += DAY;
|
||||
|
||||
// need reset (if we have quest time before last reset time (not processed by some reason)
|
||||
if(mostRecentQuestTime && mostRecentQuestTime <= resetTime)
|
||||
m_NextDailyQuestReset = mostRecentQuestTime;
|
||||
// normalize reset time
|
||||
m_NextDailyQuestReset = m_NextDailyQuestReset < curTime ? nextDayResetTime - DAY : nextDayResetTime;
|
||||
|
||||
if (!result)
|
||||
CharacterDatabase.PExecute("INSERT INTO saved_variables (NextDailyQuestResetTime) VALUES ('"UI64FMTD"')", uint64(m_NextDailyQuestReset));
|
||||
else
|
||||
{
|
||||
// plan next reset time
|
||||
m_NextDailyQuestReset = (curTime >= curDayResetTime) ? curDayResetTime + DAY : curDayResetTime;
|
||||
}
|
||||
delete result;
|
||||
}
|
||||
|
||||
void World::ResetDailyQuests()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue