import betterproto from game_server.net.session import PlayerSession from game_server.game.motion.motion_info import Motion from rail_proto.lib import ( SwitchLineupIndexCsReq, SwitchLineupIndexScRsp, SyncLineupNotify, SceneGroupRefreshScNotify, GroupRefreshInfo, SceneGroupRefreshType, SceneEntityRefreshInfo ) async def handle(session: PlayerSession, msg: SwitchLineupIndexCsReq) -> betterproto.Message | None: lineup_data = session.player.lineup_manager.get(msg.index) if not lineup_data: return None await session.notify( SyncLineupNotify( lineup=lineup_data.ToProto() ) ) player_pos = Motion( x=session.player.data.pos.x, y=session.player.data.pos.y, z=session.player.data.pos.z, rotY=session.player.data.rot.y ).ToProto() for avatar_id in lineup_data.avatar_list: session.pending_notify( SceneGroupRefreshScNotify( floor_id=session.player.data.floor_id, group_refresh_list=[ GroupRefreshInfo( refresh_type=SceneGroupRefreshType.SCENE_GROUP_REFRESH_TYPE_LOADED.value, refresh_entity=[ SceneEntityRefreshInfo( add_entity=session.player.scene_manager.Actor(avatar_id, player_pos) ) ] ) ] ) ) session.player.data.cur_lineup = msg.index return SwitchLineupIndexScRsp( retcode=0, index=msg.index )