diff --git a/Cargo.lock b/Cargo.lock index 106267a..31e6c2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,6 +333,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" version = "0.3.11" @@ -904,11 +914,14 @@ checksum = "d3f763c1041eff92ffb5d7169968a327e1ed2ebfe425dac0ee5a35f29082534b" dependencies = [ "bstr", "either", + "erased-serde", "futures-util", "mlua-sys", "num-traits", "parking_lot", "rustc-hash", + "serde", + "serde-value", ] [[package]] @@ -954,6 +967,15 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "parking_lot" version = "0.12.3" @@ -1199,6 +1221,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.219" @@ -1492,6 +1524,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/Cargo.toml b/Cargo.toml index 5ad60e2..ac54a86 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -87,7 +87,7 @@ rusqlite = { version = "0.34", features = ["bundled"], default-features = false bitflags = { version = "1.3", default-features = false } # For server-side scripting -mlua = { version = "0.10", features = ["lua51", "vendored", "send", "async"], default-features = false } +mlua = { version = "0.10", features = ["lua51", "vendored", "send", "async", "serialize"], default-features = false } # For character backup decompression zip = { version = "2.6", features = ["deflate", "lzma", "bzip2"], default-features = false } diff --git a/resources/scripts/actions/FastBlade.lua b/resources/scripts/actions/FastBlade.lua index ee25683..d9595ef 100644 --- a/resources/scripts/actions/FastBlade.lua +++ b/resources/scripts/actions/FastBlade.lua @@ -1,6 +1,6 @@ function doAction(player) effects = EffectsBuilder() - effects:damage(20) + effects:damage("Normal", "Slashing", "Unaspected", 20) return effects end diff --git a/src/world/ipc/action_result.rs b/src/world/ipc/action_result.rs index 103fa6f..033f06e 100644 --- a/src/world/ipc/action_result.rs +++ b/src/world/ipc/action_result.rs @@ -1,10 +1,11 @@ use binrw::binrw; +use serde::{Deserialize, Serialize}; use crate::common::{ObjectTypeId, read_quantized_rotation, write_quantized_rotation}; // TODO: this might be a flag? #[binrw] -#[derive(Debug, Eq, PartialEq, Clone, Copy, Default)] +#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)] #[brw(repr = u8)] pub enum DamageKind { #[default] @@ -40,7 +41,7 @@ pub enum EffectKind { BeginCombo, } -#[derive(Debug, Eq, PartialEq, Clone, Copy, Default)] +#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)] pub enum DamageType { Unknown, Slashing, @@ -71,7 +72,7 @@ impl From for DamageType { } } -#[derive(Debug, Eq, PartialEq, Clone, Copy, Default)] +#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)] pub enum DamageElement { Unknown, Fire, diff --git a/src/world/lua.rs b/src/world/lua.rs index c925acc..6185ff1 100644 --- a/src/world/lua.rs +++ b/src/world/lua.rs @@ -1,4 +1,4 @@ -use mlua::{FromLua, Lua, UserData, UserDataMethods, Value}; +use mlua::{FromLua, Lua, LuaSerdeExt, UserData, UserDataMethods, Value}; use crate::{ common::{ObjectId, ObjectTypeId, Position, timestamp_secs}, @@ -172,12 +172,16 @@ pub struct EffectsBuilder { impl UserData for EffectsBuilder { fn add_methods>(methods: &mut M) { - methods.add_method_mut("damage", |_, this, amount: u16| { + methods.add_method_mut("damage", |lua, this, (damage_kind, damage_type, damage_element, amount): (Value, Value, Value, u16)| { + let damage_kind: DamageKind = lua.from_value(damage_kind).unwrap(); + let damage_type: DamageType = lua.from_value(damage_type).unwrap(); + let damage_element: DamageElement = lua.from_value(damage_element).unwrap(); + this.effects.push(ActionEffect { kind: EffectKind::Damage { - damage_kind: DamageKind::Normal, - damage_type: DamageType::Slashing, - damage_element: DamageElement::Unaspected, + damage_kind, + damage_type, + damage_element, bonus_percent: 0, unk3: 0, unk4: 0,