1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use super::{as_tbl, cvt_err, unit::Unit, weapon::Weapon, Position3, String, LuaVec3};
use crate::{simple_enum, wrapped_table};
use mlua::{prelude::*, Value};
use serde_derive::{Serialize, Deserialize};
use std::ops::Deref;

simple_enum!(ObjectCategory, u8, [
    Void => 0,
    Unit => 1,
    Weapon => 2,
    Static => 3,
    Base => 4,
    Scenery => 5,
    Cargo => 6
]);

wrapped_table!(Object, Some("Object"));

impl<'lua> Object<'lua> {
    pub fn destroy(&self) -> LuaResult<()> {
        self.t.call_method("destroy", ())
    }

    pub fn get_category(&self) -> LuaResult<ObjectCategory> {
        self.t.call_method("getCategory", ())
    }

    pub fn get_desc(&self) -> LuaResult<mlua::Table<'lua>> {
        self.t.call_method("getDesc", ())
    }

    pub fn get_name(&self) -> LuaResult<String> {
        self.t.call_method("getName", ())
    }

    pub fn get_point(&self) -> LuaResult<LuaVec3> {
        self.t.call_method("getPoint", ())
    }

    pub fn get_position(&self) -> LuaResult<Position3> {
        self.t.call_method("getPosition", ())
    }

    pub fn get_velocity(&self) -> LuaResult<LuaVec3> {
        self.t.call_method("getPosition", ())
    }

    pub fn in_air(&self) -> LuaResult<bool> {
        self.t.call_method("inAir", ())
    }

    pub fn as_unit(&self) -> LuaResult<Unit> {
        Unit::from_lua(Value::Table(self.t.clone()), self.lua)
    }

    pub fn as_weapon(&self) -> LuaResult<Weapon> {
        Weapon::from_lua(Value::Table(self.t.clone()), self.lua)
    }
}