Files
DungeonsOfKharadum/src/scripts/webrtc_network.gd
2026-01-14 18:25:07 +01:00

142 lines
3.8 KiB
GDScript

extends Node
# WebRTC Network Manager - For browser/WebAssembly builds
# Uses WebRTCMultiplayerPeer for P2P connections
signal connection_ready
signal connection_failed
signal session_created(session_data)
signal peer_connected_webrtc(peer_id)
signal peer_disconnected_webrtc(peer_id)
const STUN_SERVER = "stun:ruinborn.thefirstboss.com:3578"
var webrtc_peer: WebRTCMultiplayerPeer = null
var is_host: bool = false
func _ready():
print("WebRTC: Using STUN server: ", STUN_SERVER)
func create_host() -> bool:
print("WebRTC: Creating host")
webrtc_peer = WebRTCMultiplayerPeer.new()
# Godot 4.x API: initialize(peer_id, server_compat)
# peer_id 1 for server, server_compat = true
var error = webrtc_peer.initialize(1, true)
if error != OK:
push_error("WebRTC: Failed to initialize server: " + str(error))
return false
multiplayer.multiplayer_peer = webrtc_peer
is_host = true
# Connect signals
webrtc_peer.peer_connected.connect(_on_peer_connected)
webrtc_peer.peer_disconnected.connect(_on_peer_disconnected)
print("WebRTC: Host initialized successfully")
connection_ready.emit()
return true
func create_client() -> bool:
print("WebRTC: Creating client")
webrtc_peer = WebRTCMultiplayerPeer.new()
# Godot 4.x API: initialize(peer_id, server_compat)
# peer_id 0 for auto-assign, server_compat = false for client
var error = webrtc_peer.initialize(0, false)
if error != OK:
push_error("WebRTC: Failed to initialize client: " + str(error))
return false
multiplayer.multiplayer_peer = webrtc_peer
is_host = false
# Connect signals
webrtc_peer.peer_connected.connect(_on_peer_connected)
webrtc_peer.peer_disconnected.connect(_on_peer_disconnected)
print("WebRTC: Client initialized successfully")
connection_ready.emit()
return true
func create_mesh(peer_id: int) -> bool:
print("WebRTC: Creating mesh peer for ID ", peer_id)
if not webrtc_peer:
push_error("WebRTC: Peer not initialized")
return false
# Create peer connection with STUN server configured
var peer_connection = WebRTCPeerConnection.new()
# Configure STUN server for NAT traversal
var config = {
"iceServers": [
{
"urls": [STUN_SERVER]
}
]
}
var init_error = peer_connection.initialize(config)
if init_error != OK:
push_error("WebRTC: Failed to initialize peer connection: " + str(init_error))
return false
var error = webrtc_peer.add_peer(peer_connection, peer_id)
if error != OK:
push_error("WebRTC: Failed to add peer: " + str(error))
return false
print("WebRTC: Mesh peer created for ID ", peer_id, " with STUN server")
return true
# Get the local session description (offer or answer) to share with remote peer
func get_local_session() -> String:
if not webrtc_peer:
return ""
# Get all connection states and session descriptions
var session_data = {}
# For host, we need to create offers for each connected peer
# For client, we need to create an answer
# Note: WebRTCMultiplayerPeer handles this internally
# We just need to get the peer connection for manual signaling
# This is a simplified approach - for full WebRTC, you'd need to:
# 1. Create RTCPeerConnection
# 2. Create offer/answer
# 3. Exchange ICE candidates
# For now, return empty - we'll use a signaling server approach instead
return ""
# Set the remote session description from another peer
func set_remote_session(session_data: String) -> bool:
if not webrtc_peer:
return false
# Parse and apply remote session
# This would involve SDP parsing and ICE candidate exchange
return true
func _on_peer_connected(id: int):
print("WebRTC: Peer connected: ", id)
peer_connected_webrtc.emit(id)
func _on_peer_disconnected(id: int):
print("WebRTC: Peer disconnected: ", id)
peer_disconnected_webrtc.emit(id)
func close_connection():
if webrtc_peer:
webrtc_peer.close()
webrtc_peer = null
multiplayer.multiplayer_peer = null
is_host = false