Non blocking

This commit is contained in:
MrOkiDoki 2023-08-11 12:34:11 +03:00
parent 1326cd85e4
commit b2d2872495
17 changed files with 196 additions and 105 deletions

View File

@ -0,0 +1,50 @@
using System.Numerics;
namespace BattleBitAPI.Common
{
public struct OnPlayerSpawnArguments
{
public PlayerSpawningPosition RequestedPoint;
public PlayerLoadout Loadout;
public PlayerWearings Wearings;
public Vector3 SpawnPosition;
public Vector3 LookDirection;
public PlayerStand SpawnStand;
public float SpawnProtection;
public void Write(Common.Serialization.Stream ser)
{
ser.Write((byte)RequestedPoint);
Loadout.Write(ser);
Wearings.Write(ser);
ser.Write(SpawnPosition.X);
ser.Write(SpawnPosition.Y);
ser.Write(SpawnPosition.Z);
ser.Write(LookDirection.X);
ser.Write(LookDirection.Y);
ser.Write(LookDirection.Z);
ser.Write((byte)SpawnStand);
ser.Write(SpawnProtection);
}
public void Read(Common.Serialization.Stream ser)
{
RequestedPoint = (PlayerSpawningPosition)ser.ReadInt8();
Loadout.Read(ser);
Wearings.Read(ser);
SpawnPosition = new Vector3()
{
X = ser.ReadFloat(),
Y = ser.ReadFloat(),
Z = ser.ReadFloat()
};
LookDirection = new Vector3()
{
X = ser.ReadFloat(),
Y = ser.ReadFloat(),
Z = ser.ReadFloat()
};
SpawnStand = (PlayerStand)ser.ReadInt8();
SpawnProtection = ser.ReadFloat();
}
}
}

View File

@ -1,50 +0,0 @@
using System.Numerics;
namespace BattleBitAPI.Common
{
public struct PlayerSpawnRequest
{
public PlayerSpawningPosition RequestedPoint;
public PlayerLoadout Loadout;
public PlayerWearings Wearings;
public Vector3 SpawnPosition;
public Vector3 LookDirection;
public PlayerStand SpawnStand;
public float SpawnProtection;
public void Write(Common.Serialization.Stream ser)
{
ser.Write((byte)this.RequestedPoint);
this.Loadout.Write(ser);
this.Wearings.Write(ser);
ser.Write(this.SpawnPosition.X);
ser.Write(this.SpawnPosition.Y);
ser.Write(this.SpawnPosition.Z);
ser.Write(this.LookDirection.X);
ser.Write(this.LookDirection.Y);
ser.Write(this.LookDirection.Z);
ser.Write((byte)this.SpawnStand);
ser.Write(this.SpawnProtection);
}
public void Read(Common.Serialization.Stream ser)
{
this.RequestedPoint = (PlayerSpawningPosition)ser.ReadInt8();
this.Loadout.Read(ser);
this.Wearings.Read(ser);
this.SpawnPosition = new Vector3()
{
X = ser.ReadFloat(),
Y = ser.ReadFloat(),
Z = ser.ReadFloat()
};
this.LookDirection = new Vector3()
{
X = ser.ReadFloat(),
Y = ser.ReadFloat(),
Z = ser.ReadFloat()
};
this.SpawnStand = (PlayerStand)ser.ReadInt8();
this.SpawnProtection = ser.ReadFloat();
}
}
}

View File

