servicepoint-tanks/tanks-backend/TanksServer/Interactivity/ControlsServerConnection.cs

66 lines
1.7 KiB
C#
Raw Normal View History

2024-04-21 23:00:44 +02:00
using System.Net.WebSockets;
namespace TanksServer.Interactivity;
internal sealed class ControlsServerConnection(
WebSocket socket,
ILogger<ControlsServerConnection> logger,
Player player
) : WebsocketServerConnection(logger, new ByteChannelWebSocket(socket, logger, 2))
2024-04-21 23:00:44 +02:00
{
private enum MessageType : byte
{
Enable = 0x01,
Disable = 0x02
}
private enum InputType : byte
{
Forward = 0x01,
Backward = 0x02,
Left = 0x03,
Right = 0x04,
Shoot = 0x05
}
2024-04-28 15:34:32 +02:00
protected override ValueTask HandleMessageLockedAsync(Memory<byte> buffer)
{
var type = (MessageType)buffer.Span[0];
var control = (InputType)buffer.Span[1];
Logger.LogTrace("player input {} {} {}", player.Name, type, control);
var isEnable = type switch
{
MessageType.Enable => true,
MessageType.Disable => false,
_ => throw new ArgumentException("invalid message type")
};
player.LastInput = DateTime.Now;
switch (control)
{
case InputType.Forward:
player.Controls.Forward = isEnable;
break;
case InputType.Backward:
player.Controls.Backward = isEnable;
break;
case InputType.Left:
player.Controls.TurnLeft = isEnable;
break;
case InputType.Right:
player.Controls.TurnRight = isEnable;
break;
case InputType.Shoot:
player.Controls.Shoot = isEnable;
break;
default:
throw new ArgumentException("invalid control type");
}
2024-04-22 19:03:07 +02:00
return ValueTask.CompletedTask;
}
2024-04-21 23:00:44 +02:00
}