Construction of game server & player.

This commit is contained in:
MrOkiDoki 2023-08-18 01:43:23 +03:00
parent 2e6f6a3d94
commit 3b8a386f1d
4 changed files with 59 additions and 71 deletions

View File

@ -731,11 +731,9 @@ namespace BattleBitAPI.Server
} }
// ---- Static ---- // ---- Static ----
public static TGameServer CreateInstance<TGameServer>(Internal @internal) where TGameServer : GameServer<TPlayer> public static void SetInstance(GameServer<TPlayer> server, Internal @internal)
{ {
TGameServer gameServer = (TGameServer)Activator.CreateInstance(typeof(TGameServer)); server.mInternal = @internal;
gameServer.mInternal = @internal;
return gameServer;
} }
// ---- Internal ---- // ---- Internal ----

View File

@ -235,11 +235,9 @@ namespace BattleBitAPI
} }
// ---- Static ---- // ---- Static ----
public static TPlayer CreateInstance<TPlayer>(Player<TPlayer>.Internal @internal) where TPlayer : Player<TPlayer> public static void SetInstance(TPlayer player, Player<TPlayer>.Internal @internal)
{ {
TPlayer player = (TPlayer)Activator.CreateInstance(typeof(TPlayer));
player.mInternal = @internal; player.mInternal = @internal;
return player;
} }
// ---- Overrides ---- // ---- Overrides ----

View File

