diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 7b129d9f3..639b09ccd 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -92,7 +92,7 @@ namespace Framework.Database PrepareStatement(CharStatements.SEL_CHARACTER_AURAS, "SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, difficulty, stackCount, maxDuration, remainTime, remainCharges, castItemId, castItemLevel FROM character_aura WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_AURA_EFFECTS, "SELECT casterGuid, itemGuid, spell, effectMask, effectIndex, amount, baseAmount FROM character_aura_effect WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_SPELL, "SELECT spell, active, disabled FROM character_spell WHERE guid = ?"); - PrepareStatement(CharStatements.SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, timer FROM character_queststatus WHERE guid = ? AND status <> 0"); + PrepareStatement(CharStatements.SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer FROM character_queststatus WHERE guid = ? AND status <> 0"); PrepareStatement(CharStatements.SEL_CHARACTER_QUESTSTATUS_OBJECTIVES, "SELECT quest, objective, data FROM character_queststatus_objectives WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_QUESTSTATUS_OBJECTIVES_CRITERIA, "SELECT questObjectiveId FROM character_queststatus_objectives_criteria WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_QUESTSTATUS_OBJECTIVES_CRITERIA_PROGRESS, "SELECT criteriaId, counter, date FROM character_queststatus_objectives_criteria_progress WHERE guid = ?"); @@ -645,7 +645,7 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_CHAR_INVENTORY_BY_ITEM, "DELETE FROM character_inventory WHERE item = ?"); PrepareStatement(CharStatements.DEL_CHAR_INVENTORY_BY_BAG_SLOT, "DELETE FROM character_inventory WHERE bag = ? AND slot = ? AND guid = ?"); PrepareStatement(CharStatements.UPD_MAIL, "UPDATE mail SET has_items = ?, expire_time = ?, deliver_time = ?, money = ?, cod = ?, checked = ? WHERE id = ?"); - PrepareStatement(CharStatements.REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, timer) VALUES (?, ?, ?, ?)"); + PrepareStatement(CharStatements.REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, explored, timer) VALUES (?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_CHAR_QUESTSTATUS_BY_QUEST, "DELETE FROM character_queststatus WHERE guid = ? AND quest = ?"); PrepareStatement(CharStatements.REP_CHAR_QUESTSTATUS_OBJECTIVES, "REPLACE INTO character_queststatus_objectives (guid, quest, objective, data) VALUES (?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_CHAR_QUESTSTATUS_OBJECTIVES_BY_QUEST, "DELETE FROM character_queststatus_objectives WHERE guid = ? AND quest = ?"); diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 6bd75061a..3e56981c8 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -692,7 +692,9 @@ namespace Game.Entities GetName(), GetGUID().ToString(), quest_id, qstatus); } - long quest_time = result.Read(2); + questStatusData.Explored = (result.Read(2) > 0); + + long quest_time = result.Read(3); if (quest.LimitTime != 0 && !GetQuestRewardStatus(quest_id)) { @@ -1948,7 +1950,8 @@ namespace Game.Entities stmt.AddValue(0, GetGUID().GetCounter()); stmt.AddValue(1, save.Key); stmt.AddValue(2, (byte)data.Status); - stmt.AddValue(3, data.Timer / Time.InMilliseconds + GameTime.GetGameTime()); + stmt.AddValue(3, data.Explored); + stmt.AddValue(4, data.Timer / Time.InMilliseconds + GameTime.GetGameTime()); trans.Append(stmt); // Save objectives diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 830794b8d..569e8a726 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -494,6 +494,9 @@ namespace Game.Entities } } + if (qInfo.HasSpecialFlag(QuestSpecialFlags.ExplorationOrEvent) && !q_status.Explored) + return false; + if (qInfo.LimitTime != 0 && q_status.Timer == 0) return false; @@ -741,7 +744,9 @@ namespace Game.Entities QuestStatus oldStatus = questStatusData.Status; // check for repeatable quests status reset + questStatusData.Slot = log_slot; questStatusData.Status = QuestStatus.Incomplete; + questStatusData.Explored = false; GiveQuestSourceItem(quest); AdjustQuestObjectiveProgress(quest); @@ -800,7 +805,6 @@ namespace Game.Entities caster.CastSpell(this, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetCastDifficulty(spellInfo.Difficulty)); } - questStatusData.Slot = log_slot; SetQuestSlot(log_slot, quest_id, qtime); m_QuestStatusSave[quest_id] = QuestSaveType.Default; @@ -2127,25 +2131,17 @@ namespace Game.Entities { if (questId != 0) { - ushort log_slot = FindQuestSlot(questId); - if (log_slot < SharedConst.MaxQuestLogSize) + QuestStatusData status = m_QuestStatus.LookupByKey(questId); + if (status != null) { - Log.outError(LogFilter.Player, "Deprecated function AreaExploredOrEventHappens called for quest {0}", questId); - /* @todo - This function was previously used for area triggers but now those are a part of quest objective system - Currently this function is used to complete quests with no objectives (needs verifying) so probably rename it? - - QuestStatusData& q_status = m_QuestStatus[questId]; - - if (!q_status.Explored) + // Dont complete failed quest + if (!status.Explored && status.Status != QuestStatus.Failed) { - q_status.Explored = true; - m_QuestStatusSave[questId] = QUEST_DEFAULT_SAVE_TYPE; - - // if we cannot complete quest send exploration succeded (to mark exploration on client) - if (!CanCompleteQuest(questId)) - SendQuestComplete(questId) - }*/ + status.Explored = true; + m_QuestStatusSave[questId] = QuestSaveType.Default; + + SendQuestComplete(questId); + } } if (CanCompleteQuest(questId)) CompleteQuest(questId); @@ -2618,12 +2614,12 @@ namespace Game.Entities return false; } - public void SendQuestComplete(Quest quest) + public void SendQuestComplete(uint questId) { - if (quest != null) + if (questId != 0) { QuestUpdateComplete data = new(); - data.QuestID = quest.Id; + data.QuestID = questId; SendPacket(data); } } diff --git a/Source/Game/Quest/Quest.cs b/Source/Game/Quest/Quest.cs index de0d88b62..61f5e030f 100644 --- a/Source/Game/Quest/Quest.cs +++ b/Source/Game/Quest/Quest.cs @@ -731,6 +731,7 @@ namespace Game public ushort Slot = SharedConst.MaxQuestLogSize; public QuestStatus Status; public uint Timer; + public bool Explored; } public class QuestGreeting diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 4d8786510..1da375e45 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1250,6 +1250,7 @@ CREATE TABLE `character_queststatus` ( `guid` bigint(20) unsigned NOT NULL DEFAULT '0', `quest` int(10) unsigned NOT NULL DEFAULT '0', `status` tinyint(3) unsigned NOT NULL DEFAULT '0', + `explored` tinyint(3) unsigned NOT NULL DEFAULT '0', `timer` bigint(20) NOT NULL DEFAULT '0', PRIMARY KEY (`guid`,`quest`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System'; @@ -3852,7 +3853,8 @@ INSERT INTO `updates` VALUES ('2020_11_16_00_characters.sql','33D5C7539E239132923D01F4B6EAD5F3EF3EEB69','RELEASED','2020-11-16 19:16:31',0), ('2020_12_13_00_characters.sql','6AC743240033DED2C402ECB894A59D79EF607920','RELEASED','2020-12-13 18:36:58',0), ('2021_03_27_00_characters_aura_stored_location.sql','BF772ABC2DF186AF0A5DC56D5E824A2F4813BA69','RELEASED','2021-03-27 15:53:04',0), -('2021_04_05_00_characters.sql','33D656995E0F3578FFE1A658ED1692CA5310AB30','RELEASED','2021-04-05 23:44:54',0); +('2021_04_05_00_characters.sql','33D656995E0F3578FFE1A658ED1692CA5310AB30','RELEASED','2021-04-05 23:44:54',0), +('2021_05_10_00_characters.sql','0A406242BC18BDA5A65CDE3E2AFEE760D79F819F','RELEASED','2021-05-10 23:30:34',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/master/2021_05_10_00_characters.sql b/sql/updates/characters/master/2021_05_10_00_characters.sql new file mode 100644 index 000000000..16a8e9d88 --- /dev/null +++ b/sql/updates/characters/master/2021_05_10_00_characters.sql @@ -0,0 +1 @@ +ALTER TABLE `character_queststatus` ADD `explored` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `status`;