Controller Replication (#57)

This commit is contained in:
PROMETHIA-27
2025-07-20 09:43:10 -04:00
committed by GitHub
parent 4c23288511
commit fdee4cf37c
15 changed files with 198 additions and 57 deletions

View File

@@ -3,7 +3,7 @@ use crate::{
camera::{CameraArmRotation, CameraTarget},
cash::{Cash, CashCollectEvent},
character::AnimatedCharacter,
control::controller_common::CharacterControllerBundle,
control::controller_common::PlayerCharacterController,
global_observer,
head::ActiveHead,
head_drop::HeadDrops,
@@ -12,9 +12,9 @@ use crate::{
hitpoints::{Hitpoints, Kill},
loading_assets::AudioAssets,
npc::SpawnCharacter,
physics_layers::GameLayer,
sounds::PlaySound,
tb_entities::SpawnPoint,
utils::commands::EntityCommandExt,
};
use avian3d::prelude::*;
use bevy::{
@@ -22,17 +22,18 @@ use bevy::{
prelude::*,
window::{CursorGrabMode, PrimaryWindow},
};
use lightyear::prelude::{NetworkTarget, PredictionTarget, Replicate};
use serde::{Deserialize, Serialize};
#[derive(Component, Default)]
#[derive(Component, Default, Serialize, Deserialize, PartialEq)]
pub struct Player;
#[derive(Component, Default)]
#[derive(Component, Default, Serialize, Deserialize, PartialEq)]
#[require(Transform, Visibility)]
pub struct PlayerBodyMesh;
pub fn plugin(app: &mut App) {
app.add_systems(Startup, (toggle_cursor_system, cursor_recenter));
app.add_systems(OnEnter(GameState::Playing), spawn);
app.add_systems(
Update,
(
@@ -46,10 +47,10 @@ pub fn plugin(app: &mut App) {
global_observer!(app, on_update_head_mesh);
}
fn spawn(
pub fn spawn(
mut commands: Commands,
asset_server: Res<AssetServer>,
query: Query<&Transform, With<SpawnPoint>>,
asset_server: Res<AssetServer>,
heads_db: Res<HeadsDatabase>,
) {
let Some(spawn) = query.iter().next() else {
@@ -58,35 +59,11 @@ fn spawn(
let transform = Transform::from_translation(spawn.translation + Vec3::new(0., 3., 0.));
let collider = Collider::capsule(0.9, 1.2);
commands
.spawn((
Name::from("player"),
Player,
ActiveHead(0),
ActiveHeads::new([
Some(HeadState::new(0, heads_db.as_ref())),
Some(HeadState::new(3, heads_db.as_ref())),
Some(HeadState::new(6, heads_db.as_ref())),
Some(HeadState::new(10, heads_db.as_ref())),
Some(HeadState::new(9, heads_db.as_ref())),
]),
Hitpoints::new(100),
CameraTarget,
transform,
Visibility::default(),
CollisionLayers::new(
LayerMask(GameLayer::Player.to_bits()),
LayerMask::ALL & !GameLayer::CollectiblePhysics.to_bits(),
),
CharacterControllerBundle::new(collider, heads_db.head_stats(0).controls),
children![(
Name::new("player-rig"),
PlayerBodyMesh,
CameraArmRotation,
children![AnimatedCharacter::new(0)]
)],
.spawn(player_bundle(transform, &heads_db))
.insert_server((
Replicate::to_clients(NetworkTarget::All),
PredictionTarget::to_clients(NetworkTarget::All),
))
.observe(on_kill);
@@ -98,6 +75,32 @@ fn spawn(
commands.trigger(SpawnCharacter(transform.translation));
}
fn player_bundle(transform: Transform, heads_db: &Res<HeadsDatabase>) -> impl Bundle {
(
Name::from("player"),
Player,
ActiveHead(0),
ActiveHeads::new([
Some(HeadState::new(0, heads_db.as_ref())),
Some(HeadState::new(3, heads_db.as_ref())),
Some(HeadState::new(6, heads_db.as_ref())),
Some(HeadState::new(10, heads_db.as_ref())),
Some(HeadState::new(9, heads_db.as_ref())),
]),
Hitpoints::new(100),
CameraTarget,
transform,
Visibility::default(),
PlayerCharacterController,
children![(
Name::new("player-rig"),
PlayerBodyMesh,
CameraArmRotation,
children![AnimatedCharacter::new(0)]
)],
)
}
fn on_kill(
trigger: Trigger<Kill>,
mut commands: Commands,