示例#1
0
        /// <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);
        }
示例#2
0
        public static void ShowMenu(this CmdTrigger <RealmServerCmdArgs> trigger, GossipMenu menu)
        {
            var chr = trigger.Args.Character;

            if (chr != null)
            {
                chr.StartGossip(menu);
            }
        }
示例#3
0
        public static void ShowMenu(this CmdTrigger <RealmServerCmdArgs> trigger, GossipMenu menu)
        {
            Character character = trigger.Args.Character;

            if (character == null)
            {
                return;
            }
            character.StartGossip(menu);
        }
示例#4
0
        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));
        }
示例#5
0
        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);
        }
示例#6
0
        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;
        }
示例#7
0
        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));
        }
示例#8
0
        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);
        }
示例#9
0
        /// <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);
        }
示例#10
0
        /// <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);
        }
示例#11
0
        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));
        }
示例#12
0
        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));
        }
示例#13
0
        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;
            }
        }
示例#14
0
        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));
        }
示例#15
0
        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));
        }
示例#16
0
        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));
        }
示例#17
0
        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));
        }
示例#18
0
        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));
        }
示例#19
0
        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));
        }
示例#20
0
        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));
        }
示例#21
0
        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));
        }
示例#22
0
        /// <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);
            }
        }