extends Control @export var multiplayer_port: int = 2481 @export var reconnection_delay: float = 5 var server_ip: String = "127.0.0.1" var error_code: Error = OK var connecting: bool = false var connected: bool = false var reconnection_timer: float = 0 var session_id: int = -1 var searching_for_player: bool = false # Called when the node enters the scene tree for the first time. func _ready() -> void: server_ip = get_server_ip() get_parent().multiplayer.connected_to_server.connect(on_connected_ok) get_parent().multiplayer.connection_failed.connect(on_connection_failed) get_parent().multiplayer.server_disconnected.connect(on_server_disconnected) reconnect() $"../Players".connect("player_joined", on_player_joined) func _process(delta: float) -> void: if !connected and !connecting: reconnection_timer += delta if reconnection_timer >= reconnection_delay: reconnection_timer = 0 reconnect() if searching_for_player: for player in $"../Players".get_children(): if player.session_id == session_id: searching_for_player = false $PromptManager.player = player func reconnect() -> void: var peer: MultiplayerPeer = WebSocketMultiplayerPeer.new() var server_address: String = "ws://%s:%d" % [server_ip, multiplayer_port] $ServerIPLabel.text = "Address:" + server_address $Label2.text = "Connecting..." connecting = true error_code = peer.create_client(server_address) if error_code: $Label2.text = "Failed to connect! Error code %d" %error_code return get_parent().multiplayer.multiplayer_peer = peer func on_connected_ok() -> void: session_id = get_session_id() $Label2.text = "Connected OK! Session ID: %d" % session_id connected = true connecting = false join_game(session_id) func on_connection_failed() -> void: $Label2.text = "Connection failed D:" connected = false connecting = false func on_server_disconnected() -> void: $Label2.text = "Server disconnected!" connected = false connecting = false func get_server_ip() -> String: if OS.has_feature('web'): return JavaScriptBridge.eval("window.location.hostname") return "127.0.0.1" func get_session_id() -> int: if session_id != -1: return session_id var session_file: FileAccess = FileAccess.open("user://session-id", FileAccess.READ) #if session_file != null: #var contents: String = session_file.get_as_text() #var id: int #if !contents.is_empty() and contents.is_valid_int(): #id = contents.to_int() #return id var id: int = randi() session_file = FileAccess.open("user://session-id", FileAccess.WRITE) session_file.store_string("%d" % id ) return id func join_game(session_id: int): searching_for_player = true var player : Player = $"../Players".find_player_by_session_id(session_id) #player.claim_authority(session_id) func on_player_joined(player: Player): pass