different head different range
This commit is contained in:
@@ -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>,
|
||||||
|
|||||||
@@ -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,
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -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
4
src/head.rs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Component, Debug)]
|
||||||
|
pub struct ActiveHead(pub usize);
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user