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.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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -33,9 +33,11 @@ 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; }
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user