1extends Control
2
3const DEFAULT_PORT = 8910 # An arbitrary number.
4
5onready var address = $Address
6onready var host_button = $HostButton
7onready var join_button = $JoinButton
8onready var status_ok = $StatusOk
9onready var status_fail = $StatusFail
10
11func _ready():
12	# Connect all the callbacks related to networking.
13	get_tree().connect("network_peer_connected", self, "_player_connected")
14	get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
15	get_tree().connect("connected_to_server", self, "_connected_ok")
16	get_tree().connect("connection_failed", self, "_connected_fail")
17	get_tree().connect("server_disconnected", self, "_server_disconnected")
18
19#### Network callbacks from SceneTree ####
20
21# Callback from SceneTree.
22func _player_connected(_id):
23	# Someone connected, start the game!
24	var pong = load("res://pong.tscn").instance()
25	# Connect deferred so we can safely erase it from the callback.
26	pong.connect("game_finished", self, "_end_game", [], CONNECT_DEFERRED)
27
28	get_tree().get_root().add_child(pong)
29	hide()
30
31
32func _player_disconnected(_id):
33	if get_tree().is_network_server():
34		_end_game("Client disconnected")
35	else:
36		_end_game("Server disconnected")
37
38
39# Callback from SceneTree, only for clients (not server).
40func _connected_ok():
41	pass # We don't need this function.
42
43
44# Callback from SceneTree, only for clients (not server).
45func _connected_fail():
46	_set_status("Couldn't connect", false)
47
48	get_tree().set_network_peer(null) # Remove peer.
49
50	host_button.set_disabled(false)
51	join_button.set_disabled(false)
52
53
54func _server_disconnected():
55	_end_game("Server disconnected")
56
57##### Game creation functions ######
58
59func _end_game(with_error = ""):
60	if has_node("/root/Pong"):
61		# Erase immediately, otherwise network might show errors (this is why we connected deferred above).
62		get_node("/root/Pong").free()
63		show()
64
65	get_tree().set_network_peer(null) # Remove peer.
66	host_button.set_disabled(false)
67	join_button.set_disabled(false)
68
69	_set_status(with_error, false)
70
71
72func _set_status(text, isok):
73	# Simple way to show status.
74	if isok:
75		status_ok.set_text(text)
76		status_fail.set_text("")
77	else:
78		status_ok.set_text("")
79		status_fail.set_text(text)
80
81
82func _on_host_pressed():
83	var host = NetworkedMultiplayerENet.new()
84	host.set_compression_mode(NetworkedMultiplayerENet.COMPRESS_RANGE_CODER)
85	var err = host.create_server(DEFAULT_PORT, 1) # Maximum of 1 peer, since it's a 2-player game.
86	if err != OK:
87		# Is another server running?
88		_set_status("Can't host, address in use.",false)
89		return
90
91	get_tree().set_network_peer(host)
92	host_button.set_disabled(true)
93	join_button.set_disabled(true)
94	_set_status("Waiting for player...", true)
95
96
97func _on_join_pressed():
98	var ip = address.get_text()
99	if not ip.is_valid_ip_address():
100		_set_status("IP address is invalid", false)
101		return
102
103	var host = NetworkedMultiplayerENet.new()
104	host.set_compression_mode(NetworkedMultiplayerENet.COMPRESS_RANGE_CODER)
105	host.create_client(ip, DEFAULT_PORT)
106	get_tree().set_network_peer(host)
107
108	_set_status("Connecting...", true)
109