Skip to main content

azalea_entity/
particle.rs

1use azalea_block::BlockState;
2use azalea_buf::AzBuf;
3use azalea_core::{color::RgbColor, entity_id::MinecraftEntityId, position::BlockPos};
4use azalea_inventory::ItemStack;
5use azalea_registry::builtin::ParticleKind;
6
7// the order of this enum must be kept in sync with ParticleKind, otherwise
8// we get errors parsing particles.
9
10/// A [`ParticleKind`] with data potentially attached to it.
11#[cfg_attr(feature = "bevy_ecs", derive(bevy_ecs::component::Component))]
12#[derive(AzBuf, Clone, Debug, PartialEq)]
13pub enum Particle {
14    AngryVillager,
15    Block(BlockParticle),
16    BlockMarker(BlockParticle),
17    Bubble,
18    Cloud,
19    CopperFireFlame,
20    Crit,
21    DamageIndicator,
22    DragonBreath,
23    DrippingLava,
24    FallingLava,
25    LandingLava,
26    DrippingWater,
27    FallingWater,
28    Dust(DustParticle),
29    DustColorTransition(DustColorTransitionParticle),
30    Effect,
31    ElderGuardian,
32    EnchantedHit,
33    Enchant,
34    EndRod,
35    EntityEffect(ColorParticle),
36    ExplosionEmitter,
37    Explosion,
38    Gust,
39    SmallGust,
40    GustEmitterLarge,
41    GustEmitterSmall,
42    SonicBoom,
43    FallingDust(BlockParticle),
44    Firework,
45    Fishing,
46    Flame,
47    Infested,
48    CherryLeaves,
49    PaleOakLeaves,
50    TintedLeaves,
51    SculkSoul,
52    SculkCharge(SculkChargeParticle),
53    SculkChargePop,
54    SoulFireFlame,
55    Soul,
56    Flash,
57    HappyVillager,
58    Composter,
59    Heart,
60    InstantEffect,
61    Item(ItemParticle),
62    Vibration(Box<VibrationParticle>),
63    Trail,
64    PauseMobGrowth,
65    ResetMobGrowth,
66    ItemSlime,
67    ItemCobweb,
68    ItemSnowball,
69    LargeSmoke,
70    Lava,
71    Mycelium,
72    Note,
73    Poof,
74    Portal,
75    Rain,
76    Smoke,
77    WhiteSmoke,
78    Sneeze,
79    Spit,
80    SquidInk,
81    SweepAttack,
82    TotemOfUndying,
83    Underwater,
84    Splash,
85    Witch,
86    BubblePop,
87    CurrentDown,
88    BubbleColumnUp,
89    Nautilus,
90    Dolphin,
91    CampfireCosySmoke,
92    CampfireSignalSmoke,
93    DrippingHoney,
94    FallingHoney,
95    LandingHoney,
96    FallingNectar,
97    FallingSporeBlossom,
98    Ash,
99    CrimsonSpore,
100    WarpedSpore,
101    SporeBlossomAir,
102    DrippingObsidianTear,
103    FallingObsidianTear,
104    LandingObsidianTear,
105    ReversePortal,
106    WhiteAsh,
107    SmallFlame,
108    Snowflake,
109    DrippingDripstoneLava,
110    FallingDripstoneLava,
111    DrippingDripstoneWater,
112    FallingDripstoneWater,
113    GlowSquidInk,
114    Glow,
115    WaxOn,
116    WaxOff,
117    ElectricSpark,
118    Scrape,
119    Shriek(ShriekParticle),
120    EggCrack,
121    DustPlume,
122    TrialSpawnerDetection,
123    TrialSpawnerDetectionOminous,
124    VaultConnection,
125    DustPillar,
126    OminousSpawning,
127    RaidOmen,
128    TrialOmen,
129    BlockCrumble,
130    Firefly,
131}
132
133impl From<ParticleKind> for Particle {
134    /// Convert a particle kind into particle data.
135    ///
136    /// If the particle has data attached (like block particles), then it's set
137    /// to the default.
138    fn from(kind: ParticleKind) -> Self {
139        // this is mostly just here so it fails to compile when a new particle is added
140        // to ParticleKind, since `Particle` has to be updated manually
141        match kind {
142            ParticleKind::AngryVillager => Self::AngryVillager,
143            ParticleKind::Block => Self::Block(BlockParticle::default()),
144            ParticleKind::BlockMarker => Self::BlockMarker(BlockParticle::default()),
145            ParticleKind::Bubble => Self::Bubble,
146            ParticleKind::Cloud => Self::Cloud,
147            ParticleKind::Crit => Self::Crit,
148            ParticleKind::DamageIndicator => Self::DamageIndicator,
149            ParticleKind::DragonBreath => Self::DragonBreath,
150            ParticleKind::DrippingLava => Self::DrippingLava,
151            ParticleKind::FallingLava => Self::FallingLava,
152            ParticleKind::LandingLava => Self::LandingLava,
153            ParticleKind::DrippingWater => Self::DrippingWater,
154            ParticleKind::FallingWater => Self::FallingWater,
155            ParticleKind::Dust => Self::Dust(DustParticle::default()),
156            ParticleKind::DustColorTransition => {
157                Self::DustColorTransition(DustColorTransitionParticle::default())
158            }
159            ParticleKind::Effect => Self::Effect,
160            ParticleKind::ElderGuardian => Self::ElderGuardian,
161            ParticleKind::EnchantedHit => Self::EnchantedHit,
162            ParticleKind::Enchant => Self::Enchant,
163            ParticleKind::EndRod => Self::EndRod,
164            ParticleKind::EntityEffect => Self::EntityEffect(ColorParticle::default()),
165            ParticleKind::ExplosionEmitter => Self::ExplosionEmitter,
166            ParticleKind::Explosion => Self::Explosion,
167            ParticleKind::Gust => Self::Gust,
168            ParticleKind::SonicBoom => Self::SonicBoom,
169            ParticleKind::FallingDust => Self::FallingDust(BlockParticle::default()),
170            ParticleKind::Firework => Self::Firework,
171            ParticleKind::Fishing => Self::Fishing,
172            ParticleKind::Flame => Self::Flame,
173            ParticleKind::CherryLeaves => Self::CherryLeaves,
174            ParticleKind::PaleOakLeaves => Self::PaleOakLeaves,
175            ParticleKind::TintedLeaves => Self::TintedLeaves,
176            ParticleKind::SculkSoul => Self::SculkSoul,
177            ParticleKind::SculkCharge => Self::SculkCharge(SculkChargeParticle::default()),
178            ParticleKind::SculkChargePop => Self::SculkChargePop,
179            ParticleKind::SoulFireFlame => Self::SoulFireFlame,
180            ParticleKind::Soul => Self::Soul,
181            ParticleKind::Flash => Self::Flash,
182            ParticleKind::HappyVillager => Self::HappyVillager,
183            ParticleKind::Composter => Self::Composter,
184            ParticleKind::Heart => Self::Heart,
185            ParticleKind::InstantEffect => Self::InstantEffect,
186            ParticleKind::Item => Self::Item(ItemParticle::default()),
187            ParticleKind::Vibration => Self::Vibration(Default::default()),
188            ParticleKind::ItemSlime => Self::ItemSlime,
189            ParticleKind::ItemSnowball => Self::ItemSnowball,
190            ParticleKind::LargeSmoke => Self::LargeSmoke,
191            ParticleKind::Lava => Self::Lava,
192            ParticleKind::Mycelium => Self::Mycelium,
193            ParticleKind::Note => Self::Note,
194            ParticleKind::Poof => Self::Poof,
195            ParticleKind::Portal => Self::Portal,
196            ParticleKind::Rain => Self::Rain,
197            ParticleKind::Smoke => Self::Smoke,
198            ParticleKind::WhiteSmoke => Self::WhiteSmoke,
199            ParticleKind::Sneeze => Self::Sneeze,
200            ParticleKind::Spit => Self::Spit,
201            ParticleKind::SquidInk => Self::SquidInk,
202            ParticleKind::SweepAttack => Self::SweepAttack,
203            ParticleKind::TotemOfUndying => Self::TotemOfUndying,
204            ParticleKind::Underwater => Self::Underwater,
205            ParticleKind::Splash => Self::Splash,
206            ParticleKind::Witch => Self::Witch,
207            ParticleKind::BubblePop => Self::BubblePop,
208            ParticleKind::CurrentDown => Self::CurrentDown,
209            ParticleKind::BubbleColumnUp => Self::BubbleColumnUp,
210            ParticleKind::Nautilus => Self::Nautilus,
211            ParticleKind::Dolphin => Self::Dolphin,
212            ParticleKind::CampfireCosySmoke => Self::CampfireCosySmoke,
213            ParticleKind::CampfireSignalSmoke => Self::CampfireSignalSmoke,
214            ParticleKind::DrippingHoney => Self::DrippingHoney,
215            ParticleKind::FallingHoney => Self::FallingHoney,
216            ParticleKind::LandingHoney => Self::LandingHoney,
217            ParticleKind::FallingNectar => Self::FallingNectar,
218            ParticleKind::FallingSporeBlossom => Self::FallingSporeBlossom,
219            ParticleKind::Ash => Self::Ash,
220            ParticleKind::CrimsonSpore => Self::CrimsonSpore,
221            ParticleKind::WarpedSpore => Self::WarpedSpore,
222            ParticleKind::SporeBlossomAir => Self::SporeBlossomAir,
223            ParticleKind::DrippingObsidianTear => Self::DrippingObsidianTear,
224            ParticleKind::FallingObsidianTear => Self::FallingObsidianTear,
225            ParticleKind::LandingObsidianTear => Self::LandingObsidianTear,
226            ParticleKind::ReversePortal => Self::ReversePortal,
227            ParticleKind::WhiteAsh => Self::WhiteAsh,
228            ParticleKind::SmallFlame => Self::SmallFlame,
229            ParticleKind::Snowflake => Self::Snowflake,
230            ParticleKind::DrippingDripstoneLava => Self::DrippingDripstoneLava,
231            ParticleKind::FallingDripstoneLava => Self::FallingDripstoneLava,
232            ParticleKind::DrippingDripstoneWater => Self::DrippingDripstoneWater,
233            ParticleKind::FallingDripstoneWater => Self::FallingDripstoneWater,
234            ParticleKind::GlowSquidInk => Self::GlowSquidInk,
235            ParticleKind::Glow => Self::Glow,
236            ParticleKind::WaxOn => Self::WaxOn,
237            ParticleKind::WaxOff => Self::WaxOff,
238            ParticleKind::ElectricSpark => Self::ElectricSpark,
239            ParticleKind::Scrape => Self::Scrape,
240            ParticleKind::Shriek => Self::Shriek(ShriekParticle::default()),
241            ParticleKind::EggCrack => Self::EggCrack,
242            ParticleKind::DustPlume => Self::DustPlume,
243            ParticleKind::SmallGust => Self::SmallGust,
244            ParticleKind::GustEmitterLarge => Self::GustEmitterLarge,
245            ParticleKind::GustEmitterSmall => Self::GustEmitterSmall,
246            ParticleKind::Infested => Self::Infested,
247            ParticleKind::ItemCobweb => Self::ItemCobweb,
248            ParticleKind::TrialSpawnerDetection => Self::TrialSpawnerDetection,
249            ParticleKind::TrialSpawnerDetectionOminous => Self::TrialSpawnerDetectionOminous,
250            ParticleKind::VaultConnection => Self::VaultConnection,
251            ParticleKind::DustPillar => Self::DustPillar,
252            ParticleKind::OminousSpawning => Self::OminousSpawning,
253            ParticleKind::RaidOmen => Self::RaidOmen,
254            ParticleKind::TrialOmen => Self::TrialOmen,
255            ParticleKind::Trail => Self::Trail,
256            ParticleKind::BlockCrumble => Self::BlockCrumble,
257            ParticleKind::Firefly => Self::Firefly,
258            ParticleKind::CopperFireFlame => Self::CopperFireFlame,
259            ParticleKind::PauseMobGrowth => Self::PauseMobGrowth,
260            ParticleKind::ResetMobGrowth => Self::ResetMobGrowth,
261        }
262    }
263}
264
265impl Default for Particle {
266    fn default() -> Self {
267        Self::EntityEffect(ColorParticle::default())
268    }
269}
270
271#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
272pub struct BlockParticle {
273    pub block_state: BlockState,
274}
275#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
276pub struct DustParticle {
277    pub color: RgbColor,
278    /// The scale, will be clamped between 0.01 and 4.
279    pub scale: f32,
280}
281
282#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
283pub struct DustColorTransitionParticle {
284    pub from: RgbColor,
285    pub to: RgbColor,
286    /// The scale, will be clamped between 0.01 and 4.
287    pub scale: f32,
288}
289
290#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
291pub struct ColorParticle {
292    pub color: RgbColor,
293}
294
295#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
296pub struct ItemParticle {
297    pub item: ItemStack,
298}
299
300#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
301pub struct VibrationParticle {
302    pub position: PositionSource,
303    #[var]
304    pub ticks: u32,
305}
306
307#[derive(AzBuf, Clone, Debug, PartialEq)]
308pub enum PositionSource {
309    Block(BlockPos),
310    Entity {
311        #[var]
312        id: MinecraftEntityId,
313        y_offset: f32,
314    },
315}
316impl Default for PositionSource {
317    fn default() -> Self {
318        // bad default but hopefully it never gets used anyways
319        Self::Block(BlockPos::default())
320    }
321}
322
323#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
324pub struct SculkChargeParticle {
325    pub roll: f32,
326}
327
328#[derive(AzBuf, Clone, Debug, Default, PartialEq)]
329pub struct ShriekParticle {
330    #[var]
331    pub delay: i32, // The time in ticks before the particle is displayed
332}