using Godot; using System.Threading; using Thread = System.Threading.Thread; public abstract class Peer : Object { private static PacketPeerUDP PacketPeer; private static Peer Singleton; private int LastConnectionSended = -1; private Thread ListenerThread; public Peer(PacketPeerUDP packetPeer) { PacketPeer = packetPeer; } public abstract void Initialize(string address, int port); public abstract void Update(float delta); public abstract void ReceivePacket(byte[] buffer, string address, int port); public void SendBuffer(byte[] buffer, Connection to) { int temp1 = PacketPeer.SetDestAddress(to.Address, to.Port); int temp2 = PacketPeer.PutPacket(buffer); GD.print("Putting stuff to " + to.Address + ":" + to.Port); } public bool StartListening(int port, string address = "*") { if (PacketPeer.IsListening() || ListenerThread != null) { GD.printerr("The Peer is already listening or the thread is active!"); return false; } Singleton = this; PacketPeer.Listen(port, address); ThreadStart ChildRef = new ThreadStart(ListenerThreadMethod); ListenerThread = new Thread(ChildRef); ListenerThread.Start(); return true; } public static void ListenerThreadMethod() { GD.print("Started Listener Thread."); while (true) { PacketPeer.Wait(); byte[] Buffer = PacketPeer.GetPacket(); string Address = PacketPeer.GetPacketIp(); int Port = PacketPeer.GetPacketPort(); Singleton.ReceivePacket(Buffer, Address, Port); } } }