From 3f45c148223334c0dde0f213399e73fc9b0915b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viste=28=D0=9A=D0=B8=D1=80=D0=B8=D0=BB=D0=BB=29?= Date: Sun, 6 Jan 2019 09:32:17 +0300 Subject: [PATCH] Core/Quest: implement Quest Tracker (#1233) --- .../rev_1546637940772193620.sql | 14 ++++++++++ .../Implementation/CharacterDatabase.cpp | 6 ++++ .../Implementation/CharacterDatabase.h | 5 ++++ src/server/game/Entities/Player/Player.cpp | 28 +++++++++++++++++++ src/server/game/Handlers/QuestHandler.cpp | 11 ++++++++ src/server/game/World/World.cpp | 2 ++ src/server/game/World/World.h | 1 + src/server/scripts/Commands/cs_quest.cpp | 12 ++++++++ src/server/worldserver/worldserver.conf.dist | 8 ++++++ 9 files changed, 87 insertions(+) create mode 100644 data/sql/updates/pending_db_characters/rev_1546637940772193620.sql diff --git a/data/sql/updates/pending_db_characters/rev_1546637940772193620.sql b/data/sql/updates/pending_db_characters/rev_1546637940772193620.sql new file mode 100644 index 000000000..cf83481f4 --- /dev/null +++ b/data/sql/updates/pending_db_characters/rev_1546637940772193620.sql @@ -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; diff --git a/src/common/Database/Implementation/CharacterDatabase.cpp b/src/common/Database/Implementation/CharacterDatabase.cpp index f59155f1b..2941ccc33 100644 --- a/src/common/Database/Implementation/CharacterDatabase.cpp +++ b/src/common/Database/Implementation/CharacterDatabase.cpp @@ -557,4 +557,10 @@ void CharacterDatabaseConnection::DoPrepareStatements() // Deserter tracker 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); } diff --git a/src/common/Database/Implementation/CharacterDatabase.h b/src/common/Database/Implementation/CharacterDatabase.h index ae7707871..397b71a04 100644 --- a/src/common/Database/Implementation/CharacterDatabase.h +++ b/src/common/Database/Implementation/CharacterDatabase.h @@ -494,6 +494,11 @@ enum CharacterDatabaseStatements 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 }; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fd11c118a..ea18fe43e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -34,6 +34,8 @@ #include "GroupMgr.h" #include "Guild.h" #include "GuildMgr.h" +#include "GitRevision.h" +#include "revision.h" #include "InstanceSaveMgr.h" #include "InstanceScript.h" #include "Language.h" @@ -15662,6 +15664,20 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) 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! UpdateZoneDependentAuras(GetZoneId()); UpdateAreaDependentAuras(GetAreaId()); @@ -15690,6 +15706,18 @@ void Player::CompleteQuest(uint32 quest_id) UpdateAreaDependentAuras(GetAreaId()); 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) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 281896a54..1be8665ed 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -426,6 +426,17 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPacket& recvData) #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDetail("Player %u abandoned quest %u", _player->GetGUIDLow(), questId); #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); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 66a8dbfbf..340dcba21 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1037,6 +1037,8 @@ void World::LoadConfigSettings(bool reload) 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) 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) diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 6eeb4c4f9..62116f656 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -157,6 +157,7 @@ enum WorldBoolConfigs CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS, // pussywizard CONFIG_QUEST_IGNORE_AUTO_ACCEPT, CONFIG_QUEST_IGNORE_AUTO_COMPLETE, + CONFIG_QUEST_ENABLE_QUEST_TRACKER, CONFIG_WARDEN_ENABLED, CONFIG_ENABLE_CONTINENT_TRANSPORT, CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING, diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index 8604a9787..cbfe15b6b 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -225,6 +225,18 @@ public: if (ReqOrRewMoney < 0) 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); return true; } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 22f4a8879..babfb6c6c 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1230,6 +1230,14 @@ Instance.ResetTimeHour = 4 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 # Description: Level difference between player and quest level at which quests are