aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src/plugins/packet
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/packet
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/packet')
-rw-r--r--azalea-client/src/plugins/packet/game/mod.rs75
1 files changed, 72 insertions, 3 deletions
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:?}");