Input replication (#62)
This commit is contained in:
@@ -9,6 +9,7 @@ use crate::{
|
||||
GameState,
|
||||
aim::AimTarget,
|
||||
character::CharacterHierarchy,
|
||||
control::ControlState,
|
||||
global_observer,
|
||||
head::ActiveHead,
|
||||
heads::ActiveHeads,
|
||||
@@ -17,23 +18,18 @@ use crate::{
|
||||
physics_layers::GameLayer,
|
||||
player::{Player, PlayerBodyMesh},
|
||||
sounds::PlaySound,
|
||||
utils::{billboards::Billboard, sprite_3d_animation::AnimationTimer},
|
||||
utils::{billboards::Billboard, commands::IsServer, sprite_3d_animation::AnimationTimer},
|
||||
};
|
||||
use bevy::{pbr::NotShadowCaster, prelude::*};
|
||||
use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams};
|
||||
pub use healing::Healing;
|
||||
use healing::HealingStateChanged;
|
||||
use lightyear::{
|
||||
connection::client::ClientState,
|
||||
prelude::{Client, input::native::ActionState},
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Event, Reflect)]
|
||||
pub enum TriggerState {
|
||||
Active,
|
||||
Inactive,
|
||||
}
|
||||
|
||||
#[derive(Event, Reflect)]
|
||||
pub struct TriggerCashHeal;
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Reflect, Default, Serialize, Deserialize)]
|
||||
pub enum HeadAbility {
|
||||
#[default]
|
||||
@@ -117,22 +113,34 @@ pub fn plugin(app: &mut App) {
|
||||
Update,
|
||||
(update, update_heal_ability).run_if(in_state(GameState::Playing)),
|
||||
);
|
||||
app.add_systems(
|
||||
FixedUpdate,
|
||||
on_trigger_state.run_if(in_state(GameState::Playing)),
|
||||
);
|
||||
|
||||
global_observer!(app, on_trigger_state);
|
||||
global_observer!(app, build_explosion_sprite);
|
||||
}
|
||||
|
||||
fn on_trigger_state(
|
||||
trigger: Trigger<TriggerState>,
|
||||
mut res: ResMut<TriggerStateRes>,
|
||||
player_head: Single<&ActiveHead, With<Player>>,
|
||||
player: Query<(&ActiveHead, &ActionState<ControlState>), With<Player>>,
|
||||
headdb: Res<HeadsDatabase>,
|
||||
time: Res<Time>,
|
||||
is_server: Option<Res<IsServer>>,
|
||||
client: Query<&Client>,
|
||||
) {
|
||||
res.active = matches!(trigger.event(), TriggerState::Active);
|
||||
if res.active {
|
||||
let head_stats = headdb.head_stats(player_head.0);
|
||||
res.next_trigger_timestamp = time.elapsed_secs() + head_stats.shoot_offset;
|
||||
if let Ok(client) = client.single()
|
||||
&& (client.state == ClientState::Connected && is_server.is_none())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (player_head, controls) in player.iter() {
|
||||
res.active = controls.trigger;
|
||||
if controls.just_triggered {
|
||||
let head_stats = headdb.head_stats(player_head.0);
|
||||
res.next_trigger_timestamp = time.elapsed_secs() + head_stats.shoot_offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,11 +46,9 @@ fn on_trigger_thrown(
|
||||
|
||||
let pos = state.pos;
|
||||
|
||||
let vel = if let Some(target) = state.target {
|
||||
let t = query_transform
|
||||
.get(target)
|
||||
.expect("target must have transform");
|
||||
|
||||
let vel = if let Some(target) = state.target
|
||||
&& let Ok(t) = query_transform.get(target)
|
||||
{
|
||||
launch_velocity(pos, t.translation, SPEED, 9.81)
|
||||
.map(|(low, _)| low)
|
||||
.unwrap()
|
||||
|
||||
Reference in New Issue
Block a user