105 lines
3.3 KiB
Rust
105 lines
3.3 KiB
Rust
|
use std::collections::HashMap;
|
||
|
|
||
|
use protocol::{
|
||
|
player_info::{EventGraphsInfo, SectionInfo},
|
||
|
scene_ext::SectionInfoExt,
|
||
|
PtcHallRefreshArg, SceneUnitProtocolInfo,
|
||
|
};
|
||
|
use qwer::{phashmap, phashset, PropertyHashMap, PropertyHashSet};
|
||
|
|
||
|
use crate::{level, PlayerSession};
|
||
|
|
||
|
pub fn init_hall_scene_section(session: &mut PlayerSession, scene_uid: u64, section_id: i32) {
|
||
|
let single_dungeon_group = session.player_info.single_dungeon_group.as_mut().unwrap();
|
||
|
if single_dungeon_group
|
||
|
.section
|
||
|
.as_ref()
|
||
|
.unwrap()
|
||
|
.contains(&scene_uid, §ion_id)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let section_map = single_dungeon_group.section.as_mut().unwrap();
|
||
|
section_map.insert(
|
||
|
scene_uid,
|
||
|
section_id,
|
||
|
SectionInfo {
|
||
|
scene_uid,
|
||
|
id: section_id,
|
||
|
event_graphs_info: EventGraphsInfo {
|
||
|
event_graphs_info: phashmap![],
|
||
|
default_event_graph_id: -1,
|
||
|
},
|
||
|
section_info_ext: SectionInfoExt::Hall {
|
||
|
destroy_npc_when_no_player: phashset![],
|
||
|
},
|
||
|
},
|
||
|
);
|
||
|
|
||
|
level::on_section_added(session, scene_uid, section_id);
|
||
|
}
|
||
|
|
||
|
pub fn add_scene_units_to_scene_info(
|
||
|
session: &mut PlayerSession,
|
||
|
scene_uid: u64,
|
||
|
scene_info: &mut protocol::SceneInfo,
|
||
|
) {
|
||
|
let Some(hall_scene_info) = scene_info.hall_scene_info.as_mut() else {
|
||
|
return;
|
||
|
};
|
||
|
|
||
|
hall_scene_info.scene_unit_list =
|
||
|
build_scene_unit_protocol_info(session, scene_uid, hall_scene_info.section_id);
|
||
|
}
|
||
|
|
||
|
pub fn add_scene_units_to_hall_refresh_arg(
|
||
|
session: &mut PlayerSession,
|
||
|
scene_uid: u64,
|
||
|
refresh_arg: &mut PtcHallRefreshArg,
|
||
|
) {
|
||
|
refresh_arg.scene_unit_list =
|
||
|
build_scene_unit_protocol_info(session, scene_uid, refresh_arg.section_id);
|
||
|
}
|
||
|
|
||
|
fn build_scene_unit_protocol_info(
|
||
|
session: &mut PlayerSession,
|
||
|
scene_uid: u64,
|
||
|
section_id: u32,
|
||
|
) -> Vec<SceneUnitProtocolInfo> {
|
||
|
let sdg = session.player_info.single_dungeon_group.as_ref().unwrap();
|
||
|
sdg.npcs
|
||
|
.as_ref()
|
||
|
.unwrap()
|
||
|
.iter()
|
||
|
.filter(|(s_uid, _, npc)| {
|
||
|
**s_uid == scene_uid && npc.scene_data.section_id == section_id as i32
|
||
|
})
|
||
|
.map(|(_, uid, npc)| SceneUnitProtocolInfo {
|
||
|
npc_id: npc.tag_value as u32,
|
||
|
is_interactable: true,
|
||
|
interacts_info: session
|
||
|
.level_event_graph_mgr
|
||
|
.bound_interact_map
|
||
|
.get(uid)
|
||
|
.map(|(_, interact)| {
|
||
|
HashMap::from([(
|
||
|
interact.interact_id as u32,
|
||
|
protocol::InteractInfo {
|
||
|
name: interact.name.clone(),
|
||
|
participators: interact.participators.clone(),
|
||
|
scale_x: interact.scale_x,
|
||
|
scale_y: interact.scale_y,
|
||
|
scale_z: interact.scale_z,
|
||
|
scale_w: interact.scale_w,
|
||
|
scale_r: interact.scale_r,
|
||
|
interact_id: npc.tag_value,
|
||
|
interact_target_list: vec![2],
|
||
|
},
|
||
|
)])
|
||
|
})
|
||
|
.unwrap_or_default(),
|
||
|
})
|
||
|
.collect()
|
||
|
}
|