1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-04-23 07:37:46 +00:00

Move LobbyCharacterAction into it's own struct

This commit is contained in:
Joshua Goins 2025-03-16 18:22:15 -04:00
parent ff9bcb255d
commit dc8d8638f6
3 changed files with 55 additions and 48 deletions

View file

@ -2,7 +2,7 @@ use kawari::CONTENT_ID;
use kawari::lobby::chara_make::CharaMake; use kawari::lobby::chara_make::CharaMake;
use kawari::lobby::connection::LobbyConnection; use kawari::lobby::connection::LobbyConnection;
use kawari::lobby::ipc::{ use kawari::lobby::ipc::{
CharacterDetails, ClientLobbyIpcData, LobbyCharacterAction, ServerLobbyIpcData, CharacterDetails, ClientLobbyIpcData, LobbyCharacterActionKind, ServerLobbyIpcData,
ServerLobbyIpcSegment, ServerLobbyIpcType, ServerLobbyIpcSegment, ServerLobbyIpcType,
}; };
use kawari::oodle::FFXIVOodle; use kawari::oodle::FFXIVOodle;
@ -70,17 +70,12 @@ async fn main() {
connection.send_lobby_info(*sequence).await; connection.send_lobby_info(*sequence).await;
} }
ClientLobbyIpcData::LobbyCharacterAction { ClientLobbyIpcData::LobbyCharacterAction(character_action) => {
sequence, match &character_action.action {
action, LobbyCharacterActionKind::ReserveName => {
name,
json,
..
} => {
match action {
LobbyCharacterAction::ReserveName => {
tracing::info!( tracing::info!(
"Player is requesting {name} as a new character name!" "Player is requesting {} as a new character name!",
character_action.name
); );
// reject // reject
@ -121,11 +116,13 @@ async fn main() {
server_id: 0, server_id: 0,
timestamp: 0, timestamp: 0,
data: ServerLobbyIpcData::CharacterCreated { data: ServerLobbyIpcData::CharacterCreated {
sequence: *sequence + 1, sequence: character_action.sequence + 1,
unk: 0x00010101, unk: 0x00010101,
details: CharacterDetails { details: CharacterDetails {
content_id: CONTENT_ID, content_id: CONTENT_ID,
character_name: name.clone(), character_name: character_action
.name
.clone(),
origin_server_name: "KAWARI" origin_server_name: "KAWARI"
.to_string(), .to_string(),
current_server_name: "KAWARI" current_server_name: "KAWARI"
@ -146,10 +143,11 @@ async fn main() {
.await; .await;
} }
} }
LobbyCharacterAction::Create => { LobbyCharacterActionKind::Create => {
tracing::info!("Player is creating a new character!"); 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); println!("charamake: {:#?}", chara_make);
// a slightly different character created packet now // a slightly different character created packet now
@ -161,12 +159,14 @@ async fn main() {
server_id: 0, server_id: 0,
timestamp: 0, timestamp: 0,
data: ServerLobbyIpcData::CharacterCreated { data: ServerLobbyIpcData::CharacterCreated {
sequence: *sequence + 1, sequence: character_action.sequence + 1,
unk: 0x00020101, unk: 0x00020101,
details: CharacterDetails { details: CharacterDetails {
id: 0x07369f3a, // notice that we give them an id now id: 0x07369f3a, // notice that we give them an id now
content_id: CONTENT_ID, content_id: CONTENT_ID,
character_name: name.clone(), character_name: character_action
.name
.clone(),
origin_server_name: "KAWARI" origin_server_name: "KAWARI"
.to_string(), .to_string(),
current_server_name: "KAWARI" current_server_name: "KAWARI"
@ -187,16 +187,16 @@ async fn main() {
.await; .await;
} }
} }
LobbyCharacterAction::Rename => todo!(), LobbyCharacterActionKind::Rename => todo!(),
LobbyCharacterAction::Delete => todo!(), LobbyCharacterActionKind::Delete => todo!(),
LobbyCharacterAction::Move => todo!(), LobbyCharacterActionKind::Move => todo!(),
LobbyCharacterAction::RemakeRetainer => todo!(), LobbyCharacterActionKind::RemakeRetainer => todo!(),
LobbyCharacterAction::RemakeChara => todo!(), LobbyCharacterActionKind::RemakeChara => todo!(),
LobbyCharacterAction::SettingsUploadBegin => todo!(), LobbyCharacterActionKind::SettingsUploadBegin => todo!(),
LobbyCharacterAction::SettingsUpload => todo!(), LobbyCharacterActionKind::SettingsUpload => todo!(),
LobbyCharacterAction::WorldVisit => todo!(), LobbyCharacterActionKind::WorldVisit => todo!(),
LobbyCharacterAction::DataCenterToken => todo!(), LobbyCharacterActionKind::DataCenterToken => todo!(),
LobbyCharacterAction::Request => todo!(), LobbyCharacterActionKind::Request => todo!(),
} }
} }
ClientLobbyIpcData::RequestEnterWorld { ClientLobbyIpcData::RequestEnterWorld {

View file

@ -1,8 +1,12 @@
use binrw::binrw; use binrw::binrw;
use crate::CHAR_NAME_MAX_LENGTH;
use super::{read_string, write_string};
#[binrw] #[binrw]
#[derive(Clone, PartialEq, Debug)] #[derive(Clone, PartialEq, Debug)]
pub enum LobbyCharacterAction { pub enum LobbyCharacterActionKind {
#[brw(magic = 0x1u8)] #[brw(magic = 0x1u8)]
ReserveName, ReserveName,
#[brw(magic = 0x2u8)] #[brw(magic = 0x2u8)]
@ -28,3 +32,24 @@ pub enum LobbyCharacterAction {
#[brw(magic = 0x15u8)] #[brw(magic = 0x15u8)]
Request, 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,
}

View file

@ -1,7 +1,7 @@
use binrw::binrw; use binrw::binrw;
mod character_action; mod character_action;
pub use character_action::LobbyCharacterAction; pub use character_action::{LobbyCharacterAction, LobbyCharacterActionKind};
mod character_list; mod character_list;
pub use character_list::{CharacterDetails, LobbyCharacterList}; pub use character_list::{CharacterDetails, LobbyCharacterList};
@ -15,7 +15,6 @@ mod service_account_list;
pub use service_account_list::{LobbyServiceAccountList, ServiceAccount}; pub use service_account_list::{LobbyServiceAccountList, ServiceAccount};
use crate::{ use crate::{
CHAR_NAME_MAX_LENGTH,
common::{read_string, write_string}, common::{read_string, write_string},
packet::{IpcSegment, IpcSegmentTrait}, packet::{IpcSegment, IpcSegmentTrait},
}; };
@ -146,24 +145,7 @@ pub enum ClientLobbyIpcData {
// TODO: what is in here? // TODO: what is in here?
}, },
#[br(pre_assert(*magic == ClientLobbyIpcType::LobbyCharacterAction))] #[br(pre_assert(*magic == ClientLobbyIpcType::LobbyCharacterAction))]
LobbyCharacterAction { 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,
},
#[br(pre_assert(*magic == ClientLobbyIpcType::RequestEnterWorld))] #[br(pre_assert(*magic == ClientLobbyIpcType::RequestEnterWorld))]
RequestEnterWorld { RequestEnterWorld {
#[brw(pad_before = 16)] #[brw(pad_before = 16)]