different head different range

This commit is contained in:
2025-04-11 11:33:48 +03:00
parent 98839ae221
commit 806d10e1bd
7 changed files with 42 additions and 27 deletions

View File

@@ -8,7 +8,7 @@ use crate::{
heads::ActiveHeads, heads::ActiveHeads,
hitpoints::Hit, hitpoints::Hit,
physics_layers::GameLayer, physics_layers::GameLayer,
player::{Player, PlayerRig}, player::{Player, PlayerBodyMesh},
sounds::PlaySound, sounds::PlaySound,
tb_entities::EnemySpawn, tb_entities::EnemySpawn,
}; };
@@ -109,7 +109,7 @@ fn enemy_hit(
fn on_trigger_state( fn on_trigger_state(
trigger: Trigger<TriggerState>, trigger: Trigger<TriggerState>,
mut commands: Commands, mut commands: Commands,
player_rot: Query<&Transform, With<PlayerRig>>, player_rot: Query<&Transform, With<PlayerBodyMesh>>,
player_query: Query<(&Transform, &AimTarget), With<Player>>, player_query: Query<(&Transform, &AimTarget), With<Player>>,
mut active_heads: ResMut<ActiveHeads>, mut active_heads: ResMut<ActiveHeads>,
time: Res<Time>, time: Res<Time>,

View File

@@ -3,8 +3,9 @@ mod target_ui;
use crate::{ use crate::{
GameState, GameState,
head::ActiveHead,
physics_layers::GameLayer, physics_layers::GameLayer,
player::{Player, PlayerRig}, player::{Player, PlayerBodyMesh},
tb_entities::EnemySpawn, tb_entities::EnemySpawn,
}; };
use avian3d::prelude::*; use avian3d::prelude::*;
@@ -41,28 +42,33 @@ pub fn plugin(app: &mut App) {
app.add_systems( app.add_systems(
Update, Update,
(update_player_aim, update_npc_aim).run_if(in_state(GameState::Playing)), (update_player_aim, update_npc_aim, head_change).run_if(in_state(GameState::Playing)),
); );
app.add_systems(Update, add_aim.run_if(in_state(GameState::Playing))); app.add_systems(Update, add_aim);
} }
fn add_aim( fn add_aim(mut commands: Commands, query: Query<Entity, Added<ActiveHead>>) {
mut commands: Commands,
query: Query<Entity, Added<Player>>,
query2: Query<Entity, Added<EnemySpawn>>,
) {
for e in query.iter() { for e in query.iter() {
commands.entity(e).insert(AimState::default()); commands.entity(e).insert(AimState::default());
} }
for e in query2.iter() { }
commands.entity(e).insert(AimState::default());
fn head_change(mut query: Query<(&ActiveHead, &mut AimState), Changed<ActiveHead>>) {
for (head, mut state) in query.iter_mut() {
// info!("head changed: {}", head.0);
// state.max_angle = if head.0 == 0 { PI / 8. } else { PI / 2. }
state.range = match head.0 {
0 => 80.,
3 => 60.,
_ => 40.,
};
} }
} }
fn update_player_aim( fn update_player_aim(
mut commands: Commands, mut commands: Commands,
potential_targets: Query<(Entity, &Transform), With<EnemySpawn>>, potential_targets: Query<(Entity, &Transform), With<EnemySpawn>>,
player_rot: Query<(&Transform, &GlobalTransform), With<PlayerRig>>, player_rot: Query<(&Transform, &GlobalTransform), With<PlayerBodyMesh>>,
mut player_aim: Query<(&AimState, &mut AimTarget), With<Player>>, mut player_aim: Query<(&AimState, &mut AimTarget), With<Player>>,
spatial_query: SpatialQuery, spatial_query: SpatialQuery,
) { ) {

View File

@@ -1,5 +1,5 @@
use super::{ControllerSet, Controls, collisions::kinematic_controller_collisions}; use super::{ControllerSet, Controls, collisions::kinematic_controller_collisions};
use crate::{GameState, player::PlayerRig}; use crate::{GameState, player::PlayerBodyMesh};
use avian3d::{math::*, prelude::*}; use avian3d::{math::*, prelude::*};
use bevy::{ecs::query::Has, prelude::*}; use bevy::{ecs::query::Has, prelude::*};
@@ -184,7 +184,7 @@ fn movement(
&mut LinearVelocity, &mut LinearVelocity,
Has<Grounded>, Has<Grounded>,
)>, )>,
rig_transform_q: Option<Single<&GlobalTransform, With<PlayerRig>>>, rig_transform_q: Option<Single<&GlobalTransform, With<PlayerBodyMesh>>>,
mut jump_used: Local<bool>, mut jump_used: Local<bool>,
) { ) {
let delta_time = time.delta_secs(); let delta_time = time.delta_secs();

4
src/head.rs Normal file
View File

@@ -0,0 +1,4 @@
use bevy::prelude::*;
#[derive(Component, Debug)]
pub struct ActiveHead(pub usize);

View File

@@ -10,6 +10,7 @@ mod control;
mod cutscene; mod cutscene;
mod debug; mod debug;
mod gates; mod gates;
mod head;
mod heads; mod heads;
mod hitpoints; mod hitpoints;
mod keys; mod keys;

View File

@@ -1,6 +1,7 @@
use crate::{ use crate::{
GameState, GameState,
ai::Ai, ai::Ai,
head::ActiveHead,
heads::{HEAD_COUNT, HeadState}, heads::{HEAD_COUNT, HeadState},
hitpoints::{Hitpoints, Kill}, hitpoints::{Hitpoints, Kill},
keys::KeySpawn, keys::KeySpawn,
@@ -30,6 +31,7 @@ fn init(mut commands: Commands, query: Query<(Entity, &EnemySpawn)>) {
.insert(( .insert((
Hitpoints::new(100), Hitpoints::new(100),
Npc(HeadState::new(id, 10).with_ability(crate::abilities::HeadAbility::Thrown)), Npc(HeadState::new(id, 10).with_ability(crate::abilities::HeadAbility::Thrown)),
ActiveHead(id),
Ai, Ai,
)) ))
.observe(on_kill); .observe(on_kill);

View File

@@ -8,6 +8,7 @@ use crate::{
controller::{CharacterControllerBundle, MovementBundle, PlayerMovement}, controller::{CharacterControllerBundle, MovementBundle, PlayerMovement},
}, },
global_observer, global_observer,
head::ActiveHead,
heads::HeadChanged, heads::HeadChanged,
hitpoints::Hitpoints, hitpoints::Hitpoints,
loading_assets::GameAssets, loading_assets::GameAssets,
@@ -28,16 +29,16 @@ use bevy::{
use std::time::Duration; use std::time::Duration;
#[derive(Component, Default)] #[derive(Component, Default)]
pub struct Player(pub usize); pub struct Player;
#[derive(Component, Default)] #[derive(Component, Default)]
struct PlayerAnimations; struct PlayerAnimations;
#[derive(Component, Default)] #[derive(Component, Default)]
struct PlayerHead; struct PlayerHeadMesh;
#[derive(Component, Default)] #[derive(Component, Default)]
pub struct PlayerRig; pub struct PlayerBodyMesh;
pub fn plugin(app: &mut App) { pub fn plugin(app: &mut App) {
app.add_systems(Startup, (toggle_cursor_system, cursor_recenter)); app.add_systems(Startup, (toggle_cursor_system, cursor_recenter));
@@ -85,7 +86,8 @@ fn spawn(
commands commands
.spawn(( .spawn((
Name::from("player"), Name::from("player"),
Player(0), Player,
ActiveHead(0),
Hitpoints::new(100), Hitpoints::new(100),
CameraTarget, CameraTarget,
transform, transform,
@@ -102,7 +104,7 @@ fn spawn(
parent parent
.spawn(( .spawn((
Name::from("body rig"), Name::from("body rig"),
PlayerRig, PlayerBodyMesh,
CameraArmRotation, CameraArmRotation,
Transform::from_translation(Vec3::new(0., -1.45, 0.)) Transform::from_translation(Vec3::new(0., -1.45, 0.))
.with_rotation(Quat::from_rotation_y(std::f32::consts::PI)) .with_rotation(Quat::from_rotation_y(std::f32::consts::PI))
@@ -111,7 +113,7 @@ fn spawn(
)) ))
.with_child(( .with_child((
Name::from("head"), Name::from("head"),
PlayerHead, PlayerHeadMesh,
Transform::from_translation(Vec3::new(0., 1.6, 0.)) Transform::from_translation(Vec3::new(0., 1.6, 0.))
.with_scale(Vec3::splat(0.7)), .with_scale(Vec3::splat(0.7)),
SceneRoot(mesh), SceneRoot(mesh),
@@ -126,7 +128,7 @@ fn spawn(
fn rotate_view_gamepad( fn rotate_view_gamepad(
controls: Res<Controls>, controls: Res<Controls>,
mut player: Query<&mut Transform, With<PlayerRig>>, mut player: Query<&mut Transform, With<PlayerBodyMesh>>,
) { ) {
let Some(gamepad) = controls.gamepad_state else { let Some(gamepad) = controls.gamepad_state else {
return; return;
@@ -143,7 +145,7 @@ fn rotate_view_gamepad(
fn rotate_view_keyboard( fn rotate_view_keyboard(
mut controls: ResMut<Controls>, mut controls: ResMut<Controls>,
mut player: Query<&mut Transform, With<PlayerRig>>, mut player: Query<&mut Transform, With<PlayerBodyMesh>>,
) { ) {
if controls.keyboard_state.view_mode { if controls.keyboard_state.view_mode {
return; return;
@@ -209,7 +211,7 @@ fn setup_animations_marker_for_player(
mut commands: Commands, mut commands: Commands,
animation_handles: Query<Entity, Added<AnimationGraphHandle>>, animation_handles: Query<Entity, Added<AnimationGraphHandle>>,
parent_query: Query<&Parent>, parent_query: Query<&Parent>,
player: Query<&PlayerRig>, player: Query<&PlayerBodyMesh>,
) { ) {
for entity in animation_handles.iter() { for entity in animation_handles.iter() {
for ancestor in parent_query.iter_ancestors(entity) { for ancestor in parent_query.iter_ancestors(entity) {
@@ -247,14 +249,14 @@ fn on_update_head(
trigger: Trigger<HeadChanged>, trigger: Trigger<HeadChanged>,
mut commands: Commands, mut commands: Commands,
asset_server: Res<AssetServer>, asset_server: Res<AssetServer>,
head: Query<Entity, With<PlayerHead>>, head: Query<Entity, With<PlayerHeadMesh>>,
mut player: Query<&mut Player>, mut player_head: Query<&mut ActiveHead, With<Player>>,
) { ) {
let Ok(head) = head.get_single() else { let Ok(head) = head.get_single() else {
return; return;
}; };
let Ok(mut player) = player.get_single_mut() else { let Ok(mut player) = player_head.get_single_mut() else {
return; return;
}; };