mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[9686] Implement support weekly quests cooldowns.
Part code provided by zhenya. Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
parent
e45d165a8e
commit
fdddf9188a
13 changed files with 197 additions and 11 deletions
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
DROP TABLE IF EXISTS `character_db_version`;
|
||||
CREATE TABLE `character_db_version` (
|
||||
`required_9680_01_characters_character_stats` bit(1) default NULL
|
||||
`required_9686_01_characters_character_queststatus_weekly` bit(1) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
||||
|
||||
--
|
||||
|
|
@ -716,6 +716,27 @@ LOCK TABLES `character_queststatus_daily` WRITE;
|
|||
/*!40000 ALTER TABLE `character_queststatus_daily` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `character_queststatus_weekly`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `character_queststatus_weekly`;
|
||||
CREATE TABLE `character_queststatus_weekly` (
|
||||
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
|
||||
`quest` int(11) unsigned NOT NULL default '0' COMMENT 'Quest Identifier',
|
||||
PRIMARY KEY (`guid`,`quest`),
|
||||
KEY `idx_guid` (`guid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
|
||||
|
||||
--
|
||||
-- Dumping data for table `character_queststatus_weekly`
|
||||
--
|
||||
|
||||
LOCK TABLES `character_queststatus_weekly` WRITE;
|
||||
/*!40000 ALTER TABLE `character_queststatus_weekly` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `character_queststatus_weekly` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `character_reputation`
|
||||
--
|
||||
|
|
@ -1561,7 +1582,8 @@ UNLOCK TABLES;
|
|||
|
||||
DROP TABLE IF EXISTS `saved_variables`;
|
||||
CREATE TABLE `saved_variables` (
|
||||
`NextArenaPointDistributionTime` bigint(40) UNSIGNED NOT NULL DEFAULT '0'
|
||||
`NextArenaPointDistributionTime` bigint(40) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`NextWeeklyQuestResetTime` bigint(40) unsigned NOT NULL default '0'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Variable Saves';
|
||||
|
||||
--
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
ALTER TABLE character_db_version CHANGE COLUMN required_9680_01_characters_character_stats required_9686_01_characters_character_queststatus_weekly bit;
|
||||
|
||||
DROP TABLE IF EXISTS `character_queststatus_weekly`;
|
||||
CREATE TABLE `character_queststatus_weekly` (
|
||||
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
|
||||
`quest` int(11) unsigned NOT NULL default '0' COMMENT 'Quest Identifier',
|
||||
PRIMARY KEY (`guid`,`quest`),
|
||||
KEY `idx_guid` (`guid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
|
||||
|
||||
ALTER TABLE `saved_variables`
|
||||
ADD COLUMN `NextWeeklyQuestResetTime` bigint(40) unsigned NOT NULL default '0' AFTER `NextArenaPointDistributionTime`;
|
||||
|
||||
|
|
@ -103,6 +103,7 @@ pkgdata_DATA = \
|
|||
9661_01_characters_character_talent.sql \
|
||||
9663_01_mangos_mangos_string.sql \
|
||||
9680_01_characters_character_stats.sql \
|
||||
9686_01_characters_character_queststatus_weekly.sql \
|
||||
README
|
||||
|
||||
## Additional files to include when running 'make dist'
|
||||
|
|
@ -186,4 +187,5 @@ EXTRA_DIST = \
|
|||
9661_01_characters_character_talent.sql \
|
||||
9663_01_mangos_mangos_string.sql \
|
||||
9680_01_characters_character_stats.sql \
|
||||
9686_01_characters_character_queststatus_weekly.sql \
|
||||
README
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ bool LoginQueryHolder::Initialize()
|
|||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS, "SELECT quest,status,rewarded,explored,timer,mobcount1,mobcount2,mobcount3,mobcount4,itemcount1,itemcount2,itemcount3,itemcount4 FROM character_queststatus WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS,"SELECT quest,time FROM character_queststatus_daily WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS,"SELECT quest FROM character_queststatus_weekly WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADREPUTATION, "SELECT faction,standing,flags FROM character_reputation WHERE guid = '%u'", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADINVENTORY, "SELECT data,bag,slot,item,item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '%u' ORDER BY bag,slot", GUID_LOPART(m_guid));
|
||||
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACTIONS, "SELECT spec,button,action,type FROM character_action WHERE guid = '%u' ORDER BY button", GUID_LOPART(m_guid));
|
||||
|
|
|
|||
|
|
@ -3422,6 +3422,12 @@ void ObjectMgr::LoadQuests()
|
|||
qinfo->QuestFlags &= QUEST_MANGOS_FLAGS_DB_ALLOWED;
|
||||
}
|
||||
|
||||
if (qinfo->QuestFlags & QUEST_FLAGS_DAILY && qinfo->QuestFlags & QUEST_FLAGS_WEEKLY)
|
||||
{
|
||||
sLog.outErrorDb("Weekly Quest %u is marked as daily quest in `QuestFlags`, removed daily flag.",qinfo->GetQuestId());
|
||||
qinfo->QuestFlags &= QUEST_FLAGS_DAILY;
|
||||
}
|
||||
|
||||
if (qinfo->QuestFlags & QUEST_FLAGS_DAILY)
|
||||
{
|
||||
if (!(qinfo->QuestFlags & QUEST_MANGOS_FLAGS_REPEATABLE))
|
||||
|
|
@ -3431,6 +3437,15 @@ void ObjectMgr::LoadQuests()
|
|||
}
|
||||
}
|
||||
|
||||
if (qinfo->QuestFlags & QUEST_FLAGS_WEEKLY)
|
||||
{
|
||||
if (!(qinfo->QuestFlags & QUEST_MANGOS_FLAGS_REPEATABLE))
|
||||
{
|
||||
sLog.outErrorDb("Weekly Quest %u not marked as repeatable in `SpecialFlags`, added.",qinfo->GetQuestId());
|
||||
qinfo->QuestFlags |= QUEST_MANGOS_FLAGS_REPEATABLE;
|
||||
}
|
||||
}
|
||||
|
||||
if (qinfo->QuestFlags & QUEST_FLAGS_AUTO_REWARDED)
|
||||
{
|
||||
// at auto-reward can be rewarded only RewChoiceItemId[0]
|
||||
|
|
|
|||
|
|
@ -12862,7 +12862,7 @@ void Player::SendPreparedQuest(uint64 guid)
|
|||
PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, CanRewardQuest(pQuest, false), true);
|
||||
// Send completable on repeatable and autoCompletable quest if player don't have quest
|
||||
// TODO: verify if check for !pQuest->IsDaily() is really correct (possibly not)
|
||||
else if (pQuest->IsAutoComplete() && pQuest->IsRepeatable() && !pQuest->IsDaily())
|
||||
else if (pQuest->IsAutoComplete() && pQuest->IsRepeatable() && !pQuest->IsDailyOrWeekly())
|
||||
PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, CanCompleteRepeatableQuest(pQuest), true);
|
||||
else
|
||||
PlayerTalkClass->SendQuestGiverQuestDetails(pQuest, guid, true);
|
||||
|
|
@ -12979,7 +12979,7 @@ bool Player::CanSeeStartQuest( Quest const *pQuest )
|
|||
if( SatisfyQuestRace( pQuest, false ) && SatisfyQuestSkillOrClass( pQuest, false ) &&
|
||||
SatisfyQuestExclusiveGroup( pQuest, false ) && SatisfyQuestReputation( pQuest, false ) &&
|
||||
SatisfyQuestPreviousQuest( pQuest, false ) && SatisfyQuestNextChain( pQuest, false ) &&
|
||||
SatisfyQuestPrevChain( pQuest, false ) && SatisfyQuestDay( pQuest, false ) )
|
||||
SatisfyQuestPrevChain( pQuest, false ) && SatisfyQuestDay( pQuest, false ) && SatisfyQuestWeek( pQuest, false ) )
|
||||
{
|
||||
return getLevel() + sWorld.getConfig(CONFIG_UINT32_QUEST_HIGH_LEVEL_HIDE_DIFF) >= pQuest->GetMinLevel();
|
||||
}
|
||||
|
|
@ -12994,7 +12994,7 @@ bool Player::CanTakeQuest( Quest const *pQuest, bool msg )
|
|||
&& SatisfyQuestSkillOrClass( pQuest, msg ) && SatisfyQuestReputation( pQuest, msg )
|
||||
&& SatisfyQuestPreviousQuest( pQuest, msg ) && SatisfyQuestTimed( pQuest, msg )
|
||||
&& SatisfyQuestNextChain( pQuest, msg ) && SatisfyQuestPrevChain( pQuest, msg )
|
||||
&& SatisfyQuestDay( pQuest, msg );
|
||||
&& SatisfyQuestDay( pQuest, msg ) && SatisfyQuestWeek( pQuest, msg );
|
||||
}
|
||||
|
||||
bool Player::CanAddQuest( Quest const *pQuest, bool msg )
|
||||
|
|
@ -13110,7 +13110,7 @@ bool Player::CanRewardQuest( Quest const *pQuest, bool msg )
|
|||
return false;
|
||||
|
||||
// daily quest can't be rewarded (25 daily quest already completed)
|
||||
if (!SatisfyQuestDay(pQuest,true))
|
||||
if (!SatisfyQuestDay(pQuest,true) || !SatisfyQuestWeek(pQuest,true))
|
||||
return false;
|
||||
|
||||
// rewarded and not repeatable quest (only cheating case, then ignore without message)
|
||||
|
|
@ -13397,6 +13397,9 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
|
|||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, 1);
|
||||
}
|
||||
|
||||
if (pQuest->IsWeekly())
|
||||
SetWeeklyQuestStatus(quest_id);
|
||||
|
||||
if (!pQuest->IsRepeatable())
|
||||
SetQuestStatus(quest_id, QUEST_STATUS_COMPLETE);
|
||||
else
|
||||
|
|
@ -13728,7 +13731,7 @@ bool Player::SatisfyQuestExclusiveGroup( Quest const* qInfo, bool msg )
|
|||
|
||||
// not allow have daily quest if daily quest from exclusive group already recently completed
|
||||
Quest const* Nquest = sObjectMgr.GetQuestTemplate(exclude_Id);
|
||||
if (!SatisfyQuestDay(Nquest, false))
|
||||
if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false))
|
||||
{
|
||||
if( msg )
|
||||
SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ );
|
||||
|
|
@ -13830,6 +13833,15 @@ bool Player::SatisfyQuestDay( Quest const* qInfo, bool msg )
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Player::SatisfyQuestWeek( Quest const* qInfo, bool msg )
|
||||
{
|
||||
if (!qInfo->IsWeekly() || m_weeklyquests.empty())
|
||||
return true;
|
||||
|
||||
// if not found in cooldown list
|
||||
return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
|
||||
}
|
||||
|
||||
bool Player::GiveQuestSourceItem( Quest const *pQuest )
|
||||
{
|
||||
uint32 srcitem = pQuest->GetSrcItemId();
|
||||
|
|
@ -15130,6 +15142,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
|
|||
// after spell load, learn rewarded spell if need also
|
||||
_LoadQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS));
|
||||
_LoadDailyQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS));
|
||||
_LoadWeeklyQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS));
|
||||
|
||||
_LoadTalents(holder->GetResult(PLAYER_LOGIN_QUERY_LOADTALENTS));
|
||||
|
||||
|
|
@ -15915,6 +15928,35 @@ void Player::_LoadDailyQuestStatus(QueryResult *result)
|
|||
m_DailyQuestChanged = false;
|
||||
}
|
||||
|
||||
void Player::_LoadWeeklyQuestStatus(QueryResult *result)
|
||||
{
|
||||
m_weeklyquests.clear();
|
||||
|
||||
//QueryResult *result = CharacterDatabase.PQuery("SELECT quest FROM character_queststatus_weekly WHERE guid = '%u'", GetGUIDLow());
|
||||
|
||||
if (result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
uint32 quest_id = fields[0].GetUInt32();
|
||||
|
||||
Quest const* pQuest = sObjectMgr.GetQuestTemplate(quest_id);
|
||||
if (!pQuest)
|
||||
continue;
|
||||
|
||||
m_weeklyquests.insert(quest_id);
|
||||
|
||||
sLog.outDebug("Weekly quest {%u} cooldown for player (GUID: %u)", quest_id, GetGUIDLow());
|
||||
}
|
||||
while( result->NextRow() );
|
||||
|
||||
delete result;
|
||||
}
|
||||
m_WeeklyQuestChanged = false;
|
||||
}
|
||||
|
||||
void Player::_LoadSpells(QueryResult *result)
|
||||
{
|
||||
//QueryResult *result = CharacterDatabase.PQuery("SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'",GetGUIDLow());
|
||||
|
|
@ -16500,6 +16542,7 @@ void Player::SaveToDB()
|
|||
_SaveInventory();
|
||||
_SaveQuestStatus();
|
||||
_SaveDailyQuestStatus();
|
||||
_SaveWeeklyQuestStatus();
|
||||
_SaveSpells();
|
||||
_SaveSpellCooldowns();
|
||||
_SaveActions();
|
||||
|
|
@ -16818,6 +16861,23 @@ void Player::_SaveDailyQuestStatus()
|
|||
GetGUIDLow(), GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx),uint64(m_lastDailyQuestTime));
|
||||
}
|
||||
|
||||
void Player::_SaveWeeklyQuestStatus()
|
||||
{
|
||||
if (!m_WeeklyQuestChanged || m_weeklyquests.empty())
|
||||
return;
|
||||
|
||||
// we don't need transactions here.
|
||||
CharacterDatabase.PExecute("DELETE FROM character_queststatus_weekly WHERE guid = '%u'",GetGUIDLow());
|
||||
|
||||
for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
|
||||
{
|
||||
uint32 quest_id = *iter;
|
||||
|
||||
CharacterDatabase.PExecute("INSERT INTO character_queststatus_weekly (guid,quest) VALUES ('%u', '%u')", GetGUIDLow(), quest_id);
|
||||
}
|
||||
|
||||
m_WeeklyQuestChanged = false;
|
||||
}
|
||||
|
||||
void Player::_SaveSkills()
|
||||
{
|
||||
|
|
@ -19521,6 +19581,12 @@ void Player::SetDailyQuestStatus( uint32 quest_id )
|
|||
}
|
||||
}
|
||||
|
||||
void Player::SetWeeklyQuestStatus( uint32 quest_id )
|
||||
{
|
||||
m_weeklyquests.insert(quest_id);
|
||||
m_WeeklyQuestChanged = true;
|
||||
}
|
||||
|
||||
void Player::ResetDailyQuestStatus()
|
||||
{
|
||||
for(uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
|
||||
|
|
@ -19531,6 +19597,16 @@ void Player::ResetDailyQuestStatus()
|
|||
m_lastDailyQuestTime = 0;
|
||||
}
|
||||
|
||||
void Player::ResetWeeklyQuestStatus()
|
||||
{
|
||||
if (m_weeklyquests.empty())
|
||||
return;
|
||||
|
||||
m_weeklyquests.clear();
|
||||
// DB data deleted in caller
|
||||
m_WeeklyQuestChanged = false;
|
||||
}
|
||||
|
||||
BattleGround* Player::GetBattleGround() const
|
||||
{
|
||||
if(GetBattleGroundId()==0)
|
||||
|
|
|
|||
|
|
@ -910,7 +910,8 @@ enum PlayerLoginQueryIndex
|
|||
PLAYER_LOGIN_QUERY_LOADMAILS = 23,
|
||||
PLAYER_LOGIN_QUERY_LOADMAILEDITEMS = 24,
|
||||
PLAYER_LOGIN_QUERY_LOADTALENTS = 25,
|
||||
MAX_PLAYER_LOGIN_QUERY = 26
|
||||
PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS = 26,
|
||||
MAX_PLAYER_LOGIN_QUERY = 27
|
||||
};
|
||||
|
||||
enum PlayerDelayedOperations
|
||||
|
|
@ -1346,6 +1347,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
|||
bool SatisfyQuestNextChain( Quest const* qInfo, bool msg );
|
||||
bool SatisfyQuestPrevChain( Quest const* qInfo, bool msg );
|
||||
bool SatisfyQuestDay( Quest const* qInfo, bool msg );
|
||||
bool SatisfyQuestWeek( Quest const* qInfo, bool msg );
|
||||
bool GiveQuestSourceItem( Quest const *pQuest );
|
||||
bool TakeQuestSourceItem( uint32 quest_id, bool msg );
|
||||
bool GetQuestRewardStatus( uint32 quest_id ) const;
|
||||
|
|
@ -1353,7 +1355,9 @@ class MANGOS_DLL_SPEC Player : public Unit
|
|||
void SetQuestStatus( uint32 quest_id, QuestStatus status );
|
||||
|
||||
void SetDailyQuestStatus( uint32 quest_id );
|
||||
void SetWeeklyQuestStatus( uint32 quest_id );
|
||||
void ResetDailyQuestStatus();
|
||||
void ResetWeeklyQuestStatus();
|
||||
|
||||
uint16 FindQuestSlot( uint32 quest_id ) const;
|
||||
uint32 GetQuestSlotQuestId(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET); }
|
||||
|
|
@ -2314,6 +2318,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
|||
//We allow only one timed quest active at the same time. Below can then be simple value instead of set.
|
||||
typedef std::set<uint32> QuestSet;
|
||||
QuestSet m_timedquests;
|
||||
QuestSet m_weeklyquests;
|
||||
|
||||
uint64 m_divider;
|
||||
uint32 m_ingametime;
|
||||
|
|
@ -2330,6 +2335,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
|||
void _LoadMailedItems(QueryResult *result);
|
||||
void _LoadQuestStatus(QueryResult *result);
|
||||
void _LoadDailyQuestStatus(QueryResult *result);
|
||||
void _LoadWeeklyQuestStatus(QueryResult *result);
|
||||
void _LoadGroup(QueryResult *result);
|
||||
void _LoadSkills(QueryResult *result);
|
||||
void _LoadSpells(QueryResult *result);
|
||||
|
|
@ -2353,6 +2359,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
|||
void _SaveMail();
|
||||
void _SaveQuestStatus();
|
||||
void _SaveDailyQuestStatus();
|
||||
void _SaveWeeklyQuestStatus();
|
||||
void _SaveSkills();
|
||||
void _SaveSpells();
|
||||
void _SaveEquipmentSets();
|
||||
|
|
@ -2452,6 +2459,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
|||
uint32 tradeGold;
|
||||
|
||||
bool m_DailyQuestChanged;
|
||||
bool m_WeeklyQuestChanged;
|
||||
time_t m_lastDailyQuestTime;
|
||||
|
||||
uint32 m_drunkTimer;
|
||||
|
|
|
|||
|
|
@ -239,6 +239,8 @@ class Quest
|
|||
bool IsAutoComplete() const { return QuestMethod ? false : true; }
|
||||
uint32 GetFlags() const { return QuestFlags; }
|
||||
bool IsDaily() const { return QuestFlags & QUEST_FLAGS_DAILY; }
|
||||
bool IsWeekly() const { return QuestFlags & QUEST_FLAGS_WEEKLY; }
|
||||
bool IsDailyOrWeekly() const { return QuestFlags & (QUEST_FLAGS_DAILY | QUEST_FLAGS_WEEKLY); }
|
||||
|
||||
// multiple values
|
||||
std::string ObjectiveText[QUEST_OBJECTIVES_COUNT];
|
||||
|
|
|
|||
|
|
@ -610,7 +610,7 @@ uint32 WorldSession::getDialogStatus(Player *pPlayer, Object* questgiver, uint32
|
|||
result2 = DIALOG_STATUS_REWARD_REP;
|
||||
else if (pPlayer->getLevel() <= pPlayer->GetQuestLevelForPlayer(pQuest) + sWorld.getConfig(CONFIG_UINT32_QUEST_LOW_LEVEL_HIDE_DIFF) )
|
||||
{
|
||||
if (pQuest->HasFlag(QUEST_FLAGS_DAILY))
|
||||
if (pQuest->HasFlag(QUEST_FLAGS_DAILY) || pQuest->HasFlag(QUEST_FLAGS_WEEKLY))
|
||||
result2 = DIALOG_STATUS_AVAILABLE_REP;
|
||||
else
|
||||
result2 = DIALOG_STATUS_AVAILABLE;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -1267,6 +1268,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();
|
||||
|
||||
|
|
@ -1346,6 +1350,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())
|
||||
{
|
||||
|
|
@ -1874,6 +1884,27 @@ void World::_UpdateRealmCharCount(QueryResult *resultCharCount, uint32 accountId
|
|||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
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);
|
||||
|
||||
delete result;
|
||||
}
|
||||
}
|
||||
|
||||
void World::InitDailyQuestResetTime()
|
||||
{
|
||||
time_t mostRecentQuestTime;
|
||||
|
|
@ -1922,6 +1953,18 @@ void World::ResetDailyQuests()
|
|||
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)
|
||||
|
|
|
|||
|
|
@ -486,6 +486,7 @@ class World
|
|||
uint32 GetUptime() const { return uint32(m_gameTime - m_startTime); }
|
||||
/// Next daily quests reset time
|
||||
time_t GetNextDailyQuestsResetTime() const { return m_NextDailyQuestReset; }
|
||||
time_t GetNextWeeklyQuestsResetTime() const { return m_NextWeeklyQuestReset; }
|
||||
|
||||
/// Get the maximum skill level a player can reach
|
||||
uint16 GetConfigMaxSkillValue() const
|
||||
|
|
@ -586,7 +587,9 @@ class World
|
|||
void _UpdateRealmCharCount(QueryResult *resultCharCount, uint32 accountId);
|
||||
|
||||
void InitDailyQuestResetTime();
|
||||
void InitWeeklyQuestResetTime();
|
||||
void ResetDailyQuests();
|
||||
void ResetWeeklyQuests();
|
||||
private:
|
||||
void setConfig(eConfigUInt32Values index, char const* fieldname, uint32 defvalue);
|
||||
void setConfig(eConfigInt32Values index, char const* fieldname, int32 defvalue);
|
||||
|
|
@ -656,6 +659,7 @@ class World
|
|||
|
||||
// next daily quests reset time
|
||||
time_t m_NextDailyQuestReset;
|
||||
time_t m_NextWeeklyQuestReset;
|
||||
|
||||
//Player Queue
|
||||
Queue m_QueuedPlayer;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "9685"
|
||||
#define REVISION_NR "9686"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#ifndef __REVISION_SQL_H__
|
||||
#define __REVISION_SQL_H__
|
||||
#define REVISION_DB_CHARACTERS "required_9680_01_characters_character_stats"
|
||||
#define REVISION_DB_CHARACTERS "required_9686_01_characters_character_queststatus_weekly"
|
||||
#define REVISION_DB_MANGOS "required_9663_01_mangos_mangos_string"
|
||||
#define REVISION_DB_REALMD "required_9010_01_realmd_realmlist"
|
||||
#endif // __REVISION_SQL_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue