non blocking implementation

This commit is contained in:
MrOkiDoki 2023-08-11 13:05:13 +03:00
parent b2d2872495
commit 40fa8aa623
12 changed files with 40 additions and 126 deletions

View File

@ -34,16 +34,14 @@ 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(bool isBlocking = true) public ServerListener()
{ {
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 ---
@ -546,10 +544,7 @@ namespace BattleBitAPI.Server
{ {
while (server.IsConnected) while (server.IsConnected)
{ {
if (this.mIsBlocking) server.OnTick();
await server.OnTick();
else
server.OnTick();
await server.Tick(); await server.Tick();
await Task.Delay(10); await Task.Delay(10);
@ -594,16 +589,8 @@ namespace BattleBitAPI.Server
player.Role = role; player.Role = role;
resources.AddPlayer(player); resources.AddPlayer(player);
if (this.mIsBlocking) server.OnPlayerConnected(player);
{ player.OnConnected();
await server.OnPlayerConnected(player);
await player.OnConnected();
}
else
{
server.OnPlayerConnected(player);
player.OnConnected();
}
} }
} }
break; break;
@ -620,16 +607,8 @@ namespace BattleBitAPI.Server
if (exist) if (exist)
{ {
if (this.mIsBlocking) server.OnPlayerDisconnected((TPlayer)player);
{ player.OnDisconnected();
await server.OnPlayerDisconnected((TPlayer)player);
await player.OnDisconnected();
}
else
{
server.OnPlayerDisconnected((TPlayer)player);
player.OnDisconnected();
}
} }
} }
break; break;
@ -646,16 +625,22 @@ namespace BattleBitAPI.Server
ChatChannel chat = (ChatChannel)stream.ReadInt8(); ChatChannel chat = (ChatChannel)stream.ReadInt8();
if (stream.TryReadString(out var msg)) if (stream.TryReadString(out var msg))
{ {
var pass = await server.OnPlayerTypedMessage((TPlayer)player, chat, msg); async Task Handle()
//Respond back.
using (var response = Common.Serialization.Stream.Get())
{ {
response.Write((byte)NetworkCommuncation.RespondPlayerMessage); var pass = await server.OnPlayerTypedMessage((TPlayer)player, chat, msg);
response.Write(messageID);
response.Write(pass); //Respond back.
server.WriteToSocket(response); using (var response = Common.Serialization.Stream.Get())
{
response.Write((byte)NetworkCommuncation.RespondPlayerMessage);
response.Write(messageID);
response.Write(pass);
server.WriteToSocket(response);
}
} }
Handle();
} }
} }
} }
@ -691,10 +676,7 @@ namespace BattleBitAPI.Server
KillerTool = tool, KillerTool = tool,
}; };
if (this.mIsBlocking) server.OnAPlayerKilledAnotherPlayer(args);
await server.OnAPlayerKilledAnotherPlayer(args);
else
server.OnAPlayerKilledAnotherPlayer(args);
} }
} }
} }
@ -722,10 +704,7 @@ namespace BattleBitAPI.Server
} }
} }
if (mIsBlocking) mHandle();
await mHandle();
else
mHandle();
} }
break; break;
} }
@ -737,10 +716,7 @@ namespace BattleBitAPI.Server
PlayerStats stats = new PlayerStats(); PlayerStats stats = new PlayerStats();
stats.Read(stream); stats.Read(stream);
if (mIsBlocking) server.OnSavePlayerStats(steamID, stats);
await server.OnSavePlayerStats(steamID, stats);
else
server.OnSavePlayerStats(steamID, stats);
} }
break; break;
} }
@ -760,10 +736,7 @@ namespace BattleBitAPI.Server
server.SetRoleTo(steamID, role); server.SetRoleTo(steamID, role);
} }
if (mIsBlocking) mHandle();
await mHandle();
else
mHandle();
} }
} }
break; break;
@ -778,10 +751,7 @@ namespace BattleBitAPI.Server
if (resources.TryGetPlayer(steamID, out var client)) if (resources.TryGetPlayer(steamID, out var client))
{ {
client.Role = role; client.Role = role;
if (mIsBlocking) server.OnPlayerChangedRole((TPlayer)client, role);
await server.OnPlayerChangedRole((TPlayer)client, role);
else
server.OnPlayerChangedRole((TPlayer)client, role);
} }
} }
break; break;
@ -796,10 +766,7 @@ namespace BattleBitAPI.Server
if (resources.TryGetPlayer(steamID, out var client)) if (resources.TryGetPlayer(steamID, out var client))
{ {
client.Squad = squad; client.Squad = squad;
if (mIsBlocking) server.OnPlayerJoinedSquad((TPlayer)client, squad);
await server.OnPlayerJoinedSquad((TPlayer)client, squad);
else
server.OnPlayerJoinedSquad((TPlayer)client, squad);
} }
} }
break; break;
@ -817,18 +784,9 @@ namespace BattleBitAPI.Server
client.Squad = Squads.NoSquad; client.Squad = Squads.NoSquad;
client.Role = GameRole.Assault; client.Role = GameRole.Assault;
if (mIsBlocking) server.OnPlayerLeftSquad((TPlayer)client, oldSquad);
{ if (oldRole != GameRole.Assault)
await server.OnPlayerLeftSquad((TPlayer)client, oldSquad); 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;
@ -843,10 +801,7 @@ namespace BattleBitAPI.Server
if (resources.TryGetPlayer(steamID, out var client)) if (resources.TryGetPlayer(steamID, out var client))
{ {
client.Team = team; client.Team = team;
if (mIsBlocking) server.OnPlayerChangeTeam((TPlayer)client, team);
await server.OnPlayerChangeTeam((TPlayer)client, team);
else
server.OnPlayerChangeTeam((TPlayer)client, team);
} }
} }
break; break;
@ -878,10 +833,7 @@ namespace BattleBitAPI.Server
} }
} }
if (mIsBlocking) mHandle();
await mHandle();
else
mHandle();
} }
} }
break; break;
@ -899,10 +851,7 @@ namespace BattleBitAPI.Server
{ {
if (resources.TryGetPlayer(reported, out var reportedClient)) if (resources.TryGetPlayer(reported, out var reportedClient))
{ {
if (mIsBlocking) server.OnPlayerReported((TPlayer)reporterClient, (TPlayer)reportedClient, reason, additionalInfo);
await server.OnPlayerReported((TPlayer)reporterClient, (TPlayer)reportedClient, reason, additionalInfo);
else
server.OnPlayerReported((TPlayer)reporterClient, (TPlayer)reportedClient, reason, additionalInfo);
} }
} }
} }
@ -925,16 +874,8 @@ namespace BattleBitAPI.Server
client.IsAlive = true; client.IsAlive = true;
if (mIsBlocking) client.OnSpawned();
{ server.OnPlayerSpawned((TPlayer)client);
await client.OnSpawned();
await server.OnPlayerSpawned((TPlayer)client);
}
else
{
client.OnSpawned();
server.OnPlayerSpawned((TPlayer)client);
}
} }
} }
break; break;
@ -950,16 +891,8 @@ namespace BattleBitAPI.Server
client.CurrentWearings = new PlayerWearings(); client.CurrentWearings = new PlayerWearings();
client.IsAlive = false; client.IsAlive = false;
if (mIsBlocking) client.OnDied();
{ server.OnPlayerDied((TPlayer)client);
await client.OnDied();
await server.OnPlayerDied((TPlayer)client);
}
else
{
client.OnDied();
server.OnPlayerDied((TPlayer)client);
}
} }
} }
break; break;

View File

@ -8,38 +8,19 @@ 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.OnGameServerConnecting += OnGameServerConnecting;
listener.Start(29294); listener.Start(29294);
Thread.Sleep(-1); Thread.Sleep(-1);
} }
private static async Task<bool> OnGameServerConnecting(IPAddress ip)
{
return true;
}
} }
class MyPlayer : Player<MyPlayer> class MyPlayer : Player<MyPlayer>
{ {
public override async Task OnSpawned()
{
}
} }
class MyGameServer : GameServer<MyPlayer> 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) public override async Task<bool> OnPlayerTypedMessage(MyPlayer player, ChatChannel channel, string msg)
{ {
return true;
} }
} }

View File

@ -1 +1 @@
8f0a13b55a78de27b4bd6f14afc4adfc26b55b80 41f5fea171d475c9035f62dd63d760ea2e513193