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:
parent
5b8a61c1ce
commit
f778f9a571
1 changed files with 123 additions and 25 deletions
148
src/world/lua.rs
148
src/world/lua.rs
|
@ -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(¶ms[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(¶ms[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(¶ms[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(¶ms[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(¶ms[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(¶ms[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(¶ms[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(¶ms[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, ¶ms);
|
||||||
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(());
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Reference in a new issue