2025-03-28 21:28:30 -04:00
|
|
|
use mlua::{Function, Lua};
|
|
|
|
|
2025-05-05 21:15:03 -04:00
|
|
|
use crate::{common::ObjectTypeId, config::get_config};
|
2025-03-28 21:28:30 -04:00
|
|
|
|
2025-03-28 22:34:34 -04:00
|
|
|
use super::{LuaPlayer, Zone};
|
2025-03-28 21:28:30 -04:00
|
|
|
|
|
|
|
pub struct Event {
|
2025-06-22 08:49:06 -04:00
|
|
|
pub file_name: String,
|
2025-03-28 21:28:30 -04:00
|
|
|
lua: Lua,
|
2025-06-22 08:49:06 -04:00
|
|
|
pub id: u32,
|
2025-03-28 21:28:30 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Event {
|
2025-05-05 23:30:36 -04:00
|
|
|
pub fn new(id: u32, path: &str) -> Self {
|
2025-03-28 21:28:30 -04:00
|
|
|
let lua = Lua::new();
|
|
|
|
|
|
|
|
let config = get_config();
|
|
|
|
let file_name = format!("{}/{}", &config.world.scripts_location, path);
|
2025-06-22 08:35:03 -04:00
|
|
|
|
2025-06-22 09:05:54 -04:00
|
|
|
let result = std::fs::read(&file_name);
|
|
|
|
if let Err(err) = std::fs::read(&file_name) {
|
|
|
|
tracing::warn!("Failed to load {}: {:?}", file_name, err);
|
|
|
|
return Self { file_name, lua, id };
|
|
|
|
}
|
|
|
|
let file = result.unwrap();
|
|
|
|
|
|
|
|
if let Err(err) = lua.load(file).set_name("@".to_string() + &file_name).exec() {
|
2025-06-22 08:35:03 -04:00
|
|
|
tracing::warn!("Syntax error in {}: {:?}", file_name, err);
|
2025-06-22 08:49:06 -04:00
|
|
|
return Self { file_name, lua, id };
|
2025-06-22 08:35:03 -04:00
|
|
|
}
|
2025-03-28 21:28:30 -04:00
|
|
|
|
2025-05-05 23:30:36 -04:00
|
|
|
lua.globals().set("EVENT_ID", id).unwrap();
|
|
|
|
|
2025-06-22 08:49:06 -04:00
|
|
|
Self { file_name, lua, id }
|
2025-03-28 21:28:30 -04:00
|
|
|
}
|
|
|
|
|
2025-03-28 22:34:34 -04:00
|
|
|
pub fn enter_territory(&mut self, player: &mut LuaPlayer, zone: &Zone) {
|
2025-06-22 08:35:03 -04:00
|
|
|
let mut run_script = || {
|
|
|
|
self.lua.scope(|scope| {
|
|
|
|
let player = scope.create_userdata_ref_mut(player)?;
|
|
|
|
let zone = scope.create_userdata_ref(zone)?;
|
2025-03-28 21:28:30 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
let func: Function = self.lua.globals().get("onEnterTerritory")?;
|
2025-03-28 21:28:30 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
func.call::<()>((player, zone))?;
|
2025-03-28 21:28:30 -04:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
2025-06-22 08:35:03 -04:00
|
|
|
};
|
|
|
|
if let Err(err) = run_script() {
|
|
|
|
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
|
|
|
|
}
|
2025-03-28 21:28:30 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn scene_finished(&mut self, player: &mut LuaPlayer, scene: u16) {
|
2025-06-22 08:35:03 -04:00
|
|
|
let mut run_script = || {
|
|
|
|
self.lua.scope(|scope| {
|
|
|
|
let player = scope.create_userdata_ref_mut(player)?;
|
2025-03-28 21:28:30 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
let func: Function = self.lua.globals().get("onSceneFinished")?;
|
2025-03-28 21:28:30 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
func.call::<()>((player, scene))?;
|
2025-03-28 21:28:30 -04:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
2025-06-22 08:35:03 -04:00
|
|
|
};
|
|
|
|
if let Err(err) = run_script() {
|
|
|
|
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
|
|
|
|
}
|
2025-03-28 21:28:30 -04:00
|
|
|
}
|
2025-05-05 21:15:03 -04:00
|
|
|
|
|
|
|
pub fn talk(&mut self, target_id: ObjectTypeId, player: &mut LuaPlayer) {
|
2025-06-22 08:35:03 -04:00
|
|
|
let mut run_script = || {
|
|
|
|
self.lua.scope(|scope| {
|
|
|
|
let player = scope.create_userdata_ref_mut(player)?;
|
2025-05-05 21:15:03 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
let func: Function = self.lua.globals().get("onTalk")?;
|
2025-05-05 21:15:03 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
func.call::<()>((target_id, player))?;
|
2025-05-05 21:15:03 -04:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
2025-06-22 08:35:03 -04:00
|
|
|
};
|
|
|
|
if let Err(err) = run_script() {
|
|
|
|
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
|
|
|
|
}
|
2025-05-05 21:15:03 -04:00
|
|
|
}
|
2025-05-05 22:04:39 -04:00
|
|
|
|
2025-06-25 23:28:12 -04:00
|
|
|
pub fn finish(&mut self, scene: u16, results: &[i32], player: &mut LuaPlayer) {
|
2025-06-22 08:35:03 -04:00
|
|
|
let mut run_script = || {
|
|
|
|
self.lua.scope(|scope| {
|
|
|
|
let player = scope.create_userdata_ref_mut(player)?;
|
2025-05-05 22:04:39 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
let func: Function = self.lua.globals().get("onReturn")?;
|
2025-05-05 22:04:39 -04:00
|
|
|
|
2025-06-22 08:35:03 -04:00
|
|
|
func.call::<()>((scene, results, player))?;
|
2025-05-05 22:04:39 -04:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
2025-06-22 08:35:03 -04:00
|
|
|
};
|
|
|
|
if let Err(err) = run_script() {
|
|
|
|
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
|
|
|
|
}
|
2025-05-05 22:04:39 -04:00
|
|
|
}
|
2025-03-28 21:28:30 -04:00
|
|
|
}
|