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

View File

@@ -3,8 +3,9 @@ mod target_ui;
use crate::{
GameState,
head::ActiveHead,
physics_layers::GameLayer,
player::{Player, PlayerRig},
player::{Player, PlayerBodyMesh},
tb_entities::EnemySpawn,
};
use avian3d::prelude::*;
@@ -41,28 +42,33 @@ pub fn plugin(app: &mut App) {
app.add_systems(
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(
mut commands: Commands,
query: Query<Entity, Added<Player>>,
query2: Query<Entity, Added<EnemySpawn>>,
) {
fn add_aim(mut commands: Commands, query: Query<Entity, Added<ActiveHead>>) {
for e in query.iter() {
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(
mut commands: Commands,
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>>,
spatial_query: SpatialQuery,
) {

View File

@@ -1,5 +1,5 @@
use super::{ControllerSet, Controls, collisions::kinematic_controller_collisions};
use crate::{GameState, player::PlayerRig};
use crate::{GameState, player::PlayerBodyMesh};
use avian3d::{math::*, prelude::*};
use bevy::{ecs::query::Has, prelude::*};
@@ -184,7 +184,7 @@ fn movement(
&mut LinearVelocity,
Has<Grounded>,
)>,
rig_transform_q: Option<Single<&GlobalTransform, With<PlayerRig>>>,
rig_transform_q: Option<Single<&GlobalTransform, With<PlayerBodyMesh>>>,
mut jump_used: Local<bool>,
) {
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 debug;
mod gates;
mod head;
mod heads;
mod hitpoints;
mod keys;

View File

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

View File

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