use crate::{ GameState, abilities::TriggerCurver, billboards::Billboard, heads_database::HeadsDatabase, hitpoints::Hit, loading_assets::GameAssets, physics_layers::GameLayer, tb_entities::EnemySpawn, utils::{auto_rotate::AutoRotation, global_observer, sprite_3d_animation::AnimationTimer}, }; use avian3d::prelude::*; use bevy::{pbr::NotShadowCaster, prelude::*}; use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams}; use std::f32::consts::PI; const MAX_SHOT_AGES: f32 = 15.; #[derive(Component)] struct CurverProjectile { time: f32, damage: u32, } #[derive(Resource)] struct ShotAssets { image: Handle, layout: Handle, } pub fn plugin(app: &mut App) { app.add_systems(OnEnter(GameState::Playing), setup); app.add_systems( Update, (shot_collision, enemy_hit).run_if(in_state(GameState::Playing)), ); app.add_systems( FixedUpdate, (update, timeout).run_if(in_state(GameState::Playing)), ); global_observer!(app, on_trigger_missile); } fn setup(mut commands: Commands, assets: Res, mut sprite_params: Sprite3dParams) { let layout = TextureAtlasLayout::from_grid(UVec2::splat(256), 7, 6, None, None); let texture_atlas_layout = sprite_params.atlas_layouts.add(layout); commands.insert_resource(ShotAssets { image: assets.impact_atlas.clone(), layout: texture_atlas_layout, }); } fn on_trigger_missile( trigger: Trigger, mut commands: Commands, query_transform: Query<&Transform>, time: Res