Core/Quest: implement Quest Tracker (#1233)
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
INSERT INTO version_db_characters (`sql_rev`) VALUES ('1546637940772193620');
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `quest_tracker`;
|
||||||
|
CREATE TABLE `quest_tracker` (
|
||||||
|
`id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`character_guid` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`quest_accept_time` DATETIME NOT NULL,
|
||||||
|
`quest_complete_time` DATETIME DEFAULT NULL,
|
||||||
|
`quest_abandon_time` DATETIME DEFAULT NULL,
|
||||||
|
`completed_by_gm` BOOL NOT NULL DEFAULT '0',
|
||||||
|
`core_hash` VARCHAR(120) NOT NULL DEFAULT '0',
|
||||||
|
`core_revision` VARCHAR(120) NOT NULL DEFAULT '0'
|
||||||
|
)
|
||||||
|
ENGINE=InnoDB;
|
||||||
@@ -557,4 +557,10 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
|||||||
|
|
||||||
// Deserter tracker
|
// Deserter tracker
|
||||||
PrepareStatement(CHAR_INS_DESERTER_TRACK, "INSERT INTO battleground_deserters (guid, type, datetime) VALUES (?, ?, NOW())", CONNECTION_ASYNC);
|
PrepareStatement(CHAR_INS_DESERTER_TRACK, "INSERT INTO battleground_deserters (guid, type, datetime) VALUES (?, ?, NOW())", CONNECTION_ASYNC);
|
||||||
|
|
||||||
|
// QuestTracker
|
||||||
|
PrepareStatement(CHAR_INS_QUEST_TRACK, "INSERT INTO quest_tracker (id, character_guid, quest_accept_time, core_hash, core_revision) VALUES (?, ?, NOW(), ?, ?)", CONNECTION_ASYNC);
|
||||||
|
PrepareStatement(CHAR_UPD_QUEST_TRACK_GM_COMPLETE, "UPDATE quest_tracker SET completed_by_gm = 1 WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC);
|
||||||
|
PrepareStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, "UPDATE quest_tracker SET quest_complete_time = NOW() WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC);
|
||||||
|
PrepareStatement(CHAR_UPD_QUEST_TRACK_ABANDON_TIME, "UPDATE quest_tracker SET quest_abandon_time = NOW() WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -494,6 +494,11 @@ enum CharacterDatabaseStatements
|
|||||||
|
|
||||||
CHAR_INS_DESERTER_TRACK,
|
CHAR_INS_DESERTER_TRACK,
|
||||||
|
|
||||||
|
CHAR_INS_QUEST_TRACK,
|
||||||
|
CHAR_UPD_QUEST_TRACK_GM_COMPLETE,
|
||||||
|
CHAR_UPD_QUEST_TRACK_COMPLETE_TIME,
|
||||||
|
CHAR_UPD_QUEST_TRACK_ABANDON_TIME,
|
||||||
|
|
||||||
MAX_CHARACTERDATABASE_STATEMENTS
|
MAX_CHARACTERDATABASE_STATEMENTS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#include "GroupMgr.h"
|
#include "GroupMgr.h"
|
||||||
#include "Guild.h"
|
#include "Guild.h"
|
||||||
#include "GuildMgr.h"
|
#include "GuildMgr.h"
|
||||||
|
#include "GitRevision.h"
|
||||||
|
#include "revision.h"
|
||||||
#include "InstanceSaveMgr.h"
|
#include "InstanceSaveMgr.h"
|
||||||
#include "InstanceScript.h"
|
#include "InstanceScript.h"
|
||||||
#include "Language.h"
|
#include "Language.h"
|
||||||
@@ -15662,6 +15664,20 @@ void Player::AddQuest(Quest const* quest, Object* questGiver)
|
|||||||
|
|
||||||
SendQuestUpdate(quest_id);
|
SendQuestUpdate(quest_id);
|
||||||
|
|
||||||
|
// check if Quest Tracker is enabled
|
||||||
|
if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
|
||||||
|
{
|
||||||
|
// prepare Quest Tracker datas
|
||||||
|
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK);
|
||||||
|
stmt->setUInt32(0, quest_id);
|
||||||
|
stmt->setUInt32(1, GetGUIDLow());
|
||||||
|
stmt->setString(2, _HASH);
|
||||||
|
stmt->setString(3, _DATE);
|
||||||
|
|
||||||
|
// add to Quest Tracker
|
||||||
|
CharacterDatabase.Execute(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
// Xinef: area auras may change on quest accept!
|
// Xinef: area auras may change on quest accept!
|
||||||
UpdateZoneDependentAuras(GetZoneId());
|
UpdateZoneDependentAuras(GetZoneId());
|
||||||
UpdateAreaDependentAuras(GetAreaId());
|
UpdateAreaDependentAuras(GetAreaId());
|
||||||
@@ -15690,6 +15706,18 @@ void Player::CompleteQuest(uint32 quest_id)
|
|||||||
UpdateAreaDependentAuras(GetAreaId());
|
UpdateAreaDependentAuras(GetAreaId());
|
||||||
AdditionalSavingAddMask(ADDITIONAL_SAVING_INVENTORY_AND_GOLD | ADDITIONAL_SAVING_QUEST_STATUS);
|
AdditionalSavingAddMask(ADDITIONAL_SAVING_INVENTORY_AND_GOLD | ADDITIONAL_SAVING_QUEST_STATUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if Quest Tracker is enabled
|
||||||
|
if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
|
||||||
|
{
|
||||||
|
// prepare Quest Tracker datas
|
||||||
|
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME);
|
||||||
|
stmt->setUInt32(0, quest_id);
|
||||||
|
stmt->setUInt32(1, GetGUIDLow());
|
||||||
|
|
||||||
|
// add to Quest Tracker
|
||||||
|
CharacterDatabase.Execute(stmt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::IncompleteQuest(uint32 quest_id)
|
void Player::IncompleteQuest(uint32 quest_id)
|
||||||
|
|||||||
@@ -426,6 +426,17 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPacket& recvData)
|
|||||||
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
|
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
|
||||||
sLog->outDetail("Player %u abandoned quest %u", _player->GetGUIDLow(), questId);
|
sLog->outDetail("Player %u abandoned quest %u", _player->GetGUIDLow(), questId);
|
||||||
#endif
|
#endif
|
||||||
|
// check if Quest Tracker is enabled
|
||||||
|
if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
|
||||||
|
{
|
||||||
|
// prepare Quest Tracker datas
|
||||||
|
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_ABANDON_TIME);
|
||||||
|
stmt->setUInt32(0, questId);
|
||||||
|
stmt->setUInt32(1, _player->GetGUIDLow());
|
||||||
|
|
||||||
|
// add to Quest Tracker
|
||||||
|
CharacterDatabase.Execute(stmt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_player->SetQuestSlot(slot, 0);
|
_player->SetQuestSlot(slot, 0);
|
||||||
|
|||||||
@@ -1037,6 +1037,8 @@ void World::LoadConfigSettings(bool reload)
|
|||||||
|
|
||||||
m_int_configs[CONFIG_WORLD_BOSS_LEVEL_DIFF] = sConfigMgr->GetIntDefault("WorldBossLevelDiff", 3);
|
m_int_configs[CONFIG_WORLD_BOSS_LEVEL_DIFF] = sConfigMgr->GetIntDefault("WorldBossLevelDiff", 3);
|
||||||
|
|
||||||
|
m_bool_configs[CONFIG_QUEST_ENABLE_QUEST_TRACKER] = sConfigMgr->GetBoolDefault("Quests.EnableQuestTracker", false);
|
||||||
|
|
||||||
// note: disable value (-1) will assigned as 0xFFFFFFF, to prevent overflow at calculations limit it to max possible player level MAX_LEVEL(100)
|
// note: disable value (-1) will assigned as 0xFFFFFFF, to prevent overflow at calculations limit it to max possible player level MAX_LEVEL(100)
|
||||||
m_int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = sConfigMgr->GetIntDefault("Quests.LowLevelHideDiff", 4);
|
m_int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = sConfigMgr->GetIntDefault("Quests.LowLevelHideDiff", 4);
|
||||||
if (m_int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] > MAX_LEVEL)
|
if (m_int_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] > MAX_LEVEL)
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ enum WorldBoolConfigs
|
|||||||
CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS, // pussywizard
|
CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS, // pussywizard
|
||||||
CONFIG_QUEST_IGNORE_AUTO_ACCEPT,
|
CONFIG_QUEST_IGNORE_AUTO_ACCEPT,
|
||||||
CONFIG_QUEST_IGNORE_AUTO_COMPLETE,
|
CONFIG_QUEST_IGNORE_AUTO_COMPLETE,
|
||||||
|
CONFIG_QUEST_ENABLE_QUEST_TRACKER,
|
||||||
CONFIG_WARDEN_ENABLED,
|
CONFIG_WARDEN_ENABLED,
|
||||||
CONFIG_ENABLE_CONTINENT_TRANSPORT,
|
CONFIG_ENABLE_CONTINENT_TRANSPORT,
|
||||||
CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING,
|
CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING,
|
||||||
|
|||||||
@@ -225,6 +225,18 @@ public:
|
|||||||
if (ReqOrRewMoney < 0)
|
if (ReqOrRewMoney < 0)
|
||||||
player->ModifyMoney(-ReqOrRewMoney);
|
player->ModifyMoney(-ReqOrRewMoney);
|
||||||
|
|
||||||
|
// check if Quest Tracker is enabled
|
||||||
|
if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
|
||||||
|
{
|
||||||
|
// prepare Quest Tracker datas
|
||||||
|
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_GM_COMPLETE);
|
||||||
|
stmt->setUInt32(0, quest->GetQuestId());
|
||||||
|
stmt->setUInt32(1, player->GetGUIDLow());
|
||||||
|
|
||||||
|
// add to Quest Tracker
|
||||||
|
CharacterDatabase.Execute(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
player->CompleteQuest(entry);
|
player->CompleteQuest(entry);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1230,6 +1230,14 @@ Instance.ResetTimeHour = 4
|
|||||||
|
|
||||||
Instance.UnloadDelay = 1800000
|
Instance.UnloadDelay = 1800000
|
||||||
|
|
||||||
|
#
|
||||||
|
# Quests.EnableQuestTracker
|
||||||
|
# Description: Store datas in the database about quest completion and abandonment to help finding out bugged quests.
|
||||||
|
# Default: 0 - (Disabled)
|
||||||
|
# 1 - (Enabled)
|
||||||
|
|
||||||
|
Quests.EnableQuestTracker = 0
|
||||||
|
|
||||||
#
|
#
|
||||||
# Quests.LowLevelHideDiff
|
# Quests.LowLevelHideDiff
|
||||||
# Description: Level difference between player and quest level at which quests are
|
# Description: Level difference between player and quest level at which quests are
|
||||||
|
|||||||
Reference in New Issue
Block a user