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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user