public void TransferValuesFrom(Transform2DNetworkData stateToSend) { this.Timestamp = stateToSend.Timestamp; this.Position = stateToSend.Position; this.Rotation = stateToSend.Rotation; this.Velocity = stateToSend.Velocity; }
private void TransmitState_AtAllClients(Transform2DNetworkData data) { if (stateBuffer.Length > 1 && data.Timestamp <= stateBuffer[0].Timestamp) { return; } if (stateTimeOffsets[0] == 0f) { stateTimeOffsets.RemoveAt(0); } stateTimeOffsets.Add(data.Timestamp - GetWorldTime()); if (stateTimeOffsets.Count > StateAmount) { stateTimeOffsets.RemoveAt(0); } for (int i = stateBuffer.Length - 1; i >= 1; i--) { stateBuffer[i] = stateBuffer[i - 1]; } // Array.Copy(stateBuffer, 0, stateBuffer, 1, stateBuffer.Length - 1); stateBuffer[0] = data; // TODO: implement correction of position // first store last second of states every 0.1s // use timestamp to get a past state, either use lerping or just take the closest state. // test if it is correct, if not, then reset all and world.step() with time offset OnPositionReceived?.Invoke(data); // DebugLog.Warning($"[SyncedTransform2D-{EntityId}: {data.Position.ToString()}"); // DebugLog.Warning($"[SyncedTransform2D-{EntityId}: {string.Join(", ", stateBuffer.Select((state, i) => state.Position.ToString()))}"); }
public SyncedTransform2D(int entityId, IGame game, PhysicsBody body = null) { this.EntityId = entityId; tickTriggerAmount = 1f / tickRate; this.game = game; this.body = body; stateBuffer = new Transform2DNetworkData[StateAmount]; stateTimeOffsets.Add(0f); stateBuffer[0] = new Transform2DNetworkData() { Timestamp = 0.0000000001f, Position = new Vec2(0, 0), Rotation = 0f }; stateBuffer[1] = new Transform2DNetworkData() { Timestamp = 0f, Position = new Vec2(0, 0), Rotation = 0f }; transmitState = NetworkMagic.RegisterAtAllClients <Transform2DNetworkData>(0, TransmitState_AtAllClients, entityId); }