Core/Quests: Fixed questgiver icons

Port From (https://github.com/TrinityCore/TrinityCore/commit/5f3a2d2abf296d1eaf9788244100c91de8b7a619)
This commit is contained in:
hondacrx
2020-12-14 14:01:25 -05:00
parent 5d6f0d6401
commit 56d007da4c
11 changed files with 178 additions and 48 deletions
+1 -1
View File
@@ -74,7 +74,7 @@ namespace Game.AI
/// <summary>
/// Called when the dialog status between a player and the gameobject is requested.
/// </summary>
public virtual uint GetDialogStatus(Player player) { return 100; }
public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedDefault; }
// Called when a Player clicks a GameObject, before GossipHello
// prevents achievement tracking if returning true
+1 -1
View File
@@ -529,7 +529,7 @@ namespace Game.AI
public virtual void OnGameEvent(bool start, ushort eventId) { }
// Called when the dialog status between a player and the creature is requested.
public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedNoStatus; }
public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedDefault; }
public virtual void WaypointStarted(uint nodeId, uint pathId) { }
-5
View File
@@ -1079,11 +1079,6 @@ namespace Game.AI
GetScript().ProcessEventsFor(SmartEvents.RewardQuest, player, quest.Id, opt, false, null, me);
}
public override uint GetDialogStatus(Player player)
{
return 100;
}
public override void Destroyed(Player player, uint eventId)
{
GetScript().ProcessEventsFor(SmartEvents.Death, player, eventId, 0, false, null, me);
+2
View File
@@ -229,6 +229,7 @@ namespace Game.DataStorage
PvpTalentCategoryStorage = ReadDB2<PvpTalentCategoryRecord>("PvpTalentCategory.db2", HotfixStatements.SEL_PVP_TALENT_CATEGORY);
PvpTalentSlotUnlockStorage = ReadDB2<PvpTalentSlotUnlockRecord>("PvpTalentSlotUnlock.db2", HotfixStatements.SEL_PVP_TALENT_SLOT_UNLOCK);
QuestFactionRewardStorage = ReadDB2<QuestFactionRewardRecord>("QuestFactionReward.db2", HotfixStatements.SEL_QUEST_FACTION_REWARD);
QuestInfoStorage = ReadDB2<QuestInfoRecord>("QuestInfo.db2", HotfixStatements.SEL_QUEST_INFO, HotfixStatements.SEL_QUEST_INFO_LOCALE);
QuestMoneyRewardStorage = ReadDB2<QuestMoneyRewardRecord>("QuestMoneyReward.db2", HotfixStatements.SEL_QUEST_MONEY_REWARD);
QuestPackageItemStorage = ReadDB2<QuestPackageItemRecord>("QuestPackageItem.db2", HotfixStatements.SEL_QUEST_PACKAGE_ITEM);
QuestSortStorage = ReadDB2<QuestSortRecord>("QuestSort.db2", HotfixStatements.SEL_QUEST_SORT, HotfixStatements.SEL_QUEST_SORT_LOCALE);
@@ -584,6 +585,7 @@ namespace Game.DataStorage
public static DB6Storage<PvpTalentCategoryRecord> PvpTalentCategoryStorage;
public static DB6Storage<PvpTalentSlotUnlockRecord> PvpTalentSlotUnlockStorage;
public static DB6Storage<QuestFactionRewardRecord> QuestFactionRewardStorage;
public static DB6Storage<QuestInfoRecord> QuestInfoStorage;
public static DB6Storage<QuestMoneyRewardRecord> QuestMoneyRewardStorage;
public static DB6Storage<QuestPackageItemRecord> QuestPackageItemStorage;
public static DB6Storage<QuestSortRecord> QuestSortStorage;
@@ -25,6 +25,15 @@ namespace Game.DataStorage
public short[] Difficulty = new short[10];
}
public sealed class QuestInfoRecord
{
public uint Id;
public LocalizedString InfoName;
public sbyte Type;
public byte Modifiers;
public ushort Profession;
}
public sealed class QuestMoneyRewardRecord
{
public uint Id;
@@ -1217,7 +1217,7 @@ namespace Game.Entities
{
case GameObjectTypes.QuestGiver:
QuestGiverStatus questStatus = target.GetQuestDialogStatus(this);
if (questStatus > QuestGiverStatus.Unavailable)
if (questStatus != QuestGiverStatus.None && questStatus != QuestGiverStatus.Future)
return true;
break;
// scan GO chest with loot including quest items
+41 -25
View File
@@ -1860,8 +1860,8 @@ namespace Game.Entities
{
case TypeId.GameObject:
{
QuestGiverStatus questStatus = (QuestGiverStatus)questgiver.ToGameObject().GetAI().GetDialogStatus(this);
if (questStatus != QuestGiverStatus.ScriptedNoStatus)
QuestGiverStatus questStatus = questgiver.ToGameObject().GetAI().GetDialogStatus(this);
if (questStatus != QuestGiverStatus.ScriptedDefault)
return questStatus;
qr = Global.ObjectMgr.GetGOQuestRelationBounds(questgiver.GetEntry());
qir = Global.ObjectMgr.GetGOQuestInvolvedRelationBounds(questgiver.GetEntry());
@@ -1869,8 +1869,8 @@ namespace Game.Entities
}
case TypeId.Unit:
{
QuestGiverStatus questStatus = (QuestGiverStatus)questgiver.ToCreature().GetAI().GetDialogStatus(this);
if (questStatus != QuestGiverStatus.ScriptedNoStatus)
QuestGiverStatus questStatus = questgiver.ToCreature().GetAI().GetDialogStatus(this);
if (questStatus != QuestGiverStatus.ScriptedDefault)
return questStatus;
qr = Global.ObjectMgr.GetCreatureQuestRelationBounds(questgiver.GetEntry());
qir = Global.ObjectMgr.GetCreatureQuestInvolvedRelationBounds(questgiver.GetEntry());
@@ -1886,27 +1886,41 @@ namespace Game.Entities
foreach (var questId in qir)
{
QuestGiverStatus result2 = QuestGiverStatus.None;
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest == null)
continue;
QuestStatus status = GetQuestStatus(questId);
if (status == QuestStatus.Complete && !GetQuestRewardStatus(questId))
result2 = QuestGiverStatus.Reward;
else if (status == QuestStatus.Incomplete)
result2 = QuestGiverStatus.Incomplete;
switch (GetQuestStatus(questId))
{
case QuestStatus.Complete:
if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.CovenantCallingRewardCompleteNoPOI : QuestGiverStatus.CovenantCallingRewardCompletePOI;
else if (quest.HasFlagEx(QuestFlagsEx.LegendaryQuest))
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.LegendaryRewardCompleteNoPOI : QuestGiverStatus.LegendaryRewardCompletePOI;
else
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.RewardCompleteNoPOI : QuestGiverStatus.RewardCompletePOI;
break;
case QuestStatus.Incomplete:
if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= QuestGiverStatus.CovenantCallingReward;
else
result |= QuestGiverStatus.Reward;
break;
default:
break;
}
if (quest.IsAutoComplete() && CanTakeQuest(quest, false) && quest.IsRepeatable() && !quest.IsDailyOrWeekly())
result2 = QuestGiverStatus.RewardRep;
if (result2 > result)
result = result2;
{
if (GetLevel() <= (GetQuestLevel(quest) + WorldConfig.GetIntValue(WorldCfg.QuestLowLevelHideDiff)))
result |= QuestGiverStatus.RepeatableTurnin;
else
result |= QuestGiverStatus.TrivialRepeatableTurnin;
}
}
foreach (var questId in qr)
{
QuestGiverStatus result2 = QuestGiverStatus.None;
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest == null)
continue;
@@ -1914,8 +1928,7 @@ namespace Game.Entities
if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.QuestAvailable, quest.Id, this))
continue;
QuestStatus status = GetQuestStatus(questId);
if (status == QuestStatus.None)
if (GetQuestStatus(questId) == QuestStatus.None)
{
if (CanSeeStartQuest(quest))
{
@@ -1923,21 +1936,24 @@ namespace Game.Entities
{
if (GetLevel() <= (GetQuestLevel(quest) + WorldConfig.GetIntValue(WorldCfg.QuestLowLevelHideDiff)))
{
if (quest.IsDaily())
result2 = QuestGiverStatus.AvailableRep;
if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= QuestGiverStatus.CovenantCallingQuest;
else if (quest.HasFlagEx(QuestFlagsEx.LegendaryQuest))
result |= QuestGiverStatus.LegendaryQuest;
else if (quest.IsDaily())
result |= QuestGiverStatus.DailyQuest;
else
result2 = QuestGiverStatus.Available;
result |= QuestGiverStatus.Quest;
}
else if (quest.IsDaily())
result |= QuestGiverStatus.TrivialDailyQuest;
else
result2 = QuestGiverStatus.LowLevelAvailable;
result |= QuestGiverStatus.Trivial;
}
else
result2 = QuestGiverStatus.Unavailable;
result |= QuestGiverStatus.Future;
}
}
if (result2 > result)
result = result2;
}
return result;
+9
View File
@@ -318,6 +318,15 @@ namespace Game
return 0;
}
public QuestTagType? GetQuestTag()
{
QuestInfoRecord questInfo = CliDB.QuestInfoStorage.LookupByKey(QuestInfoID);
if (questInfo != null)
return (QuestTagType)questInfo.Type;
return null;
}
public void BuildQuestRewards(QuestRewards rewards, Player player)
{
rewards.ChoiceItemCount = GetRewChoiceItemsCount();