1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-04-22 23:27: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::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 {

View file

@ -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,
}

View file

@ -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)]