1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-07-21 12:17:45 +00:00
kawari/src/world/event.rs

102 lines
2.9 KiB
Rust
Raw Normal View History

use mlua::{Function, Lua};
use crate::{common::ObjectTypeId, config::get_config};
use super::{LuaPlayer, Zone};
pub struct Event {
file_name: String,
lua: Lua,
}
impl Event {
pub fn new(id: u32, path: &str) -> Self {
let lua = Lua::new();
let config = get_config();
let file_name = format!("{}/{}", &config.world.scripts_location, path);
if let Err(err) = lua
.load(std::fs::read(&file_name).expect("Failed to locate scripts directory!"))
.set_name("@".to_string() + &file_name)
.exec()
{
tracing::warn!("Syntax error in {}: {:?}", file_name, err);
return Self { file_name, lua };
}
lua.globals().set("EVENT_ID", id).unwrap();
Self { file_name, lua }
}
pub fn enter_territory(&mut self, player: &mut LuaPlayer, zone: &Zone) {
let mut run_script = || {
self.lua.scope(|scope| {
let player = scope.create_userdata_ref_mut(player)?;
let zone = scope.create_userdata_ref(zone)?;
let func: Function = self.lua.globals().get("onEnterTerritory")?;
func.call::<()>((player, zone))?;
Ok(())
})
};
if let Err(err) = run_script() {
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
}
}
pub fn scene_finished(&mut self, player: &mut LuaPlayer, scene: u16) {
let mut run_script = || {
self.lua.scope(|scope| {
let player = scope.create_userdata_ref_mut(player)?;
let func: Function = self.lua.globals().get("onSceneFinished")?;
func.call::<()>((player, scene))?;
Ok(())
})
};
if let Err(err) = run_script() {
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
}
}
pub fn talk(&mut self, target_id: ObjectTypeId, player: &mut LuaPlayer) {
let mut run_script = || {
self.lua.scope(|scope| {
let player = scope.create_userdata_ref_mut(player)?;
let func: Function = self.lua.globals().get("onTalk")?;
func.call::<()>((target_id, player))?;
Ok(())
})
};
if let Err(err) = run_script() {
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
}
}
pub fn finish(&mut self, scene: u16, results: &[u32], player: &mut LuaPlayer) {
let mut run_script = || {
self.lua.scope(|scope| {
let player = scope.create_userdata_ref_mut(player)?;
let func: Function = self.lua.globals().get("onReturn")?;
func.call::<()>((scene, results, player))?;
Ok(())
})
};
if let Err(err) = run_script() {
tracing::warn!("Syntax error in {}: {:?}", self.file_name, err);
}
}
}