update for spectra changes (#1363)

This commit is contained in:
NotSoToothless
2026-06-29 11:05:51 -07:00
committed by GitHub
parent fa203c653b
commit 6d251be97c
4 changed files with 79 additions and 16 deletions
+39 -14
View File
@@ -3575,6 +3575,10 @@ def _unit_to_model_name(unit_name: str) -> str:
internal = (unit_name or "").strip()
if not internal:
return "tankModels/unknown"
if internal.startswith(("tankModels/", "airModels/")):
return internal
if internal.startswith("aircrafts/"):
return f"airModels/{internal.split('/', 1)[1]}"
tags = _get_unit_tags(internal) or []
tag_set = set(tags)
if "type_strike_ucav" in tag_set or "ucav" in internal.lower():
@@ -3645,6 +3649,15 @@ def _position_at_time(path: list[dict[str, float]], time_ms: float) -> dict[str,
return prev
def _event_position_to_dict(pos: Any) -> dict[str, float] | None:
if not isinstance(pos, list) or len(pos) < 3:
return None
try:
return {"X": float(pos[0]), "Y": float(pos[1]), "Z": float(pos[2])}
except (TypeError, ValueError):
return None
def _find_render_entity_for_event(entities: list[dict[str, Any]],
player_id: int,
event_model: str | None,
@@ -3739,7 +3752,7 @@ def _convert_ws_replay_to_render_dict(replay: dict[str, Any]) -> dict[str, Any]:
if not isinstance(ent, dict):
continue
uid = _to_int(ent.get("uid"), 0)
unit = str(ent.get("unit") or "")
unit = str(ent.get("model_path") or ent.get("unit") or "")
path_raw = ent.get("path") or []
if not isinstance(path_raw, list):
continue
@@ -3775,12 +3788,18 @@ def _convert_ws_replay_to_render_dict(replay: dict[str, Any]) -> dict[str, Any]:
victim_id = _to_int(kill.get("offended_uid"), 0)
killer_id = _to_int(kill.get("offender_uid"), 0)
kill_time = float(kill.get("time") or 0.0)
victim_model = _unit_to_model_name(str(kill.get("offended_unit") or ""))
killer_model = _unit_to_model_name(str(kill.get("offender_unit") or ""))
victim_model = _unit_to_model_name(str(kill.get("offended_unit_model_path") or kill.get("offended_unit") or ""))
killer_model = _unit_to_model_name(str(kill.get("offender_unit_model_path") or kill.get("offender_unit") or ""))
victim_entity = _find_render_entity_for_event(entities_out, victim_id, victim_model, kill_time)
killer_entity = _find_render_entity_for_event(entities_out, killer_id, killer_model, kill_time)
victim_pos = _position_at_time(victim_entity.get("Path", []), kill_time) if victim_entity else None
killer_pos = _position_at_time(killer_entity.get("Path", []), kill_time) if killer_entity else None
victim_pos = (
_position_at_time(victim_entity.get("Path", []), kill_time)
if victim_entity else None
) or _event_position_to_dict(kill.get("offended_pos"))
killer_pos = (
_position_at_time(killer_entity.get("Path", []), kill_time)
if killer_entity else None
) or _event_position_to_dict(kill.get("offender_pos"))
payload: dict[str, Any] = {
"Time": kill_time,
"VictimID": victim_id,
@@ -3816,8 +3835,8 @@ def _convert_ws_replay_to_render_dict(replay: dict[str, Any]) -> dict[str, Any]:
"Time": float(dmg.get("time") or 0.0),
"OffenderID": _to_int(dmg.get("offender_uid"), 0),
"OffendedID": _to_int(dmg.get("offended_uid"), 0),
"OffenderModel": _unit_to_model_name(str(dmg.get("offender_unit") or "")),
"OffendedModel": _unit_to_model_name(str(dmg.get("offended_unit") or "")),
"OffenderModel": _unit_to_model_name(str(dmg.get("offender_unit_model_path") or dmg.get("offender_unit") or "")),
"OffendedModel": _unit_to_model_name(str(dmg.get("offended_unit_model_path") or dmg.get("offended_unit") or "")),
"Afire": bool(dmg.get("afire", False)),
})
@@ -3905,7 +3924,7 @@ def _convert_local_replay_to_render_dict(replay: dict[str, Any]) -> dict[str, An
if not isinstance(ent, dict):
continue
uid = _to_int(ent.get("uid"), 0)
unit = str(ent.get("unit") or "")
unit = str(ent.get("model_path") or ent.get("unit") or "")
path_raw = ent.get("path") or []
if not isinstance(path_raw, list):
continue
@@ -3941,12 +3960,18 @@ def _convert_local_replay_to_render_dict(replay: dict[str, Any]) -> dict[str, An
victim_id = _to_int(kill.get("offended_uid"), 0)
killer_id = _to_int(kill.get("offender_uid"), 0)
kill_time = float(kill.get("time") or 0.0)
victim_model = _unit_to_model_name(str(kill.get("offended_unit") or ""))
killer_model = _unit_to_model_name(str(kill.get("offender_unit") or ""))
victim_model = _unit_to_model_name(str(kill.get("offended_unit_model_path") or kill.get("offended_unit") or ""))
killer_model = _unit_to_model_name(str(kill.get("offender_unit_model_path") or kill.get("offender_unit") or ""))
victim_entity = _find_render_entity_for_event(entities_out, victim_id, victim_model, kill_time)
killer_entity = _find_render_entity_for_event(entities_out, killer_id, killer_model, kill_time)
victim_pos = _position_at_time(victim_entity.get("Path", []), kill_time) if victim_entity else None
killer_pos = _position_at_time(killer_entity.get("Path", []), kill_time) if killer_entity else None
victim_pos = (
_position_at_time(victim_entity.get("Path", []), kill_time)
if victim_entity else None
) or _event_position_to_dict(kill.get("offended_pos"))
killer_pos = (
_position_at_time(killer_entity.get("Path", []), kill_time)
if killer_entity else None
) or _event_position_to_dict(kill.get("offender_pos"))
payload: dict[str, Any] = {
"Time": kill_time,
"VictimID": victim_id,
@@ -3982,8 +4007,8 @@ def _convert_local_replay_to_render_dict(replay: dict[str, Any]) -> dict[str, An
"Time": float(dmg.get("time") or 0.0),
"OffenderID": _to_int(dmg.get("offender_uid"), 0),
"OffendedID": _to_int(dmg.get("offended_uid"), 0),
"OffenderModel": _unit_to_model_name(str(dmg.get("offender_unit") or "")),
"OffendedModel": _unit_to_model_name(str(dmg.get("offended_unit") or "")),
"OffenderModel": _unit_to_model_name(str(dmg.get("offender_unit_model_path") or dmg.get("offender_unit") or "")),
"OffendedModel": _unit_to_model_name(str(dmg.get("offended_unit_model_path") or dmg.get("offended_unit") or "")),
"Afire": bool(dmg.get("afire", False)),
})