|
|
@@ -197,6 +197,8 @@ class WorldUpdater:
|
|
|
world.record("me_revive")
|
|
|
elif mid == 31:
|
|
|
self._on_struck(world, frame)
|
|
|
+ elif mid == 52:
|
|
|
+ self._on_player_props(world, frame)
|
|
|
elif mid == 53:
|
|
|
self._on_hp(world, frame)
|
|
|
elif mid == 55:
|
|
|
@@ -540,6 +542,27 @@ class WorldUpdater:
|
|
|
_LOG.info("[SC31] 致死: %s", detail)
|
|
|
world.record("struck", detail, aid)
|
|
|
|
|
|
+ def _on_player_props(self, world: WorldMirror, f: Frame) -> None:
|
|
|
+ """SC52 角色属性: level 权威源(神通 35 级门槛判定用)。
|
|
|
+
|
|
|
+ body=encode6(JSON), 实测(cap_hoe_success_frames_20261001):
|
|
|
+ {"job":0,"level":1,"hp":15,"maxhp":29,"exp":0,...}
|
|
|
+ hp/maxhp 有值时同步(比 SC53 稀疏推送更全)。
|
|
|
+ """
|
|
|
+ j = body_json(f)
|
|
|
+ lv = _as_int(j.get("level", 0))
|
|
|
+ if lv > 0:
|
|
|
+ if lv != world.me.level:
|
|
|
+ _LOG.info("[SC52] 等级 %d → %d", world.me.level, lv)
|
|
|
+ world.me.level = lv
|
|
|
+ hp = _as_int(j.get("hp", 0))
|
|
|
+ maxhp = _as_int(j.get("maxhp", 0))
|
|
|
+ if hp > 0:
|
|
|
+ world.me.hp = hp
|
|
|
+ if maxhp > 0:
|
|
|
+ world.me.max_hp = maxhp
|
|
|
+ world.record("player_props", f"lv={lv}")
|
|
|
+
|
|
|
def _on_hp(self, world: WorldMirror, f: Frame) -> None:
|
|
|
# SC53 body=encode6("长uid&HP&maxHP&MP&maxMP|power") (backup diag 定案)
|
|
|
me = world.me
|