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:
@@ -429,7 +429,7 @@ namespace Game.Misc
|
||||
}
|
||||
|
||||
packet.QuestGiverGUID = npcGUID;
|
||||
packet.InformUnit = _session.GetPlayer().GetDivider();
|
||||
packet.InformUnit = _session.GetPlayer().GetPlayerSharingQuest();
|
||||
packet.QuestID = quest.Id;
|
||||
packet.PortraitGiver = quest.QuestGiverPortrait;
|
||||
packet.PortraitGiverMount = quest.QuestGiverPortraitMount;
|
||||
|
||||
@@ -252,7 +252,8 @@ namespace Game.Entities
|
||||
uint m_PlayedTimeLevel;
|
||||
|
||||
Dictionary<byte, ActionButton> m_actionButtons = new Dictionary<byte, ActionButton>();
|
||||
ObjectGuid m_divider;
|
||||
ObjectGuid m_playerSharingQuest;
|
||||
uint m_sharedQuestId;
|
||||
uint m_ingametime;
|
||||
|
||||
PlayerCommandStates _activeCheats;
|
||||
|
||||
@@ -33,9 +33,11 @@ namespace Game.Entities
|
||||
{
|
||||
public partial class Player
|
||||
{
|
||||
public ObjectGuid GetDivider() { return m_divider; }
|
||||
public void SetDivider(ObjectGuid guid) { m_divider = guid; }
|
||||
|
||||
public uint GetSharedQuestID() { return m_sharedQuestId; }
|
||||
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; }
|
||||
public void SetInGameTime(uint time) { m_ingametime = time; }
|
||||
|
||||
|
||||
@@ -5806,6 +5806,15 @@ namespace Game.Entities
|
||||
_garrison.SendRemoteInfo();
|
||||
|
||||
UpdateItemLevelAreaBasedScaling();
|
||||
|
||||
if (!GetPlayerSharingQuest().IsEmpty())
|
||||
{
|
||||
Quest quest = Global.ObjectMgr.GetQuestTemplate(GetSharedQuestID());
|
||||
if (quest != null)
|
||||
PlayerTalkClass.SendQuestGiverQuestDetails(quest, GetGUID(), true, false);
|
||||
else
|
||||
ClearQuestSharingInfo();
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveSocial()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user