extends Node const TICK_RATE := 128 const TICK_INTERVAL := 1.0 / TICK_RATE var tick_timer := 0.0 var server_time := 0.0 # Keep track of players var players := {} func _start_server(port:int = 9000) -> void: var peer := ENetMultiplayerPeer.new() peer.create_server(port, 1024) multiplayer.multiplayer_peer = peer multiplayer.peer_connected.connect(_on_peer_connected) multiplayer.peer_disconnected.connect(_on_peer_disconnected) prints("server started on port", port) func _process(delta: float) -> void: tick_timer += delta while tick_timer >= TICK_INTERVAL: _server_tick() tick_timer -= TICK_INTERVAL func _server_tick() -> void: server_time += TICK_INTERVAL # for each player, update logic for id:int in players.keys(): var player:Player = players[id] player["position"] += player["velocity"] * TICK_INTERVAL # broadcast game state to all clients update_player_states.rpc(players) func _on_peer_connected(peer_id:int) -> void: print("Player connected:", peer_id) players[peer_id] = { "position": Vector2.ZERO, "velocity": Vector2.ZERO } func _on_peer_disconnected(peer_id:int) -> void: print("Player disconnected:", peer_id) players.erase(peer_id) @rpc("any_peer") func send_input(input_velocity: Vector2) -> void: var id:int = multiplayer.get_remote_sender_id() if players.has(id): players[id]["velocity"] = input_velocity @rpc("authority", "unreliable") func update_player_states(state:Array[Dictionary]) -> void: print(state) pass # No-op on server