@ -1,6 +1,7 @@
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices;
using BattleBitAPI.Common; using BattleBitAPI.Common;
using BattleBitAPI.Common.Extentions; using BattleBitAPI.Common.Extentions;
using BattleBitAPI.Networking; using BattleBitAPI.Networking;
@ -80,7 +81,7 @@ namespace BattleBitAPI.Server
/// <remarks> /// <remarks>
/// GameServer: Game server that has been just created.<br/> /// GameServer: Game server that has been just created.<br/>
/// </remarks> /// </remarks>
public Func<GameServer<TPlayer>, Task> OnCreatingGameServerInstance { get; set; } public Func<TGameServer> OnCreatingGameServerInstance { get; set; }
/// <summary> /// <summary>
/// Fired when a new instance of player instance created. /// Fired when a new instance of player instance created.
@ -89,7 +90,7 @@ namespace BattleBitAPI.Server
/// <remarks> /// <remarks>
/// TPlayer: The player instance that was created<br/> /// TPlayer: The player instance that was created<br/>
/// </remarks> /// </remarks>
public Func<TPlayer, Task> OnCreatingPlayerInstance { get; set; } public Func<TPlayer> OnCreatingPlayerInstance { get; set; }
// --- Private --- // --- Private ---
private TcpListener mSocket; private TcpListener mSocket;
@ -381,7 +382,7 @@ namespace BattleBitAPI.Server
} }
var hash = ((ulong)gamePort << 32) | (ulong)ip.ToUInt(); var hash = ((ulong)gamePort << 32) | (ulong)ip.ToUInt();
server = this.mInstanceDatabase.GetServerInstance(hash, out bool isNew, out resources); server = this.mInstanceDatabase.GetServerInstance(hash, out resources, this.OnCreatingGameServerInstance);
resources.Set( resources.Set(
this.mExecutePackage, this.mExecutePackage,
this.mGetPlayerInternals, this.mGetPlayerInternals,
@ -555,7 +556,8 @@ namespace BattleBitAPI.Server
wearings.Read(readStream); wearings.Read(readStream);
} }
TPlayer player = mInstanceDatabase.GetPlayerInstance(steamid, out bool isNewClient, out var playerInternal);
TPlayer player = mInstanceDatabase.GetPlayerInstance(steamid, out var playerInternal, this.OnCreatingPlayerInstance);
playerInternal.SteamID = steamid; playerInternal.SteamID = steamid;
playerInternal.Name = username; playerInternal.Name = username;
playerInternal.IP = new IPAddress(ipHash); playerInternal.IP = new IPAddress(ipHash);
@ -580,25 +582,11 @@ namespace BattleBitAPI.Server
playerInternal._Modifications.Read(readStream); playerInternal._Modifications.Read(readStream);
} }
//Call new instance callback if needed.
if (isNewClient)
{
if (this.OnCreatingPlayerInstance != null)
this.OnCreatingPlayerInstance(player);
}
resources.AddPlayer(player); resources.AddPlayer(player);
} }
//Send accepted notification. //Send accepted notification.
networkStream.WriteByte((byte)NetworkCommuncation.Accepted); networkStream.WriteByte((byte)NetworkCommuncation.Accepted);
if (isNew)
{
if (this.OnCreatingGameServerInstance != null)
this.OnCreatingGameServerInstance(server);
}
} }
} }
} }
@ -716,7 +704,7 @@ namespace BattleBitAPI.Server
Squads squad = (Squads)stream.ReadInt8(); Squads squad = (Squads)stream.ReadInt8();
GameRole role = (GameRole)stream.ReadInt8(); GameRole role = (GameRole)stream.ReadInt8();
TPlayer player = mInstanceDatabase.GetPlayerInstance(steamID, out bool isNewClient, out var playerInternal); TPlayer player = mInstanceDatabase.GetPlayerInstance(steamID, out var playerInternal, this.OnCreatingPlayerInstance);
playerInternal.SteamID = steamID; playerInternal.SteamID = steamID;
playerInternal.Name = username; playerInternal.Name = username;
playerInternal.IP = new IPAddress(ip); playerInternal.IP = new IPAddress(ip);
@ -729,12 +717,6 @@ namespace BattleBitAPI.Server
//Start from default. //Start from default.
playerInternal._Modifications.Reset(); playerInternal._Modifications.Reset();
if (isNewClient)
{
if (this.OnCreatingPlayerInstance != null)
this.OnCreatingPlayerInstance(player);
}
resources.AddPlayer(player); resources.AddPlayer(player);
player.OnConnected(); player.OnConnected();
server.OnPlayerConnected(player); server.OnPlayerConnected(player);
@ -1299,42 +1281,52 @@ namespace BattleBitAPI.Server
this.mPlayerInstances = new Dictionary<ulong, (TPlayer, Player<TPlayer>.Internal)>(1024 * 16); this.mPlayerInstances = new Dictionary<ulong, (TPlayer, Player<TPlayer>.Internal)>(1024 * 16);
} }
public TGameServer GetServerInstance(ulong hash, out bool isNew, out GameServer<TPlayer>.Internal @internal) public TGameServer GetServerInstance(ulong hash, out GameServer<TPlayer>.Internal @internal, Func<TGameServer> createFunc)
{ {
lock (mGameServerInstances) lock (mGameServerInstances)
{ {
if (mGameServerInstances.TryGetValue(hash, out var data)) if (mGameServerInstances.TryGetValue(hash, out var data))
{ {
@internal = data.Item2; @internal = data.Item2;
isNew = false;
return data.Item1; return data.Item1;
} }
@internal = new GameServer<TPlayer>.Internal(); @internal = new GameServer<TPlayer>.Internal();
TGameServer gameServer = GameServer<TPlayer>.CreateInstance<TGameServer>(@internal); GameServer<TPlayer> server;
isNew = true; if (createFunc != null)
mGameServerInstances.Add(hash, (gameServer, @internal)); server = createFunc();
return gameServer; else
server = Activator.CreateInstance<GameServer<TPlayer>>();
GameServer<TPlayer>.SetInstance(server, @internal);
mGameServerInstances.Add(hash, ((TGameServer)server, @internal));
return (TGameServer)server;
} }
} }
public TPlayer GetPlayerInstance(ulong steamID, out bool isNew, out Player<TPlayer>.Internal @internal) public TPlayer GetPlayerInstance(ulong steamID, out Player<TPlayer>.Internal @internal, Func<TPlayer> createFunc)
{ {
lock (this.mPlayerInstances) lock (this.mPlayerInstances)
{ {
if (this.mPlayerInstances.TryGetValue(steamID, out var player)) if (this.mPlayerInstances.TryGetValue(steamID, out var player))
{ {
isNew = false;
@internal = player.Item2; @internal = player.Item2;
return player.Item1; return player.Item1;
} }
@internal = new Player<TPlayer>.Internal(); @internal = new Player<TPlayer>.Internal();
var pplayer = Player<TPlayer>.CreateInstance(@internal);
isNew = true; Player<TPlayer> pplayer;
mPlayerInstances.Add(steamID, (pplayer, @internal));
return pplayer; if (createFunc != null)
pplayer = createFunc();
else
pplayer = Activator.CreateInstance<TPlayer>();
Player<TPlayer>.SetInstance((TPlayer)pplayer, @internal);
mPlayerInstances.Add(steamID, ((TPlayer)pplayer, @internal));
return (TPlayer)pplayer;
} }
} }
public Player<TPlayer>.Internal GetPlayerInternals(ulong steamID) public Player<TPlayer>.Internal GetPlayerInternals(ulong steamID)

View File

