public static void ReadGossipOptionsData(uint menuId, Packet packet, params object[] idx) { GossipMenuOption gossipOption = new GossipMenuOption { MenuId = menuId }; GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox { MenuId = menuId }; gossipOption.OptionIndex = gossipMenuOptionBox.OptionIndex = (uint)packet.ReadInt32("ClientOption", idx); gossipOption.OptionIcon = (GossipOptionIcon?)packet.ReadByte("OptionNPC", idx); gossipMenuOptionBox.BoxCoded = packet.ReadByte("OptionFlags", idx) != 0; gossipMenuOptionBox.BoxMoney = (uint)packet.ReadInt32("OptionCost", idx); packet.ResetBitReader(); uint textLen = packet.ReadBits(12); uint confirmLen = packet.ReadBits(12); gossipOption.OptionText = packet.ReadWoWString("Text", textLen, idx); gossipMenuOptionBox.BoxText = packet.ReadWoWString("Confirm", confirmLen, idx); List <int> boxTextList; List <int> optionTextList; if (gossipMenuOptionBox.BoxText != string.Empty && SQLDatabase.BroadcastTexts.TryGetValue(gossipMenuOptionBox.BoxText, out boxTextList)) { if (boxTextList.Count == 1) { gossipMenuOptionBox.BoxBroadcastTextId = boxTextList[0]; } else { gossipMenuOptionBox.BroadcastTextIdHelper += "BoxBroadcastTextID: "; gossipMenuOptionBox.BroadcastTextIdHelper += string.Join(" - ", boxTextList); } } else { gossipMenuOptionBox.BoxBroadcastTextId = 0; } if (gossipOption.OptionText != string.Empty && SQLDatabase.BroadcastTexts.TryGetValue(gossipOption.OptionText, out optionTextList)) { if (optionTextList.Count == 1) { gossipOption.OptionBroadcastTextId = optionTextList[0]; } else { gossipOption.BroadcastTextIDHelper += "OptionBroadcastTextID: "; gossipOption.BroadcastTextIDHelper += string.Join(" - ", optionTextList); } } else { gossipOption.OptionBroadcastTextId = 0; } Storage.GossipMenuOptions.Add(gossipOption, packet.TimeSpan); if (!gossipMenuOptionBox.IsEmpty) { Storage.GossipMenuOptionBoxes.Add(gossipMenuOptionBox, packet.TimeSpan); } if (ClientLocale.PacketLocale != LocaleConstant.enUS && gossipOption.OptionText != string.Empty) { GossipMenuOptionLocale localesGossipMenuOption = new GossipMenuOptionLocale { MenuId = (uint)gossipOption.MenuId, OptionIndex = gossipOption.OptionIndex, OptionText = gossipOption.OptionText, BoxText = gossipMenuOptionBox.BoxText }; Storage.LocalesGossipMenuOption.Add(localesGossipMenuOption, packet.TimeSpan); } }
public static void HandleNpcGossip(Packet packet) { GossipMenu gossip = new GossipMenu(); WowGuid guid = packet.ReadGuid("GUID"); gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); uint menuId = packet.ReadUInt32("Menu Id"); gossip.Entry = menuId; if (ClientVersion.AddedInVersion(ClientType.MistsOfPandaria)) { packet.ReadUInt32("Friendship Faction"); } gossip.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); Storage.GossipMenuOptions.Add(gossipOption, packet.TimeSpan); if (!gossipMenuOptionBox.IsEmpty) { Storage.GossipMenuOptionBoxes.Add(gossipMenuOptionBox, packet.TimeSpan); } if (ClientLocale.PacketLocale != LocaleConstant.enUS && gossipOption.OptionText != string.Empty) { GossipMenuOptionLocale localesGossipMenuOption = new GossipMenuOptionLocale { MenuId = (uint)gossipOption.MenuId, OptionIndex = gossipOption.OptionIndex, OptionText = gossipOption.OptionText, BoxText = gossipMenuOptionBox.BoxText }; Storage.LocalesGossipMenuOption.Add(localesGossipMenuOption, packet.TimeSpan); } } 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.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = menuId; } } Storage.Gossips.Add(gossip, packet.TimeSpan); if (LastGossipOption.HasSelection) { Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction { MenuId = LastGossipOption.MenuId, OptionIndex = LastGossipOption.OptionIndex, ActionMenuId = menuId }, packet.TimeSpan); } packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }