diff --git a/TanksServer/ClientScreenServer.cs b/TanksServer/ClientScreenServer.cs index 5821bf2..c9afccf 100644 --- a/TanksServer/ClientScreenServer.cs +++ b/TanksServer/ClientScreenServer.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using System.Diagnostics; using System.Net.WebSockets; +using System.Threading.Channels; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using TanksServer.Helpers; @@ -76,7 +77,14 @@ internal sealed class ClientScreenServer( if (await _wantedFrames.WaitAsync(TimeSpan.Zero)) { _logger.LogTrace("sending"); - await _channel.Writer.WriteAsync(buf.Data); + try + { + await _channel.Writer.WriteAsync(buf.Data); + } + catch (ChannelClosedException) + { + _logger.LogWarning("send failed, channel is closed"); + } } else { @@ -86,11 +94,9 @@ internal sealed class ClientScreenServer( private async Task ReceiveAsync() { - await foreach (var _ in _channel.Reader.ReadAllAsync()) - { + await foreach (var _ in _channel.Reader.ReadAllAsync()) _wantedFrames.Release(); - } - + _logger.LogTrace("done receiving"); _server.Remove(this); } diff --git a/TanksServer/Models/FloatPosition.cs b/TanksServer/Models/FloatPosition.cs index 8a5c64d..fb0167a 100644 --- a/TanksServer/Models/FloatPosition.cs +++ b/TanksServer/Models/FloatPosition.cs @@ -1,3 +1,8 @@ +using TanksServer.Services; + namespace TanksServer.Models; -internal record struct FloatPosition(double X, double Y); +internal readonly record struct FloatPosition(double X, double Y) +{ + public PixelPosition ToPixelPosition() => new((int)X % MapService.PixelsPerRow, (int)Y % MapService.PixelsPerRow); +} diff --git a/TanksServer/Models/Tank.cs b/TanksServer/Models/Tank.cs index ecf6d8a..8fdb1dc 100644 --- a/TanksServer/Models/Tank.cs +++ b/TanksServer/Models/Tank.cs @@ -3,13 +3,16 @@ namespace TanksServer.Models; internal sealed class Tank(Player player, FloatPosition spawnPosition) { private double _rotation; - + public Player Owner { get; } = player; + /// + /// Bounds: 0 (inclusive) .. 16 (exclusive) + /// public double Rotation { get => _rotation; - set => _rotation = value % 16d; + set => _rotation = (value + 16d) % 16d; } public FloatPosition Position { get; set; } = spawnPosition; diff --git a/TanksServer/Services/PixelDrawer.cs b/TanksServer/Services/PixelDrawer.cs index 17631cc..bb6a6d1 100644 --- a/TanksServer/Services/PixelDrawer.cs +++ b/TanksServer/Services/PixelDrawer.cs @@ -75,7 +75,7 @@ internal sealed class PixelDrawer : ITickStep { foreach (var tank in _tanks) { - var pos = new PixelPosition((int)tank.Position.X, (int)tank.Position.Y); + var pos = tank.Position.ToPixelPosition(); var rotationVariant = (int)Math.Floor(tank.Rotation); for (var dy = 0; dy < MapService.TileSize; dy++) { @@ -83,9 +83,11 @@ internal sealed class PixelDrawer : ITickStep for (var dx = 0; dx < MapService.TileSize; dx++) { + if (!TankSpriteAt(dx, dy, rotationVariant)) + continue; + var i = rowStartIndex + pos.X + dx; - if (TankSpriteAt(dx, dy, rotationVariant)) - buf.Pixels[i] = true; + buf.Pixels[i] = true; } } } diff --git a/TanksServer/Services/TankManager.cs b/TanksServer/Services/TankManager.cs index 9b08ca2..96e6429 100644 --- a/TanksServer/Services/TankManager.cs +++ b/TanksServer/Services/TankManager.cs @@ -6,7 +6,7 @@ using TanksServer.Models; namespace TanksServer.Services; -internal sealed class TankManager(ILogger logger, IOptions options) +internal sealed class TankManager(ILogger logger, IOptions options, MapService map) : ITickStep, IEnumerable { private readonly ConcurrentBag _tanks = new(); @@ -33,38 +33,51 @@ internal sealed class TankManager(ILogger logger, IOptions GetEnumerator(); public IEnumerator GetEnumerator() => _tanks.GetEnumerator(); } diff --git a/TanksServer/appsettings.json b/TanksServer/appsettings.json index f95f3c0..11c1499 100644 --- a/TanksServer/appsettings.json +++ b/TanksServer/appsettings.json @@ -3,7 +3,7 @@ "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", - "TanksServer": "Trace" + "TanksServer": "Debug" } }, "AllowedHosts": "*",