extends Node const SERVER_PORT = 8080 const SERVER_IP = "127.0.0.1" var handle : String var id : int = 1 var players : Dictionary = {} signal client_added(handle : String, id : int) signal all_ready() var player_readiness : Dictionary[int, bool] = {} var waiting : bool = false func become_host() -> void: print("Starting host!") var server_peer = NodeTunnelPeer.new() server_peer.error.connect( func(error_msg): push_error("NodeTunnel Error: ", error_msg) ) server_peer.connect_to_relay("74.208.202.81:8080", "net-gunner") multiplayer.multiplayer_peer = server_peer print("Authenticating") await server_peer.authenticated print("Authenticated") var metadata = { "players": 2, "name": "testing", "password_req": false } server_peer.host_room(true, JSON.stringify(metadata)) print("Hosting Room...") var room_id = await server_peer.room_connected print("Connected to room: ", server_peer.room_id) #server_peer.get_rooms() print("GETTING ROOMS!") #var rooms = await server_peer.rooms_received print("GOT ROOMS!") #print(rooms) players[handle] = 1 player_readiness[1] = false id = multiplayer.get_unique_id() print("%s %d t" % [handle, multiplayer.get_unique_id()]) multiplayer.peer_connected.connect(_add_player_to_game) multiplayer.peer_disconnected.connect(_remove_player_from_game) func join_game(new_handle : String, room : String = "") -> Error: var client_peer = NodeTunnelPeer.new() client_peer.error.connect( func(error_msg): push_error("NodeTunnel Error: ", error_msg) ) client_peer.connect_to_relay("74.208.202.81:8080", "net-gunner") multiplayer.multiplayer_peer = client_peer print("Authenticating") await client_peer.authenticated print("Authenticated") var error = client_peer.join_room(room) print("Player 2 joining room :", room) await client_peer.room_connected print("Player 2 joined.") handle = new_handle id = multiplayer.get_unique_id() players[handle] = id player_readiness[id] = false if !error: print("%s %d" % [handle, multiplayer.get_unique_id()]) await get_tree().create_timer(0.5).timeout get_handle_from_peer(1) return !error func is_server() -> bool: return multiplayer && multiplayer.is_server() func is_host() -> bool: return id == 1 func _process(delta: float) -> void: if waiting: var ready : bool = true for pr in player_readiness.values(): if !pr: ready = false break if ready: all_ready.emit() waiting = false for pr in player_readiness.keys(): player_readiness[pr] = false func _add_player_to_game(id : int) -> void: print("Player %s joined the game!" % id) await get_tree().create_timer(0.5).timeout get_handle_from_peer(id) func _remove_player_from_game(id : int) -> void: print("Player %s left the game!" % id) func get_handle_from_peer(peer_id) -> void: rpc_id(peer_id, "report_handle_to_peer", id) @rpc("call_local", "any_peer", "reliable") func set_player_ready(peer_id : int) -> void: player_readiness[peer_id] = true @rpc("any_peer", "call_remote") func receive_peer_handle(peer_id, peer_handle) -> void: print("Player %s identified as %s!" % [peer_id, peer_handle]) players[peer_handle] = peer_id player_readiness[peer_id] = false client_added.emit(peer_handle, peer_id) @rpc("any_peer", "call_remote") func report_handle_to_peer(peer_id : int) -> void: rpc_id(peer_id, "receive_peer_handle", multiplayer.get_unique_id(), handle) func get_local_ip() -> String: var ip_address = "" # Get all local addresses as an Array var addresses: PackedStringArray = IP.get_local_addresses() for address in addresses: # Check if it is an IPv4 address and not a loopback or link-local address if "." in address and not address.begins_with("127.") and not address.begins_with("169.254."): # Filter for common private IP ranges (192.168.x.x, 10.x.x.x, 172.16-31.x.x) if address.begins_with("192.168.") or address.begins_with("10.") or (address.begins_with("172.") and int(address.split(".")[1]) >= 16 and int(address.split(".")[1]) <= 31): ip_address = address break # Exit the loop once a valid local IP is found return ip_address