Added UWorld

This commit is contained in:
AeonLucid
2022-01-09 21:21:18 +01:00
parent 29bd62cc9e
commit 49e6e0f6f8
10 changed files with 151 additions and 33 deletions
+11 -15
View File
@@ -1,4 +1,4 @@
using Prospect.Unreal.Net;
using Prospect.Unreal.Core;
using Serilog;
namespace Prospect.Server.Game;
@@ -10,9 +10,9 @@ internal static class Program
private static readonly ILogger Logger = Log.ForContext(typeof(Program));
private static readonly PeriodicTimer Tick = new PeriodicTimer(TimeSpan.FromSeconds(TickRate));
public static async Task Main(string[] args)
public static async Task Main()
{
Console.CancelKeyPress += (s, e) =>
Console.CancelKeyPress += (_, e) =>
{
Tick.Dispose();
e.Cancel = true;
@@ -26,22 +26,18 @@ internal static class Program
Logger.Information("Starting Prospect.Server.Game");
await using (var driver = new UIpNetDriver())
var worldUrl = new FUrl
{
driver.Init();
Map = "/Game/ThirdPersonCPP/Maps/ThirdPersonExampleMap"
};
await using (var world = new ProspectWorld(worldUrl))
{
world.Listen();
// Tick all components.
while (await Tick.WaitForNextTickAsync())
{
var deltaTime = TickRate;
driver.TickDispatch(deltaTime);
// driver.PostTickDispatch();
if (driver.ConnectionlessHandler != null)
{
driver.ConnectionlessHandler.Tick(deltaTime);
}
world.Tick(TickRate);
}
}
+11
View File
@@ -0,0 +1,11 @@
using Prospect.Unreal.Core;
using Prospect.Unreal.Runtime;
namespace Prospect.Server.Game;
public class ProspectWorld : UWorld
{
public ProspectWorld(FUrl url) : base(url)
{
}
}
-6
View File
@@ -1,6 +0,0 @@
namespace Prospect.Unreal.Core;
public class FURL
{
}
+14
View File
@@ -0,0 +1,14 @@
using System.Net;
namespace Prospect.Unreal.Core;
public class FUrl
{
public string Protocol { get; init; } = "unreal";
public IPAddress Host { get; init; } = IPAddress.Any;
public int Port { get; init; } = 7777;
public string Map { get; init; } = "GearStart";
public string RedirectUrl { get; init; } = string.Empty;
public List<string> Options { get; init; } = new List<string>();
public string Portal { get; init; } = string.Empty;
}
@@ -0,0 +1,22 @@
using System.Runtime.Serialization;
namespace Prospect.Unreal.Exceptions;
public class UnrealNetException : UnrealException
{
public UnrealNetException()
{
}
protected UnrealNetException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
public UnrealNetException(string? message) : base(message)
{
}
public UnrealNetException(string? message, Exception? innerException) : base(message, innerException)
{
}
}
+3 -3
View File
@@ -6,17 +6,17 @@ namespace Prospect.Unreal.Net;
public class UIpConnection : UNetConnection
{
public override void InitBase(UNetDriver inDriver, UdpClient inSocket, FURL inURL, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0)
public override void InitBase(UNetDriver inDriver, UdpClient inSocket, FUrl inURL, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0)
{
throw new NotImplementedException();
}
public override void InitRemoteConnection(UNetDriver inDriver, UdpClient inSocket, FURL inURL, IPEndPoint inRemoteAddr, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0)
public override void InitRemoteConnection(UNetDriver inDriver, UdpClient inSocket, FUrl inURL, IPEndPoint inRemoteAddr, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0)
{
throw new NotImplementedException();
}
public override void InitLocalConnection(UNetDriver inDriver, UdpClient inSocket, FURL inURL, EConnectionState inState,
public override void InitLocalConnection(UNetDriver inDriver, UdpClient inSocket, FUrl inURL, EConnectionState inState,
int inMaxPacket = 0, int inPacketOverhead = 0)
{
throw new NotImplementedException();
+4 -5
View File
@@ -11,9 +11,9 @@ public class UIpNetDriver : UNetDriver
private bool _isDisposed;
public UIpNetDriver()
public UIpNetDriver(IPAddress host, int port)
{
ServerIp = new IPEndPoint(IPAddress.Any, 7777);
ServerIp = new IPEndPoint(host, port);
Socket = new UdpClient(ServerIp);
ReceiveThread = new FReceiveThreadRunnable(this);
}
@@ -22,7 +22,7 @@ public class UIpNetDriver : UNetDriver
public UdpClient Socket { get; }
public FReceiveThreadRunnable ReceiveThread { get; }
public bool Init()
public override bool Init()
{
// Initialize connectionless packet handler.
InitConnectionlessHandler();
@@ -119,8 +119,7 @@ public class UIpNetDriver : UNetDriver
returnVal.InitSequence(clientSequence, serverSequence);
}
// TODO: World url
returnVal.InitRemoteConnection(this, Socket, null, address, EConnectionState.USOCK_Open);
returnVal.InitRemoteConnection(this, Socket, World != null ? World.Url : new FUrl(), address, EConnectionState.USOCK_Open);
// if (returnVal.Handler)
}
+3 -3
View File
@@ -9,9 +9,9 @@ public abstract class UNetConnection
public const int ReliableBuffer = 256;
public const int MaxPacketId = 16384;
public abstract void InitBase(UNetDriver inDriver, UdpClient inSocket, FURL inURL, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0);
public abstract void InitRemoteConnection(UNetDriver inDriver, UdpClient inSocket, FURL inURL, IPEndPoint inRemoteAddr, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0);
public abstract void InitLocalConnection(UNetDriver inDriver, UdpClient inSocket, FURL inURL, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0);
public abstract void InitBase(UNetDriver inDriver, UdpClient inSocket, FUrl inURL, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0);
public abstract void InitRemoteConnection(UNetDriver inDriver, UdpClient inSocket, FUrl inURL, IPEndPoint inRemoteAddr, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0);
public abstract void InitLocalConnection(UNetDriver inDriver, UdpClient inSocket, FUrl inURL, EConnectionState inState, int inMaxPacket = 0, int inPacketOverhead = 0);
public abstract void LowLevelSend(byte[] data, int countBits, FOutPacketTraits traits);
public abstract string LowLevelGetRemoteAddress(bool bAppendPort = false);
public abstract string LowLevelDescribe();
+26
View File
@@ -1,5 +1,6 @@
using System.Collections.Concurrent;
using System.Net;
using Prospect.Unreal.Runtime;
namespace Prospect.Unreal.Net;
@@ -12,6 +13,11 @@ public abstract class UNetDriver : IAsyncDisposable
MappedClientConnections = new ConcurrentDictionary<IPEndPoint, UNetConnection>();
}
/// <summary>
/// World this net driver is associated with
/// </summary>
public UWorld? World { get; private set; }
/// <summary>
/// Map of <see cref="IPEndPoint"/> to <see cref="UNetConnection"/>.
/// </summary>
@@ -38,6 +44,11 @@ public abstract class UNetDriver : IAsyncDisposable
ConnectionlessHandler.InitializeComponents();
}
public virtual bool Init()
{
throw new NotImplementedException();
}
public virtual void TickDispatch(float deltaTime)
{
_elapsedTime += deltaTime;
@@ -50,6 +61,21 @@ public abstract class UNetDriver : IAsyncDisposable
public abstract bool IsNetResourceValid();
public void SetWorld(UWorld? inWorld)
{
if (World != null)
{
World = null;
}
if (inWorld != null)
{
World = inWorld;
// TODO: AddInitialObjects?
}
}
public double GetElapsedTime()
{
return _elapsedTime;
+56
View File
@@ -0,0 +1,56 @@
using Prospect.Unreal.Core;
using Prospect.Unreal.Net;
using Serilog;
namespace Prospect.Unreal.Runtime;
public abstract class UWorld : IAsyncDisposable
{
private static readonly ILogger Logger = Log.ForContext<UWorld>();
public UWorld(FUrl url)
{
Url = url;
}
public FUrl Url { get; }
public UNetDriver? NetDriver { get; private set; }
public void Tick(float deltaTime)
{
if (NetDriver != null)
{
NetDriver.TickDispatch(deltaTime);
NetDriver.ConnectionlessHandler?.Tick(deltaTime);
}
}
public bool Listen()
{
if (NetDriver != null)
{
Logger.Error("NetDriver already exists");
return false;
}
NetDriver = new UIpNetDriver(Url.Host, Url.Port);
NetDriver.SetWorld(this);
if (!NetDriver.Init())
{
Logger.Error("Failed to listen");
NetDriver = null;
return false;
}
return true;
}
public async ValueTask DisposeAsync()
{
if (NetDriver != null)
{
await NetDriver.DisposeAsync();
}
}
}