public void Serialize(NetBitReader reader) { byte sourceNum = reader.ReadByte(); bool bHasAdditiveSources = reader.ReadBit(); bool bHasOverrideSources = reader.ReadBit(); FVector lastPreAdditiveVelocity = reader.SerializePropertyVector10(); bool bIsAdditiveVelocityApplied = reader.ReadBit(); byte lastAccumulatedSettingsFlags = reader.ReadByte(); //Off by about 130 bits for (int i = 0; i < sourceNum; i++) { uint guid = reader.SerializePropertyObject(); ushort priority = reader.ReadUInt16(); ushort localId = reader.ReadUInt16(); byte accumulatedModeSerialize = reader.ReadByte(); string instanceName = reader.SerializePropertyName(); float currentTime = reader.SerializePropertyFloat(); float duration = reader.SerializePropertyFloat(); byte statusFlags = reader.ReadByte(); bool bInLocalSpace = reader.ReadBit(); } }
public void Serialize(NetBitReader reader) { bool repPosition = reader.ReadBoolean(); if (repPosition) { bRepPosition = true; SectionIdToPlay = 0; SkipPositionCorrection = false; uint packedPosition = reader.ReadIntPacked(); Position = packedPosition / 100; } else { bRepPosition = false; SkipPositionCorrection = true; Position = 0; SectionIdToPlay = reader.ReadBitsToInt(7); } IsStopped = reader.ReadBit(); ForcePlayBit = reader.ReadBit(); SkipPositionCorrection = reader.ReadBit(); bSkipPlayRate = reader.ReadBit(); AnimMontage = new UObjectGUID { Value = reader.ReadIntPacked() }; PlayRate = reader.SerializePropertyFloat(); BlendTime = reader.SerializePropertyFloat(); NextSectionID = reader.ReadByte(); PredictionKey = new FPredictionKey(); PredictionKey.Serialize(reader); }
/// <summary> /// see https://github.com/EpicGames/UnrealEngine/blob/c10022aa46e208b1593dd537c2607784aac158f1/Engine/Source/Runtime/Engine/Private/Collision/Collision.cpp#L42 /// </summary> /// <param name="reader"></param> public void Serialize(NetBitReader reader) { // pack bitfield with flags // Most of the time the vectors are the same values, use that as an optimization BlockingHit = reader.ReadBit(); StartPenetrating = reader.ReadBit(); var bImpactPointEqualsLocation = reader.ReadBit(); var bImpactNormalEqualsNormal = reader.ReadBit(); // Often times the indexes are invalid, use that as an optimization var bInvalidItem = reader.ReadBit(); var bInvalidFaceIndex = reader.ReadBit(); var bNoPenetrationDepth = reader.ReadBit(); var bInvalidElementIndex = reader.EngineNetworkVersion >= EngineNetworkVersionHistory.HISTORY_ENUM_SERIALIZATION_COMPAT && reader.ReadBit(); Time = reader.ReadSingle(); Location = reader.ReadPackedVector(1, 20); Normal = reader.SerializePropertyVectorNormal(); ImpactPoint = !bImpactPointEqualsLocation?reader.ReadPackedVector(1, 20) : Location; ImpactNormal = !bImpactNormalEqualsNormal?reader.SerializePropertyVectorNormal() : Normal; TraceStart = reader.ReadPackedVector(1, 20); TraceEnd = reader.ReadPackedVector(1, 20); PenetrationDepth = !bNoPenetrationDepth?reader.SerializePropertyFloat() : 0.0f; Distance = (ImpactPoint - TraceStart).Size(); Item = !bInvalidItem?reader.ReadInt32() : 0; PhysMaterial = reader.SerializePropertyObject(); if (reader.EngineNetworkVersion < EngineNetworkVersionHistory.HISTORY_HITRESULT_INSTANCEHANDLE) { Actor = reader.SerializePropertyObject(); } else { Actor = reader.SerializePropertyObject(); // see https://github.com/EpicGames/UnrealEngine/blob/4564529ed77196caada6971f5de1be829900b9e1/Engine/Source/Runtime/Engine/Private/EngineTypes.cpp#L558 //Ar << Handle.Actor; //Ar << Handle.Manager; //Ar << Handle.InstanceIndex; } Component = reader.SerializePropertyObject(); BoneName = reader.SerializePropertyName(); FaceIndex = !bInvalidFaceIndex?reader.ReadInt32() : 0; ElementIndex = !bInvalidElementIndex && reader.EngineNetworkVersion >= EngineNetworkVersionHistory.HISTORY_ENUM_SERIALIZATION_COMPAT ? reader.ReadByte() : new byte(); }
/// <summary> /// see https://github.com/EpicGames/UnrealEngine/blob/c10022aa46e208b1593dd537c2607784aac158f1/Engine/Source/Runtime/Engine/Private/Collision/Collision.cpp#L42 /// </summary> /// <param name="reader"></param> public void Serialize(NetBitReader reader) { // pack bitfield with flags var flags = reader.ReadBits(8); // Most of the time the vectors are the same values, use that as an optimization BlockingHit = flags[0]; StartPenetrating = flags[1]; bool bImpactPointEqualsLocation = flags[2]; bool bImpactNormalEqualsNormal = flags[3]; // Often times the indexes are invalid, use that as an optimization bool bInvalidItem = flags[4]; bool bInvalidFaceIndex = flags[5]; bool bNoPenetrationDepth = flags[6]; bool bInvalidElementIndex = flags[7]; Time = reader.ReadSingle(); Location = reader.ReadPackedVector(1, 20); Normal = reader.SerializePropertyVectorNormal(); if (!bImpactPointEqualsLocation) { ImpactPoint = reader.ReadPackedVector(1, 20); } else { ImpactPoint = Location; } if (!bImpactNormalEqualsNormal) { ImpactNormal = reader.SerializePropertyVectorNormal(); } else { ImpactNormal = Normal; } TraceStart = reader.ReadPackedVector(1, 20); TraceEnd = reader.ReadPackedVector(1, 20); if (!bNoPenetrationDepth) { PenetrationDepth = reader.SerializePropertyFloat(); } else { PenetrationDepth = 0.0f; } Distance = (ImpactPoint - TraceStart).Size(); if (!bInvalidItem) { Item = reader.ReadInt32(); } else { Item = 0; } PhysMaterial = reader.SerializePropertyObject(); Actor = reader.SerializePropertyObject(); Component = reader.SerializePropertyObject(); BoneName = reader.SerializePropertyName(); if (!bInvalidFaceIndex) { FaceIndex = reader.ReadInt32(); } else { FaceIndex = 0; } if (!bInvalidElementIndex) { ElementIndex = reader.ReadByte(); } else { ElementIndex = 0; } }