From 1a41d4b07b898db25a69188f152995a6506197d8 Mon Sep 17 00:00:00 2001 From: xeon Date: Thu, 30 May 2024 22:26:18 +0300 Subject: [PATCH] Better interact handling (fixes Nicole dialogue) (still temporary impl) --- gameserver/src/data/event_graph.rs | 2 + gameserver/src/game/manager/scene_unit.rs | 6 +- gameserver/src/net/handlers/world.rs | 106 ++++++++++++++-------- protocol/src/enums.rs | 2 +- 4 files changed, 76 insertions(+), 40 deletions(-) diff --git a/gameserver/src/data/event_graph.rs b/gameserver/src/data/event_graph.rs index f48ad73..89f0f80 100644 --- a/gameserver/src/data/event_graph.rs +++ b/gameserver/src/data/event_graph.rs @@ -27,6 +27,8 @@ pub enum ConfigValue { pub enum ConfigEventType { OnStart, OnEnd, + OnBro, + OnSis, #[serde(other)] Unknown, } diff --git a/gameserver/src/game/manager/scene_unit.rs b/gameserver/src/game/manager/scene_unit.rs index b03c9e5..6f5fbd1 100644 --- a/gameserver/src/game/manager/scene_unit.rs +++ b/gameserver/src/game/manager/scene_unit.rs @@ -42,8 +42,8 @@ impl SceneUnitManager { uid } - pub async fn get(&self, uid: u64) -> SceneUnitProtocolInfo { - self.units.read().await.get(&uid).unwrap().clone() + pub async fn get(&self, uid: u64) -> Option { + self.units.read().await.get(&uid).map(|u| u.clone()) } pub async fn sync(&self, scene_uid: u64, section_id: i32) -> PtcSyncSceneUnitArg { @@ -113,7 +113,7 @@ impl SceneUnitManager { 1002, 0, phashmap![( - 19900062, + 10000009, create_interact( 0, 1, diff --git a/gameserver/src/net/handlers/world.rs b/gameserver/src/net/handlers/world.rs index 18b0e15..db8d9ee 100644 --- a/gameserver/src/net/handlers/world.rs +++ b/gameserver/src/net/handlers/world.rs @@ -12,21 +12,34 @@ pub async fn on_rpc_run_event_graph( session: &NetworkSession, arg: &RpcRunEventGraphArg, ) -> Result { - tracing::info!("RunEventGraph requested"); - let unit = session.context.scene_unit_manager.get(arg.owner_uid).await; - let SceneUnitProtocolInfo::NpcProtocolInfo { tag, id, .. } = unit; - let main_city_object = data::get_main_city_object(tag, id).unwrap(); + let interact_id = match unit { + Some(SceneUnitProtocolInfo::NpcProtocolInfo { interacts_info, .. }) + if interacts_info.len() != 0 => + { + *interacts_info.iter().next().unwrap().0 + } + Some(SceneUnitProtocolInfo::NpcProtocolInfo { tag, id, .. }) => { + let main_city_object = data::get_main_city_object(tag, id).unwrap(); + *main_city_object.default_interact_ids.first().unwrap() + } + None => { + return Ok(RpcRunEventGraphRet::error( + ErrorCode::EntityNotExist, + Vec::new(), + )) + } + }; let mut ptc_sync_event_info = PtcSyncEventInfoArg { - owner_type: EventGraphOwnerType::SceneUnit, + owner_type: arg.owner_type, owner_uid: arg.owner_uid, updated_events: pdkhashmap![], }; ptc_sync_event_info.updated_events.insert( - *main_city_object.default_interact_ids.first().unwrap(), + interact_id, 100, EventInfo { id: 100, @@ -52,8 +65,6 @@ pub async fn on_rpc_finish_event_graph_perform_show( session: &NetworkSession, arg: &RpcFinishEventGraphPerformShowArg, ) -> Result { - tracing::info!("FinishEventGraphPerformShow"); - let mut ptc_sync_event_info = PtcSyncEventInfoArg { owner_type: EventGraphOwnerType::SceneUnit, owner_uid: arg.owner_uid, @@ -87,38 +98,63 @@ pub async fn on_rpc_interact_with_unit( session: &NetworkSession, arg: &RpcInteractWithUnitArg, ) -> Result { - tracing::info!("InteractWithUnit"); + tracing::info!( + "InteractWithUnit: unit_uid: {}, interaction: {}", + arg.unit_uid, + arg.interaction + ); let unit = session.context.scene_unit_manager.get(arg.unit_uid).await; - let SceneUnitProtocolInfo::NpcProtocolInfo { tag, id, .. } = unit; - let main_city_object = data::get_main_city_object(tag, id).unwrap(); - - let mut ptc_sync_event_info = PtcSyncEventInfoArg { - owner_type: EventGraphOwnerType::SceneUnit, - owner_uid: arg.unit_uid, - updated_events: pdkhashmap![], + let interact_id = match unit { + Some(SceneUnitProtocolInfo::NpcProtocolInfo { interacts_info, .. }) + if interacts_info.len() != 0 => + { + *interacts_info.iter().next().unwrap().0 + } + Some(SceneUnitProtocolInfo::NpcProtocolInfo { tag, id, .. }) => { + let main_city_object = data::get_main_city_object(tag, id).unwrap(); + *main_city_object.default_interact_ids.first().unwrap() + } + None => { + return Ok(RpcInteractWithUnitRet::error( + ErrorCode::EntityNotExist, + Vec::new(), + )) + } }; - ptc_sync_event_info.updated_events.insert( - *main_city_object.default_interact_ids.first().unwrap(), - 100, - EventInfo { - id: 100, - cur_action_id: 101, - action_move_path: Vec::from([101]), - state: EventState::WaitingClient, - prev_state: EventState::Running, - cur_action_info: ActionInfo::None {}, - cur_action_state: ActionState::Init, - predicated_failed_actions: phashset![], - stack_frames: Vec::new(), - }, - ); + // 0 - ServerInteractiveSystem::TriggerEnterEvent + // 1 - ServerInteractiveSystem::TriggerExitEvent + // 2 - ServerInteractiveSystem::TriggerInteractDirectly + if arg.interaction == 2 { + let mut ptc_sync_event_info = PtcSyncEventInfoArg { + owner_type: EventGraphOwnerType::SceneUnit, + owner_uid: arg.unit_uid, + updated_events: pdkhashmap![], + }; + + ptc_sync_event_info.updated_events.insert( + interact_id, + 100, + EventInfo { + id: 100, + cur_action_id: 101, + action_move_path: Vec::from([101]), + state: EventState::WaitingClient, + prev_state: EventState::Running, + cur_action_info: ActionInfo::None {}, + cur_action_state: ActionState::Init, + predicated_failed_actions: phashset![], + stack_frames: Vec::new(), + }, + ); + + session + .send_rpc_arg(PTC_SYNC_EVENT_INFO_ID, &ptc_sync_event_info) + .await?; + } - session - .send_rpc_arg(PTC_SYNC_EVENT_INFO_ID, &ptc_sync_event_info) - .await?; Ok(RpcInteractWithUnitRet::new()) } @@ -141,8 +177,6 @@ pub async fn on_rpc_save_pos_in_main_city( _session: &NetworkSession, _arg: &RpcSavePosInMainCityArg, ) -> Result { - tracing::info!("MainCity pos updated"); - Ok(RpcSavePosInMainCityRet::new()) } diff --git a/protocol/src/enums.rs b/protocol/src/enums.rs index 73bad36..4c82df4 100644 --- a/protocol/src/enums.rs +++ b/protocol/src/enums.rs @@ -683,7 +683,7 @@ pub enum InteractTarget { TriggerBox = 1, } -#[derive(OctData, Clone, Debug)] +#[derive(OctData, Clone, Copy, Debug)] #[repr(i16)] pub enum EventGraphOwnerType { Scene = 0,