~starkingdoms/starkingdoms

7e8e500ddfd29d6b7102309becba48aaca52fd74 — ghostlyzsh 2 years ago 323f80a
added gravity
1 files changed, 28 insertions(+), 1 deletions(-)

M server/src/main.rs
M server/src/main.rs => server/src/main.rs +28 -1
@@ 14,6 14,7 @@ pub mod macros;

const SCALE: f32 = 10.0;
const EARTH_SIZE: f32 = 1000.0;
const GRAVITY: f32 = 0.02;

fn main() {
    let subscriber = tracing_subscriber::FmtSubscriber::new();


@@ 33,10 34,10 @@ fn main() {
        .add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(SCALE))
        .add_plugins(TwiteServerPlugin)
        .add_systems(Startup, spawn_planets)
        //.add_systems(Update, on_connection)
        .add_systems(Update, on_message)
        .add_systems(Update, on_close)
        .add_systems(FixedUpdate, on_position_change)
        .add_systems(FixedUpdate, do_gravity)
        .run();

    info!("Goodbye!");


@@ 51,6 52,8 @@ fn spawn_planets(mut commands: Commands) {
            transform: TransformBundle::from(earth_pos),
        })
        .insert(Collider::ball(EARTH_SIZE / SCALE))
        .insert(AdditionalMassProperties::Mass(10000.0))
        .insert(ReadMassProperties::default())
        .insert(RigidBody::Fixed);
}



@@ 91,6 94,9 @@ fn on_message(
                            player: Player { addr: *addr, username: username.to_string() },
                        })
                        .insert(Collider::cuboid(25.0 / SCALE, 25.0 / SCALE))
                        .insert(AdditionalMassProperties::Mass(10.0))
                        .insert(ExternalImpulse { impulse: Vec2::ZERO, torque_impulse: 0. })
                        .insert(ReadMassProperties::default())
                        .insert(RigidBody::Dynamic)
                        .id().index();



@@ 228,3 234,24 @@ fn on_position_change(
        packet_send.send(ServerEvent::Broadcast(MessageType::Text, buf));
    }
}

fn do_gravity(
    mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalImpulse), With<PartType>>,
    planet_query: Query<(&Transform, &ReadMassProperties), With<PlanetType>>,
) {
    for (part_transform, part_mp, mut impulses) in &mut part_query {
        impulses.impulse = Vec2::ZERO;
        let part_mp = part_mp.get();
        let part_mass = part_mp.mass;
        let part_translate = part_transform.translation;
        for (planet_transform, planet_mp) in &planet_query {
            let planet_mp = planet_mp.get();
            let planet_mass = planet_mp.mass;
            let planet_translate = planet_transform.translation;
            let distance = planet_translate.distance(part_translate);
            let force = GRAVITY * ((part_mass * planet_mass) / (distance * distance));
            let direction = (planet_translate - part_translate).normalize() * force;
            impulses.impulse += direction.xy();
        }
    }
}