netfishing/network/direct_enet_transport.gd

61 lines
1.6 KiB
GDScript

class_name DirectEnetTransport
extends NetworkTransport
func start_host(
port: int,
max_clients: int,
bind_address: String = "*",
) -> Error:
disconnect_transport()
var enet_peer := ENetMultiplayerPeer.new()
if not bind_address.is_empty() and bind_address != "*":
enet_peer.set_bind_ip(bind_address)
var error: Error = enet_peer.create_server(
port, max_clients, NetworkProtocol.ENET_CHANNEL_COUNT
)
if error != OK:
transport_error.emit("Unable to host UDP port %d." % port)
return error
_peer = enet_peer
_route_description = "UDP *:%d" % port
return OK
func connect_to_route(route: ConnectionRoute) -> Error:
disconnect_transport()
if route == null or not route.is_valid():
transport_error.emit("The direct connection route is invalid.")
return ERR_INVALID_PARAMETER
var endpoint: ConnectionEndpoint = route.direct_endpoint
var enet_peer := ENetMultiplayerPeer.new()
var error: Error = enet_peer.create_client(
endpoint.host, endpoint.port, NetworkProtocol.ENET_CHANNEL_COUNT
)
if error != OK:
transport_error.emit(
"Unable to connect to %s." % endpoint.normalized_display
)
return error
_peer = enet_peer
_route_description = endpoint.normalized_display
return OK
func send_raw_packet(
destination_address: String,
destination_port: int,
packet: PackedByteArray,
) -> bool:
var enet_peer := _peer as ENetMultiplayerPeer
if (
enet_peer == null
or enet_peer.host == null
or destination_address.is_empty()
or destination_port < 1
or destination_port > 65535
or packet.is_empty()
):
return false
enet_peer.host.socket_send(destination_address, destination_port, packet)
return true