Files
Nitrox/NitroxServer/Communication/LiteNetLib/LiteNetLibConnection.cs
2025-07-06 00:23:46 +02:00

80 lines
1.9 KiB
C#

using System;
using System.Net;
using LiteNetLib;
using LiteNetLib.Utils;
using NitroxModel.Networking;
using NitroxModel.Packets;
namespace NitroxServer.Communication.LiteNetLib;
public class LiteNetLibConnection : INitroxConnection, IEquatable<LiteNetLibConnection>
{
private readonly NetDataWriter dataWriter = new();
private readonly NetPeer peer;
public IPEndPoint Endpoint => peer;
public NitroxConnectionState State => peer.ConnectionState.ToNitrox();
public LiteNetLibConnection(NetPeer peer)
{
this.peer = peer;
}
public void SendPacket(Packet packet)
{
if (peer.ConnectionState == ConnectionState.Connected)
{
byte[] packetData = packet.Serialize();
dataWriter.Reset();
dataWriter.Put(packetData.Length);
dataWriter.Put(packetData);
peer.Send(dataWriter, (byte)packet.UdpChannel, NitroxDeliveryMethod.ToLiteNetLib(packet.DeliveryMethod));
}
else
{
Log.Warn($"Cannot send packet {packet?.GetType()} to a closed connection {peer as IPEndPoint}");
}
}
public static bool operator ==(LiteNetLibConnection left, LiteNetLibConnection right)
{
return Equals(left, right);
}
public static bool operator !=(LiteNetLibConnection left, LiteNetLibConnection right)
{
return !Equals(left, right);
}
public override bool Equals(object obj)
{
if (obj is null)
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
if (obj.GetType() != GetType())
{
return false;
}
return Equals((LiteNetLibConnection)obj);
}
public override int GetHashCode()
{
return peer?.Id.GetHashCode() ?? 0;
}
public bool Equals(LiteNetLibConnection other)
{
return peer?.Id == other?.peer?.Id;
}
}