diff --git a/src/world/lua.rs b/src/world/lua.rs index d01b4c5..4d71910 100644 --- a/src/world/lua.rs +++ b/src/world/lua.rs @@ -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 { - actor_id: target, - event_id, - scene, - scene_flags, - params_count, - params, - ..Default::default() - }); + 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.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); } @@ -283,19 +393,7 @@ impl UserData for LuaPlayer { u32, Vec, )| { - 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, ¶ms); return Ok(()); }, );