private static Dictionary <int, List <UpdateField> > ReadDynamicValuesUpdateBlock(Packet packet, ObjectType type, object index, bool isCreating) { var dict = new Dictionary <int, List <UpdateField> >(); if (!ClientVersion.AddedInVersion(ClientVersionBuild.V5_0_4_16016)) { return(dict); } int objectEnd = UpdateFields.GetUpdateField(ObjectDynamicField.OBJECT_DYNAMIC_END); var maskSize = packet.ReadByte(); var updateMask = new int[maskSize]; for (var i = 0; i < maskSize; i++) { updateMask[i] = packet.ReadInt32(); } var mask = new BitArray(updateMask); for (var i = 0; i < mask.Count; ++i) { if (!mask[i]) { continue; } string key = "Dynamic Block Value " + i; if (i < objectEnd) { key = UpdateFields.GetUpdateFieldName <ObjectDynamicField>(i); } else { switch (type) { case ObjectType.Container: { if (i < UpdateFields.GetUpdateField(ItemDynamicField.ITEM_DYNAMIC_END)) { goto case ObjectType.Item; } key = UpdateFields.GetUpdateFieldName <ContainerDynamicField>(i); break; } case ObjectType.Item: { key = UpdateFields.GetUpdateFieldName <ItemDynamicField>(i); break; } case ObjectType.Player: { if (i < UpdateFields.GetUpdateField(UnitDynamicField.UNIT_DYNAMIC_END)) { goto case ObjectType.Unit; } key = UpdateFields.GetUpdateFieldName <PlayerDynamicField>(i); break; } case ObjectType.Unit: { key = UpdateFields.GetUpdateFieldName <UnitDynamicField>(i); break; } case ObjectType.GameObject: { key = UpdateFields.GetUpdateFieldName <GameObjectDynamicField>(i); break; } case ObjectType.DynamicObject: { key = UpdateFields.GetUpdateFieldName <DynamicObjectDynamicField>(i); break; } case ObjectType.Corpse: { key = UpdateFields.GetUpdateFieldName <CorpseDynamicField>(i); break; } case ObjectType.AreaTrigger: { key = UpdateFields.GetUpdateFieldName <AreaTriggerDynamicField>(i); break; } case ObjectType.SceneObject: { key = UpdateFields.GetUpdateFieldName <SceneObjectDynamicField>(i); break; } case ObjectType.Conversation: { key = UpdateFields.GetUpdateFieldName <ConversationDynamicField>(i); break; } } } var flag = packet.ReadUInt16(); var cnt = flag & 0x7FFF; if ((flag & 0x8000) != 0) { packet.ReadUInt32(key + " Size", index); } var vals = new int[cnt]; for (var j = 0; j < cnt; ++j) { vals[j] = packet.ReadInt32(); } var values = new List <UpdateField>(); var fieldMask = new BitArray(vals); for (var j = 0; j < fieldMask.Count; ++j) { if (!fieldMask[j]) { continue; } var blockVal = packet.ReadUpdateField(); string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; packet.AddValue(key, value, index, j); values.Add(blockVal); } dict.Add(i, values); } return(dict); }
private static Dictionary <int, UpdateField> ReadValuesUpdateBlock(Packet packet, ObjectType type, object index, bool isCreating) { var maskSize = packet.ReadByte(); var updateMask = new int[maskSize]; for (var i = 0; i < maskSize; i++) { updateMask[i] = packet.ReadInt32(); } var mask = new BitArray(updateMask); var dict = new Dictionary <int, UpdateField>(); int objectEnd = UpdateFields.GetUpdateField(ObjectField.OBJECT_END); for (var i = 0; i < mask.Count; ++i) { if (!mask[i]) { continue; } var blockVal = packet.ReadUpdateField(); // Don't spam 0 values at create if (isCreating && blockVal.UInt32Value == 0) { continue; } string key = "Block Value " + i; string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; if (i < objectEnd) { key = UpdateFields.GetUpdateFieldName <ObjectField>(i); } else { switch (type) { case ObjectType.Container: { if (i < UpdateFields.GetUpdateField(ItemField.ITEM_END)) { goto case ObjectType.Item; } key = UpdateFields.GetUpdateFieldName <ContainerField>(i); break; } case ObjectType.Item: { key = UpdateFields.GetUpdateFieldName <ItemField>(i); break; } case ObjectType.Player: { if (i < UpdateFields.GetUpdateField(UnitField.UNIT_END) || i < UpdateFields.GetUpdateField(UnitField.UNIT_FIELD_END)) { goto case ObjectType.Unit; } key = UpdateFields.GetUpdateFieldName <PlayerField>(i); break; } case ObjectType.Unit: { key = UpdateFields.GetUpdateFieldName <UnitField>(i); break; } case ObjectType.GameObject: { key = UpdateFields.GetUpdateFieldName <GameObjectField>(i); break; } case ObjectType.DynamicObject: { key = UpdateFields.GetUpdateFieldName <DynamicObjectField>(i); break; } case ObjectType.Corpse: { key = UpdateFields.GetUpdateFieldName <CorpseField>(i); break; } case ObjectType.AreaTrigger: { key = UpdateFields.GetUpdateFieldName <AreaTriggerField>(i); break; } case ObjectType.SceneObject: { key = UpdateFields.GetUpdateFieldName <SceneObjectField>(i); break; } case ObjectType.Conversation: { key = UpdateFields.GetUpdateFieldName <ConversationField>(i); break; } } } // HACK... if (key == UnitField.UNIT_FIELD_FACTIONTEMPLATE.ToString()) { packet.AddValue(key, value + $" ({ StoreGetters.GetName(StoreNameType.Faction, (int)blockVal.UInt32Value, false) })", index); } else { packet.AddValue(key, value, index); } dict.Add(i, blockVal); } objectEnd = UpdateFields.GetUpdateField(ObjectDynamicField.OBJECT_DYNAMIC_END); if (ClientVersion.AddedInVersion(ClientVersionBuild.V5_0_4_16016)) { maskSize = packet.ReadByte(); updateMask = new int[maskSize]; for (var i = 0; i < maskSize; i++) { updateMask[i] = packet.ReadInt32(); } mask = new BitArray(updateMask); for (var i = 0; i < mask.Count; ++i) { if (!mask[i]) { continue; } string key = "Dynamic Block Value " + i; if (i < objectEnd) { key = UpdateFields.GetUpdateFieldName <ObjectDynamicField>(i); } else { switch (type) { case ObjectType.Container: { if (i < UpdateFields.GetUpdateField(ItemDynamicField.ITEM_DYNAMIC_END)) { goto case ObjectType.Item; } key = UpdateFields.GetUpdateFieldName <ContainerDynamicField>(i); break; } case ObjectType.Item: { key = UpdateFields.GetUpdateFieldName <ItemDynamicField>(i); break; } case ObjectType.Player: { if (i < UpdateFields.GetUpdateField(UnitDynamicField.UNIT_DYNAMIC_END)) { goto case ObjectType.Unit; } key = UpdateFields.GetUpdateFieldName <PlayerDynamicField>(i); break; } case ObjectType.Unit: { key = UpdateFields.GetUpdateFieldName <UnitDynamicField>(i); break; } case ObjectType.GameObject: { key = UpdateFields.GetUpdateFieldName <GameObjectDynamicField>(i); break; } case ObjectType.DynamicObject: { key = UpdateFields.GetUpdateFieldName <DynamicObjectDynamicField>(i); break; } case ObjectType.Corpse: { key = UpdateFields.GetUpdateFieldName <CorpseDynamicField>(i); break; } case ObjectType.AreaTrigger: { key = UpdateFields.GetUpdateFieldName <AreaTriggerDynamicField>(i); break; } case ObjectType.SceneObject: { key = UpdateFields.GetUpdateFieldName <SceneObjectDynamicField>(i); break; } case ObjectType.Conversation: { key = UpdateFields.GetUpdateFieldName <ConversationDynamicField>(i); break; } } } var flag = packet.ReadUInt16(); var cnt = flag & 0x7FFF; if ((flag & 0x8000) != 0) { packet.ReadUInt32(key + " Size", index); } var vals = new int[cnt]; for (var j = 0; j < cnt; ++j) { vals[j] = packet.ReadInt32(); } var fieldMask = new BitArray(vals); for (var j = 0; j < fieldMask.Count; ++j) { if (!fieldMask[j]) { continue; } var blockVal = packet.ReadUpdateField(); string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; packet.AddValue(key, value, index, j); } } } return(dict); }
private static Dictionary <int, UpdateField> ReadValuesUpdateBlock(Packet packet, ObjectType type, object index, bool isCreating) { var maskSize = packet.ReadByte(); var updateMask = new int[maskSize]; for (var i = 0; i < maskSize; i++) { updateMask[i] = packet.ReadInt32(); } var mask = new BitArray(updateMask); var dict = new Dictionary <int, UpdateField>(); int objectEnd = UpdateFields.GetUpdateField(ObjectField.OBJECT_END); for (var i = 0; i < mask.Count; ++i) { if (!mask[i]) { continue; } var blockVal = packet.ReadUpdateField(); // Don't spam 0 values at create if (isCreating && blockVal.UInt32Value == 0) { continue; } string key = "Block Value " + i; string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; if (i < objectEnd) { key = UpdateFields.GetUpdateFieldName <ObjectField>(i); } else { switch (type) { case ObjectType.Container: { if (i < UpdateFields.GetUpdateField(ItemField.ITEM_END)) { goto case ObjectType.Item; } key = UpdateFields.GetUpdateFieldName <ContainerField>(i); break; } case ObjectType.Item: { key = UpdateFields.GetUpdateFieldName <ItemField>(i); break; } case ObjectType.Player: { if (i < UpdateFields.GetUpdateField(UnitField.UNIT_END) || i < UpdateFields.GetUpdateField(UnitField.UNIT_FIELD_END)) { goto case ObjectType.Unit; } key = UpdateFields.GetUpdateFieldName <PlayerField>(i); break; } case ObjectType.Unit: { key = UpdateFields.GetUpdateFieldName <UnitField>(i); break; } case ObjectType.GameObject: { key = UpdateFields.GetUpdateFieldName <GameObjectField>(i); break; } case ObjectType.DynamicObject: { key = UpdateFields.GetUpdateFieldName <DynamicObjectField>(i); break; } case ObjectType.Corpse: { key = UpdateFields.GetUpdateFieldName <CorpseField>(i); break; } case ObjectType.AreaTrigger: { key = UpdateFields.GetUpdateFieldName <AreaTriggerField>(i); break; } case ObjectType.SceneObject: { key = UpdateFields.GetUpdateFieldName <SceneObjectField>(i); break; } case ObjectType.Conversation: { key = UpdateFields.GetUpdateFieldName <ConversationField>(i); break; } } } // HACK... if (key == UnitField.UNIT_FIELD_SCALING_LEVEL_DELTA.ToString()) { value = (int)blockVal.UInt32Value + "/" + blockVal.SingleValue; } if (key == UnitField.UNIT_FIELD_FACTIONTEMPLATE.ToString()) { packet.AddValue(key, value + $" ({ StoreGetters.GetName(StoreNameType.Faction, (int)blockVal.UInt32Value, false) })", index); } else { packet.AddValue(key, value, index); } dict.Add(i, blockVal); } return(dict); }
public static Dictionary <int, UpdateField> ReadValuesUpdateBlock(ref Packet packet, ObjectType type, int index) { var maskSize = packet.ReadByte(); var updateMask = new int[maskSize]; for (var i = 0; i < maskSize; i++) { updateMask[i] = packet.ReadInt32(); } var mask = new BitArray(updateMask); var dict = new Dictionary <int, UpdateField>(); int objectEnd = UpdateFields.GetUpdateField(ObjectField.OBJECT_END); for (var i = 0; i < mask.Count; i++) { if (!mask[i]) { continue; } var blockVal = packet.ReadUpdateField(); string key = "Block Value " + i; string value = blockVal.Int32Value + "/" + blockVal.SingleValue; if (i < objectEnd) { key = UpdateFields.GetUpdateFieldName(i, "ObjectField"); } else { switch (type) { case ObjectType.Container: { if (i < UpdateFields.GetUpdateField(ItemField.ITEM_END)) { goto case ObjectType.Item; } key = UpdateFields.GetUpdateFieldName(i, "ContainerField"); break; } case ObjectType.Item: { key = UpdateFields.GetUpdateFieldName(i, "ItemField"); break; } case ObjectType.Player: { if (i < UpdateFields.GetUpdateField(UnitField.UNIT_END)) { goto case ObjectType.Unit; } key = UpdateFields.GetUpdateFieldName(i, "PlayerField"); break; } case ObjectType.Unit: { key = UpdateFields.GetUpdateFieldName(i, "UnitField"); break; } case ObjectType.GameObject: { key = UpdateFields.GetUpdateFieldName(i, "GameObjectField"); break; } case ObjectType.DynamicObject: { key = UpdateFields.GetUpdateFieldName(i, "DynamicObjectField"); break; } case ObjectType.Corpse: { key = UpdateFields.GetUpdateFieldName(i, "CorpseField"); break; } } } packet.Writer.WriteLine("[" + index + "] " + key + ": " + value); dict.Add(i, blockVal); } return(dict); }