@ -1,6 +1,7 @@
using BattleBitAPI; using BattleBitAPI;
using BattleBitAPI.Common; using BattleBitAPI.Common;
using BattleBitAPI.Server; using BattleBitAPI.Server;
using System.Linq.Expressions;
using System.Net; using System.Net;
using System.Numerics; using System.Numerics;
using System.Threading.Channels; using System.Threading.Channels;
@ -11,61 +12,59 @@ 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.OnCreatingGameServerInstance += OnCreatingGameServerInstance;
listener.OnValidateGameServerToken += OnValidateGameServerToken; listener.OnCreatingPlayerInstance += OnCreatingPlayerInstance;
listener.Start(29294); listener.Start(29294);
Thread.Sleep(-1); Thread.Sleep(-1);
} }
private static async Task<bool> OnValidateGameServerToken(IPAddress ip, ushort gameport, string sentToken) private static MyPlayer OnCreatingPlayerInstance()
{ {
return true; return new MyPlayer("asdasd");
await Console.Out.WriteLineAsync(ip + ":" + gameport + " sent " + sentToken);
return sentToken == "12345678910";
} }
private static async Task<bool> OnGameServerConnecting(IPAddress arg) private static MyGameServer OnCreatingGameServerInstance()
{ {
await Console.Out.WriteLineAsync(arg.ToString() + " connecting"); return new MyGameServer("mysecretDBpass");
return true;
} }
} }
class MyPlayer : Player<MyPlayer> class MyPlayer : Player<MyPlayer>
{ {
private string mydb;
public MyPlayer(string mydb)
{
this.mydb = mydb;
}
public override async Task OnSpawned() public override async Task OnSpawned()
{ {
} }
} }
class MyGameServer : GameServer<MyPlayer> class MyGameServer : GameServer<MyPlayer>
{ {
private string myDbConnection;
public MyGameServer(string mySecretDBConnection)
{
this.myDbConnection = mySecretDBConnection;
}
public override async Task OnConnected() public override async Task OnConnected()
{ {
ForceStartGame(); ForceStartGame();
ServerSettings.PlayerCollision = true; ServerSettings.PlayerCollision = true;
} }
public override async Task OnDisconnected()
{
await Console.Out.WriteLineAsync("Disconnected: " + this.TerminationReason);
}
public override async Task OnTick() public override async Task OnTick()
{ {
base.ServerSettings.PlayerCollision = true;
foreach (var item in AllPlayers)
item.Modifications.RespawnTime= 0f;
} }
public override async Task<OnPlayerSpawnArguments> OnPlayerSpawning(MyPlayer player, OnPlayerSpawnArguments request) public override async Task<OnPlayerSpawnArguments> OnPlayerSpawning(MyPlayer player, OnPlayerSpawnArguments request)
{ {
request.Wearings.Eye = "Eye Zombie 01"; request.Wearings.Eye = "Eye_Zombie_01";
request.Wearings.Face = "Face Zombie 01"; request.Wearings.Face = "Face_Zombie_01";
request.Wearings.Face = "Hair Zombie 01"; request.Wearings.Face = "Hair_Zombie_01";
request.Wearings.Skin = "Zombie 01"; request.Wearings.Skin = "Zombie_01";
request.Wearings.Uniform = "ANY NU Uniform Zombie 01"; request.Wearings.Uniform = "ANY_NU_Uniform_Zombie_01";
request.Wearings.Head = "ANV2 Universal Zombie Helmet 00 A Z"; request.Wearings.Head = "ANV2_Universal_Zombie_Helmet_00_A_Z";
request.Wearings.Belt = "ANV2_Universal_All_Belt_Null"; request.Wearings.Belt = "ANV2_Universal_All_Belt_Null";
request.Wearings.Backbag = "ANV2_Universal_All_Backpack_Null"; request.Wearings.Backbag = "ANV2_Universal_All_Backpack_Null";
request.Wearings.Chest = "ANV2_Universal_All_Armor_Null"; request.Wearings.Chest = "ANV2_Universal_All_Armor_Null";
@ -73,10 +72,11 @@ class MyGameServer : GameServer<MyPlayer>
return request; return request;
} }
public override async Task OnPlayerConnected(MyPlayer player) public override async Task OnPlayerConnected(MyPlayer player)
{ {
await Console.Out.WriteLineAsync("Connected: " + player); await Console.Out.WriteLineAsync("Connected: " + player);
player.Modifications.CanSpectate = true;
player.Modifications.CanDeploy = false;
} }
public override async Task OnPlayerSpawned(MyPlayer player) public override async Task OnPlayerSpawned(MyPlayer player)