139 lines
4.1 KiB
GDScript
139 lines
4.1 KiB
GDScript
extends Node
|
|
|
|
|
|
const SERVER_PORT = 8080
|
|
const SERVER_IP = "127.0.0.1"
|
|
var handle : String
|
|
var id : int = 1
|
|
var room_id : String
|
|
var players : Dictionary = {}
|
|
signal client_added(handle : String, id : int)
|
|
signal all_ready()
|
|
var player_readiness : Dictionary[int, bool] = {}
|
|
var waiting : bool = false
|
|
|
|
func become_host() -> void:
|
|
print("Starting host!")
|
|
|
|
var server_peer = NodeTunnelPeer.new()
|
|
server_peer.error.connect(
|
|
func(error_msg):
|
|
push_error("NodeTunnel Error: ", error_msg)
|
|
)
|
|
server_peer.connect_to_relay("74.208.202.81:8080", "net-gunner")
|
|
multiplayer.multiplayer_peer = server_peer
|
|
print("Authenticating")
|
|
await server_peer.authenticated
|
|
print("Authenticated")
|
|
var metadata = {
|
|
"players": 2,
|
|
"name": "testing",
|
|
"password_req": false
|
|
}
|
|
|
|
server_peer.host_room(true, JSON.stringify(metadata))
|
|
print("Hosting Room...")
|
|
await server_peer.room_connected
|
|
print("Connected to room: ", server_peer.room_id)
|
|
Multiplayer.room_id = server_peer.room_id
|
|
#server_peer.get_rooms()
|
|
print("GETTING ROOMS!")
|
|
#var rooms = await server_peer.rooms_received
|
|
print("GOT ROOMS!")
|
|
#print(rooms)
|
|
players[handle] = 1
|
|
player_readiness[1] = false
|
|
|
|
id = multiplayer.get_unique_id()
|
|
print("%s %d t" % [handle, multiplayer.get_unique_id()])
|
|
multiplayer.peer_connected.connect(_add_player_to_game)
|
|
multiplayer.peer_disconnected.connect(_remove_player_from_game)
|
|
|
|
|
|
func join_game(new_handle : String, room : String = "") -> Error:
|
|
var client_peer = NodeTunnelPeer.new()
|
|
client_peer.error.connect(
|
|
func(error_msg):
|
|
push_error("NodeTunnel Error: ", error_msg)
|
|
)
|
|
client_peer.connect_to_relay("74.208.202.81:8080", "net-gunner")
|
|
multiplayer.multiplayer_peer = client_peer
|
|
print("Authenticating")
|
|
await client_peer.authenticated
|
|
print("Authenticated")
|
|
|
|
|
|
var error = client_peer.join_room(room)
|
|
print("Player 2 joining room :", room)
|
|
await client_peer.room_connected
|
|
print("Player 2 joined.")
|
|
handle = new_handle
|
|
id = multiplayer.get_unique_id()
|
|
players[handle] = id
|
|
player_readiness[id] = false
|
|
if !error:
|
|
print("%s %d" % [handle, multiplayer.get_unique_id()])
|
|
await get_tree().create_timer(0.5).timeout
|
|
get_handle_from_peer(1)
|
|
return !error
|
|
|
|
func is_server() -> bool:
|
|
return multiplayer && multiplayer.is_server()
|
|
|
|
func is_host() -> bool:
|
|
return id == 1
|
|
|
|
func _process(_delta: float) -> void:
|
|
if waiting:
|
|
var group_ready : bool = true
|
|
for pr in player_readiness.values():
|
|
if !pr:
|
|
group_ready = false
|
|
break
|
|
if group_ready:
|
|
all_ready.emit()
|
|
waiting = false
|
|
for pr in player_readiness.keys():
|
|
player_readiness[pr] = false
|
|
|
|
func _add_player_to_game(pid : int) -> void:
|
|
print("Player %s joined the game!" % pid)
|
|
await get_tree().create_timer(0.5).timeout
|
|
get_handle_from_peer(pid)
|
|
|
|
func _remove_player_from_game(pid : int) -> void:
|
|
print("Player %s left the game!" % pid)
|
|
|
|
func get_handle_from_peer(peer_id) -> void:
|
|
rpc_id(peer_id, "report_handle_to_peer", id)
|
|
|
|
@rpc("call_local", "any_peer", "reliable")
|
|
func set_player_ready(peer_id : int) -> void:
|
|
player_readiness[peer_id] = true
|
|
|
|
@rpc("any_peer", "call_remote")
|
|
func receive_peer_handle(peer_id, peer_handle) -> void:
|
|
print("Player %s identified as %s!" % [peer_id, peer_handle])
|
|
players[peer_handle] = peer_id
|
|
player_readiness[peer_id] = false
|
|
client_added.emit(peer_handle, peer_id)
|
|
|
|
@rpc("any_peer", "call_remote")
|
|
func report_handle_to_peer(peer_id : int) -> void:
|
|
rpc_id(peer_id, "receive_peer_handle", multiplayer.get_unique_id(), handle)
|
|
|
|
func get_local_ip() -> String:
|
|
var ip_address = ""
|
|
# Get all local addresses as an Array
|
|
var addresses: PackedStringArray = IP.get_local_addresses()
|
|
|
|
for address in addresses:
|
|
# Check if it is an IPv4 address and not a loopback or link-local address
|
|
if "." in address and not address.begins_with("127.") and not address.begins_with("169.254."):
|
|
# Filter for common private IP ranges (192.168.x.x, 10.x.x.x, 172.16-31.x.x)
|
|
if address.begins_with("192.168.") or address.begins_with("10.") or (address.begins_with("172.") and int(address.split(".")[1]) >= 16 and int(address.split(".")[1]) <= 31):
|
|
ip_address = address
|
|
break # Exit the loop once a valid local IP is found
|
|
|
|
return ip_address
|