Core/Player: Keep shared quests through map changes instead of getting stuck in busy state

Port From (https://github.com/TrinityCore/TrinityCore/commit/c12ee97f122acfd77bd81cf178a77d5054c312b6)
This commit is contained in:
hondacrx
2020-07-24 14:55:22 -04:00
parent 0480e5c4d0
commit 3c054eb054
5 changed files with 39 additions and 27 deletions
+22 -22
View File
@@ -91,30 +91,30 @@ namespace Game
else
obj = Global.ObjAccessor.FindPlayer(packet.QuestGiverGUID);
var CLOSE_GOSSIP_CLEAR_DIVIDER = new System.Action(() =>
var CLOSE_GOSSIP_CLEAR_SHARING_INFO = new System.Action(() =>
{
GetPlayer().PlayerTalkClass.SendCloseGossip();
GetPlayer().SetDivider(ObjectGuid.Empty);
GetPlayer().ClearQuestSharingInfo();
});
// no or incorrect quest giver
if (obj == null)
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return;
}
Player playerQuestObject = obj.ToPlayer();
if (playerQuestObject)
{
if ((_player.GetDivider().IsEmpty() && _player.GetDivider() != packet.QuestGiverGUID) || !playerQuestObject.CanShareQuest(packet.QuestID))
if ((_player.GetPlayerSharingQuest().IsEmpty() && _player.GetPlayerSharingQuest() != packet.QuestGiverGUID) || !playerQuestObject.CanShareQuest(packet.QuestID))
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return;
}
if (!_player.IsInSameRaidWith(playerQuestObject))
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return;
}
}
@@ -122,7 +122,7 @@ namespace Game
{
if (!obj.HasQuest(packet.QuestID))
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return;
}
}
@@ -130,7 +130,7 @@ namespace Game
// some kind of WPE protection
if (!_player.CanInteractWithQuestGiver(obj))
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return;
}
@@ -140,17 +140,17 @@ namespace Game
// prevent cheating
if (!GetPlayer().CanTakeQuest(quest, true))
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return;
}
if (!_player.GetDivider().IsEmpty())
if (!_player.GetPlayerSharingQuest().IsEmpty())
{
Player player = Global.ObjAccessor.FindPlayer(_player.GetDivider());
Player player = Global.ObjAccessor.FindPlayer(_player.GetPlayerSharingQuest());
if (player != null)
{
player.SendPushToPartyResponse(_player, QuestPushReason.Accepted);
_player.SetDivider(ObjectGuid.Empty);
_player.ClearQuestSharingInfo();
}
}
@@ -172,7 +172,7 @@ namespace Game
if (player.CanTakeQuest(quest, true))
{
player.SetDivider(_player.GetGUID());
player.SetQuestSharingInfo(_player.GetGUID(), quest.Id);
//need confirmation that any gossip window will close
player.PlayerTalkClass.SendCloseGossip();
@@ -189,7 +189,7 @@ namespace Game
}
}
CLOSE_GOSSIP_CLEAR_DIVIDER();
CLOSE_GOSSIP_CLEAR_SHARING_INFO();
}
[WorldPacketHandler(ClientOpcodes.QuestGiverQueryQuest)]
@@ -456,7 +456,7 @@ namespace Game
if (!quest.HasFlag(QuestFlags.PartyAccept))
return;
Player originalPlayer = Global.ObjAccessor.FindPlayer(GetPlayer().GetDivider());
Player originalPlayer = Global.ObjAccessor.FindPlayer(GetPlayer().GetPlayerSharingQuest());
if (originalPlayer == null)
return;
@@ -478,7 +478,7 @@ namespace Game
}
}
GetPlayer().SetDivider(ObjectGuid.Empty);
GetPlayer().ClearQuestSharingInfo();
}
[WorldPacketHandler(ClientOpcodes.QuestGiverCompleteQuest)]
@@ -600,7 +600,7 @@ namespace Game
continue;
}
if (!receiver.GetDivider().IsEmpty())
if (!receiver.GetPlayerSharingQuest().IsEmpty())
{
sender.SendPushToPartyResponse(receiver, QuestPushReason.Busy);
continue;
@@ -615,7 +615,7 @@ namespace Game
receiver.PlayerTalkClass.SendQuestGiverRequestItems(quest, sender.GetGUID(), receiver.CanCompleteRepeatableQuest(quest), true);
else
{
receiver.SetDivider(sender.GetGUID());
receiver.SetQuestSharingInfo(sender.GetGUID(), quest.Id);
receiver.PlayerTalkClass.SendQuestGiverQuestDetails(quest, receiver.GetGUID(), true, false);
}
}
@@ -624,16 +624,16 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.QuestPushResult)]
void HandleQuestPushResult(QuestPushResult packet)
{
if (!GetPlayer().GetDivider().IsEmpty())
if (!GetPlayer().GetPlayerSharingQuest().IsEmpty())
{
if (_player.GetDivider() == packet.SenderGUID)
if (_player.GetPlayerSharingQuest() == packet.SenderGUID)
{
Player player = Global.ObjAccessor.FindPlayer(_player.GetDivider());
Player player = Global.ObjAccessor.FindPlayer(_player.GetPlayerSharingQuest());
if (player)
player.SendPushToPartyResponse(_player, packet.Result);
}
_player.SetDivider(ObjectGuid.Empty);
_player.ClearQuestSharingInfo();
}
}