cleanup
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
use super::{Projectile, TriggerGun};
|
use super::TriggerGun;
|
||||||
use crate::{
|
use crate::{
|
||||||
GameState, billboards::Billboard, global_observer, loading_assets::GameAssets,
|
GameState, billboards::Billboard, global_observer, heads_database::HeadsDatabase,
|
||||||
physics_layers::GameLayer, sounds::PlaySound, utils::sprite_3d_animation::AnimationTimer,
|
hitpoints::Hit, loading_assets::GameAssets, physics_layers::GameLayer, sounds::PlaySound,
|
||||||
|
tb_entities::EnemySpawn, utils::sprite_3d_animation::AnimationTimer,
|
||||||
};
|
};
|
||||||
use avian3d::prelude::{
|
use avian3d::prelude::{
|
||||||
Collider, CollisionLayers, CollisionStarted, LayerMask, PhysicsLayer, Sensor,
|
Collider, CollisionLayers, CollisionStarted, LayerMask, PhysicsLayer, Sensor,
|
||||||
@@ -14,6 +15,7 @@ use std::f32::consts::PI;
|
|||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
struct GunProjectile {
|
struct GunProjectile {
|
||||||
time: f32,
|
time: f32,
|
||||||
|
owner_head: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
const MAX_SHOT_AGES: f32 = 1.;
|
const MAX_SHOT_AGES: f32 = 1.;
|
||||||
@@ -28,7 +30,7 @@ pub fn plugin(app: &mut App) {
|
|||||||
app.add_systems(OnEnter(GameState::Playing), setup);
|
app.add_systems(OnEnter(GameState::Playing), setup);
|
||||||
app.add_systems(
|
app.add_systems(
|
||||||
Update,
|
Update,
|
||||||
(update, shot_collision, timeout).run_if(in_state(GameState::Playing)),
|
(update, shot_collision, timeout, enemy_hit).run_if(in_state(GameState::Playing)),
|
||||||
);
|
);
|
||||||
|
|
||||||
global_observer!(app, on_trigger_gun);
|
global_observer!(app, on_trigger_gun);
|
||||||
@@ -44,6 +46,34 @@ fn setup(mut commands: Commands, assets: Res<GameAssets>, mut sprite_params: Spr
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn enemy_hit(
|
||||||
|
mut commands: Commands,
|
||||||
|
mut collision_event_reader: EventReader<CollisionStarted>,
|
||||||
|
query_shot: Query<&GunProjectile>,
|
||||||
|
query_npc: Query<&EnemySpawn>,
|
||||||
|
heads_db: Res<HeadsDatabase>,
|
||||||
|
) {
|
||||||
|
for CollisionStarted(e1, e2) in collision_event_reader.read() {
|
||||||
|
if !query_shot.contains(*e1) && !query_shot.contains(*e2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if !query_npc.contains(*e1) && !query_npc.contains(*e2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let (enemy_entity, projectile) = if query_npc.contains(*e1) {
|
||||||
|
(*e1, query_shot.get(*e2))
|
||||||
|
} else {
|
||||||
|
(*e2, query_shot.get(*e1))
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Ok(head) = projectile.map(|p| p.owner_head) {
|
||||||
|
let damage = heads_db.head_stats(head).damage;
|
||||||
|
commands.entity(enemy_entity).trigger(Hit { damage });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn on_trigger_gun(
|
fn on_trigger_gun(
|
||||||
trigger: Trigger<TriggerGun>,
|
trigger: Trigger<TriggerGun>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
@@ -75,8 +105,6 @@ fn on_trigger_gun(
|
|||||||
Name::new("projectile-gun"),
|
Name::new("projectile-gun"),
|
||||||
GunProjectile {
|
GunProjectile {
|
||||||
time: time.elapsed_secs(),
|
time: time.elapsed_secs(),
|
||||||
},
|
|
||||||
Projectile {
|
|
||||||
owner_head: state.head,
|
owner_head: state.head,
|
||||||
},
|
},
|
||||||
Collider::capsule_endpoints(0.5, Vec3::new(0., 0., 0.), Vec3::new(0., 0., -3.)),
|
Collider::capsule_endpoints(0.5, Vec3::new(0., 0., 0.), Vec3::new(0., 0., -3.)),
|
||||||
@@ -112,7 +140,7 @@ fn update(mut query: Query<&mut Transform, With<GunProjectile>>) {
|
|||||||
fn timeout(mut commands: Commands, query: Query<(Entity, &GunProjectile)>, time: Res<Time>) {
|
fn timeout(mut commands: Commands, query: Query<(Entity, &GunProjectile)>, time: Res<Time>) {
|
||||||
let current_time = time.elapsed_secs();
|
let current_time = time.elapsed_secs();
|
||||||
|
|
||||||
for (e, GunProjectile { time }) in query.iter() {
|
for (e, GunProjectile { time, .. }) in query.iter() {
|
||||||
if current_time > time + MAX_SHOT_AGES {
|
if current_time > time + MAX_SHOT_AGES {
|
||||||
commands.entity(e).despawn_recursive();
|
commands.entity(e).despawn_recursive();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,26 +3,17 @@ mod gun;
|
|||||||
mod thrown;
|
mod thrown;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
GameState,
|
|
||||||
aim::AimTarget,
|
aim::AimTarget,
|
||||||
global_observer,
|
global_observer,
|
||||||
heads::ActiveHeads,
|
heads::ActiveHeads,
|
||||||
heads_database::HeadsDatabase,
|
heads_database::HeadsDatabase,
|
||||||
hitpoints::Hit,
|
|
||||||
physics_layers::GameLayer,
|
physics_layers::GameLayer,
|
||||||
player::{Player, PlayerBodyMesh},
|
player::{Player, PlayerBodyMesh},
|
||||||
sounds::PlaySound,
|
sounds::PlaySound,
|
||||||
tb_entities::EnemySpawn,
|
|
||||||
};
|
};
|
||||||
use avian3d::prelude::*;
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Component)]
|
|
||||||
pub struct Projectile {
|
|
||||||
pub owner_head: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Event, Reflect)]
|
#[derive(Event, Reflect)]
|
||||||
pub enum TriggerState {
|
pub enum TriggerState {
|
||||||
Active,
|
Active,
|
||||||
@@ -83,39 +74,9 @@ pub fn plugin(app: &mut App) {
|
|||||||
app.add_plugins(thrown::plugin);
|
app.add_plugins(thrown::plugin);
|
||||||
app.add_plugins(arrow::plugin);
|
app.add_plugins(arrow::plugin);
|
||||||
|
|
||||||
app.add_systems(Update, enemy_hit.run_if(in_state(GameState::Playing)));
|
|
||||||
|
|
||||||
global_observer!(app, on_trigger_state);
|
global_observer!(app, on_trigger_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn enemy_hit(
|
|
||||||
mut commands: Commands,
|
|
||||||
mut collision_event_reader: EventReader<CollisionStarted>,
|
|
||||||
query_shot: Query<&Projectile>,
|
|
||||||
query_npc: Query<&EnemySpawn>,
|
|
||||||
heads_db: Res<HeadsDatabase>,
|
|
||||||
) {
|
|
||||||
for CollisionStarted(e1, e2) in collision_event_reader.read() {
|
|
||||||
if !query_shot.contains(*e1) && !query_shot.contains(*e2) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if !query_npc.contains(*e1) && !query_npc.contains(*e2) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let (enemy_entity, projectile) = if query_npc.contains(*e1) {
|
|
||||||
(*e1, query_shot.get(*e2))
|
|
||||||
} else {
|
|
||||||
(*e2, query_shot.get(*e1))
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Ok(head) = projectile.map(|p| p.owner_head) {
|
|
||||||
let damage = heads_db.head_stats(head).damage;
|
|
||||||
commands.entity(enemy_entity).trigger(Hit { damage });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn on_trigger_state(
|
fn on_trigger_state(
|
||||||
trigger: Trigger<TriggerState>,
|
trigger: Trigger<TriggerState>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
|
|||||||
Reference in New Issue
Block a user