diff options
| author | ShayBox <shaybox@shaybox.com> | 2025-10-30 12:14:19 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-30 11:14:19 -0500 |
| commit | 818f2d01d49e574946d1a704e1445156afc9c2fb (patch) | |
| tree | 4190ce61994e7d1280cbcd6b43811fa9f6b03b09 /azalea-client/src | |
| parent | c7cc381fae569f3dfc9f2abe86c2c38d59b68cf2 (diff) | |
| download | azalea-drasl-818f2d01d49e574946d1a704e1445156afc9c2fb.tar.xz | |
Add support for mob effects (#269)
* Add support for mob effects
* Remove Option
* MobEffectFlags
* jump_boost_power f32
Diffstat (limited to 'azalea-client/src')
| -rw-r--r-- | azalea-client/src/plugins/mining.rs | 10 | ||||
| -rw-r--r-- | azalea-client/src/plugins/packet/game/mod.rs | 75 |
2 files changed, 81 insertions, 4 deletions
diff --git a/azalea-client/src/plugins/mining.rs b/azalea-client/src/plugins/mining.rs index 101cd4df..b3880c00 100644 --- a/azalea-client/src/plugins/mining.rs +++ b/azalea-client/src/plugins/mining.rs @@ -1,6 +1,8 @@ use azalea_block::{BlockState, BlockTrait, fluid_state::FluidState}; use azalea_core::{direction::Direction, game_type::GameMode, position::BlockPos, tick::GameTick}; -use azalea_entity::{FluidOnEyes, Physics, PlayerAbilities, Position, mining::get_mine_progress}; +use azalea_entity::{ + ActiveEffects, FluidOnEyes, Physics, PlayerAbilities, Position, mining::get_mine_progress, +}; use azalea_inventory::ItemStack; use azalea_physics::{PhysicsSystems, collision::BlockWithShape}; use azalea_protocol::packets::game::s_player_action::{self, ServerboundPlayerAction}; @@ -243,6 +245,7 @@ pub fn handle_mining_queued( &InstanceHolder, &LocalGameMode, &Inventory, + &ActiveEffects, &FluidOnEyes, &Physics, Option<&mut Mining>, @@ -260,6 +263,7 @@ pub fn handle_mining_queued( instance_holder, game_mode, inventory, + active_effects, fluid_on_eyes, physics, mut mining, @@ -359,6 +363,7 @@ pub fn handle_mining_queued( &inventory.inventory_menu, fluid_on_eyes, physics, + active_effects, ) >= 1. { // block was broken instantly (instamined) @@ -593,6 +598,7 @@ pub fn continue_mining_block( &Inventory, &MineBlockPos, &MineItem, + &ActiveEffects, &FluidOnEyes, &Physics, &Mining, @@ -612,6 +618,7 @@ pub fn continue_mining_block( inventory, current_mining_pos, current_mining_item, + active_effects, fluid_on_eyes, physics, mining, @@ -669,6 +676,7 @@ pub fn continue_mining_block( &inventory.inventory_menu, fluid_on_eyes, physics, + active_effects, ); if **mine_ticks % 4. == 0. { diff --git a/azalea-client/src/plugins/packet/game/mod.rs b/azalea-client/src/plugins/packet/game/mod.rs index 46cfd531..40446cee 100644 --- a/azalea-client/src/plugins/packet/game/mod.rs +++ b/azalea-client/src/plugins/packet/game/mod.rs @@ -7,8 +7,8 @@ use azalea_core::{ position::{ChunkPos, Vec3}, }; use azalea_entity::{ - Dead, EntityBundle, EntityKindComponent, HasClientLoaded, LoadedBy, LocalEntity, LookDirection, - Physics, PlayerAbilities, Position, RelativeEntityUpdate, + ActiveEffects, Dead, EntityBundle, EntityKindComponent, HasClientLoaded, LoadedBy, LocalEntity, + LookDirection, MobEffectData, Physics, PlayerAbilities, Position, RelativeEntityUpdate, indexing::{EntityIdIndex, EntityUuidIndex}, metadata::{Health, apply_metadata}, }; @@ -1106,6 +1106,46 @@ impl GamePacketHandler<'_> { pub fn update_mob_effect(&mut self, p: &ClientboundUpdateMobEffect) { debug!("Got update mob effect packet {p:?}"); + + let mob_effect = p.mob_effect; + let effect_data = MobEffectData::new( + p.effect_amplifier, + p.effect_duration_ticks, + p.flags.ambient, + p.flags.show_particles, + p.flags.show_icon, + ); + + as_system::<(Commands, Query<(&EntityIdIndex, &InstanceHolder)>)>( + self.ecs, + |(mut commands, query)| { + let (entity_id_index, instance_holder) = query.get(self.player).unwrap(); + + let Some(entity) = entity_id_index.get_by_minecraft_entity(p.entity_id) else { + debug!( + "Got update mob effect packet for unknown entity id {}", + p.entity_id + ); + return; + }; + + let partial_instance = instance_holder.partial_instance.clone(); + let mob_effect = mob_effect; + let effect_data = effect_data.clone(); + commands.entity(entity).queue(RelativeEntityUpdate::new( + partial_instance, + move |entity| { + if let Some(mut active_effects) = entity.get_mut::<ActiveEffects>() { + active_effects.insert(mob_effect, effect_data.clone()); + } else { + let mut active_effects = ActiveEffects::default(); + active_effects.insert(mob_effect, effect_data.clone()); + entity.insert(active_effects); + } + }, + )); + }, + ); } pub fn award_stats(&mut self, _p: &ClientboundAwardStats) {} @@ -1314,7 +1354,36 @@ impl GamePacketHandler<'_> { pub fn player_look_at(&mut self, _p: &ClientboundPlayerLookAt) {} - pub fn remove_mob_effect(&mut self, _p: &ClientboundRemoveMobEffect) {} + pub fn remove_mob_effect(&mut self, p: &ClientboundRemoveMobEffect) { + debug!("Got remove mob effect packet {p:?}"); + + let mob_effect = p.effect; + + as_system::<(Commands, Query<(&EntityIdIndex, &InstanceHolder)>)>( + self.ecs, + |(mut commands, query)| { + let (entity_id_index, instance_holder) = query.get(self.player).unwrap(); + + let Some(entity) = entity_id_index.get_by_minecraft_entity(p.entity_id) else { + debug!( + "Got remove mob effect packet for unknown entity id {}", + p.entity_id + ); + return; + }; + + let partial_instance = instance_holder.partial_instance.clone(); + commands.entity(entity).queue(RelativeEntityUpdate::new( + partial_instance, + move |entity| { + if let Some(mut active_effects) = entity.get_mut::<ActiveEffects>() { + active_effects.remove(mob_effect); + } + }, + )); + }, + ); + } pub fn resource_pack_push(&mut self, p: &ClientboundResourcePackPush) { debug!("Got resource pack packet {p:?}"); |
