valence_entity/
flags.rs

1use super::*;
2
3// TODO: should `set_if_neq` behavior be the default behavior for setters?
4macro_rules! flags {
5    (
6        $(
7            $component:path {
8                $($flag:ident: $offset:literal),* $(,)?
9            }
10        )*
11
12    ) => {
13        $(
14            impl $component {
15                $(
16                    #[doc = "Gets the bit at offset "]
17                    #[doc = stringify!($offset)]
18                    #[doc = "."]
19                    #[inline]
20                    pub const fn $flag(&self) -> bool {
21                        (self.0 >> $offset) & 1 == 1
22                    }
23
24                    paste! {
25                        #[doc = "Sets the bit at offset "]
26                        #[doc = stringify!($offset)]
27                        #[doc = "."]
28                        #[inline]
29                        pub fn [< set_$flag >] (&mut self, $flag: bool) {
30                            self.0 = (self.0 & !(1 << $offset)) | ((i8::from($flag)) << $offset);
31                        }
32                    }
33                )*
34            }
35        )*
36    }
37}
38
39flags! {
40    entity::Flags {
41        on_fire: 0,
42        sneaking: 1,
43        sprinting: 3,
44        swimming: 4,
45        invisible: 5,
46        glowing: 6,
47        fall_flying: 7,
48    }
49    persistent_projectile::ProjectileFlags {
50        critical: 0,
51        no_clip: 1,
52    }
53    living::LivingFlags {
54        using_item: 0,
55        off_hand_active: 1,
56        using_riptide: 2,
57    }
58    player::PlayerModelParts {
59        cape: 0,
60        jacket: 1,
61        left_sleeve: 2,
62        right_sleeve: 3,
63        left_pants_leg: 4,
64        right_pants_leg: 5,
65        hat: 6,
66    }
67    player::MainArm {
68        right: 0,
69    }
70    armor_stand::ArmorStandFlags {
71        small: 0,
72        show_arms: 1,
73        hide_base_plate: 2,
74        marker: 3,
75    }
76    mob::MobFlags {
77        ai_disabled: 0,
78        left_handed: 1,
79        attacking: 2,
80    }
81    bat::BatFlags {
82        hanging: 0,
83    }
84    abstract_horse::HorseFlags {
85        tamed: 1,
86        saddled: 2,
87        bred: 3,
88        eating_grass: 4,
89        angry: 5,
90        eating: 6,
91    }
92    fox::FoxFlags {
93        sitting: 0,
94        crouching: 2,
95        rolling_head: 3,
96        chasing: 4,
97        sleeping: 5,
98        walking: 6,
99        aggressive: 7,
100    }
101    panda::PandaFlags {
102        sneezing: 1,
103        playing: 2,
104        sitting: 3,
105        lying_on_back: 4,
106    }
107    tameable::TameableFlags {
108        sitting_pose: 0,
109        tamed: 2,
110    }
111    iron_golem::IronGolemFlags {
112        player_created: 0,
113    }
114    snow_golem::SnowGolemFlags {
115        has_pumpkin: 4,
116    }
117    blaze::BlazeFlags {
118        fire_active: 0,
119    }
120    vex::VexFlags {
121        charging: 0,
122    }
123    spider::SpiderFlags {
124        climbing_wall: 0,
125    }
126}
127
128#[cfg(test)]
129mod tests {
130    use super::*;
131
132    #[test]
133    fn get_set_flags() {
134        let mut flags = entity::Flags(0);
135
136        flags.set_on_fire(true);
137        let before = flags.clone();
138        assert_ne!(flags.0, 0);
139        flags.set_on_fire(true);
140        assert_eq!(before, flags);
141        flags.set_on_fire(false);
142        assert_eq!(flags.0, 0);
143    }
144}