1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-06-30 11:47:45 +00:00

Support sending an arbitrary amount of event params

This ended up as a giant, disgusting match statement but I don't
really have anything better right now.
This commit is contained in:
Joshua Goins 2025-06-28 16:17:54 -04:00
parent 5b8a61c1ce
commit f778f9a571

View file

@ -122,19 +122,129 @@ impl LuaPlayer {
event_id: u32, event_id: u32,
scene: u16, scene: u16,
scene_flags: u32, scene_flags: u32,
params_count: u8, params: &[u32],
params: [u32; 2],
) { ) {
let op_code = ServerZoneIpcType::EventScene; let op_code;
let data = ServerZoneIpcData::EventScene(EventScene { let data;
actor_id: target, match params.len() {
event_id, // TODO: it would be nice to de-duplicate these
scene, 0..=2 => {
scene_flags, let mut scene = EventScene {
params_count, actor_id: target,
params, event_id,
..Default::default() scene,
}); scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params[..params.len()].copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene;
data = ServerZoneIpcData::EventScene(scene);
}
3..=4 => {
let mut scene = EventScene::<4> {
actor_id: target,
event_id,
scene,
scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params[..params.len()].copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene4;
data = ServerZoneIpcData::EventScene4(scene);
}
5..=8 => {
let mut scene = EventScene::<8> {
actor_id: target,
event_id,
scene,
scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params[..params.len()].copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene8;
data = ServerZoneIpcData::EventScene8(scene);
}
9..=16 => {
let mut scene = EventScene::<16> {
actor_id: target,
event_id,
scene,
scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params[..params.len()].copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene16;
data = ServerZoneIpcData::EventScene16(scene);
}
17..=32 => {
let mut scene = EventScene::<32> {
actor_id: target,
event_id,
scene,
scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params[..params.len()].copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene32;
data = ServerZoneIpcData::EventScene32(scene);
}
33..=64 => {
let mut scene = EventScene::<64> {
actor_id: target,
event_id,
scene,
scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params.copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene64;
data = ServerZoneIpcData::EventScene64(scene);
}
65..=128 => {
let mut scene = EventScene::<128> {
actor_id: target,
event_id,
scene,
scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params[..params.len()].copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene128;
data = ServerZoneIpcData::EventScene128(scene);
}
129..255 => {
let mut scene = EventScene::<255> {
actor_id: target,
event_id,
scene,
scene_flags,
params_count: params.len() as u8,
..Default::default()
};
scene.params[..params.len()].copy_from_slice(&params[0..params.len()]);
op_code = ServerZoneIpcType::EventScene255;
data = ServerZoneIpcData::EventScene255(scene);
}
_ => {
tracing::warn!("Unsupported amount of parameters in play_scene!");
return;
}
}
self.create_segment_self(op_code, data); self.create_segment_self(op_code, data);
} }
@ -283,19 +393,7 @@ impl UserData for LuaPlayer {
u32, u32,
Vec<u32>, Vec<u32>,
)| { )| {
let params_arr: [u32; 2]; this.play_scene(target, event_id, scene, scene_flags, &params);
if params.len() == 2 {
params_arr = [params[0], params[1]];
} else if params.len() == 1 {
params_arr = [params[0], 0];
} else {
this.finish_event(event_id);
let message = "Script params are invalid, it contains either more than 2 parameters or no parameters at all!";
tracing::error!(message);
this.send_message(message, 0);
return Ok(());
}
this.play_scene(target, event_id, scene, scene_flags, params.len() as u8, params_arr);
return Ok(()); return Ok(());
}, },
); );