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; } } } }
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); }
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; } } } }
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; } } } }