Core/Quests: New FlagsEx implementations

* QUEST_FLAGS_EX_REWARDS_IGNORE_CAPS
* QUEST_FLAGS_EX_NO_CREDIT_FOR_PROXY
* QUEST_FLAGS_EX_RECAST_ACCEPT_SPELL_ON_LOGIN
* QUEST_FLAGS_EX_REMOVE_ON_PERIODIC_RESET
* QUEST_FLAGS_EX_NO_ABANDON_ONCE_BEGUN
Port From (https://github.com/TrinityCore/TrinityCore/commit/0cb8965de22c5da3887b8f8b5c08b9f5034b3cc6)
This commit is contained in:
hondacrx
2023-06-13 09:11:55 -04:00
parent 5b7b6c5494
commit 264647c611
6 changed files with 147 additions and 57 deletions
+3
View File
@@ -763,6 +763,9 @@ namespace Game.Entities
else if (questStatusData.Status == QuestStatus.Failed)
SetQuestSlotState(slot, QuestSlotStateMask.Fail);
if (quest.HasFlagEx(QuestFlagsEx.RecastAcceptSpellOnLogin) && quest.HasFlag(QuestFlags.PlayerCastAccept) && quest.SourceSpellID > 0)
CastSpell(this, quest.SourceSpellID, new CastSpellExtraArgs(TriggerCastFlags.FullMask));
++slot;
}
+52 -4
View File
@@ -170,6 +170,24 @@ namespace Game.Entities
m_DFQuests.Clear(); // Dungeon Finder Quests.
for (ushort slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot)
{
uint questId = GetQuestSlotQuestId(slot);
if (questId == 0)
continue;
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest == null || !quest.IsDaily() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnPeriodicReset))
continue;
SetQuestSlot(slot, 0);
AbandonQuest(questId);
RemoveActiveQuest(questId);
if (quest.LimitTime != 0)
RemoveTimedQuest(questId);
}
// DB data deleted in caller
m_DailyQuestChanged = false;
m_lastDailyQuestTime = 0;
@@ -190,6 +208,24 @@ namespace Game.Entities
SetQuestCompletedBit(questBit, false);
}
for (ushort slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot)
{
uint questId = GetQuestSlotQuestId(slot);
if (questId == 0)
continue;
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest == null || !quest.IsWeekly() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnWeeklyReset))
continue;
SetQuestSlot(slot, 0);
AbandonQuest(questId);
RemoveActiveQuest(questId);
if (quest.LimitTime != 0)
RemoveTimedQuest(questId);
}
m_weeklyquests.Clear();
// DB data deleted in caller
m_WeeklyQuestChanged = false;
@@ -958,7 +994,7 @@ namespace Game.Entities
}
}
if (!quest.FlagsEx.HasAnyFlag(QuestFlagsEx.KeepAdditionalItems))
if (!quest.FlagsEx.HasAnyFlag(QuestFlagsEx.NoItemRemoval))
{
for (byte i = 0; i < SharedConst.QuestItemDropCount; ++i)
{
@@ -994,7 +1030,15 @@ namespace Game.Entities
}
CurrencyGainSource currencyGainSource = CurrencyGainSource.QuestReward;
if (quest.IsDaily())
if (quest.HasFlagEx(QuestFlagsEx.RewardsIgnoreCaps))
{
if (quest.IsWorldQuest())
currencyGainSource = CurrencyGainSource.WorldQuestRewardIgnoreCaps;
currencyGainSource = CurrencyGainSource.QuestRewardIgnoreCaps;
}
else if (quest.IsDaily())
currencyGainSource = CurrencyGainSource.DailyQuestReward;
else if (quest.IsWeekly())
currencyGainSource = CurrencyGainSource.WeeklyQuestReward;
@@ -2050,7 +2094,7 @@ namespace Game.Entities
case QuestStatus.Complete:
if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.CovenantCallingRewardCompleteNoPOI : QuestGiverStatus.CovenantCallingRewardCompletePOI;
else if (quest.HasFlagEx(QuestFlagsEx.LegendaryQuest))
else if (quest.HasFlagEx(QuestFlagsEx.Legendary))
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.LegendaryRewardCompleteNoPOI : QuestGiverStatus.LegendaryRewardCompletePOI;
else
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.RewardCompleteNoPOI : QuestGiverStatus.RewardCompletePOI;
@@ -2093,7 +2137,7 @@ namespace Game.Entities
{
if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= QuestGiverStatus.CovenantCallingQuest;
else if (quest.HasFlagEx(QuestFlagsEx.LegendaryQuest))
else if (quest.HasFlagEx(QuestFlagsEx.Legendary))
result |= QuestGiverStatus.LegendaryQuest;
else if (quest.IsDaily())
result |= QuestGiverStatus.DailyQuest;
@@ -2449,6 +2493,10 @@ namespace Game.Entities
if (!IsQuestObjectiveCompletable(logSlot, quest, objective))
continue;
if (quest.HasFlagEx(QuestFlagsEx.NoCreditForProxy))
if (objective.Type == QuestObjectiveType.Monster && victimGuid.IsEmpty())
continue;
bool objectiveWasComplete = IsQuestObjectiveComplete(logSlot, quest, objective);
if (!objectiveWasComplete || addCount < 0)
{
+14 -9
View File
@@ -1127,6 +1127,8 @@ namespace Game.Entities
gainSource == CurrencyGainSource.PlayerTraitRefund)
isGainOnRefund = true;
bool ignoreCaps = isGainOnRefund || gainSource == CurrencyGainSource.QuestRewardIgnoreCaps || gainSource == CurrencyGainSource.WorldQuestRewardIgnoreCaps;
if (amount > 0 && !isGainOnRefund && gainSource != CurrencyGainSource.Vendor)
{
amount = (int)(amount * GetTotalAuraMultiplierByMiscValue(AuraType.ModCurrencyGain, (int)id));
@@ -1164,16 +1166,18 @@ namespace Game.Entities
_currencyStorage.Add(id, playerCurrency);
}
// Weekly cap
uint weeklyCap = GetCurrencyWeeklyCap(currency);
if (weeklyCap != 0 && amount > 0 && (playerCurrency.WeeklyQuantity + amount) > weeklyCap)
if (!isGainOnRefund) // Ignore weekly cap for refund
if (!ignoreCaps) // Ignore weekly cap for refund
{
// Weekly cap
if (weeklyCap != 0 && amount > 0 && (playerCurrency.WeeklyQuantity + amount) > weeklyCap)
amount = (int)(weeklyCap - playerCurrency.WeeklyQuantity);
// Max cap
uint maxCap = GetCurrencyMaxQuantity(currency, false, gainSource == CurrencyGainSource.UpdatingVersion);
if (maxCap != 0 && amount > 0 && (playerCurrency.Quantity + amount) > maxCap)
amount = (int)(maxCap - playerCurrency.Quantity);
// Max cap
uint maxCap = GetCurrencyMaxQuantity(currency, false, gainSource == CurrencyGainSource.UpdatingVersion);
if (maxCap != 0 && amount > 0 && (playerCurrency.Quantity + amount) > maxCap)
amount = (int)(maxCap - playerCurrency.Quantity);
}
// Underflow protection
if (amount < 0 && Math.Abs(amount) > playerCurrency.Quantity)
@@ -1187,7 +1191,7 @@ namespace Game.Entities
playerCurrency.Quantity += (uint)amount;
if (amount > 0 && !isGainOnRefund) // Ignore total values update for refund
if (amount > 0 && !ignoreCaps) // Ignore total values update for refund
{
if (weeklyCap != 0)
playerCurrency.WeeklyQuantity += (uint)amount;
@@ -1198,7 +1202,8 @@ namespace Game.Entities
if (currency.HasTotalEarned())
playerCurrency.EarnedQuantity += (uint)amount;
UpdateCriteria(CriteriaType.CurrencyGained, id, (ulong)amount);
if (!isGainOnRefund)
UpdateCriteria(CriteriaType.CurrencyGained, id, (ulong)amount);
}
CurrencyChanged(id, amount);
+7
View File
@@ -411,6 +411,13 @@ namespace Game
if (quest != null)
{
if (quest.HasFlagEx(QuestFlagsEx.NoAbandonOnceBegun))
{
foreach (QuestObjective objective in quest.Objectives)
if (_player.IsQuestObjectiveComplete(packet.Entry, quest, objective))
return;
}
if (quest.LimitTime != 0)
GetPlayer().RemoveTimedQuest(questId);
+22
View File
@@ -20,6 +20,7 @@ using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Game
{
@@ -2012,6 +2013,17 @@ namespace Game
player.DailyReset();
}
StringBuilder questIds = new StringBuilder("DELETE cq, cqo FROM character_queststatus cq LEFT JOIN character_queststatus_objectives cqo ON cq.quest = cqo.quest WHERE cq.quest IN (");
foreach (var (questId, quest) in Global.ObjectMgr.GetQuestTemplates())
{
if (quest.IsDaily() && quest.HasFlagEx(QuestFlagsEx.RemoveOnPeriodicReset))
questIds.Append($"{questId},");
}
questIds.Append("0)");
DB.Characters.Execute(questIds.ToString());
// reselect pools
Global.QuestPoolMgr.ChangeDailyQuests();
@@ -2054,6 +2066,16 @@ namespace Game
player.ResetWeeklyQuestStatus();
}
StringBuilder questIds = new StringBuilder("DELETE cq, cqo FROM character_queststatus cq LEFT JOIN character_queststatus_objectives cqo ON cq.quest = cqo.quest WHERE cq.quest IN (");
foreach (var (questId, quest) in Global.ObjectMgr.GetQuestTemplates())
{
if (quest.IsWeekly() && quest.HasFlagEx(QuestFlagsEx.RemoveOnWeeklyReset))
questIds.Append($"{questId},");
}
questIds.Append("0)");
DB.Characters.Execute(questIds.ToString());
// reselect pools
Global.QuestPoolMgr.ChangeWeeklyQuests();