AcheronSR/gameserver/src/net/handlers/lineup.rs
2024-04-04 14:16:18 -04:00

153 lines
3.8 KiB
Rust

use super::*;
pub async fn on_get_all_lineup_data_cs_req(
session: &PlayerSession,
_body: &GetAllLineupDataCsReq,
) -> Result<()> {
let player_info = session.player_info();
session
.send(
CMD_GET_ALL_LINEUP_DATA_SC_RSP,
GetAllLineupDataScRsp {
retcode: 0,
cur_index: 0,
lineup_list: vec![player_info.lineup.clone()],
},
)
.await
}
pub async fn on_get_cur_lineup_data_cs_req(
session: &PlayerSession,
_body: &GetCurLineupDataCsReq,
) -> Result<()> {
let player_info = session.player_info();
session
.send(
CMD_GET_CUR_LINEUP_DATA_SC_RSP,
GetCurLineupDataScRsp {
retcode: 0,
lineup: Some(player_info.lineup.clone()),
},
)
.await
}
pub async fn on_change_lineup_leader_cs_req(
session: &PlayerSession,
body: &ChangeLineupLeaderCsReq,
) -> Result<()> {
let mut player_info = session.player_info_mut();
player_info.lineup.leader_slot = body.slot;
session
.send(
CMD_CHANGE_LINEUP_LEADER_SC_RSP,
ChangeLineupLeaderScRsp {
slot: body.slot,
retcode: 0,
},
)
.await
}
pub async fn on_join_lineup_cs_req(session: &PlayerSession, body: &JoinLineupCsReq) -> Result<()> {
let mut player_info = session.player_info_mut();
if !(0..4).contains(&body.slot) {
return session
.send(
CMD_JOIN_LINEUP_CS_REQ,
JoinLineupScRsp {
retcode: Retcode::RetLineupInvalidMemberPos as u32,
},
)
.await;
}
if player_info
.lineup
.avatar_list
.iter()
.any(|avatar| avatar.slot == body.slot)
{
return session
.send(
CMD_JOIN_LINEUP_CS_REQ,
JoinLineupScRsp {
retcode: Retcode::RetLineupAvatarAlreadyInit as u32,
},
)
.await;
}
player_info
.lineup
.avatar_list
.push(lineup_avatar(body.base_avatar_id, body.slot));
player_info.sync_lineup(session).await?;
session
.send(CMD_JOIN_LINEUP_SC_RSP, JoinLineupScRsp::default())
.await
}
pub async fn on_replace_lineup_cs_req(
session: &PlayerSession,
body: &ReplaceLineupCsReq,
) -> Result<()> {
let mut player_info = session.player_info_mut();
player_info.lineup.avatar_list.clear();
for slot_info in &body.lineup_slots {
player_info
.lineup
.avatar_list
.push(lineup_avatar(slot_info.id, slot_info.slot));
}
player_info.lineup.leader_slot = body.leader_slot;
player_info.sync_lineup(session).await?;
session
.send(CMD_REPLACE_LINEUP_SC_RSP, ReplaceLineupScRsp::default())
.await
}
pub async fn on_quit_lineup_cs_req(session: &PlayerSession, body: &QuitLineupCsReq) -> Result<()> {
let mut player_info = session.player_info_mut();
player_info
.lineup
.avatar_list
.retain(|avatar| avatar.id != body.base_avatar_id);
player_info.sync_lineup(session).await?;
session
.send(
CMD_QUIT_LINEUP_SC_RSP,
QuitLineupScRsp {
plane_id: body.plane_id,
is_mainline: !body.is_virtual,
is_virtual: body.is_virtual,
base_avatar_id: body.base_avatar_id,
retcode: 0,
},
)
.await
}
#[must_use]
const fn lineup_avatar(id: u32, slot: u32) -> LineupAvatar {
LineupAvatar {
id,
slot,
hp: 10000,
sp: Some(AmountInfo {
cur_amount: 10000,
max_amount: 10000,
}),
satiety: 100,
avatar_type: 3,
}
}