mirror of
https://github.com/redstrate/Kawari.git
synced 2025-05-12 22:57:45 +00:00
This begins figuring out how we are going to be propagating actor control state: e.g. targets, poses, and other misc effects. I ended up sending client triggers to the global server state, who then creates the needed actor control packet for the other players. Now players can see what other players are targeting!
93 lines
2.4 KiB
Rust
93 lines
2.4 KiB
Rust
use binrw::binrw;
|
|
|
|
use crate::common::{read_bool_from, write_bool_as};
|
|
|
|
use super::OnlineStatus;
|
|
|
|
// TODO: these are all somewhat related, but maybe should be separated?
|
|
|
|
// See https://github.com/awgil/ffxiv_reverse/blob/f35b6226c1478234ca2b7149f82d251cffca2f56/vnetlog/vnetlog/ServerIPC.cs#L266 for a REALLY useful list of known values
|
|
#[binrw]
|
|
#[derive(Debug, Eq, PartialEq, Clone)]
|
|
pub enum ActorControlCategory {
|
|
#[brw(magic = 0x26u16)]
|
|
ToggleInvisibility {
|
|
#[brw(pad_before = 2)]
|
|
#[br(map = read_bool_from::<u32>)]
|
|
#[bw(map = write_bool_as::<u32>)]
|
|
invisible: bool,
|
|
},
|
|
#[brw(magic = 0xC8u16)]
|
|
ZoneIn {
|
|
#[brw(pad_before = 2)]
|
|
warp_finish_anim: u32,
|
|
raise_anim: u32,
|
|
},
|
|
#[brw(magic = 0x260u16)]
|
|
SetCharaGearParamUI {
|
|
#[brw(pad_before = 2)]
|
|
unk1: u32,
|
|
unk2: u32,
|
|
},
|
|
#[brw(magic = 0x01F8u16)]
|
|
SetStatusIcon {
|
|
#[brw(pad_before = 2)]
|
|
icon: OnlineStatus,
|
|
},
|
|
#[brw(magic = 0x261u16)]
|
|
ToggleWireframeRendering(),
|
|
#[brw(magic = 0x32u16)]
|
|
SetTarget {
|
|
#[brw(pad_before = 22)] // actually full of info, and 2 bytes of padding at the beginning
|
|
actor_id: u32,
|
|
},
|
|
}
|
|
|
|
#[binrw]
|
|
#[derive(Debug, Clone)]
|
|
pub struct ActorControl {
|
|
#[brw(pad_after = 4)]
|
|
#[brw(pad_size_to = 20)] // take into account categories without params
|
|
pub category: ActorControlCategory,
|
|
}
|
|
|
|
impl Default for ActorControl {
|
|
fn default() -> Self {
|
|
Self {
|
|
category: ActorControlCategory::ToggleInvisibility { invisible: false },
|
|
}
|
|
}
|
|
}
|
|
|
|
// Has more padding than ActorControl?
|
|
#[binrw]
|
|
#[derive(Debug, Clone)]
|
|
pub struct ActorControlSelf {
|
|
#[brw(pad_after = 12)]
|
|
#[brw(pad_size_to = 20)] // take into account categories without params
|
|
pub category: ActorControlCategory,
|
|
}
|
|
|
|
impl Default for ActorControlSelf {
|
|
fn default() -> Self {
|
|
Self {
|
|
category: ActorControlCategory::ToggleInvisibility { invisible: false },
|
|
}
|
|
}
|
|
}
|
|
|
|
// Has more padding than ActorControl?
|
|
#[binrw]
|
|
#[derive(Debug, Clone)]
|
|
pub struct ActorControlTarget {
|
|
#[brw(pad_size_to = 28)] // take into account categories without params
|
|
pub category: ActorControlCategory,
|
|
}
|
|
|
|
impl Default for ActorControlTarget {
|
|
fn default() -> Self {
|
|
Self {
|
|
category: ActorControlCategory::ToggleInvisibility { invisible: false },
|
|
}
|
|
}
|
|
}
|