mirror of
https://github.com/redstrate/Kawari.git
synced 2025-04-27 00:47:45 +00:00
Move out most of the large IPC structures
This commit is contained in:
parent
aa6e818bfb
commit
29954be1a6
10 changed files with 327 additions and 410 deletions
|
@ -1,11 +1,14 @@
|
||||||
use std::time::{SystemTime, UNIX_EPOCH};
|
use std::time::{SystemTime, UNIX_EPOCH};
|
||||||
|
|
||||||
use kawari::ipc::{ActorControlType, IPCOpCode, IPCSegment, IPCStructData};
|
use kawari::ipc::{IPCOpCode, IPCSegment, IPCStructData};
|
||||||
use kawari::oodle::FFXIVOodle;
|
use kawari::oodle::FFXIVOodle;
|
||||||
use kawari::packet::{
|
use kawari::packet::{
|
||||||
CompressionType, PacketSegment, SegmentType, State, parse_packet, send_keep_alive, send_packet,
|
CompressionType, PacketSegment, SegmentType, State, parse_packet, send_keep_alive, send_packet,
|
||||||
};
|
};
|
||||||
use kawari::world::{PlayerSpawnData, Position};
|
use kawari::world::{
|
||||||
|
ActorControlSelf, ActorControlType, InitZone, PlayerSetup, PlayerSpawn, PlayerStats,
|
||||||
|
UpdateClassInfo,
|
||||||
|
};
|
||||||
use kawari::{CONTENT_ID, WORLD_ID, ZONE_ID};
|
use kawari::{CONTENT_ID, WORLD_ID, ZONE_ID};
|
||||||
use tokio::io::AsyncReadExt;
|
use tokio::io::AsyncReadExt;
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
|
@ -194,15 +197,18 @@ async fn main() {
|
||||||
op_code: IPCOpCode::ActorControlSelf,
|
op_code: IPCOpCode::ActorControlSelf,
|
||||||
server_id: 0,
|
server_id: 0,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
data: IPCStructData::ActorControlSelf {
|
data: IPCStructData::ActorControlSelf(
|
||||||
category: ActorControlType::SetCharaGearParamUI,
|
ActorControlSelf {
|
||||||
param1: 1,
|
category:
|
||||||
param2: 1,
|
ActorControlType::SetCharaGearParamUI,
|
||||||
param3: 0,
|
param1: 1,
|
||||||
param4: 0,
|
param2: 1,
|
||||||
param5: 0,
|
param3: 0,
|
||||||
param6: 0,
|
param4: 0,
|
||||||
},
|
param5: 0,
|
||||||
|
param6: 0,
|
||||||
|
},
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
|
@ -227,39 +233,12 @@ async fn main() {
|
||||||
op_code: IPCOpCode::PlayerStats,
|
op_code: IPCOpCode::PlayerStats,
|
||||||
server_id: 0,
|
server_id: 0,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
data: IPCStructData::PlayerStats {
|
data: IPCStructData::PlayerStats(PlayerStats {
|
||||||
strength: 1,
|
strength: 1,
|
||||||
dexterity: 0,
|
|
||||||
vitality: 0,
|
|
||||||
intelligence: 0,
|
|
||||||
mind: 0,
|
|
||||||
piety: 0,
|
|
||||||
hp: 100,
|
hp: 100,
|
||||||
mp: 100,
|
mp: 100,
|
||||||
tp: 0,
|
..Default::default()
|
||||||
gp: 0,
|
}),
|
||||||
cp: 0,
|
|
||||||
delay: 0,
|
|
||||||
tenacity: 0,
|
|
||||||
attack_power: 0,
|
|
||||||
defense: 0,
|
|
||||||
direct_hit_rate: 0,
|
|
||||||
evasion: 0,
|
|
||||||
magic_defense: 0,
|
|
||||||
critical_hit: 0,
|
|
||||||
attack_magic_potency: 0,
|
|
||||||
healing_magic_potency: 0,
|
|
||||||
elemental_bonus: 0,
|
|
||||||
determination: 0,
|
|
||||||
skill_speed: 0,
|
|
||||||
spell_speed: 0,
|
|
||||||
haste: 0,
|
|
||||||
craftmanship: 0,
|
|
||||||
control: 0,
|
|
||||||
gathering: 0,
|
|
||||||
perception: 0,
|
|
||||||
unk1: [0; 26],
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
|
@ -284,127 +263,13 @@ async fn main() {
|
||||||
op_code: IPCOpCode::PlayerSetup,
|
op_code: IPCOpCode::PlayerSetup,
|
||||||
server_id: 0,
|
server_id: 0,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
data: IPCStructData::PlayerSetup {
|
data: IPCStructData::PlayerSetup(PlayerSetup {
|
||||||
content_id: CONTENT_ID,
|
content_id: CONTENT_ID,
|
||||||
crest: 0,
|
|
||||||
unknown10: 0,
|
|
||||||
char_id: 0,
|
|
||||||
rested_exp: 0,
|
|
||||||
companion_current_exp: 0,
|
|
||||||
unknown1c: 0,
|
|
||||||
fish_caught: 0,
|
|
||||||
use_bait_catalog_id: 0,
|
|
||||||
unknown28: 0,
|
|
||||||
unknown_pvp2c: 0,
|
|
||||||
unknown2e: 0,
|
|
||||||
pvp_frontline_overall_campaigns: 0,
|
|
||||||
unknown_timestamp34: 0,
|
|
||||||
unknown_timestamp38: 0,
|
|
||||||
unknown3c: 0,
|
|
||||||
unknown40: 0,
|
|
||||||
unknown44: 0,
|
|
||||||
companion_time_passed: 0.0,
|
|
||||||
unknown4c: 0,
|
|
||||||
unknown50: 0,
|
|
||||||
unknown_pvp52: [0; 4],
|
|
||||||
pvp_series_exp: 0,
|
|
||||||
player_commendations: 0,
|
|
||||||
unknown64: [0; 8],
|
|
||||||
pvp_rival_wings_total_matches: 0,
|
|
||||||
pvp_rival_wings_total_victories: 0,
|
|
||||||
pvp_rival_wings_weekly_matches: 0,
|
|
||||||
pvp_rival_wings_weekly_victories: 0,
|
|
||||||
max_level: 0,
|
|
||||||
expansion: 0,
|
|
||||||
unknown76: 0,
|
|
||||||
unknown77: 0,
|
|
||||||
unknown78: 0,
|
|
||||||
race: 0,
|
|
||||||
tribe: 0,
|
|
||||||
gender: 0,
|
|
||||||
current_job: 0,
|
|
||||||
current_class: 0,
|
|
||||||
deity: 0,
|
|
||||||
nameday_month: 0,
|
|
||||||
nameday_day: 0,
|
|
||||||
city_state: 0,
|
|
||||||
homepoint: 0,
|
|
||||||
unknown8d: [0; 3],
|
|
||||||
companion_rank: 0,
|
|
||||||
companion_stars: 0,
|
|
||||||
companion_sp: 0,
|
|
||||||
companion_unk93: 0,
|
|
||||||
companion_color: 0,
|
|
||||||
companion_fav_feed: 0,
|
|
||||||
fav_aetheryte_count: 0,
|
|
||||||
unknown97: [0; 5],
|
|
||||||
sightseeing21_to_80_unlock: 0,
|
|
||||||
sightseeing_heavensward_unlock: 0,
|
|
||||||
unknown9e: [0; 26],
|
|
||||||
exp: [10000; 32],
|
exp: [10000; 32],
|
||||||
pvp_total_exp: 0,
|
|
||||||
unknown_pvp124: 0,
|
|
||||||
pvp_exp: 0,
|
|
||||||
pvp_frontline_overall_ranks: [0; 3],
|
|
||||||
unknown138: 0,
|
|
||||||
levels: [100; 32],
|
levels: [100; 32],
|
||||||
unknown194: [0; 218],
|
|
||||||
companion_name: [0; 21],
|
|
||||||
companion_def_rank: 0,
|
|
||||||
companion_att_rank: 0,
|
|
||||||
companion_heal_rank: 0,
|
|
||||||
mount_guide_mask: [0; 33],
|
|
||||||
ornament_mask: [0; 4],
|
|
||||||
unknown281: [0; 23],
|
|
||||||
name: "KAWARI".to_string(),
|
name: "KAWARI".to_string(),
|
||||||
unknown293: [0; 16],
|
..Default::default()
|
||||||
unknown2a3: 0,
|
}),
|
||||||
unlock_bitmask: [0; 64],
|
|
||||||
aetheryte: [0; 26],
|
|
||||||
favorite_aetheryte_ids: [0; 4],
|
|
||||||
free_aetheryte_id: 0,
|
|
||||||
ps_plus_free_aetheryte_id: 0,
|
|
||||||
discovery: [0; 480],
|
|
||||||
howto: [0; 36],
|
|
||||||
unknown554: [0; 4],
|
|
||||||
minions: [0; 60],
|
|
||||||
chocobo_taxi_mask: [0; 12],
|
|
||||||
watched_cutscenes: [0; 159],
|
|
||||||
companion_barding_mask: [0; 12],
|
|
||||||
companion_equipped_head: 0,
|
|
||||||
companion_equipped_body: 0,
|
|
||||||
companion_equipped_legs: 0,
|
|
||||||
unknown_mask: [0; 287],
|
|
||||||
pose: [0; 7],
|
|
||||||
unknown6df: [0; 3],
|
|
||||||
challenge_log_complete: [0; 13],
|
|
||||||
secret_recipe_book_mask: [0; 12],
|
|
||||||
unknown_mask6f7: [0; 29],
|
|
||||||
relic_completion: [0; 12],
|
|
||||||
sightseeing_mask: [0; 37],
|
|
||||||
hunting_mark_mask: [0; 102],
|
|
||||||
triple_triad_cards: [0; 45],
|
|
||||||
unknown895: 0,
|
|
||||||
unknown7d7: [0; 15],
|
|
||||||
unknown7d8: 0,
|
|
||||||
unknown7e6: [0; 49],
|
|
||||||
regional_folklore_mask: [0; 6],
|
|
||||||
orchestrion_mask: [0; 87],
|
|
||||||
hall_of_novice_completion: [0; 3],
|
|
||||||
anima_completion: [0; 11],
|
|
||||||
unknown85e: [0; 41],
|
|
||||||
unlocked_raids: [0; 28],
|
|
||||||
unlocked_dungeons: [0; 18],
|
|
||||||
unlocked_guildhests: [0; 10],
|
|
||||||
unlocked_trials: [0; 12],
|
|
||||||
unlocked_pvp: [0; 5],
|
|
||||||
cleared_raids: [0; 28],
|
|
||||||
cleared_dungeons: [0; 18],
|
|
||||||
cleared_guildhests: [0; 10],
|
|
||||||
cleared_trials: [0; 12],
|
|
||||||
cleared_pvp: [0; 5],
|
|
||||||
unknown948: [0; 15],
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
|
@ -429,14 +294,15 @@ async fn main() {
|
||||||
op_code: IPCOpCode::UpdateClassInfo,
|
op_code: IPCOpCode::UpdateClassInfo,
|
||||||
server_id: 69, // lol
|
server_id: 69, // lol
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
data: IPCStructData::UpdateClassInfo {
|
data: IPCStructData::UpdateClassInfo(
|
||||||
class_id: 35,
|
UpdateClassInfo {
|
||||||
unknown: 1,
|
class_id: 35,
|
||||||
is_specialist: 0,
|
unknown: 1,
|
||||||
synced_level: 90,
|
synced_level: 90,
|
||||||
class_level: 90,
|
class_level: 90,
|
||||||
role_actions: [0; 10],
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
|
@ -461,29 +327,11 @@ async fn main() {
|
||||||
op_code: IPCOpCode::InitZone,
|
op_code: IPCOpCode::InitZone,
|
||||||
server_id: 0,
|
server_id: 0,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
data: IPCStructData::InitZone {
|
data: IPCStructData::InitZone(InitZone {
|
||||||
server_id: WORLD_ID,
|
server_id: WORLD_ID,
|
||||||
zone_id: ZONE_ID,
|
zone_id: ZONE_ID,
|
||||||
zone_index: 0,
|
..Default::default()
|
||||||
content_finder_condition_id: 0,
|
}),
|
||||||
layer_set_id: 0,
|
|
||||||
layout_id: 0,
|
|
||||||
weather_id: 1,
|
|
||||||
unk_bitmask1: 0x10,
|
|
||||||
unk_bitmask2: 0,
|
|
||||||
unk1: 0,
|
|
||||||
unk2: 0,
|
|
||||||
festival_id: 0,
|
|
||||||
additional_festival_id: 0,
|
|
||||||
unk3: 0,
|
|
||||||
unk4: 0,
|
|
||||||
unk5: 0,
|
|
||||||
unk6: [0; 4],
|
|
||||||
unk7: [0; 3],
|
|
||||||
position: Position::default(),
|
|
||||||
unk8: [0; 4],
|
|
||||||
unk9: 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
|
@ -514,7 +362,7 @@ async fn main() {
|
||||||
server_id: 0,
|
server_id: 0,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
data: IPCStructData::PlayerSpawn(
|
data: IPCStructData::PlayerSpawn(
|
||||||
PlayerSpawnData::default(),
|
PlayerSpawn::default(),
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
229
src/ipc.rs
229
src/ipc.rs
|
@ -2,7 +2,10 @@ use binrw::binrw;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
common::{read_string, write_string},
|
common::{read_string, write_string},
|
||||||
world::{PlayerSpawnData, Position},
|
world::{
|
||||||
|
ActorControlSelf, InitZone, PlayerSetup, PlayerSpawn, PlayerStats, Position,
|
||||||
|
UpdateClassInfo,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE: See https://github.com/karashiiro/FFXIVOpcodes/blob/master/FFXIVOpcodes/Ipcs.cs for opcodes
|
// NOTE: See https://github.com/karashiiro/FFXIVOpcodes/blob/master/FFXIVOpcodes/Ipcs.cs for opcodes
|
||||||
|
@ -150,13 +153,6 @@ pub enum LobbyCharacterAction {
|
||||||
Request = 0x15,
|
Request = 0x15,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
|
||||||
#[derive(Debug, Eq, PartialEq, Clone)]
|
|
||||||
#[brw(repr = u16)]
|
|
||||||
pub enum ActorControlType {
|
|
||||||
SetCharaGearParamUI = 0x260,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[br(import(magic: &IPCOpCode))]
|
#[br(import(magic: &IPCOpCode))]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -350,212 +346,17 @@ pub enum IPCStructData {
|
||||||
unk2: u32,
|
unk2: u32,
|
||||||
},
|
},
|
||||||
#[br(pre_assert(false))]
|
#[br(pre_assert(false))]
|
||||||
InitZone {
|
InitZone(InitZone),
|
||||||
server_id: u16,
|
|
||||||
zone_id: u16,
|
|
||||||
zone_index: u16,
|
|
||||||
content_finder_condition_id: u16,
|
|
||||||
layer_set_id: u32,
|
|
||||||
layout_id: u32,
|
|
||||||
weather_id: u32,
|
|
||||||
unk_bitmask1: u8,
|
|
||||||
unk_bitmask2: u8,
|
|
||||||
unk1: u8,
|
|
||||||
unk2: u32,
|
|
||||||
festival_id: u16,
|
|
||||||
additional_festival_id: u16,
|
|
||||||
unk3: u32,
|
|
||||||
unk4: u32,
|
|
||||||
unk5: u32,
|
|
||||||
unk6: [u32; 4],
|
|
||||||
unk7: [u32; 3],
|
|
||||||
position: Position,
|
|
||||||
unk8: [u32; 4],
|
|
||||||
unk9: u32,
|
|
||||||
},
|
|
||||||
#[br(pre_assert(false))]
|
#[br(pre_assert(false))]
|
||||||
ActorControlSelf {
|
ActorControlSelf(ActorControlSelf),
|
||||||
#[brw(pad_after = 2)]
|
|
||||||
category: ActorControlType,
|
|
||||||
param1: u32,
|
|
||||||
param2: u32,
|
|
||||||
param3: u32,
|
|
||||||
param4: u32,
|
|
||||||
param5: u32,
|
|
||||||
#[brw(pad_after = 4)]
|
|
||||||
param6: u32,
|
|
||||||
},
|
|
||||||
#[br(pre_assert(false))]
|
#[br(pre_assert(false))]
|
||||||
PlayerStats {
|
PlayerStats(PlayerStats),
|
||||||
strength: u32,
|
|
||||||
dexterity: u32,
|
|
||||||
vitality: u32,
|
|
||||||
intelligence: u32,
|
|
||||||
mind: u32,
|
|
||||||
piety: u32,
|
|
||||||
hp: u32,
|
|
||||||
mp: u32,
|
|
||||||
tp: u32,
|
|
||||||
gp: u32,
|
|
||||||
cp: u32,
|
|
||||||
delay: u32,
|
|
||||||
tenacity: u32,
|
|
||||||
attack_power: u32,
|
|
||||||
defense: u32,
|
|
||||||
direct_hit_rate: u32,
|
|
||||||
evasion: u32,
|
|
||||||
magic_defense: u32,
|
|
||||||
critical_hit: u32,
|
|
||||||
attack_magic_potency: u32,
|
|
||||||
healing_magic_potency: u32,
|
|
||||||
elemental_bonus: u32,
|
|
||||||
determination: u32,
|
|
||||||
skill_speed: u32,
|
|
||||||
spell_speed: u32,
|
|
||||||
haste: u32,
|
|
||||||
craftmanship: u32,
|
|
||||||
control: u32,
|
|
||||||
gathering: u32,
|
|
||||||
perception: u32,
|
|
||||||
unk1: [u32; 26],
|
|
||||||
},
|
|
||||||
#[br(pre_assert(false))]
|
#[br(pre_assert(false))]
|
||||||
PlayerSetup {
|
PlayerSetup(PlayerSetup),
|
||||||
content_id: u64,
|
|
||||||
crest: u64,
|
|
||||||
unknown10: u64,
|
|
||||||
char_id: u32,
|
|
||||||
rested_exp: u32,
|
|
||||||
companion_current_exp: u32,
|
|
||||||
unknown1c: u32,
|
|
||||||
fish_caught: u32,
|
|
||||||
use_bait_catalog_id: u32,
|
|
||||||
unknown28: u32,
|
|
||||||
unknown_pvp2c: u16,
|
|
||||||
unknown2e: u16,
|
|
||||||
pvp_frontline_overall_campaigns: u32,
|
|
||||||
unknown_timestamp34: u32,
|
|
||||||
unknown_timestamp38: u32,
|
|
||||||
unknown3c: u32,
|
|
||||||
unknown40: u32,
|
|
||||||
unknown44: u32,
|
|
||||||
companion_time_passed: f32,
|
|
||||||
unknown4c: u32,
|
|
||||||
unknown50: u16,
|
|
||||||
unknown_pvp52: [u16; 4],
|
|
||||||
pvp_series_exp: u16,
|
|
||||||
player_commendations: u16,
|
|
||||||
unknown64: [u16; 8],
|
|
||||||
pvp_rival_wings_total_matches: u16,
|
|
||||||
pvp_rival_wings_total_victories: u16,
|
|
||||||
pvp_rival_wings_weekly_matches: u16,
|
|
||||||
pvp_rival_wings_weekly_victories: u16,
|
|
||||||
max_level: u8,
|
|
||||||
expansion: u8,
|
|
||||||
unknown76: u8,
|
|
||||||
unknown77: u8,
|
|
||||||
unknown78: u8,
|
|
||||||
race: u8,
|
|
||||||
tribe: u8,
|
|
||||||
gender: u8,
|
|
||||||
current_job: u8,
|
|
||||||
current_class: u8,
|
|
||||||
deity: u8,
|
|
||||||
nameday_month: u8,
|
|
||||||
nameday_day: u8,
|
|
||||||
city_state: u8,
|
|
||||||
homepoint: u8,
|
|
||||||
unknown8d: [u8; 3],
|
|
||||||
companion_rank: u8,
|
|
||||||
companion_stars: u8,
|
|
||||||
companion_sp: u8,
|
|
||||||
companion_unk93: u8,
|
|
||||||
companion_color: u8,
|
|
||||||
companion_fav_feed: u8,
|
|
||||||
fav_aetheryte_count: u8,
|
|
||||||
unknown97: [u8; 5],
|
|
||||||
sightseeing21_to_80_unlock: u8,
|
|
||||||
sightseeing_heavensward_unlock: u8,
|
|
||||||
unknown9e: [u8; 26],
|
|
||||||
exp: [u32; 32],
|
|
||||||
pvp_total_exp: u32,
|
|
||||||
unknown_pvp124: u32,
|
|
||||||
pvp_exp: u32,
|
|
||||||
pvp_frontline_overall_ranks: [u32; 3],
|
|
||||||
unknown138: u32,
|
|
||||||
levels: [u16; 32],
|
|
||||||
unknown194: [u8; 218],
|
|
||||||
companion_name: [u8; 21],
|
|
||||||
companion_def_rank: u8,
|
|
||||||
companion_att_rank: u8,
|
|
||||||
companion_heal_rank: u8,
|
|
||||||
mount_guide_mask: [u8; 33],
|
|
||||||
ornament_mask: [u8; 4],
|
|
||||||
unknown281: [u8; 23],
|
|
||||||
#[br(count = 32)]
|
|
||||||
#[bw(pad_size_to = 32)]
|
|
||||||
#[br(map = read_string)]
|
|
||||||
#[bw(map = write_string)]
|
|
||||||
name: String,
|
|
||||||
unknown293: [u8; 16],
|
|
||||||
unknown2a3: u8,
|
|
||||||
unlock_bitmask: [u8; 64],
|
|
||||||
aetheryte: [u8; 26],
|
|
||||||
favorite_aetheryte_ids: [u16; 4],
|
|
||||||
free_aetheryte_id: u16,
|
|
||||||
ps_plus_free_aetheryte_id: u16,
|
|
||||||
discovery: [u8; 480],
|
|
||||||
howto: [u8; 36],
|
|
||||||
unknown554: [u8; 4],
|
|
||||||
minions: [u8; 60],
|
|
||||||
chocobo_taxi_mask: [u8; 12],
|
|
||||||
watched_cutscenes: [u8; 159],
|
|
||||||
companion_barding_mask: [u8; 12],
|
|
||||||
companion_equipped_head: u8,
|
|
||||||
companion_equipped_body: u8,
|
|
||||||
companion_equipped_legs: u8,
|
|
||||||
unknown_mask: [u8; 287],
|
|
||||||
pose: [u8; 7],
|
|
||||||
unknown6df: [u8; 3],
|
|
||||||
challenge_log_complete: [u8; 13],
|
|
||||||
secret_recipe_book_mask: [u8; 12],
|
|
||||||
unknown_mask6f7: [u8; 29],
|
|
||||||
relic_completion: [u8; 12],
|
|
||||||
sightseeing_mask: [u8; 37],
|
|
||||||
hunting_mark_mask: [u8; 102],
|
|
||||||
triple_triad_cards: [u8; 45],
|
|
||||||
unknown895: u8,
|
|
||||||
unknown7d7: [u8; 15],
|
|
||||||
unknown7d8: u8,
|
|
||||||
unknown7e6: [u8; 49],
|
|
||||||
regional_folklore_mask: [u8; 6],
|
|
||||||
orchestrion_mask: [u8; 87],
|
|
||||||
hall_of_novice_completion: [u8; 3],
|
|
||||||
anima_completion: [u8; 11],
|
|
||||||
unknown85e: [u8; 41],
|
|
||||||
unlocked_raids: [u8; 28],
|
|
||||||
unlocked_dungeons: [u8; 18],
|
|
||||||
unlocked_guildhests: [u8; 10],
|
|
||||||
unlocked_trials: [u8; 12],
|
|
||||||
unlocked_pvp: [u8; 5],
|
|
||||||
cleared_raids: [u8; 28],
|
|
||||||
cleared_dungeons: [u8; 18],
|
|
||||||
cleared_guildhests: [u8; 10],
|
|
||||||
cleared_trials: [u8; 12],
|
|
||||||
cleared_pvp: [u8; 5],
|
|
||||||
unknown948: [u8; 15],
|
|
||||||
},
|
|
||||||
#[br(pre_assert(false))]
|
#[br(pre_assert(false))]
|
||||||
UpdateClassInfo {
|
UpdateClassInfo(UpdateClassInfo),
|
||||||
class_id: u16,
|
|
||||||
unknown: u8,
|
|
||||||
is_specialist: u8,
|
|
||||||
synced_level: u16,
|
|
||||||
class_level: u16,
|
|
||||||
role_actions: [u32; 10],
|
|
||||||
},
|
|
||||||
#[br(pre_assert(false))]
|
#[br(pre_assert(false))]
|
||||||
PlayerSpawn(PlayerSpawnData),
|
PlayerSpawn(PlayerSpawn),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
|
@ -651,15 +452,7 @@ mod tests {
|
||||||
entitled_expansion: 0,
|
entitled_expansion: 0,
|
||||||
characters: Vec::new(),
|
characters: Vec::new(),
|
||||||
},
|
},
|
||||||
IPCStructData::ActorControlSelf {
|
IPCStructData::ActorControlSelf(ActorControlSelf::default()),
|
||||||
category: ActorControlType::SetCharaGearParamUI,
|
|
||||||
param1: 0,
|
|
||||||
param2: 0,
|
|
||||||
param3: 0,
|
|
||||||
param4: 0,
|
|
||||||
param5: 0,
|
|
||||||
param6: 0,
|
|
||||||
},
|
|
||||||
IPCStructData::InitializeChat { unk: [0; 8] },
|
IPCStructData::InitializeChat { unk: [0; 8] },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
23
src/world/actor_control_self.rs
Normal file
23
src/world/actor_control_self.rs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
use binrw::binrw;
|
||||||
|
|
||||||
|
#[binrw]
|
||||||
|
#[derive(Debug, Eq, PartialEq, Clone, Default)]
|
||||||
|
#[brw(repr = u16)]
|
||||||
|
pub enum ActorControlType {
|
||||||
|
#[default]
|
||||||
|
SetCharaGearParamUI = 0x260,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[binrw]
|
||||||
|
#[derive(Debug, Clone, Default)]
|
||||||
|
pub struct ActorControlSelf {
|
||||||
|
#[brw(pad_after = 2)]
|
||||||
|
pub category: ActorControlType,
|
||||||
|
pub param1: u32,
|
||||||
|
pub param2: u32,
|
||||||
|
pub param3: u32,
|
||||||
|
pub param4: u32,
|
||||||
|
pub param5: u32,
|
||||||
|
#[brw(pad_after = 4)]
|
||||||
|
pub param6: u32,
|
||||||
|
}
|
29
src/world/init_zone.rs
Normal file
29
src/world/init_zone.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
use binrw::binrw;
|
||||||
|
|
||||||
|
use super::Position;
|
||||||
|
|
||||||
|
#[binrw]
|
||||||
|
#[derive(Debug, Clone, Default)]
|
||||||
|
pub struct InitZone {
|
||||||
|
pub server_id: u16,
|
||||||
|
pub zone_id: u16,
|
||||||
|
pub zone_index: u16,
|
||||||
|
pub content_finder_condition_id: u16,
|
||||||
|
pub layer_set_id: u32,
|
||||||
|
pub layout_id: u32,
|
||||||
|
pub weather_id: u32,
|
||||||
|
pub unk_bitmask1: u8,
|
||||||
|
pub unk_bitmask2: u8,
|
||||||
|
pub unk1: u8,
|
||||||
|
pub unk2: u32,
|
||||||
|
pub festival_id: u16,
|
||||||
|
pub additional_festival_id: u16,
|
||||||
|
pub unk3: u32,
|
||||||
|
pub unk4: u32,
|
||||||
|
pub unk5: u32,
|
||||||
|
pub unk6: [u32; 4],
|
||||||
|
pub unk7: [u32; 3],
|
||||||
|
pub position: Position,
|
||||||
|
pub unk8: [u32; 4],
|
||||||
|
pub unk9: u32,
|
||||||
|
}
|
|
@ -1,8 +1,24 @@
|
||||||
mod player_spawn;
|
mod player_spawn;
|
||||||
pub use player_spawn::PlayerSpawnData;
|
pub use player_spawn::PlayerSpawn;
|
||||||
|
|
||||||
mod position;
|
mod position;
|
||||||
pub use position::Position;
|
pub use position::Position;
|
||||||
|
|
||||||
mod status_effect;
|
mod status_effect;
|
||||||
pub use status_effect::StatusEffect;
|
pub use status_effect::StatusEffect;
|
||||||
|
|
||||||
|
mod update_class_info;
|
||||||
|
pub use update_class_info::UpdateClassInfo;
|
||||||
|
|
||||||
|
mod player_setup;
|
||||||
|
pub use player_setup::PlayerSetup;
|
||||||
|
|
||||||
|
mod player_stats;
|
||||||
|
pub use player_stats::PlayerStats;
|
||||||
|
|
||||||
|
mod actor_control_self;
|
||||||
|
pub use actor_control_self::ActorControlSelf;
|
||||||
|
pub use actor_control_self::ActorControlType;
|
||||||
|
|
||||||
|
mod init_zone;
|
||||||
|
pub use init_zone::InitZone;
|
||||||
|
|
159
src/world/player_setup.rs
Normal file
159
src/world/player_setup.rs
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
use binrw::binrw;
|
||||||
|
|
||||||
|
use crate::common::{read_string, write_string};
|
||||||
|
|
||||||
|
#[binrw]
|
||||||
|
#[derive(Debug, Clone, Default)]
|
||||||
|
pub struct PlayerSetup {
|
||||||
|
pub content_id: u64,
|
||||||
|
pub crest: u64,
|
||||||
|
pub unknown10: u64,
|
||||||
|
pub char_id: u32,
|
||||||
|
pub rested_exp: u32,
|
||||||
|
pub companion_current_exp: u32,
|
||||||
|
pub unknown1c: u32,
|
||||||
|
pub fish_caught: u32,
|
||||||
|
pub use_bait_catalog_id: u32,
|
||||||
|
pub unknown28: u32,
|
||||||
|
pub unknown_pvp2c: u16,
|
||||||
|
pub unknown2e: u16,
|
||||||
|
pub pvp_frontline_overall_campaigns: u32,
|
||||||
|
pub unknown_timestamp34: u32,
|
||||||
|
pub unknown_timestamp38: u32,
|
||||||
|
pub unknown3c: u32,
|
||||||
|
pub unknown40: u32,
|
||||||
|
pub unknown44: u32,
|
||||||
|
pub companion_time_passed: f32,
|
||||||
|
pub unknown4c: u32,
|
||||||
|
pub unknown50: u16,
|
||||||
|
pub unknown_pvp52: [u16; 4],
|
||||||
|
pub pvp_series_exp: u16,
|
||||||
|
pub player_commendations: u16,
|
||||||
|
pub unknown64: [u16; 8],
|
||||||
|
pub pvp_rival_wings_total_matches: u16,
|
||||||
|
pub pvp_rival_wings_total_victories: u16,
|
||||||
|
pub pvp_rival_wings_weekly_matches: u16,
|
||||||
|
pub pvp_rival_wings_weekly_victories: u16,
|
||||||
|
pub max_level: u8,
|
||||||
|
pub expansion: u8,
|
||||||
|
pub unknown76: u8,
|
||||||
|
pub unknown77: u8,
|
||||||
|
pub unknown78: u8,
|
||||||
|
pub race: u8,
|
||||||
|
pub tribe: u8,
|
||||||
|
pub gender: u8,
|
||||||
|
pub current_job: u8,
|
||||||
|
pub current_class: u8,
|
||||||
|
pub deity: u8,
|
||||||
|
pub nameday_month: u8,
|
||||||
|
pub nameday_day: u8,
|
||||||
|
pub city_state: u8,
|
||||||
|
pub homepoint: u8,
|
||||||
|
pub unknown8d: [u8; 3],
|
||||||
|
pub companion_rank: u8,
|
||||||
|
pub companion_stars: u8,
|
||||||
|
pub companion_sp: u8,
|
||||||
|
pub companion_unk93: u8,
|
||||||
|
pub companion_color: u8,
|
||||||
|
pub companion_fav_feed: u8,
|
||||||
|
pub fav_aetheryte_count: u8,
|
||||||
|
pub unknown97: [u8; 5],
|
||||||
|
pub sightseeing21_to_80_unlock: u8,
|
||||||
|
pub sightseeing_heavensward_unlock: u8,
|
||||||
|
pub unknown9e: [u8; 26],
|
||||||
|
pub exp: [u32; 32],
|
||||||
|
pub pvp_total_exp: u32,
|
||||||
|
pub unknown_pvp124: u32,
|
||||||
|
pub pvp_exp: u32,
|
||||||
|
pub pvp_frontline_overall_ranks: [u32; 3],
|
||||||
|
pub unknown138: u32,
|
||||||
|
pub levels: [u16; 32],
|
||||||
|
#[br(count = 218)]
|
||||||
|
#[bw(pad_size_to = 218)]
|
||||||
|
pub unknown194: Vec<u8>,
|
||||||
|
pub companion_name: [u8; 21],
|
||||||
|
pub companion_def_rank: u8,
|
||||||
|
pub companion_att_rank: u8,
|
||||||
|
pub companion_heal_rank: u8,
|
||||||
|
#[br(count = 33)]
|
||||||
|
#[bw(pad_size_to = 33)]
|
||||||
|
pub mount_guide_mask: Vec<u8>,
|
||||||
|
pub ornament_mask: [u8; 4],
|
||||||
|
pub unknown281: [u8; 23],
|
||||||
|
#[br(count = 32)]
|
||||||
|
#[bw(pad_size_to = 32)]
|
||||||
|
#[br(map = read_string)]
|
||||||
|
#[bw(map = write_string)]
|
||||||
|
pub name: String,
|
||||||
|
pub unknown293: [u8; 16],
|
||||||
|
pub unknown2a3: u8,
|
||||||
|
#[br(count = 64)]
|
||||||
|
#[bw(pad_size_to = 64)]
|
||||||
|
pub unlock_bitmask: Vec<u8>,
|
||||||
|
pub aetheryte: [u8; 26],
|
||||||
|
pub favorite_aetheryte_ids: [u16; 4],
|
||||||
|
pub free_aetheryte_id: u16,
|
||||||
|
pub ps_plus_free_aetheryte_id: u16,
|
||||||
|
#[br(count = 480)]
|
||||||
|
#[bw(pad_size_to = 480)]
|
||||||
|
pub discovery: Vec<u8>,
|
||||||
|
#[br(count = 36)]
|
||||||
|
#[bw(pad_size_to = 36)]
|
||||||
|
pub howto: Vec<u8>,
|
||||||
|
pub unknown554: [u8; 4],
|
||||||
|
#[br(count = 60)]
|
||||||
|
#[bw(pad_size_to = 60)]
|
||||||
|
pub minions: Vec<u8>,
|
||||||
|
pub chocobo_taxi_mask: [u8; 12],
|
||||||
|
#[br(count = 159)]
|
||||||
|
#[bw(pad_size_to = 159)]
|
||||||
|
pub watched_cutscenes: Vec<u8>,
|
||||||
|
pub companion_barding_mask: [u8; 12],
|
||||||
|
pub companion_equipped_head: u8,
|
||||||
|
pub companion_equipped_body: u8,
|
||||||
|
pub companion_equipped_legs: u8,
|
||||||
|
#[br(count = 287)]
|
||||||
|
#[bw(pad_size_to = 287)]
|
||||||
|
pub unknown_mask: Vec<u8>,
|
||||||
|
pub pose: [u8; 7],
|
||||||
|
pub unknown6df: [u8; 3],
|
||||||
|
pub challenge_log_complete: [u8; 13],
|
||||||
|
pub secret_recipe_book_mask: [u8; 12],
|
||||||
|
pub unknown_mask6f7: [u8; 29],
|
||||||
|
pub relic_completion: [u8; 12],
|
||||||
|
#[br(count = 37)]
|
||||||
|
#[bw(pad_size_to = 37)]
|
||||||
|
pub sightseeing_mask: Vec<u8>,
|
||||||
|
#[br(count = 102)]
|
||||||
|
#[bw(pad_size_to = 102)]
|
||||||
|
pub hunting_mark_mask: Vec<u8>,
|
||||||
|
#[br(count = 45)]
|
||||||
|
#[bw(pad_size_to = 45)]
|
||||||
|
pub triple_triad_cards: Vec<u8>,
|
||||||
|
pub unknown895: u8,
|
||||||
|
pub unknown7d7: [u8; 15],
|
||||||
|
pub unknown7d8: u8,
|
||||||
|
#[br(count = 49)]
|
||||||
|
#[bw(pad_size_to = 49)]
|
||||||
|
pub unknown7e6: Vec<u8>,
|
||||||
|
pub regional_folklore_mask: [u8; 6],
|
||||||
|
#[br(count = 87)]
|
||||||
|
#[bw(pad_size_to = 87)]
|
||||||
|
pub orchestrion_mask: Vec<u8>,
|
||||||
|
pub hall_of_novice_completion: [u8; 3],
|
||||||
|
pub anima_completion: [u8; 11],
|
||||||
|
#[br(count = 41)]
|
||||||
|
#[bw(pad_size_to = 41)]
|
||||||
|
pub unknown85e: Vec<u8>,
|
||||||
|
pub unlocked_raids: [u8; 28],
|
||||||
|
pub unlocked_dungeons: [u8; 18],
|
||||||
|
pub unlocked_guildhests: [u8; 10],
|
||||||
|
pub unlocked_trials: [u8; 12],
|
||||||
|
pub unlocked_pvp: [u8; 5],
|
||||||
|
pub cleared_raids: [u8; 28],
|
||||||
|
pub cleared_dungeons: [u8; 18],
|
||||||
|
pub cleared_guildhests: [u8; 10],
|
||||||
|
pub cleared_trials: [u8; 12],
|
||||||
|
pub cleared_pvp: [u8; 5],
|
||||||
|
pub unknown948: [u8; 15],
|
||||||
|
}
|
|
@ -4,8 +4,8 @@ use super::position::Position;
|
||||||
use super::status_effect::StatusEffect;
|
use super::status_effect::StatusEffect;
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
pub struct PlayerSpawnData {
|
pub struct PlayerSpawn {
|
||||||
pub title: u16,
|
pub title: u16,
|
||||||
pub u1b: u16,
|
pub u1b: u16,
|
||||||
pub current_world_id: u16,
|
pub current_world_id: u16,
|
||||||
|
|
37
src/world/player_stats.rs
Normal file
37
src/world/player_stats.rs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
use binrw::binrw;
|
||||||
|
|
||||||
|
#[binrw]
|
||||||
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
|
pub struct PlayerStats {
|
||||||
|
pub strength: u32,
|
||||||
|
pub dexterity: u32,
|
||||||
|
pub vitality: u32,
|
||||||
|
pub intelligence: u32,
|
||||||
|
pub mind: u32,
|
||||||
|
pub piety: u32,
|
||||||
|
pub hp: u32,
|
||||||
|
pub mp: u32,
|
||||||
|
pub tp: u32,
|
||||||
|
pub gp: u32,
|
||||||
|
pub cp: u32,
|
||||||
|
pub delay: u32,
|
||||||
|
pub tenacity: u32,
|
||||||
|
pub attack_power: u32,
|
||||||
|
pub defense: u32,
|
||||||
|
pub direct_hit_rate: u32,
|
||||||
|
pub evasion: u32,
|
||||||
|
pub magic_defense: u32,
|
||||||
|
pub critical_hit: u32,
|
||||||
|
pub attack_magic_potency: u32,
|
||||||
|
pub healing_magic_potency: u32,
|
||||||
|
pub elemental_bonus: u32,
|
||||||
|
pub determination: u32,
|
||||||
|
pub skill_speed: u32,
|
||||||
|
pub spell_speed: u32,
|
||||||
|
pub haste: u32,
|
||||||
|
pub craftmanship: u32,
|
||||||
|
pub control: u32,
|
||||||
|
pub gathering: u32,
|
||||||
|
pub perception: u32,
|
||||||
|
pub unk1: [u32; 26],
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
use binrw::binrw;
|
use binrw::binrw;
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
pub struct Position {
|
pub struct Position {
|
||||||
pub x: f32,
|
pub x: f32,
|
||||||
pub y: f32,
|
pub y: f32,
|
||||||
|
|
12
src/world/update_class_info.rs
Normal file
12
src/world/update_class_info.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
use binrw::binrw;
|
||||||
|
|
||||||
|
#[binrw]
|
||||||
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
|
pub struct UpdateClassInfo {
|
||||||
|
pub class_id: u16,
|
||||||
|
pub unknown: u8,
|
||||||
|
pub is_specialist: u8,
|
||||||
|
pub synced_level: u16,
|
||||||
|
pub class_level: u16,
|
||||||
|
pub role_actions: [u32; 10],
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue