extends Node signal player_spawn # The player scene (which we want to configure for replication). const Player = preload("res://entities/Player.tscn") @onready var NetworkingRoot = get_node("/root/Game/Networking") var client_clock = 0 var latency = 0 var delta_latency = 0 var latency_array = [] func start_network(server: bool, ip="localhost"): var peer = ENetMultiplayerPeer.new() if server: peer.create_server(27015) # Listen to peer connections, and create new player for them multiplayer.peer_connected.connect(create_player) # Listen to peer disconnections, and destroy their players multiplayer.peer_disconnected.connect(destroy_player) multiplayer.set_multiplayer_peer(peer) create_player() else: peer.create_client(ip, 27015) multiplayer.set_multiplayer_peer(peer) var timer = Timer.new() timer.wait_time = 0.5 timer.autostart = true timer.connect("timeout", func(): rpc_id(1, "Ping", Time.get_unix_time_from_system())) add_child(timer) timer.start() func add_network_entity(path): var spawner = NetworkingRoot.get_node("Networking") as MultiplayerSpawner spawner.add_spawnable_scene(path) func create_player(id=1): # Instantiate a new player for this client. var p = Player.instantiate() p.name = str(id) NetworkingRoot.add_child(p) p.init() func destroy_player(id): # Delete this peer's node. NetworkingRoot.get_node(str(id)).queue_free() @rpc(any_peer) func Ping(client_time): print("Got ping") var player_id = multiplayer.get_remote_sender_id() rpc_id(player_id, "Pong", client_time) @rpc func Pong(client_time): latency_array.append((Time.get_unix_time_from_system() - client_time) /2) if latency_array.size() == 9: var total_latency = 0 latency_array.sort() var mid_point = latency_array[4] for i in range(latency_array.size()-1,-1,-1): if latency_array[i] > (2 * mid_point) and latency_array[i] > 20: latency_array.remove_at(i) else: total_latency += latency_array[i] delta_latency = (total_latency / latency_array.size()) - latency latency = total_latency / latency_array.size() latency_array.clear() print(delta_latency)