public override void Tick(ref RecordData data) { base.Tick(ref data); Results temp = controller.GetResults(); controller.WriteResults(writer, ref temp, bMaskV4); if (controller.writeVarValues != null) { controller.writeVarValues(writer, true); } if (temp.flags & Flags.RAGDOLL) { ragdollManager.GetBoneTransforms(ref bonePositions, ref boneRotations); writer.WritePackedUInt32((uint)bonePositions.Length); for (int i = 0; i < bonePositions.Length; i++) { writer.Write(bonePositions [i]); writer.Write(boneRotations [i]); } } data.bytes = writer.AsArray(); }
public void PlayTick(RecordData startRes, RecordData endRes, int sendUpdates, float speed, uint version) { if (recordInterface != null) { recordInterface.SetData(startRes, endRes, sendUpdates, speed, version); } }
//Read the start and end bytes to positions and rotations public virtual void SetData(RecordData dataStart, RecordData dataEnd, int sUpdates, float tTime, uint version) { readerStart = new NetworkReader(dataStart.bytes); posStart = readerStart.ReadVector3(); rotStart = readerStart.ReadQuaternion(); readerEnd = new NetworkReader(dataEnd.bytes); posEnd = readerEnd.ReadVector3(); rotEnd = readerEnd.ReadQuaternion(); if (tTime == -1f) { transform.position = posEnd; transform.rotation = rotEnd; } else { playBack = true; sendUpdates = sUpdates; targetTime = Time.fixedDeltaTime * sendUpdates; targetTimeMul = 1f / targetTime; startTime = Time.time; playbackSpeed = tTime; } }
public override void SetData(RecordData dataStart, RecordData dataEnd, int sUpdates, float tTime, uint version) { base.SetData(dataStart, dataEnd, sUpdates, tTime, version); resStart = resEnd; switch (version) { case 1: resEnd = new Results(transform.position, transform.rotation, new Vector3(0, 0, 0), readerEnd.ReadSingle(), readerEnd.ReadVector3(), (readerEnd.ReadBoolean() ? Flags.IS_GROUNDED : 0) | (readerEnd.ReadBoolean() ? Flags.JUMPED : 0) | (readerEnd.ReadBoolean() ? Flags.CROUCHED : 0) | Flags.AI_ENABLED, 0f, 0f, 0, readerEnd.ReadPackedUInt32()); break; case 2: resEnd = new Results(transform.position, transform.rotation, new Vector3(0, 0, 0), readerEnd.ReadSingle(), readerEnd.ReadVector3(), (readerEnd.ReadBoolean() ? Flags.IS_GROUNDED : 0) | (readerEnd.ReadBoolean() ? Flags.JUMPED : 0) | (readerEnd.ReadBoolean() ? Flags.CROUCHED : 0) | (readerEnd.ReadBoolean() ? Flags.RAGDOLL : 0) | Flags.AI_ENABLED, 0f, 0f, 0, readerEnd.ReadPackedUInt32()); if (resEnd.flags & Flags.RAGDOLL) { uint bL = readerEnd.ReadPackedUInt32(); bonePositions = new Vector3 [bL]; boneRotations = new Quaternion [bL]; for (uint i = 0; i < bL; i++) { bonePositions [i] = readerEnd.ReadVector3(); boneRotations [i] = readerEnd.ReadQuaternion(); } ragdollManager.SetTargetBoneTransforms(bonePositions, boneRotations); //if (tTime == -1f) // ragdollManager.UpdateRagdoll(); } break; default: resEnd = new Results(transform.position, transform.rotation, new Vector3(0, 0, 0), 0f, new Vector3(0, 0, 0), 0u, 0f, 0f, 0, 0u); controller.ReadResults(readerEnd, ref resEnd, version == 3 ? bMaskV3 : bMaskV4); if (controller.readVarValues != null) { controller.readVarValues(readerEnd, 0, true, true); } if (resEnd.flags & Flags.RAGDOLL) { uint bL = readerEnd.ReadPackedUInt32(); bonePositions = new Vector3[bL]; boneRotations = new Quaternion[bL]; for (uint i = 0; i < bL; i++) { bonePositions[i] = readerEnd.ReadVector3(); boneRotations[i] = readerEnd.ReadQuaternion(); } ragdollManager.SetTargetBoneTransforms(bonePositions, boneRotations); //if (tTime == -1f) // ragdollManager.UpdateRagdoll(); } break; } controller.PlaybackSetResults(resStart, resEnd, sendUpdates, playbackSpeed); }
public override void SetData(RecordData dataStart, RecordData dataEnd, int sUpdates, float tTime) { base.SetData(dataStart, dataEnd, sUpdates, tTime); resStart = resEnd; resEnd = new Results(transform.position, transform.rotation, new Vector3(0, 0, 0), readerEnd.ReadSingle(), readerEnd.ReadVector3(), readerEnd.ReadBoolean(), readerEnd.ReadBoolean(), readerEnd.ReadBoolean(), 0f, 0f, new Vector3(0, 0, 0), true, false, readerEnd.ReadPackedUInt32()); controller.PlaybackSetResults(resStart, resEnd, sendUpdates, playbackSpeed); }
public static void BacktrackObject(ObjectData obj, uint tick) { if (tick == 0 && obj.needsRestore) { obj.needsRestore = false; obj.component.PlayTick(obj.restoreData, obj.restoreData, GameManager.sendUpdates, -1f, GameManager.DEMO_VERSION); } else if (tick == 0) { return; } obj.needsRestore = true; if (obj.component.recordInterface != null) { obj.component.recordInterface.Tick(ref obj.restoreData); } int sz = obj.ticks.Count; RecordData restoreData = new RecordData(); bool foundClosest = false; uint closestTickDiff = 99999999; for (int i = sz - 1; i >= 0; i--) { RecordData curData = obj.ticks[i]; uint tDiff = 0; if (curData.timestamp > tick) { tDiff = curData.timestamp - tick; } else { tDiff = tick - curData.timestamp; } if (tDiff < closestTickDiff) { closestTickDiff = tDiff; restoreData = curData; foundClosest = true; } else { break; } } //Debug.Log(closestTickDiff); Debug.Assert(foundClosest || obj.ticks.Count == 0, "Supposed to be able to find closest tick, but were not."); obj.component.PlayTick(restoreData, restoreData, GameManager.sendUpdates, -1f, GameManager.DEMO_VERSION); }
public override void Tick(ref RecordData data) { base.Tick(ref data); Results temp = controller.GetResults(); writer.Write(temp.camX); writer.Write(temp.speed); writer.Write(temp.isGrounded); writer.Write(temp.jumped); writer.Write(temp.crouch); writer.WritePackedUInt32(temp.timestamp); data.bytes = writer.AsArray(); }
//Write the position and rotation to the data structure public virtual void Tick(ref RecordData data) { if (writer == null) { writer = new NetworkWriter(); } else { writer.SeekZero(); } writer.Write(transform.position); writer.Write(transform.rotation); data.bytes = writer.AsArray(); }
public static void ObjectTick(RecordableObject obj, RecordData res) { if (obj.gmIndex == -1) { RegisterObject(obj); } if (recording) { if (objects [obj.gmIndex].ticks == null) { objects [obj.gmIndex].ticks = new List <RecordData> (); } objects [obj.gmIndex].ticks.Add(res); } }
//Read the start and end bytes to positions and rotations public virtual void SetData(RecordData dataStart, RecordData dataEnd, int sUpdates, float tTime) { readerStart = new NetworkReader(dataStart.bytes); posStart = readerStart.ReadVector3(); rotStart = readerStart.ReadQuaternion(); readerEnd = new NetworkReader(dataEnd.bytes); posEnd = readerEnd.ReadVector3(); rotEnd = readerEnd.ReadQuaternion(); playBack = true; sendUpdates = sUpdates; targetTime = Time.fixedDeltaTime * sendUpdates; targetTimeMul = 1f / targetTime; startTime = Time.time; playbackSpeed = tTime; }
//Write the position and rotation to the data structure public virtual void Tick(ref RecordData data) { if (writer == null) { writer = new NetworkWriter(); } else #if ENABLE_MIRROR { writer.Position = 0; } #else { writer.SeekZero(); } #endif writer.Write(transform.position); writer.Write(transform.rotation); #if ENABLE_MIRROR data.bytes = writer.ToArray(); #else data.bytes = writer.AsArray(); #endif }
public static void ObjectTick(RecordableObject obj, RecordData res) { if (obj.gmIndex == -1) { RegisterObject(obj); } if (objects [obj.gmIndex].ticks == null) { objects [obj.gmIndex].ticks = new List <RecordData> (); } objects [obj.gmIndex].ticks.Add(res); //If not recording, only keep a set amount of history data if (!recording) { while (objects[obj.gmIndex].ticks.Count > 0 && (float)(res.timestamp - objects[obj.gmIndex].ticks[0].timestamp) * sendDiv * Time.fixedDeltaTime > settings.lagCompensationAmount) { objects[obj.gmIndex].ticks.RemoveAt(0); } } }
public void PlayTick(RecordData startRes, RecordData endRes, int sendUpdates, float speed) { recordInterface.SetData(startRes, endRes, sendUpdates, speed); }