using System.Collections; using System.Collections.Generic; using UnityEngine; using NeonTea.Quakeball.Player; using NeonTea.Quakeball.Networking.Packets; using NeonTea.Quakeball.Interface; using NeonTea.Quakeball.TeaNet.Peers; using NeonTea.Quakeball.TeaNet.Packets; namespace NeonTea.Quakeball.Networking.Instances { public class Client : NetInstance { private NetChaperone Net; private Connection Server; private Dictionary Players = new Dictionary(); private NetPlayer LocalPlayer; private bool SelfIdentified = false; public override void Start(string address, int port, PeerMessageListener listener) { if (Peer != null) { return; } Peer = new Peer(Fingerprint); Peer.MessageListener = listener; Peer.Start(0); byte ident = Peer.RegisterProtocol(new GameProtocol(this)); Peer.Connect(address, port, ident); Net = GameObject.FindGameObjectWithTag("Net").GetComponent(); LocalPlayer = new NetPlayer(ulong.MaxValue - 1); LocalPlayer.Controlled = GameObject.FindGameObjectWithTag("Player"); } public override void Connected(Connection conn) { Terminal.Singleton.Println($"{conn.uid} Connected"); if (Server == null) { Server = conn; } else { Peer.Disconnect(conn.uid); } } public override void Disconnected(Connection conn) { Terminal.Singleton.Println($"{conn.uid} Disconnected: {conn.ClosingReason}"); if (Server == conn) { Server = null; } } public override void Handle(Connection conn, Packet packet) { if (packet is SelfIdentPckt) { SelfIdentPckt ident = (SelfIdentPckt)packet; LocalPlayer.Id = ident.PlayerId; Players.Add(LocalPlayer.Id, LocalPlayer); SelfIdentified = true; SpawnPckt spawn = new SpawnPckt(); spawn.Location = LocalPlayer.Controlled.transform.position; Peer.SendReliable(Server.uid, spawn); } else if (packet is SpawnPckt) { SpawnPckt spawn = (SpawnPckt)packet; if (spawn.PlayerId == LocalPlayer.Id) { return; // Ignore, it's their own. } GameObject obj = Net.SpawnPlayer(spawn.Location); NetPlayer player = new NetPlayer(spawn.PlayerId, obj); Players.Add(spawn.PlayerId, player); } else if (packet is PlayerUpdatePckt) { PlayerUpdatePckt updatePckt = (PlayerUpdatePckt)packet; if (updatePckt.PlayerId == LocalPlayer.Id) { return; // Ignore, again. } Players[updatePckt.PlayerId].Controlled.GetComponent().QueuePacket(updatePckt); } } public override void UpdateLocalPlayer(PlayerUpdatePckt pckt) { if (SelfIdentified) { Peer.SendUnreliable(Server.uid, pckt); } } } }