wip
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
|
||||
using Ragon.Protocol;
|
||||
using Ragon.Server.Event;
|
||||
using Ragon.Server.Room;
|
||||
|
||||
namespace Ragon.Server.Entity;
|
||||
@@ -117,32 +118,37 @@ public class RagonEntity : IRagonEntity
|
||||
{
|
||||
buffer.WriteUShort(Type);
|
||||
buffer.WriteUShort(Id);
|
||||
|
||||
|
||||
if (StaticId != 0)
|
||||
buffer.WriteUShort(StaticId);
|
||||
|
||||
|
||||
buffer.WriteUShort(Owner.Connection.Id);
|
||||
buffer.WriteUShort(Payload.Size);
|
||||
|
||||
|
||||
Payload.Write(buffer);
|
||||
|
||||
|
||||
_state.Snapshot(buffer);
|
||||
}
|
||||
|
||||
public void ReplicateEvent(
|
||||
RagonRoomPlayer caller,
|
||||
RagonRoomPlayer invoker,
|
||||
RagonEvent evnt,
|
||||
RagonReplicationMode eventMode,
|
||||
RagonRoomPlayer targetPlayer
|
||||
)
|
||||
{
|
||||
if (Authority == RagonAuthority.OwnerOnly && invoker.Connection.Id != Owner.Connection.Id)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var room = Owner.Room;
|
||||
var buffer = room.Writer;
|
||||
|
||||
|
||||
buffer.Clear();
|
||||
buffer.WriteOperation(RagonOperation.REPLICATE_ENTITY_EVENT);
|
||||
buffer.WriteUShort(evnt.EventCode);
|
||||
buffer.WriteUShort(caller.Connection.Id);
|
||||
buffer.WriteUShort(invoker.Connection.Id);
|
||||
buffer.WriteByte((byte)eventMode);
|
||||
buffer.WriteUShort(Id);
|
||||
|
||||
@@ -153,21 +159,18 @@ public class RagonEntity : IRagonEntity
|
||||
}
|
||||
|
||||
public void ReplicateEvent(
|
||||
RagonRoomPlayer caller,
|
||||
RagonRoomPlayer invoker,
|
||||
RagonEvent evnt,
|
||||
RagonReplicationMode eventMode,
|
||||
RagonTarget targetMode
|
||||
)
|
||||
{
|
||||
if (Authority == RagonAuthority.OwnerOnly &&
|
||||
Owner.Connection.Id != caller.Connection.Id)
|
||||
if (Authority == RagonAuthority.OwnerOnly && invoker.Connection.Id != Owner.Connection.Id)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (eventMode == RagonReplicationMode.Buffered &&
|
||||
targetMode != RagonTarget.Owner &&
|
||||
_bufferedEvents.Count < _limitBufferedEvents)
|
||||
if (eventMode == RagonReplicationMode.Buffered && targetMode != RagonTarget.Owner && _bufferedEvents.Count < _limitBufferedEvents)
|
||||
{
|
||||
_bufferedEvents.Add(evnt);
|
||||
}
|
||||
@@ -178,7 +181,7 @@ public class RagonEntity : IRagonEntity
|
||||
buffer.Clear();
|
||||
buffer.WriteOperation(RagonOperation.REPLICATE_ENTITY_EVENT);
|
||||
buffer.WriteUShort(evnt.EventCode);
|
||||
buffer.WriteUShort(caller.Connection.Id);
|
||||
buffer.WriteUShort(invoker.Connection.Id);
|
||||
buffer.WriteByte((byte)eventMode);
|
||||
buffer.WriteUShort(Id);
|
||||
|
||||
@@ -206,7 +209,7 @@ public class RagonEntity : IRagonEntity
|
||||
{
|
||||
foreach (var roomPlayer in room.ReadyPlayersList)
|
||||
{
|
||||
if (roomPlayer.Connection.Id != caller.Connection.Id)
|
||||
if (roomPlayer.Connection.Id != invoker.Connection.Id)
|
||||
roomPlayer.Connection.Reliable.Send(sendData);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@
|
||||
using Ragon.Protocol;
|
||||
using Ragon.Server.Room;
|
||||
|
||||
namespace Ragon.Server.Entity;
|
||||
namespace Ragon.Server.Event;
|
||||
|
||||
public class RagonEvent
|
||||
{
|
||||
@@ -17,7 +17,6 @@
|
||||
using NLog;
|
||||
using Ragon.Protocol;
|
||||
using Ragon.Server.Lobby;
|
||||
using Ragon.Server.Plugin;
|
||||
using Ragon.Server.Plugin.Web;
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
using NLog;
|
||||
using Ragon.Protocol;
|
||||
using Ragon.Server.Entity;
|
||||
using Ragon.Server.Event;
|
||||
|
||||
namespace Ragon.Server.Handler;
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ public sealed class EntityOwnershipOperation : IRagonOperation
|
||||
|
||||
if (!room.Players.TryGetValue(playerPeerId, out var nextOwner))
|
||||
{
|
||||
_logger.Error($"Player not found with id {entityId}");
|
||||
_logger.Error($"Player not found with id {playerPeerId}");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
using Ragon.Protocol;
|
||||
|
||||
namespace Ragon.Server.Handler;
|
||||
|
||||
public class TimestampSyncOperation: IRagonOperation
|
||||
{
|
||||
public void Handle(RagonContext context, RagonBuffer reader, RagonBuffer writer)
|
||||
{
|
||||
var timestamp0 = reader.Read(32);
|
||||
var timestamp1 = reader.Read(32);
|
||||
var value = new DoubleToUInt() { Int0 = timestamp0, Int1 = timestamp1 };
|
||||
|
||||
context.RoomPlayer?.SetTimestamp(value.Double);
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
using Ragon.Protocol;
|
||||
|
||||
namespace Ragon.Server.IO;
|
||||
|
||||
public interface INetworkChannel
|
||||
|
||||
@@ -21,5 +21,7 @@ public interface INetworkServer
|
||||
public Executor Executor { get; }
|
||||
public void Stop();
|
||||
public void Update();
|
||||
public void BroadcastUnreliable(byte[] data);
|
||||
public void BroadcastReliable(byte[] data);
|
||||
public void Start(INetworkListener listener, NetworkConfiguration configuration);
|
||||
}
|
||||
@@ -87,6 +87,8 @@ public class RagonServer : IRagonServer, INetworkListener
|
||||
_handlers[(byte) RagonOperation.REPLICATE_ENTITY_STATE] = new EntityStateOperation();
|
||||
_handlers[(byte) RagonOperation.TRANSFER_ROOM_OWNERSHIP] = new EntityOwnershipOperation();
|
||||
_handlers[(byte) RagonOperation.TRANSFER_ENTITY_OWNERSHIP] = new EntityOwnershipOperation();
|
||||
_handlers[(byte)RagonOperation.REPLICATE_RAW_DATA] = new RoomDataOperation();
|
||||
_handlers[(byte)RagonOperation.TIMESTAMP_SYNCHRONIZATION] = new TimestampSyncOperation();
|
||||
|
||||
_logger.Trace($"Server Tick Rate: {_configuration.ServerTickRate}");
|
||||
}
|
||||
@@ -98,8 +100,10 @@ public class RagonServer : IRagonServer, INetworkListener
|
||||
{
|
||||
if (_timer.ElapsedMilliseconds > _tickRate)
|
||||
{
|
||||
_scheduler.Update(_timer.ElapsedMilliseconds / 1000.0f);
|
||||
_timer.Restart();
|
||||
_scheduler.Update(_timer.ElapsedMilliseconds / 1000.0f);
|
||||
|
||||
SendTimestamp();
|
||||
}
|
||||
|
||||
_executor.Update();
|
||||
@@ -158,7 +162,7 @@ public class RagonServer : IRagonServer, INetworkListener
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Trace($"Disconnected: {connection.Id}");
|
||||
_logger.Trace($"Disconnected without context: {connection.Id}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -190,7 +194,7 @@ public class RagonServer : IRagonServer, INetworkListener
|
||||
_writer.Clear();
|
||||
_reader.Clear();
|
||||
_reader.FromArray(data);
|
||||
|
||||
|
||||
var operation = _reader.ReadByte();
|
||||
_handlers[operation].Handle(context, _reader, _writer);
|
||||
}
|
||||
@@ -201,6 +205,23 @@ public class RagonServer : IRagonServer, INetworkListener
|
||||
}
|
||||
}
|
||||
|
||||
public void SendTimestamp()
|
||||
{
|
||||
var timestamp = RagonTime.CurrentTimestamp();
|
||||
var value = new DoubleToUInt
|
||||
{
|
||||
Double = timestamp,
|
||||
};
|
||||
|
||||
_writer.Clear();
|
||||
_writer.WriteOperation(RagonOperation.TIMESTAMP_SYNCHRONIZATION);
|
||||
_writer.Write(value.Int0, 32);
|
||||
_writer.Write(value.Int1, 32);
|
||||
|
||||
var sendData = _writer.ToArray();
|
||||
_server.BroadcastUnreliable(sendData);
|
||||
}
|
||||
|
||||
public IRagonOperation ResolveOperation(RagonOperation operation)
|
||||
{
|
||||
return _handlers[(byte)operation];
|
||||
|
||||
@@ -25,6 +25,7 @@ public class RagonRoomPlayer
|
||||
public string Id { get; }
|
||||
public string Name { get; }
|
||||
public bool IsLoaded { get; private set; }
|
||||
public double Timestamp { get; private set; }
|
||||
public RagonRoom Room { get; private set; }
|
||||
public RagonEntityCache Entities { get; private set; }
|
||||
|
||||
@@ -65,4 +66,9 @@ public class RagonRoomPlayer
|
||||
{
|
||||
IsLoaded = false;
|
||||
}
|
||||
|
||||
internal void SetTimestamp(double time)
|
||||
{
|
||||
Timestamp = time;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user