gizmo_scripting/
api_vehicle.rs1use crate::commands::{CommandQueue, ScriptCommand};
6use mlua::prelude::*;
7use std::sync::Arc;
8
9pub fn register_vehicle_api(lua: &Lua, command_queue: Arc<CommandQueue>) -> Result<(), LuaError> {
11 crate::api_table::register_protected(lua, "vehicle", |vehicle_table| {
12
13 {
15 let cq = command_queue.clone();
16 vehicle_table.set(
17 "set_engine_force",
18 lua.create_function(move |_, (id, force): (u32, f32)| {
19 cq.push(ScriptCommand::SetVehicleEngineForce(id, force));
20 Ok(())
21 })?,
22 )?;
23 }
24
25 {
27 let cq = command_queue.clone();
28 vehicle_table.set(
29 "set_steering",
30 lua.create_function(move |_, (id, angle): (u32, f32)| {
31 cq.push(ScriptCommand::SetVehicleSteering(id, angle));
32 Ok(())
33 })?,
34 )?;
35 }
36
37 {
39 let cq = command_queue.clone();
40 vehicle_table.set(
41 "set_brake",
42 lua.create_function(move |_, (id, force): (u32, f32)| {
43 cq.push(ScriptCommand::SetVehicleBrake(id, force));
44 Ok(())
45 })?,
46 )?;
47 }
48
49 Ok(())
50 })
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56 use mlua::Lua;
57
58 #[test]
61 fn vehicle_calls_push_expected_commands() {
62 let lua = Lua::new();
63 let cq = Arc::new(CommandQueue::new());
64 register_vehicle_api(&lua, cq.clone()).unwrap();
65
66 lua.load(
67 r#"
68 vehicle.set_engine_force(3, 1500.0)
69 vehicle.set_steering(3, -0.35)
70 vehicle.set_brake(3, 800.0)
71 "#,
72 )
73 .exec()
74 .unwrap();
75
76 let cmds = cq.drain();
77 assert_eq!(cmds.len(), 3);
78 match cmds[0] {
79 ScriptCommand::SetVehicleEngineForce(id, f) => {
80 assert_eq!(id, 3);
81 assert!((f - 1500.0).abs() < 1e-3);
82 }
83 ref other => panic!("beklenen SetVehicleEngineForce, gelen {other:?}"),
84 }
85 match cmds[1] {
86 ScriptCommand::SetVehicleSteering(id, a) => {
87 assert_eq!(id, 3);
88 assert!((a - (-0.35)).abs() < 1e-6, "negatif direksiyon korunmalı");
89 }
90 ref other => panic!("beklenen SetVehicleSteering, gelen {other:?}"),
91 }
92 match cmds[2] {
93 ScriptCommand::SetVehicleBrake(id, f) => {
94 assert_eq!(id, 3);
95 assert!((f - 800.0).abs() < 1e-3);
96 }
97 ref other => panic!("beklenen SetVehicleBrake, gelen {other:?}"),
98 }
99 }
100}