Ejemplo n.º 1
0
        public static void HandleUpdateObject(Packet packet)
        {
            var  updateObject = packet.Holder.UpdateObject = new();
            uint map          = updateObject.MapId = packet.ReadUInt16("Map");
            var  count        = packet.ReadUInt32("Count");

            for (var i = 0; i < count; i++)
            {
                var type = (UpdateTypeCataclysm)packet.ReadByte();

                var partWriter = new StringBuilderProtoPart(packet.Writer);
                packet.AddValue("UpdateType", type.ToString(), i);
                switch (type)
                {
                case UpdateTypeCataclysm.Values:
                {
                    var guid         = packet.ReadPackedGuid("GUID", i);
                    var updateValues = new UpdateValues()
                    {
                        Legacy = new()
                    };
                    CoreParsers.UpdateHandler.ReadValuesUpdateBlock(packet, updateValues.Legacy, guid, i);
                    updateObject.Updated.Add(new UpdateObject {
                            Guid = guid, Values = updateValues, TextStartOffset = partWriter.StartOffset, TextLength = partWriter.Length, Text = partWriter.Text
                        });
                    break;
                }

                case UpdateTypeCataclysm.CreateObject1:
                case UpdateTypeCataclysm.CreateObject2:     // Might != CreateObject1 on Cata
                {
                    var guid         = packet.ReadPackedGuid("GUID", i);
                    var createObject = new CreateObject()
                    {
                        Guid = guid, Values = new(){ Legacy = new() }, CreateType = type.ToCreateObjectType()
                    };
                    ReadCreateObjectBlock(packet, createObject, guid, map, i);
                    createObject.Text            = partWriter.Text;
                    createObject.TextStartOffset = partWriter.StartOffset;
                    createObject.TextLength      = partWriter.Length;
                    updateObject.Created.Add(createObject);
                    break;
                }

                case UpdateTypeCataclysm.DestroyObjects:
                {
                    CoreParsers.UpdateHandler.ReadDestroyObjectsBlock(packet, i);
                    break;
                }
                }
            }
        }
