import betterproto from game_server.net.session import PlayerSession from game_server.resource import ResourceManager from game_server.resource.configdb.stage_config import StageConfig from rail_proto.lib import ( SceneCastSkillCsReq, SceneCastSkillScRsp, SceneBattleInfo, SceneMonsterWave, SceneMonster ) import numpy as np async def handle(session: PlayerSession, msg: SceneCastSkillCsReq) -> betterproto.Message: targets = [id for id in msg.assist_monster_entity_id_list if id > 20000 or id < 10] for monster in msg.assist_monster_entity_info: targets.extend( id for id in monster.entity_id_list if id not in targets and (id > 20000 or id < 10) ) if msg.skill_index == 0 and targets: monster_data: list[StageConfig] = [] for entity_id in targets: entity_data = session.player.scene_manager.entities.get(entity_id) if entity_data: stage = ResourceManager.instance().find_by_index(StageConfig,entity_data.npc_monster.event_id*10) if not stage: stage = ResourceManager.instance().find_by_index(StageConfig,entity_data.npc_monster.event_id) if stage: monster_data.append(stage) session.player.scene_manager.battle_monster.append(entity_data) if monster_data: return SceneCastSkillScRsp( retcode=0, cast_entity_id=msg.cast_entity_id, battle_info=SceneBattleInfo( rounds_limit=0, world_level=session.player.data.world_level, logic_random_seed=np.random.randint(1, np.iinfo(np.int32).max, dtype=np.int32), stage_id=monster_data[0].StageID, battle_id=1, battle_avatar_list=[ session.player.avatar_mananger.get(avatar_id).ToBattleProto(index,session) for index, avatar_id in enumerate(session.player.lineup_manager.get(session.player.data.cur_lineup, None).avatar_list) ], monster_wave_list=[ SceneMonsterWave( battle_stage_id=monster_list.StageID, battle_wave_id=index, monster_list=[ SceneMonster( monster_id=id ) for monster_dict in monster_list.MonsterList for monster, id in monster_dict.items() if id > 0 ] ) for index,monster_list in enumerate(monster_data) ] ) ) return SceneCastSkillScRsp(retcode=0)