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
}
}