trigger-rs/crates/game-server/src/session/message/scene.rs
2025-02-21 14:03:43 +03:00

131 lines
3.8 KiB
Rust

use super::MessageContext;
use trigger_codegen::handlers;
#[handlers]
mod scene_module {
use tracing::debug;
use trigger_logic::scene::ESceneType;
use crate::logic::scene_util;
pub async fn on_enter_world(context: &mut MessageContext<'_, '_>, _request: EnterWorldCsReq) {
let scene_model = &mut context.player.scene_model;
let scene_to_enter = match scene_model.get_current_scene().await {
Some(current_scene)
if scene_util::persists_on_relogin(
ESceneType::try_from(current_scene.scene_type).unwrap(),
) =>
{
Some(current_scene)
}
_ => scene_model.get_default_scene().await,
};
let scene_to_enter = if scene_to_enter.is_none() {
// TODO: first scene to be created should be the 'Fresh' scene (beginner procedure)
debug!(
"player with uid {} has no scene to enter, default hall scene will be created",
context.session.player_uid
);
let scene = scene_model.create_scene_info(ESceneType::Hall).await;
scene_model.set_default_scene(&scene).await;
scene
} else {
scene_to_enter.unwrap()
};
context
.session
.change_game_state(
context.request_id,
EnterWorldScRsp { retcode: 0 },
context
.player
.build_state_reentrant_data(&scene_to_enter)
.unwrap(),
&scene_to_enter,
context.player,
false,
)
.await;
context.player.scene_model.clear_abandoned_scenes().await;
}
pub async fn on_post_enter_world(
_context: &mut MessageContext<'_, '_>,
_request: PostEnterWorldCsReq,
) -> PostEnterWorldScRsp {
PostEnterWorldScRsp { retcode: 0 }
}
pub async fn on_scene_transition(
_context: &mut MessageContext<'_, '_>,
request: SceneTransitionCsReq,
) -> SceneTransitionScRsp {
debug!("{request:?}");
SceneTransitionScRsp { retcode: 0 }
}
pub async fn on_enter_section_complete(
_context: &mut MessageContext<'_, '_>,
_request: EnterSectionCompleteCsReq,
) -> EnterSectionCompleteScRsp {
EnterSectionCompleteScRsp { retcode: 0 }
}
pub async fn on_refresh_section(
_context: &mut MessageContext<'_, '_>,
_request: RefreshSectionCsReq,
) -> RefreshSectionScRsp {
RefreshSectionScRsp {
retcode: 0,
refresh_status: 0,
}
}
pub async fn on_leave_cur_scene(
context: &mut MessageContext<'_, '_>,
_request: LeaveCurSceneCsReq,
) {
if let Some(scene_uid) = context.session.get_cur_scene_uid() {
context.player.scene_model.on_leave_scene(scene_uid).await;
}
let default_scene = context
.player
.scene_model
.get_default_scene()
.await
.unwrap();
context
.session
.change_game_state(
context.request_id,
LeaveCurSceneScRsp { retcode: 0 },
context
.player
.build_state_reentrant_data(&default_scene)
.unwrap(),
&default_scene,
context.player,
false,
)
.await;
}
pub async fn on_active_hollow_check_point(
_context: &mut MessageContext<'_, '_>,
request: ActiveHollowCheckPointCsReq,
) -> ActiveHollowCheckPointScRsp {
// TODO: forward it to battle-server and actually handle
debug!("{:?}", request.check_point);
ActiveHollowCheckPointScRsp { retcode: 0 }
}
}