fixes head switching (#96)

This commit is contained in:
extrawurst
2025-12-21 18:43:13 +01:00
committed by GitHub
parent c3c5ae6dfb
commit 0735c429ca
12 changed files with 205 additions and 76 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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 {