Rolling my own ENet mesh network.
This commit is contained in:
parent
ea991ab816
commit
b72ddcbed1
7 changed files with 78 additions and 86 deletions
|
@ -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.")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue