forked from StrafesNET/strafe-project
roblox_emulator: create task module
This commit is contained in:
@@ -3,6 +3,7 @@ mod macros;
|
|||||||
mod runner;
|
mod runner;
|
||||||
|
|
||||||
mod r#enum;
|
mod r#enum;
|
||||||
|
mod task;
|
||||||
mod udim;
|
mod udim;
|
||||||
mod udim2;
|
mod udim2;
|
||||||
mod color3;
|
mod color3;
|
||||||
|
|||||||
@@ -32,8 +32,7 @@ fn init(lua:&mlua::Lua)->mlua::Result<()>{
|
|||||||
//global environment
|
//global environment
|
||||||
let globals=lua.globals();
|
let globals=lua.globals();
|
||||||
|
|
||||||
#[cfg(feature="run-service")]
|
super::task::set_globals(lua,&globals)?;
|
||||||
crate::scheduler::set_globals(lua,&globals)?;
|
|
||||||
super::script_signal::set_globals(lua,&globals)?;
|
super::script_signal::set_globals(lua,&globals)?;
|
||||||
super::r#enum::set_globals(lua,&globals)?;
|
super::r#enum::set_globals(lua,&globals)?;
|
||||||
super::udim::set_globals(lua,&globals)?;
|
super::udim::set_globals(lua,&globals)?;
|
||||||
|
|||||||
35
lib/roblox_emulator/src/runner/task.rs
Normal file
35
lib/roblox_emulator/src/runner/task.rs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#[cfg(not(feature="run-service"))]
|
||||||
|
fn no_op(_lua:&mlua::Lua,_time:Option<super::number::Number>)->mlua::Result<f64>{
|
||||||
|
Ok(0.0)
|
||||||
|
}
|
||||||
|
// This is used to avoid calling coroutine.yield from the rust side.
|
||||||
|
const LUA_WAIT:&str=
|
||||||
|
"local coroutine_yield=coroutine.yield
|
||||||
|
local schedule_thread=schedule_thread
|
||||||
|
return function(dt)
|
||||||
|
schedule_thread(dt)
|
||||||
|
return coroutine_yield()
|
||||||
|
end";
|
||||||
|
|
||||||
|
pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{
|
||||||
|
let coroutine_table=globals.get::<mlua::Table>("coroutine")?;
|
||||||
|
#[cfg(feature="run-service")]
|
||||||
|
let schedule_thread=lua.create_function(crate::scheduler::schedule_thread)?;
|
||||||
|
#[cfg(not(feature="run-service"))]
|
||||||
|
let schedule_thread=lua.create_function(no_op)?;
|
||||||
|
|
||||||
|
//create wait function environment
|
||||||
|
let wait_env=lua.create_table()?;
|
||||||
|
wait_env.raw_set("coroutine",coroutine_table)?;
|
||||||
|
wait_env.raw_set("schedule_thread",schedule_thread)?;
|
||||||
|
|
||||||
|
//construct wait function from Lua code
|
||||||
|
let wait=lua.load(LUA_WAIT)
|
||||||
|
.set_name("wait")
|
||||||
|
.set_environment(wait_env)
|
||||||
|
.call::<mlua::Function>(())?;
|
||||||
|
|
||||||
|
globals.raw_set("wait",wait)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ pub fn scheduler_mut<T>(lua:&mlua::Lua,mut f:impl FnMut(&mut crate::scheduler::S
|
|||||||
f(&mut *scheduler)
|
f(&mut *scheduler)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn schedule_thread(lua:&mlua::Lua,dt:mlua::Value)->Result<(),mlua::Error>{
|
pub fn schedule_thread(lua:&mlua::Lua,dt:mlua::Value)->Result<(),mlua::Error>{
|
||||||
let delay=match dt{
|
let delay=match dt{
|
||||||
mlua::Value::Integer(i)=>i.max(0) as u64*60,
|
mlua::Value::Integer(i)=>i.max(0) as u64*60,
|
||||||
mlua::Value::Number(f)=>{
|
mlua::Value::Number(f)=>{
|
||||||
@@ -75,32 +75,3 @@ fn schedule_thread(lua:&mlua::Lua,dt:mlua::Value)->Result<(),mlua::Error>{
|
|||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is used to avoid calling coroutine.yield from the rust side.
|
|
||||||
const LUA_WAIT:&str=
|
|
||||||
"local coroutine_yield=coroutine.yield
|
|
||||||
local schedule_thread=schedule_thread
|
|
||||||
return function(dt)
|
|
||||||
schedule_thread(dt)
|
|
||||||
return coroutine_yield()
|
|
||||||
end";
|
|
||||||
|
|
||||||
pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{
|
|
||||||
let coroutine_table=globals.get::<mlua::Table>("coroutine")?;
|
|
||||||
let schedule_thread=lua.create_function(schedule_thread)?;
|
|
||||||
|
|
||||||
//create wait function environment
|
|
||||||
let wait_env=lua.create_table()?;
|
|
||||||
wait_env.raw_set("coroutine",coroutine_table)?;
|
|
||||||
wait_env.raw_set("schedule_thread",schedule_thread)?;
|
|
||||||
|
|
||||||
//construct wait function from Lua code
|
|
||||||
let wait=lua.load(LUA_WAIT)
|
|
||||||
.set_name("wait")
|
|
||||||
.set_environment(wait_env)
|
|
||||||
.call::<mlua::Function>(())?;
|
|
||||||
|
|
||||||
globals.raw_set("wait",wait)?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user