azalea_entity/
particle.rs

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