2024-04-10 19:25:45 +02:00
|
|
|
namespace TanksServer.GameLogic;
|
2024-04-07 19:52:16 +02:00
|
|
|
|
|
|
|
internal sealed class ShootFromTanks(
|
2024-04-09 22:38:56 +02:00
|
|
|
TankManager tanks,
|
|
|
|
IOptions<TanksConfiguration> options,
|
|
|
|
BulletManager bulletManager
|
2024-04-07 19:52:16 +02:00
|
|
|
) : ITickStep
|
|
|
|
{
|
|
|
|
private readonly TanksConfiguration _config = options.Value;
|
|
|
|
|
|
|
|
public Task TickAsync()
|
|
|
|
{
|
|
|
|
foreach (var tank in tanks.Where(t => !t.Moved))
|
|
|
|
Shoot(tank);
|
|
|
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void Shoot(Tank tank)
|
|
|
|
{
|
|
|
|
if (!tank.Owner.Controls.Shoot)
|
|
|
|
return;
|
|
|
|
if (tank.NextShotAfter >= DateTime.Now)
|
|
|
|
return;
|
|
|
|
|
|
|
|
tank.NextShotAfter = DateTime.Now.AddMilliseconds(_config.ShootDelayMs);
|
|
|
|
|
2024-04-12 18:32:10 +02:00
|
|
|
var angle = tank.Rotation * 2 * Math.PI;
|
2024-04-07 19:52:16 +02:00
|
|
|
var position = new FloatPosition(
|
2024-04-12 18:32:10 +02:00
|
|
|
x: tank.Position.X + MapService.TileSize / 2d + Math.Sin(angle) * _config.BulletSpeed,
|
|
|
|
y: tank.Position.Y + MapService.TileSize / 2d - Math.Cos(angle) * _config.BulletSpeed
|
2024-04-07 19:52:16 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
bulletManager.Spawn(new Bullet(tank.Owner, position, tank.Rotation));
|
|
|
|
}
|
2024-04-09 22:38:56 +02:00
|
|
|
}
|