Simpler + Better Inputs (#82)
* switch to events for instantaneous inputs * input simplification + improvements * fix trail crash * fix clippy warnings * qualify `Trail` in fn signature
This commit is contained in:
@@ -5,23 +5,16 @@ use crate::{
|
||||
};
|
||||
use bevy::prelude::*;
|
||||
use shared::{
|
||||
player::{LocalPlayerId, PlayerBodyMesh},
|
||||
player::{LocalPlayer, PlayerBodyMesh},
|
||||
protocol::{PlaySound, PlayerId, events::ClientHeadChanged, messages::AssignClientPlayer},
|
||||
};
|
||||
|
||||
pub fn plugin(app: &mut App) {
|
||||
app.register_type::<LocalPlayerId>();
|
||||
app.register_type::<LocalPlayer>();
|
||||
|
||||
app.init_state::<PlayerAssignmentState>();
|
||||
|
||||
app.add_systems(
|
||||
Update,
|
||||
receive_player_id.run_if(in_state(PlayerAssignmentState::Waiting)),
|
||||
);
|
||||
app.add_systems(
|
||||
Update,
|
||||
match_player_id.run_if(in_state(PlayerAssignmentState::IdReceived)),
|
||||
receive_player_id.run_if(not(in_state(PlayerAssignmentState::Confirmed))),
|
||||
);
|
||||
|
||||
global_observer!(app, on_update_head_mesh);
|
||||
@@ -31,29 +24,26 @@ fn receive_player_id(
|
||||
mut commands: Commands,
|
||||
mut client_assignments: MessageReader<AssignClientPlayer>,
|
||||
mut next: ResMut<NextState<PlayerAssignmentState>>,
|
||||
mut local_id: Local<Option<PlayerId>>,
|
||||
players: Query<(Entity, &PlayerId), Changed<PlayerId>>,
|
||||
) {
|
||||
for &AssignClientPlayer(id) in client_assignments.read() {
|
||||
commands.insert_resource(LocalPlayerId { id });
|
||||
next.set(PlayerAssignmentState::IdReceived);
|
||||
info!("player id `{}` received", id.id);
|
||||
}
|
||||
}
|
||||
|
||||
fn match_player_id(
|
||||
mut commands: Commands,
|
||||
players: Query<(Entity, &PlayerId), Changed<PlayerId>>,
|
||||
client: Res<LocalPlayerId>,
|
||||
mut next: ResMut<NextState<PlayerAssignmentState>>,
|
||||
) {
|
||||
for (entity, player_id) in players.iter() {
|
||||
if *player_id == client.id {
|
||||
commands.entity(entity).insert(LocalPlayer);
|
||||
next.set(PlayerAssignmentState::Confirmed);
|
||||
info!(
|
||||
"player entity {entity:?} confirmed with id `{}`",
|
||||
player_id.id
|
||||
);
|
||||
break;
|
||||
*local_id = Some(id);
|
||||
}
|
||||
|
||||
if let Some(local_id) = *local_id {
|
||||
for (entity, player_id) in players.iter() {
|
||||
if *player_id == local_id {
|
||||
commands.entity(entity).insert(LocalPlayer);
|
||||
next.set(PlayerAssignmentState::Confirmed);
|
||||
info!(
|
||||
"player entity {entity:?} confirmed with id `{}`",
|
||||
player_id.id
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,19 +54,13 @@ fn match_player_id(
|
||||
/// controller it owns.
|
||||
#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq, PartialOrd, States)]
|
||||
pub enum PlayerAssignmentState {
|
||||
/// Waiting for the server to send an [`AssignClientPlayer`] message
|
||||
/// Waiting for the server to send an [`AssignClientPlayer`] message and replicate a [`PlayerId`]
|
||||
#[default]
|
||||
Waiting,
|
||||
/// Received an [`AssignClientPlayer`], querying for a matching controller
|
||||
IdReceived,
|
||||
/// Matching controller confirmed; a [`LocalPlayer`] exists
|
||||
Confirmed,
|
||||
}
|
||||
|
||||
#[derive(Component, Debug, Reflect)]
|
||||
#[reflect(Component)]
|
||||
pub struct LocalPlayer;
|
||||
|
||||
fn on_update_head_mesh(
|
||||
trigger: On<ClientHeadChanged>,
|
||||
mut commands: Commands,
|
||||
|
||||
Reference in New Issue
Block a user