From cbf905c4ba4b73383937799a781bef549d1470e8 Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Fri, 16 Oct 2020 23:14:21 +0200 Subject: [PATCH] Finish CustomNetworkTransform --- .../Components/InnerCustomNetworkTransform.cs | 95 +++++++++++++------ .../GameData/Objects/InnerPlayerControl.cs | 7 +- src/Impostor.Shared/Innersloth/FloatRange.cs | 6 +- src/Impostor.Shared/Unity/Mathf.cs | 18 ++++ 4 files changed, 95 insertions(+), 31 deletions(-) diff --git a/src/Impostor.Server/GameData/Objects/Components/InnerCustomNetworkTransform.cs b/src/Impostor.Server/GameData/Objects/Components/InnerCustomNetworkTransform.cs index 013d666..d3b5c05 100644 --- a/src/Impostor.Server/GameData/Objects/Components/InnerCustomNetworkTransform.cs +++ b/src/Impostor.Server/GameData/Objects/Components/InnerCustomNetworkTransform.cs @@ -1,7 +1,7 @@ -using System; -using System.Numerics; +using System.Numerics; using Impostor.Server.Net.Messages; using Impostor.Shared.Innersloth; +using Microsoft.Extensions.Logging; namespace Impostor.Server.GameData.Objects.Components { @@ -10,63 +10,104 @@ namespace Impostor.Server.GameData.Objects.Components private static readonly FloatRange XRange = new FloatRange(-40f, 40f); private static readonly FloatRange YRange = new FloatRange(-40f, 40f); + private readonly ILogger _logger; + private ushort _lastSequenceId; private Vector2 _targetSyncPosition; private Vector2 _targetSyncVelocity; + public InnerCustomNetworkTransform(ILogger logger) + { + _logger = logger; + } + + private static bool SidGreaterThan(ushort newSid, ushort prevSid) + { + var num = (ushort)(prevSid + (uint) short.MaxValue); + + return (int) prevSid < (int) num + ? newSid > prevSid && newSid <= num + : newSid > prevSid || newSid <= num; + } + + private static void WriteVector2(IMessageWriter writer, Vector2 vec) + { + writer.Write((ushort)(XRange.ReverseLerp(vec.X) * (double) ushort.MaxValue)); + writer.Write((ushort)(YRange.ReverseLerp(vec.Y) * (double) ushort.MaxValue)); + } + + private static Vector2 ReadVector2(IMessageReader reader) + { + var v1 = reader.ReadUInt16() / (float) ushort.MaxValue; + var v2 = reader.ReadUInt16() / (float) ushort.MaxValue; + + return new Vector2(XRange.Lerp(v1), YRange.Lerp(v2)); + } + public override void HandleRpc(byte callId, IMessageReader reader) { - throw new NotImplementedException(); + if (callId == 0) + { + SnapTo(ReadVector2(reader), reader.ReadUInt16()); + } + else + { + _logger.LogWarning("InnerCustomNetworkTransform: Unknown rpc call {0}", callId); + } } public override bool Serialize(IMessageWriter writer, bool initialState) { - throw new NotImplementedException(); + if (initialState) + { + writer.Write(_lastSequenceId); + WriteVector2(writer, _targetSyncPosition); + WriteVector2(writer, _targetSyncVelocity); + return true; + } + + // TODO: DirtyBits == 0 return false. + _lastSequenceId++; + + writer.Write(_lastSequenceId); + WriteVector2(writer, _targetSyncPosition); + WriteVector2(writer, _targetSyncVelocity); + return true; } public override void Deserialize(IMessageReader reader, bool initialState) { + var sequenceId = reader.ReadUInt16(); + if (initialState) { - _lastSequenceId = reader.ReadUInt16(); + _lastSequenceId = sequenceId; _targetSyncPosition = ReadVector2(reader); _targetSyncVelocity = ReadVector2(reader); - - Console.WriteLine(_targetSyncPosition + " - " + _targetSyncVelocity); } else { - var newSid = reader.ReadUInt16(); - if (!SidGreaterThan(newSid, _lastSequenceId)) + if (!SidGreaterThan(sequenceId, _lastSequenceId)) { return; } - _lastSequenceId = newSid; + _lastSequenceId = sequenceId; _targetSyncPosition = ReadVector2(reader); _targetSyncVelocity = ReadVector2(reader); - - // TODO: Snap / update position - - Console.WriteLine(_targetSyncPosition + " - " + _targetSyncVelocity); } } - private static bool SidGreaterThan(ushort newSid, ushort prevSid) + private void SnapTo(Vector2 position, ushort minSid) { - var num = (ushort)(prevSid + (uint) short.MaxValue); - - return (int) prevSid < (int) num - ? newSid > prevSid && newSid <= num - : newSid > prevSid || newSid <= num; - } - - public static Vector2 ReadVector2(IMessageReader reader) - { - var v1 = (float) reader.ReadUInt16() / (float) ushort.MaxValue; - var v2 = (float) reader.ReadUInt16() / (float) ushort.MaxValue; + if (SidGreaterThan(minSid, _lastSequenceId)) + { + return; + } - return new Vector2(XRange.Lerp(v1), YRange.Lerp(v2)); + _lastSequenceId = minSid; + _targetSyncPosition = position; + _targetSyncVelocity = Vector2.Zero; } } } \ No newline at end of file diff --git a/src/Impostor.Server/GameData/Objects/InnerPlayerControl.cs b/src/Impostor.Server/GameData/Objects/InnerPlayerControl.cs index 9111670..5da19a9 100644 --- a/src/Impostor.Server/GameData/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/GameData/Objects/InnerPlayerControl.cs @@ -2,6 +2,7 @@ using Impostor.Server.GameData.Objects.Components; using Impostor.Server.Games; using Impostor.Server.Net.Messages; +using Microsoft.Extensions.DependencyInjection; namespace Impostor.Server.GameData.Objects { @@ -9,13 +10,13 @@ namespace Impostor.Server.GameData.Objects { private readonly IGame _game; - public InnerPlayerControl(IGame game) + public InnerPlayerControl(IGame game, IServiceProvider serviceProvider) { _game = game; Components.Add(this); - Components.Add(new InnerPlayerPhysics()); - Components.Add(new InnerCustomNetworkTransform()); + Components.Add(ActivatorUtilities.CreateInstance(serviceProvider)); + Components.Add(ActivatorUtilities.CreateInstance(serviceProvider)); PlayerId = byte.MaxValue; } diff --git a/src/Impostor.Shared/Innersloth/FloatRange.cs b/src/Impostor.Shared/Innersloth/FloatRange.cs index 23c3ed4..fc68e2d 100644 --- a/src/Impostor.Shared/Innersloth/FloatRange.cs +++ b/src/Impostor.Shared/Innersloth/FloatRange.cs @@ -13,6 +13,10 @@ namespace Impostor.Shared.Innersloth _max = max; } - public float Lerp(float v) => Mathf.Lerp(this._min, this._max, v); + public float Width => _max - _min; + + public float Lerp(float v) => Mathf.Lerp(_min, _max, v); + + public float ReverseLerp(float t) => Mathf.Clamp((t - _min) / Width, 0.0f, 1f); } } \ No newline at end of file diff --git a/src/Impostor.Shared/Unity/Mathf.cs b/src/Impostor.Shared/Unity/Mathf.cs index bc6b510..e608bbb 100644 --- a/src/Impostor.Shared/Unity/Mathf.cs +++ b/src/Impostor.Shared/Unity/Mathf.cs @@ -2,6 +2,24 @@ { public static class Mathf { + /// + /// Clamps the given value between the given minimum float and maximum float values. Returns the given value if it is within the min and max range. + /// + /// The floating point value to restrict inside the range defined by the min and max values. + /// The minimum floating point value to compare against. + /// The maximum floating point value to compare against. + /// + /// The float result between the min and max values. + /// + public static float Clamp(float value, float min, float max) + { + if ((double) value < (double) min) + value = min; + else if ((double) value > (double) max) + value = max; + return value; + } + /// /// Clamps value between 0 and 1 and returns value. /// -- 2.39.5