diff --git a/world.gd b/world.gd index 54d269e..7ea6904 100644 --- a/world.gd +++ b/world.gd @@ -5,10 +5,13 @@ extends Node @onready var hud = $CanvasLayer/HUD @onready var health_bar = $CanvasLayer/HUD/HealthBar +signal upnp_completed(error) + +const PLAYER = preload("res://player.tscn") +const SERVER_PORT = 7777 -const Player = preload("res://player.tscn") -const PORT = 9999 var enet_peer = ENetMultiplayerPeer.new() +var thread = null func _unhandled_input(event): if Input.is_action_just_pressed("quit"): @@ -18,24 +21,24 @@ func _on_host_button_pressed(): main_menu.hide() hud.show() - enet_peer.create_server(PORT) + enet_peer.create_server(SERVER_PORT) multiplayer.multiplayer_peer = enet_peer multiplayer.peer_connected.connect(add_player) multiplayer.peer_disconnected.connect(remove_player) add_player(multiplayer.get_unique_id()) - upnp_setup() + _upnp_setup(SERVER_PORT) func _on_join_button_pressed(): main_menu.hide() hud.show() - enet_peer.create_client(address_entry.text, PORT) + enet_peer.create_client(address_entry.text, SERVER_PORT) multiplayer.multiplayer_peer = enet_peer func add_player(peer_id): - var player = Player.instantiate() + var player = PLAYER.instantiate() player.name = str(peer_id) add_child(player) if player.is_multiplayer_authority(): @@ -53,18 +56,24 @@ func _on_multiplayer_spawner_spawned(node): if node.is_multiplayer_authority(): node.health_changed.connect(update_health_bar) -func upnp_setup(): +func _upnp_setup(server_port): + # UPNP queries take some time. var upnp = UPNP.new() + var err = upnp.discover() - var discover_result = upnp.discover() - assert(discover_result == UPNP.UPNP_RESULT_SUCCESS, \ - "UPNP Discover Failed! Error %s" % discover_result) + if err != OK: + push_error(str(err)) + emit_signal("upnp_completed", err) + return + if upnp.get_gateway() and upnp.get_gateway().is_valid_gateway(): + upnp.add_port_mapping(server_port, server_port, ProjectSettings.get_setting("application/config/name"), "UDP") + upnp.add_port_mapping(server_port, server_port, ProjectSettings.get_setting("application/config/name"), "TCP") + emit_signal("upnp_completed", OK) - assert(upnp.get_gateway() and upnp.get_gateway().is_valid_gateway(), \ - "UPNP Invalid Gateway!") +func _ready(): + thread = Thread.new() + thread.start(_upnp_setup.bind(SERVER_PORT)) - var map_result = upnp.add_port_mapping(PORT) - assert(map_result == UPNP.UPNP_RESULT_SUCCESS, \ - "UPNP Port Mapping Failed! Error %s" % map_result) - - print("Success! Join Address: %s" % upnp.query_external_address()) +func _exit_tree(): + # Wait for thread finish here to handle game exit while the thread is running. + thread.wait_to_finish()