using System.Diagnostics; using BSO.Net; namespace BSO.Server; /// /// Fake-Mitspieler zum Alleine-Testen: faehrt als "Bus" Kreise (20 m Radius, ~30 km/h) um die Stelle, an der der erste /// Spieler im Spiel ist. Entfernt sich der Spieler mehr als 300 m, zieht der Kreis zu ihm um. /// public class TestBot { const float Radius = 2000; // cm const float SpeedCm = 30 / 0.036f; // 30 km/h in cm/s const float Follow = 30000; // cm static readonly TimeSpan SendInterval = TimeSpan.FromMilliseconds(100); public int Id { get; } public string Name => "Testbot"; public PlayerState State { get; private set; } public bool HasState { get; private set; } readonly Stopwatch clock = Stopwatch.StartNew(); TimeSpan lastSend; float centerX, centerY, angle; bool hasCenter; public TestBot(int id) => Id = id; /// Bewegt den Bot weiter; true = neuer Zustand ist faellig (10x pro Sekunde). public bool Tick(IEnumerable players) { TimeSpan now = clock.Elapsed; if (now - lastSend < SendInterval) return false; float dt = (float)(now - lastSend).TotalSeconds; lastSend = now; PlayerState? target = players.Where(p => p.Mode != PlayerMode.Menu).Cast().FirstOrDefault(); if (target == null) return false; PlayerState t = target.Value; float dx = t.X - centerX, dy = t.Y - centerY; if (!hasCenter || dx * dx + dy * dy > Follow * Follow) { centerX = t.X; centerY = t.Y; hasCenter = true; GameServer.Log($"Testbot faehrt jetzt Kreise um {centerX / 100:0} / {centerY / 100:0} m"); } angle += SpeedCm / Radius * Math.Min(dt, 1); State = new PlayerState { Mode = PlayerMode.InBus, X = centerX + Radius * MathF.Cos(angle), Y = centerY + Radius * MathF.Sin(angle), Z = t.Z, Yaw = (angle * 180 / MathF.PI + 90) % 360, // Fahrtrichtung = Tangente Speed = SpeedCm }; HasState = true; return true; } }