Pumpkin/pumpkin/src/entity/projectile_deflection.rs
Alexander Medvedev b58822319d fix: CI
2026-01-28 23:40:48 +01:00

55 lines
1.9 KiB
Rust

use crate::entity::EntityBase;
use std::sync::atomic::Ordering;
#[derive(Clone, Copy)]
pub enum ProjectileDeflectionType {
None,
Simple,
Redirected,
TransferVelocityDirection,
}
impl ProjectileDeflectionType {
pub fn deflect(&self, projectile: &mut dyn EntityBase, hit_entity: Option<&dyn EntityBase>) {
match self {
Self::None => {}
Self::Simple => {
let vel = rand::random::<f32>().mul_add(20.0, 170.0);
let current_velocity = projectile
.get_entity()
.velocity
.load()
.multiply(-0.5, -0.5, -0.5);
let entity = projectile.get_entity();
entity.velocity.store(current_velocity);
let yaw = entity.yaw.load() + vel;
let pitch = entity.pitch.load();
entity.set_rotation(yaw, pitch);
// TODO: Add entity.lastYaw += vel
entity.velocity_dirty.store(true, Ordering::Relaxed);
}
Self::Redirected => {
if let Some(hit_entity) = hit_entity {
let rotation_vector = hit_entity.get_entity().rotation();
let entity = projectile.get_entity();
entity.velocity.store(rotation_vector.to_f64());
entity.velocity_dirty.store(true, Ordering::Relaxed);
}
}
Self::TransferVelocityDirection => {
if let Some(hit_entity) = hit_entity {
let hit_velocity = hit_entity.get_entity().velocity.load().normalize();
let entity = projectile.get_entity();
entity.velocity.store(hit_velocity);
entity.velocity_dirty.store(true, Ordering::Relaxed);
}
}
}
}
}