/// <summary>Initialize the GO</summary> /// <param name="entry"></param> /// <param name="templ"></param> internal virtual void Init(GOEntry entry, GOSpawnEntry spawnEntry, GOSpawnPoint spawnPoint) { EntityId = EntityId.GetGameObjectId((uint)Interlocked.Increment(ref _lastGOUID), entry.GOId); Type |= ObjectTypes.GameObject; m_entry = entry; m_spawnPoint = spawnPoint; GoId = entry.GOId; DisplayId = entry.DisplayId; EntryId = entry.Id; GOType = entry.Type; Flags = m_entry.Flags; m_faction = m_entry.Faction ?? Faction.NullFaction; ScaleX = m_entry.Scale; GossipMenu = entry.DefaultGossip; if (QuestHolderInfo != null && GossipMenu == null) { GossipMenu = new GossipMenu(); } spawnEntry = spawnEntry ?? entry.FirstSpawnEntry; if (spawnEntry != null) { Phase = spawnEntry.Phase; State = spawnEntry.State; if (spawnEntry.Scale != 1.0) { ScaleX = spawnEntry.Scale; } Orientation = spawnEntry.Orientation; AnimationProgress = spawnEntry.AnimProgress; SetRotationFields(spawnEntry.Rotations); } m_entry.InitGO(this); }
public static void ShowMenu(this CmdTrigger <RealmServerCmdArgs> trigger, GossipMenu menu) { var chr = trigger.Args.Character; if (chr != null) { chr.StartGossip(menu); } }
public static void ShowMenu(this CmdTrigger <RealmServerCmdArgs> trigger, GossipMenu menu) { Character character = trigger.Args.Character; if (character == null) { return; } character.StartGossip(menu); }
public static void HandleNpcGossip(Packet packet) { GossipMenu gossip = new GossipMenu(); WowGuid guid = packet.ReadPackedGuid128("GossipGUID"); gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); int menuId = packet.ReadInt32("GossipID"); gossip.Entry = (uint)menuId; packet.ReadInt32("FriendshipFactionID"); gossip.TextID = (uint)packet.ReadInt32("TextID"); int int44 = packet.ReadInt32("GossipOptions"); int int60 = packet.ReadInt32("GossipText"); for (int i = 0; i < int44; ++i) { V6_0_2_19033.Parsers.NpcHandler.ReadGossipOptionsData((uint)menuId, packet, i, "GossipOptions"); } for (int i = 0; i < int60; ++i) { ReadGossipQuestTextData(packet, i, "GossipQuestText"); } if (guid.GetObjectType() == ObjectType.Unit) { if (Storage.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = (uint)menuId; } } Storage.Gossips.Add(gossip, packet.TimeSpan); var lastGossipOption = CoreParsers.NpcHandler.LastGossipOption; if (lastGossipOption.HasSelection) { Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction { MenuId = lastGossipOption.MenuId, OptionIndex = lastGossipOption.OptionIndex, ActionMenuId = gossip.Entry }, packet.TimeSpan); } packet.AddSniffData(StoreNameType.Gossip, menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static GossipMenu CreateTeleMenu(List <INamedWorldZoneLocation> locations, Action <GossipConversation, INamedWorldZoneLocation> callback) { GossipMenu gossipMenu = new GossipMenu(); foreach (INamedWorldZoneLocation location in locations) { INamedWorldZoneLocation loc = location; gossipMenu.AddItem((GossipMenuItemBase) new GossipMenuItem(loc.Names.LocalizeWithDefaultLocale(), (GossipActionHandler)(convo => callback(convo, loc)))); } return(gossipMenu); }
public virtual void FinalizeDataHolder() { if (Id != 0U) { GOId = (GOEntryId)Id; } else { Id = (uint)GOId; } if (FactionId != FactionTemplateId.None) { Faction = FactionMgr.Get(FactionId); } InitEntry(); if (GossipId != 0U && DefaultGossip == null) { if (GossipMgr.GetEntry(GossipId) == null) { ContentMgr.OnInvalidDBData("GOEntry {0} has missing GossipId: {1}", (object)this, (object)GossipId); DefaultGossip = new GossipMenu(); } else { DefaultGossip = new GossipMenu(GossipId); } } else if (QuestHolderInfo != null) { DefaultGossip = new GossipMenu(); } if (HandlerCreator == null) { HandlerCreator = GOMgr.Handlers[(int)Type]; } if (GOCreator == null) { GOCreator = !IsTransport ? () => new GameObject() : (Func <GameObject>)(() => (GameObject) new Transport()); } if (Fields == null) { return; } GOMgr.Entries[Id] = this; }
public static void HandleNpcGossip(Packet packet) { PacketGossipMessage packetGossip = packet.Holder.GossipMessage = new(); GossipMenu gossip = new GossipMenu(); WowGuid guid = packet.ReadPackedGuid128("GossipGUID"); packetGossip.GossipSource = guid; gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); int menuId = packet.ReadInt32("GossipID"); gossip.MenuID = packetGossip.MenuId = (uint)menuId; packet.ReadInt32("FriendshipFactionID"); gossip.TextID = packetGossip.TextId = (uint)packet.ReadInt32("TextID"); int optionsCount = packet.ReadInt32("GossipOptionsCount"); int questsCount = packet.ReadInt32("GossipQuestsCount"); for (int i = 0; i < optionsCount; ++i) { packetGossip.Options.Add(ReadGossipOptionsData((uint)menuId, guid, packet, i, "GossipOptions")); } for (int i = 0; i < questsCount; ++i) { packetGossip.Quests.Add(ReadGossipQuestTextData(packet, i, "GossipQuests")); } if (guid.GetObjectType() == ObjectType.Unit) { if (!Storage.CreatureDefaultGossips.ContainsKey(guid.GetEntry())) { Storage.CreatureDefaultGossips.Add(guid.GetEntry(), (uint)menuId); } } Storage.Gossips.Add(gossip, packet.TimeSpan); CoreParsers.NpcHandler.UpdateLastGossipOptionActionMessage(packet.TimeSpan, gossip.MenuID); packet.AddSniffData(StoreNameType.Gossip, menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static GossipMenu CreateTeleMenu(List <INamedWorldZoneLocation> locations, Action <GossipConversation, INamedWorldZoneLocation> callback) { // create gossip of all options var menu = new GossipMenu(); foreach (var location in locations) { var loc = location; // create local reference // TODO: Localize names menu.AddItem(new GossipMenuItem(loc.Names.LocalizeWithDefaultLocale(), convo => { callback(convo, loc); })); } return(menu); }
/// <summary> /// Handles gossip hello packet (client requests Gossip Menu) /// </summary> /// <param name="client">realm client</param> /// <param name="packet">packet incoming</param> public static void HandleGossipHello(IRealmClient client, RealmPacketIn packet) { EntityId id = packet.ReadEntityId(); Character activeCharacter = client.ActiveCharacter; Unit unit = activeCharacter.Map.GetObject(id) as Unit; if (unit == null) { return; } activeCharacter.GossipConversation = null; GossipMenu gossipMenu = unit.GossipMenu; if (gossipMenu == null || unit is NPC && !((NPC)unit).CheckVendorInteraction(activeCharacter) && !activeCharacter.Role.IsStaff) { return; } activeCharacter.OnInteract(unit); activeCharacter.StartGossip(gossipMenu, unit); }
/// <summary> /// Initialize the GO /// </summary> /// <param name="entry"></param> /// <param name="templ"></param> internal virtual void Init(GOEntry entry, GOSpawnEntry spawnEntry, GOSpawnPoint spawnPoint) { EntityId = EntityId.GetGameObjectId((uint)Interlocked.Increment(ref _lastGOUID), entry.GOId); Type |= ObjectTypes.GameObject; //DynamicFlagsLow = GameObjectDynamicFlagsLow.Activated; m_entry = entry; m_spawnPoint = spawnPoint; DisplayId = entry.DisplayId; EntryId = entry.Id; GOType = entry.Type; Flags = m_entry.Flags; m_faction = m_entry.Faction ?? Faction.NullFaction; ScaleX = m_entry.Scale; GossipMenu = entry.DefaultGossip; if (QuestHolderInfo != null && GossipMenu == null) { // make sure, there is a GossipMenu that allows the player to start/finish quests GossipMenu = new GossipMenu(); } spawnEntry = spawnEntry ?? entry.FirstSpawnEntry; if (spawnEntry != null) { Phase = spawnEntry.Phase; State = spawnEntry.State; if (spawnEntry.Scale != 1) { ScaleX = spawnEntry.Scale; } Orientation = spawnEntry.Orientation; AnimationProgress = spawnEntry.AnimProgress; SetRotationFields(spawnEntry.Rotations); } m_entry.InitGO(this); }
public static void HandleNpcGossip(Packet packet) { GossipMenu gossip = new GossipMenu(); WowGuid guid = packet.ReadPackedGuid128("GossipGUID"); gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); int menuId = packet.ReadInt32("GossipID"); gossip.Entry = (uint)menuId; packet.ReadInt32("FriendshipFactionID"); gossip.TextID = (uint)packet.ReadInt32("TextID"); int int44 = packet.ReadInt32("GossipOptions"); int int60 = packet.ReadInt32("GossipText"); // ClientGossipOptions for (int i = 0; i < int44; ++i) { GossipMenuOption gossipOption = new GossipMenuOption { MenuID = (uint)menuId }; gossipOption.ID = (uint)packet.ReadInt32("ClientOption", i); gossipOption.OptionIcon = (GossipOptionIcon?)packet.ReadByte("OptionNPC", i); gossipOption.BoxCoded = packet.ReadByte("OptionFlags", i) != 0; gossipOption.BoxMoney = (uint)packet.ReadInt32("OptionCost", i); uint bits3 = packet.ReadBits(12); uint bits753 = packet.ReadBits(12); gossipOption.OptionText = packet.ReadWoWString("Text", bits3, i); gossipOption.BoxText = packet.ReadWoWString("Confirm", bits753, i); Storage.GossipMenuOptions.Add(gossipOption, packet.TimeSpan); } // ClientGossipOptions for (int i = 0; i < int60; ++i) { packet.ReadInt32("QuestID", i); packet.ReadInt32("QuestType", i); packet.ReadInt32("QuestLevel", i); for (int j = 0; j < 2; ++j) { packet.ReadInt32("QuestFlags", i, j); } packet.ResetBitReader(); packet.ReadBit("Repeatable"); uint bits13 = packet.ReadBits(9); packet.ReadWoWString("QuestTitle", bits13, i); } if (guid.GetObjectType() == ObjectType.Unit) { if (Storage.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = (uint)menuId; } } Storage.Gossips.Add(gossip, packet.TimeSpan); packet.AddSniffData(StoreNameType.Gossip, menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
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); 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.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = 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 }, 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)); }
public virtual void FinalizeDataHolder() { if (Id != 0) { GOId = (GOEntryId)Id; } else { Id = (uint)GOId; } if (FactionId != 0) { Faction = FactionMgr.Get(FactionId); } InitEntry(); // create GossipMenu if (GossipId != 0 && DefaultGossip == null) { var gossipEntry = GossipMgr.GetEntry(GossipId); if (gossipEntry == null) { ContentMgr.OnInvalidDBData("GOEntry {0} has missing GossipId: {1}", this, GossipId); DefaultGossip = new GossipMenu(); } else { DefaultGossip = new GossipMenu(GossipId); } } else if (QuestHolderInfo != null) { // Make sure, there is a gossip menu, so quests can be started/completed DefaultGossip = new GossipMenu(); } // set HandlerCreator if (HandlerCreator == null) { HandlerCreator = GOMgr.Handlers[(int)Type]; } if (GOCreator == null) { if (IsTransport) { GOCreator = () => new Transport(); } else { GOCreator = () => new GameObject(); } } if (Fields != null) // ignore invalid ones { //Fields = null; GOMgr.Entries[Id] = this; } }
public static void HandleNpcGossip(Packet packet) { var guidBytes = new byte[8]; uint menuId = packet.ReadUInt32("Menu Id"); packet.ReadUInt32("Friendship Faction"); uint textId = packet.ReadUInt32("Text Id"); packet.StartBitStream(guidBytes, 0, 1); uint amountOfOptions = packet.ReadBits("Amount of Options", 20); packet.StartBitStream(guidBytes, 6, 7); var optionTextLen = new uint[amountOfOptions]; var boxTextLen = new uint[amountOfOptions]; for (int i = 0; i < amountOfOptions; ++i) { optionTextLen[i] = packet.ReadBits(12); boxTextLen[i] = packet.ReadBits(12); } packet.StartBitStream(guidBytes, 4, 3, 2); uint questgossips = packet.ReadBits("Amount of Quest gossips", 19); var titleLen = new uint[questgossips]; for (int i = 0; i < questgossips; ++i) { titleLen[i] = packet.ReadBits(9); packet.ReadBit("Change Icon", i); } guidBytes[5] = packet.ReadBit(); packet.ResetBitReader(); for (int i = 0; i < questgossips; i++) { packet.ReadUInt32E <QuestFlagsEx>("Flags 2", i); packet.ReadUInt32("Icon", i); packet.ReadWoWString("Title", titleLen[i], i); packet.ReadUInt32E <QuestFlags>("Flags", i); packet.ReadInt32("Level", i); packet.ReadUInt32 <QuestId>("Quest ID", i); } for (int i = 0; i < amountOfOptions; ++i) { GossipMenuOption gossipOption = new GossipMenuOption { MenuId = menuId }; GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox { MenuId = menuId }; gossipMenuOptionBox.BoxMoney = packet.ReadUInt32("Required money", i); gossipOption.OptionIndex = gossipMenuOptionBox.OptionIndex = packet.ReadUInt32("Index", i); gossipMenuOptionBox.BoxText = packet.ReadWoWString("Box Text", boxTextLen[i], i); gossipMenuOptionBox.BoxCoded = packet.ReadBool("Box", i); gossipOption.OptionText = packet.ReadWoWString("Text", optionTextLen[i], i); gossipOption.OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i); Storage.GossipMenuOptions.Add(gossipOption, packet.TimeSpan); if (!gossipMenuOptionBox.IsEmpty) { Storage.GossipMenuOptionBoxes.Add(gossipMenuOptionBox, packet.TimeSpan); } } packet.ParseBitStream(guidBytes, 3, 4, 7, 2, 1, 6, 0, 5); GossipMenu gossip = new GossipMenu { Entry = menuId, TextID = textId }; WowGuid guid = packet.WriteGuid("GUID", guidBytes); gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); if (guid.GetObjectType() == ObjectType.Unit) { if (Storage.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = menuId; } } Storage.Gossips.Add(gossip, packet.TimeSpan); var lastGossipOption = CoreParsers.NpcHandler.LastGossipOption; if (lastGossipOption.HasSelection) { Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction { MenuId = lastGossipOption.MenuId, OptionIndex = lastGossipOption.OptionIndex, ActionMenuId = gossip.Entry }, packet.TimeSpan); } packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static void HandleNpcGossip(Packet packet) { PacketGossipMessage packetGossip = packet.Holder.GossipMessage = new(); var guidBytes = new byte[8]; guidBytes[7] = packet.ReadBit(); guidBytes[6] = packet.ReadBit(); guidBytes[1] = packet.ReadBit(); uint questgossips = packet.ReadBits(19); guidBytes[0] = packet.ReadBit(); guidBytes[4] = packet.ReadBit(); guidBytes[5] = packet.ReadBit(); guidBytes[2] = packet.ReadBit(); guidBytes[3] = packet.ReadBit(); uint amountOfOptions = packet.ReadBits(20); var boxTextLen = new uint[amountOfOptions]; var optionTextLen = new uint[amountOfOptions]; for (int i = 0; i < amountOfOptions; ++i) { boxTextLen[i] = packet.ReadBits(12); optionTextLen[i] = packet.ReadBits(12); } var titleLen = new uint[questgossips]; for (int i = 0; i < questgossips; ++i) { packet.ReadBit("Change Icon", i); titleLen[i] = packet.ReadBits(9); } for (var i = 0; i < questgossips; ++i) { packet.ReadUInt32E <QuestFlagsEx>("Flags 2", i); var quest = packet.ReadUInt32 <QuestId>("Quest ID", i); packet.ReadInt32("Level", i); packet.ReadUInt32("Icon", i); packet.ReadUInt32E <QuestFlags>("Flags", i); var title = packet.ReadWoWString("Title", titleLen[i], i); packetGossip.Quests.Add(new GossipQuestOption() { Title = title, QuestId = quest }); } packet.ReadXORByte(guidBytes, 6); var gossipOptions = new List <GossipMenuOption>((int)amountOfOptions); for (int i = 0; i < amountOfOptions; ++i) { GossipMenuOption gossipMenuOption = new GossipMenuOption(); gossipMenuOption.BoxMoney = packet.ReadUInt32("Required money", i); gossipMenuOption.OptionText = packet.ReadWoWString("Text", optionTextLen[i], i); gossipMenuOption.OptionID = packet.ReadUInt32("OptionID", i); gossipMenuOption.OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i); var boxText = packet.ReadWoWString("Box Text", boxTextLen[i], i); gossipMenuOption.BoxCoded = packet.ReadBool("Box", i); if (!string.IsNullOrEmpty(boxText)) { gossipMenuOption.BoxText = boxText; } gossipOptions.Add(gossipMenuOption); packetGossip.Options.Add(new GossipMessageOption() { OptionIndex = gossipMenuOption.OptionID.Value, OptionIcon = (int)gossipMenuOption.OptionIcon, BoxCoded = gossipMenuOption.BoxCoded.Value, BoxCost = gossipMenuOption.BoxMoney.Value, Text = gossipMenuOption.OptionText, BoxText = gossipMenuOption.BoxText }); } packet.ReadXORByte(guidBytes, 2); uint textId = packetGossip.TextId = packet.ReadUInt32("Text Id"); packet.ReadXORByte(guidBytes, 1); packet.ReadXORByte(guidBytes, 5); uint menuId = packetGossip.MenuId = packet.ReadUInt32("Menu Id"); packet.ReadUInt32("Friendship Faction"); packet.ReadXORByte(guidBytes, 4); packet.ReadXORByte(guidBytes, 7); packet.ReadXORByte(guidBytes, 3); packet.ReadXORByte(guidBytes, 0); var guid = packet.WriteGuid("Guid", guidBytes); packetGossip.GossipSource = guid; GossipMenu gossip = new GossipMenu { MenuID = menuId, TextID = textId }; gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); if (guid.GetObjectType() == ObjectType.Unit) { if (!Storage.CreatureDefaultGossips.ContainsKey(guid.GetEntry())) { Storage.CreatureDefaultGossips.Add(guid.GetEntry(), menuId); } } gossipOptions.ForEach(g => { g.MenuID = menuId; g.FillBroadcastTextIDs(); g.FillOptionType(guid); Storage.GossipMenuOptions.Add((g.MenuID, g.OptionID), g, packet.TimeSpan); }); Storage.Gossips.Add(gossip, packet.TimeSpan); CoreParsers.NpcHandler.UpdateLastGossipOptionActionMessage(packet.TimeSpan, gossip.MenuID); packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static void HandleNpcGossip(Packet packet) { PacketGossipMessage packetGossip = packet.Holder.GossipMessage = new(); var guidBytes = new byte[8]; packet.StartBitStream(guidBytes, 0, 1); uint questgossips = packet.ReadBits("Amount of Quest gossips", 19); guidBytes[2] = packet.ReadBit(); uint amountOfOptions = packet.ReadBits("Amount of Options", 20); var titleLen = new uint[questgossips]; for (int i = 0; i < questgossips; ++i) { packet.ReadBit("Change Icon", i); titleLen[i] = packet.ReadBits(9); } guidBytes[3] = packet.ReadBit(); var optionTextLen = new uint[amountOfOptions]; var boxTextLen = new uint[amountOfOptions]; for (int i = 0; i < amountOfOptions; ++i) { boxTextLen[i] = packet.ReadBits(12); optionTextLen[i] = packet.ReadBits(12); } packet.StartBitStream(guidBytes, 5, 4, 6, 7); packet.ResetBitReader(); packet.ReadXORByte(guidBytes, 6); var gossipOptions = new List <GossipMenuOption>((int)amountOfOptions); var gossipOptionBoxes = new List <GossipMenuOptionBox>((int)amountOfOptions); for (int i = 0; i < amountOfOptions; ++i) { GossipMenuOption gossipOption = new GossipMenuOption(); GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox(); gossipOption.OptionText = packet.ReadWoWString("Text", optionTextLen[i], i); gossipMenuOptionBox.BoxText = packet.ReadWoWString("Box Text", boxTextLen[i], i); gossipMenuOptionBox.BoxMoney = packet.ReadUInt32("Required money", i); gossipOption.OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i); gossipMenuOptionBox.BoxCoded = packet.ReadBool("Box", i); gossipOption.OptionIndex = gossipMenuOptionBox.OptionIndex = packet.ReadUInt32("Index", i); gossipOptions.Add(gossipOption); if (!gossipMenuOptionBox.IsEmpty) { gossipOptionBoxes.Add(gossipMenuOptionBox); } 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 }); } packet.ReadXORByte(guidBytes, 0); for (int i = 0; i < questgossips; i++) { packet.ReadUInt32E <QuestFlags>("Flags", i); var title = packet.ReadWoWString("Title", titleLen[i], i); packet.ReadUInt32("Icon", i); packet.ReadUInt32E <QuestFlagsEx>("Flags 2", i); packet.ReadInt32("Level", i); var quest = packet.ReadUInt32 <QuestId>("Quest ID", i); packetGossip.Quests.Add(new GossipQuestOption() { Title = title, QuestId = quest }); } uint textId = packetGossip.TextId = packet.ReadUInt32("Text Id"); packet.ReadXORBytes(guidBytes, 4, 3); uint menuId = packetGossip.MenuId = packet.ReadUInt32("Menu Id"); packet.ReadUInt32("Friendship Faction"); packet.ReadXORBytes(guidBytes, 7, 1, 5, 2); GossipMenu gossip = new GossipMenu { Entry = menuId, TextID = textId }; WowGuid guid = packet.WriteGuid("GUID", guidBytes); packetGossip.GossipSource = guid; gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); if (guid.GetObjectType() == ObjectType.Unit) { if (Storage.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = menuId; } } gossipOptions.ForEach(g => { g.MenuId = menuId; Storage.GossipMenuOptions.Add(g, packet.TimeSpan); }); gossipOptionBoxes.ForEach(gb => { gb.MenuId = menuId; Storage.GossipMenuOptionBoxes.Add(gb, packet.TimeSpan); }); Storage.Gossips.Add(gossip, packet.TimeSpan); var lastGossipOption = CoreParsers.NpcHandler.LastGossipOption; var tempGossipOptionPOI = CoreParsers.NpcHandler.TempGossipOptionPOI; 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 }, 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)); }
public static void HandleNpcGossip(Packet packet) { PacketGossipMessage packetGossip = packet.Holder.GossipMessage = new(); var guidBytes = new byte[8]; guidBytes[7] = packet.ReadBit(); guidBytes[6] = packet.ReadBit(); guidBytes[1] = packet.ReadBit(); uint questgossips = packet.ReadBits(19); guidBytes[0] = packet.ReadBit(); guidBytes[4] = packet.ReadBit(); guidBytes[5] = packet.ReadBit(); guidBytes[2] = packet.ReadBit(); guidBytes[3] = packet.ReadBit(); uint amountOfOptions = packet.ReadBits(20); var boxTextLen = new uint[amountOfOptions]; var optionTextLen = new uint[amountOfOptions]; for (int i = 0; i < amountOfOptions; ++i) { boxTextLen[i] = packet.ReadBits(12); optionTextLen[i] = packet.ReadBits(12); } var titleLen = new uint[questgossips]; for (int i = 0; i < questgossips; ++i) { packet.ReadBit("Change Icon", i); titleLen[i] = packet.ReadBits(9); } for (var i = 0; i < questgossips; ++i) { packet.ReadUInt32E <QuestFlagsEx>("Flags 2", i); var quest = packet.ReadUInt32 <QuestId>("Quest ID", i); packet.ReadInt32("Level", i); packet.ReadUInt32("Icon", i); packet.ReadUInt32E <QuestFlags>("Flags", i); var title = packet.ReadWoWString("Title", titleLen[i], i); packetGossip.Quests.Add(new GossipQuestOption() { Title = title, QuestId = quest }); } packet.ReadXORByte(guidBytes, 6); var gossipOptions = new List <GossipMenuOption>((int)amountOfOptions); var gossipOptionBoxes = new List <GossipMenuOptionBox>((int)amountOfOptions); for (int i = 0; i < amountOfOptions; ++i) { GossipMenuOption gossipMenuOption = new GossipMenuOption(); GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox(); gossipMenuOptionBox.BoxMoney = packet.ReadUInt32("Required money", i); gossipMenuOption.OptionText = packet.ReadWoWString("Text", optionTextLen[i], i); gossipMenuOption.OptionIndex = gossipMenuOptionBox.OptionIndex = packet.ReadUInt32("Index", i); gossipMenuOption.OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i); gossipMenuOptionBox.BoxText = packet.ReadWoWString("Box Text", boxTextLen[i], i); gossipMenuOptionBox.BoxCoded = packet.ReadBool("Box", i); gossipOptions.Add(gossipMenuOption); if (!gossipMenuOptionBox.IsEmpty) { gossipOptionBoxes.Add(gossipMenuOptionBox); } packetGossip.Options.Add(new GossipMessageOption() { OptionIndex = gossipMenuOption.OptionIndex.Value, OptionIcon = (int)gossipMenuOption.OptionIcon, BoxCoded = gossipMenuOptionBox.BoxCoded.Value, BoxCost = gossipMenuOptionBox.BoxMoney.Value, Text = gossipMenuOption.OptionText, BoxText = gossipMenuOptionBox.BoxText }); } packet.ReadXORByte(guidBytes, 2); uint textId = packetGossip.TextId = packet.ReadUInt32("Text Id"); packet.ReadXORByte(guidBytes, 1); packet.ReadXORByte(guidBytes, 5); uint menuId = packetGossip.MenuId = packet.ReadUInt32("Menu Id"); packet.ReadUInt32("Friendship Faction"); packet.ReadXORByte(guidBytes, 4); packet.ReadXORByte(guidBytes, 7); packet.ReadXORByte(guidBytes, 3); packet.ReadXORByte(guidBytes, 0); var guid = packet.WriteGuid("Guid", guidBytes); packetGossip.GossipSource = guid; GossipMenu gossip = new GossipMenu { Entry = menuId, TextID = textId }; gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); if (guid.GetObjectType() == ObjectType.Unit) { if (Storage.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = menuId; } } gossipOptions.ForEach(g => { g.MenuId = menuId; Storage.GossipMenuOptions.Add(g, packet.TimeSpan); }); gossipOptionBoxes.ForEach(gb => { gb.MenuId = menuId; Storage.GossipMenuOptionBoxes.Add(gb, packet.TimeSpan); }); Storage.Gossips.Add(gossip, packet.TimeSpan); var lastGossipOption = CoreParsers.NpcHandler.LastGossipOption; if (lastGossipOption.HasSelection) { Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction { MenuId = lastGossipOption.MenuId, OptionIndex = lastGossipOption.OptionIndex, ActionMenuId = gossip.Entry }, packet.TimeSpan); } packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static void HandleNpcGossip(Packet packet) { PacketGossipMessage packetGossip = packet.Holder.GossipMessage = new(); GossipMenu gossip = new GossipMenu(); WowGuid guid = packet.ReadPackedGuid128("GossipGUID"); packetGossip.GossipSource = guid; gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); int menuId = packet.ReadInt32("GossipID"); gossip.Entry = packetGossip.MenuId = (uint)menuId; packet.ReadInt32("FriendshipFactionID"); gossip.TextID = packetGossip.TextId = (uint)packet.ReadInt32("TextID"); int int44 = packet.ReadInt32("GossipOptions"); int int60 = packet.ReadInt32("GossipText"); for (int i = 0; i < int44; ++i) { packetGossip.Options.Add(V6_0_2_19033.Parsers.NpcHandler.ReadGossipOptionsData((uint)menuId, guid, packet, i, "GossipOptions")); } for (int i = 0; i < int60; ++i) { packetGossip.Quests.Add(ReadGossipQuestTextData(packet, i, "GossipQuestText")); } if (guid.GetObjectType() == ObjectType.Unit) { if (!Storage.CreatureDefaultGossips.ContainsKey(guid.GetEntry())) { Storage.CreatureDefaultGossips.Add(guid.GetEntry(), (uint)menuId); } } Storage.Gossips.Add(gossip, packet.TimeSpan); var lastGossipOption = CoreParsers.NpcHandler.LastGossipOption; var tempGossipOptionPOI = CoreParsers.NpcHandler.TempGossipOptionPOI; if (lastGossipOption.HasSelection) { if ((packet.TimeSpan - lastGossipOption.TimeSpan).Duration() <= TimeSpan.FromMilliseconds(2500)) { Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction { MenuId = lastGossipOption.MenuId, OptionIndex = lastGossipOption.OptionIndex, ActionMenuId = gossip.Entry, 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, menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static void HandleNpcGossip(Packet packet) { PacketGossipMessage packetGossip = packet.Holder.GossipMessage = new(); var guidBytes = new byte[8]; uint menuId = packetGossip.MenuId = packet.ReadUInt32("Menu Id"); packet.ReadUInt32("Friendship Faction"); uint textId = packetGossip.TextId = packet.ReadUInt32("Text Id"); packet.StartBitStream(guidBytes, 0, 1); uint amountOfOptions = packet.ReadBits("Amount of Options", 20); packet.StartBitStream(guidBytes, 6, 7); var optionTextLen = new uint[amountOfOptions]; var boxTextLen = new uint[amountOfOptions]; for (int i = 0; i < amountOfOptions; ++i) { optionTextLen[i] = packet.ReadBits(12); boxTextLen[i] = packet.ReadBits(12); } packet.StartBitStream(guidBytes, 4, 3, 2); uint questgossips = packet.ReadBits("Amount of Quest gossips", 19); var titleLen = new uint[questgossips]; for (int i = 0; i < questgossips; ++i) { titleLen[i] = packet.ReadBits(9); packet.ReadBit("Change Icon", i); } guidBytes[5] = packet.ReadBit(); packet.ResetBitReader(); for (int i = 0; i < questgossips; i++) { packet.ReadUInt32E <QuestFlagsEx>("Flags 2", i); packet.ReadUInt32("Icon", i); var title = packet.ReadWoWString("Title", titleLen[i], i); packet.ReadUInt32E <QuestFlags>("Flags", i); packet.ReadInt32("Level", i); var quest = packet.ReadUInt32 <QuestId>("Quest ID", i); packetGossip.Quests.Add(new GossipQuestOption() { Title = title, QuestId = quest }); } for (int i = 0; i < amountOfOptions; ++i) { GossipMenuOption gossipOption = new GossipMenuOption { MenuID = menuId }; gossipOption.BoxMoney = packet.ReadUInt32("Required money", i); gossipOption.OptionID = packet.ReadUInt32("OptionID", i); var boxText = packet.ReadWoWString("Box Text", boxTextLen[i], i); gossipOption.BoxCoded = packet.ReadBool("Box", i); gossipOption.OptionText = packet.ReadWoWString("Text", optionTextLen[i], i); gossipOption.OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i); if (!string.IsNullOrEmpty(boxText)) { gossipOption.BoxText = boxText; } Storage.GossipMenuOptions.Add((gossipOption.MenuID, gossipOption.OptionID), gossipOption, packet.TimeSpan); packetGossip.Options.Add(new GossipMessageOption() { OptionIndex = gossipOption.OptionID.Value, OptionIcon = (int)gossipOption.OptionIcon, BoxCoded = gossipOption.BoxCoded.Value, BoxCost = gossipOption.BoxMoney.Value, Text = gossipOption.OptionText, BoxText = gossipOption.BoxText }); } packet.ParseBitStream(guidBytes, 3, 4, 7, 2, 1, 6, 0, 5); GossipMenu gossip = new GossipMenu { MenuID = menuId, TextID = textId }; WowGuid guid = packet.WriteGuid("GUID", guidBytes); packetGossip.GossipSource = guid; gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); if (guid.GetObjectType() == ObjectType.Unit) { if (!Storage.CreatureDefaultGossips.ContainsKey(guid.GetEntry())) { Storage.CreatureDefaultGossips.Add(guid.GetEntry(), menuId); } } Storage.Gossips.Add(gossip, packet.TimeSpan); CoreParsers.NpcHandler.UpdateLastGossipOptionActionMessage(packet.TimeSpan, menuId); packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
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); } } 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 <QuestFlags2>("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)); }
public static void HandleNpcGossip(Packet packet) { var guidBytes = new byte[8]; guidBytes[7] = packet.ReadBit(); guidBytes[6] = packet.ReadBit(); guidBytes[0] = packet.ReadBit(); int questgossips = (int)packet.ReadBits(19); guidBytes[4] = packet.ReadBit(); var titleLen = new uint[questgossips]; for (int i = 0; i < questgossips; ++i) { titleLen[i] = packet.ReadBits(9); packet.ReadBit("Change Icon", i); } guidBytes[3] = packet.ReadBit(); guidBytes[2] = packet.ReadBit(); uint amountOfOptions = packet.ReadBits(20); var boxTextLen = new uint[amountOfOptions]; var optionTextLen = new uint[amountOfOptions]; for (int i = 0; i < amountOfOptions; ++i) { boxTextLen[i] = packet.ReadBits(12); optionTextLen[i] = packet.ReadBits(12); } guidBytes[1] = packet.ReadBit(); guidBytes[5] = packet.ReadBit(); packet.ReadXORByte(guidBytes, 2); var gossipOptions = new List <GossipMenuOption>((int)amountOfOptions); for (int i = 0; i < amountOfOptions; ++i) { GossipMenuOption gossipOption = new GossipMenuOption { BoxText = packet.ReadWoWString("Box Text", boxTextLen[i], i), OptionText = packet.ReadWoWString("Text", optionTextLen[i], i), ID = packet.ReadUInt32("Index", i), BoxCoded = packet.ReadBool("Box", i), OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i), BoxMoney = packet.ReadUInt32("Required money", i) }; gossipOptions.Add(gossipOption); } for (int i = 0; i < questgossips; ++i) { packet.ReadInt32("Level", i); packet.ReadUInt32E <QuestFlags>("Flags", i); packet.ReadUInt32("Icon", i); packet.ReadWoWString("Title", titleLen[i], i); packet.ReadUInt32 <QuestId>("Quest ID", i); packet.ReadUInt32E <QuestFlags2>("Flags 2", i); } packet.ReadXORByte(guidBytes, 7); packet.ReadUInt32("Friendship Faction"); packet.ReadXORByte(guidBytes, 3); packet.ReadXORByte(guidBytes, 1); uint textId = packet.ReadUInt32("Text Id"); packet.ReadXORByte(guidBytes, 5); uint menuId = packet.ReadUInt32("Menu Id"); packet.ReadXORByte(guidBytes, 6); packet.ReadXORByte(guidBytes, 4); packet.ReadXORByte(guidBytes, 0); GossipMenu gossip = new GossipMenu { Entry = menuId, TextID = textId }; WowGuid guid = packet.WriteGuid("Guid", guidBytes); gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); if (guid.GetObjectType() == ObjectType.Unit) { if (Storage.Objects.ContainsKey(guid)) { ((Unit)Storage.Objects[guid].Item1).GossipId = menuId; } } gossipOptions.ForEach(g => { g.MenuID = menuId; Storage.GossipMenuOptions.Add(g, packet.TimeSpan); }); Storage.Gossips.Add(gossip, packet.TimeSpan); packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
/// <summary>Sends a page to the character</summary> /// <param name="chr">recieving character</param> /// <param name="owner">EntityID of sender</param> public static void SendPageToCharacter(GossipConversation convo, IList <QuestMenuItem> questItems) { WorldObject speaker = convo.Speaker; Character character = convo.Character; GossipMenu currentMenu = convo.CurrentMenu; IList <GossipMenuItemBase> gossipItems = currentMenu.GossipItems; IGossipEntry gossipEntry = currentMenu.GossipEntry; if (gossipEntry.IsDynamic) { QueryHandler.SendNPCTextUpdate(character, gossipEntry); } using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_GOSSIP_MESSAGE)) { packet.Write(speaker.EntityId); packet.Write(0); packet.Write(gossipEntry.GossipId); long position = packet.Position; packet.Position += 4L; int num = 0; if (gossipItems != null) { for (int index = 0; index < gossipItems.Count; ++index) { GossipMenuItemBase gossipMenuItemBase = gossipItems[index]; if (gossipMenuItemBase.Action == null || gossipMenuItemBase.Action.CanUse(convo)) { packet.Write(index); packet.Write((byte)gossipMenuItemBase.Icon); packet.Write(gossipMenuItemBase.Input); packet.Write((uint)gossipMenuItemBase.RequiredMoney); packet.WriteCString(gossipMenuItemBase.GetText(convo)); packet.WriteCString(gossipMenuItemBase.GetConfirmText(convo)); ++num; } } } if (questItems != null) { packet.WriteUInt(questItems.Count); for (int index = 0; index < questItems.Count; ++index) { QuestMenuItem questItem = questItems[index]; packet.Write(questItem.ID); packet.Write(questItem.Status); packet.Write(questItem.Level); packet.Write(0); packet.Write((byte)0); packet.WriteCString(questItem.Text); } } else { packet.Write(0); } packet.Position = position; packet.Write(num); character.Client.Send(packet, false); } }