From c697c799d6f5ddd941331723e2d9c376eb6c05e5 Mon Sep 17 00:00:00 2001 From: amizing25 Date: Sun, 1 Mar 2026 01:14:45 +0800 Subject: [PATCH] feat: Support SceneEnterStageC and remove avatar red DOM --- common/src/structs/avatar.rs | 2 +- gameserver/src/net/handlers/avatar.rs | 11 ++++++++++- gameserver/src/net/handlers/battle.rs | 10 ++++++++++ gameserver/src/net/packet.rs | 3 ++- proto/StarRail.proto | 6 +++--- proto/out/_.rs | 10 +++++----- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/common/src/structs/avatar.rs b/common/src/structs/avatar.rs index 0422ead..19cf834 100644 --- a/common/src/structs/avatar.rs +++ b/common/src/structs/avatar.rs @@ -172,7 +172,7 @@ impl AvatarJson { equipment_unique_id: lightcone.map(|v| v.get_unique_id()).unwrap_or_default(), first_met_time_stamp: 1712924677, cur_multi_path_avatar_type, - has_taken_promotion_reward_list: Vec::with_capacity(0), + has_taken_promotion_reward_list: vec![1, 3, 5], is_marked: false, exp: 0, } diff --git a/gameserver/src/net/handlers/avatar.rs b/gameserver/src/net/handlers/avatar.rs index abe10ba..c43bd15 100644 --- a/gameserver/src/net/handlers/avatar.rs +++ b/gameserver/src/net/handlers/avatar.rs @@ -40,7 +40,7 @@ pub async fn on_get_avatar_data_cs_req( first_met_time_stamp: 1712924677, cur_multi_path_avatar_type: 0, equipment_unique_id: 0, - has_taken_promotion_reward_list: Vec::with_capacity(0), + has_taken_promotion_reward_list: vec![1, 3, 5], is_marked: false, exp: 0, }) @@ -64,6 +64,15 @@ pub async fn on_get_avatar_data_cs_req( .collect(); } +pub async fn on_take_promotion_reward_cs_req( + _session: &mut PlayerSession, + _req: &TakePromotionRewardCsReq, + _res: &mut TakePromotionRewardScRsp, +) { + // retcode defaults to 0, reward_list defaults to empty + // All avatars already report has_taken_promotion_reward_list = [0..=6] in GetAvatarData +} + pub async fn on_set_avatar_enhanced_id_cs_req( _session: &mut PlayerSession, _req: &SetAvatarEnhancedIdCsReq, diff --git a/gameserver/src/net/handlers/battle.rs b/gameserver/src/net/handlers/battle.rs index bb4d2fe..9983c56 100644 --- a/gameserver/src/net/handlers/battle.rs +++ b/gameserver/src/net/handlers/battle.rs @@ -35,6 +35,16 @@ pub async fn on_quick_start_cocoon_stage_cs_req( res.battle_info = Some(battle_info); } +pub async fn on_scene_enter_stage_cs_req( + session: &mut PlayerSession, + _req: &SceneEnterStageCsReq, + res: &mut SceneEnterStageScRsp, +) { + let battle_info = create_battle_info(session, 0, 0).await; + + res.battle_info = Some(battle_info); +} + pub async fn on_pve_battle_result_cs_req( _session: &mut PlayerSession, req: &PveBattleResultCsReq, diff --git a/gameserver/src/net/packet.rs b/gameserver/src/net/packet.rs index 8eda333..39dc293 100644 --- a/gameserver/src/net/packet.rs +++ b/gameserver/src/net/packet.rs @@ -178,7 +178,7 @@ trait_handler! { GetCurSceneInfo; PlayerHeartBeat; SetAvatarEnhancedId; - + TakePromotionReward; // Entity move (dummy!) SceneEntityMove; @@ -209,6 +209,7 @@ trait_handler! { PveBattleResult; SceneCastSkill; QuickStartCocoonStage; + SceneEnterStage; // Teleport GetEnteredScene; diff --git a/proto/StarRail.proto b/proto/StarRail.proto index d178ef3..57a2c20 100644 --- a/proto/StarRail.proto +++ b/proto/StarRail.proto @@ -34184,7 +34184,7 @@ enum CmdSceneType { CmdGetSceneMapInfoCsReq = 1432; CmdGetEnteredSceneScRsp = 1495; CmdGetUnlockTeleportScRsp = 1438; - CmdSceneStageBattleCsReq = 1431; + CmdSceneEnterStageCsReq = 1431; CmdInteractPropScRsp = 1404; CmdReturnLastTownScRsp = 1409; CmdSetCurInteractEntityScRsp = 1468; @@ -34707,10 +34707,10 @@ message SceneCastSkillMpUpdateScNotify { uint32 cast_entity_id = 8; // offset: 24 } -// Obf: SceneStageBattleCsReq +// Obf: SceneEnterStageCsReq // Type: Req // CmdID: 1431 -message SceneStageBattleCsReq { +message SceneEnterStageCsReq { uint32 event_id = 6; // offset: 32 RebattleType rebattle_type = 7; // offset: 28 bool CLGOFDEDIAN = 1; // offset: 24 diff --git a/proto/out/_.rs b/proto/out/_.rs index 358020b..d37766c 100644 --- a/proto/out/_.rs +++ b/proto/out/_.rs @@ -52863,12 +52863,12 @@ pub struct SceneCastSkillMpUpdateScNotify { #[prost(uint32, tag = "8")] pub cast_entity_id: u32, } -/// Obf: SceneStageBattleCsReq +/// Obf: SceneEnterStageCsReq /// Type: Req #[derive(proto_derive::CmdID)] #[cmdid(1431)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct SceneStageBattleCsReq { +pub struct SceneEnterStageCsReq { /// offset: 32 #[prost(uint32, tag = "6")] pub event_id: u32, @@ -92764,7 +92764,7 @@ pub enum CmdSceneType { CmdGetSceneMapInfoCsReq = 1432, CmdGetEnteredSceneScRsp = 1495, CmdGetUnlockTeleportScRsp = 1438, - CmdSceneStageBattleCsReq = 1431, + CmdSceneEnterStageCsReq = 1431, CmdInteractPropScRsp = 1404, CmdReturnLastTownScRsp = 1409, CmdSetCurInteractEntityScRsp = 1468, @@ -92862,7 +92862,7 @@ impl CmdSceneType { Self::CmdGetSceneMapInfoCsReq => "CmdGetSceneMapInfoCsReq", Self::CmdGetEnteredSceneScRsp => "CmdGetEnteredSceneScRsp", Self::CmdGetUnlockTeleportScRsp => "CmdGetUnlockTeleportScRsp", - Self::CmdSceneStageBattleCsReq => "CmdSceneStageBattleCsReq", + Self::CmdSceneEnterStageCsReq => "CmdSceneEnterStageCsReq", Self::CmdInteractPropScRsp => "CmdInteractPropScRsp", Self::CmdReturnLastTownScRsp => "CmdReturnLastTownScRsp", Self::CmdSetCurInteractEntityScRsp => "CmdSetCurInteractEntityScRsp", @@ -92971,7 +92971,7 @@ impl CmdSceneType { "CmdGetSceneMapInfoCsReq" => Some(Self::CmdGetSceneMapInfoCsReq), "CmdGetEnteredSceneScRsp" => Some(Self::CmdGetEnteredSceneScRsp), "CmdGetUnlockTeleportScRsp" => Some(Self::CmdGetUnlockTeleportScRsp), - "CmdSceneStageBattleCsReq" => Some(Self::CmdSceneStageBattleCsReq), + "CmdSceneEnterStageCsReq" => Some(Self::CmdSceneEnterStageCsReq), "CmdInteractPropScRsp" => Some(Self::CmdInteractPropScRsp), "CmdReturnLastTownScRsp" => Some(Self::CmdReturnLastTownScRsp), "CmdSetCurInteractEntityScRsp" => Some(Self::CmdSetCurInteractEntityScRsp),