Ejemplo n.º 2
0
        public static void HandleUpdateObject(Packet packet)
        {
            var  updateObject = packet.Holder.UpdateObject = new();
            var  count        = packet.ReadUInt32("NumObjUpdates");
            uint map          = updateObject.MapId = packet.ReadUInt16 <MapId>("MapID");

            packet.ResetBitReader();
            var hasRemovedObjects = packet.ReadBit("HasRemovedObjects");

            if (hasRemovedObjects)
            {
                var destroyedObjCount  = packet.ReadInt16("DestroyedObjCount");
                var removedObjCount    = packet.ReadUInt32("RemovedObjCount"); // destroyed + out of range
                var outOfRangeObjCount = removedObjCount - destroyedObjCount;

                for (var i = 0; i < destroyedObjCount; i++)
                {
                    var partWriter = new StringBuilderProtoPart(packet.Writer);
                    var guid       = packet.ReadPackedGuid128("ObjectGUID", "Destroyed", i);
                    updateObject.Destroyed.Add(new DestroyedObject()
                    {
                        Guid = guid, TextStartOffset = partWriter.StartOffset, TextLength = partWriter.Length, Text = partWriter.Text
                    });
                }

                for (var i = 0; i < outOfRangeObjCount; i++)
                {
                    var partWriter = new StringBuilderProtoPart(packet.Writer);
                    var guid       = packet.ReadPackedGuid128("ObjectGUID", "OutOfRange", i);
                    updateObject.OutOfRange.Add(new DestroyedObject()
                    {
                        Guid = guid, TextStartOffset = partWriter.StartOffset, TextLength = partWriter.Length, Text = partWriter.Text
                    });
                }
            }
            packet.ReadUInt32("Data size");

            for (var i = 0; i < count; i++)
            {
                var type = (UpdateTypeCataclysm)packet.ReadByte();

                var partWriter = new StringBuilderProtoPart(packet.Writer);
                packet.AddValue("UpdateType", type.ToString(), i);
                switch (type)
                {
                case UpdateTypeCataclysm.Values:
                {
                    var guid         = packet.ReadPackedGuid128("Object Guid", i);
                    var updateValues = new UpdateValues();
                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V8_1_0_28724))
                    {
                        var updatefieldSize = packet.ReadUInt32();
                        var handler         = CoreFields.UpdateFields.GetHandler();
                        updateValues.Fields = new();
                        using (var fieldsData = new Packet(packet.ReadBytes((int)updatefieldSize), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName))
                        {
                            WoWObject obj;
                            Storage.Objects.TryGetValue(guid, out obj);

                            var updateTypeFlag = fieldsData.ReadUInt32();
                            if ((updateTypeFlag & 0x0001) != 0)
                            {
                                var data = handler.ReadUpdateObjectData(fieldsData, i);
                                if (obj is { ObjectData: IMutableObjectData mut })
                                {
                                    mut.UpdateData(data);
                                }
Ejemplo n.º 3
0
        public static void HandleUpdateObject(Packet packet)
        {
            var  updateObject = packet.Holder.UpdateObject = new();
            var  count        = packet.ReadUInt32("NumObjUpdates");
            uint map          = updateObject.MapId = packet.ReadUInt16 <MapId>("MapID");

            packet.ResetBitReader();
            var hasRemovedObjects = packet.ReadBit("HasRemovedObjects");

            if (hasRemovedObjects)
            {
                var destroyedObjCount  = packet.ReadInt16("DestroyedObjCount");
                var removedObjCount    = packet.ReadUInt32("RemovedObjCount"); // destroyed + out of range
                var outOfRangeObjCount = removedObjCount - destroyedObjCount;

                for (var i = 0; i < destroyedObjCount; i++)
                {
                    var partWriter = new StringBuilderProtoPart(packet.Writer);
                    var guid       = packet.ReadPackedGuid128("ObjectGUID", "Destroyed", i);
                    updateObject.Destroyed.Add(new DestroyedObject()
                    {
                        Guid = guid, Text = partWriter.Text
                    });
                }
                for (var i = 0; i < outOfRangeObjCount; i++)
                {
                    var partWriter = new StringBuilderProtoPart(packet.Writer);
                    var guid       = packet.ReadPackedGuid128("ObjectGUID", "OutOfRange", i);
                    updateObject.OutOfRange.Add(new DestroyedObject()
                    {
                        Guid = guid, Text = partWriter.Text
                    });
                }
            }
            packet.ReadUInt32("Data size");

            for (var i = 0; i < count; i++)
            {
                var type = (UpdateTypeCataclysm)packet.ReadByte();

                var partWriter = new StringBuilderProtoPart(packet.Writer);
                packet.AddValue("UpdateType", type.ToString(), i);
                switch (type)
                {
                case UpdateTypeCataclysm.Values:
                {
                    var guid         = packet.ReadPackedGuid128("Object Guid", i);
                    var updateValues = new UpdateValues()
                    {
                        Legacy = new()
                    };
                    CoreParsers.UpdateHandler.ReadValuesUpdateBlock(packet, updateValues.Legacy, guid, i);
                    updateObject.Updated.Add(new UpdateObject {
                            Guid = guid, Values = updateValues, Text = partWriter.Text
                        });
                    break;
                }

                case UpdateTypeCataclysm.CreateObject1:
                case UpdateTypeCataclysm.CreateObject2:     // Might != CreateObject1 on Cata
                {
                    var guid         = packet.ReadPackedGuid128("Object Guid", i);
                    var createObject = new CreateObject()
                    {
                        Guid = guid, Values = new(){ Legacy = new() }, CreateType = type.ToCreateObjectType()
                    };
                    ReadCreateObjectBlock(packet, createObject, guid, map, i);
                    createObject.Text = partWriter.Text;
                    updateObject.Created.Add(createObject);
                    break;
                }
                }
            }
        }
Ejemplo n.º 4
0
        public static void HandleUpdateObject(Packet packet)
        {
            var  updateObject = packet.Holder.UpdateObject = new();
            var  count        = packet.ReadUInt32("NumObjUpdates");
            uint map          = updateObject.MapId = packet.ReadUInt16 <MapId>("MapID");

            packet.ResetBitReader();
            var hasRemovedObjects = packet.ReadBit("HasRemovedObjects");

            if (hasRemovedObjects)
            {
                var destroyedObjCount  = packet.ReadInt16("DestroyedObjCount");
                var removedObjCount    = packet.ReadUInt32("RemovedObjCount"); // destroyed + out of range
                var outOfRangeObjCount = removedObjCount - destroyedObjCount;

                for (var i = 0; i < destroyedObjCount; i++)
                {
                    var partWriter = new StringBuilderProtoPart(packet.Writer);
                    var guid       = packet.ReadPackedGuid128("ObjectGUID", "Destroyed", i);
                    updateObject.Destroyed.Add(new DestroyedObject()
                    {
                        Guid = guid, Text = partWriter.Text
                    });
                }

                for (var i = 0; i < outOfRangeObjCount; i++)
                {
                    var partWriter = new StringBuilderProtoPart(packet.Writer);
                    var guid       = packet.ReadPackedGuid128("ObjectGUID", "OutOfRange", i);
                    updateObject.OutOfRange.Add(new DestroyedObject()
                    {
                        Guid = guid, Text = partWriter.Text
                    });
                }
            }
            packet.ReadUInt32("Data size");

            for (var i = 0; i < count; i++)
            {
                var type       = packet.ReadByte();
                var typeString = ((UpdateTypeCataclysm)type).ToString();

                var partWriter = new StringBuilderProtoPart(packet.Writer);
                packet.AddValue("UpdateType", typeString, i);
                switch (typeString)
                {
                case "Values":
                {
                    var guid = packet.ReadPackedGuid128("Object Guid", i);
                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V8_1_0_28724))
                    {
                        var updatefieldSize = packet.ReadUInt32();
                        var handler         = CoreFields.UpdateFields.GetHandler();
                        using (var fieldsData = new Packet(packet.ReadBytes((int)updatefieldSize), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName))
                        {
                            WoWObject obj;
                            Storage.Objects.TryGetValue(guid, out obj);

                            var updateTypeFlag = fieldsData.ReadUInt32();
                            if ((updateTypeFlag & 0x0001) != 0)
                            {
                                var data = handler.ReadUpdateObjectData(fieldsData, obj?.ObjectData, i);
                                if (obj != null)
                                {
                                    obj.ObjectData = data;
                                }
                            }
                            if ((updateTypeFlag & 0x0002) != 0)
                            {
                                handler.ReadUpdateItemData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0004) != 0)
                            {
                                handler.ReadUpdateContainerData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0008) != 0)
                            {
                                handler.ReadUpdateAzeriteEmpoweredItemData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0010) != 0)
                            {
                                handler.ReadUpdateAzeriteItemData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0020) != 0)
                            {
                                var unit = obj as Unit;
                                var data = handler.ReadUpdateUnitData(fieldsData, unit?.UnitData, i);
                                if (unit != null)
                                {
                                    unit.UnitData = data;
                                }
                            }
                            if ((updateTypeFlag & 0x0040) != 0)
                            {
                                handler.ReadUpdatePlayerData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0080) != 0)
                            {
                                handler.ReadUpdateActivePlayerData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0100) != 0)
                            {
                                var go   = obj as GameObject;
                                var data = handler.ReadUpdateGameObjectData(fieldsData, go?.GameObjectData, i);
                                if (go != null)
                                {
                                    go.GameObjectData = data;
                                }
                            }
                            if ((updateTypeFlag & 0x0200) != 0)
                            {
                                handler.ReadUpdateDynamicObjectData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0400) != 0)
                            {
                                handler.ReadUpdateCorpseData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x0800) != 0)
                            {
                                handler.ReadUpdateAreaTriggerData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x1000) != 0)
                            {
                                handler.ReadUpdateSceneObjectData(fieldsData, null, i);
                            }
                            if ((updateTypeFlag & 0x2000) != 0)
                            {
                                var conversation = obj as ConversationTemplate;
                                var data         = handler.ReadUpdateConversationData(fieldsData, conversation?.ConversationData, i);
                                if (conversation != null)
                                {
                                    conversation.ConversationData = data;
                                }
                            }
                        }
                    }
                    else
                    {
                        var updateValues = new UpdateValues();
                        CoreParsers.UpdateHandler.ReadValuesUpdateBlock(packet, updateValues, guid, i);
                        updateObject.Updated.Add(new UpdateObject {
                                Guid = guid, Values = updateValues, Text = partWriter.Text
                            });
                    }
                    break;
                }

                case "CreateObject1":
                case "CreateObject2":
                {
                    var guid         = packet.ReadPackedGuid128("Object Guid", i);
                    var createObject = new CreateObject()
                    {
                        Guid = guid, Values = new()
                    };
                    ReadCreateObjectBlock(packet, createObject, guid, map, i);
                    createObject.Text = partWriter.Text;
                    updateObject.Created.Add(createObject);
                    break;
                }
                }
            }
        }