2025-05-08 22:53:36 -04:00
|
|
|
use binrw::binrw;
|
|
|
|
|
2025-06-22 10:08:29 -04:00
|
|
|
use crate::common::{read_bool_from, write_bool_as};
|
|
|
|
|
2025-05-08 22:53:36 -04:00
|
|
|
#[binrw]
|
|
|
|
#[derive(Debug, Eq, PartialEq, Clone)]
|
|
|
|
pub enum ClientTriggerCommand {
|
2025-06-25 20:58:21 -04:00
|
|
|
/// The player sheathes/unsheathes their weapon.
|
2025-06-22 10:08:29 -04:00
|
|
|
#[brw(magic = 0x1u16)]
|
|
|
|
ToggleWeapon {
|
|
|
|
#[brw(pad_before = 2)]
|
|
|
|
#[br(map = read_bool_from::<u32>)]
|
|
|
|
#[bw(map = write_bool_as::<u32>)]
|
|
|
|
shown: bool,
|
|
|
|
},
|
2025-06-25 20:58:21 -04:00
|
|
|
/// The player looks or stops looking at an actor.
|
2025-05-08 22:53:36 -04:00
|
|
|
#[brw(magic = 0x3u16)]
|
|
|
|
SetTarget {
|
|
|
|
#[brw(pad_before = 2)]
|
|
|
|
actor_id: u32,
|
|
|
|
},
|
|
|
|
#[brw(magic = 0xC81u16)]
|
|
|
|
Unk1 {},
|
|
|
|
#[brw(magic = 0xC9u16)]
|
2025-06-25 22:12:09 -04:00
|
|
|
FinishZoning {},
|
2025-06-25 20:58:21 -04:00
|
|
|
/// The player begins an emote.
|
2025-06-22 09:45:24 -04:00
|
|
|
#[brw(magic = 0x1F4u16)]
|
|
|
|
Emote {
|
|
|
|
#[brw(pad_before = 2)] // padding
|
|
|
|
emote: u32,
|
|
|
|
},
|
2025-06-25 20:58:21 -04:00
|
|
|
/// The player explicitly changed their pose.
|
2025-05-08 23:03:51 -04:00
|
|
|
#[brw(magic = 0x1F9u16)]
|
|
|
|
ChangePose {
|
|
|
|
#[brw(pad_before = 2)] // padding
|
|
|
|
unk1: u32,
|
|
|
|
pose: u32,
|
|
|
|
},
|
2025-06-25 20:58:21 -04:00
|
|
|
/// The client is "reapplying" the existing pose, like after idling.
|
2025-05-08 23:03:51 -04:00
|
|
|
#[brw(magic = 0x1FAu16)]
|
|
|
|
ReapplyPose {
|
|
|
|
#[brw(pad_before = 2)] // padding
|
|
|
|
unk1: u32,
|
|
|
|
pose: u32,
|
|
|
|
},
|
2025-06-25 20:58:21 -04:00
|
|
|
/// The player selects a teleport destination.
|
2025-05-11 10:12:02 -04:00
|
|
|
#[brw(magic = 0xCAu16)]
|
|
|
|
TeleportQuery {
|
|
|
|
#[brw(pad_before = 2)]
|
|
|
|
aetheryte_id: u32,
|
|
|
|
// TODO: fill out the rest
|
|
|
|
},
|
2025-05-08 22:53:36 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
#[binrw]
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub struct ClientTrigger {
|
|
|
|
#[brw(pad_size_to = 32)] // take into account categories without params
|
|
|
|
pub trigger: ClientTriggerCommand,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for ClientTrigger {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
|
|
|
trigger: ClientTriggerCommand::SetTarget { actor_id: 0 },
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|