Added signature weapon switch (EAvatarShowWeaponType) support

This commit is contained in:
traffic95 2025-05-24 15:46:48 +02:00
parent b70c047585
commit 2b275d8034
4 changed files with 62 additions and 14 deletions

View file

@ -13,6 +13,7 @@ pub struct AvatarItem {
pub passive_skill_level: u32, pub passive_skill_level: u32,
pub skill_level_map: HashMap<EAvatarSkillType, u32>, pub skill_level_map: HashMap<EAvatarSkillType, u32>,
pub weapon_uid: u32, pub weapon_uid: u32,
pub show_weapon_type: i32,
pub dressed_equip_map: HashMap<u32, u32>, pub dressed_equip_map: HashMap<u32, u32>,
pub first_get_time: i64, pub first_get_time: i64,
pub taken_rank_up_reward_list: Vec<u32>, pub taken_rank_up_reward_list: Vec<u32>,
@ -48,7 +49,7 @@ impl AvatarItem {
rank: self.rank, rank: self.rank,
unlocked_talent_num: self.unlocked_talent_num, unlocked_talent_num: self.unlocked_talent_num,
cur_weapon_uid: self.weapon_uid, cur_weapon_uid: self.weapon_uid,
show_weapon_type: vivian_proto::AvatarShowWeaponType::ShowWeaponLock.into(), show_weapon_type: self.show_weapon_type,
passive_skill_level: self.passive_skill_level, passive_skill_level: self.passive_skill_level,
skill_type_level: self skill_type_level: self
.skill_level_map .skill_level_map

View file

@ -1461,6 +1461,19 @@ pub struct WeaponUnDressScRsp {
pub retcode: i32, pub retcode: i32,
} }
#[derive(Clone, PartialEq, ::proto_derive::Message, ::proto_derive::NetCmd)] #[derive(Clone, PartialEq, ::proto_derive::Message, ::proto_derive::NetCmd)]
#[cmd_id(9975)]
pub struct AvatarShowWeaponCsReq {
#[prost(uint32, tag = "14", xor = "6358")]
pub avatar_id: u32,
#[prost(enumeration = "AvatarShowWeaponType", tag = "13")]
pub show_weapon_type: i32,
}
#[derive(Clone, PartialEq, ::proto_derive::Message, ::proto_derive::NetCmd)]
#[derive(::proto_derive::NetResponse)]
pub struct AvatarShowWeaponScRsp {
pub retcode: i32,
}
#[derive(Clone, PartialEq, ::proto_derive::Message, ::proto_derive::NetCmd)]
#[cmd_id(9646)] #[cmd_id(9646)]
pub struct AvatarFavoriteCsReq { pub struct AvatarFavoriteCsReq {
#[prost(uint32, tag = "7", xor = "14323")] #[prost(uint32, tag = "7", xor = "14323")]

View file

@ -1,11 +1,7 @@
use vivian_codegen::{handlers, required_state}; use vivian_codegen::{handlers, required_state};
use vivian_logic::item::EItemType; use vivian_logic::item::EItemType;
use vivian_proto::{ use vivian_proto::{
AvatarFavoriteCsReq, AvatarFavoriteScRsp, AvatarLevelUpCsReq, AvatarLevelUpScRsp, AvatarFavoriteCsReq, AvatarFavoriteScRsp, AvatarLevelUpCsReq, AvatarLevelUpScRsp, AvatarShowWeaponCsReq, AvatarShowWeaponScRsp, AvatarSkinDressCsReq, AvatarSkinDressScRsp, AvatarSkinUnDressCsReq, AvatarSkinUnDressScRsp, GetAvatarDataCsReq, GetAvatarDataScRsp, GetAvatarRecommendEquipCsReq, GetAvatarRecommendEquipScRsp, ItemRewardInfo, WeaponDressCsReq, WeaponDressScRsp, WeaponUnDressCsReq, WeaponUnDressScRsp
AvatarSkinDressCsReq, AvatarSkinDressScRsp, AvatarSkinUnDressCsReq, AvatarSkinUnDressScRsp,
GetAvatarDataCsReq, GetAvatarDataScRsp, GetAvatarRecommendEquipCsReq,
GetAvatarRecommendEquipScRsp, ItemRewardInfo, WeaponDressCsReq, WeaponDressScRsp,
WeaponUnDressCsReq, WeaponUnDressScRsp,
}; };
use crate::logic::sync::SyncType; use crate::logic::sync::SyncType;
@ -153,14 +149,14 @@ impl AvatarHandler {
return WeaponDressScRsp { retcode: 1 }; return WeaponDressScRsp { retcode: 1 };
} }
if !context let Some(weapon) = context
.player .player
.item_model .item_model
.weapon_map .weapon_map
.contains_key(&request.weapon_uid) .get(&request.weapon_uid)
{ else {
return WeaponDressScRsp { retcode: 1 }; return WeaponDressScRsp { retcode: 1 };
} };
context context
.player .player
@ -180,13 +176,27 @@ impl AvatarHandler {
.weapon_uid = 0 .weapon_uid = 0
}); });
context let avatar = context
.player .player
.avatar_model .avatar_model
.avatar_map .avatar_map
.get_mut(&request.avatar_id) .get_mut(&request.avatar_id)
.unwrap() .unwrap();
.weapon_uid = request.weapon_uid;
avatar.weapon_uid = request.weapon_uid;
if avatar.show_weapon_type == vivian_proto::AvatarShowWeaponType::ShowWeaponLock.into()
&& context
.resources
.templates
.weapon_template_tb()
.find(|tmpl|
tmpl.item_id() == weapon.id
&& tmpl.avatar_id() == request.avatar_id
).is_some()
{
avatar.show_weapon_type = vivian_proto::AvatarShowWeaponType::ShowWeaponActive.into();
}
WeaponDressScRsp { retcode: 0 } WeaponDressScRsp { retcode: 0 }
} }
@ -208,6 +218,28 @@ impl AvatarHandler {
} }
} }
pub fn on_avatar_show_weapon_cs_req(
context: &mut NetContext<'_>,
request: AvatarShowWeaponCsReq,
) -> AvatarShowWeaponScRsp {
let Some(avatar) = context
.player
.avatar_model
.avatar_map
.get_mut(&request.avatar_id)
else {
return AvatarShowWeaponScRsp { retcode: 1 };
};
if avatar.show_weapon_type == vivian_proto::AvatarShowWeaponType::ShowWeaponLock.into() {
return AvatarShowWeaponScRsp { retcode: 1 };
}
avatar.show_weapon_type = request.show_weapon_type;
AvatarShowWeaponScRsp { retcode: 0 }
}
pub fn on_avatar_favorite_cs_req( pub fn on_avatar_favorite_cs_req(
context: &mut NetContext<'_>, context: &mut NetContext<'_>,
request: AvatarFavoriteCsReq, request: AvatarFavoriteCsReq,

View file

@ -79,6 +79,7 @@ impl AvatarModel {
.map(|(ty, level)| (EAvatarSkillType::try_from(ty).unwrap(), level)) .map(|(ty, level)| (EAvatarSkillType::try_from(ty).unwrap(), level))
.collect(), .collect(),
weapon_uid: avatar.cur_weapon_uid, weapon_uid: avatar.cur_weapon_uid,
show_weapon_type: avatar.show_weapon_type,
dressed_equip_map: avatar.dressed_equip_map, dressed_equip_map: avatar.dressed_equip_map,
first_get_time: avatar.first_get_time, first_get_time: avatar.first_get_time,
taken_rank_up_reward_list: avatar.taken_rank_up_reward_list, taken_rank_up_reward_list: avatar.taken_rank_up_reward_list,
@ -120,6 +121,7 @@ impl AvatarModel {
.zip([0].into_iter().cycle()) .zip([0].into_iter().cycle())
.collect(), .collect(),
weapon_uid: 0, weapon_uid: 0,
show_weapon_type: vivian_proto::AvatarShowWeaponType::ShowWeaponLock.into(),
dressed_equip_map: HashMap::new(), dressed_equip_map: HashMap::new(),
first_get_time: time_util::unix_timestamp_seconds(), first_get_time: time_util::unix_timestamp_seconds(),
taken_rank_up_reward_list: Vec::new(), taken_rank_up_reward_list: Vec::new(),
@ -155,12 +157,12 @@ impl Saveable for AvatarModel {
.map(|(&ty, &level)| (ty.into(), level)) .map(|(&ty, &level)| (ty.into(), level))
.collect(), .collect(),
cur_weapon_uid: avatar.weapon_uid, cur_weapon_uid: avatar.weapon_uid,
show_weapon_type: avatar.show_weapon_type,
dressed_equip_map: avatar.dressed_equip_map.clone(), dressed_equip_map: avatar.dressed_equip_map.clone(),
first_get_time: avatar.first_get_time, first_get_time: avatar.first_get_time,
taken_rank_up_reward_list: avatar.taken_rank_up_reward_list.clone(), taken_rank_up_reward_list: avatar.taken_rank_up_reward_list.clone(),
avatar_skin_id: avatar.avatar_skin_id, avatar_skin_id: avatar.avatar_skin_id,
is_favorite: avatar.is_favorite, is_favorite: avatar.is_favorite,
show_weapon_type: 0,
}) })
.collect(), .collect(),
}); });