extends Control @export var port = 1717 @export var max_players = 4 var COMPRESSION = ENetConnection.COMPRESS_RANGE_CODER var line_edit: LineEdit var peer: ENetMultiplayerPeer # Called when the node enters the scene tree for the first time. func _ready(): multiplayer.peer_connected.connect(peer_connected) multiplayer.peer_disconnected.connect(peer_disconnected) multiplayer.connected_to_server.connect(connected_to_server) multiplayer.connection_failed.connect(connection_failed) # We have to enable object encoding to send PlayerData, etc. multiplayer.allow_object_decoding = true line_edit = get_node("LineEditName") # Called on both server and clients func peer_connected(id): print("Player connected " + str(id)) # Called on both server and clients func peer_disconnected(id): print("Player disconnected " + str(id)) @rpc("any_peer") func send_player_data(player_data: Dictionary): if !GameManager.players.has(player_data.id): GameManager.players[player_data.id] = player_data if multiplayer.is_server(): for i in GameManager.players: send_player_data.rpc(GameManager.players[i]) # Called only from clients func connected_to_server(): print("Connected to server!") send_player_data.rpc_id(1, { "id": multiplayer.get_unique_id(), "name": line_edit.text if line_edit.text else "Player" }) # Called only from clients func connection_failed(): print("Couldn't connect!") func _on_host_pressed(): # Create peer instance for host's player peer = ENetMultiplayerPeer.new() var error = peer.create_server(port, max_players) if error != OK: print("Cannot host: " + error) peer.get_host().compress(COMPRESSION) # Connect host's player multiplayer.set_multiplayer_peer(peer) print("Waiting for players!") send_player_data({ "id": multiplayer.get_unique_id(), "name": line_edit.text if line_edit.text else "Player" }) func _on_join_pressed(): peer = ENetMultiplayerPeer.new() peer.create_client($LineEditIP.text if $LineEditIP.text else "127.0.0.1", port) peer.get_host().compress(COMPRESSION) multiplayer.set_multiplayer_peer(peer) @rpc("any_peer", "call_local") func start_game(): var scene = load("res://main.tscn").instantiate() get_tree().root.add_child(scene) self.hide() func _on_start_game_pressed(): start_game.rpc()