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 skill_level_map: HashMap<EAvatarSkillType, u32>,
pub weapon_uid: u32,
pub show_weapon_type: i32,
pub dressed_equip_map: HashMap<u32, u32>,
pub first_get_time: i64,
pub taken_rank_up_reward_list: Vec<u32>,
@ -48,7 +49,7 @@ impl AvatarItem {
rank: self.rank,
unlocked_talent_num: self.unlocked_talent_num,
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,
skill_type_level: self
.skill_level_map

View file

@ -1461,6 +1461,19 @@ pub struct WeaponUnDressScRsp {
pub retcode: i32,
}
#[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)]
pub struct AvatarFavoriteCsReq {
#[prost(uint32, tag = "7", xor = "14323")]

View file

@ -1,11 +1,7 @@
use vivian_codegen::{handlers, required_state};
use vivian_logic::item::EItemType;
use vivian_proto::{
AvatarFavoriteCsReq, AvatarFavoriteScRsp, AvatarLevelUpCsReq, AvatarLevelUpScRsp,
AvatarSkinDressCsReq, AvatarSkinDressScRsp, AvatarSkinUnDressCsReq, AvatarSkinUnDressScRsp,
GetAvatarDataCsReq, GetAvatarDataScRsp, GetAvatarRecommendEquipCsReq,
GetAvatarRecommendEquipScRsp, ItemRewardInfo, WeaponDressCsReq, WeaponDressScRsp,
WeaponUnDressCsReq, WeaponUnDressScRsp,
AvatarFavoriteCsReq, AvatarFavoriteScRsp, AvatarLevelUpCsReq, AvatarLevelUpScRsp, AvatarShowWeaponCsReq, AvatarShowWeaponScRsp, AvatarSkinDressCsReq, AvatarSkinDressScRsp, AvatarSkinUnDressCsReq, AvatarSkinUnDressScRsp, GetAvatarDataCsReq, GetAvatarDataScRsp, GetAvatarRecommendEquipCsReq, GetAvatarRecommendEquipScRsp, ItemRewardInfo, WeaponDressCsReq, WeaponDressScRsp, WeaponUnDressCsReq, WeaponUnDressScRsp
};
use crate::logic::sync::SyncType;
@ -153,14 +149,14 @@ impl AvatarHandler {
return WeaponDressScRsp { retcode: 1 };
}
if !context
let Some(weapon) = context
.player
.item_model
.weapon_map
.contains_key(&request.weapon_uid)
{
.get(&request.weapon_uid)
else {
return WeaponDressScRsp { retcode: 1 };
}
};
context
.player
@ -180,13 +176,27 @@ impl AvatarHandler {
.weapon_uid = 0
});
context
let avatar = context
.player
.avatar_model
.avatar_map
.get_mut(&request.avatar_id)
.unwrap()
.weapon_uid = request.weapon_uid;
.unwrap();
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 }
}
@ -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(
context: &mut NetContext<'_>,
request: AvatarFavoriteCsReq,

View file

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