Core/Gossip: Track started interaction types and reset only questgiver on quest accept
Port From (https://github.com/TrinityCore/TrinityCore/commit/c02e311eef9e635738b9e48559d5455ef016d8b4)
This commit is contained in:
@@ -207,24 +207,45 @@ namespace Game.Misc
|
||||
public class InteractionData
|
||||
{
|
||||
public ObjectGuid SourceGuid;
|
||||
public PlayerInteractionType InteractionType;
|
||||
public bool IsLaunchedByQuest;
|
||||
|
||||
ushort _playerChoiceResponseIdentifierGenerator = 0; // not reset between interactions
|
||||
uint trainerId;
|
||||
TrainerData trainerData;
|
||||
PlayerChoiceData playerChoiceData;
|
||||
|
||||
public void StartInteraction(ObjectGuid target, PlayerInteractionType type)
|
||||
{
|
||||
SourceGuid = target;
|
||||
InteractionType = type;
|
||||
IsLaunchedByQuest = false;
|
||||
switch (type)
|
||||
{
|
||||
case PlayerInteractionType.Trainer:
|
||||
trainerData = new();
|
||||
break;
|
||||
case PlayerInteractionType.PlayerChoice:
|
||||
playerChoiceData = new();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsInteractingWith(ObjectGuid target, PlayerInteractionType type) { return SourceGuid == target && InteractionType == type; }
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
SourceGuid.Clear();
|
||||
InteractionType = PlayerInteractionType.None;
|
||||
IsLaunchedByQuest = false;
|
||||
trainerId = 0;
|
||||
trainerData = null;
|
||||
playerChoiceData = null;
|
||||
}
|
||||
|
||||
public uint? GetTrainerId() { return trainerId; }
|
||||
public void SetTrainerId(uint _trainerId) { trainerId = _trainerId; }
|
||||
public TrainerData GetTrainer() { return trainerData; }
|
||||
|
||||
public PlayerChoiceData GetPlayerChoice() { return playerChoiceData; }
|
||||
public void SetPlayerChoice(uint choiceId) { playerChoiceData = new PlayerChoiceData(choiceId); }
|
||||
|
||||
public ushort AddPlayerChoiceResponse(uint responseId)
|
||||
{
|
||||
@@ -250,8 +271,7 @@ namespace Game.Misc
|
||||
|
||||
public void SendGossipMenu(uint titleTextId, ObjectGuid objectGUID)
|
||||
{
|
||||
_interactionData.Reset();
|
||||
_interactionData.SourceGuid = objectGUID;
|
||||
_interactionData.StartInteraction(objectGUID, PlayerInteractionType.Gossip);
|
||||
|
||||
GossipMessagePkt packet = new();
|
||||
packet.GossipGUID = objectGUID;
|
||||
@@ -362,6 +382,9 @@ namespace Game.Misc
|
||||
public void SendQuestGiverQuestListMessage(WorldObject questgiver)
|
||||
{
|
||||
ObjectGuid guid = questgiver.GetGUID();
|
||||
|
||||
GetInteractionData().StartInteraction(guid, PlayerInteractionType.QuestGiver);
|
||||
|
||||
Locale localeConstant = _session.GetSessionDbLocaleIndex();
|
||||
|
||||
QuestGiverQuestListMessage questList = new();
|
||||
@@ -429,6 +452,8 @@ namespace Game.Misc
|
||||
|
||||
public void SendQuestGiverQuestDetails(Quest quest, ObjectGuid npcGUID, bool autoLaunched, bool displayPopup)
|
||||
{
|
||||
GetInteractionData().StartInteraction(npcGUID, PlayerInteractionType.QuestGiver);
|
||||
|
||||
QuestGiverQuestDetails packet = new();
|
||||
|
||||
packet.QuestTitle = quest.LogTitle;
|
||||
@@ -532,6 +557,8 @@ namespace Game.Misc
|
||||
|
||||
public void SendQuestGiverOfferReward(Quest quest, ObjectGuid npcGUID, bool autoLaunched)
|
||||
{
|
||||
GetInteractionData().StartInteraction(npcGUID, PlayerInteractionType.QuestGiver);
|
||||
|
||||
QuestGiverOfferRewardMessage packet = new();
|
||||
|
||||
packet.QuestTitle = quest.LogTitle;
|
||||
@@ -616,6 +643,8 @@ namespace Game.Misc
|
||||
return;
|
||||
}
|
||||
|
||||
GetInteractionData().StartInteraction(npcGUID, PlayerInteractionType.QuestGiver);
|
||||
|
||||
QuestGiverRequestItems packet = new();
|
||||
|
||||
packet.QuestTitle = quest.LogTitle;
|
||||
@@ -852,17 +881,17 @@ namespace Game.Misc
|
||||
public ConditionsReference Conditions;
|
||||
}
|
||||
|
||||
public class TrainerData
|
||||
{
|
||||
public uint Id;
|
||||
}
|
||||
|
||||
public class PlayerChoiceData
|
||||
{
|
||||
uint _choiceId;
|
||||
List<Response> _responses = new();
|
||||
DateTime? _expireTime;
|
||||
|
||||
public PlayerChoiceData(uint choiceId)
|
||||
{
|
||||
_choiceId = choiceId;
|
||||
}
|
||||
|
||||
public uint? FindIdByClientIdentifier(ushort clientIdentifier)
|
||||
{
|
||||
var itr = _responses.Find(p => p.ClientIdentifier == clientIdentifier);
|
||||
|
||||
@@ -688,6 +688,18 @@ namespace Game.Entities
|
||||
|
||||
public void SendRespecWipeConfirm(ObjectGuid guid, uint cost, SpecResetType respecType)
|
||||
{
|
||||
switch (respecType)
|
||||
{
|
||||
case SpecResetType.Talents:
|
||||
PlayerTalkClass.GetInteractionData().StartInteraction(guid, PlayerInteractionType.TalentMaster);
|
||||
break;
|
||||
case SpecResetType.Specialization:
|
||||
PlayerTalkClass.GetInteractionData().StartInteraction(guid, PlayerInteractionType.SpecializationMaster);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
RespecWipeConfirm respecWipeConfirm = new();
|
||||
respecWipeConfirm.RespecMaster = guid;
|
||||
respecWipeConfirm.Cost = cost;
|
||||
|
||||
@@ -2787,6 +2787,7 @@ namespace Game.Entities
|
||||
|
||||
PlayerTalkClass.SendGossipMenu(textId, source.GetGUID());
|
||||
}
|
||||
|
||||
public void OnGossipSelect(WorldObject source, int gossipOptionId, uint menuId)
|
||||
{
|
||||
GossipMenu gossipMenu = PlayerTalkClass.GetGossipMenu();
|
||||
@@ -2882,7 +2883,10 @@ namespace Game.Entities
|
||||
case GossipOptionNpc.GuildBanker:
|
||||
Guild guild = GetGuild();
|
||||
if (guild != null)
|
||||
{
|
||||
PlayerTalkClass.GetInteractionData().StartInteraction(source.GetGUID(), PlayerInteractionType.GuildBanker);
|
||||
guild.SendBankList(GetSession(), 0, true);
|
||||
}
|
||||
else
|
||||
Guild.SendCommandResult(GetSession(), GuildCommandType.ViewTab, GuildCommandError.PlayerNotInGuild);
|
||||
break;
|
||||
@@ -2931,6 +2935,36 @@ namespace Game.Entities
|
||||
|
||||
if (!handled)
|
||||
{
|
||||
PlayerInteractionType[] GossipOptionNpcToInteractionType =
|
||||
[
|
||||
PlayerInteractionType.None, PlayerInteractionType.Vendor, PlayerInteractionType.TaxiNode,
|
||||
PlayerInteractionType.Trainer, PlayerInteractionType.SpiritHealer, PlayerInteractionType.Binder,
|
||||
PlayerInteractionType.Banker, PlayerInteractionType.PetitionVendor, PlayerInteractionType.GuildTabardVendor,
|
||||
PlayerInteractionType.BattleMaster, PlayerInteractionType.Auctioneer, PlayerInteractionType.TalentMaster,
|
||||
PlayerInteractionType.StableMaster, PlayerInteractionType.None, PlayerInteractionType.GuildBanker,
|
||||
PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.None,
|
||||
PlayerInteractionType.MailInfo, PlayerInteractionType.None, PlayerInteractionType.LFGDungeon,
|
||||
PlayerInteractionType.ArtifactForge, PlayerInteractionType.None, PlayerInteractionType.SpecializationMaster,
|
||||
PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.GarrArchitect,
|
||||
PlayerInteractionType.GarrMission, PlayerInteractionType.ShipmentCrafter, PlayerInteractionType.GarrTradeskill,
|
||||
PlayerInteractionType.GarrRecruitment, PlayerInteractionType.AdventureMap, PlayerInteractionType.GarrTalent,
|
||||
PlayerInteractionType.ContributionCollector, PlayerInteractionType.Transmogrifier, PlayerInteractionType.AzeriteRespec,
|
||||
PlayerInteractionType.IslandQueue, PlayerInteractionType.ItemInteraction, PlayerInteractionType.WorldMap,
|
||||
PlayerInteractionType.Soulbind, PlayerInteractionType.ChromieTime, PlayerInteractionType.CovenantPreview,
|
||||
PlayerInteractionType.LegendaryCrafting, PlayerInteractionType.NewPlayerGuide, PlayerInteractionType.LegendaryCrafting,
|
||||
PlayerInteractionType.Renown, PlayerInteractionType.BlackMarketAuctioneer, PlayerInteractionType.PerksProgramVendor,
|
||||
PlayerInteractionType.ProfessionsCraftingOrder, PlayerInteractionType.Professions, PlayerInteractionType.ProfessionsCustomerOrder,
|
||||
PlayerInteractionType.TraitSystem, PlayerInteractionType.BarbersChoice, PlayerInteractionType.MajorFactionRenown,
|
||||
PlayerInteractionType.PersonalTabardVendor, PlayerInteractionType.ForgeMaster, PlayerInteractionType.CharacterBanker,
|
||||
PlayerInteractionType.AccountBanker, PlayerInteractionType.ProfessionRespec, PlayerInteractionType.PlaceholderType72,
|
||||
PlayerInteractionType.PlaceholderType75, PlayerInteractionType.PlaceholderType76, PlayerInteractionType.GuildRename,
|
||||
PlayerInteractionType.PlaceholderType77, PlayerInteractionType.ItemUpgrade
|
||||
];
|
||||
|
||||
PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc];
|
||||
if (interactionType != PlayerInteractionType.None)
|
||||
PlayerTalkClass.GetInteractionData().StartInteraction(source.GetGUID(), interactionType);
|
||||
|
||||
if (item.GossipNpcOptionID.HasValue)
|
||||
{
|
||||
GossipMenuAddon addon = ObjectMgr.GetGossipMenuAddon(menuId);
|
||||
@@ -2945,33 +2979,6 @@ namespace Game.Entities
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerInteractionType[] GossipOptionNpcToInteractionType =
|
||||
{
|
||||
PlayerInteractionType.None, PlayerInteractionType.Vendor, PlayerInteractionType.TaxiNode,
|
||||
PlayerInteractionType.Trainer, PlayerInteractionType.SpiritHealer, PlayerInteractionType.Binder,
|
||||
PlayerInteractionType.Banker, PlayerInteractionType.PetitionVendor, PlayerInteractionType.GuildTabardVendor,
|
||||
PlayerInteractionType.BattleMaster, PlayerInteractionType.Auctioneer, PlayerInteractionType.TalentMaster,
|
||||
PlayerInteractionType.StableMaster, PlayerInteractionType.None, PlayerInteractionType.GuildBanker,
|
||||
PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.None,
|
||||
PlayerInteractionType.MailInfo, PlayerInteractionType.None, PlayerInteractionType.LFGDungeon,
|
||||
PlayerInteractionType.ArtifactForge, PlayerInteractionType.None, PlayerInteractionType.SpecializationMaster,
|
||||
PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.GarrArchitect,
|
||||
PlayerInteractionType.GarrMission, PlayerInteractionType.ShipmentCrafter, PlayerInteractionType.GarrTradeskill,
|
||||
PlayerInteractionType.GarrRecruitment, PlayerInteractionType.AdventureMap, PlayerInteractionType.GarrTalent,
|
||||
PlayerInteractionType.ContributionCollector, PlayerInteractionType.Transmogrifier, PlayerInteractionType.AzeriteRespec,
|
||||
PlayerInteractionType.IslandQueue, PlayerInteractionType.ItemInteraction, PlayerInteractionType.WorldMap,
|
||||
PlayerInteractionType.Soulbind, PlayerInteractionType.ChromieTime, PlayerInteractionType.CovenantPreview,
|
||||
PlayerInteractionType.LegendaryCrafting, PlayerInteractionType.NewPlayerGuide, PlayerInteractionType.LegendaryCrafting,
|
||||
PlayerInteractionType.Renown, PlayerInteractionType.BlackMarketAuctioneer, PlayerInteractionType.PerksProgramVendor,
|
||||
PlayerInteractionType.ProfessionsCraftingOrder, PlayerInteractionType.Professions, PlayerInteractionType.ProfessionsCustomerOrder,
|
||||
PlayerInteractionType.TraitSystem, PlayerInteractionType.BarbersChoice, PlayerInteractionType.MajorFactionRenown,
|
||||
PlayerInteractionType.PersonalTabardVendor, PlayerInteractionType.ForgeMaster, PlayerInteractionType.CharacterBanker,
|
||||
PlayerInteractionType.AccountBanker, PlayerInteractionType.ProfessionRespec,PlayerInteractionType.PlaceholderType72,
|
||||
PlayerInteractionType.PlaceholderType75, PlayerInteractionType.PlaceholderType76, PlayerInteractionType.GuildRename,
|
||||
PlayerInteractionType.PlaceholderType77, PlayerInteractionType.ItemUpgrade
|
||||
};
|
||||
|
||||
PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc];
|
||||
if (interactionType != PlayerInteractionType.None)
|
||||
{
|
||||
NPCInteractionOpenResult npcInteraction = new();
|
||||
@@ -4953,9 +4960,8 @@ namespace Game.Entities
|
||||
Locale locale = GetSession().GetSessionDbLocaleIndex();
|
||||
PlayerChoiceLocale playerChoiceLocale = locale != Locale.enUS ? ObjectMgr.GetPlayerChoiceLocale(choiceId) : null;
|
||||
|
||||
PlayerTalkClass.GetInteractionData().Reset();
|
||||
PlayerTalkClass.GetInteractionData().SourceGuid = sender;
|
||||
PlayerTalkClass.GetInteractionData().SetPlayerChoice((uint)choiceId);
|
||||
PlayerTalkClass.GetInteractionData().StartInteraction(sender, PlayerInteractionType.PlayerChoice);
|
||||
PlayerTalkClass.GetInteractionData().GetPlayerChoice().SetChoiceId((uint)choiceId);
|
||||
|
||||
DisplayPlayerChoice displayPlayerChoice = new();
|
||||
displayPlayerChoice.SenderGUID = sender;
|
||||
|
||||
Reference in New Issue
Block a user