diff --git a/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.cs b/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.cs index 2361f0b..ac382c7 100644 --- a/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.cs +++ b/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.cs @@ -1,4 +1,5 @@ -// CS2WebSocketTelemetryPlugin.cs +// CS2MetaWebSocketPlugin.cs +// CounterStrikeSharp plugin that exposes ONLY metadata: current map + connected players. using System; using System.Collections.Concurrent; @@ -7,7 +8,6 @@ using System.IO; using System.Net; using System.Net.Security; using System.Net.Sockets; -using System.Numerics; using System.Reflection; using System.Security.Authentication; using System.Security.Cryptography; @@ -26,51 +26,71 @@ using Microsoft.Extensions.Logging; namespace WsTelemetry; [MinimumApiVersion(175)] -public class WebSocketTelemetryPlugin : BasePlugin +public class MetaWebSocketPlugin : BasePlugin { - public override string ModuleName => "WS Telemetry"; - public override string ModuleVersion => "1.7.0"; + public override string ModuleName => "WS Metadata"; + public override string ModuleVersion => "2.0.0"; public override string ModuleAuthor => "you + ChatGPT"; - public override string ModuleDescription => "WS(S)-Server: Spielerpositionen + Blickrichtung + Map + Nade Trajectories (Prediction + Backfill)"; + public override string ModuleDescription => "WS(S)-Server: Map + verbundene Spieler (reine Meta-Daten)"; - // --- Konfiguration --- - private volatile bool _enabled = false; - private volatile int _sendHz = 10; - private volatile string _mapName = ""; + // ------------- Config / State ------------- + private volatile bool _enabled = true; - // WS Bind-Info private volatile string _bindHost = "0.0.0.0"; - private volatile int _bindPort = 8081; + private volatile int _bindPort = 8081; private volatile string _bindPath = "/telemetry"; - private volatile bool _useTls = false; + private volatile bool _useTls = false; - // TLS Zertifikat (PFX) private volatile string _certPath = ""; private volatile string _certPassword = ""; private X509Certificate2? _serverCert; - // --- Server / Clients --- + private volatile string _mapName = ""; + private TcpListener? _listener; private CancellationTokenSource? _serverCts; private Task? _acceptTask; private volatile bool _serverRunning = false; - // --- Konfigurations-Laden --- - private const string ConfigFileName = "config.json"; + private readonly ConcurrentDictionary _clients = new(); + private int _clientSeq = 0; + private const string ConfigFileName = "config.json"; private sealed class Cfg { - public string? Url { get; set; } - public string? CertPath { get; set; } - public string? CertPassword { get; set; } - public int? SendHz { get; set; } - public bool? Predict { get; set; } - public int? PredPoints { get; set; } + public string? Url { get; set; } // ws[s]://host:port/path + public string? CertPath { get; set; } // PFX + public string? CertPassword { get; set; } // optional } - // Prediction-Optionen - private volatile bool _predictEnabled = true; - private volatile int _predPoints = 24; + private sealed class ClientState + { + public required TcpClient Tcp; + public required Stream Stream; // NetworkStream oder SslStream + public readonly object SendLock = new(); + public readonly CancellationTokenSource Cts = new(); + } + + // ------------- Helpers ------------- + private static long NowMs() => DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + + private void TrySafeInitialPush() + { + try + { + var mn = Server.MapName; // jetzt sicher, weil NextFrame/MapStart + if (!string.IsNullOrEmpty(mn)) + { + _mapName = mn!; + Broadcast(JsonSerializer.Serialize(new { type = "map", name = _mapName, t = NowMs() })); + } + SendFullPlayerList(); // nur hier oder aus Events heraus aufrufen + } + catch (Exception ex) + { + Logger.LogDebug($"[WS] Initial Push übersprungen: {ex.Message}"); + } + } private void LoadAndApplyConfig(bool generateIfMissing = true) { @@ -84,10 +104,7 @@ public class WebSocketTelemetryPlugin : BasePlugin { Url = $"{(_useTls ? "wss" : "ws")}://{_bindHost}:{_bindPort}{_bindPath}", CertPath = string.IsNullOrWhiteSpace(_certPath) ? "cert.pfx" : _certPath, - CertPassword = _certPassword, - SendHz = _sendHz, - Predict = _predictEnabled, - PredPoints = _predPoints + CertPassword = _certPassword }; var jsonEx = JsonSerializer.Serialize(example, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(path, jsonEx, Encoding.UTF8); @@ -101,12 +118,9 @@ public class WebSocketTelemetryPlugin : BasePlugin } var json = File.ReadAllText(path, Encoding.UTF8); - var cfg = JsonSerializer.Deserialize( - json, - new JsonSerializerOptions { PropertyNameCaseInsensitive = true } - ) ?? new Cfg(); + var cfg = JsonSerializer.Deserialize(json, + new JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? new Cfg(); - // URL anwenden if (!string.IsNullOrWhiteSpace(cfg.Url)) { if (Uri.TryCreate(cfg.Url, UriKind.Absolute, out var uri) && (uri.Scheme == "ws" || uri.Scheme == "wss")) @@ -123,13 +137,10 @@ public class WebSocketTelemetryPlugin : BasePlugin } } - // Zertifikat anwenden if (!string.IsNullOrWhiteSpace(cfg.CertPath)) { - _certPath = Path.IsPathRooted(cfg.CertPath) - ? cfg.CertPath - : Path.Combine(ModuleDirectory, cfg.CertPath); - _serverCert = null; // beim nächsten Start neu laden + _certPath = Path.IsPathRooted(cfg.CertPath) ? cfg.CertPath : Path.Combine(ModuleDirectory, cfg.CertPath); + _serverCert = null; } if (cfg.CertPassword != null) { @@ -137,14 +148,7 @@ public class WebSocketTelemetryPlugin : BasePlugin _serverCert = null; } - // Sendefrequenz - if (cfg.SendHz is int hz && hz >= 1 && hz <= 128) _sendHz = hz; - - // Prediction - if (cfg.Predict.HasValue) _predictEnabled = cfg.Predict.Value; - if (cfg.PredPoints is int pp && pp >= 8 && pp <= 64) _predPoints = pp; - - Logger.LogInformation($"[WS] Konfiguration geladen ({_bindHost}:{_bindPort}{_bindPath}, tls={_useTls}, hz={_sendHz}, predict={_predictEnabled}, predPoints={_predPoints})"); + Logger.LogInformation($"[WS] Konfiguration geladen ({_bindHost}:{_bindPort}{_bindPath}, tls={_useTls})"); } catch (Exception ex) { @@ -157,7 +161,6 @@ public class WebSocketTelemetryPlugin : BasePlugin try { var path = Path.Combine(ModuleDirectory, ConfigFileName); - var url = $"{(_useTls ? "wss" : "ws")}://{_bindHost}:{_bindPort}{_bindPath}"; var cp = _certPath; @@ -169,18 +172,9 @@ public class WebSocketTelemetryPlugin : BasePlugin cp = Path.GetRelativePath(ModuleDirectory, cp); } } - catch { /* not fatal */ } - - var cfg = new Cfg - { - Url = url, - CertPath = cp, - CertPassword = _certPassword, - SendHz = _sendHz, - Predict = _predictEnabled, - PredPoints = _predPoints - }; + catch { } + var cfg = new Cfg { Url = url, CertPath = cp, CertPassword = _certPassword }; var json = JsonSerializer.Serialize(cfg, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(path, json, Encoding.UTF8); Logger.LogInformation($"[WS] Konfiguration gespeichert: {path}"); @@ -191,278 +185,27 @@ public class WebSocketTelemetryPlugin : BasePlugin } } - private class ClientState - { - public required TcpClient Tcp; - public required Stream Stream; // NetworkStream oder SslStream - public readonly object SendLock = new(); - public readonly CancellationTokenSource Cts = new(); - } - - private readonly ConcurrentDictionary _clients = new(); - private int _clientSeq = 0; - - // --- Outgoing Queue --- - private readonly ConcurrentQueue _outbox = new(); - private readonly AutoResetEvent _sendSignal = new(false); - - // --- Tick / Sampling --- - private double _accumulator = 0.0; - private const double MaxFrameDt = 0.25; - private DateTime _lastTick = DateTime.UtcNow; - - // --- Stabiler Aim --- - private readonly ConcurrentDictionary _lastAimByPlayer = new(); - - private static long NowMs() => DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); - private static bool IsFinite(float v) => !(float.IsNaN(v) || float.IsInfinity(v)) && Math.Abs(v) < 1e6; - - private static float NormalizeYaw(float yaw) - { - yaw %= 360f; - if (yaw < 0) yaw += 360f; - return yaw; - } - private static float ClampPitch(float pitch) - { - if (pitch < -89f) pitch = -89f; - if (pitch > 89f) pitch = 89f; - return pitch; - } - - // ========================= - // Blickrichtung (Client-Kamera) - // ========================= - - private static bool IsAlive(dynamic pawn) - { - try { int ls = (int)pawn.LifeState; return ls == 0; } catch { } - try { return (bool)pawn.IsAlive; } catch { } - try { int hp = (int)pawn.Health; return hp > 0; } catch { } - return true; - } - - private static bool TryReadAngles(dynamic src, out float pitch, out float yaw, out float roll) - { - pitch = 0f; yaw = 0f; roll = 0f; - - // Kamera-/Aim-Winkel - try { var a = src.EyeAngles; pitch = (float)a.X; yaw = (float)a.Y; roll = (float)a.Z; if (IsFinite(pitch) && IsFinite(yaw)) return true; } catch { } - // Modell-/Knotenorientierung - try { var a = src.AbsRotation; pitch = (float)a.X; yaw = (float)a.Y; roll = (float)a.Z; if (IsFinite(pitch) && IsFinite(yaw)) return true; } catch { } - try { var a = src.ViewAngles; pitch = (float)a.X; yaw = (float)a.Y; roll = (float)a.Z; if (IsFinite(pitch) && IsFinite(yaw)) return true; } catch { } - try { pitch = (float)src.Pitch; yaw = (float)src.Yaw; roll = 0f; if (IsFinite(pitch) && IsFinite(yaw)) return true; } catch { } - - return false; - } - - private static bool TryGetAnglesFromSceneNode(dynamic root, out float pitch, out float yaw, out float roll) - { - pitch = 0f; yaw = 0f; roll = 0f; - - try - { - dynamic node = root?.GameSceneNode; - if (node != null) - { - try { var r = node.AbsRotation; pitch = (float)r.X; yaw = (float)r.Y; roll = (float)r.Z; if (IsFinite(pitch) && IsFinite(yaw)) return true; } catch { } - try { var tf = node.NodeToWorld; var a = tf.Angles; pitch = (float)a.X; yaw = (float)a.Y; roll = (float)a.Z; if (IsFinite(pitch) && IsFinite(yaw)) return true; } catch { } - } - try { var r = root.AbsRotation; pitch = (float)r.X; yaw = (float)r.Y; roll = (float)r.Z; if (IsFinite(pitch) && IsFinite(yaw)) return true; } catch { } - } - catch { } - - return false; - } - - private static dynamic? TryGetObserverTargetFromPawn(dynamic pawn) - { - try { var os = pawn.ObserverServices; var h = os?.m_hObserverTarget; var v = (h != null ? (h.Value ?? h) : null); if (v != null) return v; } catch { } - try { var h = pawn.m_hObserverTarget; var v = (h != null ? (h.Value ?? h) : null); if (v != null) return v; } catch { } - try { var h = pawn.m_hLastObserverTarget; var v = (h != null ? (h.Value ?? h) : null); if (v != null) return v; } catch { } - try { var v = pawn.ObserverTarget; if (v != null) return (v.Value ?? v); } catch { } - return null; - } - - private static dynamic? AsPawn(dynamic entity) - { - if (entity == null) return null; - try { var p = entity.PlayerPawn; if (p != null && p.IsValid) return p.Value ?? p; } catch { } - try { var p = entity.Pawn; if (p != null && p.IsValid) return p.Value ?? p; } catch { } - try { var _ = entity.EyeAngles; return entity; } catch { } - try { var _ = entity.AbsOrigin; return entity; } catch { } - return null; - } - - private static bool TryGetClientCameraPawn(CCSPlayerController ctrl, dynamic pawn, out dynamic camPawn) - { - camPawn = null; - try { if (pawn != null && IsAlive(pawn)) { camPawn = pawn; return true; } } catch { } - var tgtEnt = TryGetObserverTargetFromPawn(pawn); - var tgtPawn = AsPawn(tgtEnt); - if (tgtPawn != null) { camPawn = tgtPawn; return true; } - return false; - } - - private static bool TryGetViewAngles(CCSPlayerController ctrl, dynamic pawn, out float pitch, out float yaw, out float roll) - { - pitch = 0f; yaw = 0f; roll = 0f; - - dynamic camPawn; - if (TryGetClientCameraPawn(ctrl, pawn, out camPawn)) - { - try - { - var a = camPawn.EyeAngles; - pitch = (float)a.X; yaw = (float)a.Y; roll = (float)a.Z; - if (IsFinite(pitch) && IsFinite(yaw)) return true; - } - catch { } - - if (TryGetAnglesFromSceneNode(camPawn, out pitch, out yaw, out roll)) - return true; - - try - { - var r = camPawn.AbsRotation; - pitch = (float)r.X; yaw = (float)r.Y; roll = (float)r.Z; - if (IsFinite(pitch) && IsFinite(yaw)) return true; - } - catch { } - } - - if (TryReadAngles(pawn, out pitch, out yaw, out roll)) return true; - return TryReadAngles(ctrl, out pitch, out yaw, out roll); - } - - private (float pitch, float yaw) StoreAim(CCSPlayerController p, float pitch, float yaw) - { - var sid = p.AuthorizedSteamID?.SteamId64 ?? 0UL; - _lastAimByPlayer[sid] = (pitch, yaw); - return (pitch, yaw); - } - - private static bool IsTiny(float v) => MathF.Abs(v) <= 1e-5f; - private static bool IsTinyPair(float a, float b) => IsTiny(a) && IsTiny(b); - - private (float pitch, float yaw) GetStableAim(CCSPlayerController p, object pawnObj) - { - dynamic pawn = pawnObj; // intern weiterhin dynamisch arbeiten - float vp=0, vy=0, vr=0; - - if (TryGetViewAngles(p, pawn, out vp, out vy, out vr)) - { - vp = ClampPitch(vp); vy = NormalizeYaw(vy); - if (!IsTinyPair(vp, vy)) - return StoreAim(p, vp, vy); - } - - try - { - dynamic a = pawn?.EyeAngles; - float px = (float)a.X, py = (float)a.Y; - if (IsFinite(px) && IsFinite(py)) - { - px = ClampPitch(px); py = NormalizeYaw(py); - if (!IsTinyPair(px, py)) - return StoreAim(p, px, py); - } - } - catch { } - - try - { - dynamic r = pawn?.AbsRotation; - float ryaw = (float)r.Y; - if (IsFinite(ryaw) && !IsTiny(ryaw)) - { - var sid = p.AuthorizedSteamID?.SteamId64 ?? 0UL; - float pitch = _lastAimByPlayer.TryGetValue(sid, out var last) ? last.pitch : 0f; - return StoreAim(p, pitch, NormalizeYaw(ryaw)); - } - } - catch { } - - try - { - var vel = pawn?.AbsVelocity; - float vx = (float)vel.X, vy2 = (float)vel.Y; - float sp = MathF.Sqrt(vx * vx + vy2 * vy2); - if (sp > 1f) - { - float vyaw = NormalizeYaw(MathF.Atan2(vy2, vx) * 180f / MathF.PI); - var sid = p.AuthorizedSteamID?.SteamId64 ?? 0UL; - float pitch = _lastAimByPlayer.TryGetValue(sid, out var last) ? last.pitch : 0f; - return StoreAim(p, pitch, vyaw); - } - } - catch { } - - { - var sid = p.AuthorizedSteamID?.SteamId64 ?? 0UL; - if (_lastAimByPlayer.TryGetValue(sid, out var last)) return last; - return (0f, 0f); - } - } - - private static (float pitch, float yaw, float roll) ReadEyeAngles(dynamic pawn) - { - try - { - var ea = pawn?.EyeAngles; - float pitch = (float)ea.X; - float yaw = (float)ea.Y; - float roll = (float)ea.Z; - - if (IsFinite(pitch) && IsFinite(yaw)) - return (ClampPitch(pitch), NormalizeYaw(yaw), roll); - } - catch { } - return (0f, 0f, 0f); - } - - private static bool TryGetEyePosition(dynamic pawn, out Vector3 eye) - { - // Beste Schätzungen - try { var v = pawn?.EyePosition; eye = new Vector3((float)v.X, (float)v.Y, (float)v.Z); return true; } catch {} - try { var v = pawn?.AbsOrigin; eye = new Vector3((float)v.X, (float)v.Y, (float)v.Z) + new Vector3(0,0,64f); return true; } catch {} - eye = default; return false; - } - - private static float GetTickInterval() - { - // Kompatibler Fallback: 64 Tick (falls deine API keine globale Tickrate liefert) - // Wenn du eine verlässliche Quelle hast (z. B. ConVar oder API), trage sie hier ein. - return 1.0f / 64.0f; - } - - // ========================= - // Lifecycle - // ========================= - + // ------------- Lifecycle ------------- public override void Load(bool hotReload) { - Logger.LogInformation("[WS] Plugin geladen. Kommandos: css_ws_enable, css_ws_restart, css_ws_reloadcfg, css_ws_url, css_ws_rate, css_ws_cert, css_ws_certpwd, css_ws_sendmap, css_ws_pred"); + Logger.LogInformation("[WS] Meta-Plugin geladen. Kommandos: css_meta_enable, css_meta_restart, css_meta_reloadcfg, css_meta_url, css_meta_cert, css_meta_certpwd, css_meta_sendmap, css_meta_sendplayers"); - RegisterListener(OnTick); - - _mapName = Server.MapName ?? ""; + // Mapstart → map broadcasten RegisterListener(OnMapStart); - RegisterListener(OnEntityCreated); - RegisterListener(OnEntityDeleted); - - RegisterEventHandler(OnSmokeDetonate); - RegisterEventHandler(OnHeDetonate); - RegisterEventHandler(OnFlashDetonate); - RegisterEventHandler(OnMolotovDetonate); - RegisterEventHandler(OnDecoyStart); - RegisterEventHandler(OnDecoyDetonate); + // Spieler-Events + RegisterEventHandler(OnPlayerConnectFull); + RegisterEventHandler(OnPlayerDisconnect); LoadAndApplyConfig(); - _enabled = true; - StartWebSocket(); + if (_enabled) StartWebSocket(); + + Server.NextFrame(() => + { + if (!_enabled) return; + TrySafeInitialPush(); // siehe Methode unten + }); } public override void Unload(bool hotReload) @@ -470,24 +213,69 @@ public class WebSocketTelemetryPlugin : BasePlugin StopWebSocket(); } + // ------------- Events ------------- private void OnMapStart(string newMap) { _mapName = newMap ?? Server.MapName ?? ""; - var payload = JsonSerializer.Serialize(new - { - type = "map", - name = _mapName, - t = NowMs() - }); - Broadcast(payload); - Logger.LogInformation($"[WS] Map gewechselt: '{_mapName}' – an Clients gesendet."); + Broadcast(JsonSerializer.Serialize(new { type = "map", name = _mapName, t = NowMs() })); + // Nach Mapstart zusätzlich die Spielerliste pushen + SendFullPlayerList(); + Logger.LogInformation($"[WS] Map gewechselt: '{(_mapName ?? "")}' – Meta gesendet."); } - // ========================= - // Konsolen-Kommandos - // ========================= + private HookResult OnPlayerConnectFull(EventPlayerConnectFull ev, GameEventInfo info) + { + try + { + CCSPlayerController? p = ev.Userid; // direkt, kein .Value und kein ev.Name + string name = (p != null && p.IsValid) ? p.PlayerName : "unknown"; + ulong steamId = (p != null && p.IsValid) ? (p.AuthorizedSteamID?.SteamId64 ?? 0UL) : 0UL; + int team = (p != null && p.IsValid) ? p.TeamNum : 0; + bool? isBot = (p != null && p.IsValid) ? p.IsBot : (bool?)null; - [ConsoleCommand("css_ws_enable", "Aktiviert/Deaktiviert den integrierten WS(S)-Server: css_ws_enable 1|0")] + Broadcast(JsonSerializer.Serialize(new + { + type = "player_join", + t = NowMs(), + player = new { steamId, name, team, isBot } + })); + + // danach die komplette Liste senden (Client-Sync) + SendFullPlayerList(); + } + catch { /* ignore */ } + + return HookResult.Continue; + } + + private HookResult OnPlayerDisconnect(EventPlayerDisconnect ev, GameEventInfo info) + { + try + { + CCSPlayerController? p = ev.Userid; + ulong steamId = 0UL; + + if (p != null && p.IsValid) + { + steamId = p.AuthorizedSteamID?.SteamId64 ?? 0UL; + } + + Broadcast(JsonSerializer.Serialize(new + { + type = "player_leave", + t = NowMs(), + steamId + })); + + SendFullPlayerList(); + } + catch { /* ignore */ } + + return HookResult.Continue; + } + + // ------------- Console Commands ------------- + [ConsoleCommand("css_meta_enable", "WS(S)-Server aktivieren/deaktivieren: css_meta_enable 1|0")] [CommandHelper(minArgs: 1, usage: "<1|0>")] public void CmdEnable(CCSPlayerController? caller, CommandInfo cmd) { @@ -507,20 +295,7 @@ public class WebSocketTelemetryPlugin : BasePlugin else StopWebSocket(); } - [ConsoleCommand("css_ws_pred", "Prediction der Nade-Trajektorie aktivieren/deaktivieren (1|0), Punkte optional")] - [CommandHelper(minArgs: 1, usage: "<1|0> [points 8..64]")] - public void CmdPred(CCSPlayerController? caller, CommandInfo cmd) - { - var on = cmd.GetArg(1); - _predictEnabled = on == "1" || on.Equals("true", StringComparison.OrdinalIgnoreCase); - if (cmd.ArgCount >= 3 && int.TryParse(cmd.GetArg(2), out var pts) && pts >= 8 && pts <= 64) - _predPoints = pts; - - cmd.ReplyToCommand($"[WS] Prediction: {(_predictEnabled ? "an" : "aus")} (points={_predPoints})"); - SaveConfig(); - } - - [ConsoleCommand("css_ws_reloadcfg", "Lädt die config.json neu und startet den WS(S)-Server ggf. neu")] + [ConsoleCommand("css_meta_reloadcfg", "Lädt die config.json neu und startet den WS(S)-Server ggf. neu")] public void CmdReloadCfg(CCSPlayerController? caller, CommandInfo cmd) { var wasEnabled = _enabled; @@ -535,30 +310,23 @@ public class WebSocketTelemetryPlugin : BasePlugin } else { - cmd.ReplyToCommand("[WS] Konfiguration neu geladen. Server ist deaktiviert (css_ws_enable 1 zum Starten)."); + cmd.ReplyToCommand("[WS] Konfiguration neu geladen. Server ist deaktiviert (css_meta_enable 1 zum Starten)."); } } - [ConsoleCommand("css_ws_restart", "Lädt config.json neu und startet den WS(S)-Server neu.")] - [CommandHelper(minArgs: 0, usage: "")] + [ConsoleCommand("css_meta_restart", "Restartet den WS(S)-Server und lädt config.json neu")] public void CmdRestart(CCSPlayerController? caller, CommandInfo cmd) { try { LoadAndApplyConfig(generateIfMissing: false); - - _lastTick = DateTime.UtcNow; - _accumulator = 0; - while (_outbox.TryDequeue(out _)) { } - var wasEnabled = _enabled; StopWebSocket(); - if (wasEnabled) - StartWebSocket(); + if (wasEnabled) StartWebSocket(); - cmd.ReplyToCommand("[WS] Config neu geladen und neu gestartet."); + cmd.ReplyToCommand("[WS] Neu gestartet."); if (!wasEnabled) - cmd.ReplyToCommand("[WS] Hinweis: Server ist deaktiviert (css_ws_enable 1), Neustart war nur intern."); + cmd.ReplyToCommand("[WS] Hinweis: Server ist deaktiviert (css_meta_enable 1)."); } catch (Exception ex) { @@ -566,20 +334,7 @@ public class WebSocketTelemetryPlugin : BasePlugin } } - [ConsoleCommand("css_ws_sendmap", "Sendet die aktuelle Karte an alle verbundenen Clients")] - public void CmdSendMap(CCSPlayerController? caller, CommandInfo cmd) - { - var payload = JsonSerializer.Serialize(new - { - type = "map", - name = _mapName, - t = NowMs() - }); - Broadcast(payload); - cmd.ReplyToCommand($"[WS] Map '{_mapName}' an Clients gesendet."); - } - - [ConsoleCommand("css_ws_url", "Setzt Bind-Host/Port/Pfad als ws[s]://host:port/path")] + [ConsoleCommand("css_meta_url", "Setzt Bind-Host/Port/Pfad als ws[s]://host:port/path")] [CommandHelper(minArgs: 1, usage: "")] public void CmdUrl(CCSPlayerController? caller, CommandInfo cmd) { @@ -603,928 +358,82 @@ public class WebSocketTelemetryPlugin : BasePlugin if (_enabled) { StopWebSocket(); StartWebSocket(); } } - [ConsoleCommand("css_ws_rate", "Sendefrequenz in Hz (Standard 10)")] - [CommandHelper(minArgs: 1, usage: "")] - public void CmdRate(CCSPlayerController? caller, CommandInfo cmd) - { - if (int.TryParse(cmd.GetArg(1), out var hz) && hz > 0 && hz <= 128) - { - _sendHz = hz; - SaveConfig(); - cmd.ReplyToCommand($"[WS] Sendefrequenz = {_sendHz} Hz"); - } - else cmd.ReplyToCommand("[WS] Ungültig. Bereich: 1..128"); - } - - [ConsoleCommand("css_ws_cert", "Setzt das TLS-Zertifikat (PFX-Datei)")] + [ConsoleCommand("css_meta_cert", "Setzt das TLS-Zertifikat (PFX-Datei) – nur für wss")] [CommandHelper(minArgs: 1, usage: "")] public void CmdCert(CCSPlayerController? caller, CommandInfo cmd) { var input = cmd.GetArg(1); _certPath = Path.IsPathRooted(input) ? input : Path.Combine(ModuleDirectory, input); - _serverCert = null; // neu laden beim Start + _serverCert = null; cmd.ReplyToCommand($"[WS] Zertifikatspfad gesetzt: '{_certPath}'"); SaveConfig(); if (_enabled && _useTls) { StopWebSocket(); StartWebSocket(); } } - [ConsoleCommand("css_ws_certpwd", "Setzt das Passwort für das PFX-Zertifikat (oder '-' zum Leeren)")] + [ConsoleCommand("css_meta_certpwd", "Setzt das Passwort für das PFX-Zertifikat (oder '-' zum Leeren)")] [CommandHelper(minArgs: 1, usage: "")] public void CmdCertPwd(CCSPlayerController? caller, CommandInfo cmd) { var pwd = cmd.GetArg(1); _certPassword = pwd == "-" ? "" : pwd; - _serverCert = null; // neu laden beim Start + _serverCert = null; cmd.ReplyToCommand($"[WS] Zertifikatspasswort {(string.IsNullOrEmpty(_certPassword) ? "gelöscht" : "gesetzt")}."); SaveConfig(); if (_enabled && _useTls) { StopWebSocket(); StartWebSocket(); } } - // ========================= - // Tick / Spieler-Snapshot - // ========================= - - private void OnTick() + [ConsoleCommand("css_meta_sendmap", "Sendet die aktuelle Karte an alle verbundenen Clients")] + public void CmdSendMap(CCSPlayerController? caller, CommandInfo cmd) { - if (!_enabled || !_serverRunning) return; + Broadcast(JsonSerializer.Serialize(new { type = "map", name = _mapName, t = NowMs() })); + cmd.ReplyToCommand($"[WS] Map '{_mapName}' an Clients gesendet."); + } - var now = DateTime.UtcNow; - var dt = (now - _lastTick).TotalSeconds; - _lastTick = now; - if (dt > MaxFrameDt) dt = MaxFrameDt; - - _accumulator += dt; - var targetDt = 1.0 / Math.Max(1, _sendHz); - if (_accumulator < targetDt) return; - _accumulator = 0; - - var playersList = new List(); + [ConsoleCommand("css_meta_sendplayers", "Sendet die komplette Spielerliste an alle verbundenen Clients")] + public void CmdSendPlayers(CCSPlayerController? caller, CommandInfo cmd) + { + SendFullPlayerList(); + cmd.ReplyToCommand("[WS] Spielerliste gesendet."); + } + // ------------- Player snapshot/broadcast ------------- + private void SendFullPlayerList() + { + var list = new List(); foreach (var p in Utilities.GetPlayers()) { try { - if (p == null || !p.IsValid || p.IsBot || p.IsHLTV) continue; - - var pawnHandle = p.PlayerPawn; - if (pawnHandle == null || !pawnHandle.IsValid) continue; - - var pawn = pawnHandle.Value; - if (pawn == null) continue; - - // Position - float posX, posY, posZ; - try - { - var node = pawn?.CBodyComponent?.SceneNode; - var org = node != null ? node.AbsOrigin : pawn.AbsOrigin; - posX = (float)org.X; - posY = (float)org.Y; - posZ = (float)org.Z; - } - catch - { - var org = pawn.AbsOrigin; - posX = (float)org.X; - posY = (float)org.Y; - posZ = (float)org.Z; - } - - // viewAngle exemplarisch aus AbsRotation - float angX = 0f, angY = 0f, angZ = 0f; - try - { - var ang = pawn.AbsRotation; - angX = (float)ang.X; - angY = (float)ang.Y; - angZ = (float)ang.Z; - } - catch { } - - bool isAlive = true; - try { int ls = (int)pawn.LifeState; isAlive = (ls == 0); } catch { } - if (!isAlive) { try { isAlive = ((int)pawn.Health) > 0; } catch { } } - - Vector3 eyePos; - TryGetEyePosition(pawn, out eyePos); // nutzt deine vorhandene TryGetEyePosition - - Vector3 pVel = Vector3.Zero; - try - { - var v = pawn.AbsVelocity; - pVel = new Vector3((float)v.X, (float)v.Y, (float)v.Z); - } - catch { /* ok */ } - - // Aim sinnvoll clampen/normalisieren - float spPitch = ClampPitch(angX); - float spYaw = NormalizeYaw(angY); - - var sid = p.AuthorizedSteamID?.SteamId64 ?? 0UL; - _lastPlayerSnap[sid] = new PlayerSnap { - Origin = new Vector3(posX, posY, posZ), - Eye = eyePos == default ? new Vector3(posX, posY, posZ + 64f) : eyePos, - Vel = pVel, - Pitch = spPitch, - Yaw = spYaw, - T = NowMs() - }; - - - playersList.Add(new + if (p == null || !p.IsValid) continue; + list.Add(new { steamId = p.AuthorizedSteamID?.SteamId64 ?? 0UL, name = p.PlayerName, team = p.TeamNum, - pos = new { x = posX, y = posY, z = posZ }, - viewAngle = new { pitch = angX, yaw = angY, roll = angZ }, - alive = isAlive + isBot = p.IsBot }); } - catch { } + catch { /* ignore one */ } } - // Nade-Update + Backfill - UpdateNadesInTick(); - - if (playersList.Count == 0) return; - var payload = new { - type = "tick", + type = "players", t = NowMs(), - players = playersList + players = list }; - Broadcast(JsonSerializer.Serialize(payload)); } - // ========================= - // Grenade tracking - // ========================= - - private sealed class NadeInfo - { - public required int Id; - public required string Kind; - public CEntityInstance? Ent; // kann kurzzeitig null sein (nur Meta) - public ulong OwnerSteamId; - public long CreatedMs; - - public bool Announced; // create schon gesendet? - public (float x,float y,float z) LastPos; - public long LastT; - - // Backfill-Puffer - public bool FirstValidSeen; - public (long t, (float x,float y,float z) pos) FirstSample; - public bool SecondValidSeen; - public (long t, (float x,float y,float z) pos) SecondSample; - public bool FixSent; - - // Prediction - public bool PredSent; - } - - private int _nadeSeq = 0; - private readonly ConcurrentDictionary _nades = new(); // Id -> info - - private struct PlayerSnap - { - public Vector3 Origin; - public Vector3 Eye; - public Vector3 Vel; - public float Pitch; - public float Yaw; - public long T; - } - private readonly ConcurrentDictionary _lastPlayerSnap = new(); - - - private static bool IsValidPos((float x, float y, float z) p) - { - if (!float.IsFinite(p.x) || !float.IsFinite(p.y) || !float.IsFinite(p.z)) - return false; - if (Math.Abs(p.x) < 1f && Math.Abs(p.y) < 1f && Math.Abs(p.z) < 1f) - return false; - if (Math.Abs(p.x) > 100000f || Math.Abs(p.y) > 100000f || Math.Abs(p.z) > 100000f) - return false; - return true; - } - - // ========================= - // Helpers - // ========================= - - private static (float x, float y, float z) ReadInitialNadePos(dynamic ent) - { - try { var v = ent.m_vInitialPosition; return ((float)v.X, (float)v.Y, (float)v.Z); } catch {} - try { var v = ent.InitialPosition; return ((float)v.X, (float)v.Y, (float)v.Z); } catch {} - return (0f, 0f, 0f); - } - - private static (float x, float y, float z) ReadInitialNadeVel(dynamic ent) - { - try { var v = ent.m_vInitialVelocity; return ((float)v.X, (float)v.Y, (float)v.Z); } catch {} - try { var v = ent.InitialVelocity; return ((float)v.X, (float)v.Y, (float)v.Z); } catch {} - return (0f, 0f, 0f); - } - - private static bool IsGrenadeDesignerName(string? name) - { - if (string.IsNullOrEmpty(name)) return false; - name = name.ToLowerInvariant(); - return name.Contains("grenade_projectile") || - name.Contains("flashbang_projectile") || - name.Contains("smokegrenade_projectile") || - name.Contains("molotov_projectile") || - name.Contains("decoy_projectile"); - } - - private static string KindFromDesignerName(string name) - { - name = name.ToLowerInvariant(); - if (name.Contains("hegrenade")) return "he"; - if (name.Contains("flashbang")) return "flash"; - if (name.Contains("smokegrenade")) return "smoke"; - if (name.Contains("molotov")) return "molotov"; - if (name.Contains("decoy")) return "decoy"; - return "other"; - } - - private static (float pitch, float yaw, float roll) ReadAbsAngles(dynamic ent) - { - try { - var node = ent?.GameSceneNode; - if (node != null) { - try { var r = node.AbsRotation; return ((float)r.X, (float)r.Y, (float)r.Z); } catch {} - try { var tf = node.NodeToWorld; var a = tf.Angles; return ((float)a.X, (float)a.Y, (float)a.Z); } catch {} - } - } catch {} - - try { var r = ent?.AbsRotation; return ((float)r.X, (float)r.Y, (float)r.Z); } catch {} - - return (0f, 0f, 0f); - } - - private static (float x, float y, float z) ReadAbsOrigin(dynamic ent) - { - try { - var node = ent?.GameSceneNode; - if (node != null) { - try { var o = node.AbsOrigin; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - try { var o = node.m_vecAbsOrigin; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - try { var tf = node.NodeToWorld; var a = tf.Origin; return ((float)a.X, (float)a.Y, (float)a.Z); } catch {} - } - } catch {} - - try { - var bodyComp = ent?.CBodyComponent; - if (bodyComp != null) { - var nd = bodyComp.SceneNode; - if (nd != null) { - try { var o = nd.AbsOrigin; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - try { var o = nd.m_vecAbsOrigin; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - } - } - } catch {} - - try { var o = ent?.AbsOrigin; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - try { var o = ent?.m_vecAbsOrigin; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - - try { - var transform = ent?.m_pGameSceneNode?.m_nodeToWorld; - if (transform != null) { - return ((float)transform.m_vOrigin.X, (float)transform.m_vOrigin.Y, (float)transform.m_vOrigin.Z); - } - } catch {} - - try { - var physics = ent?.Physics; - if (physics != null) { - try { var o = physics.Origin; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - try { var o = physics.Position; return ((float)o.X, (float)o.Y, (float)o.Z); } catch {} - } - } catch {} - - return ReadInitialNadePos(ent); - } - - private static (float x, float y, float z) ReadAbsVelocity(dynamic ent) - { - try { var v = ent?.AbsVelocity; return ((float)v.X, (float)v.Y, (float)v.Z); } catch {} - try { var v = ent?.m_vecAbsVelocity; return ((float)v.X, (float)v.Y, (float)v.Z); } catch {} - try { var v = ent?.Physics?.Velocity;return ((float)v.X, (float)v.Y, (float)v.Z); } catch {} - - return ReadInitialNadeVel(ent); - } - - private static ulong TryGetThrowerSteamId(dynamic projectileBase) - { - try - { - dynamic p = projectileBase; // dynamisch binden - - // 1) Thrower (Pawn) -> Controller -> SteamID - try - { - dynamic th = p.m_hThrower; // kann ein Handle sein - dynamic thVal = th is null ? null : (th.Value ?? th); - dynamic throwerPawn = thVal ?? p.Thrower; - - if (throwerPawn != null) - { - try - { - dynamic ctrl = throwerPawn.Controller; - if (ctrl != null) - return (ulong)(ctrl.AuthorizedSteamID?.SteamId64 ?? 0UL); - } - catch { /* weiter probieren */ } - } - } - catch { /* weiter */ } - - // 2) OwnerEntity (Pawn/Entity) -> Controller -> SteamID - try - { - dynamic oh = p.m_hOwnerEntity; - dynamic ohVal = oh is null ? null : (oh.Value ?? oh); - dynamic ownerEnt = ohVal ?? p.OwnerEntity; - - if (ownerEnt != null) - { - try - { - dynamic ctrl = ownerEnt.Controller; - if (ctrl != null) - return (ulong)(ctrl.AuthorizedSteamID?.SteamId64 ?? 0UL); - } - catch { } - } - } - catch { } - } - catch { } - - return 0UL; - } - - - // ========================= - // Prediction (vereinfachte Ballistik) - // ========================= - - private static Vector3 AnglesToForward(float pitchDeg, float yawDeg) - { - // Pitch: Up ist negativ in Source-Notation, deshalb Minus - float pitch = -pitchDeg * (float)Math.PI / 180f; - float yaw = yawDeg * (float)Math.PI / 180f; - float cp = MathF.Cos(pitch); - return new Vector3( - cp * MathF.Cos(yaw), - cp * MathF.Sin(yaw), - MathF.Sin(pitch) - ); - } - - // ========================= - // Hooks - // ========================= - - private void OnEntityCreated(CEntityInstance ent) - { - try - { - var name = ent.DesignerName ?? ""; - if (!IsGrenadeDesignerName(name)) return; - - var kind = KindFromDesignerName(name); - var id = Interlocked.Increment(ref _nadeSeq); - var owner = TryGetThrowerSteamId(ent); - - var info = new NadeInfo { - Id = id, Kind = kind, Ent = ent, OwnerSteamId = owner, - CreatedMs = NowMs(), - Announced = false, - LastPos = (0,0,0), - LastT = 0, - FirstValidSeen = false, - SecondValidSeen = false, - FixSent = false, - PredSent = false - }; - _nades[id] = info; - - // Prediction mit Retry; fällt auf Spieler-Snapshot zurück, wenn Projectile-Netvars leer sind - if (_predictEnabled) - { - const int maxTries = 10; // bis zu ~10 Versuche - const float tryInterval = 0.016f; // alle ~1 Frame (bei ~64 tick) - int attempt = 0; - - void TryPredict() - { - static string V3(Vector3 v) => $"({v.X:F2},{v.Y:F2},{v.Z:F2})"; - static string T3((float x,float y,float z) t) => $"({t.x:F2},{t.y:F2},{t.z:F2})"; - - try - { - attempt++; - Logger.LogInformation($"[WS-PRED] fire id={id} kind={kind}: attempt {attempt}/{maxTries}"); - - if (ent == null || !ent.IsValid || !_nades.ContainsKey(id)) - { - Logger.LogWarning($"[WS-PRED] id={id} kind={kind}: entity invalid or gone -> abort"); - return; - } - - if (attempt == 1) - { - try - { - var dn = ent.DesignerName ?? "(null)"; - var typeName = ent.GetType().Name; - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: DesignerName='{dn}', CLR='{typeName}' owner={owner}"); - } - catch { } - } - - // 1) Pos/Vel aus Netvars (oder initial) lesen - var pAbs = ReadAbsOrigin(ent); - bool pAbsValid = IsValidPos(pAbs); - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: AbsOrigin={T3(pAbs)} valid={pAbsValid}"); - - (float x,float y,float z) p0 = pAbs; - if (!pAbsValid) - { - var pInit = ReadInitialNadePos(ent); - bool pInitValid = IsValidPos(pInit); - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: InitialPos={T3(pInit)} valid={pInitValid}"); - if (pInitValid) p0 = pInit; - } - - var vAbs = ReadAbsVelocity(ent); - var vInit = ReadInitialNadeVel(ent); - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: AbsVel=({vAbs.x:F2},{vAbs.y:F2},{vAbs.z:F2}) | InitVel=({vInit.x:F2},{vInit.y:F2},{vInit.z:F2})"); - - bool posOk = IsValidPos(p0); - bool velOk = !(vAbs.x==0 && vAbs.y==0 && vAbs.z==0) || !(vInit.x==0 && vInit.y==0 && vInit.z==0); - - Vector3 start3 = posOk ? new Vector3(p0.x, p0.y, p0.z) : Vector3.Zero; - Vector3 v0 = Vector3.Zero; - if (!(vAbs.x==0 && vAbs.y==0 && vAbs.z==0)) v0 = new Vector3(vAbs.x, vAbs.y, vAbs.z); - else if (!(vInit.x==0 && vInit.y==0 && vInit.z==0)) v0 = new Vector3(vInit.x, vInit.y, vInit.z); - - // 2) Fallback: Spieler-Snapshot (Owner → jüngster Spieler) - if (start3 == Vector3.Zero || v0 == Vector3.Zero) - { - bool haveSnap = false; - PlayerSnap snap = default; - - if (owner != 0 && _lastPlayerSnap.TryGetValue(owner, out snap)) - { - haveSnap = true; - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: using owner snap steamid={owner}"); - } - else - { - // jüngster Snapshot eines Spielers - ulong picked = 0; long bestT = 0; - foreach (var kv in _lastPlayerSnap) - { - if (kv.Value.T > bestT) - { - picked = kv.Key; bestT = kv.Value.T; snap = kv.Value; - } - } - if (picked != 0) { haveSnap = true; Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: using most recent player snap steamid={picked}"); } - } - - if (haveSnap) - { - var snapStart = snap.Eye == default ? snap.Origin + new Vector3(0,0,64f) : snap.Eye; - var dir = AnglesToForward(snap.Pitch, snap.Yaw); - - if (start3 == Vector3.Zero) start3 = snapStart; - if (v0 == Vector3.Zero) v0 = dir * 750f + snap.Vel; - - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: snap start={V3(start3)} aim=({snap.Pitch:F1},{snap.Yaw:F1}) v0={V3(v0)}"); - } - else - { - // kein Snap — ggf. nochmal warten - if (!posOk && attempt < maxTries) - { - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: no pos & no snap -> retry in {tryInterval*1000:F0}ms"); - AddTimer(tryInterval, TryPredict); - return; - } - } - } - - // Wenn immer noch kein Start: letzter Versuch (nochmal warten) - if (start3 == Vector3.Zero) - { - if (attempt < maxTries) - { - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: start still unknown -> retry in {tryInterval*1000:F0}ms"); - AddTimer(tryInterval, TryPredict); - return; - } - Logger.LogWarning($"[WS-PRED] id={id} kind={kind}: giving up (no start after {attempt} tries)"); - return; - } - - // Velocity notfalls aus Richtung schätzen (falls bis hier noch 0) - if (v0 == Vector3.Zero) - { - // Schätze Richtung aus Start → (falls möglich) nächsten Tick – sonst nimm Eye-Aim aus jüngstem Snap - Vector3 estDir = Vector3.UnitX; // dummy - bool gotDir = false; - // quickest: nimm jüngsten Snap - ulong bestSid=0; long bestTs=0; PlayerSnap bestSnap=default; - foreach (var kv in _lastPlayerSnap) if (kv.Value.T > bestTs) { bestSid=kv.Key; bestTs=kv.Value.T; bestSnap=kv.Value; } - if (bestSid!=0) - { - estDir = AnglesToForward(bestSnap.Pitch, bestSnap.Yaw); - gotDir = true; - } - if (!gotDir) estDir = Vector3.UnitX; - - v0 = estDir * 750f; - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: v0 missing -> estimated v0={V3(v0)}"); - } - - float dt = GetTickInterval(); - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: start={V3(start3)} v0={V3(v0)} dt={dt:F4} points={_predPoints}"); - - var pts = PredictPathFromState(start3, v0, _predPoints, dt, 800f, includeStart: true); - if (pts.Count == 0) - { - if (attempt < maxTries) - { - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: 0 points -> retry in {tryInterval*1000:F0}ms"); - AddTimer(tryInterval, TryPredict); - return; - } - Logger.LogWarning($"[WS-PRED] id={id} kind={kind}: 0 points after {attempt} tries -> give up"); - return; - } - - Broadcast(JsonSerializer.Serialize(new - { - type = "nade_pred", - t = NowMs(), - id = id, - kind = kind, - owner = owner, - points = pts - })); - Logger.LogInformation($"[WS-PRED] id={id} kind={kind}: nade_pred broadcast sent ({pts.Count} pts)"); - - if (_nades.TryGetValue(id, out var n)) n.PredSent = true; - } - catch (Exception exOuter) - { - Logger.LogError($"[WS-PRED] id={id} kind={kind}: outer exception: {exOuter.Message}"); - } - } - - AddTimer(tryInterval, TryPredict); - } - - // Kleiner Delay, bis Netvars sicher da sind → create senden - AddTimer(0.05f, () => - { - try - { - if (ent == null || !ent.IsValid || !_nades.ContainsKey(id)) return; - - var pos = ReadAbsOrigin(ent); - var vel = ReadAbsVelocity(ent); - - if (!IsValidPos(pos)) - pos = ReadInitialNadePos(ent); - - if (!IsValidPos(pos)) - return; - - var ang = ReadAbsAngles(ent); - - if (_nades.TryGetValue(id, out var n)) - { - n.LastPos = pos; - n.LastT = NowMs(); - n.Announced = true; - n.FirstValidSeen = true; - n.FirstSample = (n.LastT, pos); - } - - Broadcast(JsonSerializer.Serialize(new { - type = "nade_create", - t = NowMs(), - id = id, - kind = kind, - owner= owner, - pos = new { x = pos.x, y = pos.y, z = pos.z }, - vel = new { x = vel.x, y = vel.y, z = vel.z }, - ang = new { pitch = ang.pitch, yaw = ang.yaw, roll = ang.roll } - })); - } - catch { /* ignore */ } - }); - } - catch { /* ignore */ } - } - - - private static List PredictPathFromState( - Vector3 start, Vector3 v0, int points, float dt, float gravityAbs = 800f, bool includeStart = true) - { - var list = new List(points); - Vector3 p = start; - Vector3 v = v0; - Vector3 a = new Vector3(0, 0, -gravityAbs); - - if (includeStart) - list.Add(new { x = p.X, y = p.Y, z = p.Z }); // Punkt 0 = exakter Start - - for (int i = includeStart ? 1 : 0; i < points; i++) - { - p += v * dt + 0.5f * a * dt * dt; - v += a * dt; - list.Add(new { x = p.X, y = p.Y, z = p.Z }); - if (MathF.Abs(p.X) > 200000f || MathF.Abs(p.Y) > 200000f || MathF.Abs(p.Z) > 200000f) - break; - } - return list; - } - - - private void UpdateNadesInTick() - { - if (_nades.IsEmpty) return; - - var nades = new List(); - var toRemove = new List(); - var now = NowMs(); - - foreach (var kv in _nades) - { - var n = kv.Value; - try - { - if (n.Ent == null || !n.Ent.IsValid) - { - // bis Detonate/Event - continue; - } - - var pos = ReadAbsOrigin(n.Ent); - var vel = ReadAbsVelocity(n.Ent); - - if (!IsValidPos(pos)) - continue; - - // --- NEU: Prediction hier nachreichen, sobald wir zum ersten Mal echte Daten sehen --- - if (_predictEnabled && !n.PredSent) - { - try - { - float dt = GetTickInterval(); - var start3 = new Vector3(pos.x, pos.y, pos.z); - var v0 = new Vector3(vel.x, vel.y, vel.z); - - Logger.LogInformation( - $"[WS-PRED] late id={n.Id} kind={n.Kind}: start=({start3.X:F2},{start3.Y:F2},{start3.Z:F2}) " + - $"v0=({v0.X:F2},{v0.Y:F2},{v0.Z:F2}) dt={dt:F4} points={_predPoints}"); - - var pts = PredictPathFromState(start3, v0, _predPoints, dt, 800f, includeStart: true); - - if (pts.Count > 0) - { - Broadcast(JsonSerializer.Serialize(new - { - type = "nade_pred", - t = NowMs(), - id = n.Id, - kind = n.Kind, - owner = n.OwnerSteamId, - points = pts - })); - n.PredSent = true; - Logger.LogInformation($"[WS-PRED] late id={n.Id} kind={n.Kind}: nade_pred broadcast sent ({pts.Count} pts)"); - } - else - { - Logger.LogWarning($"[WS-PRED] late id={n.Id} kind={n.Kind}: 0 points (skip)"); - } - } - catch (Exception ex) - { - Logger.LogError($"[WS-PRED] late id={n.Id} kind={n.Kind}: exception: {ex.Message}"); - } - } - // --- ENDE NEU --- - - // First/Second-Sample Logik für Backfill (deins, unverändert) … - if (IsValidPos(pos)) - { - if (!n.FirstValidSeen) - { - n.FirstValidSeen = true; - n.FirstSample = (now, pos); - } - else if (!n.SecondValidSeen) - { - n.SecondValidSeen = true; - n.SecondSample = (now, pos); - var initVel = ReadInitialNadeVel(n.Ent); - float dtf = Math.Max(GetTickInterval(), ((n.SecondSample.t - n.FirstSample.t) / 1000f)); - Vector3 p1 = new Vector3(n.FirstSample.pos.x, n.FirstSample.pos.y, n.FirstSample.pos.z); - Vector3 v1; - - if (initVel.x != 0 || initVel.y != 0 || initVel.z != 0) - v1 = new Vector3(initVel.x, initVel.y, initVel.z); - else - { - Vector3 p2 = new Vector3(n.SecondSample.pos.x, n.SecondSample.pos.y, n.SecondSample.pos.z); - float dtt = Math.Max(0.001f, (n.SecondSample.t - n.FirstSample.t) / 1000f); - v1 = (p2 - p1) / dtt; - } - - Vector3 a = new Vector3(0, 0, -800f); - Vector3 p0 = p1 - v1 * dtf - 0.5f * a * dtf * dtf; - - if (!n.FixSent && IsFinite(p0.X) && IsFinite(p0.Y) && IsFinite(p0.Z)) - { - n.FixSent = true; - Broadcast(JsonSerializer.Serialize(new - { - type = "nade_fix_start", - t = NowMs(), - id = n.Id, - pos = new { x = p0.X, y = p0.Y, z = p0.Z } - })); - } - } - } - - // Falls create noch nicht raus ist, jetzt nachholen (deins, unverändert) … - if (!n.Announced && IsValidPos(pos)) - { - var ang = ReadAbsAngles(n.Ent); - n.Announced = true; - n.LastPos = pos; - n.LastT = now; - - Broadcast(JsonSerializer.Serialize(new - { - type = "nade_create", - t = now, - id = n.Id, - kind = n.Kind, - owner = n.OwnerSteamId, - pos = new { x = pos.x, y = pos.y, z = pos.z }, - vel = new { x = vel.x, y = vel.y, z = vel.z }, - ang = new { pitch = ang.pitch, yaw = ang.yaw, roll = ang.roll } - })); - } - - nades.Add(new - { - id = n.Id, - kind = n.Kind, - owner = n.OwnerSteamId, - pos = new { x = pos.x, y = pos.y, z = pos.z }, - vel = new { x = vel.x, y = vel.y, z = vel.z } - }); - - n.LastPos = pos; - n.LastT = now; - } - catch (Exception) - { - toRemove.Add(kv.Key); - } - } - - if (nades.Count > 0) - { - var nadePayload = new - { - type = "nades", - t = NowMs(), - nades - }; - Broadcast(JsonSerializer.Serialize(nadePayload)); - } - - foreach (var id in toRemove) - _nades.TryRemove(id, out _); - } - - - private void OnEntityDeleted(CEntityInstance ent) - { - try - { - foreach (var kv in _nades) - { - if (ReferenceEquals(kv.Value.Ent, ent)) - { - _nades.TryRemove(kv.Key, out _); - break; - } - } - } - catch { } - } - - // ========================= - // Detonation Handler / Cleanup - // ========================= - - private HookResult OnSmokeDetonate(EventSmokegrenadeDetonate ev, GameEventInfo info) - { - return HandleExplodeGeneric("smoke", ev.X, ev.Y, ev.Z); - } - private HookResult OnHeDetonate(EventHegrenadeDetonate ev, GameEventInfo info) - { - return HandleExplodeGeneric("he", ev.X, ev.Y, ev.Z); - } - private HookResult OnFlashDetonate(EventFlashbangDetonate ev, GameEventInfo info) - { - return HandleExplodeGeneric("flash", ev.X, ev.Y, ev.Z); - } - private HookResult OnMolotovDetonate(EventMolotovDetonate ev, GameEventInfo info) - { - return HandleExplodeGeneric("molotov", ev.X, ev.Y, ev.Z); - } - private HookResult OnDecoyStart(EventDecoyStarted ev, GameEventInfo info) - { - Broadcast(JsonSerializer.Serialize(new { - type = "nade_decoy_start", t = NowMs(), - pos = new { x = ev.X, y = ev.Y, z = ev.Z } - })); - return HookResult.Continue; - } - private HookResult OnDecoyDetonate(EventDecoyDetonate ev, GameEventInfo info) - { - return HandleExplodeGeneric("decoy", ev.X, ev.Y, ev.Z); - } - - private HookResult HandleExplodeGeneric(string kind, float x, float y, float z) - { - int removeId = -1; - foreach (var kv in _nades) - { - if (kv.Value.Kind == kind) - { - removeId = kv.Key; - break; - } - } - if (removeId != -1 && _nades.TryRemove(removeId, out var info)) - { - Broadcast(JsonSerializer.Serialize(new { - type = "nade_explode", - t = NowMs(), - id = info.Id, - kind = info.Kind, - owner = info.OwnerSteamId, - pos = new { x, y, z } - })); - } - else - { - Broadcast(JsonSerializer.Serialize(new { - type = "nade_explode", - t = NowMs(), - id = (int?)null, - kind, - pos = new { x, y, z } - })); - } - return HookResult.Continue; - } - - // ========================= - // WS(S)-Server / Broadcast - // ========================= - + // ------------- WebSocket Server ------------- private void StartWebSocket() { StopWebSocket(); try { - if (_useTls) - { - if (!TryLoadCertificate(out var _)) - throw new Exception("TLS aktiv, aber kein funktionsfähiges PFX gefunden."); - } + if (_useTls && !TryLoadCertificate(out _)) + throw new Exception("TLS aktiv, aber kein funktionsfähiges PFX gefunden."); IPAddress ip; if (!IPAddress.TryParse(_bindHost, out ip)) @@ -1538,8 +447,12 @@ public class WebSocketTelemetryPlugin : BasePlugin var scheme = _useTls ? "wss" : "ws"; Logger.LogInformation($"[WS] Server lauscht auf {scheme}://{_bindHost}:{_bindPort}{_bindPath}"); - _mapName = string.IsNullOrEmpty(Server.MapName) ? _mapName : Server.MapName!; - Broadcast(JsonSerializer.Serialize(new { type = "map", name = _mapName, t = NowMs() })); + // Initiale Meta-Infos erst im nächsten Frame pushen (Globals sind dann da) + Server.NextFrame(() => + { + if (!_enabled) return; + TrySafeInitialPush(); + }); _acceptTask = Task.Run(async () => { @@ -1561,18 +474,6 @@ public class WebSocketTelemetryPlugin : BasePlugin } } }); - - _ = Task.Run(async () => - { - var ct = _serverCts!.Token; - while (!ct.IsCancellationRequested) - { - if (_outbox.IsEmpty) _sendSignal.WaitOne(200); - while (_outbox.TryDequeue(out var msg)) - Broadcast(msg); - await Task.Delay(1, ct); - } - }); } catch (Exception ex) { @@ -1602,26 +503,6 @@ public class WebSocketTelemetryPlugin : BasePlugin _acceptTask = null; } - private void Broadcast(string text) - { - foreach (var kv in _clients) - { - var id = kv.Key; - var c = kv.Value; - try - { - SendTextFrame(c, text); - } - catch - { - _clients.TryRemove(id, out _); - try { c.Cts.Cancel(); } catch { } - try { c.Stream.Close(); } catch { } - try { c.Tcp.Close(); } catch { } - } - } - } - private async Task HandleClientAsync(TcpClient tcp, CancellationToken serverCt) { var id = Interlocked.Increment(ref _clientSeq); @@ -1650,8 +531,7 @@ public class WebSocketTelemetryPlugin : BasePlugin } catch (AuthenticationException aex) { - Logger.LogError($"[WS] TLS-Handshake fehlgeschlagen: {aex.Message}. " + - $"Tipp: Stimmt das PFX und das CertPassword aus {ConfigFileName}?"); + Logger.LogError($"[WS] TLS-Handshake fehlgeschlagen: {aex.Message}. Tipp: PFX & Passwort in {ConfigFileName} prüfen."); throw; } stream = ssl; @@ -1668,12 +548,16 @@ public class WebSocketTelemetryPlugin : BasePlugin Logger.LogInformation($"[WS] Client #{id} verbunden. Aktive: {_clients.Count}"); + // Initial: Map + kompletter Roster try { var nowMs = NowMs(); SendTextFrame(state, JsonSerializer.Serialize(new { type = "map", name = _mapName, t = nowMs })); + // volle Liste an diesen Client: + var buf = BuildPlayersPayload(); + SendTextFrame(state, buf); } - catch { } + catch { /* ignore */ } await ReceiveLoop(state, serverCt); } @@ -1693,8 +577,44 @@ public class WebSocketTelemetryPlugin : BasePlugin } } - // --- Minimaler WebSocket-Server: Handshake + Frames --- + private string BuildPlayersPayload() + { + var list = new List(); + foreach (var p in Utilities.GetPlayers()) + { + try + { + if (p == null || !p.IsValid) continue; + list.Add(new + { + steamId = p.AuthorizedSteamID?.SteamId64 ?? 0UL, + name = p.PlayerName, + team = p.TeamNum, + isBot = p.IsBot + }); + } + catch { } + } + return JsonSerializer.Serialize(new { type = "players", t = NowMs(), players = list }); + } + private void Broadcast(string text) + { + foreach (var kv in _clients) + { + var c = kv.Value; + try { SendTextFrame(c, text); } + catch + { + _clients.TryRemove(kv.Key, out _); + try { c.Cts.Cancel(); } catch { } + try { c.Stream.Close(); } catch { } + try { c.Tcp.Close(); } catch { } + } + } + } + + // --- Minimal WebSocket (Handshake + Frames) --- private static async Task ReadHeadersAsync(Stream s, CancellationToken ct) { var buf = new byte[8192]; @@ -1710,9 +630,7 @@ public class WebSocketTelemetryPlugin : BasePlugin for (int i = 3; i < ms.Length; i++) { if (b[i - 3] == '\r' && b[i - 2] == '\n' && b[i - 1] == '\r' && b[i] == '\n') - { return Encoding.ASCII.GetString(b, 0, i + 1); - } } } if (ms.Length > 65536) throw new Exception("Header zu groß"); @@ -1959,7 +877,7 @@ public class WebSocketTelemetryPlugin : BasePlugin if (string.IsNullOrWhiteSpace(usedPath) || !File.Exists(usedPath)) { - Logger.LogWarning($"[WS] Kein PFX gefunden im Plugin-Ordner ({pluginDir}). Lege z.B. 'cert.pfx' dort ab oder setze mit css_ws_cert ."); + Logger.LogWarning($"[WS] Kein PFX im Plugin-Ordner ({pluginDir}) gefunden. Lege z.B. 'cert.pfx' dort ab oder setze mit css_meta_cert ."); return false; } diff --git a/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.csproj b/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.csproj index 90ab003..3272eb5 100644 --- a/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.csproj +++ b/CS2WebSocketTelemetryPlugin/CS2WebSocketTelemetryPlugin.csproj @@ -7,7 +7,7 @@ - + diff --git a/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.deps.json b/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.deps.json index a921c2a..534e4a5 100644 --- a/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.deps.json +++ b/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.deps.json @@ -8,13 +8,13 @@ ".NETCoreApp,Version=v8.0": { "CS2WebSocketTelemetryPlugin/1.0.0": { "dependencies": { - "CounterStrikeSharp.API": "1.0.336" + "CounterStrikeSharp.API": "1.0.339" }, "runtime": { "CS2WebSocketTelemetryPlugin.dll": {} } }, - "CounterStrikeSharp.API/1.0.336": { + "CounterStrikeSharp.API/1.0.339": { "dependencies": { "McMaster.NETCore.Plugins": "1.4.0", "Microsoft.CSharp": "4.7.0", @@ -32,8 +32,8 @@ }, "runtime": { "lib/net8.0/CounterStrikeSharp.API.dll": { - "assemblyVersion": "1.0.336.0", - "fileVersion": "1.0.336.0" + "assemblyVersion": "1.0.339.0", + "fileVersion": "1.0.339.0" } } }, @@ -548,12 +548,12 @@ "serviceable": false, "sha512": "" }, - "CounterStrikeSharp.API/1.0.336": { + "CounterStrikeSharp.API/1.0.339": { "type": "package", "serviceable": true, - "sha512": "sha512-2XNnJlbU5tNgj4bJ3/Z1cX9qao1RThHqiNJEa0PZCK6J7KPkRTLGS7DpejteTjlpKdQdAiNd9a90feYhP6KSVA==", - "path": "counterstrikesharp.api/1.0.336", - "hashPath": "counterstrikesharp.api.1.0.336.nupkg.sha512" + "sha512": "sha512-0gJ6dBB0cicdhgfSkRe50gQjdVDo/vo6N8ZxG7As6Fz6QDPnF/brxY7Tn8MWlD74zY+ynd8UHL8W6mRrDPVtPA==", + "path": "counterstrikesharp.api/1.0.339", + "hashPath": "counterstrikesharp.api.1.0.339.nupkg.sha512" }, "McMaster.NETCore.Plugins/1.4.0": { "type": "package", diff --git a/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll index 8017e44..39bd188 100644 Binary files a/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll and b/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll differ diff --git a/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb b/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb index 3c7eefe..050e114 100644 Binary files a/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb and b/CS2WebSocketTelemetryPlugin/bin/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb differ diff --git a/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.deps.json b/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.deps.json deleted file mode 100644 index a921c2a..0000000 --- a/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.deps.json +++ /dev/null @@ -1,888 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v8.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v8.0": { - "CS2WebSocketTelemetryPlugin/1.0.0": { - "dependencies": { - "CounterStrikeSharp.API": "1.0.336" - }, - "runtime": { - "CS2WebSocketTelemetryPlugin.dll": {} - } - }, - "CounterStrikeSharp.API/1.0.336": { - "dependencies": { - "McMaster.NETCore.Plugins": "1.4.0", - "Microsoft.CSharp": "4.7.0", - "Microsoft.DotNet.ApiCompat.Task": "8.0.203", - "Microsoft.Extensions.Hosting": "8.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", - "Microsoft.Extensions.Localization.Abstractions": "8.0.3", - "Microsoft.Extensions.Logging": "8.0.0", - "Scrutor": "4.2.2", - "Serilog.Extensions.Logging": "8.0.0", - "Serilog.Sinks.Console": "5.0.0", - "Serilog.Sinks.File": "5.0.0", - "System.Data.DataSetExtensions": "4.5.0", - "Tomlyn": "0.19.0" - }, - "runtime": { - "lib/net8.0/CounterStrikeSharp.API.dll": { - "assemblyVersion": "1.0.336.0", - "fileVersion": "1.0.336.0" - } - } - }, - "McMaster.NETCore.Plugins/1.4.0": { - "dependencies": { - "Microsoft.DotNet.PlatformAbstractions": "3.1.6", - "Microsoft.Extensions.DependencyModel": "6.0.0" - }, - "runtime": { - "lib/netcoreapp3.1/McMaster.NETCore.Plugins.dll": { - "assemblyVersion": "1.4.0.0", - "fileVersion": "1.4.0.0" - } - } - }, - "Microsoft.CSharp/4.7.0": {}, - "Microsoft.DotNet.ApiCompat.Task/8.0.203": {}, - "Microsoft.DotNet.PlatformAbstractions/3.1.6": { - "runtime": { - "lib/netstandard2.0/Microsoft.DotNet.PlatformAbstractions.dll": { - "assemblyVersion": "3.1.6.0", - "fileVersion": "3.100.620.31604" - } - } - }, - "Microsoft.Extensions.Configuration/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Configuration.Binder/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.Binder.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Configuration.CommandLine/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.CommandLine.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Configuration.FileExtensions/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Configuration.Json/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "System.Text.Json": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.Json.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Configuration.UserSecrets/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Json": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Configuration.UserSecrets.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.DependencyInjection/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { - "runtime": { - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.DependencyModel/6.0.0": { - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "8.0.0", - "System.Text.Json": "8.0.0" - }, - "runtime": { - "lib/netstandard2.0/Microsoft.Extensions.DependencyModel.dll": { - "assemblyVersion": "6.0.0.0", - "fileVersion": "6.0.21.52210" - } - } - }, - "Microsoft.Extensions.Diagnostics/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Diagnostics.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Diagnostics.Abstractions/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.FileProviders.Abstractions/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.FileProviders.Physical/8.0.0": { - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.FileProviders.Physical.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.FileSystemGlobbing/8.0.0": { - "runtime": { - "lib/net8.0/Microsoft.Extensions.FileSystemGlobbing.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Hosting/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "8.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", - "Microsoft.Extensions.Configuration.Json": "8.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Diagnostics": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Configuration": "8.0.0", - "Microsoft.Extensions.Logging.Console": "8.0.0", - "Microsoft.Extensions.Logging.Debug": "8.0.0", - "Microsoft.Extensions.Logging.EventLog": "8.0.0", - "Microsoft.Extensions.Logging.EventSource": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Hosting.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Hosting.Abstractions/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Localization.Abstractions/8.0.3": { - "runtime": { - "lib/net8.0/Microsoft.Extensions.Localization.Abstractions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.324.11615" - } - } - }, - "Microsoft.Extensions.Logging/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Logging.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Logging.Abstractions/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Logging.Configuration/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Logging.Configuration.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Logging.Console/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Configuration": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Text.Json": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Logging.Console.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Logging.Debug/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Logging.Debug.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Logging.EventLog/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.EventLog": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Logging.EventLog.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Logging.EventSource/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", - "System.Text.Json": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Logging.EventSource.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Options/8.0.0": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Options.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "runtime": { - "lib/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Microsoft.Extensions.Primitives/8.0.0": { - "runtime": { - "lib/net8.0/Microsoft.Extensions.Primitives.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "Scrutor/4.2.2": { - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.0" - }, - "runtime": { - "lib/net6.0/Scrutor.dll": { - "assemblyVersion": "4.0.0.0", - "fileVersion": "4.0.0.0" - } - } - }, - "Serilog/3.1.1": { - "runtime": { - "lib/net7.0/Serilog.dll": { - "assemblyVersion": "2.0.0.0", - "fileVersion": "3.1.1.0" - } - } - }, - "Serilog.Extensions.Logging/8.0.0": { - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - }, - "runtime": { - "lib/net8.0/Serilog.Extensions.Logging.dll": { - "assemblyVersion": "7.0.0.0", - "fileVersion": "8.0.0.0" - } - } - }, - "Serilog.Sinks.Console/5.0.0": { - "dependencies": { - "Serilog": "3.1.1" - }, - "runtime": { - "lib/net7.0/Serilog.Sinks.Console.dll": { - "assemblyVersion": "5.0.0.0", - "fileVersion": "5.0.0.0" - } - } - }, - "Serilog.Sinks.File/5.0.0": { - "dependencies": { - "Serilog": "3.1.1" - }, - "runtime": { - "lib/net5.0/Serilog.Sinks.File.dll": { - "assemblyVersion": "5.0.0.0", - "fileVersion": "5.0.0.0" - } - } - }, - "System.Buffers/4.5.1": {}, - "System.Data.DataSetExtensions/4.5.0": {}, - "System.Diagnostics.DiagnosticSource/8.0.0": {}, - "System.Diagnostics.EventLog/8.0.0": { - "runtime": { - "lib/net8.0/System.Diagnostics.EventLog.dll": { - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - }, - "runtimeTargets": { - "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": { - "rid": "win", - "assetType": "runtime", - "assemblyVersion": "8.0.0.0", - "fileVersion": "0.0.0.0" - }, - "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": { - "rid": "win", - "assetType": "runtime", - "assemblyVersion": "8.0.0.0", - "fileVersion": "8.0.23.53103" - } - } - }, - "System.Memory/4.5.4": {}, - "System.Runtime.CompilerServices.Unsafe/6.0.0": {}, - "System.Text.Encodings.Web/8.0.0": {}, - "System.Text.Json/8.0.0": { - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - }, - "Tomlyn/0.19.0": { - "runtime": { - "lib/net8.0/Tomlyn.dll": { - "assemblyVersion": "0.19.0.0", - "fileVersion": "0.19.0.0" - } - } - } - } - }, - "libraries": { - "CS2WebSocketTelemetryPlugin/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - }, - "CounterStrikeSharp.API/1.0.336": { - "type": "package", - "serviceable": true, - "sha512": "sha512-2XNnJlbU5tNgj4bJ3/Z1cX9qao1RThHqiNJEa0PZCK6J7KPkRTLGS7DpejteTjlpKdQdAiNd9a90feYhP6KSVA==", - "path": "counterstrikesharp.api/1.0.336", - "hashPath": "counterstrikesharp.api.1.0.336.nupkg.sha512" - }, - "McMaster.NETCore.Plugins/1.4.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-UKw5Z2/QHhkR7kiAJmqdCwVDMQV0lwsfj10+FG676r8DsJWIpxtachtEjE0qBs9WoK5GUQIqxgyFeYUSwuPszg==", - "path": "mcmaster.netcore.plugins/1.4.0", - "hashPath": "mcmaster.netcore.plugins.1.4.0.nupkg.sha512" - }, - "Microsoft.CSharp/4.7.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==", - "path": "microsoft.csharp/4.7.0", - "hashPath": "microsoft.csharp.4.7.0.nupkg.sha512" - }, - "Microsoft.DotNet.ApiCompat.Task/8.0.203": { - "type": "package", - "serviceable": true, - "sha512": "sha512-nPEGMojf1mj1oVixe0aiBimSn6xUoZswSjpMPZFMkZ+znYm2GEM5tWGZEWb6OSNIo5gWKyDi1WcI4IL7YiL1Zw==", - "path": "microsoft.dotnet.apicompat.task/8.0.203", - "hashPath": "microsoft.dotnet.apicompat.task.8.0.203.nupkg.sha512" - }, - "Microsoft.DotNet.PlatformAbstractions/3.1.6": { - "type": "package", - "serviceable": true, - "sha512": "sha512-jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==", - "path": "microsoft.dotnet.platformabstractions/3.1.6", - "hashPath": "microsoft.dotnet.platformabstractions.3.1.6.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", - "path": "microsoft.extensions.configuration/8.0.0", - "hashPath": "microsoft.extensions.configuration.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", - "path": "microsoft.extensions.configuration.abstractions/8.0.0", - "hashPath": "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration.Binder/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", - "path": "microsoft.extensions.configuration.binder/8.0.0", - "hashPath": "microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration.CommandLine/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==", - "path": "microsoft.extensions.configuration.commandline/8.0.0", - "hashPath": "microsoft.extensions.configuration.commandline.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", - "path": "microsoft.extensions.configuration.environmentvariables/8.0.0", - "hashPath": "microsoft.extensions.configuration.environmentvariables.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration.FileExtensions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", - "path": "microsoft.extensions.configuration.fileextensions/8.0.0", - "hashPath": "microsoft.extensions.configuration.fileextensions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration.Json/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", - "path": "microsoft.extensions.configuration.json/8.0.0", - "hashPath": "microsoft.extensions.configuration.json.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Configuration.UserSecrets/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-ihDHu2dJYQird9pl2CbdwuNDfvCZdOS0S7SPlNfhPt0B81UTT+yyZKz2pimFZGUp3AfuBRnqUCxB2SjsZKHVUw==", - "path": "microsoft.extensions.configuration.usersecrets/8.0.0", - "hashPath": "microsoft.extensions.configuration.usersecrets.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.DependencyInjection/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "path": "microsoft.extensions.dependencyinjection/8.0.0", - "hashPath": "microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", - "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.0", - "hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.DependencyModel/6.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", - "path": "microsoft.extensions.dependencymodel/6.0.0", - "hashPath": "microsoft.extensions.dependencymodel.6.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Diagnostics/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==", - "path": "microsoft.extensions.diagnostics/8.0.0", - "hashPath": "microsoft.extensions.diagnostics.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Diagnostics.Abstractions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", - "path": "microsoft.extensions.diagnostics.abstractions/8.0.0", - "hashPath": "microsoft.extensions.diagnostics.abstractions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.FileProviders.Abstractions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", - "path": "microsoft.extensions.fileproviders.abstractions/8.0.0", - "hashPath": "microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.FileProviders.Physical/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", - "path": "microsoft.extensions.fileproviders.physical/8.0.0", - "hashPath": "microsoft.extensions.fileproviders.physical.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.FileSystemGlobbing/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==", - "path": "microsoft.extensions.filesystemglobbing/8.0.0", - "hashPath": "microsoft.extensions.filesystemglobbing.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Hosting/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-ItYHpdqVp5/oFLT5QqbopnkKlyFG9EW/9nhM6/yfObeKt6Su0wkBio6AizgRHGNwhJuAtlE5VIjow5JOTrip6w==", - "path": "microsoft.extensions.hosting/8.0.0", - "hashPath": "microsoft.extensions.hosting.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Hosting.Abstractions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", - "path": "microsoft.extensions.hosting.abstractions/8.0.0", - "hashPath": "microsoft.extensions.hosting.abstractions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Localization.Abstractions/8.0.3": { - "type": "package", - "serviceable": true, - "sha512": "sha512-k/kUPm1FQBxcs9/vsM1eF4qIOg2Sovqh/+KUGHur5Mc0Y3OFGuoz9ktBX7LA0gPz53SZhW3W3oaSaMFFcjgM6Q==", - "path": "microsoft.extensions.localization.abstractions/8.0.3", - "hashPath": "microsoft.extensions.localization.abstractions.8.0.3.nupkg.sha512" - }, - "Microsoft.Extensions.Logging/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "path": "microsoft.extensions.logging/8.0.0", - "hashPath": "microsoft.extensions.logging.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Logging.Abstractions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "path": "microsoft.extensions.logging.abstractions/8.0.0", - "hashPath": "microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Logging.Configuration/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", - "path": "microsoft.extensions.logging.configuration/8.0.0", - "hashPath": "microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Logging.Console/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-e+48o7DztoYog+PY430lPxrM4mm3PbA6qucvQtUDDwVo4MO+ejMw7YGc/o2rnxbxj4isPxdfKFzTxvXMwAz83A==", - "path": "microsoft.extensions.logging.console/8.0.0", - "hashPath": "microsoft.extensions.logging.console.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Logging.Debug/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-dt0x21qBdudHLW/bjMJpkixv858RRr8eSomgVbU8qljOyfrfDGi1JQvpF9w8S7ziRPtRKisuWaOwFxJM82GxeA==", - "path": "microsoft.extensions.logging.debug/8.0.0", - "hashPath": "microsoft.extensions.logging.debug.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Logging.EventLog/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-3X9D3sl7EmOu7vQp5MJrmIJBl5XSdOhZPYXUeFfYa6Nnm9+tok8x3t3IVPLhm7UJtPOU61ohFchw8rNm9tIYOQ==", - "path": "microsoft.extensions.logging.eventlog/8.0.0", - "hashPath": "microsoft.extensions.logging.eventlog.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Logging.EventSource/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-oKcPMrw+luz2DUAKhwFXrmFikZWnyc8l2RKoQwqU3KIZZjcfoJE0zRHAnqATfhRZhtcbjl/QkiY2Xjxp0xu+6w==", - "path": "microsoft.extensions.logging.eventsource/8.0.0", - "hashPath": "microsoft.extensions.logging.eventsource.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Options/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "path": "microsoft.extensions.options/8.0.0", - "hashPath": "microsoft.extensions.options.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", - "path": "microsoft.extensions.options.configurationextensions/8.0.0", - "hashPath": "microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512" - }, - "Microsoft.Extensions.Primitives/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "path": "microsoft.extensions.primitives/8.0.0", - "hashPath": "microsoft.extensions.primitives.8.0.0.nupkg.sha512" - }, - "Scrutor/4.2.2": { - "type": "package", - "serviceable": true, - "sha512": "sha512-t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", - "path": "scrutor/4.2.2", - "hashPath": "scrutor.4.2.2.nupkg.sha512" - }, - "Serilog/3.1.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==", - "path": "serilog/3.1.1", - "hashPath": "serilog.3.1.1.nupkg.sha512" - }, - "Serilog.Extensions.Logging/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "path": "serilog.extensions.logging/8.0.0", - "hashPath": "serilog.extensions.logging.8.0.0.nupkg.sha512" - }, - "Serilog.Sinks.Console/5.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-IZ6bn79k+3SRXOBpwSOClUHikSkp2toGPCZ0teUkscv4dpDg9E2R2xVsNkLmwddE4OpNVO3N0xiYsAH556vN8Q==", - "path": "serilog.sinks.console/5.0.0", - "hashPath": "serilog.sinks.console.5.0.0.nupkg.sha512" - }, - "Serilog.Sinks.File/5.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "path": "serilog.sinks.file/5.0.0", - "hashPath": "serilog.sinks.file.5.0.0.nupkg.sha512" - }, - "System.Buffers/4.5.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", - "path": "system.buffers/4.5.1", - "hashPath": "system.buffers.4.5.1.nupkg.sha512" - }, - "System.Data.DataSetExtensions/4.5.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-221clPs1445HkTBZPL+K9sDBdJRB8UN8rgjO3ztB0CQ26z//fmJXtlsr6whGatscsKGBrhJl5bwJuKSA8mwFOw==", - "path": "system.data.datasetextensions/4.5.0", - "hashPath": "system.data.datasetextensions.4.5.0.nupkg.sha512" - }, - "System.Diagnostics.DiagnosticSource/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", - "path": "system.diagnostics.diagnosticsource/8.0.0", - "hashPath": "system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512" - }, - "System.Diagnostics.EventLog/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==", - "path": "system.diagnostics.eventlog/8.0.0", - "hashPath": "system.diagnostics.eventlog.8.0.0.nupkg.sha512" - }, - "System.Memory/4.5.4": { - "type": "package", - "serviceable": true, - "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", - "path": "system.memory/4.5.4", - "hashPath": "system.memory.4.5.4.nupkg.sha512" - }, - "System.Runtime.CompilerServices.Unsafe/6.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", - "path": "system.runtime.compilerservices.unsafe/6.0.0", - "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" - }, - "System.Text.Encodings.Web/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", - "path": "system.text.encodings.web/8.0.0", - "hashPath": "system.text.encodings.web.8.0.0.nupkg.sha512" - }, - "System.Text.Json/8.0.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "path": "system.text.json/8.0.0", - "hashPath": "system.text.json.8.0.0.nupkg.sha512" - }, - "Tomlyn/0.19.0": { - "type": "package", - "serviceable": true, - "sha512": "sha512-GlI2o8R8jbZIaE+YX6uA/VoAOH7zIxYeqxDm7jHW2hqUhuB+q19oKold35FkMuv8IZDoCqsTMolaBv2eBLBmrQ==", - "path": "tomlyn/0.19.0", - "hashPath": "tomlyn.0.19.0.nupkg.sha512" - } - } -} \ No newline at end of file diff --git a/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.dll deleted file mode 100644 index 3eeba42..0000000 Binary files a/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.dll and /dev/null differ diff --git a/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.pdb b/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.pdb deleted file mode 100644 index 267151a..0000000 Binary files a/CS2WebSocketTelemetryPlugin/bin/Release/net8.0/CS2WebSocketTelemetryPlugin.pdb and /dev/null differ diff --git a/CS2WebSocketTelemetryPlugin/obj/CS2WebSocketTelemetryPlugin.csproj.nuget.dgspec.json b/CS2WebSocketTelemetryPlugin/obj/CS2WebSocketTelemetryPlugin.csproj.nuget.dgspec.json index 8cf85b6..52fd8a1 100644 --- a/CS2WebSocketTelemetryPlugin/obj/CS2WebSocketTelemetryPlugin.csproj.nuget.dgspec.json +++ b/CS2WebSocketTelemetryPlugin/obj/CS2WebSocketTelemetryPlugin.csproj.nuget.dgspec.json @@ -52,7 +52,7 @@ "dependencies": { "CounterStrikeSharp.API": { "target": "Package", - "version": "[1.0.336, )" + "version": "[1.0.339, )" } }, "imports": [ diff --git a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfo.cs b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfo.cs index ea8bd81..833af21 100644 --- a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfo.cs +++ b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("CS2WebSocketTelemetryPlugin")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ef5b771986e375fbf520c64f76d67dd104f3f5d7")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+bbb771053743ef53105878275a07205980b9b802")] [assembly: System.Reflection.AssemblyProductAttribute("CS2WebSocketTelemetryPlugin")] [assembly: System.Reflection.AssemblyTitleAttribute("CS2WebSocketTelemetryPlugin")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll index 8017e44..39bd188 100644 Binary files a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll and b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.dll differ diff --git a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb index 3c7eefe..050e114 100644 Binary files a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb and b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/CS2WebSocketTelemetryPlugin.pdb differ diff --git a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/ref/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/ref/CS2WebSocketTelemetryPlugin.dll index 94450e9..a6df62c 100644 Binary files a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/ref/CS2WebSocketTelemetryPlugin.dll and b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/ref/CS2WebSocketTelemetryPlugin.dll differ diff --git a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/refint/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/refint/CS2WebSocketTelemetryPlugin.dll index 94450e9..a6df62c 100644 Binary files a/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/refint/CS2WebSocketTelemetryPlugin.dll and b/CS2WebSocketTelemetryPlugin/obj/Debug/net8.0/refint/CS2WebSocketTelemetryPlugin.dll differ diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs deleted file mode 100644 index 2217181..0000000 --- a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfo.cs b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfo.cs deleted file mode 100644 index 5973c9a..0000000 --- a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("CS2WebSocketTelemetryPlugin")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ef5b771986e375fbf520c64f76d67dd104f3f5d7")] -[assembly: System.Reflection.AssemblyProductAttribute("CS2WebSocketTelemetryPlugin")] -[assembly: System.Reflection.AssemblyTitleAttribute("CS2WebSocketTelemetryPlugin")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Von der MSBuild WriteCodeFragment-Klasse generiert. - diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfoInputs.cache b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfoInputs.cache deleted file mode 100644 index a78e45c..0000000 --- a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -2ecdd85e0196dc62d4eabd8acdca165a11046a2240dfca955a2362f9105bf305 diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.GeneratedMSBuildEditorConfig.editorconfig b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index 93b1b8b..0000000 --- a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -is_global = true -build_property.TargetFramework = net8.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = CS2WebSocketTelemetryPlugin -build_property.ProjectDir = C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.GlobalUsings.g.cs b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.csproj.FileListAbsolute.txt b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.csproj.FileListAbsolute.txt deleted file mode 100644 index 369f815..0000000 --- a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,24 +0,0 @@ -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.GeneratedMSBuildEditorConfig.editorconfig -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.AssemblyInfoInputs.cache -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.AssemblyInfo.cs -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.csproj.CoreCompileInputs.cache -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\bin\Release\net8.0\CS2WebSocketTelemetryPlugin.deps.json -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\bin\Release\net8.0\CS2WebSocketTelemetryPlugin.dll -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\bin\Release\net8.0\CS2WebSocketTelemetryPlugin.pdb -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.csproj.AssemblyReference.cache -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.dll -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\refint\CS2WebSocketTelemetryPlugin.dll -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.pdb -C:\Users\Chris\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\ref\CS2WebSocketTelemetryPlugin.dll -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\bin\Release\net8.0\CS2WebSocketTelemetryPlugin.deps.json -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\bin\Release\net8.0\CS2WebSocketTelemetryPlugin.dll -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\bin\Release\net8.0\CS2WebSocketTelemetryPlugin.pdb -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.csproj.AssemblyReference.cache -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.GeneratedMSBuildEditorConfig.editorconfig -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.AssemblyInfoInputs.cache -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.AssemblyInfo.cs -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.csproj.CoreCompileInputs.cache -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.dll -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\refint\CS2WebSocketTelemetryPlugin.dll -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\CS2WebSocketTelemetryPlugin.pdb -C:\Users\Rother\fork\ironie-cs2-websocket-plugin\CS2WebSocketTelemetryPlugin\obj\Release\net8.0\ref\CS2WebSocketTelemetryPlugin.dll diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.dll deleted file mode 100644 index 3eeba42..0000000 Binary files a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.dll and /dev/null differ diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.pdb b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.pdb deleted file mode 100644 index 267151a..0000000 Binary files a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/CS2WebSocketTelemetryPlugin.pdb and /dev/null differ diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/ref/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/ref/CS2WebSocketTelemetryPlugin.dll deleted file mode 100644 index 9687164..0000000 Binary files a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/ref/CS2WebSocketTelemetryPlugin.dll and /dev/null differ diff --git a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/refint/CS2WebSocketTelemetryPlugin.dll b/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/refint/CS2WebSocketTelemetryPlugin.dll deleted file mode 100644 index 9687164..0000000 Binary files a/CS2WebSocketTelemetryPlugin/obj/Release/net8.0/refint/CS2WebSocketTelemetryPlugin.dll and /dev/null differ diff --git a/CS2WebSocketTelemetryPlugin/obj/project.assets.json b/CS2WebSocketTelemetryPlugin/obj/project.assets.json index 97fb105..416fe03 100644 --- a/CS2WebSocketTelemetryPlugin/obj/project.assets.json +++ b/CS2WebSocketTelemetryPlugin/obj/project.assets.json @@ -2,7 +2,7 @@ "version": 3, "targets": { "net8.0": { - "CounterStrikeSharp.API/1.0.336": { + "CounterStrikeSharp.API/1.0.339": { "type": "package", "dependencies": { "McMaster.NETCore.Plugins": "1.4.0", @@ -912,14 +912,14 @@ } }, "libraries": { - "CounterStrikeSharp.API/1.0.336": { - "sha512": "2XNnJlbU5tNgj4bJ3/Z1cX9qao1RThHqiNJEa0PZCK6J7KPkRTLGS7DpejteTjlpKdQdAiNd9a90feYhP6KSVA==", + "CounterStrikeSharp.API/1.0.339": { + "sha512": "0gJ6dBB0cicdhgfSkRe50gQjdVDo/vo6N8ZxG7As6Fz6QDPnF/brxY7Tn8MWlD74zY+ynd8UHL8W6mRrDPVtPA==", "type": "package", - "path": "counterstrikesharp.api/1.0.336", + "path": "counterstrikesharp.api/1.0.339", "files": [ ".nupkg.metadata", ".signature.p7s", - "counterstrikesharp.api.1.0.336.nupkg.sha512", + "counterstrikesharp.api.1.0.339.nupkg.sha512", "counterstrikesharp.api.nuspec", "lib/net8.0/CounterStrikeSharp.API.dll", "lib/net8.0/CounterStrikeSharp.API.runtimeconfig.json", @@ -2551,7 +2551,7 @@ }, "projectFileDependencyGroups": { "net8.0": [ - "CounterStrikeSharp.API >= 1.0.336" + "CounterStrikeSharp.API >= 1.0.339" ] }, "packageFolders": { @@ -2606,7 +2606,7 @@ "dependencies": { "CounterStrikeSharp.API": { "target": "Package", - "version": "[1.0.336, )" + "version": "[1.0.339, )" } }, "imports": [