From dc8d8638f6b41c647e5514f6eef75353a71a28e9 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 16 Mar 2025 18:22:15 -0400 Subject: [PATCH] Move LobbyCharacterAction into it's own struct --- src/bin/kawari-lobby.rs | 54 +++++++++++++++---------------- src/lobby/ipc/character_action.rs | 27 +++++++++++++++- src/lobby/ipc/mod.rs | 22 ++----------- 3 files changed, 55 insertions(+), 48 deletions(-) diff --git a/src/bin/kawari-lobby.rs b/src/bin/kawari-lobby.rs index 5b09b5b..8e6f2cf 100644 --- a/src/bin/kawari-lobby.rs +++ b/src/bin/kawari-lobby.rs @@ -2,7 +2,7 @@ use kawari::CONTENT_ID; use kawari::lobby::chara_make::CharaMake; use kawari::lobby::connection::LobbyConnection; use kawari::lobby::ipc::{ - CharacterDetails, ClientLobbyIpcData, LobbyCharacterAction, ServerLobbyIpcData, + CharacterDetails, ClientLobbyIpcData, LobbyCharacterActionKind, ServerLobbyIpcData, ServerLobbyIpcSegment, ServerLobbyIpcType, }; use kawari::oodle::FFXIVOodle; @@ -70,17 +70,12 @@ async fn main() { connection.send_lobby_info(*sequence).await; } - ClientLobbyIpcData::LobbyCharacterAction { - sequence, - action, - name, - json, - .. - } => { - match action { - LobbyCharacterAction::ReserveName => { + ClientLobbyIpcData::LobbyCharacterAction(character_action) => { + match &character_action.action { + LobbyCharacterActionKind::ReserveName => { tracing::info!( - "Player is requesting {name} as a new character name!" + "Player is requesting {} as a new character name!", + character_action.name ); // reject @@ -121,11 +116,13 @@ async fn main() { server_id: 0, timestamp: 0, data: ServerLobbyIpcData::CharacterCreated { - sequence: *sequence + 1, + sequence: character_action.sequence + 1, unk: 0x00010101, details: CharacterDetails { content_id: CONTENT_ID, - character_name: name.clone(), + character_name: character_action + .name + .clone(), origin_server_name: "KAWARI" .to_string(), current_server_name: "KAWARI" @@ -146,10 +143,11 @@ async fn main() { .await; } } - LobbyCharacterAction::Create => { + LobbyCharacterActionKind::Create => { tracing::info!("Player is creating a new character!"); - let chara_make = CharaMake::from_json(json); + let chara_make = + CharaMake::from_json(&character_action.json); println!("charamake: {:#?}", chara_make); // a slightly different character created packet now @@ -161,12 +159,14 @@ async fn main() { server_id: 0, timestamp: 0, data: ServerLobbyIpcData::CharacterCreated { - sequence: *sequence + 1, + sequence: character_action.sequence + 1, unk: 0x00020101, details: CharacterDetails { id: 0x07369f3a, // notice that we give them an id now content_id: CONTENT_ID, - character_name: name.clone(), + character_name: character_action + .name + .clone(), origin_server_name: "KAWARI" .to_string(), current_server_name: "KAWARI" @@ -187,16 +187,16 @@ async fn main() { .await; } } - LobbyCharacterAction::Rename => todo!(), - LobbyCharacterAction::Delete => todo!(), - LobbyCharacterAction::Move => todo!(), - LobbyCharacterAction::RemakeRetainer => todo!(), - LobbyCharacterAction::RemakeChara => todo!(), - LobbyCharacterAction::SettingsUploadBegin => todo!(), - LobbyCharacterAction::SettingsUpload => todo!(), - LobbyCharacterAction::WorldVisit => todo!(), - LobbyCharacterAction::DataCenterToken => todo!(), - LobbyCharacterAction::Request => todo!(), + LobbyCharacterActionKind::Rename => todo!(), + LobbyCharacterActionKind::Delete => todo!(), + LobbyCharacterActionKind::Move => todo!(), + LobbyCharacterActionKind::RemakeRetainer => todo!(), + LobbyCharacterActionKind::RemakeChara => todo!(), + LobbyCharacterActionKind::SettingsUploadBegin => todo!(), + LobbyCharacterActionKind::SettingsUpload => todo!(), + LobbyCharacterActionKind::WorldVisit => todo!(), + LobbyCharacterActionKind::DataCenterToken => todo!(), + LobbyCharacterActionKind::Request => todo!(), } } ClientLobbyIpcData::RequestEnterWorld { diff --git a/src/lobby/ipc/character_action.rs b/src/lobby/ipc/character_action.rs index 9b2e87e..c4ffacb 100644 --- a/src/lobby/ipc/character_action.rs +++ b/src/lobby/ipc/character_action.rs @@ -1,8 +1,12 @@ use binrw::binrw; +use crate::CHAR_NAME_MAX_LENGTH; + +use super::{read_string, write_string}; + #[binrw] #[derive(Clone, PartialEq, Debug)] -pub enum LobbyCharacterAction { +pub enum LobbyCharacterActionKind { #[brw(magic = 0x1u8)] ReserveName, #[brw(magic = 0x2u8)] @@ -28,3 +32,24 @@ pub enum LobbyCharacterAction { #[brw(magic = 0x15u8)] Request, } + +#[binrw] +#[derive(Clone, PartialEq, Debug)] +pub struct LobbyCharacterAction { + pub sequence: u64, + pub character_id: u64, + #[br(pad_before = 8)] + pub character_index: u8, + pub action: LobbyCharacterActionKind, + pub world_id: u16, + #[bw(pad_size_to = CHAR_NAME_MAX_LENGTH)] + #[br(count = CHAR_NAME_MAX_LENGTH)] + #[br(map = read_string)] + #[bw(map = write_string)] + pub name: String, + #[bw(pad_size_to = 436)] + #[br(count = 436)] + #[br(map = read_string)] + #[bw(map = write_string)] + pub json: String, +} diff --git a/src/lobby/ipc/mod.rs b/src/lobby/ipc/mod.rs index 4ee869d..c6d74c5 100644 --- a/src/lobby/ipc/mod.rs +++ b/src/lobby/ipc/mod.rs @@ -1,7 +1,7 @@ use binrw::binrw; mod character_action; -pub use character_action::LobbyCharacterAction; +pub use character_action::{LobbyCharacterAction, LobbyCharacterActionKind}; mod character_list; pub use character_list::{CharacterDetails, LobbyCharacterList}; @@ -15,7 +15,6 @@ mod service_account_list; pub use service_account_list::{LobbyServiceAccountList, ServiceAccount}; use crate::{ - CHAR_NAME_MAX_LENGTH, common::{read_string, write_string}, packet::{IpcSegment, IpcSegmentTrait}, }; @@ -146,24 +145,7 @@ pub enum ClientLobbyIpcData { // TODO: what is in here? }, #[br(pre_assert(*magic == ClientLobbyIpcType::LobbyCharacterAction))] - LobbyCharacterAction { - sequence: u64, - character_id: u64, - #[br(pad_before = 8)] - character_index: u8, - action: LobbyCharacterAction, - world_id: u16, - #[bw(pad_size_to = CHAR_NAME_MAX_LENGTH)] - #[br(count = CHAR_NAME_MAX_LENGTH)] - #[br(map = read_string)] - #[bw(map = write_string)] - name: String, - #[bw(pad_size_to = 436)] - #[br(count = 436)] - #[br(map = read_string)] - #[bw(map = write_string)] - json: String, - }, + LobbyCharacterAction(LobbyCharacterAction), #[br(pre_assert(*magic == ClientLobbyIpcType::RequestEnterWorld))] RequestEnterWorld { #[brw(pad_before = 16)]