Core/Quest: Use valuetuple over Tuple (#34)

This commit is contained in:
MaxtorCoder
2021-05-30 18:58:28 +02:00
committed by GitHub
parent fc771bec1b
commit 075796983e
2 changed files with 36 additions and 37 deletions
+5 -5
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore> * Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@@ -60,7 +60,7 @@ namespace Game.Entities
TradeData m_trade; TradeData m_trade;
//PVP //PVP
BgBattlegroundQueueID_Rec[] m_bgBattlegroundQueueID = new BgBattlegroundQueueID_Rec[SharedConst.MaxPlayerBGQueues]; BgBattlegroundQueueID_Rec[] m_bgBattlegroundQueueID = new BgBattlegroundQueueID_Rec[SharedConst.MaxPlayerBGQueues];
BGData m_bgData; BGData m_bgData;
bool m_IsBGRandomWinner; bool m_IsBGRandomWinner;
public PvPInfo pvpInfo; public PvPInfo pvpInfo;
@@ -143,7 +143,7 @@ namespace Game.Entities
RestMgr _restMgr; RestMgr _restMgr;
//Combat //Combat
int[] baseRatingValue = new int[(int)CombatRating.Max]; int[] baseRatingValue = new int[(int)CombatRating.Max];
float[] m_auraBaseFlatMod = new float[(int)BaseModGroup.End]; float[] m_auraBaseFlatMod = new float[(int)BaseModGroup.End];
float[] m_auraBasePctMod = new float[(int)BaseModGroup.End]; float[] m_auraBasePctMod = new float[(int)BaseModGroup.End];
@@ -165,7 +165,7 @@ namespace Game.Entities
List<uint> m_monthlyquests = new(); List<uint> m_monthlyquests = new();
MultiMap<uint, uint> m_seasonalquests = new(); MultiMap<uint, uint> m_seasonalquests = new();
Dictionary<uint, QuestStatusData> m_QuestStatus = new(); Dictionary<uint, QuestStatusData> m_QuestStatus = new();
MultiMap<Tuple<QuestObjectiveType, int>, QuestObjectiveStatusData> m_questObjectiveStatus = new(); MultiMap<(QuestObjectiveType Type, int ObjectID), QuestObjectiveStatusData> m_questObjectiveStatus = new();
Dictionary<uint, QuestSaveType> m_QuestStatusSave = new(); Dictionary<uint, QuestSaveType> m_QuestStatusSave = new();
List<uint> m_DFQuests = new(); List<uint> m_DFQuests = new();
List<uint> m_RewardedQuests = new(); List<uint> m_RewardedQuests = new();
@@ -630,7 +630,7 @@ namespace Game.Entities
struct QuestObjectiveStatusData struct QuestObjectiveStatusData
{ {
public KeyValuePair<uint, QuestStatusData> QuestStatusPair; public (uint QuestID, QuestStatusData Status) QuestStatusPair;
public QuestObjective Objective; public QuestObjective Objective;
} }
} }
+31 -32
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore> * Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@@ -729,22 +729,21 @@ namespace Game.Entities
public void AddQuest(Quest quest, WorldObject questGiver) public void AddQuest(Quest quest, WorldObject questGiver)
{ {
ushort log_slot = FindQuestSlot(0); ushort logSlot = FindQuestSlot(0);
if (logSlot >= SharedConst.MaxQuestLogSize) // Player does not have any free slot in the quest log
if (log_slot >= SharedConst.MaxQuestLogSize) // Player does not have any free slot in the quest log
return; return;
uint quest_id = quest.Id; uint questId = quest.Id;
// if not exist then created with set uState == NEW and rewarded=false // if not exist then created with set uState == NEW and rewarded=false
if (!m_QuestStatus.ContainsKey(quest_id)) if (!m_QuestStatus.ContainsKey(questId))
m_QuestStatus[quest_id] = new QuestStatusData(); m_QuestStatus[questId] = new QuestStatusData();
QuestStatusData questStatusData = m_QuestStatus.LookupByKey(quest_id); QuestStatusData questStatusData = m_QuestStatus.LookupByKey(questId);
QuestStatus oldStatus = questStatusData.Status; QuestStatus oldStatus = questStatusData.Status;
// check for repeatable quests status reset // check for repeatable quests status reset
questStatusData.Slot = log_slot; questStatusData.Slot = logSlot;
questStatusData.Status = QuestStatus.Incomplete; questStatusData.Status = QuestStatus.Incomplete;
questStatusData.Explored = false; questStatusData.Explored = false;
@@ -753,7 +752,7 @@ namespace Game.Entities
foreach (QuestObjective obj in quest.Objectives) foreach (QuestObjective obj in quest.Objectives)
{ {
m_questObjectiveStatus.Add(Tuple.Create(obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = KeyValuePair.Create(quest_id, questStatusData), Objective = obj }); m_questObjectiveStatus.Add((obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = (questId, questStatusData), Objective = obj });
switch (obj.Type) switch (obj.Type)
{ {
case QuestObjectiveType.MinReputation: case QuestObjectiveType.MinReputation:
@@ -776,9 +775,9 @@ namespace Game.Entities
{ {
// shared timed quest // shared timed quest
if (questGiver != null && questGiver.IsTypeId(TypeId.Player)) if (questGiver != null && questGiver.IsTypeId(TypeId.Player))
limittime = questGiver.ToPlayer().m_QuestStatus[quest_id].Timer / Time.InMilliseconds; limittime = questGiver.ToPlayer().m_QuestStatus[questId].Timer / Time.InMilliseconds;
AddTimedQuest(quest_id); AddTimedQuest(questId);
questStatusData.Timer = limittime * Time.InMilliseconds; questStatusData.Timer = limittime * Time.InMilliseconds;
endTime = GameTime.GetGameTime() + limittime; endTime = GameTime.GetGameTime() + limittime;
} }
@@ -805,17 +804,17 @@ namespace Game.Entities
caster.CastSpell(this, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetCastDifficulty(spellInfo.Difficulty)); caster.CastSpell(this, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetCastDifficulty(spellInfo.Difficulty));
} }
SetQuestSlot(log_slot, quest_id); SetQuestSlot(logSlot, questId);
SetQuestSlotEndTime(log_slot, endTime); SetQuestSlotEndTime(logSlot, endTime);
SetQuestSlotAcceptTime(log_slot, GameTime.GetGameTime()); SetQuestSlotAcceptTime(logSlot, GameTime.GetGameTime());
m_QuestStatusSave[quest_id] = QuestSaveType.Default; m_QuestStatusSave[questId] = QuestSaveType.Default;
StartCriteriaTimer(CriteriaTimedTypes.Quest, quest_id); StartCriteriaTimer(CriteriaTimedTypes.Quest, questId);
SendQuestUpdate(quest_id); SendQuestUpdate(questId);
Global.ScriptMgr.OnQuestStatusChange(this, quest_id); Global.ScriptMgr.OnQuestStatusChange(this, questId);
Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, questStatusData.Status); Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, questStatusData.Status);
} }
@@ -1789,7 +1788,7 @@ namespace Game.Entities
{ {
foreach (var objective in m_questObjectiveStatus.KeyValueList) foreach (var objective in m_questObjectiveStatus.KeyValueList)
{ {
if (objective.Value.QuestStatusPair.Value == questStatus) if (objective.Value.QuestStatusPair.Status == questStatus)
m_questObjectiveStatus.Remove(objective); m_questObjectiveStatus.Remove(objective);
} }
m_QuestStatus.Remove(questId); m_QuestStatus.Remove(questId);
@@ -2036,7 +2035,7 @@ namespace Game.Entities
{ {
return m_playerData.QuestLog[slot].AcceptTime; return m_playerData.QuestLog[slot].AcceptTime;
} }
bool GetQuestSlotObjectiveFlag(ushort slot, sbyte objectiveIndex) bool GetQuestSlotObjectiveFlag(ushort slot, sbyte objectiveIndex)
{ {
if (objectiveIndex < SharedConst.MaxQuestCounts) if (objectiveIndex < SharedConst.MaxQuestCounts)
@@ -2185,11 +2184,11 @@ namespace Game.Entities
public void ItemRemovedQuestCheck(uint entry, uint count) public void ItemRemovedQuestCheck(uint entry, uint count)
{ {
foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey(Tuple.Create(QuestObjectiveType.Item, (int)entry))) foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)entry)))
{ {
uint questId = objectiveStatusData.QuestStatusPair.Key; uint questId = objectiveStatusData.QuestStatusPair.QuestID;
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
ushort logSlot = objectiveStatusData.QuestStatusPair.Value.Slot; ushort logSlot = objectiveStatusData.QuestStatusPair.Status.Slot;
QuestObjective objective = objectiveStatusData.Objective; QuestObjective objective = objectiveStatusData.Objective;
if (!IsQuestObjectiveCompletable(logSlot, quest, objective)) if (!IsQuestObjectiveCompletable(logSlot, quest, objective))
@@ -2284,16 +2283,16 @@ namespace Game.Entities
{ {
bool anyObjectiveChangedCompletionState = false; bool anyObjectiveChangedCompletionState = false;
foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey(Tuple.Create(objectiveType, objectId))) foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey((objectiveType, objectId)))
{ {
uint questId = objectiveStatusData.QuestStatusPair.Key; uint questId = objectiveStatusData.QuestStatusPair.QuestID;
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (!QuestObjective.CanAlwaysBeProgressedInRaid(objectiveType)) if (!QuestObjective.CanAlwaysBeProgressedInRaid(objectiveType))
if (GetGroup() && GetGroup().IsRaidGroup() && quest.IsAllowedInRaid(GetMap().GetDifficultyID())) if (GetGroup() && GetGroup().IsRaidGroup() && quest.IsAllowedInRaid(GetMap().GetDifficultyID()))
continue; continue;
ushort logSlot = objectiveStatusData.QuestStatusPair.Value.Slot; ushort logSlot = objectiveStatusData.QuestStatusPair.Status.Slot;
QuestObjective objective = objectiveStatusData.Objective; QuestObjective objective = objectiveStatusData.Objective;
if (!IsQuestObjectiveCompletable(logSlot, quest, objective)) if (!IsQuestObjectiveCompletable(logSlot, quest, objective))
continue; continue;
@@ -2381,7 +2380,7 @@ namespace Game.Entities
if (objectiveIsNowComplete && CanCompleteQuest(questId, objective.Id)) if (objectiveIsNowComplete && CanCompleteQuest(questId, objective.Id))
CompleteQuest(questId); CompleteQuest(questId);
else if (objectiveStatusData.QuestStatusPair.Value.Status == QuestStatus.Complete) else if (objectiveStatusData.QuestStatusPair.Status.Status == QuestStatus.Complete)
IncompleteQuest(questId); IncompleteQuest(questId);
} }
} }
@@ -2393,11 +2392,11 @@ namespace Game.Entities
public bool HasQuestForItem(uint itemid) public bool HasQuestForItem(uint itemid)
{ {
// Search incomplete objective first // Search incomplete objective first
foreach (var objectiveItr in m_questObjectiveStatus.LookupByKey(Tuple.Create(QuestObjectiveType.Item, (int)itemid))) foreach (var objectiveItr in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)itemid)))
{ {
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveItr.QuestStatusPair.Key); Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveItr.QuestStatusPair.QuestID);
QuestObjective objective = objectiveItr.Objective; QuestObjective objective = objectiveItr.Objective;
if (!IsQuestObjectiveCompletable(objectiveItr.QuestStatusPair.Value.Slot, qInfo, objective)) if (!IsQuestObjectiveCompletable(objectiveItr.QuestStatusPair.Status.Slot, qInfo, objective))
continue; continue;
// hide quest if player is in raid-group and quest is no raid quest // hide quest if player is in raid-group and quest is no raid quest
@@ -2405,7 +2404,7 @@ namespace Game.Entities
if (!InBattleground()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later if (!InBattleground()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
continue; continue;
if (!IsQuestObjectiveComplete(objectiveItr.QuestStatusPair.Value.Slot, qInfo, objective)) if (!IsQuestObjectiveComplete(objectiveItr.QuestStatusPair.Status.Slot, qInfo, objective))
return true; return true;
} }