|
@@ -0,0 +1,104 @@
|
|
|
+
|
|
|
+extends Control
|
|
|
+
|
|
|
+const DEFAULT_PORT = 8910 # some random number, pick your port properly
|
|
|
+
|
|
|
+#### Network callbacks from SceneTree ####
|
|
|
+
|
|
|
+# callback from SceneTree
|
|
|
+func _player_connected(id):
|
|
|
+ #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
|
|
|
+
|
|
|
+ get_tree().get_root().add_child(pong)
|
|
|
+ hide()
|
|
|
+
|
|
|
+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():
|
|
|
+
|
|
|
+ _set_status("Couldn't connect",false)
|
|
|
+
|
|
|
+ get_tree().set_network_peer(null) #remove peer
|
|
|
+
|
|
|
+ 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)
|
|
|
+ show()
|
|
|
+
|
|
|
+ get_tree().set_network_peer(null) #remove peer
|
|
|
+
|
|
|
+ get_node("panel/join").set_disabled(false)
|
|
|
+ get_node("panel/host").set_disabled(false)
|
|
|
+
|
|
|
+ _set_status(with_error,false)
|
|
|
+
|
|
|
+func _set_status(text,isok):
|
|
|
+ #simple way to show status
|
|
|
+ if (isok):
|
|
|
+ get_node("panel/status_ok").set_text(text)
|
|
|
+ get_node("panel/status_fail").set_text("")
|
|
|
+ else:
|
|
|
+ get_node("panel/status_ok").set_text("")
|
|
|
+ get_node("panel/status_fail").set_text(text)
|
|
|
+
|
|
|
+func _on_host_pressed():
|
|
|
+
|
|
|
+ var host = NetworkedMultiplayerENet.new()
|
|
|
+ var err = host.create_server(DEFAULT_PORT,1) # max: 1 peer, since it's a 2 players game
|
|
|
+ if (err!=OK):
|
|
|
+ #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)
|
|
|
+
|
|
|
+func _on_join_pressed():
|
|
|
+
|
|
|
+ var ip = get_node("panel/address").get_text()
|
|
|
+ if (not ip.is_valid_ip_address()):
|
|
|
+ _set_status("IP address is invalid",false)
|
|
|
+ return
|
|
|
+
|
|
|
+ var host = NetworkedMultiplayerENet.new()
|
|
|
+ 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")
|
|
|
+
|