70 lines
2.1 KiB
GDScript
70 lines
2.1 KiB
GDScript
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)
|