|
@@ -1,102 +1,108 @@
|
|
|
extends Control
|
|
|
|
|
|
-const DEFAULT_PORT = 8910 # some random number, pick your port properly
|
|
|
+const DEFAULT_PORT = 8910 # An arbitrary number.
|
|
|
+
|
|
|
+onready var address = $Address
|
|
|
+onready var host_button = $HostButton
|
|
|
+onready var join_button = $JoinButton
|
|
|
+onready var status_ok = $StatusOk
|
|
|
+onready var status_fail = $StatusFail
|
|
|
+
|
|
|
+func _ready():
|
|
|
+ # Connect all the callbacks related to networking.
|
|
|
+ get_tree().connect("network_peer_connected", self, "_player_connected")
|
|
|
+ get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
|
|
|
+ get_tree().connect("connected_to_server", self, "_connected_ok")
|
|
|
+ get_tree().connect("connection_failed", self, "_connected_fail")
|
|
|
+ get_tree().connect("server_disconnected", self, "_server_disconnected")
|
|
|
|
|
|
#### Network callbacks from SceneTree ####
|
|
|
|
|
|
-# callback from SceneTree
|
|
|
+# Callback from SceneTree.
|
|
|
func _player_connected(_id):
|
|
|
- #someone connected, start the game!
|
|
|
+ # Someone connected, start the game!
|
|
|
var pong = load("res://pong.tscn").instance()
|
|
|
- pong.connect("game_finished", self, "_end_game", [], CONNECT_DEFERRED) # connect deferred so we can safely erase it from the callback
|
|
|
-
|
|
|
+ # Connect deferred so we can safely erase it from the callback.
|
|
|
+ pong.connect("game_finished", self, "_end_game", [], CONNECT_DEFERRED)
|
|
|
+
|
|
|
get_tree().get_root().add_child(pong)
|
|
|
hide()
|
|
|
|
|
|
-func _player_disconnected(_id):
|
|
|
|
|
|
+func _player_disconnected(_id):
|
|
|
if get_tree().is_network_server():
|
|
|
_end_game("Client disconnected")
|
|
|
else:
|
|
|
_end_game("Server disconnected")
|
|
|
|
|
|
-# callback from SceneTree, only for clients (not server)
|
|
|
-func _connected_ok():
|
|
|
- # will not use this one
|
|
|
- pass
|
|
|
|
|
|
-# callback from SceneTree, only for clients (not server)
|
|
|
-func _connected_fail():
|
|
|
+# Callback from SceneTree, only for clients (not server).
|
|
|
+func _connected_ok():
|
|
|
+ pass # We don't need this function.
|
|
|
|
|
|
- _set_status("Couldn't connect",false)
|
|
|
|
|
|
- get_tree().set_network_peer(null) #remove peer
|
|
|
+# Callback from SceneTree, only for clients (not server).
|
|
|
+func _connected_fail():
|
|
|
+ _set_status("Couldn't connect", false)
|
|
|
+
|
|
|
+ get_tree().set_network_peer(null) # Remove peer.
|
|
|
+
|
|
|
+ host_button.set_disabled(false)
|
|
|
+ join_button.set_disabled(false)
|
|
|
|
|
|
- get_node("panel/join").set_disabled(false)
|
|
|
- get_node("panel/host").set_disabled(false)
|
|
|
|
|
|
func _server_disconnected():
|
|
|
_end_game("Server disconnected")
|
|
|
|
|
|
##### Game creation functions ######
|
|
|
|
|
|
-func _end_game(with_error=""):
|
|
|
- if has_node("/root/pong"):
|
|
|
- #erase pong scene
|
|
|
- get_node("/root/pong").free() # erase immediately, otherwise network might show errors (this is why we connected deferred above)
|
|
|
+func _end_game(with_error = ""):
|
|
|
+ if has_node("/root/Pong"):
|
|
|
+ # Erase immediately, otherwise network might show errors (this is why we connected deferred above).
|
|
|
+ get_node("/root/Pong").free()
|
|
|
show()
|
|
|
-
|
|
|
- get_tree().set_network_peer(null) #remove peer
|
|
|
-
|
|
|
- get_node("panel/join").set_disabled(false)
|
|
|
- get_node("panel/host").set_disabled(false)
|
|
|
-
|
|
|
+
|
|
|
+ get_tree().set_network_peer(null) # Remove peer.
|
|
|
+ host_button.set_disabled(false)
|
|
|
+ join_button.set_disabled(false)
|
|
|
+
|
|
|
_set_status(with_error, false)
|
|
|
|
|
|
+
|
|
|
func _set_status(text, isok):
|
|
|
- #simple way to show status
|
|
|
+ # Simple way to show status.
|
|
|
if isok:
|
|
|
- get_node("panel/status_ok").set_text(text)
|
|
|
- get_node("panel/status_fail").set_text("")
|
|
|
+ status_ok.set_text(text)
|
|
|
+ status_fail.set_text("")
|
|
|
else:
|
|
|
- get_node("panel/status_ok").set_text("")
|
|
|
- get_node("panel/status_fail").set_text(text)
|
|
|
+ status_ok.set_text("")
|
|
|
+ status_fail.set_text(text)
|
|
|
+
|
|
|
|
|
|
func _on_host_pressed():
|
|
|
var host = NetworkedMultiplayerENet.new()
|
|
|
host.set_compression_mode(NetworkedMultiplayerENet.COMPRESS_RANGE_CODER)
|
|
|
- var err = host.create_server(DEFAULT_PORT, 1) # max: 1 peer, since it's a 2 players game
|
|
|
+ var err = host.create_server(DEFAULT_PORT, 1) # Maximum of 1 peer, since it's a 2-player game.
|
|
|
if err != OK:
|
|
|
- #is another server running?
|
|
|
+ # Is another server running?
|
|
|
_set_status("Can't host, address in use.",false)
|
|
|
return
|
|
|
-
|
|
|
+
|
|
|
get_tree().set_network_peer(host)
|
|
|
- get_node("panel/join").set_disabled(true)
|
|
|
- get_node("panel/host").set_disabled(true)
|
|
|
- _set_status("Waiting for player..", true)
|
|
|
+ host_button.set_disabled(true)
|
|
|
+ join_button.set_disabled(true)
|
|
|
+ _set_status("Waiting for player...", true)
|
|
|
+
|
|
|
|
|
|
func _on_join_pressed():
|
|
|
- var ip = get_node("panel/address").get_text()
|
|
|
+ var ip = address.get_text()
|
|
|
if not ip.is_valid_ip_address():
|
|
|
_set_status("IP address is invalid", false)
|
|
|
return
|
|
|
-
|
|
|
+
|
|
|
var host = NetworkedMultiplayerENet.new()
|
|
|
host.set_compression_mode(NetworkedMultiplayerENet.COMPRESS_RANGE_CODER)
|
|
|
host.create_client(ip, DEFAULT_PORT)
|
|
|
get_tree().set_network_peer(host)
|
|
|
-
|
|
|
- _set_status("Connecting..", true)
|
|
|
-
|
|
|
-
|
|
|
-### INITIALIZER ####
|
|
|
-
|
|
|
-func _ready():
|
|
|
- # connect all the callbacks related to networking
|
|
|
- get_tree().connect("network_peer_connected", self, "_player_connected")
|
|
|
- get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
|
|
|
- get_tree().connect("connected_to_server", self, "_connected_ok")
|
|
|
- get_tree().connect("connection_failed", self, "_connected_fail")
|
|
|
- get_tree().connect("server_disconnected", self, "_server_disconnected")
|
|
|
-
|
|
|
+
|
|
|
+ _set_status("Connecting...", true)
|