diff --git a/resources/scripts/test.lua b/resources/scripts/Global.lua similarity index 55% rename from resources/scripts/test.lua rename to resources/scripts/Global.lua index f2d23a0..eb9ac3a 100644 --- a/resources/scripts/test.lua +++ b/resources/scripts/Global.lua @@ -3,7 +3,4 @@ function onBeginLogin(player) player:send_message("Welcome to Kawari!") end -function doAction(player) - -- give sprint - player:give_status_effect(50, 5.0) -end +registerAction(3, "actions/Sprint.lua") diff --git a/resources/scripts/actions/Sprint.lua b/resources/scripts/actions/Sprint.lua new file mode 100644 index 0000000..92fe718 --- /dev/null +++ b/resources/scripts/actions/Sprint.lua @@ -0,0 +1,4 @@ +function doAction(player) + -- give sprint + player:give_status_effect(50, 5.0) +end diff --git a/src/bin/kawari-world.rs b/src/bin/kawari-world.rs index 1c5607b..3e14171 100644 --- a/src/bin/kawari-world.rs +++ b/src/bin/kawari-world.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::sync::{Arc, Mutex}; use kawari::common::custom_ipc::{CustomIpcData, CustomIpcSegment, CustomIpcType}; @@ -33,6 +34,11 @@ use physis::gamedata::GameData; use tokio::io::AsyncReadExt; use tokio::net::TcpListener; +#[derive(Default)] +struct ExtraLuaState { + action_scripts: HashMap, +} + #[tokio::main] async fn main() { tracing_subscriber::fmt::init(); @@ -50,7 +56,22 @@ async fn main() { { let lua = lua.lock().unwrap(); - let file_name = format!("{}/test.lua", &config.world.scripts_location); + + let register_action_func = lua + .create_function(|lua, (action_id, action_script): (u32, String)| { + tracing::info!("Registering {action_id} with {action_script}!"); + let mut state = lua.app_data_mut::().unwrap(); + let _ = state.action_scripts.insert(action_id, action_script); + Ok(()) + }) + .unwrap(); + + lua.set_app_data(ExtraLuaState::default()); + lua.globals() + .set("registerAction", register_action_func) + .unwrap(); + + let file_name = format!("{}/Global.lua", &config.world.scripts_location); lua.load(std::fs::read(&file_name).expect("Failed to locate scripts directory!")) .set_name("@".to_string() + &file_name) .exec() @@ -757,21 +778,41 @@ async fn main() { .await; } + // run action script { let lua = lua.lock().unwrap(); - lua.scope(|scope| { - let connection_data = scope - .create_userdata_ref_mut(&mut lua_player) + let state = + lua.app_data_ref::().unwrap(); + + if let Some(action_script) = + state.action_scripts.get(&request.action_id) + { + lua.scope(|scope| { + let connection_data = scope + .create_userdata_ref_mut(&mut lua_player) + .unwrap(); + + let file_name = format!( + "{}/{}", + &config.world.scripts_location, + action_script + ); + lua.load(std::fs::read(&file_name).expect( + "Failed to locate scripts directory!", + )) + .set_name("@".to_string() + &file_name) + .exec() .unwrap(); - let func: Function = - lua.globals().get("doAction").unwrap(); + let func: Function = + lua.globals().get("doAction").unwrap(); - func.call::<()>(connection_data).unwrap(); + func.call::<()>(connection_data).unwrap(); - Ok(()) - }) - .unwrap(); + Ok(()) + }) + .unwrap(); + } } // tell them the action results diff --git a/src/world/database.rs b/src/world/database.rs index 7e0352b..e671c9a 100644 --- a/src/world/database.rs +++ b/src/world/database.rs @@ -5,7 +5,8 @@ use rusqlite::Connection; use crate::{ common::Position, lobby::{ - ipc::{CharacterDetails, CharacterFlag}, CharaMake, ClientSelectData, RemakeMode + CharaMake, ClientSelectData, RemakeMode, + ipc::{CharacterDetails, CharacterFlag}, }, };