Core/Quests: Only launch gossip menu on quest completion when quest has QUEST_FLAGS_LAUNCH_GOSSIP_COMPLETE flag

Port From (https://github.com/TrinityCore/TrinityCore/commit/e746cb2f28a07520b51a7a258958d9da8237fbf1)
This commit is contained in:
hondacrx
2023-06-13 05:18:04 -04:00
parent f5108cbb94
commit 48f8d37ccb
+24 -45
View File
@@ -368,49 +368,27 @@ namespace Game.Entities
return m_QuestStatus.ContainsKey(quest_id); return m_QuestStatus.ContainsKey(quest_id);
} }
public Quest GetNextQuest(ObjectGuid guid, Quest quest) public Quest GetNextQuest(WorldObject questGiver, Quest quest)
{ {
QuestRelationResult quests;
uint nextQuestID = quest.NextQuestInChain; uint nextQuestID = quest.NextQuestInChain;
if (nextQuestID == 0)
return null;
switch (guid.GetHigh()) if (questGiver == this)
{ {
case HighGuid.Player: Cypher.Assert(quest.HasFlag(QuestFlags.AutoComplete));
Cypher.Assert(quest.HasFlag(QuestFlags.AutoComplete)); return Global.ObjectMgr.GetQuestTemplate(nextQuestID);
return Global.ObjectMgr.GetQuestTemplate(nextQuestID);
case HighGuid.Creature:
case HighGuid.Pet:
case HighGuid.Vehicle:
{
Creature creature = ObjectAccessor.GetCreatureOrPetOrVehicle(this, guid);
if (creature != null)
quests = Global.ObjectMgr.GetCreatureQuestRelations(creature.GetEntry());
else
return null;
break;
}
case HighGuid.GameObject:
{
//we should obtain map from GetMap() in 99% of cases. Special case
//only for quests which cast teleport spells on player
Map _map = IsInWorld ? GetMap() : Global.MapMgr.FindMap(GetMapId(), GetInstanceId());
Cypher.Assert(_map != null);
GameObject gameObject = _map.GetGameObject(guid);
if (gameObject != null)
quests = Global.ObjectMgr.GetGOQuestRelations(gameObject.GetEntry());
else
return null;
break;
}
default:
return null;
} }
if (nextQuestID != 0) //we should obtain map pointer from GetMap() in 99% of cases. Special case
if (quests.HasQuest(nextQuestID)) //only for quests which cast teleport spells on player
return Global.ObjectMgr.GetQuestTemplate(nextQuestID); if (!IsInMap(questGiver))
return null;
return null; if (!questGiver.HasQuest(nextQuestID))
return null;
return Global.ObjectMgr.GetQuestTemplate(nextQuestID);
} }
public bool CanSeeStartQuest(Quest quest) public bool CanSeeStartQuest(Quest quest)
@@ -1207,7 +1185,7 @@ namespace Game.Entities
{ {
//For AutoSubmition was added plr case there as it almost same exclute AI script cases. //For AutoSubmition was added plr case there as it almost same exclute AI script cases.
// Send next quest // Send next quest
Quest nextQuest = GetNextQuest(questGiver.GetGUID(), quest); Quest nextQuest = GetNextQuest(questGiver, quest);
if (nextQuest != null) if (nextQuest != null)
{ {
// Only send the quest to the player if the conditions are met // Only send the quest to the player if the conditions are met
@@ -1228,9 +1206,8 @@ namespace Game.Entities
} }
case TypeId.GameObject: case TypeId.GameObject:
{ {
GameObject questGiverGob = questGiver.ToGameObject();
// Send next quest // Send next quest
Quest nextQuest = GetNextQuest(questGiverGob.GetGUID(), quest); Quest nextQuest = GetNextQuest(questGiver, quest);
if (nextQuest != null) if (nextQuest != null)
{ {
// Only send the quest to the player if the conditions are met // Only send the quest to the player if the conditions are met
@@ -1239,12 +1216,12 @@ namespace Game.Entities
if (nextQuest.IsAutoAccept() && CanAddQuest(nextQuest, true)) if (nextQuest.IsAutoAccept() && CanAddQuest(nextQuest, true))
AddQuestAndCheckCompletion(nextQuest, questGiver); AddQuestAndCheckCompletion(nextQuest, questGiver);
PlayerTalkClass.SendQuestGiverQuestDetails(nextQuest, questGiverGob.GetGUID(), true, false); PlayerTalkClass.SendQuestGiverQuestDetails(nextQuest, questGiver.GetGUID(), true, false);
} }
} }
PlayerTalkClass.ClearMenus(); PlayerTalkClass.ClearMenus();
questGiverGob.GetAI().OnQuestReward(this, quest, rewardType, rewardId); questGiver.ToGameObject()?.GetAI()?.OnQuestReward(this, quest, rewardType, rewardId);
break; break;
} }
default: default:
@@ -2845,12 +2822,14 @@ namespace Game.Entities
if (questGiver) if (questGiver)
{ {
if (questGiver.IsGossip()) if (questGiver.IsGossip())
packet.LaunchGossip = true; packet.LaunchGossip = quest.HasFlag(QuestFlags.LaunchGossipComplete);
else if (questGiver.IsQuestGiver())
if (questGiver.IsQuestGiver())
packet.LaunchQuest = (GetQuestDialogStatus(questGiver) & ~QuestGiverStatus.Future) != QuestGiverStatus.None; packet.LaunchQuest = (GetQuestDialogStatus(questGiver) & ~QuestGiverStatus.Future) != QuestGiverStatus.None;
else if (quest.NextQuestInChain != 0 && !quest.HasFlag(QuestFlags.AutoComplete))
if (!quest.HasFlag(QuestFlags.AutoComplete))
{ {
Quest rewardQuest = Global.ObjectMgr.GetQuestTemplate(quest.NextQuestInChain); Quest rewardQuest = GetNextQuest(questGiver, quest);
if (rewardQuest != null) if (rewardQuest != null)
packet.UseQuestReward = CanTakeQuest(rewardQuest, false); packet.UseQuestReward = CanTakeQuest(rewardQuest, false);
} }