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