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 := ""
|
||||
|
||||
|
||||
func _clear_ui():
|
||||
my_ip_label.text = ""
|
||||
if peers_tree.get_root() != null:
|
||||
peers_tree.clear()
|
||||
|
||||
|
||||
func _data_recieved(type, data):
|
||||
#print(type, ": ", data)
|
||||
if type == "info":
|
||||
|
@ -51,7 +57,7 @@ func _data_recieved(type, data):
|
|||
var root = peers_tree.create_item()
|
||||
for peer in Peers.peerArray:
|
||||
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.
|
||||
if data.size() == 0 and peers_tree.get_root() != null:
|
||||
peers_tree.clear()
|
||||
|
@ -61,15 +67,14 @@ func _go_offline():
|
|||
if Peers.is_running():
|
||||
Peers.stop_server()
|
||||
Edge.stop_edge()
|
||||
my_ip_label.text = ""
|
||||
if peers_tree.get_root() != null:
|
||||
peers_tree.clear()
|
||||
_clear_ui()
|
||||
|
||||
|
||||
func _network_died():
|
||||
if Peers.is_running():
|
||||
Peers.stop_server()
|
||||
online_check_button.set_pressed_no_signal(false)
|
||||
_clear_ui()
|
||||
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
|
||||
|
||||
|
||||
var _enet := ENetMultiplayerPeer.new()
|
||||
var _basePort: int
|
||||
var _serverRunning: bool
|
||||
|
||||
|
@ -45,20 +44,9 @@ var _userInfo: Dictionary
|
|||
var peerArray: Array
|
||||
|
||||
|
||||
func _peer_connected(id):
|
||||
print("Peer %d connected" % id)
|
||||
|
||||
|
||||
func _peer_disconnected(id):
|
||||
print("Peer %d disconnected" % id)
|
||||
|
||||
|
||||
func _process(_delta):
|
||||
if _serverRunning:
|
||||
#_process_enet(_userInfo["enet"], _userInfo["id"])
|
||||
for peer in peerArray:
|
||||
_process_enet(peer["enet"], peer["id"])
|
||||
_enet.poll()
|
||||
_process_enet(_userInfo["enet"], _userInfo["id"])
|
||||
|
||||
|
||||
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.
|
||||
match ret[ENET_SERVICE_EVENT_TYPE]:
|
||||
host.EVENT_CONNECT:
|
||||
print("Adding host %d" % id)
|
||||
_enet.add_mesh_peer(id, host)
|
||||
print("Peer connected ", id, " (", host.get_peers().size(), " known peers)")
|
||||
#var enet_peers = host.get_peers()
|
||||
#for enet_peer in enet_peers:
|
||||
|
||||
host.EVENT_DISCONNECT:
|
||||
print("Mesh peer disconnected %d" % id)
|
||||
host = null
|
||||
print("Peer disconnected ", id, " (", host.get_peers().size(), " known peers)")
|
||||
|
||||
host.EVENT_ERROR:
|
||||
print("Mesh peer error %d" % id)
|
||||
host = null
|
||||
print("Peer error ", id, " (", host.get_peers().size(), " known peers)")
|
||||
#***TODO*** Attempt disconnect/reconnect
|
||||
|
||||
host.EVENT_NONE:
|
||||
pass
|
||||
|
||||
host.EVENT_RECEIVE:
|
||||
print("Mesh peer recieved data %d" % id)
|
||||
print("Peer recieved data ", id, " (", host.get_peers().size(), " known peers)")
|
||||
|
||||
|
||||
func _ready():
|
||||
_serverRunning = false
|
||||
clear()
|
||||
multiplayer.peer_connected.connect(_peer_connected)
|
||||
multiplayer.peer_disconnected.connect(_peer_disconnected)
|
||||
|
||||
|
||||
func _sort_by_ip(a, b):
|
||||
|
@ -109,6 +94,7 @@ func is_running():
|
|||
|
||||
|
||||
func start_server(address, portStart, user, uuid):
|
||||
if !_serverRunning:
|
||||
clear()
|
||||
_basePort = portStart
|
||||
_userInfo["ip"] = address
|
||||
|
@ -116,9 +102,6 @@ func start_server(address, portStart, user, uuid):
|
|||
_userInfo["uuid"] = uuid
|
||||
_userInfo["id"] = _userInfo["ip"].get_slice(".", 3).to_int() # Use last octet for our ID.
|
||||
_userInfo["port"] = _basePort + _userInfo["id"]
|
||||
# Create mesh network.
|
||||
_enet.create_mesh(_userInfo["id"])
|
||||
multiplayer.set_multiplayer_peer(_enet)
|
||||
# Set up our listening port.
|
||||
_userInfo["enet"] = ENetConnection.new()
|
||||
_userInfo["enet"].create_host_bound(_userInfo["ip"], _userInfo["port"], 256, 0)
|
||||
|
@ -126,9 +109,11 @@ func start_server(address, portStart, user, uuid):
|
|||
|
||||
|
||||
func stop_server():
|
||||
if _serverRunning:
|
||||
# Tear down network.
|
||||
_serverRunning = false
|
||||
multiplayer.set_multiplayer_peer(null)
|
||||
_userInfo["enet"].flush()
|
||||
_userInfo["enet"].destroy()
|
||||
|
||||
|
||||
func update(peersFromCPP: Array):
|
||||
|
@ -158,19 +143,22 @@ func update(peersFromCPP: Array):
|
|||
if oldPeer["ip"] == peerCPP["ip"]:
|
||||
found = true
|
||||
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:
|
||||
# We didn't have them. Add needed records.
|
||||
peerCPP["user"] = ""
|
||||
peerCPP["uuid"] = ""
|
||||
peerCPP["online"] = true
|
||||
peerCPP["refresh"] = false
|
||||
peerCPP["ping"] = 0.0
|
||||
changed = true
|
||||
# Also create the ENet connection to them.
|
||||
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["enet"] = ENetConnection.new()
|
||||
peerCPP["enet"].create_host(1)
|
||||
peerCPP["enet"].connect_to_host(peerCPP["ip"], peerCPP["port"], 0)
|
||||
peerCPP["enet"] = _userInfo["enet"].connect_to_host(peerCPP["ip"], peerCPP["port"], 0)
|
||||
print("Connecting to ", peerCPP["ip"], ":", peerCPP["port"])
|
||||
# Sometimes the CPP code will return duplicates. Check.
|
||||
# Also check if we need to redraw anyone.
|
||||
|
|
|
@ -54,7 +54,6 @@ func elevate(program: String, arguments: PackedStringArray):
|
|||
func shutdown():
|
||||
_udp.stop()
|
||||
if FileAccess.file_exists(_ask_pass_script):
|
||||
print("Removing ", _ask_pass_script)
|
||||
DirAccess.remove_absolute(_ask_pass_script)
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue