@@ 7,11 7,13 @@ use crate::config::part::{JointOffset, PartConfig};
use crate::ecs::Part;
pub fn part_config_plugin(app: &mut App) {
- app.add_systems(PreUpdate, handle_spawn_part_requests)
- .add_systems(Update, update_part_requests);
+ app.add_systems(Update, handle_spawn_part_requests)
+ // delay 1 tick
+ .add_systems(PreUpdate, update_part_requests);
}
#[derive(Component, Debug)]
+#[require(Transform, Replicated)]
pub struct SpawnPart(pub String);
#[derive(Component)]
struct LoadingPart(Handle<PartConfig>);
@@ 21,19 23,19 @@ struct PartType(AssetId<PartConfig>);
/// STOP DELETING MY ASSET BEVY
struct LiveConfigHandle(Handle<PartConfig>);
-// watch for new SpawnPart components and start loading their config files
-fn handle_spawn_part_requests(new_parts: Query<(Entity, &SpawnPart), Added<SpawnPart>>, mut commands: Commands, asset_server: Res<AssetServer>, assets: Res<Assets<PartConfig>>, parts: Query<(&Joints, &JointSnaps), With<Part>>,) {
+// watch for SpawnPart components and start loading their config files
+fn handle_spawn_part_requests(new_parts: Query<(Entity, &SpawnPart), (With<GlobalTransform>)>, mut commands: Commands, asset_server: Res<AssetServer>, assets: Res<Assets<PartConfig>>, parts: Query<(&Joints, &JointSnaps), With<Part>>,transform: Query<&GlobalTransform>) {
for (new_part, request) in &new_parts {
trace!(?new_part, ?request, "answering part request");
let hdl: Handle<PartConfig> = asset_server.load(request.0.clone());
commands.entity(new_part)
- .remove::<SpawnPart>()
- .insert(LiveConfigHandle(hdl.clone()));
+ .insert(LiveConfigHandle(hdl.clone()))
+ .remove::<SpawnPart>();
if let Some(cfg) = assets.get(&hdl) {
- spawn_part(commands.reborrow(), new_part, cfg, &hdl.id(), parts, false);
+ spawn_part(commands.reborrow(), new_part, cfg, &hdl.id(), parts, transform,false);
} else {
commands.entity(new_part)
.insert(LoadingPart(hdl.clone()));
@@ 47,6 49,7 @@ fn update_part_requests(
mut assets: ResMut<Assets<PartConfig>>,
mut commands: Commands,
parts: Query<(&Joints, &JointSnaps), With<Part>>,
+ transform: Query<&GlobalTransform>
) {
for ev in ev_config.read() {
match ev {
@@ 56,7 59,7 @@ fn update_part_requests(
if req.0.id() == *id {
let Some(asset) = assets.get(*id) else { continue; };
- spawn_part(commands.reborrow(), loading_part, asset, id, parts, false);
+ spawn_part(commands.reborrow(), loading_part, asset, id, parts, transform,false);
}
}
},
@@ 65,7 68,7 @@ fn update_part_requests(
for (existing_part, ptype) in &existing_parts {
if ptype.0 == *id {
let Some(asset) = assets.get(ptype.0) else { continue; };
- spawn_part(commands.reborrow(), existing_part, asset, id, parts, true);
+ spawn_part(commands.reborrow(), existing_part, asset, id, parts, transform,true);
}
}
}
@@ 74,7 77,7 @@ fn update_part_requests(
}
}
-fn spawn_part(mut commands: Commands, entity: Entity, part: &PartConfig, id: &AssetId<PartConfig>, parts: Query<(&Joints, &JointSnaps), With<Part>>, is_update: bool) {
+fn spawn_part(mut commands: Commands, entity: Entity, part: &PartConfig, id: &AssetId<PartConfig>, parts: Query<(&Joints, &JointSnaps), With<Part>>, transform: Query<&GlobalTransform>, is_update: bool) {
commands.entity(entity)
.remove::<LoadingPart>()
.insert(Part {
@@ 121,12 124,15 @@ fn spawn_part(mut commands: Commands, entity: Entity, part: &PartConfig, id: &As
JointOf(entity),
Replicated,
)).id();
- commands.spawn((
+ trace!(?e, "spawned joint");
+
+ let e = commands.spawn((
ChildOf(entity),
JointSnapFor(e),
<JointOffset as Into<Transform>>::into(joint.snap),
Replicated,
- ));
+ )).id();
+ trace!(?e, "spawned jointsnap");
}
}
}=
\ No newline at end of file
@@ 29,7 29,9 @@ fn handle_new_players(
q_new_clients: Query<Entity, Added<ConnectedGameEntity>>,
world_config: Res<WorldConfigResource>,
planets: Query<(&Transform, &Planet)>,
- asset_server: Res<AssetServer>
+ asset_server: Res<AssetServer>,
+ gt: Query<&GlobalTransform>,
+ child_of: Query<&ChildOf>
) {
let Some(wc) = &world_config.config else {
return;
@@ 48,11 50,13 @@ fn handle_new_players(
new_transform.rotate_z(angle);
new_transform.translation += spawn_planet_pos.translation;
- info!(?new_transform, "set player's position!");
+ info!(?new_transform, ?joined_player, "set player's position!");
+
+ commands.entity(joined_player)
+ .insert(new_transform);
commands.entity(joined_player)
.insert(SpawnPart("config/parts/hearty.part.toml".to_string()))
- .insert(new_transform)
.insert(PlayerThrust::default())
.insert(Player {
client: joined_player