aboutsummaryrefslogtreecommitdiff
path: root/azalea-core/src/delta.rs
blob: c00564113793222cd68d2ecf05910f5933c9fc6b (plain)
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
60
61
62
63
64
65
66
67
68
use crate::EntityPos;
pub use azalea_buf::McBuf;

pub trait PositionDeltaTrait {
    fn x(&self) -> f64;
    fn y(&self) -> f64;
    fn z(&self) -> f64;
}

#[derive(Clone, Debug, McBuf, Default)]
pub struct PositionDelta {
    pub xa: f64,
    pub ya: f64,
    pub za: f64,
}

/// Only works for up to 8 blocks
#[derive(Clone, Debug, McBuf, Default)]
pub struct PositionDelta8 {
    pub xa: i16,
    pub ya: i16,
    pub za: i16,
}

impl PositionDeltaTrait for PositionDelta {
    fn x(&self) -> f64 {
        self.xa
    }
    fn y(&self) -> f64 {
        self.ya
    }
    fn z(&self) -> f64 {
        self.za
    }
}

impl PositionDelta8 {
    #[deprecated]
    pub fn float(&self) -> (f64, f64, f64) {
        (
            (self.xa as f64) / 4096.0,
            (self.ya as f64) / 4096.0,
            (self.za as f64) / 4096.0,
        )
    }
}

impl PositionDeltaTrait for PositionDelta8 {
    fn x(&self) -> f64 {
        (self.xa as f64) / 4096.0
    }
    fn y(&self) -> f64 {
        (self.ya as f64) / 4096.0
    }
    fn z(&self) -> f64 {
        (self.za as f64) / 4096.0
    }
}

impl EntityPos {
    pub fn with_delta(&self, delta: &dyn PositionDeltaTrait) -> EntityPos {
        EntityPos {
            x: self.x + delta.x(),
            y: self.y + delta.y(),
            z: self.z + delta.z(),
        }
    }
}