fix: main character switching

This commit is contained in:
amizing25
2026-01-07 17:19:54 +07:00
parent 779efd2771
commit c2b3bb4dd9
8 changed files with 104 additions and 86 deletions
+24 -28
View File
@@ -1,6 +1,8 @@
use super::*;
pub static UNLOCKED_AVATARS: [u32; 76] = [
pub static BASE_AVATAR_IDS: [u32; 78] = [
8001, 1001, //
//
1002, 1003, 1004, 1005, 1006, 1008, 1009, 1013, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,
1109, 1110, 1111, 1112, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212,
1213, 1214, 1215, 1217, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1312, 1315, 1310,
@@ -18,24 +20,19 @@ pub async fn on_get_avatar_data_cs_req(
return;
};
// TODO: HARDCODED
let mc_ids = if json.main_character.get_gender() == Gender::Man {
[8001, 8003, 8005, 8007]
} else {
[8002, 8004, 8006, 8008]
};
let march_ids = [1001, 1224];
res.is_get_all = body.is_get_all;
res.avatar_list = UNLOCKED_AVATARS
res.avatar_list = BASE_AVATAR_IDS
.into_iter()
.chain(mc_ids.iter().copied())
.chain(march_ids.iter().copied())
.map(|id| {
json.avatars
.get(&id)
.map(|v| v.to_avatar_proto(json.lightcones.iter().find(|v| v.equip_avatar == id)))
.map(|v| {
v.to_avatar_proto(
json.lightcones.iter().find(|v| v.equip_avatar == id),
json.main_character as u32,
json.march_type as u32,
)
})
.unwrap_or(Avatar {
base_avatar_id: id,
level: 80,
@@ -50,20 +47,19 @@ pub async fn on_get_avatar_data_cs_req(
})
.collect();
res.avatar_path_data_info_list = UNLOCKED_AVATARS
.into_iter()
.chain(mc_ids.iter().copied())
.chain(march_ids.iter().copied())
.filter_map(|id| {
json.avatars.get(&id).map(|v| {
v.to_avatar_path_data_proto(
json.lightcones.iter().find(|v| v.equip_avatar == id),
json.relics
.iter()
.filter(|v| v.equip_avatar == id)
.collect(),
)
})
res.avatar_path_data_info_list = json
.avatars
.values()
.map(|avatar| {
avatar.to_avatar_path_data_proto(
json.lightcones
.iter()
.find(|l| l.equip_avatar == avatar.avatar_id),
json.relics
.iter()
.filter(|r| r.equip_avatar == avatar.avatar_id)
.collect(),
)
})
.collect();
}
+5 -3
View File
@@ -3,7 +3,7 @@ use proto::{get_big_data_all_recommend_sc_rsp::RecommendType, *};
use crate::net::PlayerSession;
use super::UNLOCKED_AVATARS;
use super::BASE_AVATAR_IDS;
pub async fn on_get_bag_cs_req(
session: &mut PlayerSession,
@@ -122,7 +122,7 @@ pub async fn on_get_big_data_all_recommend_cs_req(
}
BigDataRecommendType::AvatarRelic => {
res.recommend_type = Some(RecommendType::AvatarRelic(BigDataRecommendAvatarRelic {
recomended_relic_info_list: UNLOCKED_AVATARS
recomended_relic_info_list: BASE_AVATAR_IDS
.into_iter()
.map(|avatar_id| RecommendedRelicInfo {
avatar_id,
@@ -324,7 +324,9 @@ fn build_sync(
) {
let avatar_list = avatar_ids
.iter()
.filter_map(|id| player.get_avatar_proto(*id))
.filter_map(|id| {
player.get_avatar_proto(*id, player.main_character as u32, player.march_type as u32)
})
.collect::<Vec<_>>();
let avatar_path_data_info_list = avatar_ids
+23 -15
View File
@@ -17,7 +17,7 @@ use tokio::{
sync::{Mutex, watch},
};
use crate::util;
use crate::{net::handlers::BASE_AVATAR_IDS, util};
use super::{NetPacket, packet::CommandHandler};
@@ -134,11 +134,18 @@ impl PlayerSession {
// clear all avatars equip item
self.send(PlayerSyncScNotify {
avatar_sync: Some(AvatarSync {
avatar_list: json
.avatars
.values()
.map(|avatar| avatar.to_avatar_proto(Option::None))
.collect::<Vec<_>>(),
avatar_list: BASE_AVATAR_IDS
.into_iter()
.filter_map(|id| {
json.avatars.get(&id).map(|v| {
v.to_avatar_proto(
Option::None,
json.main_character as u32,
json.march_type as u32,
)
})
})
.collect(),
avatar_path_data_info_list: json
.avatars
.values()
@@ -165,15 +172,16 @@ impl PlayerSession {
// Sync new avatars equip item
self.send(PlayerSyncScNotify {
avatar_sync: Some(AvatarSync {
avatar_list: json
.avatars
.values()
.map(|avatar| {
avatar.to_avatar_proto(
json.lightcones
.iter()
.find(|v| v.equip_avatar == avatar.avatar_id),
)
avatar_list: BASE_AVATAR_IDS
.into_iter()
.filter_map(|avatar_id| {
json.avatars.get(&avatar_id).map(|v| {
v.to_avatar_proto(
json.lightcones.iter().find(|v| v.equip_avatar == avatar_id),
json.main_character as u32,
json.march_type as u32,
)
})
})
.collect(),
avatar_path_data_info_list: json