Release 2.4.6: Add SafeNakamaMultiplayerBridge subclass to fix dictionary lookup crashes
Release / Build & Release (push) Successful in 7m22s

This commit is contained in:
2026-07-09 16:38:29 +08:00
parent 203175178f
commit 00c9e85527
7 changed files with 47 additions and 8 deletions
+3 -1
View File
@@ -2,6 +2,8 @@ extends Node
## AuthManager - Centralized authentication handling for Nakama
## Supports: Guest (device ID), Email/Password, Social (Google, Apple, Facebook)
const SafeNakamaMultiplayerBridge = preload("res://scripts/services/safe_nakama_multiplayer_bridge.gd")
# Signals
signal auth_started
signal auth_completed(success: bool, user_data: Dictionary)
@@ -472,7 +474,7 @@ func _connect_socket() -> bool:
return false
# Initialize multiplayer bridge
NakamaManager.bridge = NakamaMultiplayerBridge.new(NakamaManager.socket)
NakamaManager.bridge = SafeNakamaMultiplayerBridge.new(NakamaManager.socket)
NakamaManager.bridge.match_joined.connect(NakamaManager._on_bridge_match_joined)
NakamaManager.bridge.match_join_error.connect(NakamaManager._on_bridge_match_join_error)
multiplayer.set_multiplayer_peer(NakamaManager.bridge.multiplayer_peer)
+3 -1
View File
@@ -1,5 +1,7 @@
extends Node
const SafeNakamaMultiplayerBridge = preload("res://scripts/services/safe_nakama_multiplayer_bridge.gd")
# Standard Nakama Configuration
var nakama_server_key = OS.get_environment("NAKAMA_SERVER_KEY") if OS.has_environment("NAKAMA_SERVER_KEY") else ProjectSettings.get_setting("network/nakama/server_key", "defaultkey")
var nakama_host = OS.get_environment("NAKAMA_HOST") if OS.has_environment("NAKAMA_HOST") else ProjectSettings.get_setting("network/nakama/host", "tektondash.vps.webdock.cloud")
@@ -141,7 +143,7 @@ func connect_to_nakama_async(email: String = "", password: String = "") -> bool:
bridge.leave()
bridge = null
bridge = NakamaMultiplayerBridge.new(socket)
bridge = SafeNakamaMultiplayerBridge.new(socket)
# Connect bridge signals
bridge.match_joined.connect(_on_bridge_match_joined)
@@ -0,0 +1,23 @@
class_name SafeNakamaMultiplayerBridge
extends NakamaMultiplayerBridge
func _init(p_nakama_socket: NakamaSocket) -> void:
super._init(p_nakama_socket)
func _map_id_to_session(peer_id: int, session_id: String) -> void:
_id_map[peer_id] = session_id
if not _users.has(session_id):
_users[session_id] = NakamaMultiplayerBridge.User.new(null)
_users[session_id].peer_id = peer_id
func _on_multiplayer_peer_packet_generated(peer_id: int, buffer: PackedByteArray) -> void:
if match_state == MatchState.CONNECTED:
var target_presences = null
if peer_id > 0:
if not _id_map.has(peer_id) or not _users.has(_id_map[peer_id]) or _users[_id_map[peer_id]].presence == null:
push_error("Attempting to send RPC to unknown or uninitialized peer id: %s" % peer_id)
return
target_presences = [ _users[_id_map[peer_id]].presence ]
_nakama_socket.send_match_state_raw_async(_match_id, rpc_op_code, buffer, target_presences)
else:
push_error("RPC sent while the NakamaMultiplayerBridge isn't connected!")