Rolling my own ENet mesh network.

This commit is contained in:
Scott Duensing 2023-09-19 20:07:55 -05:00
parent ea991ab816
commit b72ddcbed1
7 changed files with 78 additions and 86 deletions

View file

@ -34,6 +34,12 @@ const HELP_ID_MANUAL = 1
var _ip := "" var _ip := ""
func _clear_ui():
my_ip_label.text = ""
if peers_tree.get_root() != null:
peers_tree.clear()
func _data_recieved(type, data): func _data_recieved(type, data):
#print(type, ": ", data) #print(type, ": ", data)
if type == "info": if type == "info":
@ -51,7 +57,7 @@ func _data_recieved(type, data):
var root = peers_tree.create_item() var root = peers_tree.create_item()
for peer in Peers.peerArray: for peer in Peers.peerArray:
var child = peers_tree.create_item(root) var child = peers_tree.create_item(root)
child.set_text(0, peer["user"] + " (" + peer["ip"] + ")") child.set_text(0, peer["user"] + " (" + peer["ip"] + ") " + str(peer["ping"]) + "ms")
# Handle empty peer list. # Handle empty peer list.
if data.size() == 0 and peers_tree.get_root() != null: if data.size() == 0 and peers_tree.get_root() != null:
peers_tree.clear() peers_tree.clear()
@ -61,15 +67,14 @@ func _go_offline():
if Peers.is_running(): if Peers.is_running():
Peers.stop_server() Peers.stop_server()
Edge.stop_edge() Edge.stop_edge()
my_ip_label.text = "" _clear_ui()
if peers_tree.get_root() != null:
peers_tree.clear()
func _network_died(): func _network_died():
if Peers.is_running(): if Peers.is_running():
Peers.stop_server() Peers.stop_server()
online_check_button.set_pressed_no_signal(false) online_check_button.set_pressed_no_signal(false)
_clear_ui()
await Dialog.alert("Error", "The network layer unexpectedly stopped.") await Dialog.alert("Error", "The network layer unexpectedly stopped.")

View file

