using System.Numerics; using OnekoOnline.Net; using Raylib_cs; namespace OnekoOnline; class OnekoNet : Oneko { readonly User MyUser; public static Dictionary NetNekos = []; float NetworkIssueTimer = 0f; public OnekoNet(Bitmap bitmap, ClientUser user) : base(bitmap) { MyUser = user; Name = user.Nekoname!; Client.UserDisconnected += disconnectedUser => { if (disconnectedUser == MyUser) Dispose(); }; Client.PacketRecived += (reader, user, packetType) => { if (user != MyUser) return; if (packetType == PacketType.OnekoState) { Position = reader.GetVector2(); FrameId = reader.GetByte(); NetworkIssueTimer = 0f; } }; Client.ServerDisconnected += Dispose; } public override void Update(float delta) { NetworkIssueTimer += delta; if (NetworkIssueTimer < 0.6f) ColorTint = Color.White; else ColorTint = Color.White with {A = 120}; } public static void SpawnNetNeko(ClientUser user) { if (!user.SpectatorMode && !NetNekos.ContainsKey(user.Id)) { Bitmap spriteSheet = Bitmap.Deserialize(user.SpriteSheet, 256, 128, FallbackImg); NetNekos.Add(user.Id, new OnekoNet(spriteSheet, user)); } } protected override void Unload() { NetNekos.Remove(MyUser.Id); base.Unload(); } public static void DisconnectAll() { foreach (OnekoNet neko in NetNekos.Values) neko.Dispose(); } }