fixes head switching (#96)
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
GameState,
|
||||
control::{ControllerSet, Inputs, LookDirMovement},
|
||||
control::{ControllerSet, Inputs, LookDirMovement, SelectedController},
|
||||
player::{LocalPlayer, PlayerBodyMesh},
|
||||
};
|
||||
use bevy::prelude::*;
|
||||
@@ -19,14 +19,20 @@ pub fn plugin(app: &mut App) {
|
||||
fn rotate_rig(
|
||||
inputs: Single<&Inputs, With<LocalPlayer>>,
|
||||
look_dir: Res<LookDirMovement>,
|
||||
local_player: Single<&Children, With<LocalPlayer>>,
|
||||
local_player: Single<(&Children, &SelectedController), With<LocalPlayer>>,
|
||||
mut player_mesh: Query<&mut Transform, With<PlayerBodyMesh>>,
|
||||
) {
|
||||
if inputs.view_mode {
|
||||
if inputs.view_mode.is_free() {
|
||||
return;
|
||||
}
|
||||
|
||||
local_player.iter().find(|&child| {
|
||||
let (local_player_childer, selected_controller) = *local_player;
|
||||
|
||||
if !matches!(selected_controller, SelectedController::Flying) {
|
||||
return;
|
||||
}
|
||||
|
||||
local_player_childer.iter().find(|&child| {
|
||||
if let Ok(mut rig_transform) = player_mesh.get_mut(child) {
|
||||
let look_dir = look_dir.0;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ use crate::{
|
||||
client::control::CharacterInputEnabled,
|
||||
control::{
|
||||
BackpackButtonPress, CashHealPressed, ClientInputs, ControllerSet, Inputs, LocalInputs,
|
||||
LookDirMovement, SelectLeftPressed, SelectRightPressed,
|
||||
LookDirMovement, SelectLeftPressed, SelectRightPressed, ViewMode,
|
||||
},
|
||||
player::{LocalPlayer, PlayerBodyMesh},
|
||||
};
|
||||
@@ -146,8 +146,11 @@ fn gamepad_controls(
|
||||
|
||||
inputs.0.move_dir += move_dir.clamp_length_max(1.0);
|
||||
inputs.0.jump |= gamepad.pressed(GamepadButton::South);
|
||||
inputs.0.view_mode |= gamepad.pressed(GamepadButton::LeftTrigger2);
|
||||
inputs.0.trigger |= gamepad.pressed(GamepadButton::RightTrigger2);
|
||||
inputs
|
||||
.0
|
||||
.view_mode
|
||||
.merge_input(gamepad.pressed(GamepadButton::LeftTrigger2));
|
||||
|
||||
if gamepad.just_pressed(GamepadButton::DPadUp) {
|
||||
backpack_inputs.write(BackpackButtonPress::Toggle);
|
||||
@@ -212,8 +215,8 @@ fn keyboard_controls(
|
||||
|
||||
inputs.0.move_dir = direction;
|
||||
inputs.0.jump = keyboard.pressed(KeyCode::Space);
|
||||
inputs.0.view_mode = keyboard.pressed(KeyCode::Tab);
|
||||
inputs.0.trigger = mouse.pressed(MouseButton::Left);
|
||||
inputs.0.view_mode = ViewMode::from_input(keyboard.pressed(KeyCode::Tab));
|
||||
|
||||
if keyboard.just_pressed(KeyCode::KeyB) {
|
||||
backpack_inputs.write(BackpackButtonPress::Toggle);
|
||||
|
||||
@@ -2,7 +2,7 @@ use crate::{
|
||||
global_observer,
|
||||
heads_database::{HeadControls, HeadsDatabase},
|
||||
loading_assets::AudioAssets,
|
||||
player::{LocalPlayer, PlayerBodyMesh},
|
||||
player::{LocalPlayer, Player, PlayerBodyMesh},
|
||||
protocol::{ClientHeadChanged, PlaySound, PlayerId, messages::AssignClientPlayer},
|
||||
};
|
||||
use bevy::prelude::*;
|
||||
@@ -59,23 +59,38 @@ pub enum PlayerAssignmentState {
|
||||
Confirmed,
|
||||
}
|
||||
|
||||
// TODO: currently a networked message.
|
||||
// can be done by just using local change detection on `ActiveHead`?
|
||||
fn on_client_update_head_mesh(
|
||||
trigger: On<ClientHeadChanged>,
|
||||
mut commands: Commands,
|
||||
body_mesh: Single<(Entity, &Children), With<PlayerBodyMesh>>,
|
||||
player: Query<(&Children, &PlayerId), With<Player>>,
|
||||
body_mesh: Query<(Entity, &Children), With<PlayerBodyMesh>>,
|
||||
head_db: Res<HeadsDatabase>,
|
||||
audio_assets: Res<AudioAssets>,
|
||||
sfx: Query<&AudioPlayer>,
|
||||
) -> Result {
|
||||
let head = trigger.0 as usize;
|
||||
let (body_mesh, mesh_children) = *body_mesh;
|
||||
let (player_children, _) = player
|
||||
.iter()
|
||||
.find(|(_, player_id)| **player_id == trigger.player)
|
||||
.unwrap();
|
||||
|
||||
let (body_mesh, body_mesh_children) = player_children
|
||||
.iter()
|
||||
.find_map(|child| body_mesh.get(child).ok())
|
||||
.unwrap();
|
||||
|
||||
let head = trigger.head;
|
||||
|
||||
let head_str = head_db.head_key(head);
|
||||
|
||||
commands.trigger(PlaySound::Head(head_str.to_string()));
|
||||
|
||||
//TODO: make part of full character mesh later
|
||||
for child in mesh_children.iter().filter(|child| sfx.contains(*child)) {
|
||||
for child in body_mesh_children
|
||||
.iter()
|
||||
.filter(|child| sfx.contains(*child))
|
||||
{
|
||||
commands.entity(child).despawn();
|
||||
}
|
||||
if head_db.head_stats(head).controls == HeadControls::Plane {
|
||||
|
||||
Reference in New Issue
Block a user