~starkingdoms/starkingdoms

78385180e7f26d4f6f191d3b7313399a4962434b — ghostlyzsh 2 years ago cfc1677
idk why forward/backward is so much weaker than rotation
1 files changed, 46 insertions(+), 32 deletions(-)

M server/src/main.rs
M server/src/main.rs => server/src/main.rs +46 -32
@@ 3,7 3,6 @@ use std::net::Ipv4Addr;
use bevy::utils::tracing;
use bevy::{ecs::event::ManualEventReader, prelude::*};
use bevy::math::{vec2, vec3};
use bevy_rapier2d::na::{Rotation2, SVector};
use bevy_rapier2d::prelude::*;
use bevy_twite::{twite::frame::MessageType, ServerEvent, TwiteServerConfig, TwiteServerPlugin};
use component::*;


@@ 17,8 16,8 @@ pub mod packet;
const SCALE: f32 = 10.0;
const EARTH_SIZE: f32 = 1000.0;
const GRAVITY: f32 = 0.02;
const PART_HALF_SIZE: f32 = 25.0 / SCALE;
const THRUSTER_FORCE: f32 = 0.001;
const PART_HALF_SIZE: f32 = 25.0;
const THRUSTER_FORCE: f32 = 0.02;

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


@@ 40,17 39,25 @@ fn main() {
        })
        .add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(SCALE))
        .add_plugins(TwiteServerPlugin)
        .add_systems(Startup, setup_integration_parameters)
        .add_systems(Startup, spawn_planets)
        .add_systems(Update, on_message)
        .add_systems(Update, on_close)
        .add_systems(FixedUpdate, on_position_change)
        .add_systems(FixedUpdate, gravity_update)
        .add_systems(FixedUpdate, player_input_update)
        //.insert_resource(Time::<Fixed>::from_seconds(1./20.))
        .run();

    info!("Goodbye!");
}

fn setup_integration_parameters(mut context: ResMut<RapierContext>) {
    context.integration_parameters.dt = 1./20.;
    context.integration_parameters.joint_erp = 0.2;
    context.integration_parameters.erp = 0.5;
    context.integration_parameters.max_stabilization_iterations = 16;
}
fn spawn_planets(mut commands: Commands) {
    info!("Spawning planets");
    let earth_pos = Transform::from_xyz(0.0, 0.0, 0.0);


@@ 60,7 67,7 @@ fn spawn_planets(mut commands: Commands) {
            transform: TransformBundle::from(earth_pos),
        })
        .insert(Collider::ball(EARTH_SIZE / SCALE))
        .insert(AdditionalMassProperties::Mass(10000.0))
        .insert(AdditionalMassProperties::Mass(4000.0))
        .insert(ReadMassProperties::default())
        .insert(RigidBody::Fixed);
}


