Fix WebSocket accel parsing for missing or nested JSON fields.

Avoid crashes when x/y/z are absent or nested under accel/data keys.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
simon 2026-05-28 22:00:55 +02:00
parent 84b1a89f75
commit 9107dea6ff

View File

@ -173,7 +173,42 @@ func _handle_accel_message(text: String) -> void:
if data.get("type") != "accel" or not data.get("success", false): if data.get("type") != "accel" or not data.get("success", false):
return return
_accel = Vector3i(int(data["x"]), int(data["y"]), int(data["z"])) var parsed: Variant = _parse_accel_vector(data)
if parsed == null:
return
_accel = parsed as Vector3i
func _parse_accel_vector(data: Dictionary) -> Variant:
var source: Variant = _accel_fields_dict(data)
if source == null:
return null
return Vector3i(
_to_int(source.get("x")),
_to_int(source.get("y")),
_to_int(source.get("z"))
)
func _accel_fields_dict(data: Dictionary) -> Variant:
if data.has("x") and data.has("y") and data.has("z"):
return data
for key in ["accel", "values", "data", "payload"]:
var nested: Variant = data.get(key)
if nested is Dictionary and nested.has("x") and nested.has("y") and nested.has("z"):
return nested
return null
func _to_int(value: Variant) -> int:
match typeof(value):
TYPE_INT:
return value
TYPE_FLOAT:
return int(value)
TYPE_STRING:
return int(float(value))
return 0
func _play_area() -> Rect2: func _play_area() -> Rect2: