Synchronize Trenchbroom map entities (#65)
This commit is contained in:
@@ -5,12 +5,11 @@ edition = "2024"
|
||||
|
||||
[features]
|
||||
default = ["shared/server"]
|
||||
dbg = ["avian3d/debug-plugin", "dep:bevy-inspector-egui", "shared/dbg"]
|
||||
dbg = ["avian3d/debug-plugin", "shared/dbg"]
|
||||
|
||||
[dependencies]
|
||||
avian3d = { workspace = true }
|
||||
bevy = { workspace = true, default-features = false }
|
||||
bevy-inspector-egui = { workspace = true, optional = true }
|
||||
bevy-steamworks = { workspace = true }
|
||||
bevy-ui-gradients = { workspace = true }
|
||||
bevy_common_assets = { workspace = true }
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
use crate::utils::{auto_rotate, explosions};
|
||||
use avian3d::prelude::*;
|
||||
use bevy::{
|
||||
app::plugin_group,
|
||||
@@ -11,14 +10,13 @@ use bevy_common_assets::ron::RonAssetPlugin;
|
||||
use bevy_sprite3d::Sprite3dPlugin;
|
||||
use bevy_trenchbroom::prelude::*;
|
||||
use bevy_ui_gradients::UiGradientsPlugin;
|
||||
use heads_database::HeadDatabaseAsset;
|
||||
use lightyear::prelude::server::ServerPlugins;
|
||||
use shared::*;
|
||||
use shared::{DebugVisuals, GameState, heads_database::HeadDatabaseAsset};
|
||||
use std::time::Duration;
|
||||
use utils::{billboards, sprite_3d_animation, squish_animation, trail};
|
||||
|
||||
mod config;
|
||||
mod server;
|
||||
mod tb_entities;
|
||||
|
||||
plugin_group! {
|
||||
pub struct DefaultPlugins {
|
||||
@@ -105,10 +103,6 @@ fn main() {
|
||||
|
||||
#[cfg(feature = "dbg")]
|
||||
{
|
||||
app.add_plugins(bevy_inspector_egui::bevy_egui::EguiPlugin {
|
||||
enable_multipass_for_primary_context: true,
|
||||
});
|
||||
app.add_plugins(bevy_inspector_egui::quick::WorldInspectorPlugin::new());
|
||||
app.add_plugins(PhysicsDebugPlugin::default());
|
||||
|
||||
// app.add_plugins(bevy::pbr::wireframe::WireframePlugin)
|
||||
@@ -118,43 +112,45 @@ fn main() {
|
||||
// });
|
||||
}
|
||||
|
||||
app.add_plugins(ai::plugin);
|
||||
app.add_plugins(animation::plugin);
|
||||
app.add_plugins(character::plugin);
|
||||
app.add_plugins(cash::plugin);
|
||||
app.add_plugins(shared::abilities::plugin);
|
||||
app.add_plugins(shared::ai::plugin);
|
||||
app.add_plugins(shared::aim::plugin);
|
||||
app.add_plugins(shared::animation::plugin);
|
||||
app.add_plugins(shared::backpack::plugin);
|
||||
app.add_plugins(shared::camera::plugin);
|
||||
app.add_plugins(shared::cash::plugin);
|
||||
app.add_plugins(shared::cash_heal::plugin);
|
||||
app.add_plugins(shared::character::plugin);
|
||||
app.add_plugins(shared::control::plugin);
|
||||
app.add_plugins(shared::cutscene::plugin);
|
||||
app.add_plugins(shared::gates::plugin);
|
||||
app.add_plugins(shared::head_drop::plugin);
|
||||
app.add_plugins(shared::heads::plugin);
|
||||
app.add_plugins(shared::heal_effect::plugin);
|
||||
app.add_plugins(shared::hitpoints::plugin);
|
||||
app.add_plugins(shared::keys::plugin);
|
||||
app.add_plugins(shared::loading_assets::LoadingPlugin);
|
||||
app.add_plugins(shared::loading_map::plugin);
|
||||
app.add_plugins(shared::movables::plugin);
|
||||
app.add_plugins(shared::npc::plugin);
|
||||
app.add_plugins(shared::platforms::plugin);
|
||||
app.add_plugins(shared::player::plugin);
|
||||
app.add_plugins(shared::protocol::plugin);
|
||||
app.add_plugins(shared::sounds::plugin);
|
||||
app.add_plugins(shared::steam::plugin);
|
||||
app.add_plugins(shared::tb_entities::plugin);
|
||||
app.add_plugins(shared::utils::auto_rotate::plugin);
|
||||
app.add_plugins(shared::utils::billboards::plugin);
|
||||
app.add_plugins(shared::utils::explosions::plugin);
|
||||
app.add_plugins(shared::utils::sprite_3d_animation::plugin);
|
||||
app.add_plugins(shared::utils::squish_animation::plugin);
|
||||
app.add_plugins(shared::utils::trail::plugin);
|
||||
app.add_plugins(shared::utils::plugin);
|
||||
app.add_plugins(shared::water::plugin);
|
||||
|
||||
app.add_plugins(config::plugin);
|
||||
app.add_plugins(player::plugin);
|
||||
app.add_plugins(gates::plugin);
|
||||
app.add_plugins(platforms::plugin);
|
||||
app.add_plugins(movables::plugin);
|
||||
app.add_plugins(billboards::plugin);
|
||||
app.add_plugins(aim::plugin);
|
||||
app.add_plugins(protocol::plugin);
|
||||
app.add_plugins(server::plugin);
|
||||
app.add_plugins(npc::plugin);
|
||||
app.add_plugins(keys::plugin);
|
||||
app.add_plugins(squish_animation::plugin);
|
||||
app.add_plugins(cutscene::plugin);
|
||||
app.add_plugins(control::plugin);
|
||||
app.add_plugins(sounds::plugin);
|
||||
app.add_plugins(camera::plugin);
|
||||
app.add_plugins(backpack::plugin);
|
||||
app.add_plugins(loading_assets::LoadingPlugin);
|
||||
app.add_plugins(loading_map::plugin);
|
||||
app.add_plugins(sprite_3d_animation::plugin);
|
||||
app.add_plugins(abilities::plugin);
|
||||
app.add_plugins(heads::plugin);
|
||||
app.add_plugins(hitpoints::plugin);
|
||||
app.add_plugins(cash_heal::plugin);
|
||||
app.add_plugins(utils::plugin);
|
||||
app.add_plugins(water::plugin);
|
||||
app.add_plugins(head_drop::plugin);
|
||||
app.add_plugins(trail::plugin);
|
||||
app.add_plugins(auto_rotate::plugin);
|
||||
app.add_plugins(heal_effect::plugin);
|
||||
app.add_plugins(tb_entities::plugin);
|
||||
app.add_plugins(explosions::plugin);
|
||||
app.add_plugins(steam::plugin);
|
||||
|
||||
app.init_state::<GameState>();
|
||||
|
||||
|
||||
43
crates/server/src/tb_entities.rs
Normal file
43
crates/server/src/tb_entities.rs
Normal file
@@ -0,0 +1,43 @@
|
||||
use bevy::prelude::*;
|
||||
use lightyear::prelude::{ActionsChannel, Connected, MessageSender};
|
||||
use shared::{
|
||||
GameState, global_observer,
|
||||
protocol::{DespawnTbMapEntity, TbMapEntityId},
|
||||
};
|
||||
|
||||
pub fn plugin(app: &mut App) {
|
||||
app.register_type::<DespawnedTbEntityCache>();
|
||||
|
||||
app.init_resource::<DespawnedTbEntityCache>();
|
||||
|
||||
app.add_systems(
|
||||
OnEnter(GameState::MapLoading),
|
||||
|mut cache: ResMut<DespawnedTbEntityCache>| cache.0.clear(),
|
||||
);
|
||||
|
||||
global_observer!(app, add_despawned_entities_to_cache);
|
||||
global_observer!(app, send_new_client_despawned_cache);
|
||||
}
|
||||
|
||||
fn add_despawned_entities_to_cache(
|
||||
trigger: Trigger<OnRemove, TbMapEntityId>,
|
||||
id: Query<&TbMapEntityId>,
|
||||
mut cache: ResMut<DespawnedTbEntityCache>,
|
||||
) {
|
||||
cache.0.push(id.get(trigger.target()).unwrap().id);
|
||||
}
|
||||
|
||||
#[derive(Default, Resource, Reflect)]
|
||||
#[reflect(Resource)]
|
||||
pub struct DespawnedTbEntityCache(pub Vec<u64>);
|
||||
|
||||
fn send_new_client_despawned_cache(
|
||||
trigger: Trigger<OnAdd, Connected>,
|
||||
cache: Res<DespawnedTbEntityCache>,
|
||||
mut send: Query<&mut MessageSender<DespawnTbMapEntity>>,
|
||||
) {
|
||||
let mut send = send.get_mut(trigger.target()).unwrap();
|
||||
for &id in cache.0.iter() {
|
||||
send.send::<ActionsChannel>(DespawnTbMapEntity(id));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user