1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-06-30 03:37: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,
scene: u16,
scene_flags: u32,
params_count: u8,
params: [u32; 2],
params: &[u32],
) {
let op_code = ServerZoneIpcType::EventScene;
let data = ServerZoneIpcData::EventScene(EventScene {
let op_code;
let data;
match params.len() {
// TODO: it would be nice to de-duplicate these
0..=2 => {
let mut scene = EventScene {
actor_id: target,
event_id,
scene,
scene_flags,
params_count,
params,
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);
}
@ -283,19 +393,7 @@ impl UserData for LuaPlayer {
u32,
Vec<u32>,
)| {
let params_arr: [u32; 2];
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);
this.play_scene(target, event_id, scene, scene_flags, &params);
return Ok(());
},
);