@@ 106,13 113,14 @@ fn on_message(
                        .insert(Collider::cuboid(PART_HALF_SIZE / SCALE, PART_HALF_SIZE / SCALE))
                        .insert(AdditionalMassProperties::MassProperties(MassProperties {
                            local_center_of_mass: vec2(0., 0.),
                            mass: 0.01,
                            principal_inertia: 50.0,
                            mass: 0.0001,
                            principal_inertia: 0.005,
                        }))
                        .insert(ExternalImpulse {
                            impulse: Vec2::ZERO,
                            torque_impulse: 0.,
                        })
                        .insert(ExternalForce::default())
                        .insert(ReadMassProperties::default())
                        .insert(RigidBody::Dynamic)
                        .id()


@@ 352,15 360,17 @@ fn on_position_change(
}

fn player_input_update(
    mut player_and_body_query: Query<(Entity, &mut Player, &mut ExternalImpulse, &Transform)>,
    mut player_and_body_query: Query<(Entity, &mut Player, &mut ExternalForce, &Transform)>,
) {
    for (_, player, mut impulses, transform) in &mut player_and_body_query {
    for (_, player, mut forces, transform) in &mut player_and_body_query {
        forces.torque = 0.;
        forces.force = Vec2::ZERO;
        if !(player.input.up || player.input.down || player.input.right || player.input.left) { continue; }

        let mut fmul_bottom_left_thruster = 0.0;
        let mut fmul_bottom_right_thruster = 0.0;
        let mut fmul_top_left_thruster = 0.0;
        let mut fmul_top_right_thruster = 0.0;
        let mut fmul_bottom_left_thruster: f32 = 0.0;
        let mut fmul_bottom_right_thruster: f32 = 0.0;
        let mut fmul_top_left_thruster: f32 = 0.0;
        let mut fmul_top_right_thruster: f32 = 0.0;
        if player.input.up {
            fmul_bottom_left_thruster -= 1.0;
            fmul_bottom_right_thruster -= 1.0;


@@ 377,12 387,16 @@ fn player_input_update(
            fmul_top_right_thruster += 1.0;
            fmul_bottom_left_thruster -= 1.0;
        }
        fmul_top_left_thruster = fmul_top_left_thruster.clamp(-1.0, 1.0);
        fmul_top_right_thruster = fmul_top_right_thruster.clamp(-1., 1.);
        fmul_bottom_left_thruster = fmul_bottom_left_thruster.clamp(-1., 1.);
        fmul_bottom_right_thruster = fmul_bottom_right_thruster.clamp(-1., 1.);

        let rot = transform.rotation.to_euler(EulerRot::ZYX).0;

        if fmul_bottom_left_thruster != 0. {
            // we are applying a force to the bottom left thruster, so do the math to figure out where it is
            let bl_thruster_uncast = vec3(-PART_HALF_SIZE, -PART_HALF_SIZE, 0.0);
            let bl_thruster_uncast = vec3(-PART_HALF_SIZE/SCALE, -PART_HALF_SIZE/SCALE, 0.0);
            // so it turns out nalgeba is useless. because bevy. bevy makes everything difficult for physics
            let bl_thruster_cast = vec2(bl_thruster_uncast.x * rot.cos() - bl_thruster_uncast.y * rot.sin(),
                                        bl_thruster_uncast.x * rot.sin() + bl_thruster_uncast.y * rot.cos());


@@ 390,47 404,47 @@ fn player_input_update(

            let bl_thruster_force = fmul_bottom_left_thruster * THRUSTER_FORCE;
            
            let bl_thruster_vec = vec2(-bl_thruster_force * rot.sin(), bl_thruster_force * rot.cos());
            let bl_impulse = ExternalImpulse::at_point(bl_thruster_vec, bl_thruster_cast, transform.translation.xy());
            impulses.impulse += bl_impulse.impulse;
            impulses.torque_impulse += bl_impulse.torque_impulse;
            let bl_thruster_vec = vec2(-bl_thruster_force / SCALE * rot.sin(), bl_thruster_force  / SCALE * rot.cos());
            let bl_force = ExternalForce::at_point(bl_thruster_vec, bl_thruster_cast, transform.translation.xy());
            forces.force += bl_force.force;
            forces.torque += bl_force.torque;
        }
        if fmul_bottom_right_thruster != 0. {
            let br_thruster_uncast = vec3(PART_HALF_SIZE, -PART_HALF_SIZE, 0.0);
            let br_thruster_uncast = vec3(PART_HALF_SIZE/SCALE, -PART_HALF_SIZE/SCALE, 0.0);
            let br_thruster_cast = vec2(br_thruster_uncast.x * rot.cos() - br_thruster_uncast.y * rot.sin(),
                                        br_thruster_uncast.x * rot.sin() + br_thruster_uncast.y * rot.cos());
            let br_thruster_cast = br_thruster_cast + transform.translation.xy();

            let br_thruster_force = fmul_bottom_right_thruster * THRUSTER_FORCE;

            let br_thruster_vec = vec2(-br_thruster_force * rot.sin(), br_thruster_force * rot.cos());
            let br_impulse = ExternalImpulse::at_point(br_thruster_vec, br_thruster_cast, transform.translation.xy());
            impulses.impulse += br_impulse.impulse;
            impulses.torque_impulse += br_impulse.torque_impulse;
            let br_thruster_vec = vec2(-br_thruster_force / SCALE * rot.sin(), br_thruster_force / SCALE * rot.cos());
            let br_force = ExternalForce::at_point(br_thruster_vec, br_thruster_cast, transform.translation.xy());
            forces.force += br_force.force;
            forces.torque += br_force.torque;
        }
        if fmul_top_left_thruster != 0. {
            let tl_thruster_uncast = vec3(-PART_HALF_SIZE, PART_HALF_SIZE, 0.0);
            let tl_thruster_uncast = vec3(-PART_HALF_SIZE/SCALE, PART_HALF_SIZE/SCALE, 0.0);
            let tl_thruster_cast = vec2(tl_thruster_uncast.x * rot.cos() - tl_thruster_uncast.y * rot.sin(),
                                        tl_thruster_uncast.x * rot.sin() + tl_thruster_uncast.y * rot.cos());
            let tl_thruster_cast = tl_thruster_cast + transform.translation.xy();
            let tl_thruster_force = fmul_top_left_thruster * THRUSTER_FORCE;

            let tl_thruster_vec = vec2(-tl_thruster_force * rot.sin(), tl_thruster_force * rot.cos());
            let tl_impulse = ExternalImpulse::at_point(tl_thruster_vec, tl_thruster_cast, transform.translation.xy());
            impulses.impulse += tl_impulse.impulse;
            impulses.torque_impulse += tl_impulse.torque_impulse;
            let tl_thruster_vec = vec2(-tl_thruster_force / SCALE * rot.sin(), tl_thruster_force / SCALE * rot.cos());
            let tl_force = ExternalForce::at_point(tl_thruster_vec, tl_thruster_cast, transform.translation.xy());
            forces.force += tl_force.force;
            forces.torque += tl_force.torque;
        }
        if fmul_top_right_thruster != 0. {
            let tr_thruster_uncast = vec3(PART_HALF_SIZE, PART_HALF_SIZE, 0.0);
            let tr_thruster_uncast = vec3(PART_HALF_SIZE/SCALE, PART_HALF_SIZE/SCALE, 0.0);
            let tr_thruster_cast = vec2(tr_thruster_uncast.x * rot.cos() - tr_thruster_uncast.y * rot.sin(),
                                        tr_thruster_uncast.x * rot.sin() + tr_thruster_uncast.y * rot.cos());
            let tr_thruster_cast = tr_thruster_cast + transform.translation.xy();
            let tr_thruster_force = fmul_top_right_thruster * THRUSTER_FORCE;

            let tr_thruster_vec = vec2(-tr_thruster_force * rot.sin(), tr_thruster_force * rot.cos());
            let tr_impulse = ExternalImpulse::at_point(tr_thruster_vec, tr_thruster_cast, transform.translation.xy());
            impulses.impulse += tr_impulse.impulse;
            impulses.torque_impulse += tr_impulse.torque_impulse;
            let tr_thruster_vec = vec2(-tr_thruster_force / SCALE * rot.sin(), tr_thruster_force / SCALE * rot.cos());
            let tr_force = ExternalForce::at_point(tr_thruster_vec, tr_thruster_cast, transform.translation.xy());
            forces.force += tr_force.force;
            forces.torque += tr_force.torque;
        }

    }