public static GossipMessageOption ReadGossipOptionsData(uint menuId, WowGuid npcGuid, Packet packet, params object[] idx) { GossipMessageOption gossipMessageOption = new(); GossipMenuOption gossipOption = new GossipMenuOption { MenuID = menuId }; gossipOption.OptionID = gossipMessageOption.OptionIndex = (uint)packet.ReadInt32("OptionID", idx); gossipOption.OptionIcon = (GossipOptionIcon?)packet.ReadByte("OptionNPC", idx); gossipMessageOption.OptionIcon = (int)gossipOption.OptionIcon; gossipOption.BoxCoded = gossipMessageOption.BoxCoded = packet.ReadByte("OptionFlags", idx) != 0; gossipOption.BoxMoney = gossipMessageOption.BoxCost = (uint)packet.ReadInt32("OptionCost", idx); if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_2_0_42423)) { gossipOption.Language = packet.ReadUInt32E <Language>("Language", idx); } packet.ResetBitReader(); uint textLen = packet.ReadBits(12); uint confirmLen = packet.ReadBits(12); bool hasSpellId = false; if (ClientVersion.AddedInVersion(ClientType.Shadowlands)) { packet.ReadBits("Status", 2, idx); if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_0_2_36639)) { hasSpellId = packet.ReadBit(); } uint rewardsCount = packet.ReadUInt32(); for (uint i = 0; i < rewardsCount; ++i) { packet.ResetBitReader(); packet.ReadBits("Type", 1, idx, "TreasureItem", i); packet.ReadInt32("ID", idx, "TreasureItem", i); packet.ReadInt32("Quantity", idx, "TreasureItem", i); } } gossipOption.OptionText = gossipMessageOption.Text = packet.ReadWoWString("Text", textLen, idx); gossipMessageOption.BoxText = packet.ReadWoWString("Confirm", confirmLen, idx); if (!string.IsNullOrEmpty(gossipMessageOption.BoxText)) { gossipOption.BoxText = gossipMessageOption.BoxText; } if (hasSpellId) { packet.ReadInt32("SpellID", idx); } gossipOption.FillBroadcastTextIDs(); gossipOption.FillOptionType(npcGuid); Storage.GossipMenuOptions.Add((gossipOption.MenuID, gossipOption.OptionID), gossipOption, packet.TimeSpan); return(gossipMessageOption); }
public static GossipMessageOption ReadGossipOptionsData(uint menuId, WowGuid npcGuid, Packet packet, params object[] idx) { GossipMessageOption gossipMessageOption = new(); GossipMenuOption gossipOption = new GossipMenuOption { MenuId = menuId }; GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox { MenuId = menuId }; gossipOption.OptionIndex = gossipMenuOptionBox.OptionIndex = gossipMessageOption.OptionIndex = (uint)packet.ReadInt32("ClientOption", idx); gossipOption.OptionIcon = (GossipOptionIcon?)packet.ReadByte("OptionNPC", idx); gossipMessageOption.OptionIcon = (int)gossipOption.OptionIcon; gossipMenuOptionBox.BoxCoded = gossipMessageOption.BoxCoded = packet.ReadByte("OptionFlags", idx) != 0; gossipMenuOptionBox.BoxMoney = gossipMessageOption.BoxCost = (uint)packet.ReadInt32("OptionCost", idx); packet.ResetBitReader(); uint textLen = packet.ReadBits(12); uint confirmLen = packet.ReadBits(12); bool hasSpellId = false; if (ClientVersion.AddedInVersion(ClientType.Shadowlands)) { packet.ReadBits("Status", 2, idx); if (ClientVersion.AddedInVersion(ClientVersionBuild.V9_0_2_36639)) { hasSpellId = packet.ReadBit(); } uint rewardsCount = packet.ReadUInt32(); for (uint i = 0; i < rewardsCount; ++i) { packet.ResetBitReader(); packet.ReadBits("Type", 1, idx, "TreasureItem", i); packet.ReadInt32("ID", idx, "TreasureItem", i); packet.ReadInt32("Quantity", idx, "TreasureItem", i); } } gossipOption.OptionText = gossipMessageOption.Text = packet.ReadWoWString("Text", textLen, idx); gossipMenuOptionBox.BoxText = gossipMessageOption.BoxText = packet.ReadWoWString("Confirm", confirmLen, idx); if (hasSpellId) { packet.ReadInt32("SpellID", idx); } List <int> boxTextList; List <int> optionTextList; if (gossipMenuOptionBox.BoxText != string.Empty && SQLDatabase.BroadcastTexts.TryGetValue(gossipMenuOptionBox.BoxText, out boxTextList)) { gossipMenuOptionBox.BoxBroadcastTextId = boxTextList[0]; if (boxTextList.Count != 1) { gossipMenuOptionBox.BroadcastTextIdHelper += "BoxBroadcastTextID: "; gossipMenuOptionBox.BroadcastTextIdHelper += string.Join(" - ", boxTextList); } } else { gossipMenuOptionBox.BoxBroadcastTextId = 0; } if (gossipOption.OptionText != string.Empty && SQLDatabase.BroadcastTexts.TryGetValue(gossipOption.OptionText, out optionTextList)) { gossipOption.OptionBroadcastTextId = optionTextList[0]; if (optionTextList.Count != 1) { gossipOption.BroadcastTextIDHelper += "OptionBroadcastTextID: "; gossipOption.BroadcastTextIDHelper += string.Join(" - ", optionTextList); } } else { gossipOption.OptionBroadcastTextId = 0; } gossipOption.FillOptionType(npcGuid); Storage.GossipMenuOptions.Add(gossipOption, packet.TimeSpan); if (!gossipMenuOptionBox.IsEmpty) { Storage.GossipMenuOptionBoxes.Add(gossipMenuOptionBox, packet.TimeSpan); } return(gossipMessageOption); }
public static void HandleNpcGossip(Packet packet) { PacketGossipMessage packetGossip = packet.Holder.GossipMessage = new(); GossipMenu gossip = new GossipMenu(); WowGuid guid = packet.ReadGuid("GUID"); packetGossip.GossipSource = guid; gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); uint menuId = packet.ReadUInt32("Menu Id"); gossip.Entry = packetGossip.MenuId = menuId; if (ClientVersion.AddedInVersion(ClientType.MistsOfPandaria)) { packet.ReadUInt32("Friendship Faction"); } gossip.TextID = packetGossip.TextId = packet.ReadUInt32("Text Id"); uint count = packet.ReadUInt32("Amount of Options"); for (int i = 0; i < count; i++) { GossipMenuOption gossipOption = new GossipMenuOption { MenuId = menuId, }; GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox { MenuId = menuId }; gossipOption.OptionIndex = gossipMenuOptionBox.OptionIndex = packet.ReadUInt32("Index", i); gossipOption.OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i); gossipMenuOptionBox.BoxCoded = packet.ReadBool("Box", i); gossipMenuOptionBox.BoxMoney = packet.ReadUInt32("Required money", i); gossipOption.OptionText = packet.ReadCString("Text", i); gossipMenuOptionBox.BoxText = packet.ReadCString("Box Text", i); gossipOption.FillOptionType(guid); Storage.GossipMenuOptions.Add(gossipOption, packet.TimeSpan); if (!gossipMenuOptionBox.IsEmpty) { Storage.GossipMenuOptionBoxes.Add(gossipMenuOptionBox, packet.TimeSpan); } packetGossip.Options.Add(new GossipMessageOption() { OptionIndex = gossipOption.OptionIndex.Value, OptionIcon = (int)gossipOption.OptionIcon, BoxCoded = gossipMenuOptionBox.BoxCoded.Value, BoxCost = gossipMenuOptionBox.BoxMoney.Value, Text = gossipOption.OptionText, BoxText = gossipMenuOptionBox.BoxText }); } uint questgossips = packet.ReadUInt32("Amount of Quest gossips"); for (int i = 0; i < questgossips; i++) { packet.ReadUInt32 <QuestId>("Quest ID", i); packet.ReadUInt32("Icon", i); packet.ReadInt32("Level", i); packet.ReadUInt32E <QuestFlags>("Flags", i); if (ClientVersion.AddedInVersion(ClientVersionBuild.V5_1_0_16309)) { packet.ReadUInt32E <QuestFlagsEx>("Flags 2", i); } packet.ReadBool("Change Icon", i); packet.ReadCString("Title", i); } if (guid.GetObjectType() == ObjectType.Unit) { if (!Storage.CreatureDefaultGossips.ContainsKey(guid.GetEntry())) { Storage.CreatureDefaultGossips.Add(guid.GetEntry(), menuId); } } Storage.Gossips.Add(gossip, packet.TimeSpan); if (LastGossipOption.HasSelection) { if ((packet.TimeSpan - LastGossipOption.TimeSpan).Duration() <= TimeSpan.FromMilliseconds(2500)) { Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction { MenuId = LastGossipOption.MenuId, OptionIndex = LastGossipOption.OptionIndex, ActionMenuId = menuId, ActionPoiId = LastGossipOption.ActionPoiId ?? 0 }, packet.TimeSpan); //keep temp data (for case SMSG_GOSSIP_POI is delayed) TempGossipOptionPOI.Guid = LastGossipOption.Guid; TempGossipOptionPOI.MenuId = LastGossipOption.MenuId; TempGossipOptionPOI.OptionIndex = LastGossipOption.OptionIndex; TempGossipOptionPOI.ActionMenuId = gossip.Entry; TempGossipOptionPOI.TimeSpan = LastGossipOption.TimeSpan; // clear lastgossip so no faulty linkings appear LastGossipOption.Reset(); } else { LastGossipOption.Reset(); TempGossipOptionPOI.Reset(); } } packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }