Add private multiplayer room codes

This commit is contained in:
Emporex committed 2026-10-04 04:10:20 +02:00
1 parent 7362ca0f02
commit 19b1a67773
8 files changed
+341 -24

No files matched your search

+57
View File
@@ -9,6 +9,7 @@ signal matchmaking_state_changed(state: String)
signal match_found(match_data)
signal match_snapshot_received(snapshot: Dictionary)
signal match_event_received(event: Dictionary)
signal private_room_created(room_code: String)
const SERVER_KEY := "voidbastion-public-v1"
const PRODUCTION_HOST := "api.void-bastion.gergames.de"
@@ -30,6 +31,7 @@ var last_error := ""
var current_host := ""
var current_match = null
var matchmaker_ticket := ""
var private_room_code := ""
var account_manager: AccountManager
var auto_connect_enabled := true
@@ -102,6 +104,7 @@ func disconnect_from_server() -> void:
session = null
current_match = null
matchmaker_ticket = ""
private_room_code = ""
_set_connection_state("offline")
@@ -178,9 +181,62 @@ func cancel_matchmaking() -> void:
if socket and not matchmaker_ticket.is_empty():
await socket.remove_matchmaker_async(matchmaker_ticket)
matchmaker_ticket = ""
if current_match != null and not private_room_code.is_empty():
await socket.leave_match_async(current_match.match_id)
current_match = null
private_room_code = ""
matchmaking_state_changed.emit("idle")
func create_private_room(difficulty := 1) -> bool:
if not is_online() or socket == null:
matchmaking_state_changed.emit("offline")
return false
matchmaking_state_changed.emit("creating_room")
var result = await client.rpc_async(session, "create_private_room", JSON.stringify({"difficulty": clampi(difficulty, 0, 2)}))
var data := _parse_rpc_result(result)
var match_id := String(data.get("match_id", ""))
private_room_code = String(data.get("room_code", ""))
if match_id.is_empty() or private_room_code.length() != 6:
private_room_code = ""
matchmaking_state_changed.emit("error")
return false
current_match = await socket.join_match_async(match_id)
if current_match == null or current_match.is_exception():
current_match = null
private_room_code = ""
matchmaking_state_changed.emit("error")
return false
private_room_created.emit(private_room_code)
matchmaking_state_changed.emit("hosting")
await send_match_command(OP_READY, {})
return true
func join_private_room(room_code: String) -> bool:
if not is_online() or socket == null:
matchmaking_state_changed.emit("offline")
return false
private_room_code = room_code.to_upper().strip_edges()
matchmaking_state_changed.emit("joining_room")
var result = await client.rpc_async(session, "join_private_room", JSON.stringify({"room_code": private_room_code}))
var data := _parse_rpc_result(result)
var match_id := String(data.get("match_id", ""))
if not bool(data.get("found", false)) or match_id.is_empty():
private_room_code = ""
matchmaking_state_changed.emit("room_not_found")
return false
current_match = await socket.join_match_async(match_id)
if current_match == null or current_match.is_exception():
current_match = null
private_room_code = ""
matchmaking_state_changed.emit("room_not_found")
return false
matchmaking_state_changed.emit("matched")
await send_match_command(OP_READY, {})
return true
func _on_matchmaker_matched(matched) -> void:
matchmaker_ticket = ""
current_match = await socket.join_matched_async(matched)
@@ -219,6 +275,7 @@ func leave_current_match() -> void:
if socket and current_match != null:
await socket.leave_match_async(current_match.match_id)
current_match = null
private_room_code = ""
func _on_match_state(data) -> void: