mirror of
https://github.com/mangosfour/server.git
synced 2025-12-19 13:37:01 +00:00
Merge branch 'master' into 330
This commit is contained in:
commit
6bcbbc321b
23 changed files with 574 additions and 196 deletions
|
|
@ -89,6 +89,7 @@ World::World()
|
|||
m_maxQueuedSessionCount = 0;
|
||||
m_resultQueue = NULL;
|
||||
m_NextDailyQuestReset = 0;
|
||||
m_NextWeeklyQuestReset = 0;
|
||||
m_scheduledScripts = 0;
|
||||
|
||||
m_defaultDbcLocale = LOCALE_enUS;
|
||||
|
|
@ -516,7 +517,9 @@ void World::LoadConfigSettings(bool reload)
|
|||
setConfigMinMax(CONFIG_UINT32_COMPRESSION, "Compression", 1, 1, 9);
|
||||
setConfig(CONFIG_BOOL_ADDON_CHANNEL, "AddonChannel", true);
|
||||
setConfig(CONFIG_BOOL_GRID_UNLOAD, "GridUnload", true);
|
||||
setConfigPos(CONFIG_UINT32_INTERVAL_SAVE, "PlayerSaveInterval", 15 * MINUTE * IN_MILLISECONDS);
|
||||
setConfigPos(CONFIG_UINT32_INTERVAL_SAVE, "PlayerSave.Interval", 15 * MINUTE * IN_MILLISECONDS);
|
||||
setConfigMinMax(CONFIG_UINT32_MIN_LEVEL_STAT_SAVE, "PlayerSave.Stats.MinLevel", 0, 0, MAX_LEVEL);
|
||||
setConfig(CONFIG_BOOL_STATS_SAVE_ONLY_ON_LOGOUT, "PlayerSave.Stats.SaveOnlyOnLogout", true);
|
||||
|
||||
setConfigMin(CONFIG_UINT32_INTERVAL_GRIDCLEAN, "GridCleanUpDelay", 5 * MINUTE * IN_MILLISECONDS, MIN_GRID_DELAY);
|
||||
if (reload)
|
||||
|
|
@ -675,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);
|
||||
|
|
@ -1265,6 +1272,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..." );
|
||||
sPoolMgr.Initialize();
|
||||
|
||||
|
|
@ -1327,20 +1337,29 @@ void World::Update(uint32 diff)
|
|||
{
|
||||
///- Update the different timers
|
||||
for(int i = 0; i < WUPDATE_COUNT; ++i)
|
||||
if(m_timers[i].GetCurrent()>=0)
|
||||
{
|
||||
if (m_timers[i].GetCurrent()>=0)
|
||||
m_timers[i].Update(diff);
|
||||
else m_timers[i].SetCurrent(0);
|
||||
else
|
||||
m_timers[i].SetCurrent(0);
|
||||
}
|
||||
|
||||
///- Update the game time and check for shutdown time
|
||||
_UpdateGameTime();
|
||||
|
||||
/// Handle daily quests reset time
|
||||
if(m_gameTime > m_NextDailyQuestReset)
|
||||
if (m_gameTime > m_NextDailyQuestReset)
|
||||
{
|
||||
ResetDailyQuests();
|
||||
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())
|
||||
{
|
||||
|
|
@ -1869,43 +1888,69 @@ void World::_UpdateRealmCharCount(QueryResult *resultCharCount, uint32 accountId
|
|||
}
|
||||
}
|
||||
|
||||
void World::InitDailyQuestResetTime()
|
||||
void World::InitWeeklyQuestResetTime()
|
||||
{
|
||||
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 NextWeeklyQuestResetTime FROM saved_variables");
|
||||
if (!result)
|
||||
m_NextWeeklyQuestReset = 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;
|
||||
|
||||
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()
|
||||
{
|
||||
QueryResult * result = CharacterDatabase.Query("SELECT NextDailyQuestResetTime FROM saved_variables");
|
||||
if (!result)
|
||||
m_NextDailyQuestReset = time_t(time(NULL)); // game time not yet init
|
||||
else
|
||||
m_NextDailyQuestReset = time_t((*result)[0].GetUInt64());
|
||||
|
||||
// generate time by config
|
||||
time_t curTime = time(NULL);
|
||||
tm localTm = *localtime(&curTime);
|
||||
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()
|
||||
|
|
@ -1913,13 +1958,25 @@ void World::ResetDailyQuests()
|
|||
sLog.outDetail("Daily quests reset for all characters.");
|
||||
CharacterDatabase.Execute("DELETE FROM character_queststatus_daily");
|
||||
for(SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
|
||||
if(itr->second->GetPlayer())
|
||||
if (itr->second->GetPlayer())
|
||||
itr->second->GetPlayer()->ResetDailyQuestStatus();
|
||||
}
|
||||
|
||||
void World::ResetWeeklyQuests()
|
||||
{
|
||||
sLog.outDetail("Weekly quests reset for all characters.");
|
||||
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 saved_variables SET NextWeeklyQuestResetTime = '"UI64FMTD"'", uint64(m_NextWeeklyQuestReset));
|
||||
}
|
||||
|
||||
void World::SetPlayerLimit( int32 limit, bool needUpdate )
|
||||
{
|
||||
if(limit < -SEC_ADMINISTRATOR)
|
||||
if (limit < -SEC_ADMINISTRATOR)
|
||||
limit = -SEC_ADMINISTRATOR;
|
||||
|
||||
// lock update need
|
||||
|
|
@ -1927,7 +1984,7 @@ void World::SetPlayerLimit( int32 limit, bool needUpdate )
|
|||
|
||||
m_playerLimit = limit;
|
||||
|
||||
if(db_update_need)
|
||||
if (db_update_need)
|
||||
loginDatabase.PExecute("UPDATE realmlist SET allowedSecurityLevel = '%u' WHERE id = '%d'",uint8(GetPlayerSecurityLimit()),realmID);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue