JaneDoe-ZS/nap_gameserver/src/handlers/item.rs
xeon 99123a15ef newtype fun
use newtypes for template ids, pros:
1) enforces id validation
2) ease of use (helper method for getting template struct right away)
2024-07-25 01:24:48 +03:00

68 lines
1.7 KiB
Rust

use data::tables::AvatarBaseID;
use super::*;
pub async fn on_get_item_data(
_session: &NetSession,
player: &mut Player,
_req: GetItemDataCsReq,
) -> NetResult<GetItemDataScRsp> {
let item_model = &player.item_model;
Ok(GetItemDataScRsp {
retcode: Retcode::RetSucc.into(),
resource_list: item_model.resources.iter().map(|i| i.to_client()).collect(),
weapon_list: item_model.weapons.iter().map(|w| w.to_client()).collect(),
..Default::default()
})
}
pub async fn on_weapon_dress(
session: &NetSession,
player: &mut Player,
req: WeaponDressCsReq,
) -> NetResult<WeaponDressScRsp> {
player.dress_weapon(
AvatarBaseID::new(req.avatar_id).ok_or(Retcode::RetFail)?,
req.weapon_uid.into(),
)?;
session
.notify(PlayerSyncScNotify {
avatar: Some(player.role_model.avatar_sync()),
item_sync: Some(player.item_model.item_sync()),
..Default::default()
})
.await?;
Ok(WeaponDressScRsp {
retcode: Retcode::RetSucc.into(),
})
}
pub async fn on_weapon_un_dress(
session: &NetSession,
player: &mut Player,
req: WeaponUnDressCsReq,
) -> NetResult<WeaponUnDressScRsp> {
let avatar_id = AvatarBaseID::new(req.avatar_id).ok_or(Retcode::RetFail)?;
let avatar = player
.role_model
.avatar_list
.iter_mut()
.find(|a| a.template_id == avatar_id)
.ok_or(Retcode::RetFail)?;
avatar.weapon_uid = None;
session
.notify(PlayerSyncScNotify {
avatar: Some(player.role_model.avatar_sync()),
..Default::default()
})
.await?;
Ok(WeaponUnDressScRsp {
retcode: Retcode::RetSucc.into(),
})
}