aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src/plugins
diff options
context:
space:
mode:
authorShayBox <shaybox@shaybox.com>2025-10-30 12:14:19 -0400
committerGitHub <noreply@github.com>2025-10-30 11:14:19 -0500
commit818f2d01d49e574946d1a704e1445156afc9c2fb (patch)
tree4190ce61994e7d1280cbcd6b43811fa9f6b03b09 /azalea-client/src/plugins
parentc7cc381fae569f3dfc9f2abe86c2c38d59b68cf2 (diff)
downloadazalea-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/plugins')
-rw-r--r--azalea-client/src/plugins/mining.rs10
-rw-r--r--azalea-client/src/plugins/packet/game/mod.rs75
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:?}");