From 634b260e18e5d0d5fe02441c4a402127c06e9ad3 Mon Sep 17 00:00:00 2001 From: teascade Date: Sat, 25 Nov 2017 18:45:48 +0200 Subject: [PATCH] Add PeerListener and make Menu more visible --- TicTacToe.csproj | 2 ++ scenes/MainMenu.tscn | 21 +++++++++++++ scripts/MainMenu.cs | 29 ++++++++++++++++-- scripts/net/Client.cs | 24 ++++++++------- scripts/net/Net.cs | 10 ++++--- scripts/net/Peer.cs | 51 +++++++++++++++++++++++++------- scripts/net/PeerListener.cs | 15 ++++++++++ scripts/net/Server.cs | 2 +- scripts/util/DisconnectReason.cs | 2 +- 9 files changed, 128 insertions(+), 28 deletions(-) create mode 100644 scripts/net/PeerListener.cs diff --git a/TicTacToe.csproj b/TicTacToe.csproj index f4afb39..252c1b7 100644 --- a/TicTacToe.csproj +++ b/TicTacToe.csproj @@ -62,11 +62,13 @@ + + \ No newline at end of file diff --git a/scenes/MainMenu.tscn b/scenes/MainMenu.tscn index 0b41d94..4d98f9c 100644 --- a/scenes/MainMenu.tscn +++ b/scenes/MainMenu.tscn @@ -139,6 +139,27 @@ lines_skipped = 0 max_lines_visible = -1 _sections_unfolded = [ "Margin", "custom_fonts" ] +[node name="StatusText" type="Label" parent="Panel"] + +anchor_left = 0.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_top = -34.0 +margin_bottom = -15.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +size_flags_horizontal = 1 +size_flags_vertical = 4 +custom_fonts/font = ExtResource( 3 ) +text = "Status: Ok!" +align = 1 +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 +_sections_unfolded = [ "Anchor", "Margin", "custom_fonts" ] + [node name="IPAddress" type="LineEdit" parent="Panel"] anchor_left = 0.5 diff --git a/scripts/MainMenu.cs b/scripts/MainMenu.cs index cfd5487..2b5ffe5 100644 --- a/scripts/MainMenu.cs +++ b/scripts/MainMenu.cs @@ -1,24 +1,31 @@ using Godot; using System; using Network; +using Util; -public class MainMenu : Panel { +public class MainMenu : Panel, PeerListener { private Net Net; private LineEdit IPAddressEdit; private LineEdit PortEdit; + private Label StatusText; + public override void _Ready() { Net = (Net) GetNode("/root/Net"); var IPAddressNode = GetNode("IPAddress"); var PortNode = GetNode("Port"); + var StatusNode = GetNode("StatusText"); if (IPAddressNode is LineEdit) { IPAddressEdit = (LineEdit) IPAddressNode; } if (PortNode is LineEdit) { PortEdit = (LineEdit) PortNode; } + if (StatusNode is Label) { + StatusText = (Label) StatusNode; + } } private void OnLaunchServer() { @@ -35,7 +42,11 @@ public class MainMenu : Panel { string address; int port; SetAddressAndPort(out address, out port, "localhost", 7070); - Net.StartClient(address, port); + var Client = Net.StartClient(address, port); + if (Client != null) { + Client.AddPeerListener(this); + } + StatusText.Text = "Connecting.."; } private void SetAddressAndPort(out string address, out int port, string defaultAddress, int defaultPort) { @@ -53,4 +64,18 @@ public class MainMenu : Panel { } } } + + public void OnStart() { + } + + public void OnStop() { + } + + public void OnConnect(Connection conn) { + StatusText.Text = "Connecting.."; + } + + public void OnDisconnect(Connection conn, DisconnectReason reason) { + StatusText.Text = "Disconnected, reason: " + reason.ToString(); + } } diff --git a/scripts/net/Client.cs b/scripts/net/Client.cs index c30307b..92ff658 100644 --- a/scripts/net/Client.cs +++ b/scripts/net/Client.cs @@ -8,9 +8,7 @@ namespace Network { public class Client : Peer { private PacketPeerUDP PacketPeer; - private Connection ServerConn; - private float Timer = 0; public Client(PacketPeerUDP packetPeer) : base(packetPeer, false) { @@ -22,6 +20,7 @@ namespace Network { ServerConn = new Connection(address, port); ServerConn.Name = "Server"; ConnectionList.AddConnection(ServerConn); + SendBuffer(new PacketBuffer(), ServerConn); StartListening(port, "*"); } @@ -33,22 +32,27 @@ namespace Network { } public override void Process(float delta) { - Timer += delta; - if (Timer > 10) { - Timer = 0; - TextMessagePkt Pkt = new TextMessagePkt(); - Pkt.Text = "Hello, Server!"; - PacketDistributor.AddReliableForAll(Pkt); - GD.print("Hello'd the server!"); + if (Initialized) { + Timer += delta; + if (Timer > 10) { + Timer = 0; + TextMessagePkt Pkt = new TextMessagePkt(); + Pkt.Text = "Hello, Server!"; + PacketDistributor.AddReliableForAll(Pkt); + GD.print("Hello'd the server!"); + } } } public override void Connected(Connection conn) { GD.print("Connected to " + conn.Name + " at " + conn.Address + ":" + conn.Port); PacketDistributor.AddHandler(ServerConn); + foreach (PeerListener listener in PeerListeners) { + listener.OnConnect(conn); + } } - public override void Disconnected(Connection conn) { + public override void Disconnected(Connection conn, DisconnectReason reason) { Stop(); // Stop the client if it disconnects. } } diff --git a/scripts/net/Net.cs b/scripts/net/Net.cs index 2f61daf..15ff78c 100644 --- a/scripts/net/Net.cs +++ b/scripts/net/Net.cs @@ -25,16 +25,18 @@ namespace Network { if (IsClient) { Client.Free(); } } - public void StartClient(string address, int port) { - if (IsClient || IsServer) { return; } + public Client StartClient(string address, int port) { + if (IsServer) { return null; } Client = new Client(PacketPeer); Client.Start(address, port); + return Client; } - public void StartServer(string address, int port) { - if (IsClient || IsServer) { return; } + public Server StartServer(string address, int port) { + if (IsClient) { return null; } Server = new Server(PacketPeer); Server.Start(address, port); + return Server; } } } diff --git a/scripts/net/Peer.cs b/scripts/net/Peer.cs index 7c0c55a..dac50fb 100644 --- a/scripts/net/Peer.cs +++ b/scripts/net/Peer.cs @@ -1,6 +1,7 @@ using Godot; using Network.PacketHandling; using Network.Syncing; +using System.Collections.Generic; using System.Threading; using Util; using Thread = System.Threading.Thread; @@ -13,7 +14,7 @@ namespace Network { private static PacketPeerUDP PacketPeer; private static Peer Singleton; public readonly bool IsServer; - private bool Initialized = false; + public bool Initialized { get; private set; } = false; public Protocol Protocol; @@ -26,6 +27,8 @@ namespace Network { private bool ShouldListen = false; + public List PeerListeners = new List(); + public Peer(PacketPeerUDP packetPeer, bool isServer) { PacketPeer = packetPeer; IsServer = isServer; @@ -40,28 +43,36 @@ namespace Network { } public void Start(string address, int port) { + if (Initialized) { return; } Singleton = this; Initialize(address, port); Initialized = true; + foreach (PeerListener listener in PeerListeners) { + listener.OnStart(); + } } public void Stop() { + if (!Initialized) { return; } Uninitialize(); Initialized = false; + foreach (PeerListener listener in PeerListeners) { + listener.OnStop(); + } } public abstract void Initialize(string address, int port); public abstract void Uninitialize(); public abstract void Process(float delta); public abstract void Connected(Connection conn); - public abstract void Disconnected(Connection conn); + public abstract void Disconnected(Connection conn, DisconnectReason reason); - public void SendBuffer(PacketBuffer packetBuffer, Connection to) { + public int SendBuffer(PacketBuffer packetBuffer, Connection to) { if (LastConnectionSended != to.ID) { PacketPeer.SetDestAddress(to.Address, to.Port); LastConnectionSended = to.ID; } - PacketPeer.PutPacket(packetBuffer.ByteBuffer); + return PacketPeer.PutPacket(packetBuffer.ByteBuffer); } public bool StartListening(int port, string address = "*") { @@ -85,6 +96,19 @@ namespace Network { } + public Connection GetOrAddConnection(string address, int port) { + Optional Conn = ConnectionList.GetOriginal(address, port); + if (Conn.isEmpty) { + Conn = new Connection(address, port); + ConnectionList.AddConnection(Conn); + PacketDistributor.AddHandler(Conn); + foreach (PeerListener Listener in PeerListeners) { + Listener.OnConnect(Conn); + } + } + return Conn; + } + private static void ListenerThreadMethod() { GD.print("Started Listener Thread."); @@ -108,12 +132,7 @@ namespace Network { } if (Confirmed) { - Optional Conn = Singleton.ConnectionList.GetOriginal(Address, Port); - if (Conn.isEmpty) { - Conn = new Connection(Address, Port); - Singleton.ConnectionList.AddConnection(Conn); - Singleton.PacketDistributor.AddHandler(Conn); - } + Connection Conn = Singleton.GetOrAddConnection(Address, Port); Singleton.PacketDistributor.HandleRawPacket(PB, Singleton.ConnectionList.GetOriginal(Conn)); } } @@ -139,6 +158,18 @@ namespace Network { ConnectionList.RemoveConnection(conn); PacketDistributor.RemoveHandler(conn); + Disconnected(conn, reason); + foreach (PeerListener Listener in PeerListeners) { + Listener.OnDisconnect(conn, reason); + } + } + + public void AddPeerListener(PeerListener listener) { + PeerListeners.Add(listener); + } + + public void RemovePeerListener(PeerListener listener) { + PeerListeners.Remove(listener); } } } \ No newline at end of file diff --git a/scripts/net/PeerListener.cs b/scripts/net/PeerListener.cs new file mode 100644 index 0000000..9790e49 --- /dev/null +++ b/scripts/net/PeerListener.cs @@ -0,0 +1,15 @@ + + +using Util; + +namespace Network { + public interface PeerListener { + + void OnStart(); + void OnStop(); + + void OnConnect(Connection conn); + void OnDisconnect(Connection conn, DisconnectReason reason); + + } +} diff --git a/scripts/net/Server.cs b/scripts/net/Server.cs index 34288bd..d83a122 100644 --- a/scripts/net/Server.cs +++ b/scripts/net/Server.cs @@ -39,7 +39,7 @@ namespace Network { GD.print("Someone connected at " + conn.Address + ":" + conn.Port); } - public override void Disconnected(Connection conn) { + public override void Disconnected(Connection conn, DisconnectReason reason) { } } } \ No newline at end of file diff --git a/scripts/util/DisconnectReason.cs b/scripts/util/DisconnectReason.cs index dda0162..8f2fbde 100644 --- a/scripts/util/DisconnectReason.cs +++ b/scripts/util/DisconnectReason.cs @@ -1,6 +1,6 @@  namespace Util { public enum DisconnectReason { - TIMEOUT, MANUAL_DISCONNECT + TIMEOUT, MANUAL_DISCONNECT, INVALID_ADDRESS } }