@ -7,7 +7,6 @@ const ENET_SERVICE_EVENT_DATA = 2
const ENET_SERVICE_EVENT_CHANNEL = 3 const ENET_SERVICE_EVENT_CHANNEL = 3
var _enet := ENetMultiplayerPeer.new()
var _basePort: int var _basePort: int
var _serverRunning: bool var _serverRunning: bool
@ -45,20 +44,9 @@ var _userInfo: Dictionary
var peerArray: Array var peerArray: Array
func _peer_connected(id):
print("Peer %d connected" % id)
func _peer_disconnected(id):
print("Peer %d disconnected" % id)
func _process(_delta): func _process(_delta):
if _serverRunning: if _serverRunning:
#_process_enet(_userInfo["enet"], _userInfo["id"]) _process_enet(_userInfo["enet"], _userInfo["id"])
for peer in peerArray:
_process_enet(peer["enet"], peer["id"])
_enet.poll()
func _process_enet(host: ENetConnection, id: int): func _process_enet(host: ENetConnection, id: int):
@ -67,30 +55,27 @@ func _process_enet(host: ENetConnection, id: int):
var ret = host.service() # Returns an array of ENET_SERVICE_* items. var ret = host.service() # Returns an array of ENET_SERVICE_* items.
match ret[ENET_SERVICE_EVENT_TYPE]: match ret[ENET_SERVICE_EVENT_TYPE]:
host.EVENT_CONNECT: host.EVENT_CONNECT:
print("Adding host %d" % id) print("Peer connected ", id, " (", host.get_peers().size(), " known peers)")
_enet.add_mesh_peer(id, host) #var enet_peers = host.get_peers()
#for enet_peer in enet_peers:
host.EVENT_DISCONNECT: host.EVENT_DISCONNECT:
print("Mesh peer disconnected %d" % id) print("Peer disconnected ", id, " (", host.get_peers().size(), " known peers)")
host = null
host.EVENT_ERROR: host.EVENT_ERROR:
print("Mesh peer error %d" % id) print("Peer error ", id, " (", host.get_peers().size(), " known peers)")
host = null
#***TODO*** Attempt disconnect/reconnect #***TODO*** Attempt disconnect/reconnect
host.EVENT_NONE: host.EVENT_NONE:
pass pass
host.EVENT_RECEIVE: host.EVENT_RECEIVE:
print("Mesh peer recieved data %d" % id) print("Peer recieved data ", id, " (", host.get_peers().size(), " known peers)")
func _ready(): func _ready():
_serverRunning = false _serverRunning = false
clear() clear()
multiplayer.peer_connected.connect(_peer_connected)
multiplayer.peer_disconnected.connect(_peer_disconnected)
func _sort_by_ip(a, b): func _sort_by_ip(a, b):
@ -109,26 +94,26 @@ func is_running():
func start_server(address, portStart, user, uuid): func start_server(address, portStart, user, uuid):
clear() if !_serverRunning:
_basePort = portStart clear()
_userInfo["ip"] = address _basePort = portStart
_userInfo["user"] = user _userInfo["ip"] = address
_userInfo["uuid"] = uuid _userInfo["user"] = user
_userInfo["id"] = _userInfo["ip"].get_slice(".", 3).to_int() # Use last octet for our ID. _userInfo["uuid"] = uuid
_userInfo["port"] = _basePort + _userInfo["id"] _userInfo["id"] = _userInfo["ip"].get_slice(".", 3).to_int() # Use last octet for our ID.
# Create mesh network. _userInfo["port"] = _basePort + _userInfo["id"]
_enet.create_mesh(_userInfo["id"]) # Set up our listening port.
multiplayer.set_multiplayer_peer(_enet) _userInfo["enet"] = ENetConnection.new()
# Set up our listening port. _userInfo["enet"].create_host_bound(_userInfo["ip"], _userInfo["port"], 256, 0)
_userInfo["enet"] = ENetConnection.new() _serverRunning = true
_userInfo["enet"].create_host_bound(_userInfo["ip"], _userInfo["port"], 256, 0)
_serverRunning = true
func stop_server(): func stop_server():
# Tear down network. if _serverRunning:
_serverRunning = false # Tear down network.
multiplayer.set_multiplayer_peer(null) _serverRunning = false
_userInfo["enet"].flush()
_userInfo["enet"].destroy()
func update(peersFromCPP: Array): func update(peersFromCPP: Array):
@ -158,19 +143,22 @@ func update(peersFromCPP: Array):
if oldPeer["ip"] == peerCPP["ip"]: if oldPeer["ip"] == peerCPP["ip"]:
found = true found = true
peerCPP = oldPeer peerCPP = oldPeer
# Update peer statistics. ***TODO*** These do not set 'changed' and are not refreshed.
if typeof(peerCPP["enet"]) == TYPE_OBJECT:
if peerCPP["enet"].get_state() == ENetPacketPeer.STATE_CONNECTED:
peerCPP["ping"] = peerCPP["enet"].get_statistic(ENetPacketPeer.PEER_ROUND_TRIP_TIME)
if !found: if !found:
# We didn't have them. Add needed records. # We didn't have them. Add needed records.
peerCPP["user"] = "" peerCPP["user"] = ""
peerCPP["uuid"] = "" peerCPP["uuid"] = ""
peerCPP["online"] = true peerCPP["online"] = true
peerCPP["refresh"] = false peerCPP["refresh"] = false
peerCPP["ping"] = 0.0
changed = true changed = true
# Also create the ENet connection to them. # Also create the ENet connection to them.
peerCPP["id"] = peerCPP["ip"].get_slice(".", 3).to_int() # Use last octet for our ID. peerCPP["id"] = peerCPP["ip"].get_slice(".", 3).to_int() # Use last octet for our ID.
peerCPP["port"] = _basePort + peerCPP["ip"].get_slice(".", 3).to_int() peerCPP["port"] = _basePort + peerCPP["ip"].get_slice(".", 3).to_int()
peerCPP["enet"] = ENetConnection.new() peerCPP["enet"] = _userInfo["enet"].connect_to_host(peerCPP["ip"], peerCPP["port"], 0)
peerCPP["enet"].create_host(1)
peerCPP["enet"].connect_to_host(peerCPP["ip"], peerCPP["port"], 0)
print("Connecting to ", peerCPP["ip"], ":", peerCPP["port"]) print("Connecting to ", peerCPP["ip"], ":", peerCPP["port"])
# Sometimes the CPP code will return duplicates. Check. # Sometimes the CPP code will return duplicates. Check.
# Also check if we need to redraw anyone. # Also check if we need to redraw anyone.

View file

@ -54,7 +54,6 @@ func elevate(program: String, arguments: PackedStringArray):
func shutdown(): func shutdown():
_udp.stop() _udp.stop()
if FileAccess.file_exists(_ask_pass_script): if FileAccess.file_exists(_ask_pass_script):
print("Removing ", _ask_pass_script)
DirAccess.remove_absolute(_ask_pass_script) DirAccess.remove_absolute(_ask_pass_script)