first commit

This commit is contained in:
2025-07-06 00:23:46 +02:00
commit 38f50c8819
1788 changed files with 112878 additions and 0 deletions

View File

@@ -0,0 +1,102 @@
using System;
using System.IO;
using System.IO.Pipes;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NitroxModel.Helper;
namespace NitroxServer_Subnautica.Communication;
/// <summary>
/// Exposes an IPC channel for other local processes to communicate with the server.
/// </summary>
public class IpcHost : IDisposable
{
private readonly CancellationTokenSource commandReadCancellation;
private readonly NamedPipeServerStream server = new($"Nitrox Server {NitroxEnvironment.CurrentProcessId}", PipeDirection.In, 1);
private IpcHost(CancellationTokenSource commandReadCancellation)
{
this.commandReadCancellation = commandReadCancellation;
}
public static IpcHost StartReadingCommands(Action<string> onCommandReceived, CancellationToken cancellationToken = default)
{
Log.Info("Starting IPC host for command input");
ArgumentNullException.ThrowIfNull(onCommandReceived);
IpcHost host = new(CancellationTokenSource.CreateLinkedTokenSource(cancellationToken));
Thread thread = new(async () =>
{
while (!cancellationToken.IsCancellationRequested)
{
try
{
string command = await host.ReadStringAsync(cancellationToken);
onCommandReceived(command);
}
catch (OperationCanceledException)
{
// ignored
}
}
});
thread.IsBackground = true;
thread.Start();
return host;
}
public async Task<string> ReadStringAsync(CancellationToken cancellationToken = default)
{
if (!await WaitForConnection())
{
return "";
}
try
{
byte[] sizeBytes = new byte[4];
await server.ReadExactlyAsync(sizeBytes, cancellationToken);
byte[] stringBytes = new byte[BitConverter.ToUInt32(sizeBytes)];
await server.ReadExactlyAsync(stringBytes, cancellationToken);
return Encoding.UTF8.GetString(stringBytes);
}
catch (Exception)
{
return "";
}
}
public void Dispose()
{
commandReadCancellation?.Cancel();
server.Dispose();
}
private async Task<bool> WaitForConnection()
{
if (server.IsConnected)
{
return true;
}
try
{
await server.WaitForConnectionAsync();
return true;
}
catch (IOException)
{
try
{
server.Disconnect();
}
catch (Exception)
{
// ignored
}
}
return false;
}
}

View File

@@ -0,0 +1,21 @@
using NitroxModel_Subnautica.Packets;
using NitroxServer.Communication.Packets.Processors.Abstract;
using NitroxServer.GameLogic;
namespace NitroxServer_Subnautica.Communication.Packets.Processors
{
class CyclopsDamagePointRepairedProcessor : AuthenticatedPacketProcessor<CyclopsDamagePointRepaired>
{
private readonly PlayerManager playerManager;
public CyclopsDamagePointRepairedProcessor(PlayerManager playerManager)
{
this.playerManager = playerManager;
}
public override void Process(CyclopsDamagePointRepaired packet, NitroxServer.Player simulatingPlayer)
{
playerManager.SendPacketToOtherPlayers(packet, simulatingPlayer);
}
}
}

View File

@@ -0,0 +1,26 @@
using NitroxModel_Subnautica.Packets;
using NitroxServer.Communication.Packets.Processors.Abstract;
using NitroxServer.GameLogic;
namespace NitroxServer_Subnautica.Communication.Packets.Processors
{
/// <summary>
/// This is the absolute damage state. The current simulation owner is the only one who sends this packet to the server
/// </summary>
public class CyclopsDamageProcessor : AuthenticatedPacketProcessor<CyclopsDamage>
{
private readonly PlayerManager playerManager;
public CyclopsDamageProcessor(PlayerManager playerManager)
{
this.playerManager = playerManager;
}
public override void Process(CyclopsDamage packet, NitroxServer.Player simulatingPlayer)
{
Log.Debug($"New cyclops damage from {simulatingPlayer.Id} {packet}");
playerManager.SendPacketToOtherPlayers(packet, simulatingPlayer);
}
}
}

View File

@@ -0,0 +1,21 @@
using NitroxModel_Subnautica.Packets;
using NitroxServer.Communication.Packets.Processors.Abstract;
using NitroxServer.GameLogic;
namespace NitroxServer_Subnautica.Communication.Packets.Processors
{
class CyclopsFireCreatedProcessor : AuthenticatedPacketProcessor<CyclopsFireCreated>
{
private readonly PlayerManager playerManager;
public CyclopsFireCreatedProcessor(PlayerManager playerManager)
{
this.playerManager = playerManager;
}
public override void Process(CyclopsFireCreated packet, NitroxServer.Player simulatingPlayer)
{
playerManager.SendPacketToOtherPlayers(packet, simulatingPlayer);
}
}
}