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;
using System.Net.Sockets; using System.Net.Sockets;
using System.Numerics; using System.Numerics;
using System.Resources;
using System.Text; using System.Text;
using BattleBitAPI.Common; using BattleBitAPI.Common;
using BattleBitAPI.Common.Extentions; 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; 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) 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, Loadout = loadout,
Wearings = wearings, Wearings = wearings,

View file

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

View file

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