@ -1,7 +1,6 @@
using System.Net;
using System.Net.Sockets;
using System.Numerics;
using System.Resources;
using System.Text;
using BattleBitAPI.Common;
using BattleBitAPI.Common.Extentions;
@ -259,7 +258,7 @@ namespace BattleBitAPI.Server
{
}
public virtual async Task<PlayerSpawnRequest> OnPlayerSpawning(TPlayer player, PlayerSpawnRequest request)
public virtual async Task<OnPlayerSpawnArguments> OnPlayerSpawning(TPlayer player, OnPlayerSpawnArguments request)
{
return request;
}
@ -423,7 +422,7 @@ namespace BattleBitAPI.Server
}
public void SpawnPlayer(ulong steamID, PlayerLoadout loadout, PlayerWearings wearings, Vector3 position, Vector3 lookDirection, PlayerStand stand, float spawnProtection)
{
var request = new PlayerSpawnRequest()
var request = new OnPlayerSpawnArguments()
{
Loadout = loadout,
Wearings = wearings,

View File

@ -34,14 +34,16 @@ namespace BattleBitAPI.Server
// --- Private ---
private TcpListener mSocket;
private bool mIsBlocking;
private Dictionary<ulong, (TGameServer server, GameServer<TPlayer>.Internal resources)> mActiveConnections;
private mInstances<TPlayer, TGameServer> mInstanceDatabase;
// --- Construction ---
public ServerListener()
public ServerListener(bool isBlocking = true)
{
this.mActiveConnections = new Dictionary<ulong, (TGameServer, GameServer<TPlayer>.Internal)>(16);
this.mInstanceDatabase = new mInstances<TPlayer, TGameServer>();
this.mIsBlocking = isBlocking;
}
// --- Starting ---
@ -544,7 +546,11 @@ namespace BattleBitAPI.Server
{
while (server.IsConnected)
{
await server.OnTick();
if (this.mIsBlocking)
await server.OnTick();
else
server.OnTick();
await server.Tick();
await Task.Delay(10);
}
@ -588,8 +594,16 @@ namespace BattleBitAPI.Server
player.Role = role;
resources.AddPlayer(player);
await server.OnPlayerConnected(player);
await player.OnConnected();
if (this.mIsBlocking)
{
await server.OnPlayerConnected(player);
await player.OnConnected();
}
else
{
server.OnPlayerConnected(player);
player.OnConnected();
}
}
}
break;
@ -606,8 +620,16 @@ namespace BattleBitAPI.Server
if (exist)
{
await server.OnPlayerDisconnected((TPlayer)player);
await player.OnDisconnected();
if (this.mIsBlocking)
{
await server.OnPlayerDisconnected((TPlayer)player);
await player.OnDisconnected();
}
else
{
server.OnPlayerDisconnected((TPlayer)player);
player.OnDisconnected();
}
}
}
break;
@ -668,7 +690,11 @@ namespace BattleBitAPI.Server
SourceOfDamage = source,
KillerTool = tool,
};
await server.OnAPlayerKilledAnotherPlayer(args);
if (this.mIsBlocking)
await server.OnAPlayerKilledAnotherPlayer(args);
else
server.OnAPlayerKilledAnotherPlayer(args);
}
}
}
@ -681,18 +707,25 @@ namespace BattleBitAPI.Server
if (stream.CanRead(8 + 2))
{
ulong steamID = stream.ReadUInt64();
var stats = new PlayerStats();
stats.Read(stream);
stats = await server.OnGetPlayerStats(steamID, stats);
using (var response = Common.Serialization.Stream.Get())
async Task mHandle()
{
response.Write((byte)NetworkCommuncation.SendPlayerStats);
response.Write(steamID);
stats.Write(response);
server.WriteToSocket(response);
stats = await server.OnGetPlayerStats(steamID, stats);
using (var response = Common.Serialization.Stream.Get())
{
response.Write((byte)NetworkCommuncation.SendPlayerStats);
response.Write(steamID);
stats.Write(response);
server.WriteToSocket(response);
}
}
if (mIsBlocking)
await mHandle();
else
mHandle();
}
break;
}
@ -704,7 +737,10 @@ namespace BattleBitAPI.Server
PlayerStats stats = new PlayerStats();
stats.Read(stream);
await server.OnSavePlayerStats(steamID, stats);
if (mIsBlocking)
await server.OnSavePlayerStats(steamID, stats);
else
server.OnSavePlayerStats(steamID, stats);
}
break;
}
@ -717,12 +753,17 @@ namespace BattleBitAPI.Server
if (resources.TryGetPlayer(steamID, out var client))
{
bool accepted = true;
async Task mHandle()
{
bool accepted = await server.OnPlayerRequestingToChangeRole((TPlayer)client, role);
if (accepted)
server.SetRoleTo(steamID, role);
}
accepted = await server.OnPlayerRequestingToChangeRole((TPlayer)client, role);
if (accepted)
server.SetRoleTo(steamID, role);
if (mIsBlocking)
await mHandle();
else
mHandle();
}
}
break;
@ -737,7 +778,10 @@ namespace BattleBitAPI.Server
if (resources.TryGetPlayer(steamID, out var client))
{
client.Role = role;
await server.OnPlayerChangedRole((TPlayer)client, role);
if (mIsBlocking)
await server.OnPlayerChangedRole((TPlayer)client, role);
else
server.OnPlayerChangedRole((TPlayer)client, role);
}
}
break;
@ -752,7 +796,10 @@ namespace BattleBitAPI.Server
if (resources.TryGetPlayer(steamID, out var client))
{
client.Squad = squad;
await server.OnPlayerJoinedSquad((TPlayer)client, squad);
if (mIsBlocking)
await server.OnPlayerJoinedSquad((TPlayer)client, squad);
else
server.OnPlayerJoinedSquad((TPlayer)client, squad);
}
}
break;
@ -770,10 +817,18 @@ namespace BattleBitAPI.Server
client.Squad = Squads.NoSquad;
client.Role = GameRole.Assault;
await server.OnPlayerLeftSquad((TPlayer)client, oldSquad);
if (oldRole != GameRole.Assault)
await server.OnPlayerChangedRole((TPlayer)client, GameRole.Assault);
if (mIsBlocking)
{
await server.OnPlayerLeftSquad((TPlayer)client, oldSquad);
if (oldRole != GameRole.Assault)
await server.OnPlayerChangedRole((TPlayer)client, GameRole.Assault);
}
else
{
server.OnPlayerLeftSquad((TPlayer)client, oldSquad);
if (oldRole != GameRole.Assault)
server.OnPlayerChangedRole((TPlayer)client, GameRole.Assault);
}
}
}
break;
@ -788,7 +843,10 @@ namespace BattleBitAPI.Server
if (resources.TryGetPlayer(steamID, out var client))
{
client.Team = team;
await server.OnPlayerChangeTeam((TPlayer)client, team);
if (mIsBlocking)
await server.OnPlayerChangeTeam((TPlayer)client, team);
else
server.OnPlayerChangeTeam((TPlayer)client, team);
}
}
break;
@ -799,21 +857,31 @@ namespace BattleBitAPI.Server
{
ulong steamID = stream.ReadUInt64();
var request = new PlayerSpawnRequest();
var request = new OnPlayerSpawnArguments();
request.Read(stream);
ushort vehicleID = stream.ReadUInt16();
if (resources.TryGetPlayer(steamID, out var client))
request = await server.OnPlayerSpawning((TPlayer)client, request);
//Respond back.
using (var response = Common.Serialization.Stream.Get())
{
response.Write((byte)NetworkCommuncation.SpawnPlayer);
response.Write(steamID);
request.Write(response);
response.Write(vehicleID);
server.WriteToSocket(response);
async Task mHandle()
{
request = await server.OnPlayerSpawning((TPlayer)client, request);
//Respond back.
using (var response = Common.Serialization.Stream.Get())
{
response.Write((byte)NetworkCommuncation.SpawnPlayer);
response.Write(steamID);
request.Write(response);
response.Write(vehicleID);
server.WriteToSocket(response);
}
}
if (mIsBlocking)
await mHandle();
else
mHandle();
}
}
break;
@ -831,7 +899,10 @@ namespace BattleBitAPI.Server
{
if (resources.TryGetPlayer(reported, out var reportedClient))
{
await server.OnPlayerReported((TPlayer)reporterClient, (TPlayer)reportedClient, reason, additionalInfo);
if (mIsBlocking)
await server.OnPlayerReported((TPlayer)reporterClient, (TPlayer)reportedClient, reason, additionalInfo);
else
server.OnPlayerReported((TPlayer)reporterClient, (TPlayer)reportedClient, reason, additionalInfo);
}
}
}
@ -854,8 +925,16 @@ namespace BattleBitAPI.Server
client.IsAlive = true;
await client.OnSpawned();
await server.OnPlayerSpawned((TPlayer)client);
if (mIsBlocking)
{
await client.OnSpawned();
await server.OnPlayerSpawned((TPlayer)client);
}
else
{
client.OnSpawned();
server.OnPlayerSpawned((TPlayer)client);
}
}
}
break;
@ -871,9 +950,16 @@ namespace BattleBitAPI.Server
client.CurrentWearings = new PlayerWearings();
client.IsAlive = false;
await client.OnDied();
await server.OnPlayerDied((TPlayer)client);
if (mIsBlocking)
{
await client.OnDied();
await server.OnPlayerDied((TPlayer)client);
}
else
{
client.OnDied();
server.OnPlayerDied((TPlayer)client);
}
}
}
break;
@ -964,7 +1050,7 @@ namespace BattleBitAPI.Server
{
if (this.mPlayerInstances.TryGetValue(steamID, out var player))
return player;
player = Activator.CreateInstance<TPlayer>();
player.OnCreated();
mPlayerInstances.Add(steamID, player);

View File

@ -1,4 +1,5 @@
using BattleBitAPI;
using BattleBitAPI.Common;
using BattleBitAPI.Server;
using System.Net;
@ -7,8 +8,8 @@ class Program
static void Main(string[] args)
{
var listener = new ServerListener<MyPlayer, MyGameServer>();
listener.Start(29294);
listener.OnGameServerConnecting += OnGameServerConnecting;
listener.Start(29294);
Thread.Sleep(-1);
}
@ -18,22 +19,27 @@ class Program
return true;
}
}
class MyPlayer : Player<MyPlayer>
class MyPlayer : Player<MyPlayer>
{
public int NumberOfSpawns = 0;
public override async Task OnSpawned()
{
this.NumberOfSpawns++;
base.GameServer.CloseConnection();
await Console.Out.WriteLineAsync("Spawn: " + this.NumberOfSpawns);
}
}
class MyGameServer : GameServer<MyPlayer>
{
public override async Task OnConnected()
{
Console.WriteLine(base.GameIP + " connected");
}
public override async Task OnTick()
{
}
public override async Task<bool> OnPlayerTypedMessage(MyPlayer player, ChatChannel channel, string msg)
{
}
}