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
+1 -1
View File
@@ -429,7 +429,7 @@ namespace Game.Misc
} }
packet.QuestGiverGUID = npcGUID; packet.QuestGiverGUID = npcGUID;
packet.InformUnit = _session.GetPlayer().GetDivider(); packet.InformUnit = _session.GetPlayer().GetPlayerSharingQuest();
packet.QuestID = quest.Id; packet.QuestID = quest.Id;
packet.PortraitGiver = quest.QuestGiverPortrait; packet.PortraitGiver = quest.QuestGiverPortrait;
packet.PortraitGiverMount = quest.QuestGiverPortraitMount; packet.PortraitGiverMount = quest.QuestGiverPortraitMount;
+2 -1
View File
@@ -252,7 +252,8 @@ namespace Game.Entities
uint m_PlayedTimeLevel; uint m_PlayedTimeLevel;
Dictionary<byte, ActionButton> m_actionButtons = new Dictionary<byte, ActionButton>(); Dictionary<byte, ActionButton> m_actionButtons = new Dictionary<byte, ActionButton>();
ObjectGuid m_divider; ObjectGuid m_playerSharingQuest;
uint m_sharedQuestId;
uint m_ingametime; uint m_ingametime;
PlayerCommandStates _activeCheats; PlayerCommandStates _activeCheats;
+4 -2
View File
@@ -33,8 +33,10 @@ namespace Game.Entities
{ {
public partial class Player public partial class Player
{ {
public ObjectGuid GetDivider() { return m_divider; } public uint GetSharedQuestID() { return m_sharedQuestId; }
public void SetDivider(ObjectGuid guid) { m_divider = guid; } public ObjectGuid GetPlayerSharingQuest() { return m_playerSharingQuest; }
public void SetQuestSharingInfo(ObjectGuid guid, uint id) { m_playerSharingQuest = guid; m_sharedQuestId = id; }
public void ClearQuestSharingInfo() { m_playerSharingQuest = ObjectGuid.Empty; m_sharedQuestId = 0; }
uint GetInGameTime() { return m_ingametime; } uint GetInGameTime() { return m_ingametime; }
public void SetInGameTime(uint time) { m_ingametime = time; } public void SetInGameTime(uint time) { m_ingametime = time; }
+9
View File
@@ -5806,6 +5806,15 @@ namespace Game.Entities
_garrison.SendRemoteInfo(); _garrison.SendRemoteInfo();
UpdateItemLevelAreaBasedScaling(); UpdateItemLevelAreaBasedScaling();
if (!GetPlayerSharingQuest().IsEmpty())
{
Quest quest = Global.ObjectMgr.GetQuestTemplate(GetSharedQuestID());
if (quest != null)
PlayerTalkClass.SendQuestGiverQuestDetails(quest, GetGUID(), true, false);
else
ClearQuestSharingInfo();
}
} }
public void RemoveSocial() public void RemoveSocial()
+22 -22
View File
@@ -91,30 +91,30 @@ namespace Game
else else
obj = Global.ObjAccessor.FindPlayer(packet.QuestGiverGUID); 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().PlayerTalkClass.SendCloseGossip();
GetPlayer().SetDivider(ObjectGuid.Empty); GetPlayer().ClearQuestSharingInfo();
}); });
// no or incorrect quest giver // no or incorrect quest giver
if (obj == null) if (obj == null)
{ {
CLOSE_GOSSIP_CLEAR_DIVIDER(); CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return; return;
} }
Player playerQuestObject = obj.ToPlayer(); Player playerQuestObject = obj.ToPlayer();
if (playerQuestObject) 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; return;
} }
if (!_player.IsInSameRaidWith(playerQuestObject)) if (!_player.IsInSameRaidWith(playerQuestObject))
{ {
CLOSE_GOSSIP_CLEAR_DIVIDER(); CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return; return;
} }
} }
@@ -122,7 +122,7 @@ namespace Game
{ {
if (!obj.HasQuest(packet.QuestID)) if (!obj.HasQuest(packet.QuestID))
{ {
CLOSE_GOSSIP_CLEAR_DIVIDER(); CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return; return;
} }
} }
@@ -130,7 +130,7 @@ namespace Game
// some kind of WPE protection // some kind of WPE protection
if (!_player.CanInteractWithQuestGiver(obj)) if (!_player.CanInteractWithQuestGiver(obj))
{ {
CLOSE_GOSSIP_CLEAR_DIVIDER(); CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return; return;
} }
@@ -140,17 +140,17 @@ namespace Game
// prevent cheating // prevent cheating
if (!GetPlayer().CanTakeQuest(quest, true)) if (!GetPlayer().CanTakeQuest(quest, true))
{ {
CLOSE_GOSSIP_CLEAR_DIVIDER(); CLOSE_GOSSIP_CLEAR_SHARING_INFO();
return; 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) if (player != null)
{ {
player.SendPushToPartyResponse(_player, QuestPushReason.Accepted); player.SendPushToPartyResponse(_player, QuestPushReason.Accepted);
_player.SetDivider(ObjectGuid.Empty); _player.ClearQuestSharingInfo();
} }
} }
@@ -172,7 +172,7 @@ namespace Game
if (player.CanTakeQuest(quest, true)) if (player.CanTakeQuest(quest, true))
{ {
player.SetDivider(_player.GetGUID()); player.SetQuestSharingInfo(_player.GetGUID(), quest.Id);
//need confirmation that any gossip window will close //need confirmation that any gossip window will close
player.PlayerTalkClass.SendCloseGossip(); player.PlayerTalkClass.SendCloseGossip();
@@ -189,7 +189,7 @@ namespace Game
} }
} }
CLOSE_GOSSIP_CLEAR_DIVIDER(); CLOSE_GOSSIP_CLEAR_SHARING_INFO();
} }
[WorldPacketHandler(ClientOpcodes.QuestGiverQueryQuest)] [WorldPacketHandler(ClientOpcodes.QuestGiverQueryQuest)]
@@ -456,7 +456,7 @@ namespace Game
if (!quest.HasFlag(QuestFlags.PartyAccept)) if (!quest.HasFlag(QuestFlags.PartyAccept))
return; return;
Player originalPlayer = Global.ObjAccessor.FindPlayer(GetPlayer().GetDivider()); Player originalPlayer = Global.ObjAccessor.FindPlayer(GetPlayer().GetPlayerSharingQuest());
if (originalPlayer == null) if (originalPlayer == null)
return; return;
@@ -478,7 +478,7 @@ namespace Game
} }
} }
GetPlayer().SetDivider(ObjectGuid.Empty); GetPlayer().ClearQuestSharingInfo();
} }
[WorldPacketHandler(ClientOpcodes.QuestGiverCompleteQuest)] [WorldPacketHandler(ClientOpcodes.QuestGiverCompleteQuest)]
@@ -600,7 +600,7 @@ namespace Game
continue; continue;
} }
if (!receiver.GetDivider().IsEmpty()) if (!receiver.GetPlayerSharingQuest().IsEmpty())
{ {
sender.SendPushToPartyResponse(receiver, QuestPushReason.Busy); sender.SendPushToPartyResponse(receiver, QuestPushReason.Busy);
continue; continue;
@@ -615,7 +615,7 @@ namespace Game
receiver.PlayerTalkClass.SendQuestGiverRequestItems(quest, sender.GetGUID(), receiver.CanCompleteRepeatableQuest(quest), true); receiver.PlayerTalkClass.SendQuestGiverRequestItems(quest, sender.GetGUID(), receiver.CanCompleteRepeatableQuest(quest), true);
else else
{ {
receiver.SetDivider(sender.GetGUID()); receiver.SetQuestSharingInfo(sender.GetGUID(), quest.Id);
receiver.PlayerTalkClass.SendQuestGiverQuestDetails(quest, receiver.GetGUID(), true, false); receiver.PlayerTalkClass.SendQuestGiverQuestDetails(quest, receiver.GetGUID(), true, false);
} }
} }
@@ -624,16 +624,16 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.QuestPushResult)] [WorldPacketHandler(ClientOpcodes.QuestPushResult)]
void HandleQuestPushResult(QuestPushResult packet) 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) if (player)
player.SendPushToPartyResponse(_player, packet.Result); player.SendPushToPartyResponse(_player, packet.Result);
} }
_player.SetDivider(ObjectGuid.Empty); _player.ClearQuestSharingInfo();
} }
} }